From 8b27b2a819ab8a3be3b535049c07ad119724d2f4 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 2 Oct 2023 17:44:52 +0200 Subject: [PATCH 001/251] volume and structuredpoints --- docs/changes.md | 1 - examples/other/dolfin/demo_submesh.py | 7 ++-- vedo/cli.py | 46 +++++++++++++-------------- vedo/version.py | 2 +- vedo/volume.py | 5 +-- 5 files changed, 27 insertions(+), 34 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 76db1e89..644904b5 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -22,7 +22,6 @@ ``` examples/advanced/timer_callback1.py examples/advanced/timer_callback2.py -examples/advanced/interpolate_scalar5.py examples/basic/buttons.py examples/basic/input_box.py examples/basic/sliders2.py diff --git a/examples/other/dolfin/demo_submesh.py b/examples/other/dolfin/demo_submesh.py index d68a1f19..fab58d8c 100644 --- a/examples/other/dolfin/demo_submesh.py +++ b/examples/other/dolfin/demo_submesh.py @@ -1,7 +1,4 @@ -""" -how to extract matching -sub meshes from a common mesh. -""" +"""Extract matchingsub meshes from a common mesh""" from dolfin import * class Structure(SubDomain): @@ -25,7 +22,7 @@ def inside(self, x, on_boundary): # Move structure mesh for x in structure_mesh.coordinates(): - x[0] += 0.1*x[0]*x[1] + x[0] += 0.2*x[0]*x[1] # Move fluid mesh according to structure mesh ALE.move(fluid_mesh, structure_mesh) diff --git a/vedo/cli.py b/vedo/cli.py index 2cf9e29f..fcb31c89 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -144,6 +144,7 @@ def get_parser(): ################################################################################################# def system_info(): + for i in range(2, len(sys.argv)): file = sys.argv[i] try: @@ -168,7 +169,6 @@ def system_info(): printc("vedo installation :", vedo.installdir) try: import platform - printc( "system :", platform.system(), @@ -181,7 +181,6 @@ def system_info(): try: from screeninfo import get_monitors - for m in get_monitors(): pr = " " if m.is_primary: @@ -192,7 +191,6 @@ def system_info(): try: import k3d - printc("k3d version :", k3d.__version__, bold=0, dim=1) except ModuleNotFoundError: pass @@ -222,37 +220,39 @@ def exe_run(args): matching = list(sorted(matching)) nmat = len(matching) if nmat == 0: - printc(f":sad: No matching example found containing string: {args.run}", c=1) - printc(" Current installation directory is:", vedo.installdir, c=1) - sys.exit(1) + printc(f":sad: No matching example found containing string: {args.run}", c="y") + # printc(f"(installation directory is {vedo.installdir})", c='y') + return if nmat > 1: - printc(f"\n:target: Found {nmat} matching scripts:", c="y", italic=1) + printc(f":target: Found {nmat} scripts containing string '{args.run}':", c="c") args.full_screen = True # to print out the one line description if args.full_screen: # -f option not to dump the full code but just the first line - for mat in matching[:25]: - printc(os.path.basename(mat).replace(".py", ""), c="y", italic=1, end=" ") + for mat in matching[:30]: + printc(os.path.basename(mat).replace(".py", ""), c="c", end=" ") with open(mat, "r", encoding="UTF-8") as fm: lline = "".join(fm.readlines(60)) - lline = lline.replace("\n", " ").replace("'", "").replace('"', "").replace("-", "") - line = lline[:56] # cut - if line.startswith("from"): - line = "" - if line.startswith("import"): - line = "" - if len(lline) > len(line): + maxidx1 = lline.find("import ") + maxidx2 = lline.find("from vedo") + maxid = min(maxidx1, maxidx2) + lline = lline[:maxid] # cut where the code starts + lline = lline.replace("\n", " ").replace("'", "").replace('"', "") + lline = lline.replace("#", "").replace("-", "").replace(" ", " ") + line = lline[:68] # cut long lines + if len(lline) > len(line)+1: line += ".." if len(line) > 5: - printc("-", line, c="y", bold=0, italic=1) + printc("-", line, c="c", bold=0, italic=1, dim=1) else: print() - if nmat > 25: - printc("...", c="y") + if nmat > 30: + printc(f"... (and {nmat-30} more)", c="c") if nmat > 1: - sys.exit(0) + printc(":idea: Type 'vedo -r ' to run one of them", bold=0, c="c") + return if not args.full_screen: # -f option not to dump the full code with open(matching[0], "r", encoding="UTF-8") as fm: @@ -275,7 +275,7 @@ def exe_run(args): ################################################################################################ def exe_convert(args): - allowedexts = [ + allowed_exts = [ "vtk", "vtp", "vtu", @@ -299,8 +299,8 @@ def exe_convert(args): target_ext = args.to.lower() - if target_ext not in allowedexts: - printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowedexts}", c=1) + if target_ext not in allowed_exts: + printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowed_exts}", c=1) sys.exit() for f in args.convert: diff --git a/vedo/version.py b/vedo/version.py index d9b1dac7..46f7c510 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.4.6+dev12' +_version = '2023.4.6+dev13' diff --git a/vedo/volume.py b/vedo/volume.py index e61e4642..e4b15ae3 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -1028,15 +1028,12 @@ def __init__( img.GetPointData().AddArray(varr) img.GetPointData().SetActiveScalars(varr.GetName()) - elif "ImageData" in inputtype: + elif isinstance(inputobj, vtk.vtkImageData): img = inputobj elif isinstance(inputobj, Volume): img = inputobj.inputdata() - elif "UniformGrid" in inputtype: - img = inputobj - elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata if hasattr(inputobj, "Update"): inputobj.Update() From 642520eb0b4857e359b25279d1ac55ef80c027c7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 2 Oct 2023 17:45:37 +0200 Subject: [PATCH 002/251] restructuring inheritance --- vedo/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vedo/version.py b/vedo/version.py index 46f7c510..e7495b36 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.4.6+dev13' +_version = '2023.5.0+dev1' From b8caf88d2d0276a9d87ef691b76834bb76a76ac8 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 2 Oct 2023 20:22:16 +0200 Subject: [PATCH 003/251] pointcloud and mesh tests --- vedo/addons.py | 154 +++++++++--------- vedo/base.py | 173 ++++++++++---------- vedo/mesh.py | 115 +++++++------- vedo/pointcloud.py | 382 +++++++++++++++++---------------------------- vedo/shapes.py | 110 ++++++------- 5 files changed, 418 insertions(+), 516 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index cd38a2f1..33e0d638 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -285,7 +285,7 @@ def __init__( return self.ScalarVisibilityOff() - self.PickableOff() + self.actor.PickableOff() self.SetPadding(padding) self.property.ShadowOff() @@ -1168,7 +1168,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - a.RotateZ(label_rotation) + a.actor.RotateZ(label_rotation) else: a = shapes.Text3D( tx, @@ -1197,7 +1197,7 @@ def ScalarBar3D( italic=italic, font=title_font, ) - t.RotateZ(90 + title_rotation) + t.actor.RotateZ(90 + title_rotation) t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) @@ -1227,7 +1227,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - btx.RotateZ(label_rotation) + btx.actor.RotateZ(label_rotation) else: btx = shapes.Text3D( below_text, @@ -1266,7 +1266,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - atx.RotateZ(label_rotation) + atx.actor.RotateZ(label_rotation) else: atx = shapes.Text3D( above_text, @@ -1305,7 +1305,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - nantx.RotateZ(label_rotation) + nantx.actor.RotateZ(label_rotation) else: nantx = shapes.Text3D( nan_text, @@ -1323,11 +1323,11 @@ def ScalarBar3D( tacts.append(scale.box().lw(1)) for a in tacts: - a.PickableOff() + a.actor.PickableOff() mtacts = merge(tacts).lighting("off") - mtacts.PickableOff() - scale.PickableOff() + mtacts.actor.PickableOff() + scale.actor.PickableOff() sact = Assembly(scales + tacts) sact.SetPosition(pos) @@ -2392,7 +2392,7 @@ def Ruler( lb = shapes.Text3D(label, pos=(q1 + q2) / 2, s=s, font=font, italic=italic, justify="center") if label_rotation: - lb.RotateZ(label_rotation) + lb.actor.RotateZ(label_rotation) x0, x1 = lb.xbounds() gap = [(x1 - x0) / 2, 0, 0] @@ -2405,8 +2405,8 @@ def Ruler( zs = np.array([0, d / 50 * (1 / units_scale), 0]) ml1 = shapes.Line(-zs, zs).pos(q1) ml2 = shapes.Line(-zs, zs).pos(q2) - ml1.RotateZ(tick_angle - 90) - ml2.RotateZ(tick_angle - 90) + ml1.actor.RotateZ(tick_angle - 90) + ml2.actor.RotateZ(tick_angle - 90) c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=20) c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) @@ -2415,7 +2415,7 @@ def Ruler( macts = merge(acts).pos(p1).c(c).alpha(alpha) macts.GetProperty().LightingOff() macts.GetProperty().SetLineWidth(lw) - macts.UseBoundsOff() + macts.actor.UseBoundsOff() macts.base = q1 macts.top = q2 macts.orientation(p2 - p1, rotation=axis_rotation).bc("t").pickable(False) @@ -2551,8 +2551,8 @@ def RulerAxes( if not macts: return None macts.c(c).alpha(alpha).bc("t") - macts.UseBoundsOff() - macts.PickableOff() + macts.actor.UseBoundsOff() + macts.actor.PickableOff() return macts @@ -3154,14 +3154,14 @@ def Axes( if yzgrid and ytitle and ztitle: if not yzgrid_transparent: gyz = shapes.Grid(s=(zticks_float, yticks_float)) - gyz.alpha(yzalpha).c(yzplane_color).lw(0).RotateY(-90) + gyz.alpha(yzalpha).c(yzplane_color).lw(0).actor.RotateY(-90) if yzshift: gyz.shift(yzshift*dx,0,0) elif tol: gyz.shift(-tol*gscale,0,0) gyz.name = "yzGrid" grids.append(gyz) if grid_linewidth: gyz_lines = shapes.Grid(s=(zticks_float, yticks_float)) - gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).RotateY(-90) + gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).actor.RotateY(-90) if yzshift: gyz_lines.shift(yzshift*dx,0,0) elif tol: gyz_lines.shift(-tol*gscale,0,0) gyz_lines.name = "yzGridLines" @@ -3170,14 +3170,14 @@ def Axes( if zxgrid and ztitle and xtitle: if not zxgrid_transparent: gzx = shapes.Grid(s=(xticks_float, zticks_float)) - gzx.alpha(zxalpha).c(zxplane_color).lw(0).RotateX(90) + gzx.alpha(zxalpha).c(zxplane_color).lw(0).actor.RotateX(90) if zxshift: gzx.shift(0,zxshift*dy,0) elif tol: gzx.shift(0,-tol*gscale,0) gzx.name = "zxGrid" grids.append(gzx) if grid_linewidth: gzx_lines = shapes.Grid(s=(xticks_float, zticks_float)) - gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).RotateX(90) + gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).actor.RotateX(90) if zxshift: gzx_lines.shift(0,zxshift*dy,0) elif tol: gzx_lines.shift(0,-tol*gscale,0) gzx_lines.name = "zxGridLines" @@ -3201,13 +3201,13 @@ def Axes( if yzgrid2 and ytitle and ztitle: if not yzgrid2_transparent: gyz2 = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2.alpha(yzalpha).c(yzplane_color).lw(0).RotateY(-90) + gyz2.alpha(yzalpha).c(yzplane_color).lw(0).actor.RotateY(-90) if tol: gyz2.shift(tol*gscale,0,0) gyz2.name = "yzGrid2" grids.append(gyz2) if grid_linewidth: gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).RotateY(-90) + gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).actor.RotateY(-90) if tol: gyz2_lines.shift(tol*gscale,0,0) gyz2_lines.name = "yzGrid2Lines" grids.append(gyz2_lines) @@ -3215,13 +3215,13 @@ def Axes( if zxgrid2 and ztitle and xtitle: if not zxgrid2_transparent: gzx2 = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2.alpha(zxalpha).c(zxplane_color).lw(0).RotateX(90) + gzx2.alpha(zxalpha).c(zxplane_color).lw(0).actor.RotateX(90) if tol: gzx2.shift(0,tol*gscale,0) gzx2.name = "zxGrid2" grids.append(gzx2) if grid_linewidth: gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).RotateX(90) + gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).actor.RotateX(90) if tol: gzx2_lines.shift(0,tol*gscale,0) gzx2_lines.name = "zxGrid2Lines" grids.append(gzx2_lines) @@ -3365,7 +3365,7 @@ def Axes( if len(xticks) > 1: xmajticks = merge(xticks).c(xlabel_color) if xaxis_rotation: - xmajticks.RotateX(xaxis_rotation) + xmajticks.actor.RotateX(xaxis_rotation) if xyshift: xmajticks.shift(0,0,xyshift*dz) if zxshift: xmajticks.shift(0,zxshift*dy,0) if xshift_along_y: xmajticks.shift(0,xshift_along_y*dy,0) @@ -3382,7 +3382,7 @@ def Axes( if len(yticks) > 1: ymajticks = merge(yticks).c(ylabel_color) if yaxis_rotation: - ymajticks.RotateY(yaxis_rotation) + ymajticks.actor.RotateY(yaxis_rotation) if xyshift: ymajticks.shift(0,0,xyshift*dz) if yzshift: ymajticks.shift(yzshift*dx,0,0) if yshift_along_x: ymajticks.shift(yshift_along_x*dx,0,0) @@ -3398,8 +3398,8 @@ def Axes( zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) - zmajticks.RotateZ(-45 + zaxis_rotation) - zmajticks.RotateY(-90) + zmajticks.actor.RotateZ(-45 + zaxis_rotation) + zmajticks.actor.RotateY(-90) if yzshift: zmajticks.shift(yzshift*dx,0,0) if zxshift: zmajticks.shift(0,zxshift*dy,0) if zshift_along_x: zmajticks.shift(zshift_along_x*dx,0,0) @@ -3447,7 +3447,7 @@ def Axes( if ticks: xminticks = merge(ticks).c(xlabel_color) if xaxis_rotation: - xminticks.RotateX(xaxis_rotation) + xminticks.actor.RotateX(xaxis_rotation) if xyshift: xminticks.shift(0,0,xyshift*dz) if zxshift: xminticks.shift(0,zxshift*dy,0) if xshift_along_y: xminticks.shift(0,xshift_along_y*dy,0) @@ -3494,7 +3494,7 @@ def Axes( if ticks: yminticks = merge(ticks).c(ylabel_color) if yaxis_rotation: - yminticks.RotateY(yaxis_rotation) + yminticks.actor.RotateY(yaxis_rotation) if xyshift: yminticks.shift(0,0,xyshift*dz) if yzshift: yminticks.shift(yzshift*dx,0,0) if yshift_along_x: yminticks.shift(yshift_along_x*dx,0,0) @@ -3540,8 +3540,8 @@ def Axes( if ticks: zminticks = merge(ticks).c(zlabel_color) - zminticks.RotateZ(-45 + zaxis_rotation) - zminticks.RotateY(-90) + zminticks.actor.RotateZ(-45 + zaxis_rotation) + zminticks.actor.RotateY(-90) if yzshift: zminticks.shift(yzshift*dx,0,0) if zxshift: zminticks.shift(0,zxshift*dy,0) if zshift_along_x: zminticks.shift(zshift_along_x*dx,0,0) @@ -3593,15 +3593,15 @@ def Axes( xlab.pos(v + offs) if xaxis_rotation: xlab.rotate_x(xaxis_rotation) - if zRot: xlab.RotateZ(zRot) - if xRot: xlab.RotateX(xRot) - if yRot: xlab.RotateY(yRot) + if zRot: xlab.actor.RotateZ(zRot) + if xRot: xlab.actor.RotateX(xRot) + if yRot: xlab.actor.RotateY(yRot) if xyshift: xlab.shift(0,0,xyshift*dz) if zxshift: xlab.shift(0,zxshift*dy,0) if xshift_along_y: xlab.shift(0,xshift_along_y*dy,0) if xshift_along_z: xlab.shift(0,0,xshift_along_z*dz) xlab.name = f"xNumericLabel{i}" - xlab.SetUseBounds(x_use_bounds) + xlab.actor.SetUseBounds(x_use_bounds) labels.append(xlab.c(xlabel_color)) if ylabel_size and ytitle: @@ -3644,15 +3644,15 @@ def Axes( ylab.pos(v + offs) if yaxis_rotation: ylab.rotate_y(yaxis_rotation) - if zRot: ylab.RotateZ(zRot) - if yRot: ylab.RotateY(yRot) - if xRot: ylab.RotateX(xRot) + if zRot: ylab.actor.RotateZ(zRot) + if yRot: ylab.actor.RotateY(yRot) + if xRot: ylab.actor.RotateX(xRot) if xyshift: ylab.shift(0,0,xyshift*dz) if yzshift: ylab.shift(yzshift*dx,0,0) if yshift_along_x: ylab.shift(yshift_along_x*dx,0,0) if yshift_along_z: ylab.shift(0,0,yshift_along_z*dz) ylab.name = f"yNumericLabel{i}" - ylab.SetUseBounds(y_use_bounds) + ylab.actor.SetUseBounds(y_use_bounds) labels.append(ylab.c(ylabel_color)) if zlabel_size and ztitle: @@ -3694,10 +3694,10 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zlab.RotateZ(angle + yRot) # vtk inverts order of rotations + zlab.actor.RotateZ(angle + yRot) # vtk inverts order of rotations if xRot: - zlab.RotateY(-xRot) # ..second - zlab.RotateX(90 + zRot) # ..first + zlab.actor.RotateY(-xRot) # ..second + zlab.actor.RotateX(90 + zRot) # ..first zlab.pos(v + offs) if zaxis_rotation: zlab.rotate_z(zaxis_rotation) @@ -3705,7 +3705,7 @@ def Axes( if zxshift: zlab.shift(0,zxshift*dy,0) if zshift_along_x: zlab.shift(zshift_along_x*dx,0,0) if zshift_along_y: zlab.shift(0,zshift_along_y*dy,0) - zlab.SetUseBounds(z_use_bounds) + zlab.actor.SetUseBounds(z_use_bounds) zlab.name = f"zNumericLabel{i}" labels.append(zlab.c(zlabel_color)) @@ -3752,11 +3752,11 @@ def Axes( if xtitle_backface_color: xt.backcolor(xtitle_backface_color) if zRot: - xt.RotateZ(zRot) + xt.actor.RotateZ(zRot) if xRot: - xt.RotateX(xRot) + xt.actor.RotateX(xRot) if yRot: - xt.RotateY(yRot) + xt.actor.RotateY(yRot) shift = 0 if xlab: # xlab is the last created numeric text label.. lt0, lt1 = xlab.GetBounds()[2:4] @@ -3772,9 +3772,9 @@ def Axes( xt.shift(0, xshift_along_y * dy, 0) if xshift_along_z: xt.shift(0, 0, xshift_along_z * dz) - xt.SetUseBounds(x_use_bounds) + xt.actor.SetUseBounds(x_use_bounds) if xtitle == " ": - xt.SetUseBounds(False) + xt.actor.SetUseBounds(False) xt.name = f"xtitle {xtitle}" titles.append(xt) if xtitle_box: @@ -3822,9 +3822,9 @@ def Axes( if ytitle_backface_color: yt.backcolor(ytitle_backface_color) - if zRot: yt.RotateZ(zRot) - if yRot: yt.RotateY(yRot) - if xRot: yt.RotateX(xRot) + if zRot: yt.actor.RotateZ(zRot) + if yRot: yt.actor.RotateY(yRot) + if xRot: yt.actor.RotateX(xRot) shift = 0 if ylab: # this is the last created num label.. @@ -3837,9 +3837,9 @@ def Axes( if xyshift: yt.shift(0, 0, xyshift*dz) if yshift_along_x: yt.shift(yshift_along_x*dx, 0, 0) if yshift_along_z: yt.shift(0, 0, yshift_along_z*dz) - yt.SetUseBounds(y_use_bounds) + yt.actor.SetUseBounds(y_use_bounds) if ytitle == " ": - yt.SetUseBounds(False) + yt.actor.SetUseBounds(False) yt.name = f"ytitle {ytitle}" titles.append(yt) if ytitle_box: @@ -3885,10 +3885,10 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zt.RotateZ(angle + yRot) # vtk inverts order of rotations + zt.actor.RotateZ(angle + yRot) # vtk inverts order of rotations if xRot: - zt.RotateY(-xRot) # ..second - zt.RotateX(90 + zRot) # ..first + zt.actor.RotateY(-xRot) # ..second + zt.actor.RotateX(90 + zRot) # ..first shift = 0 if zlab: # this is the last created one.. @@ -3904,9 +3904,9 @@ def Axes( if zxshift: zt.shift(0,zxshift*dy,0) if zshift_along_x: zt.shift(zshift_along_x*dx,0,0) if zshift_along_y: zt.shift(0,zshift_along_y*dy,0) - zt.SetUseBounds(z_use_bounds) + zt.actor.SetUseBounds(z_use_bounds) if ztitle == " ": - zt.SetUseBounds(False) + zt.actor.SetUseBounds(False) zt.name = f"ztitle {ztitle}" titles.append(zt) @@ -3926,7 +3926,7 @@ def Axes( italic=htitle_italic, ) if htitle_rotation: - htit.RotateX(htitle_rotation) + htit.actor.RotateX(htitle_rotation) wpos = [(0.5 + htitle_offset[0]) * dx, (1 + htitle_offset[1]) * dy, htitle_offset[2] * dz] htit.pos(wpos) if xyshift: @@ -3939,9 +3939,9 @@ def Axes( acts += highlights + majorticks + minorticks + cones orig = (min_bns[0], min_bns[2], min_bns[4]) for a in acts: - a.PickableOff() - a.AddPosition(orig) - a.GetProperty().LightingOff() + a.actor.PickableOff() + a.actor.AddPosition(orig) + a.actor.GetProperty().LightingOff() asse = Assembly(acts) asse.SetOrigin(orig) asse.PickableOff() @@ -4103,7 +4103,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 40 * s, (y0 + y1) / 2, 0] yt = shapes.Text3D("y", pos=(0, 0, 0), s=aves / 40 * s, c=ycol) - yt.pos(wpos).RotateZ(90) + yt.pos(wpos).actor.RotateZ(90) acts += [yl, yc, yt] if dz > aves / 100: @@ -4121,11 +4121,11 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 50 * s, -aves / 50 * s, (z0 + z1) / 2] zt = shapes.Text3D("z", pos=(0, 0, 0), s=aves / 40 * s, c=zcol) - zt.pos(wpos).RotateZ(45) - zt.RotateX(90) + zt.pos(wpos).actor.RotateZ(45) + zt.actor.RotateX(90) acts += [zl, zc, zt] for a in acts: - a.PickableOff() + a.actor.PickableOff() ass = Assembly(acts) ass.PickableOff() plt.renderer.AddActor(ass) @@ -4246,7 +4246,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.axes_instances[r] = rulax if not rulax: return None - rulax.UseBoundsOn() + rulax.actor.UseBoundsOn() rulax.PickableOff() plt.renderer.AddActor(rulax) @@ -4281,7 +4281,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca = Mesh(src.GetOutput(), c, 0.5).wireframe(True) ca.pos((vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2) ca.PickableOff() - ca.UseBoundsOff() + ca.actor.UseBoundsOff() plt.axes_instances[r] = ca plt.renderer.AddActor(ca) @@ -4292,12 +4292,12 @@ def add_global_axes(axtype=None, c=None, bounds=()): rm = max(rx, ry, rz) xc = shapes.Disc(x0, r1=rm, r2=rm, c="lr", res=(1, 72)) yc = shapes.Disc(x0, r1=rm, r2=rm, c="lg", res=(1, 72)) - yc.RotateX(90) + yc.actor.RotateX(90) zc = shapes.Disc(x0, r1=rm, r2=rm, c="lb", res=(1, 72)) - yc.RotateY(90) - xc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() - yc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() - zc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() + yc.actor.RotateY(90) + xc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() + yc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() + zc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() ca = xc + yc + zc ca.PickableOff() ca.UseBoundsOn() @@ -4309,8 +4309,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): xpos, ypos = (vbb[1] + vbb[0]) / 2, (vbb[3] + vbb[2]) / 2 gs = sum(ss) * 3 gr = shapes.Grid((xpos, ypos, vbb[4]), s=(gs, gs), res=(11, 11), c=c, alpha=0.1) - gr.lighting("off").PickableOff() - gr.UseBoundsOff() + gr.lighting("off").actor.PickableOff() + gr.actor.UseBoundsOff() plt.axes_instances[r] = gr plt.renderer.AddActor(gr) @@ -4341,7 +4341,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): polaxes.SetMaximumAngle(315.0) polaxes.SetNumberOfPolarAxisTicks(5) polaxes.UseBoundsOn() - polaxes.PickableOff() + polaxes.actor.PickableOff() plt.axes_instances[r] = polaxes plt.renderer.AddActor(polaxes) @@ -4364,7 +4364,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): pr = ls.GetBottomAxis().GetLabelTextProperty() pr.SetFontFamily(vtk.VTK_FONT_FILE) pr.SetFontFile(utils.get_font_path(settings.default_font)) - ls.PickableOff() + ls.actor.PickableOff() # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls diff --git a/vedo/base.py b/vedo/base.py index 13b529f7..7a340b35 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -70,17 +70,17 @@ def __getitem__(self, key): def __setitem__(self, key, input_array): if self.association == 0: - data = self.actor.inputdata().GetPointData() - n = self.actor.inputdata().GetNumberOfPoints() - self.actor._mapper.SetScalarModeToUsePointData() + data = self.GetPointData() + n = self.GetNumberOfPoints() + self.mapper.SetScalarModeToUsePointData() elif self.association == 1: - data = self.actor.inputdata().GetCellData() - n = self.actor.inputdata().GetNumberOfCells() - self.actor._mapper.SetScalarModeToUseCellData() + data = self.GetCellData() + n = self.GetNumberOfCells() + self.mapper.SetScalarModeToUseCellData() elif self.association == 2: - data = self.actor.inputdata().GetFieldData() + data = self.GetFieldData() if not utils.is_sequence(input_array): input_array = [input_array] @@ -187,11 +187,11 @@ def rename(self, oldname, newname): def select(self, key): """Select one specific array by its name to make it the `active` one.""" if self.association == 0: - data = self.actor.inputdata().GetPointData() - self.actor.mapper().SetScalarModeToUsePointData() + data = self.GetPointData() + self.mapper.SetScalarModeToUsePointData() else: - data = self.actor.inputdata().GetCellData() - self.actor.mapper().SetScalarModeToUseCellData() + data = self.GetCellData() + self.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -207,7 +207,7 @@ def select(self, key): if "rgb" in key.lower(): data.SetActiveScalars(key) # try: - # self.actor.mapper().SetColorModeToDirectScalars() + # self.mapper.SetColorModeToDirectScalars() # except AttributeError: # pass else: @@ -216,8 +216,8 @@ def select(self, key): data.SetActiveTensors(key) try: - self.actor.mapper().SetArrayName(key) - self.actor.mapper().ScalarVisibilityOn() + self.actor.mapper.SetArrayName(key) + self.actor.mapper.ScalarVisibilityOn() # .. could be a volume mapper except AttributeError: pass @@ -226,10 +226,10 @@ def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: data = self.actor.inputdata().GetPointData() - self.actor.mapper().SetScalarModeToUsePointData() + self.actor.mapper.SetScalarModeToUsePointData() else: data = self.actor.inputdata().GetCellData() - self.actor.mapper().SetScalarModeToUseCellData() + self.actor.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -237,8 +237,8 @@ def select_scalars(self, key): data.SetActiveScalars(key) try: - self.actor.mapper().SetArrayName(key) - self.actor.mapper().ScalarVisibilityOn() + self.actor.mapper.SetArrayName(key) + self.actor.mapper.ScalarVisibilityOn() except AttributeError: pass @@ -246,10 +246,10 @@ def select_vectors(self, key): """Select one specific vector array by its name to make it the `active` one.""" if self.association == 0: data = self.actor.inputdata().GetPointData() - self.actor.mapper().SetScalarModeToUsePointData() + self.actor.mapper.SetScalarModeToUsePointData() else: data = self.actor.inputdata().GetCellData() - self.actor.mapper().SetScalarModeToUseCellData() + self.actor.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -257,8 +257,8 @@ def select_vectors(self, key): data.SetActiveVectors(key) try: - self.actor.mapper().SetArrayName(key) - self.actor.mapper().ScalarVisibilityOn() + self.actor.mapper.SetArrayName(key) + self.actor.mapper.ScalarVisibilityOn() except AttributeError: pass @@ -348,6 +348,7 @@ def __init__(self): self.point_locator = None self.cell_locator = None + self.line_locator = None self.scalarbar = None # self.scalarbars = dict() #TODO @@ -366,14 +367,14 @@ def pickable(self, value=None): """Set/get the pickability property of an object.""" if value is None: return self.GetPickable() - self.SetPickable(value) + self.actor.SetPickable(value) return self def draggable(self, value=None): # NOT FUNCTIONAL? """Set/get the draggability property of an object.""" if value is None: return self.GetDragable() - self.SetDragable(value) + self.actor.SetDragable(value) return self def origin(self, x=None, y=None, z=None): @@ -394,13 +395,13 @@ def origin(self, x=None, y=None, z=None): z = 0 elif z is None: # assume x,y is of the form x, y z = 0 - self.SetOrigin([x, y, z] - np.array(self.GetPosition())) + self.actor.SetOrigin([x, y, z] - np.array(self.GetPosition())) return self def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality - return np.array(self.GetPosition()) + return np.array(self.actor.GetPosition()) if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: @@ -410,7 +411,7 @@ def pos(self, x=None, y=None, z=None): z = 0 elif z is None: # assume x,y is of the form x, y z = 0 - self.SetPosition(x, y, z) + self.actor.SetPosition(x, y, z) self.point_locator = None self.cell_locator = None @@ -418,15 +419,15 @@ def pos(self, x=None, y=None, z=None): def shift(self, dx=0, dy=0, dz=0): """Add a vector to the current object position.""" - p = np.array(self.GetPosition()) + p = np.array(self.actor.GetPosition()) if utils.is_sequence(dx): if len(dx) == 2: - self.SetPosition(p + [dx[0], dx[1], 0]) + self.actor.SetPosition(p + [dx[0], dx[1], 0]) else: - self.SetPosition(p + dx) + self.actor.SetPosition(p + dx) else: - self.SetPosition(p + [dx, dy, dz]) + self.actor.SetPosition(p + [dx, dy, dz]) self.point_locator = None self.cell_locator = None @@ -434,7 +435,7 @@ def shift(self, dx=0, dy=0, dz=0): def x(self, val=None): """Set/Get object position along x axis.""" - p = self.GetPosition() + p = self.actor.GetPosition() if val is None: return p[0] self.pos(val, p[1], p[2]) @@ -442,7 +443,7 @@ def x(self, val=None): def y(self, val=None): """Set/Get object position along y axis.""" - p = self.GetPosition() + p = self.actor.GetPosition() if val is None: return p[1] self.pos(p[0], val, p[2]) @@ -450,7 +451,7 @@ def y(self, val=None): def z(self, val=None): """Set/Get object position along z axis.""" - p = self.GetPosition() + p = self.actor.GetPosition() if val is None: return p[2] self.pos(p[0], p[1], val) @@ -494,7 +495,7 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): if rad: angle *= 180.0 / np.pi # this vtk method only rotates in the origin of the object: - self.RotateWXYZ(angle, axis[0], axis[1], axis[2]) + self.actor.RotateWXYZ(angle, axis[0], axis[1], axis[2]) self.pos(rv) return self @@ -521,8 +522,8 @@ def _rotatexyz(self, a, angle, rad, around): rot[a](angle) T.Translate(disp) - self.SetOrientation(T.GetOrientation()) - self.SetPosition(T.GetPosition()) + self.actor.SetOrientation(T.GetOrientation()) + self.actor.SetPosition(T.GetPosition()) self.point_locator = None self.cell_locator = None @@ -617,7 +618,7 @@ def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False T.RotateWXYZ(np.rad2deg(angleth), crossvec) T.Translate(p) - self.SetOrientation(T.GetOrientation()) + self.actor.SetOrientation(T.GetOrientation()) self.point_locator = None self.cell_locator = None @@ -634,7 +635,7 @@ def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False # T.RotateWXYZ(rotation, initaxis) # T.RotateWXYZ(np.rad2deg(angle), crossvec) # T.Translate(pos) - # self.SetUserTransform(T) + # self.actor.SetUserTransform(T) # self.transform = T def scale(self, s=None, reset=False): @@ -658,9 +659,9 @@ def scale(self, s=None, reset=False): # assert s[2] != 0 if reset: - self.SetScale(s) + self.actor.SetScale(s) else: - self.SetScale(np.multiply(self.GetScale(), s)) + self.actor.SetScale(np.multiply(self.GetScale(), s)) self.point_locator = None self.cell_locator = None @@ -716,15 +717,15 @@ def apply_transform(self, T, reset=False, concatenate=False): no effect, this is superseded by `pointcloud.apply_transform()` """ if isinstance(T, vtk.vtkMatrix4x4): - self.SetUserMatrix(T) + self.actor.SetUserMatrix(T) elif utils.is_sequence(T): vm = vtk.vtkMatrix4x4() for i in [0, 1, 2, 3]: for j in [0, 1, 2, 3]: vm.SetElement(i, j, T[i][j]) - self.SetUserMatrix(vm) + self.actor.SetUserMatrix(vm) else: - self.SetUserTransform(T) + self.actor.SetUserTransform(T) self.transform = T self.point_locator = None @@ -854,9 +855,9 @@ def box(self, scale=1, padding=0, fill=False): c="gray", ) if hasattr(self, "GetProperty"): # could be Assembly - if isinstance(self.GetProperty(), vtk.vtkProperty): # could be volume + if isinstance(self.property, vtk.vtkProperty): # could be volume pr = vtk.vtkProperty() - pr.DeepCopy(self.GetProperty()) + pr.DeepCopy(self.property) bx.SetProperty(pr) bx.property = pr bx.wireframe(not fill) @@ -868,7 +869,7 @@ def use_bounds(self, ub=True): Instruct the current camera to either take into account or ignore the object bounds when resetting. """ - self.SetUseBounds(ub) + self.actor.SetUseBounds(ub) return self def bounds(self): @@ -997,26 +998,27 @@ def __init__(self): super().__init__() - self._mapper = None + self.mapper = None self._caption = None self.property = None - - def mapper(self, new_mapper=None): - """Return the `vtkMapper` data object, or update it with a new one.""" - if new_mapper: - self.SetMapper(new_mapper) - if self._mapper: - iptdata = self._mapper.GetInput() - if iptdata: - new_mapper.SetInputData(self._mapper.GetInput()) - self._mapper = new_mapper - self._mapper.Modified() - return self._mapper + self.mapper = None + + # def mapper(self, new_mapper=None): + # """Return the `vtkMapper` data object, or update it with a new one.""" + # if new_mapper: + # self.actor.SetMapper(new_mapper) + # if self.mapper: + # iptdata = self.mapper.GetInput() + # if iptdata: + # new_mapper.SetInputData(self.mapper.GetInput()) + # self.mapper = new_mapper + # self.mapper.Modified() + # return self._mapper def inputdata(self): """Return the VTK input data object.""" - if self._mapper: - return self._mapper.GetInput() + if self.mapper: + return self.mapper.GetInput() return self.GetMapper().GetInput() def modified(self): @@ -1206,7 +1208,7 @@ def lighting( Examples: - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) """ - pr = self.GetProperty() + pr = self.property if style: @@ -1230,7 +1232,7 @@ def lighting( c = pr.GetColor() else: c = (1, 1, 0.99) - mpr = self._mapper + mpr = self.mapper if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): c = (1,1,0.99) if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] @@ -1389,7 +1391,7 @@ def map_cells_to_points(self, arrays=(), move=False): else: c2p.ProcessAllArraysOn() c2p.Update() - self._mapper.SetScalarModeToUsePointData() + self.mapper.SetScalarModeToUsePointData() out = self._update(c2p.GetOutput()) out.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return out @@ -1420,7 +1422,7 @@ def map_points_to_cells(self, arrays=(), move=False): else: p2c.ProcessAllArraysOn() p2c.Update() - self._mapper.SetScalarModeToUseCellData() + self.mapper.SetScalarModeToUseCellData() out = self._update(p2c.GetOutput()) out.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return out @@ -1797,9 +1799,8 @@ def __init__(self): # ----------------------------------------------------------- def _update(self, data): - self._data = data - self._mapper.SetInputData(self.tomesh().polydata()) - self._mapper.Modified() + self.mapper.SetInputData(self.tomesh().polydata()) + self.mapper.Modified() return self def tomesh(self, fill=True, shrink=1.0): @@ -1839,11 +1840,11 @@ def tomesh(self, fill=True, shrink=1.0): msh.scalarbar = self.scalarbar lut = utils.ctf2lut(self) if lut: - msh.mapper().SetLookupTable(lut) + msh.mapper.SetLookupTable(lut) if self.useCells: - msh.mapper().SetScalarModeToUseCellData() + msh.mapper.SetScalarModeToUseCellData() else: - msh.mapper().SetScalarModeToUsePointData() + msh.mapper.SetScalarModeToUsePointData() msh.pipeline = utils.OperationNode( "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" @@ -1906,7 +1907,7 @@ def color(self, col, alpha=None, vmin=None, vmax=None): vmin, _ = self._data.GetScalarRange() if vmax is None: _, vmax = self._data.GetScalarRange() - ctf = self.GetProperty().GetRGBTransferFunction() + ctf = self.property.GetRGBTransferFunction() ctf.RemoveAllPoints() self._color = col @@ -1965,7 +1966,7 @@ def alpha(self, alpha, vmin=None, vmax=None): vmin, _ = self._data.GetScalarRange() if vmax is None: _, vmax = self._data.GetScalarRange() - otf = self.GetProperty().GetScalarOpacity() + otf = self.property.GetScalarOpacity() otf.RemoveAllPoints() self._alpha = alpha @@ -2002,8 +2003,8 @@ def alpha_unit(self, u=None): The larger you make the unit distance, the more transparent the rendering becomes. """ if u is None: - return self.GetProperty().GetScalarOpacityUnitDistance() - self.GetProperty().SetScalarOpacityUnitDistance(u) + return self.property.GetScalarOpacityUnitDistance() + self.property.SetScalarOpacityUnitDistance(u) return self def shrink(self, fraction=0.8): @@ -2060,7 +2061,7 @@ def isosurface(self, value=None, flying_edges=True): poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).phong() - out.mapper().SetScalarRange(scrange[0], scrange[1]) + out.mapper.SetScalarRange(scrange[0], scrange[1]) out.pipeline = utils.OperationNode( "isosurface", @@ -2411,7 +2412,7 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): ug = vedo.ugrid.UGrid(es.GetOutput()) pr = vtk.vtkProperty() - pr.DeepCopy(self.GetProperty()) + pr.DeepCopy(self.property) ug.SetProperty(pr) ug.property = pr @@ -2420,7 +2421,7 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): ug.SetScale(self.GetScale()) ug.SetOrientation(self.GetOrientation()) ug.SetPosition(self.GetPosition()) - ug.mapper().SetLookupTable(utils.ctf2lut(self)) + ug.mapper.SetLookupTable(utils.ctf2lut(self)) ug.pipeline = utils.OperationNode( "extract_cells_by_id", parents=[self], @@ -2441,7 +2442,7 @@ class BaseActor2D(vtk.vtkActor2D): def __init__(self): """Manage 2D objects.""" super().__init__() - self._mapper = None + self.mapper = None self.property = self.GetProperty() self.filename = "" @@ -2508,22 +2509,22 @@ def pickable(self, value=True): def alpha(self, value=None): """Set/Get the object opacity.""" if value is None: - return self.GetProperty().GetOpacity() - self.GetProperty().SetOpacity(value) + return self.property.GetOpacity() + self.property.SetOpacity(value) return self def ps(self, point_size=None): if point_size is None: - return self.GetProperty().GetPointSize() - self.GetProperty().SetPointSize(point_size) + return self.property.GetPointSize() + self.property.SetPointSize(point_size) return self def ontop(self, value=True): """Keep the object always on top of everything else.""" if value: - self.GetProperty().SetDisplayLocationToForeground() + self.property.SetDisplayLocationToForeground() else: - self.GetProperty().SetDisplayLocationToBackground() + self.property.SetDisplayLocationToBackground() return self diff --git a/vedo/mesh.py b/vedo/mesh.py index b0dd8584..20c1c64d 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -53,18 +53,16 @@ def __init__(self, inputobj=None, c=None, alpha=1): ![](https://vedo.embl.es/images/basic/buildmesh.png) """ - Points.__init__(self) + super().__init__() - self.line_locator = None - - self._mapper.SetInterpolateScalarsBeforeMapping( + self.mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping ) if vedo.settings.use_polygon_offset: - self._mapper.SetResolveCoincidentTopologyToPolygonOffset() + self.mapper.SetResolveCoincidentTopologyToPolygonOffset() pof, pou = (vedo.settings.polygon_offset_factor, vedo.settings.polygon_offset_units) - self._mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) + self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) inputtype = str(type(inputobj)) @@ -72,34 +70,34 @@ def __init__(self, inputobj=None, c=None, alpha=1): pass elif isinstance(inputobj, (Mesh, vtk.vtkActor)): - polyCopy = vtk.vtkPolyData() - polyCopy.DeepCopy(inputobj.GetMapper().GetInput()) - self._data = polyCopy - self._mapper.SetInputData(polyCopy) - self._mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) + _data = inputobj.GetMapper().GetInput() + self.mapper.SetInputData(self) + self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) - self.SetProperty(pr) + self.actor.SetProperty(pr) self.property = pr elif isinstance(inputobj, vtk.vtkPolyData): + _data = inputobj if inputobj.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) - self._data = inputobj # cache vtkPolyData and mapper for speed elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj) gf.Update() - self._data = gf.GetOutput() + _data = gf.GetOutput() + + elif "meshlab" in inputtype: + _data = vedo.utils.meshlab2vedo(inputobj) elif "trimesh" in inputtype: - tact = vedo.utils.trimesh2vedo(inputobj) - self._data = tact.polydata() + _data = vedo.utils.trimesh2vedo(inputobj) elif "meshio" in inputtype: if len(inputobj.cells) > 0: @@ -107,16 +105,16 @@ def __init__(self, inputobj=None, c=None, alpha=1): for cellblock in inputobj.cells: if cellblock.type in ("triangle", "quad"): mcells += cellblock.data.tolist() - self._data = buildPolyData(inputobj.points, mcells) + _data = buildPolyData(inputobj.points, mcells) else: - self._data = buildPolyData(inputobj.points, None) + _data = buildPolyData(inputobj.points, None) # add arrays: try: if len(inputobj.point_data) > 0: for k in inputobj.point_data.keys(): vdata = numpy2vtk(inputobj.point_data[k]) vdata.SetName(str(k)) - self._data.GetPointData().AddArray(vdata) + _data.GetPointData().AddArray(vdata) except AssertionError: print("Could not add meshio point data, skip.") # try: @@ -126,64 +124,63 @@ def __init__(self, inputobj=None, c=None, alpha=1): # exit() # vdata = numpy2vtk(inputobj.cell_data[k]) # vdata.SetName(str(k)) - # self._data.GetCellData().AddArray(vdata) + # _data.GetCellData().AddArray(vdata) # except AssertionError: # print("Could not add meshio cell data, skip.") - elif "meshlab" in inputtype: - self._data = vedo.utils.meshlab2vedo(inputobj)._data - elif is_sequence(inputobj): ninp = len(inputobj) if ninp == 0: - self._data = vtk.vtkPolyData() + _data = vtk.vtkPolyData() elif ninp == 2: # assume [vertices, faces] - self._data = buildPolyData(inputobj[0], inputobj[1]) + _data = buildPolyData(inputobj[0], inputobj[1]) else: # assume [vertices] or vertices - self._data = buildPolyData(inputobj, None) + _data = buildPolyData(inputobj, None) - elif hasattr(inputobj, "GetOutput"): # passing vtk object + elif hasattr(inputobj, "GetOutput"): # passing a vtk object if hasattr(inputobj, "Update"): inputobj.Update() if isinstance(inputobj.GetOutput(), vtk.vtkPolyData): - self._data = inputobj.GetOutput() + _data = inputobj.GetOutput() else: gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj.GetOutput()) gf.Update() - self._data = gf.GetOutput() + _data = gf.GetOutput() elif isinstance(inputobj, str): dataset = vedo.file_io.load(inputobj) self.filename = inputobj if "TetMesh" in str(type(dataset)): - self._data = dataset.tomesh().polydata(False) + _data = dataset.tomesh().polydata(False) else: - self._data = dataset.polydata(False) + _data = dataset.polydata(False) else: try: gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj) gf.Update() - self._data = gf.GetOutput() + _data = gf.GetOutput() except: vedo.logger.error(f"cannot build mesh from type {inputtype}") raise RuntimeError() - self._mapper.SetInputData(self._data) + self.DeepCopy(_data) + self.mapper.SetInputData(self) + self.actor.SetMapper(self.mapper) - self.property = self.GetProperty() + # self.property = self.actor.GetProperty() self.property.SetInterpolationToPhong() # set the color by c or by scalar - if self._data: + if _data: arrexists = False if c is None: - ptdata = self._data.GetPointData() - cldata = self._data.GetCellData() + ptdata = self.GetPointData() + cldata = self.GetCellData() exclude = ["normals", "tcoord"] if cldata.GetNumberOfArrays(): @@ -193,9 +190,9 @@ def __init__(self, inputobj=None, c=None, alpha=1): icname = iarr.GetName() if icname and all(s not in icname.lower() for s in exclude): cldata.SetActiveScalars(icname) - self._mapper.ScalarVisibilityOn() - self._mapper.SetScalarModeToUseCellData() - self._mapper.SetScalarRange(iarr.GetRange()) + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarModeToUseCellData() + self.mapper.SetScalarRange(iarr.GetRange()) arrexists = True break # stop at first good one @@ -207,9 +204,9 @@ def __init__(self, inputobj=None, c=None, alpha=1): ipname = iarr.GetName() if ipname and all(s not in ipname.lower() for s in exclude): ptdata.SetActiveScalars(ipname) - self._mapper.ScalarVisibilityOn() - self._mapper.SetScalarModeToUsePointData() - self._mapper.SetScalarRange(iarr.GetRange()) + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarModeToUsePointData() + self.mapper.SetScalarRange(iarr.GetRange()) arrexists = True break # stop at first good one @@ -226,12 +223,12 @@ def __init__(self, inputobj=None, c=None, alpha=1): self.property.SetDiffuse(1) self.property.SetSpecular(0.05) self.property.SetSpecularPower(5) - self._mapper.ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() if alpha is not None: self.property.SetOpacity(alpha) - n = self._data.GetNumberOfPoints() + n = self.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") self._texture = None @@ -512,11 +509,9 @@ def texture( if tcoords is not None: if isinstance(tcoords, str): - vtarr = pd.GetPointData().GetArray(tcoords) else: - tcoords = np.asarray(tcoords) if tcoords.ndim != 2: vedo.logger.error("tcoords must be a 2-dimensional array") @@ -578,7 +573,7 @@ def texture( tu.SetEdgeClamp(edge_clamp) self.property.SetColor(1, 1, 1) - self._mapper.ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.SetTexture(tu) if seam_threshold is not None: @@ -748,7 +743,7 @@ def backcolor(self, bc=None): backProp.SetDiffuseColor(get_color(bc)) backProp.SetOpacity(self.property.GetOpacity()) self.SetBackfaceProperty(backProp) - self._mapper.ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() return self def bc(self, backcolor=False): @@ -1362,7 +1357,7 @@ def compute_curvature(self, method=0): curve.SetCurvatureType(method) curve.Update() self._update(curve.GetOutput()) - self._mapper.ScalarVisibilityOn() + self.mapper.ScalarVisibilityOn() return self def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): @@ -1392,7 +1387,7 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ef.SetScalarRange(vrange) ef.Update() self._update(ef.GetOutput()) - self._mapper.ScalarVisibilityOn() + self.mapper.ScalarVisibilityOn() return self def subdivide(self, n=1, method=0, mel=None): @@ -1891,12 +1886,12 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): if direction is None and vedo.plotter_instance and vedo.plotter_instance.camera: sil.SetCamera(vedo.plotter_instance.camera) m = Mesh() - m.mapper().SetInputConnection(sil.GetOutputPort()) + m.mapper.SetInputConnection(sil.GetOutputPort()) elif isinstance(direction, vtk.vtkCamera): sil.SetCamera(direction) m = Mesh() - m.mapper().SetInputConnection(sil.GetOutputPort()) + m.mapper.SetInputConnection(sil.GetOutputPort()) elif direction == "2d": sil.SetVector(3.4, 4.5, 5.6) # random @@ -1915,7 +1910,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): return self m.lw(2).c((0, 0, 0)).lighting("off") - m.mapper().SetResolveCoincidentTopologyToPolygonOffset() + m.mapper.SetResolveCoincidentTopologyToPolygonOffset() m.pipeline = OperationNode("silhouette", parents=[self]) return m @@ -1981,7 +1976,7 @@ def isobands(self, n=10, vmin=None, vmax=None): i += 1 # annotate, use the midpoint of the band as the label - lut = self.mapper().GetLookupTable() + lut = self.mapper.GetLookupTable() labels = [] for b in bands: labels.append("{:4.2f}".format(b[1])) @@ -2002,7 +1997,7 @@ def isobands(self, n=10, vmin=None, vmax=None): bcf.Update() bcf.GetOutput().GetCellData().GetScalars().SetName("IsoBands") m1 = Mesh(bcf.GetOutput()).compute_normals(cells=True) - m1.mapper().SetLookupTable(lut) + m1.mapper.SetLookupTable(lut) m1.pipeline = OperationNode("isobands", parents=[self]) return m1 @@ -2041,7 +2036,7 @@ def isolines(self, n=10, vmin=None, vmax=None): cl.SetInputData(sf.GetOutput()) cl.Update() msh = Mesh(cl.GetOutput(), c="k").lighting("off") - msh.mapper().SetResolveCoincidentTopologyToPolygonOffset() + msh.mapper.SetResolveCoincidentTopologyToPolygonOffset() msh.pipeline = OperationNode("isolines", parents=[self]) return msh @@ -2185,7 +2180,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T blist = [] for i, l in enumerate(alist): l[0].color(i + 1).phong() - l[0].mapper().ScalarVisibilityOff() + l[0].mapper.ScalarVisibilityOff() blist.append(l[0]) if i < 10: l[0].pipeline = OperationNode( @@ -2218,8 +2213,8 @@ def extract_largest_region(self): m.SetScale(self.GetScale()) m.SetOrientation(self.GetOrientation()) m.SetPosition(self.GetPosition()) - vis = self._mapper.GetScalarVisibility() - m.mapper().SetScalarVisibility(vis) + vis = self.mapper.GetScalarVisibility() + m.mapper.SetScalarVisibility(vis) m.pipeline = OperationNode( "extract_largest_region", parents=[self], diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 962f5cf7..32014f48 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -712,8 +712,8 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): ################################################### -class Points(BaseActor, vtk.vtkActor): - """Work with pointclouds.""" +class Points(BaseActor, vtk.vtkPolyData): + """Work with point clouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1, blur=False, emissive=True): """ @@ -753,21 +753,21 @@ def fibonacci_sphere(n): ``` ![](https://vedo.embl.es/images/feats/fibonacci.png) """ + super().__init__() - vtk.vtkActor.__init__(self) - BaseActor.__init__(self) - - self._data = None + self.actor = vtk.vtkActor() + self.property = self.actor.GetProperty() + # self.name = "Points" # better not to give it a name here if blur: - self._mapper = vtk.vtkPointGaussianMapper() + self.mapper = vtk.vtkPointGaussianMapper() if emissive: - self._mapper.SetEmissive(bool(emissive)) - self._mapper.SetScaleFactor(r * 1.4142) + self.mapper.SetEmissive(bool(emissive)) + self.mapper.SetScaleFactor(r * 1.4142) # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ if alpha < 1: - self._mapper.SetSplatShaderCode( + self.mapper.SetSplatShaderCode( "//VTK::Color::Impl\n" "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" "if (dist > 1.0) {\n" @@ -781,17 +781,12 @@ def fibonacci_sphere(n): alpha = 1 else: - self._mapper = vtk.vtkPolyDataMapper() - self.SetMapper(self._mapper) - - self._bfprop = None # backface property holder + self.mapper = vtk.vtkPolyDataMapper() - self._scals_idx = 0 # index of the active scalar changed from CLI + self._bfprop = None # backface property holder + self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI self._cmap_name = "" # remember the name for self._keypress - # self.name = "Points" # better not to give it a name here - - self.property = self.GetProperty() try: if not blur: @@ -800,146 +795,58 @@ def fibonacci_sphere(n): pass if inputobj is None: #################### - self._data = vtk.vtkPolyData() return ######################################## - self.property.SetRepresentationToPoints() - self.property.SetPointSize(r) - self.property.LightingOff() - if isinstance(inputobj, vedo.BaseActor): inputobj = inputobj.points() # numpy ###### if isinstance(inputobj, vtk.vtkActor): - poly_copy = vtk.vtkPolyData() + pd = inputobj.GetMapper().GetInput() + self.DeepCopy(pd) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) - poly_copy.DeepCopy(inputobj.GetMapper().GetInput()) - pr.SetRepresentationToPoints() - pr.SetPointSize(r) - self._data = poly_copy - self._mapper.SetInputData(poly_copy) - self._mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) - self.SetProperty(pr) + self.actor.SetProperty(pr) self.property = pr + self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtk.vtkPolyData): - if inputobj.GetNumberOfCells() == 0: + self.DeepCopy(inputobj) + if self.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() - for i in range(inputobj.GetNumberOfPoints()): + for i in range(self.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) - inputobj.SetVerts(carr) - self._data = inputobj # cache vtkPolyData and mapper for speed + self.SetVerts(carr) + elif utils.is_sequence(inputobj): # passing point coords - plist = inputobj - n = len(plist) - - if n == 3: # assume plist is in the format [all_x, all_y, all_z] - if utils.is_sequence(plist[0]) and len(plist[0]) > 3: - plist = np.stack((plist[0], plist[1], plist[2]), axis=1) - elif n == 2: # assume plist is in the format [all_x, all_y, 0] - if utils.is_sequence(plist[0]) and len(plist[0]) > 3: - plist = np.stack((plist[0], plist[1], np.zeros(len(plist[0]))), axis=1) - - # if n and len(plist[0]) == 2: # make it 3d - # plist = np.c_[np.array(plist), np.zeros(len(plist))] - plist = utils.make3d(plist) - - if ( - utils.is_sequence(c) - and (len(c) > 3 or (utils.is_sequence(c[0]) and len(c[0]) == 4)) - ) or utils.is_sequence(alpha): - - cols = c - - n = len(plist) - if n != len(cols): - vedo.logger.error(f"mismatch in Points() colors array lengths {n} and {len(cols)}") - raise RuntimeError() - - src = vtk.vtkPointSource() - src.SetNumberOfPoints(n) - src.Update() - - vgf = vtk.vtkVertexGlyphFilter() - vgf.SetInputData(src.GetOutput()) - vgf.Update() - pd = vgf.GetOutput() - - pd.GetPoints().SetData(utils.numpy2vtk(plist, dtype=np.float32)) - - ucols = vtk.vtkUnsignedCharArray() - ucols.SetNumberOfComponents(4) - ucols.SetName("Points_RGBA") - if utils.is_sequence(alpha): - if len(alpha) != n: - vedo.logger.error(f"mismatch in Points() alpha array lengths {n} and {len(cols)}") - raise RuntimeError() - alphas = alpha - alpha = 1 - else: - alphas = (alpha,) * n - - if utils.is_sequence(cols): - c = None - if len(cols[0]) == 4: - for i in range(n): # FAST - rc, gc, bc, ac = cols[i] - ucols.InsertNextTuple4(rc, gc, bc, ac) - else: - for i in range(n): # SLOW - rc, gc, bc = colors.get_color(cols[i]) - ucols.InsertNextTuple4(rc * 255, gc * 255, bc * 255, alphas[i] * 255) - else: - c = cols - - pd.GetPointData().AddArray(ucols) - pd.GetPointData().SetActiveScalars("Points_RGBA") - self._mapper.SetInputData(pd) - self._mapper.ScalarVisibilityOn() - self._data = pd - - else: - - pd = utils.buildPolyData(plist) - self._mapper.SetInputData(pd) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - self._data = pd - - ########## - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self._data.GetNumberOfPoints()}" - ) - return - ########## + pd = utils.buildPolyData(utils.make3d(inputobj)) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + self.DeepCopy(pd) + self.pipeline = utils.OperationNode(self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") + elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj - self._data = verts.polydata() + self.DeepCopy(verts) else: - - # try to extract the points from the VTK input data object + # try to extract the points from a generic VTK input data object try: vvpts = inputobj.GetPoints() - pd = vtk.vtkPolyData() - pd.SetPoints(vvpts) + self.SetPoints(vvpts) for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) - pd.GetPointData().AddArray(arr) + self.GetPointData().AddArray(arr) - self._mapper.SetInputData(pd) c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) - self._data = pd except: vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() @@ -947,13 +854,17 @@ def fibonacci_sphere(n): c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) + self.property.SetRepresentationToPoints() + self.property.SetPointSize(r) + self.property.LightingOff() - self._mapper.SetInputData(self._data) + self.actor.SetMapper(self.mapper) + self.mapper.SetInputData(self) self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self._data.GetNumberOfPoints()}" + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" ) - return + def _repr_html_(self): """ @@ -996,15 +907,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.GetPointData().GetScalars(): + if self.GetPointData().GetScalars().GetName(): + name = self.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.GetCellData().GetScalars(): + if self.GetCellData().GetScalars().GetName(): + name = self.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ @@ -1033,9 +944,9 @@ def _repr_html_(self): ################################################################################## def _update(self, polydata): # Overwrite the polygonal mesh with a new vtkPolyData - self._data = polydata - self.mapper().SetInputData(polydata) - self.mapper().Modified() + # self = polydata + # self.mapper.SetInputData(polydata) + # self.mapper.Modified() return self def __add__(self, meshs): @@ -1053,39 +964,31 @@ def __add__(self, meshs): return vedo.assembly.Assembly([self, meshs]) - def polydata(self, transformed=True): - """ - Returns the `vtkPolyData` object associated to a `Mesh`. - - .. note:: - If `transformed=True` return a copy of polydata that corresponds - to the current mesh position in space. - """ - if not self._data: - self._data = self.mapper().GetInput() - return self._data - - if transformed: - # if self.GetIsIdentity() or self._data.GetNumberOfPoints()==0: # commmentd out on 15th feb 2020 - if self._data.GetNumberOfPoints() == 0: - # no need to do much - return self._data - - # otherwise make a copy that corresponds to - # the actual position in space of the mesh - M = self.GetMatrix() - transform = vtk.vtkTransform() - transform.SetMatrix(M) - tp = vtk.vtkTransformPolyDataFilter() - tp.SetTransform(transform) - tp.SetInputData(self._data) - tp.Update() - return tp.GetOutput() - - return self._data - - - def clone(self, deep=True, transformed=False): + # def polydata(self): + # """ + # Returns the `vtkPolyData` object associated to a `Mesh`. + # Return a copy of polydata that corresponds + # to the current mesh position in space. + # """ + # if True: + # # if self.GetIsIdentity() or self.GetNumberOfPoints()==0: # commmentd out on 15th feb 2020 + # if self.GetNumberOfPoints() == 0: + # # no need to do much + # return self + # # otherwise make a copy that corresponds to + # # the actual position in space of the mesh + # M = self.GetMatrix() + # transform = vtk.vtkTransform() + # transform.SetMatrix(M) + # tp = vtk.vtkTransformPolyDataFilter() + # tp.SetTransform(transform) + # tp.SetInputData(self) + # tp.Update() + # return tp.GetOutput() + # return self + + + def clone(self, deep=True): """ Clone a `PointCloud` or `Mesh` object to make an exact copy of it. @@ -1093,20 +996,16 @@ def clone(self, deep=True, transformed=False): deep : (bool) if False only build a shallow copy of the object (faster copy). - transformed : (bool) - if True reset the current transformation of the copy to unit. - Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ - poly = self.polydata(transformed) poly_copy = vtk.vtkPolyData() if deep: - poly_copy.DeepCopy(poly) + poly_copy.DeepCopy(self) else: - poly_copy.ShallowCopy(poly) + poly_copy.ShallowCopy(self) if isinstance(self, vedo.Mesh): cloned = vedo.Mesh(poly_copy) @@ -1114,7 +1013,7 @@ def clone(self, deep=True, transformed=False): cloned = Points(poly_copy) pr = vtk.vtkProperty() - pr.DeepCopy(self.GetProperty()) + pr.DeepCopy(self.property) cloned.SetProperty(pr) cloned.property = pr @@ -1123,26 +1022,25 @@ def clone(self, deep=True, transformed=False): bfpr.DeepCopy(self.GetBackfaceProperty()) cloned.SetBackfaceProperty(bfpr) - if not transformed: - if self.transform: - # already has a so use that - try: - cloned.SetUserTransform(self.transform) - except TypeError: # transform which can be non linear - cloned.SetOrigin(self.GetOrigin()) - cloned.SetScale(self.GetScale()) - cloned.SetOrientation(self.GetOrientation()) - cloned.SetPosition(self.GetPosition()) - - else: - # assign the same transformation to the copy + if self.transform: + # already has a so use that + try: + cloned.SetUserTransform(self.transform) + except TypeError: # transform which can be non linear cloned.SetOrigin(self.GetOrigin()) cloned.SetScale(self.GetScale()) cloned.SetOrientation(self.GetOrientation()) cloned.SetPosition(self.GetPosition()) - - mp = cloned.mapper() - sm = self.mapper() + + else: + # assign the same transformation to the copy + cloned.SetOrigin(self.GetOrigin()) + cloned.SetScale(self.GetScale()) + cloned.SetOrientation(self.GetOrientation()) + cloned.SetPosition(self.GetPosition()) + + mp = cloned.mapper + sm = self.mapper mp.SetScalarVisibility(sm.GetScalarVisibility()) mp.SetScalarRange(sm.GetScalarRange()) mp.SetColorMode(sm.GetColorMode()) @@ -1156,7 +1054,7 @@ def clone(self, deep=True, transformed=False): if self.GetTexture(): cloned.texture(self.GetTexture()) - cloned.SetPickable(self.GetPickable()) + cloned.actor.SetPickable(self.actor.GetPickable()) cloned.base = np.array(self.base) cloned.top = np.array(self.top) @@ -1167,6 +1065,7 @@ def clone(self, deep=True, transformed=False): # better not to share the same locators with original obj cloned.point_locator = None cloned.cell_locator = None + cloned.line_locator = None cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") return cloned @@ -1222,7 +1121,7 @@ def clone2d( cmsh = self.clone() poly = cmsh.pos(0, 0, 0).scale(scale).polydata() - mapper3d = self.mapper() + mapper3d = self.mapper cm = mapper3d.GetColorMode() lut = mapper3d.GetLookupTable() sv = mapper3d.GetScalarVisibility() @@ -1293,7 +1192,7 @@ def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): self.trail_points = [pos] * n if c is None: - col = self.GetProperty().GetColor() + col = self.property.GetColor() else: col = colors.get_color(c) @@ -1322,7 +1221,7 @@ def update_trail(self): def _compute_shadow(self, plane, point, direction): shad = self.clone() - shad._data.GetPointData().SetTCoords(None) # remove any texture coords + shad.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" pts = shad.points() @@ -1409,7 +1308,7 @@ def update_shadows(self): point = sha.info['point'] direction = sha.info['direction'] new_sha = self._compute_shadow(plane, point, direction) - sha._update(new_sha._data) + sha._update(new_sha) return self @@ -1435,7 +1334,7 @@ def delete_cells_by_point_index(self, indices): n += 1 data.RemoveDeletedCells() - self.mapper().Modified() + self.mapper.Modified() self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) return self @@ -1577,24 +1476,24 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): self.inputdata().GetPointData().AddArray(scals) # must be self.inputdata() ! self.inputdata().GetPointData().SetActiveScalars(scals.GetName()) rng = scals.GetRange() - self.mapper().SetScalarRange(rng[0], rng[1]) - self.mapper().ScalarVisibilityOn() + self.mapper.SetScalarRange(rng[0], rng[1]) + self.mapper.ScalarVisibilityOn() self.pipeline = utils.OperationNode( "distance_to", parents=[self, pcloud], shape="cylinder", - comment=f"#pts {self._data.GetNumberOfPoints()}", + comment=f"#pts {self.GetNumberOfPoints()}", ) return dists def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: - return self.GetProperty().GetOpacity() + return self.property.GetOpacity() - self.GetProperty().SetOpacity(opacity) - bfp = self.GetBackfaceProperty() + self.property.SetOpacity(opacity) + bfp = self.actor.GetBackfaceProperty() if bfp: if opacity < 1: self._bfprop = bfp @@ -1622,11 +1521,11 @@ def force_translucent(self, value=True): def point_size(self, value=None): """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" if value is None: - return self.GetProperty().GetPointSize() - #self.GetProperty().SetRepresentationToSurface() + return self.property.GetPointSize() + #self.property.SetRepresentationToSurface() else: - self.GetProperty().SetRepresentationToPoints() - self.GetProperty().SetPointSize(value) + self.property.SetRepresentationToPoints() + self.property.SetPointSize(value) return self def ps(self, pointsize=None): @@ -1635,7 +1534,7 @@ def ps(self, pointsize=None): def render_points_as_spheres(self, value=True): """Make points look spheric or make them look as squares.""" - self.GetProperty().SetRenderPointsAsSpheres(value) + self.property.SetRenderPointsAsSpheres(value) return self def color(self, c=False, alpha=None): @@ -1646,13 +1545,13 @@ def color(self, c=False, alpha=None): """ # overrides base.color() if c is False: - return np.array(self.GetProperty().GetColor()) + return np.array(self.property.GetColor()) if c is None: - self.mapper().ScalarVisibilityOn() + self.mapper.ScalarVisibilityOn() return self - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() cc = colors.get_color(c) - self.GetProperty().SetColor(cc) + self.property.SetColor(cc) if self.trail: self.trail.GetProperty().SetColor(cc) if alpha is not None: @@ -1716,8 +1615,8 @@ def subsample(self, fraction, absolute=False): cpd.Update() ps = 2 - if self.GetProperty().GetRepresentation() == 0: - ps = self.GetProperty().GetPointSize() + if self.property.GetRepresentation() == 0: + ps = self.property.GetPointSize() out = self._update(cpd.GetOutput()).ps(ps) @@ -2459,7 +2358,7 @@ def caption( txt = txt.replace(r[0], r[1]) if c is None: - c = np.array(self.GetProperty().GetColor()) / 2 + c = np.array(self.property.GetColor()) / 2 else: c = colors.get_color(c) @@ -2560,6 +2459,7 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F self.transform = self.GetUserTransform() self.point_locator = None self.cell_locator = None + self.line_locator = None self.pipeline = utils.OperationNode( "align_to", parents=[self, target], comment=f"rigid = {rigid}" @@ -2640,6 +2540,7 @@ def transform_with_landmarks( self.transform = lmt self.point_locator = None self.cell_locator = None + self.line_locator = None self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) return self @@ -2677,6 +2578,7 @@ def apply_transform(self, T, reset=False, concatenate=False): """ self.point_locator = None self.cell_locator = None + self.line_locator = None if isinstance(T, vtk.vtkMatrix4x4): tr = vtk.vtkTransform() @@ -2754,6 +2656,7 @@ def normalize(self): tf.Update() self.point_locator = None self.cell_locator = None + self.line_locator = None return self._update(tf.GetOutput()) def mirror(self, axis="x", origin=(0, 0, 0), reset=False): @@ -2801,6 +2704,7 @@ def mirror(self, axis="x", origin=(0, 0, 0), reset=False): self.point_locator = None self.cell_locator = None + self.line_locator = None out = self._update(outpoly) @@ -2997,17 +2901,17 @@ def cmap( data.GetScalars().SetLookupTable(lut) data.GetScalars().Modified() - self._mapper.SetLookupTable(lut) - self._mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars + self.mapper.SetLookupTable(lut) + self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars - self._mapper.ScalarVisibilityOn() - self._mapper.SetScalarRange(lut.GetRange()) + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarRange(lut.GetRange()) if on.startswith("point"): - self._mapper.SetScalarModeToUsePointData() + self.mapper.SetScalarModeToUsePointData() else: - self._mapper.SetScalarModeToUseCellData() - if hasattr(self._mapper, "SetArrayName"): - self._mapper.SetArrayName(array_name) + self.mapper.SetScalarModeToUseCellData() + if hasattr(self.mapper, "SetArrayName"): + self.mapper.SetArrayName(array_name) return self @@ -3035,8 +2939,8 @@ def cellcolors(self): ![](https://vedo.embl.es/images/basic/colorMeshCells.png) """ if "CellsRGBA" not in self.celldata.keys(): - lut = self.mapper().GetLookupTable() - vscalars = self._data.GetCellData().GetScalars() + lut = self.mapper.GetLookupTable() + vscalars = self.GetCellData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.ncells, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) @@ -3087,8 +2991,8 @@ def pointcolors(self): A point array named "PointsRGBA" is automatically created. """ if "PointsRGBA" not in self.pointdata.keys(): - lut = self.mapper().GetLookupTable() - vscalars = self._data.GetPointData().GetScalars() + lut = self.mapper.GetLookupTable() + vscalars = self.GetPointData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.npoints, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) @@ -3464,7 +3368,7 @@ def remove_outliers(self, radius, neighbors=5): carr.InsertCellPoint(i) inputobj.SetVerts(carr) self._update(inputobj) - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self @@ -4315,7 +4219,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): vis = False if currentscals: cpoly.GetPointData().SetActiveScalars(currentscals) - vis = self.mapper().GetScalarVisibility() + vis = self.mapper.GetScalarVisibility() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) @@ -4333,7 +4237,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): self._update(tf.GetOutput()) self.pointdata.remove("SignedDistances") - self.mapper().SetScalarVisibility(vis) + self.mapper.SetScalarVisibility(vis) if keep: if isinstance(self, vedo.Mesh): cutoff = vedo.Mesh(kpoly) @@ -4449,7 +4353,7 @@ def cut_with_scalar(self, value, name="", invert=False): if name: self.pointdata.select(name) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self._data) + clipper.SetInputData(self) clipper.SetValue(value) clipper.GenerateClippedOutputOff() clipper.SetInsideOut(not invert) @@ -4534,9 +4438,11 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No self._update(tf.GetOutput()) self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode( - "crop", parents=[self], comment=f"#pts {self._data.GetNumberOfPoints()}" + "crop", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -4924,7 +4830,7 @@ def density( The density is expressed as the number of counts in the radius search. Arguments: - dims : (int,list) + dims : (int, list) number of voxels in x, y and z of the output Volume. compute_gradient : (bool) Turn on/off the generation of the gradient vector, @@ -5046,7 +4952,7 @@ def _readPoints(): raise RuntimeError() dens.Update() pts = utils.vtk2numpy(dens.GetOutput().GetPoints().GetData()) - cld = Points(pts, c=None).point_size(self.GetProperty().GetPointSize()) + cld = Points(pts, c=None).point_size(self.property.GetPointSize()) cld.interpolate_data_from(self, n=nclosest, radius=radius) cld.name = "densifiedCloud" @@ -5206,7 +5112,7 @@ def tovolume( def generate_random_data(self): """Fill a dataset with random attributes""" gen = vtk.vtkRandomAttributeGenerator() - gen.SetInputData(self._data) + gen.SetInputData(self) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() gen.GeneratePointNormalsOff() diff --git a/vedo/shapes.py b/vedo/shapes.py index f8f83eeb..3087b2a2 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -506,8 +506,8 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): Mesh.__init__(self, poly, c, alpha) self.lw(lw) self.property.LightingOff() - self.PickableOff() - self.DragableOff() + self.actor.PickableOff() + self.actor.DragableOff() self.base = base self.top = top self.name = "Line" @@ -597,7 +597,7 @@ def pattern(self, stipple, repeats=10): texture.SetInputData(image) texture.InterpolateOff() texture.RepeatOn() - self.SetTexture(texture) + self.actor.SetTexture(texture) return self def length(self): @@ -1343,10 +1343,10 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): Mesh.__init__(self, glyph.GetOutput()) - self.PickableOff() + self.actor.PickableOff() prop = vtk.vtkProperty() prop.DeepCopy(msh.GetProperty()) - self.SetProperty(prop) + self.actor.SetProperty(prop) self.property = prop self.property.LightingOff() self.mapper().ScalarVisibilityOff() @@ -1997,9 +1997,9 @@ def __init__( Mesh.__init__(self, tf.GetOutput(), c, alpha) self.phong().lighting("plastic") - self.SetPosition(start_pt) - self.PickableOff() - self.DragableOff() + self.actor.SetPosition(start_pt) + self.actor.PickableOff() + self.actor.DragableOff() self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.tip_index = None @@ -2198,10 +2198,10 @@ def __init__( tf.Update() Mesh.__init__(self, tf.GetOutput(), c="k1") - self.SetPosition(start_pt) + self.actor.SetPosition(start_pt) self.lighting("off") - self.DragableOff() - self.PickableOff() + self.actor.DragableOff() + self.actor.PickableOff() self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Arrow2D" @@ -2326,8 +2326,8 @@ def __init__(self, line1, line2, tip_size=1.0, tip_width=1.0): Ribbon.__init__(self, line1, line2, res=(resm, 1)) self.phong() - self.PickableOff() - self.DragableOff() + self.actor.PickableOff() + self.actor.DragableOff() self.name = "FlatArrow" @@ -2359,7 +2359,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): Mesh.__init__(self, [np.c_[x, y], faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.GetProperty().LightingOff() self.name = "Polygon " + str(nsides) @@ -2456,7 +2456,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.property.LightingOff() self.name = "Star" @@ -2497,7 +2497,7 @@ def __init__( ps.Update() Mesh.__init__(self, ps.GetOutput(), c, alpha) self.flat() - self.SetPosition(utils.make3d(pos)) + self.actor.SetPosition(utils.make3d(pos)) self.name = "Disc" @@ -2556,7 +2556,7 @@ def __init__( ar.SetResolution(res) ar.Update() Mesh.__init__(self, ar.GetOutput(), c, alpha) - self.SetPosition(self.base) + self.actor.SetPosition(self.base) self.lw(2).lighting("off") self.name = "Arc" @@ -2628,7 +2628,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): pts = utils.versor(self.points()) * r self.points(pts) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "IcoSphere" @@ -2696,7 +2696,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) Mesh.__init__(self, ss.GetOutput(), c, alpha) self.phong() - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Sphere" @@ -2788,7 +2788,7 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): glyph.Update() Mesh.__init__(self, glyph.GetOutput(), alpha=alpha) - self.SetPosition(base) + self.actor.SetPosition(base) self.base = base self.top = centers[-1] self.phong() @@ -2825,7 +2825,7 @@ def __init__(self, style=1, r=1.0): pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) atext.InterpolateOn() - self.SetTexture(atext) + self.actor.SetTexture(atext) self.name = "Earth" @@ -2906,7 +2906,7 @@ def __init__( self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Ellipsoid" def asphericity(self): @@ -3043,10 +3043,10 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. tf0.Update() poly = tf0.GetOutput() Mesh.__init__(self, poly, c, alpha) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.wireframe().lw(lw) - self.GetProperty().LightingOff() + self.property.LightingOff() self.name = "Grid" @@ -3091,7 +3091,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tf.Update() Mesh.__init__(self, tf.GetOutput(), c, alpha) self.lighting("off") - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Plane" self.top = self.normal self.bottom = np.array([0.0, 0.0, 0.0]) @@ -3205,7 +3205,7 @@ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1 faces = [(0, 1, 2, 3)] Mesh.__init__(self, [pts, faces], color, alpha) - self.SetPosition(p1) + self.actor.SetPosition(p1) self.property.LightingOff() self.name = "Rectangle" @@ -3279,7 +3279,7 @@ def __init__(self, pos=(0, 0, 0), Mesh.__init__(self, pd, c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Box" @@ -3330,7 +3330,7 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al tbs.Update() poly = tbs.GetOutput() Mesh.__init__(self, poly, c=c, alpha=alpha) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.lw(1).lighting("off") self.base = np.array([0.5, 0.5, 0.0]) self.top = np.array([0.5, 0.5, 1.0]) @@ -3404,7 +3404,7 @@ def __init__( tuf.Update() Mesh.__init__(self, tuf.GetOutput(), c, alpha) self.phong() - self.SetPosition(start_pt) + self.actor.SetPosition(start_pt) self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Spring" @@ -3460,7 +3460,7 @@ def __init__( Mesh.__init__(self, pd, c, alpha) self.phong() - self.SetPosition(pos) + self.actor.SetPosition(pos) self.base = base + pos self.top = top + pos self.name = "Cylinder" @@ -3482,7 +3482,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) v = utils.versor(axis) * height / 2 self.base = pos - v self.top = pos + v @@ -3552,7 +3552,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Torus" @@ -3587,7 +3587,7 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper().ScalarVisibilityOff() - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Paraboloid" @@ -3620,7 +3620,7 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper().ScalarVisibilityOff() - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Hyperboloid" @@ -3804,7 +3804,7 @@ def __init__( poly = tf.GetOutput() Mesh.__init__(self, poly, c, alpha) - self.SetPosition(mq) + self.actor.SetPosition(mq) self.name = "Brace" self.base = q1 self.top = q2 @@ -3834,7 +3834,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0): if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Star3D" @@ -3855,7 +3855,7 @@ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0): if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.SetPosition(pos) + self.actor.SetPosition(pos) self.name = "Cross3D" @@ -4141,9 +4141,9 @@ def __init__( Mesh.__init__(self, tpoly, c, alpha) self.lighting("off") - self.SetPosition(pos) - self.PickableOff() - self.DragableOff() + self.actor.SetPosition(pos) + self.actor.PickableOff() + self.actor.DragableOff() self.name = "Text3D" self.txt = txt @@ -4486,12 +4486,12 @@ def font(self, font): def on(self): """Make text visible""" - self.SetVisibility(True) + self.actor.SetVisibility(True) return self def off(self): """Make text invisible""" - self.SetVisibility(False) + self.actor.SetVisibility(False) return self class Text2D(TextBase, vtk.vtkActor2D): @@ -4573,10 +4573,10 @@ def __init__( vtk.vtkActor2D.__init__(self) TextBase.__init__(self) - self._mapper = vtk.vtkTextMapper() - self.SetMapper(self._mapper) + self.mapper = vtk.vtkTextMapper() + self.actor.SetMapper(self.mapper) - self.property = self._mapper.GetTextProperty() + self.property = self.mapper.GetTextProperty() self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() @@ -4594,7 +4594,7 @@ def __init__( self.font(font).color(c).background(bg, alpha).bold(bold).italic(italic) self.pos(pos, justify).size(s).text(txt).line_spacing(1.2).line_offset(5) - self.PickableOff() + self.actor.PickableOff() def pos(self, pos="top-left", justify=""): """ @@ -4650,13 +4650,13 @@ def pos(self, pos="top-left", justify=""): if "right" in justify: self.property.SetJustificationToRight() - self.SetPosition(pos) + self.actor.SetPosition(pos) return self def text(self, txt=None): """Set/get the input text string.""" if txt is None: - return self._mapper.GetInput() + return self.mapper.GetInput() if ":" in txt: for r in _reps: @@ -4664,7 +4664,7 @@ def text(self, txt=None): else: txt = str(txt) - self._mapper.SetInput(txt) + self.mapper.SetInput(txt) return self def size(self, s): @@ -4706,8 +4706,8 @@ def __init__(self, c=None): else: c = (0.5, 0.5, 0.5) - self.SetNonlinearFontScaleFactor(1 / 2.75) - self.PickableOff() + self.actor.SetNonlinearFontScaleFactor(1 / 2.75) + self.actor.PickableOff() self.property.SetColor(get_color(c)) self.property.SetBold(False) self.property.SetItalic(False) @@ -4722,9 +4722,9 @@ def size(self, s, linear=False): `f' = linearScale * pow(f,nonlinearScale)` """ if linear: - self.SetLinearFontScaleFactor(s * 5.5) + self.actor.SetLinearFontScaleFactor(s * 5.5) else: - self.SetNonlinearFontScaleFactor(s / 2.75) + self.actor.SetNonlinearFontScaleFactor(s / 2.75) return self def text(self, txt, pos=2): @@ -4830,8 +4830,8 @@ def build_img_plt(formula, tfile): Picture.__init__(self, tmp_file.name, channels=4) self.alpha(alpha) - self.SetScale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) - self.SetPosition(pos) + self.actor.SetScale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) + self.actor.SetPosition(pos) self.name = "Latex" except: From bcb3bc07934de73f0ee1b4483fedc543121dd9ed Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 4 Oct 2023 18:12:56 +0200 Subject: [PATCH 004/251] add vedo/transformations.py --- vedo/__init__.py | 1 + vedo/base.py | 502 +++++++++++++++------------------------- vedo/plotter.py | 9 +- vedo/pointcloud.py | 282 ++++++++++------------ vedo/transformations.py | 370 +++++++++++++++++++++++++++++ 5 files changed, 681 insertions(+), 483 deletions(-) create mode 100644 vedo/transformations.py diff --git a/vedo/__init__.py b/vedo/__init__.py index 108da75b..245b666a 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -25,6 +25,7 @@ settings = Settings(level=0) from vedo.colors import * +from vedo.transformations import * from vedo.utils import * from vedo.base import * from vedo.shapes import * diff --git a/vedo/base.py b/vedo/base.py index 7a340b35..032731c3 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -11,6 +11,8 @@ import vedo from vedo import colors from vedo import utils +from vedo.transformations import LinearTransform + __docformat__ = "google" @@ -39,13 +41,13 @@ def __init__(self, actor, association): def __getitem__(self, key): if self.association == 0: - data = self.actor.inputdata().GetPointData() + data = self.actor.GetPointData() elif self.association == 1: - data = self.actor.inputdata().GetCellData() + data = self.actor.GetCellData() elif self.association == 2: - data = self.actor.inputdata().GetFieldData() + data = self.actor.GetFieldData() varr = data.GetAbstractArray(key) if isinstance(varr, vtk.vtkStringArray): @@ -138,11 +140,11 @@ def __setitem__(self, key, input_array): def keys(self): """Return the list of available data array names""" if self.association == 0: - data = self.actor.inputdata().GetPointData() + data = self.actor.GetPointData() elif self.association == 1: - data = self.actor.inputdata().GetCellData() + data = self.actor.GetCellData() elif self.association == 2: - data = self.actor.inputdata().GetFieldData() + data = self.actor.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() @@ -153,20 +155,20 @@ def keys(self): def remove(self, key): """Remove a data array by name or number""" if self.association == 0: - self.actor.inputdata().GetPointData().RemoveArray(key) + self.actor.GetPointData().RemoveArray(key) elif self.association == 1: - self.actor.inputdata().GetCellData().RemoveArray(key) + self.actor.GetCellData().RemoveArray(key) elif self.association == 2: - self.actor.inputdata().GetFieldData().RemoveArray(key) + self.actor.GetFieldData().RemoveArray(key) def clear(self): """Remove all data associated to this object""" if self.association == 0: - data = self.actor.inputdata().GetPointData() + data = self.actor.GetPointData() elif self.association == 1: - data = self.actor.inputdata().GetCellData() + data = self.actor.GetCellData() elif self.association == 2: - data = self.actor.inputdata().GetFieldData() + data = self.actor.GetFieldData() for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() data.RemoveArray(name) @@ -174,11 +176,11 @@ def clear(self): def rename(self, oldname, newname): """Rename an array""" if self.association == 0: - varr = self.actor.inputdata().GetPointData().GetArray(oldname) + varr = self.actor.GetPointData().GetArray(oldname) elif self.association == 1: - varr = self.actor.inputdata().GetCellData().GetArray(oldname) + varr = self.actor.GetCellData().GetArray(oldname) elif self.association == 2: - varr = self.actor.inputdata().GetFieldData().GetArray(oldname) + varr = self.actor.GetFieldData().GetArray(oldname) if varr: varr.SetName(newname) else: @@ -225,10 +227,10 @@ def select(self, key): def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: - data = self.actor.inputdata().GetPointData() + data = self.actor.GetPointData() self.actor.mapper.SetScalarModeToUsePointData() else: - data = self.actor.inputdata().GetCellData() + data = self.actor.GetCellData() self.actor.mapper.SetScalarModeToUseCellData() if isinstance(key, int): @@ -245,10 +247,10 @@ def select_scalars(self, key): def select_vectors(self, key): """Select one specific vector array by its name to make it the `active` one.""" if self.association == 0: - data = self.actor.inputdata().GetPointData() + data = self.actor.GetPointData() self.actor.mapper.SetScalarModeToUsePointData() else: - data = self.actor.inputdata().GetCellData() + data = self.actor.GetCellData() self.actor.mapper.SetScalarModeToUseCellData() if isinstance(key, int): @@ -361,7 +363,7 @@ def address(self): """ # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ # https://github.com/tfmoraes/polydata_connectivity - return int(self.inputdata().GetAddressAsString("")[5:], 16) + return int(self.GetAddressAsString("")[5:], 16) def pickable(self, value=None): """Set/get the pickability property of an object.""" @@ -377,31 +379,29 @@ def draggable(self, value=None): # NOT FUNCTIONAL? self.actor.SetDragable(value) return self - def origin(self, x=None, y=None, z=None): - """ - Set/get object's origin. - Relevant to control the scaling with `scale()` and rotations. - Has no effect on position. - """ - if x is None: - return np.array(self.GetOrigin()) + self.GetPosition() + def _move(self): + m = self.transform.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] + if np.allclose(M - np.eye(4), 0): + return self - if z is None and y is None: # assume x is of the form (x,y,z) - if len(x) == 3: - x, y, z = x - else: - x, y = x - z = 0 - elif z is None: # assume x,y is of the form x, y - z = 0 - self.actor.SetOrigin([x, y, z] - np.array(self.GetPosition())) + tp = vtk.vtkTransformPolyDataFilter() + tp.SetTransform(self.transform.T) + tp.SetInputData(self) + tp.Update() + out = tp.GetOutput() + + self.DeepCopy(out) + self.point_locator = None + self.cell_locator = None + self.line_locator = None return self def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality - return np.array(self.actor.GetPosition()) + return self.transform.position if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: @@ -411,31 +411,25 @@ def pos(self, x=None, y=None, z=None): z = 0 elif z is None: # assume x,y is of the form x, y z = 0 - self.actor.SetPosition(x, y, z) - self.point_locator = None - self.cell_locator = None - return self # return itself to concatenate methods + # try: + self.transform.set_position([x, y, z]) + return self._move() def shift(self, dx=0, dy=0, dz=0): """Add a vector to the current object position.""" - p = np.array(self.actor.GetPosition()) - if utils.is_sequence(dx): if len(dx) == 2: - self.actor.SetPosition(p + [dx[0], dx[1], 0]) + self.transform.translate([dx[0], dx[1], 0]) else: - self.actor.SetPosition(p + dx) + self.transform.translate(dx) else: - self.actor.SetPosition(p + [dx, dy, dz]) - - self.point_locator = None - self.cell_locator = None - return self + self.transform.translate([dx, dy, dz]) + return self._move() def x(self, val=None): """Set/Get object position along x axis.""" - p = self.actor.GetPosition() + p = self.transform.position if val is None: return p[0] self.pos(val, p[1], p[2]) @@ -443,7 +437,7 @@ def x(self, val=None): def y(self, val=None): """Set/Get object position along y axis.""" - p = self.actor.GetPosition() + p = self.transform.position if val is None: return p[1] self.pos(p[0], val, p[2]) @@ -451,7 +445,7 @@ def y(self, val=None): def z(self, val=None): """Set/Get object position along z axis.""" - p = self.actor.GetPosition() + p = self.transform.position if val is None: return p[2] self.pos(p[0], p[1], val) @@ -474,60 +468,8 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ - if rad: - anglerad = angle - else: - anglerad = np.deg2rad(angle) - axis = utils.versor(axis) - a = np.cos(anglerad / 2) - b, c, d = -axis * np.sin(anglerad / 2) - aa, bb, cc, dd = a * a, b * b, c * c, d * d - bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d - R = np.array( - [ - [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], - [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], - [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc], - ] - ) - rv = np.dot(R, self.GetPosition() - np.asarray(point)) + point - - if rad: - angle *= 180.0 / np.pi - # this vtk method only rotates in the origin of the object: - self.actor.RotateWXYZ(angle, axis[0], axis[1], axis[2]) - self.pos(rv) - return self - - def _rotatexyz(self, a, angle, rad, around): - if rad: - angle *= 180 / np.pi - - T = vtk.vtkTransform() - T.SetMatrix(self.GetMatrix()) - T.PostMultiply() - - rot = dict(x=T.RotateX, y=T.RotateY, z=T.RotateZ) - - if around is None: - # rotate around its origin - rot[a](angle) - else: - if around == "itself": - around = self.GetPosition() - # displacement needed to bring it back to the origin - # and disregard origin - disp = around - np.array(self.GetOrigin()) - T.Translate(-disp) - rot[a](angle) - T.Translate(disp) - - self.actor.SetOrientation(T.GetOrientation()) - self.actor.SetPosition(T.GetPosition()) - - self.point_locator = None - self.cell_locator = None - return self + self.transform.rotate(angle, axis, point, rad) + return self._move() def rotate_x(self, angle, rad=False, around=None): """ @@ -535,7 +477,8 @@ def rotate_x(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - return self._rotatexyz("x", angle, rad, around) + self.transform.rotate_x(angle, rad, around) + return self._move() def rotate_y(self, angle, rad=False, around=None): """ @@ -543,7 +486,8 @@ def rotate_y(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - return self._rotatexyz("y", angle, rad, around) + self.transform.rotate_y(angle, rad, around) + return self._move() def rotate_z(self, angle, rad=False, around=None): """ @@ -551,92 +495,13 @@ def rotate_z(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - return self._rotatexyz("z", angle, rad, around) + self.transform.rotate_z(angle, rad, around) + return self._move() + #TODO def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): - """ - Set/Get object orientation. - - Arguments: - rotation : (float) - rotate object around newaxis. - concatenate : (bool) - concatenate the orientation operation with the previous existing transform (if any) - xyplane : (bool) - make an extra rotation to keep the object aligned to the xy-plane - rad : (bool) - set to True if angle is expressed in radians. - - Example: - ```python - from vedo import * - center = np.array([581/2,723/2,0]) - objs = [] - for a in np.linspace(0, 6.28, 7): - v = vector(cos(a), sin(a), 0)*1000 - pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) - pic.orientation(v, xyplane=True) - pic.origin(center) - pic.pos(v - center) - objs += [pic, Arrow(v, v+v)] - show(objs, Point(), axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/orientation.png) - - Examples: - - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) - - ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) - """ - if self.top is None or self.base is None: - initaxis = (0, 0, 1) - else: - initaxis = utils.versor(self.top - self.base) - - newaxis = utils.versor(newaxis) - p = np.array(self.GetPosition()) - crossvec = np.cross(initaxis, newaxis) - - angleth = np.arccos(np.dot(initaxis, newaxis)) - - T = vtk.vtkTransform() - if concatenate: - try: - M = self.GetMatrix() - T.SetMatrix(M) - except: - pass - T.PostMultiply() - T.Translate(-p) - if rotation: - if rad: - rotation *= 180.0 / np.pi - T.RotateWXYZ(rotation, initaxis) - if xyplane: - angleph = np.arctan2(newaxis[1], newaxis[0]) - T.RotateWXYZ(np.rad2deg(angleph + angleth), initaxis) # compensation - T.RotateWXYZ(np.rad2deg(angleth), crossvec) - T.Translate(p) - - self.actor.SetOrientation(T.GetOrientation()) - - self.point_locator = None - self.cell_locator = None return self - # newaxis = utils.versor(newaxis) - # pos = np.array(self.GetPosition()) - # crossvec = np.cross(initaxis, newaxis) - # angle = np.arccos(np.dot(initaxis, newaxis)) - # T = vtk.vtkTransform() - # T.PostMultiply() - # T.Translate(-pos) - # if rotation: - # T.RotateWXYZ(rotation, initaxis) - # T.RotateWXYZ(np.rad2deg(angle), crossvec) - # T.Translate(pos) - # self.actor.SetUserTransform(T) - # self.transform = T def scale(self, s=None, reset=False): """ @@ -652,85 +517,90 @@ def scale(self, s=None, reset=False): use `s=(sx,sy,sz)` to scale differently in the three coordinates. """ if s is None: - return np.array(self.GetScale()) - - # assert s[0] != 0 - # assert s[1] != 0 - # assert s[2] != 0 + return np.array(self.transform.T.GetScale()) if reset: - self.actor.SetScale(s) + self.transform.set_scale(s) else: - self.actor.SetScale(np.multiply(self.GetScale(), s)) - - self.point_locator = None - self.cell_locator = None - return self + self.transform.scale(s) + return self._move() def get_transform(self, invert=False): - """ - Check if `object.transform` exists and returns a `vtkTransform`. - Otherwise return current user transformation (where the object is currently placed). - - Use `invert` to return the inverse of the current transformation - - Example: - ```python - from vedo import * - - c1 = Cube() - c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - v = vector(0.2,1,0) - p = vector(1,0,0) # axis passes through this point - c2.rotate(90, axis=v, point=p) - - # get the inverse of the current transformation - T = c2.get_transform(invert=True) - c2.apply_transform(T) # put back c2 in place - - l = Line(p-v, p+v).lw(3).c('red') - show(c1.wireframe().lw(3), l, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/get_transf.png) - """ - if self.transform: - tr = self.transform - if invert: - tr = tr.GetInverse() - return tr - - T = self.GetMatrix() - tr = vtk.vtkTransform() - tr.SetMatrix(T) + """Obsolete, use object.transform instead.""" + # """ + # Check if `object.transform` exists and returns a `vtkTransform`. + # Otherwise return current user transformation (where the object is currently placed). + + # Use `invert` to return the inverse of the current transformation + + # Example: + # ```python + # from vedo import * + + # c1 = Cube() + # c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 + # v = vector(0.2,1,0) + # p = vector(1,0,0) # axis passes through this point + # c2.rotate(90, axis=v, point=p) + + # # get the inverse of the current transformation + # T = c2.get_transform(invert=True) + # c2.apply_transform(T) # put back c2 in place + + # l = Line(p-v, p+v).lw(3).c('red') + # show(c1.wireframe().lw(3), l, c2, axes=1).close() + # ``` + # ![](https://vedo.embl.es/images/feats/get_transf.png) + # """ + # if self.transform: + # tr = self.transform + # if invert: + # tr = tr.GetInverse() + # return tr + + # T = self.GetMatrix() + # tr = vtk.vtkTransform() + # tr.SetMatrix(T) + # if invert: + # tr = tr.GetInverse() + # return tr + print("Warning: get_transform() is obsolete, use object.transform instead.") if invert: - tr = tr.GetInverse() - return tr + print("Warning: use object.transform.compute_inverse()") + return self.transform.compute_inverse() + return self.transform + def apply_transform(self, T, reset=False, concatenate=False): - """ - Transform object position and orientation. + """Obsolete, use object.transform instead.""" + # """ + # Transform object position and orientation. + + # Arguments: + # reset : (bool) + # no effect, this is superseded by `pointcloud.apply_transform()` + # concatenate : (bool) + # no effect, this is superseded by `pointcloud.apply_transform()` + # """ + # if isinstance(T, vtk.vtkMatrix4x4): + # self.actor.SetUserMatrix(T) + # elif utils.is_sequence(T): + # vm = vtk.vtkMatrix4x4() + # for i in [0, 1, 2, 3]: + # for j in [0, 1, 2, 3]: + # vm.SetElement(i, j, T[i][j]) + # self.actor.SetUserMatrix(vm) + # else: + # self.actor.SetUserTransform(T) + # self.transform = T - Arguments: - reset : (bool) - no effect, this is superseded by `pointcloud.apply_transform()` - concatenate : (bool) - no effect, this is superseded by `pointcloud.apply_transform()` - """ - if isinstance(T, vtk.vtkMatrix4x4): - self.actor.SetUserMatrix(T) - elif utils.is_sequence(T): - vm = vtk.vtkMatrix4x4() - for i in [0, 1, 2, 3]: - for j in [0, 1, 2, 3]: - vm.SetElement(i, j, T[i][j]) - self.actor.SetUserMatrix(vm) - else: - self.actor.SetUserTransform(T) + # self.point_locator = None + # self.cell_locator = None + # return self + print("Warning: apply_transform() is obsolete, use object.transform instead.") self.transform = T + return self._move() - self.point_locator = None - self.cell_locator = None - return self def align_to_bounding_box(self, msh, rigid=False): """ @@ -781,6 +651,7 @@ def align_to_bounding_box(self, msh, rigid=False): self.point_locator = None self.cell_locator = None + self._move() return self def on(self): @@ -920,8 +791,8 @@ def diagonal_size(self): def copy_data_from(self, obj): """Copy all data (point and cell data) from this input object""" - self.inputdata().GetPointData().PassData(obj.inputdata().GetPointData()) - self.inputdata().GetCellData().PassData(obj.inputdata().GetCellData()) + self.GetPointData().PassData(obj.GetPointData()) + self.GetCellData().PassData(obj.GetCellData()) self.pipeline = utils.OperationNode( f"copy_data_from\n{obj.__class__.__name__}", parents=[self, obj], @@ -1003,42 +874,33 @@ def __init__(self): self.property = None self.mapper = None - # def mapper(self, new_mapper=None): - # """Return the `vtkMapper` data object, or update it with a new one.""" - # if new_mapper: - # self.actor.SetMapper(new_mapper) - # if self.mapper: - # iptdata = self.mapper.GetInput() - # if iptdata: - # new_mapper.SetInputData(self.mapper.GetInput()) - # self.mapper = new_mapper - # self.mapper.Modified() - # return self._mapper def inputdata(self): - """Return the VTK input data object.""" - if self.mapper: - return self.mapper.GetInput() - return self.GetMapper().GetInput() - - def modified(self): - """Use in conjunction with `tonumpy()` - to update any modifications to the volume array""" - sc = self.inputdata().GetPointData().GetScalars() - if sc: - sc.Modified() - self.inputdata().GetPointData().Modified() + """Obsolete, use `self` instead.""" + # """Return the VTK input data object.""" + # if self.mapper: + # return self.mapper.GetInput() + # return self.GetMapper().GetInput() return self + # def modified(self): + # """Use in conjunction with `tonumpy()` + # to update any modifications to the volume array""" + # sc = self.GetPointData().GetScalars() + # if sc: + # sc.Modified() + # self.GetPointData().Modified() + # return self + @property def npoints(self): """Retrieve the number of points.""" - return self.inputdata().GetNumberOfPoints() + return self.GetNumberOfPoints() @property def ncells(self): """Retrieve the number of cells.""" - return self.inputdata().GetNumberOfCells() + return self.GetNumberOfCells() def points(self, pts=None, transformed=True): """ @@ -1057,7 +919,7 @@ def points(self, pts=None, transformed=True): v2p.Update() vpts = v2p.GetOutput().GetPoints() else: # tetmesh et al - vpts = self.inputdata().GetPoints() + vpts = self.GetPoints() if vpts: return utils.vtk2numpy(vpts.GetData()) @@ -1101,7 +963,7 @@ def cell_centers(self): if hasattr(self, "polydata"): vcen.SetInputData(self.polydata()) else: - vcen.SetInputData(self.inputdata()) + vcen.SetInputData(self) vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) @@ -1110,7 +972,7 @@ def delete_cells(self, ids): Remove cells from the mesh object by their ID. Points (vertices) are not removed (you may use `.clean()` to remove those). """ - data = self.inputdata() + data = self data.BuildLinks() for cid in ids: data.DeleteCell(cid) @@ -1380,7 +1242,7 @@ def map_cells_to_points(self, arrays=(), move=False): Set `move=True` to delete the original `celldata` array. """ c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(self.inputdata()) + c2p.SetInputData(self) if not move: c2p.PassCellDataOn() if arrays: @@ -1411,7 +1273,7 @@ def map_points_to_cells(self, arrays=(), move=False): - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ p2c = vtk.vtkPointDataToCellData() - p2c.SetInputData(self.inputdata()) + p2c.SetInputData(self) if not move: p2c.PassPointDataOn() if arrays: @@ -1454,8 +1316,8 @@ def resample_data_from(self, source, tol=None, categorical=False): ``` """ rs = vtk.vtkResampleWithDataSet() - rs.SetInputData(self.inputdata()) - rs.SetSourceData(source.inputdata()) + rs.SetInputData(self) + rs.SetSourceData(source) rs.SetPassPointArrays(True) rs.SetPassCellArrays(True) @@ -1476,7 +1338,7 @@ def resample_data_from(self, source, tol=None, categorical=False): def add_ids(self): """Generate point and cell ids arrays.""" ids = vtk.vtkIdFilter() - ids.SetInputData(self.inputdata()) + ids.SetInputData(self) ids.PointIdsOn() ids.CellIdsOn() ids.FieldDataOff() @@ -1508,10 +1370,10 @@ def gradient(self, input_array=None, on="points", fast=False): """ gra = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.inputdata().GetPointData() + varr = self.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.inputdata().GetCellData() + varr = self.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if input_array is None: @@ -1521,7 +1383,7 @@ def gradient(self, input_array=None, on="points", fast=False): vedo.logger.error(f"in gradient: no scalars found for {on}") raise RuntimeError - gra.SetInputData(self.inputdata()) + gra.SetInputData(self) gra.SetInputScalars(tp, input_array) gra.SetResultArrayName("Gradient") gra.SetFasterApproximation(fast) @@ -1551,10 +1413,10 @@ def divergence(self, array_name=None, on="points", fast=False): """ div = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.inputdata().GetPointData() + varr = self.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.inputdata().GetCellData() + varr = self.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: @@ -1564,7 +1426,7 @@ def divergence(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in divergence(): no vectors found for {on}") raise RuntimeError - div.SetInputData(self.inputdata()) + div.SetInputData(self) div.SetInputScalars(tp, array_name) div.ComputeDivergenceOn() div.ComputeGradientOff() @@ -1594,10 +1456,10 @@ def vorticity(self, array_name=None, on="points", fast=False): """ vort = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.inputdata().GetPointData() + varr = self.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.inputdata().GetCellData() + varr = self.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: @@ -1607,7 +1469,7 @@ def vorticity(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in vorticity(): no vectors found for {on}") raise RuntimeError - vort.SetInputData(self.inputdata()) + vort.SetInputData(self) vort.SetInputScalars(tp, array_name) vort.ComputeDivergenceOff() vort.ComputeGradientOff() @@ -2014,7 +1876,7 @@ def shrink(self, fraction=0.8): ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.inputdata()) + sf.SetInputData(self) sf.SetShrinkFactor(fraction) sf.Update() self._update(sf.GetOutput()) @@ -2066,7 +1928,7 @@ def isosurface(self, value=None, flying_edges=True): out.pipeline = utils.OperationNode( "isosurface", parents=[self], - comment=f"#pts {out.inputdata().GetNumberOfPoints()}", + comment=f"#pts {out.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out @@ -2453,20 +2315,20 @@ def layer(self, value=None): self.SetLayerNumber(value) return self - def pos(self, px=None, py=None): - """Set/Get the screen-coordinate position.""" - if isinstance(px, str): - vedo.logger.error("Use string descriptors only inside the constructor") - return self - if px is None: - return np.array(self.GetPosition(), dtype=int) - if py is not None: - p = [px, py] - else: - p = px - assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" - self.SetPosition(p) - return self + # def pos(self, px=None, py=None): + # """Set/Get the screen-coordinate position.""" + # if isinstance(px, str): + # vedo.logger.error("Use string descriptors only inside the constructor") + # return self + # if px is None: + # return np.array(self.GetPosition(), dtype=int) + # if py is not None: + # p = [px, py] + # else: + # p = px + # assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" + # self.SetPosition(p) + # return self def coordinate_system(self, value=None): """ diff --git a/vedo/plotter.py b/vedo/plotter.py index cf1dce29..38f0d8b9 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2693,9 +2693,16 @@ def _scan_input(self, wannabeacts): # scan the input of show if not utils.is_sequence(wannabeacts): wannabeacts = [wannabeacts] + + wannabeacts2 = [] + for a in wannabeacts: + try: + wannabeacts2.append(a.actor) + except: + pass scannedacts = [] - for a in wannabeacts: # scan content of list + for a in wannabeacts2: # scan content of list if a is None: pass diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 32014f48..3b662fe8 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -11,6 +11,7 @@ from vedo import colors from vedo import utils from vedo.base import BaseActor +from vedo.transformations import LinearTransform __docformat__ = "google" @@ -757,6 +758,7 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() + self.transform = LinearTransform() # self.name = "Points" # better not to give it a name here if blur: @@ -948,7 +950,7 @@ def _update(self, polydata): # self.mapper.SetInputData(polydata) # self.mapper.Modified() return self - + def __add__(self, meshs): if isinstance(meshs, list): alist = [self] @@ -964,29 +966,9 @@ def __add__(self, meshs): return vedo.assembly.Assembly([self, meshs]) - # def polydata(self): - # """ - # Returns the `vtkPolyData` object associated to a `Mesh`. - # Return a copy of polydata that corresponds - # to the current mesh position in space. - # """ - # if True: - # # if self.GetIsIdentity() or self.GetNumberOfPoints()==0: # commmentd out on 15th feb 2020 - # if self.GetNumberOfPoints() == 0: - # # no need to do much - # return self - # # otherwise make a copy that corresponds to - # # the actual position in space of the mesh - # M = self.GetMatrix() - # transform = vtk.vtkTransform() - # transform.SetMatrix(M) - # tp = vtk.vtkTransformPolyDataFilter() - # tp.SetTransform(transform) - # tp.SetInputData(self) - # tp.Update() - # return tp.GetOutput() - # return self - + def polydata(self, transformed=True): + """Obsolete.""" + return self def clone(self, deep=True): """ @@ -2135,7 +2117,7 @@ def flagpole( if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) else: # it's a Point - point = self.GetPosition() + point = self.transform.position pt = utils.make3d(point) @@ -2275,7 +2257,7 @@ def flagpost( if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) else: # it's a Point - point = self.GetPosition() + point = self.transform.position point = utils.make3d(point) @@ -2546,95 +2528,96 @@ def transform_with_landmarks( def apply_transform(self, T, reset=False, concatenate=False): - """ - Apply a linear or non-linear transformation to the mesh polygonal data. - - Arguments: - T : (matrix) - `vtkTransform`, `vtkMatrix4x4` or a 4x4 or 3x3 python or numpy matrix. - reset : (bool) - if True reset the current transformation matrix - to identity after having moved the object, otherwise the internal - matrix will stay the same (to only affect visualization). - It the input transformation has no internal defined matrix (ie. non linear) - then reset will be assumed as True. - concatenate : (bool) - concatenate the transformation with the current existing one - - Example: - ```python - from vedo import Cube, show - c1 = Cube().rotate_z(5).x(2).y(1) - print("cube1 position", c1.pos()) - T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y - c2 = Cube().c('r4') - c2.apply_transform(T) # ignore previous movements - c2.apply_transform(T, concatenate=True) - c2.apply_transform(T, concatenate=True) - print("cube2 position", c2.pos()) - show(c1, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/apply_transform.png) - """ - self.point_locator = None - self.cell_locator = None - self.line_locator = None - - if isinstance(T, vtk.vtkMatrix4x4): - tr = vtk.vtkTransform() - tr.SetMatrix(T) - T = tr - - elif utils.is_sequence(T): - M = vtk.vtkMatrix4x4() - n = len(T[0]) - for i in range(n): - for j in range(n): - M.SetElement(i, j, T[i][j]) - tr = vtk.vtkTransform() - tr.SetMatrix(M) - T = tr - - if reset or not hasattr(T, "GetScale"): # might be non-linear - - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(T) - tf.SetInputData(self.polydata()) - tf.Update() - - I = vtk.vtkMatrix4x4() - self.PokeMatrix(I) # reset to identity - self.SetUserTransform(None) + """Obsolete, use `self.transform` instead.""" + # """ + # Apply a linear or non-linear transformation to the mesh polygonal data. + + # Arguments: + # T : (matrix) + # `vtkTransform`, `vtkMatrix4x4` or a 4x4 or 3x3 python or numpy matrix. + # reset : (bool) + # if True reset the current transformation matrix + # to identity after having moved the object, otherwise the internal + # matrix will stay the same (to only affect visualization). + # It the input transformation has no internal defined matrix (ie. non linear) + # then reset will be assumed as True. + # concatenate : (bool) + # concatenate the transformation with the current existing one + + # Example: + # ```python + # from vedo import Cube, show + # c1 = Cube().rotate_z(5).x(2).y(1) + # print("cube1 position", c1.pos()) + # T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y + # c2 = Cube().c('r4') + # c2.apply_transform(T) # ignore previous movements + # c2.apply_transform(T, concatenate=True) + # c2.apply_transform(T, concatenate=True) + # print("cube2 position", c2.pos()) + # show(c1, c2, axes=1).close() + # ``` + # ![](https://vedo.embl.es/images/feats/apply_transform.png) + # """ + # self.point_locator = None + # self.cell_locator = None + # self.line_locator = None + + # if isinstance(T, vtk.vtkMatrix4x4): + # tr = vtk.vtkTransform() + # tr.SetMatrix(T) + # T = tr + + # elif utils.is_sequence(T): + # M = vtk.vtkMatrix4x4() + # n = len(T[0]) + # for i in range(n): + # for j in range(n): + # M.SetElement(i, j, T[i][j]) + # tr = vtk.vtkTransform() + # tr.SetMatrix(M) + # T = tr + + # if reset or not hasattr(T, "GetScale"): # might be non-linear + + # tf = vtk.vtkTransformPolyDataFilter() + # tf.SetTransform(T) + # tf.SetInputData(self.polydata()) + # tf.Update() + + # I = vtk.vtkMatrix4x4() + # self.PokeMatrix(I) # reset to identity + # self.SetUserTransform(None) + + # self._update(tf.GetOutput()) ### UPDATE + # self.transform = T + + # else: + + # if concatenate: + + # M = vtk.vtkTransform() + # M.PostMultiply() + # M.SetMatrix(self.GetMatrix()) + + # M.Concatenate(T) + + # self.SetScale(M.GetScale()) + # self.SetOrientation(M.GetOrientation()) + # self.SetPosition(M.GetPosition()) + # self.transform = M + # self.SetUserTransform(None) - self._update(tf.GetOutput()) ### UPDATE - self.transform = T - - else: - - if concatenate: - - M = vtk.vtkTransform() - M.PostMultiply() - M.SetMatrix(self.GetMatrix()) - - M.Concatenate(T) - - self.SetScale(M.GetScale()) - self.SetOrientation(M.GetOrientation()) - self.SetPosition(M.GetPosition()) - self.transform = M - self.SetUserTransform(None) - - else: - - self.SetScale(T.GetScale()) - self.SetOrientation(T.GetOrientation()) - self.SetPosition(T.GetPosition()) - self.SetUserTransform(None) + # else: - self.transform = T + # self.SetScale(T.GetScale()) + # self.SetOrientation(T.GetOrientation()) + # self.SetPosition(T.GetPosition()) + # self.SetUserTransform(None) - return self + # self.transform = T + self.transform = T + return self._move() def normalize(self): """Scale Mesh average size to unit.""" @@ -2645,21 +2628,23 @@ def normalize(self): pts = coords - cm xyz2 = np.sum(pts * pts, axis=0) scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) - t = vtk.vtkTransform() - t.PostMultiply() - # t.Translate(-cm) - t.Scale(scale, scale, scale) - # t.Translate(cm) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(self.inputdata()) - tf.SetTransform(t) - tf.Update() - self.point_locator = None - self.cell_locator = None - self.line_locator = None - return self._update(tf.GetOutput()) + # t = vtk.vtkTransform() + # t.PostMultiply() + # # t.Translate(-cm) + # t.Scale(scale, scale, scale) + # # t.Translate(cm) + # tf = vtk.vtkTransformPolyDataFilter() + # tf.SetInputData(self.inputdata()) + # tf.SetTransform(t) + # tf.Update() + # self.point_locator = None + # self.cell_locator = None + # self.line_locator = None + # return self._update(tf.GetOutput()) + self.scale(scale).pos(cm) + return self - def mirror(self, axis="x", origin=(0, 0, 0), reset=False): + def mirror(self, axis="x", origin=None): """ Mirror the mesh along one of the cartesian axes @@ -2669,9 +2654,6 @@ def mirror(self, axis="x", origin=(0, 0, 0), reset=False): Or any combination of those. Adding 'n' reverses mesh faces (hence normals). origin : (list) use this point as the origin of the mirroring transformation. - reset : (bool) - if True keep into account the current position of the object, - and then reset its internal transformation matrix to Identity. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) @@ -2682,46 +2664,22 @@ def mirror(self, axis="x", origin=(0, 0, 0), reset=False): if "x" in axis.lower(): sx = -1 if "y" in axis.lower(): sy = -1 if "z" in axis.lower(): sz = -1 - origin = np.array(origin) - tr = vtk.vtkTransform() - tr.PostMultiply() - tr.Translate(-origin) - tr.Scale(sx, sy, sz) - tr.Translate(origin) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(self.polydata(reset)) - tf.SetTransform(tr) - tf.Update() - outpoly = tf.GetOutput() - if reset: - self.PokeMatrix(vtk.vtkMatrix4x4()) # reset to identity + + self.transform.scale([sx, sy, sz], origin=origin) + + outpoly = self if sx * sy * sz < 0 or "n" in axis: rs = vtk.vtkReverseSense() - rs.SetInputData(outpoly) - rs.ReverseNormalsOff() + rs.SetInputData(self) + rs.ReverseNormalsOn() rs.Update() outpoly = rs.GetOutput() + self.DeepCopy(outpoly) - self.point_locator = None - self.cell_locator = None - self.line_locator = None - - out = self._update(outpoly) - - out.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) - return out - - def shear(self, x=0, y=0, z=0): - """Apply a shear deformation along one of the main axes""" - t = vtk.vtkTransform() - sx, sy, sz = self.GetScale() - t.SetMatrix([sx, x, 0, 0, - y,sy, z, 0, - 0, 0,sz, 0, - 0, 0, 0, 1]) - self.apply_transform(t, reset=True) + self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) return self + def flip_normals(self): """Flip all mesh normals. Same as `mesh.mirror('n')`.""" rs = vtk.vtkReverseSense() diff --git a/vedo/transformations.py b/vedo/transformations.py new file mode 100644 index 00000000..e77d8843 --- /dev/null +++ b/vedo/transformations.py @@ -0,0 +1,370 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import numpy as np + +try: + import vedo.vtkclasses as vtk +except ImportError: + import vtkmodules.all as vtk + + +__docformat__ = "google" + +__doc__ = """ +Submodule to work with transformations
+ +![](https://vedo.embl.es/images/basic/pca.png) +""" + +__all__ = ["LinearTransform"] + +################################################### +def _is_sequence(arg): + if hasattr(arg, "strip"): + return False + if hasattr(arg, "__getslice__"): + return True + if hasattr(arg, "__iter__"): + return True + return False + + +################################################### +class LinearTransform: + """Work with linear transformations.""" + + def __init__(self, T=None): + """Init.""" + + if T is None: + T = vtk.vtkTransform() + + elif _is_sequence(T): + S = vtk.vtkTransform() + M = vtk.vtkMatrix4x4() + n = len(T) + for i in range(n): + for j in range(n): + M.SetElement(i, j, T[i][j]) + S.SetMatrix(M) + T = S + + self.T = T + self.T.PostMultiply() + self.inverse_flag = False + + def __str__(self): + return "Transformation Matrix 4x4:\n" + str(self.matrix) + + def __repr__(self): + return "Transformation Matrix 4x4:\n" + str(self.matrix) + + + def apply_to(self, obj): + """Apply transformation.""" + if _is_sequence(obj): + v = self.T.TransformFloatPoint(obj) + return np.array(v) + + obj.transform = self + + m = self.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] + if np.allclose(M - np.eye(4), 0): + return + + tp = vtk.vtkTransformPolyDataFilter() + tp.SetTransform(self.T) + tp.SetInputData(obj) + tp.Update() + out = tp.GetOutput() + + obj.DeepCopy(out) + obj.point_locator = None + obj.cell_locator = None + obj.line_locator = None + # obj.actor.SetOrigin(self.T.GetPosition()) + + def reset(self): + """Reset transformation.""" + self.T.Identity() + return self + + def pop(self): + """Delete the transformation on the top of the stack + and sets the top to the next transformation on the stack.""" + self.T.Pop() + return self + + def invert(self): + """Invert transformation.""" + self.T.Inverse() + self.inverse_flag = bool(self.T.GetInverseFlag()) + return self + + def compute_inverse(self): + """Compute inverse.""" + return LinearTransform(self.T.GetInverse()) + + def clone(self): + """Clone.""" + return LinearTransform(self.T.Clone()) + + def concatenate(self, T, pre_multiply=False): + """Post multiply.""" + if pre_multiply: + self.T.PreMultiply() + self.T.Concatenate(T.T) + self.T.PostMultiply() + return self + + def get_concatenated_transform(self, i): + """Get intermediate matrix by concatenation index.""" + return LinearTransform(self.T.GetConcatenatedTransform(i)) + + @property + def n_concatenated_transforms(self): + """Get number of concatenated transforms.""" + return self.T.GetNumberOfConcatenatedTransforms() + + def translate(self, p): + """Translate.""" + self.T.Translate(*p) + return self + + def scale(self, s=None, origin=True): + """Scale.""" + if not _is_sequence(s): + s = [s, s, s] + if origin is True: + p = np.array(self.T.GetPosition()) + if np.linalg.norm(p) > 0: + self.T.Translate(-p) + self.T.Scale(*s) + self.T.Translate(p) + else: + self.T.Scale(*s) + elif _is_sequence(origin): + p = np.array(self.T.GetPosition()) + self.T.Translate(-p) + self.T.Scale(*s) + self.T.Translate(p) + else: + self.T.Scale(*s) + return self + + def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): + """ + Rotate around an arbitrary `axis` passing through `point`. + + Example: + ```python + from vedo import * + c1 = Cube() + c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 + v = vector(0.2,1,0) + p = vector(1,0,0) # axis passes through this point + c2.rotate(90, axis=v, point=p) + l = Line(-v+p, v+p).lw(3).c('red') + show(c1, l, c2, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/rotate_axis.png) + """ + if rad: + anglerad = angle + else: + anglerad = np.deg2rad(angle) + axis = np.asarray(axis) / np.linalg.norm(axis) + a = np.cos(anglerad / 2) + b, c, d = -axis * np.sin(anglerad / 2) + aa, bb, cc, dd = a * a, b * b, c * c, d * d + bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d + R = np.array( + [ + [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], + [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], + [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc], + ] + ) + rv = np.dot(R, self.T.GetPosition() - np.asarray(point)) + point + + if rad: + angle *= 180.0 / np.pi + # this vtk method only rotates in the origin of the object: + self.T.RotateWXYZ(angle, axis[0], axis[1], axis[2]) + self.T.Translate(rv - np.array(self.T.GetPosition())) + return self + + def _rotatexyz(self, axe, angle, rad, around): + if rad: + angle *= 180 / np.pi + + rot = dict(x=self.T.RotateX, y=self.T.RotateY, z=self.T.RotateZ) + + if around is None: + # rotate around its origin + rot[axe](angle) + else: + # displacement needed to bring it back to the origin + self.T.Translate(-np.asarray(around)) + rot[axe](angle) + self.T.Translate(around) + return self + + def rotate_x(self, angle, rad=False, around=None): + """ + Rotate around x-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + return self._rotatexyz("x", angle, rad, around) + + def rotate_y(self, angle, rad=False, around=None): + """ + Rotate around y-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + return self._rotatexyz("y", angle, rad, around) + + def rotate_z(self, angle, rad=False, around=None): + """ + Rotate around z-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + return self._rotatexyz("z", angle, rad, around) + + def set_position(self, p): + """Set position.""" + if len(p) == 2: + p = np.array([p[0], p[1], 0]) + q = np.array(self.T.GetPosition()) + self.T.Translate(p - q) + return self + + def set_scale(self, s): + """Set absolute scale.""" + if not _is_sequence(s): + s = [s, s, s] + s0, s1, s2 = 1, 1, 1 + b = self.T.GetScale() + if b[0]: + s0 = s[0] / b[0] + if b[1]: + s1 = s[1] / b[1] + if b[2]: + s2 = s[2] / b[2] + self.T.Scale(s0, s1, s2) + return self + + def get_scale(self): + """Get current scale.""" + return np.array(self.T.GetScale()) + + @property + def orientation(self): + """Compute orientation.""" + return np.array(self.T.GetOrientation()) + + @property + def position(self): + """Compute position.""" + return np.array(self.T.GetPosition()) + + @property + def matrix(self): + """Get trasformation matrix.""" + m = self.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] + return np.array(M) + + @matrix.setter + def matrix(self, M): + """Set trasformation by assigning a 4x4 or 3x3 numpy matrix.""" + m = vtk.vtkMatrix4x4() + n = len(M) + for i in range(n): + for j in range(n): + m.SetElement(i, j, M[i][j]) + self.T.SetMatrix(m) + + @property + def matrix3x3(self): + """Get matrix.""" + m = self.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(3)] for i in range(3)] + return np.array(M) + + + # TODO: implement this + def set_orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): + # """ + # Set/Get object orientation. + + # Arguments: + # rotation : (float) + # rotate object around newaxis. + # concatenate : (bool) + # concatenate the orientation operation with the previous existing transform (if any) + # xyplane : (bool) + # make an extra rotation to keep the object aligned to the xy-plane + # rad : (bool) + # set to True if angle is expressed in radians. + + # Example: + # ```python + # from vedo import * + # center = np.array([581/2,723/2,0]) + # objs = [] + # for a in np.linspace(0, 6.28, 7): + # v = vector(cos(a), sin(a), 0)*1000 + # pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) + # pic.orientation(v, xyplane=True) + # pic.origin(center) + # pic.pos(v - center) + # objs += [pic, Arrow(v, v+v)] + # show(objs, Point(), axes=1).close() + # ``` + # ![](https://vedo.embl.es/images/feats/orientation.png) + + # Examples: + # - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) + + # ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) + # """ + # if self.top is None or self.base is None: + # initaxis = (0, 0, 1) + # else: + # initaxis = utils.versor(self.top - self.base) + + # newaxis = utils.versor(newaxis) + # p = np.array(self.GetPosition()) + # crossvec = np.cross(initaxis, newaxis) + + # angleth = np.arccos(np.dot(initaxis, newaxis)) + + # T = vtk.vtkTransform() + # if concatenate: + # try: + # M = self.GetMatrix() + # T.SetMatrix(M) + # except: + # pass + # T.PostMultiply() + # T.Translate(-p) + # if rotation: + # if rad: + # rotation *= 180.0 / np.pi + # T.RotateWXYZ(rotation, initaxis) + # if xyplane: + # angleph = np.arctan2(newaxis[1], newaxis[0]) + # T.RotateWXYZ(np.rad2deg(angleph + angleth), initaxis) # compensation + # T.RotateWXYZ(np.rad2deg(angleth), crossvec) + # T.Translate(p) + + # self.actor.SetOrientation(T.GetOrientation()) + + # self.point_locator = None + # self.cell_locator = None + return self From 1cde3616f7dac1723040741ae942b19036755c40 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 4 Oct 2023 18:14:40 +0200 Subject: [PATCH 005/251] add vedo/transformations.py --- vedo/base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vedo/base.py b/vedo/base.py index 032731c3..46320baf 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -72,17 +72,17 @@ def __getitem__(self, key): def __setitem__(self, key, input_array): if self.association == 0: - data = self.GetPointData() - n = self.GetNumberOfPoints() + data = self.actor.GetPointData() + n = self.actor.GetNumberOfPoints() self.mapper.SetScalarModeToUsePointData() elif self.association == 1: - data = self.GetCellData() - n = self.GetNumberOfCells() + data = self.actor.GetCellData() + n = self.actor.GetNumberOfCells() self.mapper.SetScalarModeToUseCellData() elif self.association == 2: - data = self.GetFieldData() + data = self.actor.GetFieldData() if not utils.is_sequence(input_array): input_array = [input_array] From 84bbcc38ea2974b38fb3e2b3b49a206edf6da2e1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 4 Oct 2023 20:17:54 +0200 Subject: [PATCH 006/251] remove polydata() --- vedo/addons.py | 14 +- vedo/assembly.py | 3 +- vedo/base.py | 186 ++++--------- vedo/file_io.py | 43 ++- vedo/mesh.py | 250 ++++++++--------- vedo/pointcloud.py | 577 +++++++++++++--------------------------- vedo/shapes.py | 22 +- vedo/transformations.py | 15 +- vedo/utils.py | 15 +- 9 files changed, 432 insertions(+), 693 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 33e0d638..8f3b0c1f 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -316,9 +316,9 @@ def __init__( else: marker = markers[i] if utils.is_sequence(markers) else markers if isinstance(marker, vedo.Points): - poly = marker.clone(deep=False).normalize().shift(0, 1, 0).polydata() + poly = marker.clone(deep=False).normalize().shift(0, 1, 0) else: # assume string marker - poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0).polydata() + poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0) self.SetEntry(n, poly, ti, col) n += 1 @@ -1781,7 +1781,7 @@ def __init__( self._implicit_func = vtk.vtkPlane() - poly = mesh.polydata() + poly = mesh self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) @@ -1917,7 +1917,7 @@ def __init__( self._implicit_func = vtk.vtkPlanes() self._implicit_func.SetBounds(self._init_bounds) - poly = mesh.polydata() + poly = mesh self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) @@ -2031,7 +2031,7 @@ def __init__( radius = mesh.average_size() * 2 self._implicit_func.SetRadius(radius) - poly = mesh.polydata() + poly = mesh self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) @@ -4220,9 +4220,9 @@ def add_global_axes(axtype=None, c=None, bounds=()): largestact = a sz = d if isinstance(largestact, Assembly): - ocf.SetInputData(largestact.unpack(0).GetMapper().GetInput()) + ocf.SetInputData(largestact.unpack(0)) else: - ocf.SetInputData(largestact.GetMapper().GetInput()) + ocf.SetInputData(largestact) ocf.Update() oc_mapper = vtk.vtkHierarchicalPolyDataMapper() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) diff --git a/vedo/assembly.py b/vedo/assembly.py index e5a29c83..f10ba523 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -60,7 +60,8 @@ def procrustes_alignment(sources, rigid=False): for i, s in enumerate(sources): poly = procrustes.GetOutput().GetBlock(i) mesh = vedo.mesh.Mesh(poly) - mesh.SetProperty(s.GetProperty()) + mesh.actor.SetProperty(s.actor.GetProperty()) + mesh.property = s.actor.GetProperty() if hasattr(s, "name"): mesh.name = s.name acts.append(mesh) diff --git a/vedo/base.py b/vedo/base.py index 46320baf..69c7d0f8 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -31,23 +31,23 @@ ############################################################################### class _DataArrayHelper: + # Internal use only. # Helper class to manage data associated to either # points (or vertices) and cells (or faces). - # Internal use only. - def __init__(self, actor, association): - self.actor = actor + def __init__(self, obj, association): + self.obj = obj self.association = association def __getitem__(self, key): if self.association == 0: - data = self.actor.GetPointData() + data = self.obj.GetPointData() elif self.association == 1: - data = self.actor.GetCellData() + data = self.obj.GetCellData() elif self.association == 2: - data = self.actor.GetFieldData() + data = self.obj.GetFieldData() varr = data.GetAbstractArray(key) if isinstance(varr, vtk.vtkStringArray): @@ -72,17 +72,17 @@ def __getitem__(self, key): def __setitem__(self, key, input_array): if self.association == 0: - data = self.actor.GetPointData() - n = self.actor.GetNumberOfPoints() - self.mapper.SetScalarModeToUsePointData() + data = self.obj.GetPointData() + n = self.obj.GetNumberOfPoints() + self.obj.mapper.SetScalarModeToUsePointData() elif self.association == 1: - data = self.actor.GetCellData() - n = self.actor.GetNumberOfCells() - self.mapper.SetScalarModeToUseCellData() + data = self.obj.GetCellData() + n = self.obj.GetNumberOfCells() + self.obj.mapper.SetScalarModeToUseCellData() elif self.association == 2: - data = self.actor.GetFieldData() + data = self.obj.GetFieldData() if not utils.is_sequence(input_array): input_array = [input_array] @@ -140,11 +140,11 @@ def __setitem__(self, key, input_array): def keys(self): """Return the list of available data array names""" if self.association == 0: - data = self.actor.GetPointData() + data = self.obj.GetPointData() elif self.association == 1: - data = self.actor.GetCellData() + data = self.obj.GetCellData() elif self.association == 2: - data = self.actor.GetFieldData() + data = self.obj.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() @@ -155,20 +155,20 @@ def keys(self): def remove(self, key): """Remove a data array by name or number""" if self.association == 0: - self.actor.GetPointData().RemoveArray(key) + self.obj.GetPointData().RemoveArray(key) elif self.association == 1: - self.actor.GetCellData().RemoveArray(key) + self.obj.GetCellData().RemoveArray(key) elif self.association == 2: - self.actor.GetFieldData().RemoveArray(key) + self.obj.GetFieldData().RemoveArray(key) def clear(self): """Remove all data associated to this object""" if self.association == 0: - data = self.actor.GetPointData() + data = self.obj.GetPointData() elif self.association == 1: - data = self.actor.GetCellData() + data = self.obj.GetCellData() elif self.association == 2: - data = self.actor.GetFieldData() + data = self.obj.GetFieldData() for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() data.RemoveArray(name) @@ -176,11 +176,11 @@ def clear(self): def rename(self, oldname, newname): """Rename an array""" if self.association == 0: - varr = self.actor.GetPointData().GetArray(oldname) + varr = self.obj.GetPointData().GetArray(oldname) elif self.association == 1: - varr = self.actor.GetCellData().GetArray(oldname) + varr = self.obj.GetCellData().GetArray(oldname) elif self.association == 2: - varr = self.actor.GetFieldData().GetArray(oldname) + varr = self.obj.GetFieldData().GetArray(oldname) if varr: varr.SetName(newname) else: @@ -218,8 +218,8 @@ def select(self, key): data.SetActiveTensors(key) try: - self.actor.mapper.SetArrayName(key) - self.actor.mapper.ScalarVisibilityOn() + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() # .. could be a volume mapper except AttributeError: pass @@ -227,11 +227,11 @@ def select(self, key): def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: - data = self.actor.GetPointData() - self.actor.mapper.SetScalarModeToUsePointData() + data = self.obj.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.actor.GetCellData() - self.actor.mapper.SetScalarModeToUseCellData() + data = self.obj.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -239,19 +239,19 @@ def select_scalars(self, key): data.SetActiveScalars(key) try: - self.actor.mapper.SetArrayName(key) - self.actor.mapper.ScalarVisibilityOn() + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() except AttributeError: pass def select_vectors(self, key): """Select one specific vector array by its name to make it the `active` one.""" if self.association == 0: - data = self.actor.GetPointData() - self.actor.mapper.SetScalarModeToUsePointData() + data = self.obj.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.actor.GetCellData() - self.actor.mapper.SetScalarModeToUseCellData() + data = self.obj.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -259,8 +259,8 @@ def select_vectors(self, key): data.SetActiveVectors(key) try: - self.actor.mapper.SetArrayName(key) - self.actor.mapper.ScalarVisibilityOn() + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() except AttributeError: pass @@ -274,8 +274,8 @@ def __repr__(self) -> str: def _get_str(pd, header): if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7m{header}" - if self.actor.name: - out += f" in {self.actor.name}" + if self.obj.name: + out += f" in {self.obj.name}" out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetArray(i) @@ -340,12 +340,12 @@ def __init__(self): self.axes = None self.picked3d = None self.units = None - self.top = np.array([0, 0, 1]) + self.top = np.array([0, 0, 1]) self.base = np.array([0, 0, 0]) self.info = {} self.time = time.time() self.rendered_at = set() - self.transform = None + self.transform = LinearTransform() self._isfollower = False # set by mesh.follow_camera() self.point_locator = None @@ -356,7 +356,7 @@ def __init__(self): # self.scalarbars = dict() #TODO self.pipeline = None - def address(self): + def memory_address(self): """ Return a unique memory address integer which may serve as the ID of the object, or passed to c++ code. @@ -468,7 +468,7 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ - self.transform.rotate(angle, axis, point, rad) + self.rotate(angle, axis, point, rad) return self._move() def rotate_x(self, angle, rad=False, around=None): @@ -525,82 +525,6 @@ def scale(self, s=None, reset=False): self.transform.scale(s) return self._move() - def get_transform(self, invert=False): - """Obsolete, use object.transform instead.""" - # """ - # Check if `object.transform` exists and returns a `vtkTransform`. - # Otherwise return current user transformation (where the object is currently placed). - - # Use `invert` to return the inverse of the current transformation - - # Example: - # ```python - # from vedo import * - - # c1 = Cube() - # c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - # v = vector(0.2,1,0) - # p = vector(1,0,0) # axis passes through this point - # c2.rotate(90, axis=v, point=p) - - # # get the inverse of the current transformation - # T = c2.get_transform(invert=True) - # c2.apply_transform(T) # put back c2 in place - - # l = Line(p-v, p+v).lw(3).c('red') - # show(c1.wireframe().lw(3), l, c2, axes=1).close() - # ``` - # ![](https://vedo.embl.es/images/feats/get_transf.png) - # """ - # if self.transform: - # tr = self.transform - # if invert: - # tr = tr.GetInverse() - # return tr - - # T = self.GetMatrix() - # tr = vtk.vtkTransform() - # tr.SetMatrix(T) - # if invert: - # tr = tr.GetInverse() - # return tr - print("Warning: get_transform() is obsolete, use object.transform instead.") - if invert: - print("Warning: use object.transform.compute_inverse()") - return self.transform.compute_inverse() - return self.transform - - - def apply_transform(self, T, reset=False, concatenate=False): - """Obsolete, use object.transform instead.""" - # """ - # Transform object position and orientation. - - # Arguments: - # reset : (bool) - # no effect, this is superseded by `pointcloud.apply_transform()` - # concatenate : (bool) - # no effect, this is superseded by `pointcloud.apply_transform()` - # """ - # if isinstance(T, vtk.vtkMatrix4x4): - # self.actor.SetUserMatrix(T) - # elif utils.is_sequence(T): - # vm = vtk.vtkMatrix4x4() - # for i in [0, 1, 2, 3]: - # for j in [0, 1, 2, 3]: - # vm.SetElement(i, j, T[i][j]) - # self.actor.SetUserMatrix(vm) - # else: - # self.actor.SetUserTransform(T) - # self.transform = T - - # self.point_locator = None - # self.cell_locator = None - # return self - print("Warning: apply_transform() is obsolete, use object.transform instead.") - self.transform = T - return self._move() - def align_to_bounding_box(self, msh, rigid=False): """ @@ -646,12 +570,9 @@ def align_to_bounding_box(self, msh, rigid=False): if rigid: lmt.SetModeToRigidBody() lmt.Update() - self.apply_transform(lmt) - self.transform = lmt - self.point_locator = None - self.cell_locator = None - self._move() + T = LinearTransform(lmt) + self.apply_transform(T) return self def on(self): @@ -912,7 +833,7 @@ def points(self, pts=None, transformed=True): if pts is None: ### getter if isinstance(self, vedo.Points): - vpts = self.polydata(transformed).GetPoints() + vpts = self.GetPoints() elif isinstance(self, vedo.BaseVolume): v2p = vtk.vtkImageToPoints() v2p.SetInputData(self.imagedata()) @@ -932,7 +853,7 @@ def points(self, pts=None, transformed=True): if pts.ndim == 1: ### getter by point index ################### indices = pts.astype(int) - vpts = self.polydata(transformed).GetPoints() + vpts = self.GetPoints() arr = utils.vtk2numpy(vpts.GetData()) return arr[indices] ########### @@ -961,7 +882,7 @@ def cell_centers(self): """ vcen = vtk.vtkCellCenters() if hasattr(self, "polydata"): - vcen.SetInputData(self.polydata()) + vcen.SetInputData(self) else: vcen.SetInputData(self) vcen.Update() @@ -1017,7 +938,7 @@ def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): cellIds = vtk.vtkIdList() self.cell_locator = vtk.vtkCellTreeLocator() - self.cell_locator.SetDataSet(self.polydata()) + self.cell_locator.SetDataSet(self) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cellIds) @@ -1661,7 +1582,7 @@ def __init__(self): # ----------------------------------------------------------- def _update(self, data): - self.mapper.SetInputData(self.tomesh().polydata()) + self.mapper.SetInputData(self.tomesh()) self.mapper.Modified() return self @@ -2091,11 +2012,10 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal # if isinstance(self, vedo.Volume): # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") - polymesh = mesh.polydata() ug = self._data ippd = vtk.vtkImplicitPolyDataDistance() - ippd.SetInput(polymesh) + ippd.SetInput(mesh) if whole_cells or only_boundary: clipper = vtk.vtkExtractGeometry() diff --git a/vedo/file_io.py b/vedo/file_io.py index d1911f35..73cfa565 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -844,7 +844,7 @@ def _fillcommon(obj, adict): def _fillmesh(obj, adict): adict["points"] = obj.points(transformed=True).astype(float) - poly = obj.polydata() + poly = obj adict["cells"] = None if poly.GetNumberOfPolys(): @@ -883,7 +883,7 @@ def _fillmesh(obj, adict): adict["LUT"] = None adict["LUT_range"] = None - lut = obj.mapper().GetLookupTable() + lut = obj.mapper.GetLookupTable() if lut: nlut = lut.GetNumberOfTableValues() lutvals = [] @@ -893,7 +893,7 @@ def _fillmesh(obj, adict): adict["LUT"] = lutvals adict["LUT_range"] = lut.GetRange() - prp = obj.GetProperty() + prp = obj.actor.GetProperty() adict["alpha"] = prp.GetOpacity() adict["representation"] = prp.GetRepresentation() adict["pointsize"] = prp.GetPointSize() @@ -916,7 +916,7 @@ def _fillmesh(obj, adict): if obj.GetBackfaceProperty(): adict["backcolor"] = obj.GetBackfaceProperty().GetColor() - adict["scalarvisibility"] = obj.mapper().GetScalarVisibility() + adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() adict["texture"] = obj._texture if hasattr(obj, "_texture") else None ######################################################## Assembly @@ -945,9 +945,9 @@ def _fillmesh(obj, adict): arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) adict["array"] = arr.reshape(imgdata.GetDimensions()) adict["mode"] = obj.mode() - # adict['jittering'] = obj.mapper().GetUseJittering() + # adict['jittering'] = obj.mapper.GetUseJittering() - prp = obj.GetProperty() + prp = obj.actor.GetProperty() ctf = prp.GetRGBTransferFunction() otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() @@ -1056,7 +1056,7 @@ def _buildmesh(d): msh = Mesh(poly) _load_common(msh, d) - prp = msh.GetProperty() + prp = msh.actor.GetProperty() if 'ambient' in keys: prp.SetAmbient(d['ambient']) if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) if 'specular' in keys: prp.SetSpecular(d['specular']) @@ -1084,7 +1084,7 @@ def _buildmesh(d): for psc, pscname in d["pointdata"]: msh.pointdata[pscname] = psc - msh.mapper().ScalarVisibilityOff() # deactivate scalars + msh.mapper.ScalarVisibilityOff() # deactivate scalars if "LUT" in keys and "activedata" in keys and d["activedata"]: # print(d['activedata'],'', msh.filename) @@ -1097,9 +1097,9 @@ def _buildmesh(d): r, g, b, a = lut_list[i] lut.SetTableValue(i, r, g, b, a) lut.Build() - msh.mapper().SetLookupTable(lut) - msh.mapper().ScalarVisibilityOn() # activate scalars - msh.mapper().SetScalarRange(d["LUT_range"]) + msh.mapper.SetLookupTable(lut) + msh.mapper.ScalarVisibilityOn() # activate scalars + msh.mapper.SetScalarRange(d["LUT_range"]) if d["activedata"][0] == "celldata": poly.GetCellData().SetActiveScalars(d["activedata"][1]) if d["activedata"][0] == "pointdata": @@ -1110,9 +1110,9 @@ def _buildmesh(d): if "scalarvisibility" in keys: if d["scalarvisibility"]: - msh.mapper().ScalarVisibilityOn() + msh.mapper.ScalarVisibilityOn() else: - msh.mapper().ScalarVisibilityOff() + msh.mapper.ScalarVisibilityOff() if "texture" in keys and d["texture"]: msh.texture(**d["texture"]) @@ -1228,12 +1228,12 @@ def write(objct, fileoutput, binary=True): - `vtk, vti, npy, npz, ply, obj, stl, byu, vtp, vti, mhd, xyz, tif, png, bmp` """ obj = objct - if isinstance(obj, Points): # picks transformation - obj = objct.polydata(True) - elif isinstance(obj, (vtk.vtkActor, vtk.vtkVolume)): - obj = objct.GetMapper().GetInput() - elif isinstance(obj, (vtk.vtkPolyData, vtk.vtkImageData)): - obj = objct + # if isinstance(obj, Points): # picks transformation + # obj = objct + # elif isinstance(obj, (vtk.vtkActor, vtk.vtkVolume)): + # obj = objct + # elif isinstance(obj, (vtk.vtkPolyData, vtk.vtkImageData)): + # obj = objct fr = fileoutput.lower() if fr.endswith(".vtk"): @@ -1241,7 +1241,7 @@ def write(objct, fileoutput, binary=True): elif fr.endswith(".ply"): writer = vtk.vtkPLYWriter() writer.AddComment("PLY file generated by vedo") - lut = objct.GetMapper().GetLookupTable() + lut = objct.mapper.GetLookupTable() if lut: pscal = obj.GetPointData().GetScalars() if not pscal: @@ -1259,7 +1259,6 @@ def write(objct, fileoutput, binary=True): g = vtk.vtkMultiBlockDataGroupFilter() for ob in objct: if isinstance(ob, (Points, Volume)): # picks transformation - ob = ob.polydata(True) g.AddInputData(ob) g.Update() mb = g.GetOutputDataObject(0) @@ -1306,7 +1305,7 @@ def write(objct, fileoutput, binary=True): for p in objct.points(): outF.write("v {:.5g} {:.5g} {:.5g}\n".format(*p)) - ptxt = objct.polydata().GetPointData().GetTCoords() + ptxt = objct.GetPointData().GetTCoords() if ptxt: ntxt = utils.vtk2numpy(ptxt) for vt in ntxt: diff --git a/vedo/mesh.py b/vedo/mesh.py index 20c1c64d..7b897d53 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -152,9 +152,9 @@ def __init__(self, inputobj=None, c=None, alpha=1): dataset = vedo.file_io.load(inputobj) self.filename = inputobj if "TetMesh" in str(type(dataset)): - _data = dataset.tomesh().polydata(False) + _data = dataset.tomesh() else: - _data = dataset.polydata(False) + _data = dataset else: try: @@ -273,15 +273,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.GetPointData().GetScalars(): + if self.GetPointData().GetScalars().GetName(): + name = self.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.GetCellData().GetScalars(): + if self.GetCellData().GetScalars().GetName(): + name = self.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ @@ -317,14 +317,14 @@ def faces(self, ids=()): If ids is set, return only the faces of the given cells. """ - arr1d = vtk2numpy(self._data.GetPolys().GetData()) + arr1d = vtk2numpy(self.GetPolys().GetData()) if arr1d is None: return [] # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. if len(arr1d) == 0: - arr1d = vtk2numpy(self._data.GetStrips().GetData()) + arr1d = vtk2numpy(self.GetStrips().GetData()) if arr1d is None: return [] @@ -357,7 +357,7 @@ def lines(self, flat=False): """ # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - arr1d = vtk2numpy(self.polydata(False).GetLines().GetData()) + arr1d = vtk2numpy(self.GetLines().GetData()) if arr1d is None: return [] @@ -384,7 +384,7 @@ def edges(self, ids=()): If ids is set, return only the edges of the given cells. """ extractEdges = vtk.vtkExtractEdges() - extractEdges.SetInputData(self._data) + extractEdges.SetInputData(self) # eed.UseAllPointsOn() extractEdges.Update() lpoly = extractEdges.GetOutput() @@ -452,7 +452,7 @@ def texture( ![](https://vedo.embl.es/images/basic/texturecubes.png) """ - pd = self.polydata(False) + pd = self outimg = None if tname is None: # disable texture @@ -577,7 +577,7 @@ def texture( self.SetTexture(tu) if seam_threshold is not None: - tname = self._data.GetPointData().GetTCoords().GetName() + tname = self.GetPointData().GetTCoords().GetName() grad = self.gradient(tname) ugrad, vgrad = np.split(grad, 2, axis=1) ugradm, vgradm = vedo.utils.mag2(ugrad), vedo.utils.mag2(vgrad) @@ -636,7 +636,7 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ - poly = self.polydata(False) + poly = self pdnorm = vtk.vtkPolyDataNormals() pdnorm.SetInputData(poly) pdnorm.SetComputePointNormals(points) @@ -650,7 +650,9 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten pdnorm.SetSplitting(False) # print(pdnorm.GetNonManifoldTraversal()) pdnorm.Update() - return self._update(pdnorm.GetOutput()) + self.GetPointData().SetNormals(pdnorm.GetOutput().GetPointData().GetNormals()) + self.GetCellData().SetNormals(pdnorm.GetOutput().GetCellData().GetNormals()) + return self def reverse(self, cells=True, normals=False): """ @@ -664,7 +666,7 @@ def reverse(self, cells=True, normals=False): - `normals=True` reverses the normals by multiplying the normal vector by -1 (both point and cell normals, if present). """ - poly = self.polydata(False) + poly = self if is_sequence(cells): for cell in cells: @@ -683,9 +685,9 @@ def reverse(self, cells=True, normals=False): rev.ReverseNormalsOff() rev.SetInputData(poly) rev.Update() - out = self._update(rev.GetOutput()) - out.pipeline = OperationNode("reverse", parents=[self]) - return out + self.DeepCopy(rev.GetOutput()) + self.pipeline = OperationNode("reverse", parents=[self]) + return self def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface.""" @@ -727,7 +729,7 @@ def backcolor(self, bc=None): """ Set/get mesh's backface color. """ - backProp = self.GetBackfaceProperty() + backProp = self.actor.GetBackfaceProperty() if bc is None: if backProp: @@ -742,7 +744,7 @@ def backcolor(self, bc=None): backProp.SetDiffuseColor(get_color(bc)) backProp.SetOpacity(self.property.GetOpacity()) - self.SetBackfaceProperty(backProp) + self.actor.SetBackfaceProperty(backProp) self.mapper.ScalarVisibilityOff() return self @@ -783,7 +785,7 @@ def volume(self): """Get/set the volume occupied by mesh.""" mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) - mass.SetInputData(self.polydata()) + mass.SetInputData(self) mass.Update() return mass.GetVolume() @@ -795,7 +797,7 @@ def area(self): """ mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) - mass.SetInputData(self.polydata()) + mass.SetInputData(self) mass.Update() return mass.GetSurfaceArea() @@ -805,7 +807,7 @@ def is_closed(self): fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() - fe.SetInputData(self.polydata(False)) + fe.SetInputData(self) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) @@ -816,7 +818,7 @@ def is_manifold(self): fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() - fe.SetInputData(self.polydata(False)) + fe.SetInputData(self) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) @@ -898,7 +900,7 @@ def non_manifold_faces(self, remove=True, tol="auto"): self.delete_cells(toremove) self.pipeline = OperationNode( - "non_manifold_faces", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}" + "non_manifold_faces", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" ) return self @@ -911,15 +913,14 @@ def shrink(self, fraction=0.85): ![](https://vedo.embl.es/images/basic/shrink.png) """ shrink = vtk.vtkShrinkPolyData() - shrink.SetInputData(self._data) + shrink.SetInputData(self) shrink.SetShrinkFactor(fraction) shrink.Update() self.point_locator = None self.cell_locator = None - out = self._update(shrink.GetOutput()) - - out.pipeline = OperationNode("shrink", parents=[self]) - return out + self.DeepCopy(shrink.GetOutput()) + self.pipeline = OperationNode("shrink", parents=[self]) + return self def stretch(self, q1, q2): """ @@ -977,10 +978,8 @@ def cap(self, return_cap=False): See also: `join()`, `join_segments()`, `slice()`. """ - poly = self._data - fe = vtk.vtkFeatureEdges() - fe.SetInputData(poly) + fe.SetInputData(self) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOff() @@ -1022,12 +1021,14 @@ def cap(self, return_cap=False): polyapp.AddInputData(poly) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() - out = self._update(polyapp.GetOutput()).clean() - out.pipeline = OperationNode( - "capped", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.DeepCopy(polyapp.GetOutput()) + self.clean() + + self.pipeline = OperationNode( + "capped", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def join(self, polys=True, reset=False): """ @@ -1071,7 +1072,7 @@ def join(self, polys=True, reset=False): sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) - sf.SetInputData(self.polydata(False)) + sf.SetInputData(self) sf.Update() if reset: poly = sf.GetOutput() @@ -1085,13 +1086,15 @@ def join(self, polys=True, reset=False): poly = cpd.GetOutput() vpts = poly.GetCell(0).GetPoints().GetData() poly.GetPoints().SetData(vpts) - return self._update(poly) + else: + poly = sf.GetOutput() + + self.DeepCopy(poly) - out = self._update(sf.GetOutput()) - out.pipeline = OperationNode( - "join", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.pipeline = OperationNode( + "join", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def join_segments(self, closed=True, tol=1e-03): """ @@ -1153,8 +1156,8 @@ def join_segments(self, closed=True, tol=1e-03): if len(joinedpts) > 1: newline = vedo.shapes.Line(joinedpts, closed=closed) newline.clean() - newline.SetProperty(self.GetProperty()) - newline.property = self.GetProperty() + newline.actor.SetProperty(self.property) + newline.property = self.property newline.pipeline = OperationNode( "join_segments", parents=[self], @@ -1205,13 +1208,13 @@ def triangulate(self, verts=True, lines=True): if True, break input polylines into line segments. If False, input lines will be ignored and the output will have no lines. """ - if self._data.GetNumberOfPolys() or self._data.GetNumberOfStrips(): + if self.GetNumberOfPolys() or self.GetNumberOfStrips(): # print("vtkTriangleFilter") tf = vtk.vtkTriangleFilter() tf.SetPassLines(lines) tf.SetPassVerts(verts) - elif self._data.GetNumberOfLines(): + elif self.GetNumberOfLines(): # print("vtkContourTriangulator") tf = vtk.vtkContourTriangulator() tf.TriangulationErrorDisplayOn() @@ -1220,40 +1223,42 @@ def triangulate(self, verts=True, lines=True): vedo.logger.debug("input in triangulate() seems to be void! Skip.") return self - tf.SetInputData(self._data) + tf.SetInputData(self) tf.Update() - out = self._update(tf.GetOutput()).lw(0).lighting("default") - out.PickableOn() + self.DeepCopy(tf.GetOutput()) + self.lw(0).lighting("default").pickable() - out.pipeline = OperationNode( - "triangulate", parents=[self], comment=f"#cells {out.inputdata().GetNumberOfCells()}" + self.pipeline = OperationNode( + "triangulate", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" ) - return out + return self def compute_cell_area(self, name="Area"): """Add to this mesh a cell data array containing the areas of the polygonal faces""" csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self.polydata(False)) + csf.SetInputData(self) csf.SetComputeArea(True) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(False) csf.SetAreaArrayName(name) csf.Update() - return self._update(csf.GetOutput()) + self.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) + return self def compute_cell_vertex_count(self, name="VertexCount"): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self.polydata(False)) + csf.SetInputData(self) csf.SetComputeArea(False) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(True) csf.SetVertexCountArrayName(name) csf.Update() - return self._update(csf.GetOutput()) + self.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) + return self def compute_quality(self, metric=6): """ @@ -1302,12 +1307,11 @@ def compute_quality(self, metric=6): ![](https://vedo.embl.es/images/advanced/meshquality.png) """ qf = vtk.vtkMeshQuality() - qf.SetInputData(self.polydata(False)) + qf.SetInputData(self) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() - pd = qf.GetOutput() - self._update(pd) + self.DeepCopy(qf.GetOutput()) self.pipeline = OperationNode("compute_quality", parents=[self]) return self @@ -1330,7 +1334,7 @@ def check_validity(self, tol=0): vald = vtk.vtkCellValidator() if tol: vald.SetTolerance(tol) - vald.SetInputData(self._data) + vald.SetInputData(self) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return vtk2numpy(varr) @@ -1353,10 +1357,10 @@ def compute_curvature(self, method=0): ![](https://user-images.githubusercontent.com/32848391/51934810-c2e88c00-2404-11e9-8e7e-ca0b7984bbb7.png) """ curve = vtk.vtkCurvatures() - curve.SetInputData(self._data) + curve.SetInputData(self) curve.SetCurvatureType(method) curve.Update() - self._update(curve.GetOutput()) + self.DeepCopy(curve.GetOutput()) self.mapper.ScalarVisibilityOn() return self @@ -1381,12 +1385,12 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ ef = vtk.vtkElevationFilter() - ef.SetInputData(self.polydata()) + ef.SetInputData(self) ef.SetLowPoint(low) ef.SetHighPoint(high) ef.SetScalarRange(vrange) ef.Update() - self._update(ef.GetOutput()) + self.DeepCopy(ef.GetOutput()) self.mapper.ScalarVisibilityOn() return self @@ -1403,7 +1407,7 @@ def subdivide(self, n=1, method=0, mel=None): Maximum Edge Length (applicable to Adaptive method only). """ triangles = vtk.vtkTriangleFilter() - triangles.SetInputData(self._data) + triangles.SetInputData(self) triangles.Update() originalMesh = triangles.GetOutput() if method == 0: @@ -1413,7 +1417,7 @@ def subdivide(self, n=1, method=0, mel=None): elif method == 2: sdf = vtk.vtkAdaptiveSubdivisionFilter() if mel is None: - mel = self.diagonal_size() / np.sqrt(self._data.GetNumberOfPoints()) / n + mel = self.diagonal_size() / np.sqrt(self.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: sdf = vtk.vtkButterflySubdivisionFilter() @@ -1428,12 +1432,13 @@ def subdivide(self, n=1, method=0, mel=None): sdf.SetInputData(originalMesh) sdf.Update() - out = sdf.GetOutput() + + self.DeepCopy(sdf.GetOutput()) self.pipeline = OperationNode( "subdivide", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" ) - return self._update(out) + return self def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): """ @@ -1454,7 +1459,7 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): .. note:: Setting `fraction=0.1` leaves 10% of the original number of vertices """ - poly = self._data + poly = self if n: # N = desired number of points npt = poly.GetNumberOfPoints() fraction = n / npt @@ -1475,12 +1480,13 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): decimate.SetInputData(poly) decimate.SetTargetReduction(1 - fraction) decimate.Update() - out = decimate.GetOutput() + + self.DeepCopy(decimate.GetOutput()) self.pipeline = OperationNode( "decimate", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" ) - return self._update(out) + return self def collapse_edges(self, distance, iterations=1): """Collapse mesh edges so that are all above distance.""" @@ -1512,7 +1518,7 @@ def collapse_edges(self, distance, iterations=1): self.compute_normals() self.pipeline = OperationNode( - "collapse_edges", parents=[self], comment=f"#pts {self._data.GetNumberOfPoints()}" + "collapse_edges", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -1537,7 +1543,7 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ - poly = self._data + poly = self cl = vtk.vtkCleanPolyData() cl.SetInputData(poly) cl.Update() @@ -1552,12 +1558,13 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound smf.FeatureEdgeSmoothingOn() smf.SetBoundarySmoothing(boundary) smf.Update() - out = self._update(smf.GetOutput()) - out.pipeline = OperationNode( - "smooth", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.DeepCopy(smf.GetOutput()) + + self.pipeline = OperationNode( + "smooth", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def fill_holes(self, size=None): @@ -1578,18 +1585,19 @@ def fill_holes(self, size=None): mb = self.diagonal_size() size = mb / 10 fh.SetHoleSize(size) - fh.SetInputData(self._data) + fh.SetInputData(self) fh.Update() - out = self._update(fh.GetOutput()) + + self.DeepCopy(fh.GetOutput()) - out.pipeline = OperationNode( - "fill_holes", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.pipeline = OperationNode( + "fill_holes", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def is_inside(self, point, tol=1e-05): """Return True if point is inside a polydata closed surface.""" - poly = self.polydata() + poly = self points = vtk.vtkPoints() points.InsertNextPoint(point) pointsPolydata = vtk.vtkPolyData() @@ -1618,7 +1626,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): ![](https://vedo.embl.es/images/basic/pca.png) """ if isinstance(pts, Points): - pointsPolydata = pts.polydata() + pointsPolydata = pts ptsa = pts.points() else: ptsa = np.asarray(pts) @@ -1631,7 +1639,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): # sep = vtk.vtkExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(pointsPolydata) - sep.SetSurfaceData(self.polydata()) + sep.SetSurfaceData(self) sep.SetInsideOut(invert) sep.Update() @@ -1704,7 +1712,7 @@ def boundaries( if return_point_ids or return_cell_ids: idf = vtk.vtkIdFilter() - idf.SetInputData(self.polydata()) + idf.SetInputData(self) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) idf.Update() @@ -1736,7 +1744,7 @@ def boundaries( else: - fe.SetInputData(self.polydata()) + fe.SetInputData(self) fe.Update() msh = Mesh(fe.GetOutput(), c="p").lw(5).lighting("off") @@ -1771,7 +1779,7 @@ def imprint(self, loopline, tol=0.01): ![](https://vedo.embl.es/images/feats/imprint.png) """ loop = vtk.vtkContourLoopExtraction() - loop.SetInputData(loopline.polydata()) + loop.SetInputData(loopline) loop.Update() clean_loop = vtk.vtkCleanPolyData() @@ -1779,18 +1787,19 @@ def imprint(self, loopline, tol=0.01): clean_loop.Update() imp = vtk.vtkImprintFilter() - imp.SetTargetData(self.polydata()) + imp.SetTargetData(self) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) imp.BoundaryEdgeInsertionOn() imp.TriangulateOutputOn() imp.Update() - out = self._update(imp.GetOutput()) - out.pipeline = OperationNode( - "imprint", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.DeepCopy(imp.GetOutput()) + + self.pipeline = OperationNode( + "imprint", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def connected_vertices(self, index): """Find all vertices connected to an input vertex specified by its index. @@ -1800,7 +1809,7 @@ def connected_vertices(self, index): ![](https://vedo.embl.es/images/basic/connVtx.png) """ - poly = self._data + poly = self cell_idlist = vtk.vtkIdList() poly.GetPointCells(index, cell_idlist) @@ -1823,7 +1832,7 @@ def connected_cells(self, index, return_ids=False): """Find all cellls connected to an input vertex specified by its index.""" # Find all cells connected to point index - dpoly = self._data + dpoly = self idlist = vtk.vtkIdList() dpoly.GetPointCells(index, idlist) @@ -1875,7 +1884,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): ![](https://vedo.embl.es/images/basic/silhouette1.png) """ sil = vtk.vtkPolyDataSilhouette() - sil.SetInputData(self.polydata()) + sil.SetInputData(self) sil.SetBorderEdges(border_edges) if feature_angle is False: sil.SetEnableFeatureAngle(0) @@ -1959,7 +1968,7 @@ def isobands(self, n=10, vmin=None, vmax=None): Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) """ - r0, r1 = self._data.GetScalarRange() + r0, r1 = self.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: @@ -1987,7 +1996,7 @@ def isobands(self, n=10, vmin=None, vmax=None): lut.SetAnnotation(i, values.GetValue(i).ToString()) bcf = vtk.vtkBandedPolyDataContourFilter() - bcf.SetInputData(self.polydata()) + bcf.SetInputData(self) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): bcf.SetValue(i, band[2]) @@ -2020,8 +2029,8 @@ def isolines(self, n=10, vmin=None, vmax=None): ![](https://vedo.embl.es/images/pyplot/isolines.png) """ bcf = vtk.vtkContourFilter() - bcf.SetInputData(self.polydata()) - r0, r1 = self._data.GetScalarRange() + bcf.SetInputData(self) + r0, r1 = self.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: @@ -2070,7 +2079,7 @@ def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): """ if is_sequence(zshift): # ms = [] # todo - # poly0 = self.clone().polydata() + # poly0 = self.clone() # for i in range(len(zshift)-1): # rf = vtk.vtkRotationalExtrusionFilter() # rf.SetInputData(poly0) @@ -2085,7 +2094,7 @@ def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): rf = vtk.vtkRotationalExtrusionFilter() # rf = vtk.vtkLinearExtrusionFilter() - rf.SetInputData(self.polydata(False)) # must not be transformed + rf.SetInputData(self) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) rf.SetAngle(rotation) @@ -2131,7 +2140,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T ![](https://vedo.embl.es/images/advanced/splitmesh.png) """ - pd = self.polydata(False) + pd = self if must_share_edge: if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") @@ -2152,7 +2161,8 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T if flag: self.pipeline = OperationNode("split mesh", parents=[self]) - return self._update(out) + self.DeepCopy(out) + return self a = Mesh(out) if must_share_edge: @@ -2201,7 +2211,7 @@ def extract_largest_region(self): conn = vtk.vtkPolyDataConnectivityFilter() conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() - conn.SetInputData(self._data) + conn.SetInputData(self) conn.Update() m = Mesh(conn.GetOutput()) pr = vtk.vtkProperty() @@ -2241,8 +2251,8 @@ def boolean(self, operation, mesh2, method=0, tol=None): else: raise ValueError(f"Unknown method={method}") - poly1 = self.compute_normals().polydata() - poly2 = mesh2.compute_normals().polydata() + poly1 = self.compute_normals() + poly2 = mesh2.compute_normals() if operation.lower() in ("plus", "+"): bf.SetOperationToUnion() @@ -2281,8 +2291,8 @@ def intersect_with(self, mesh2, tol=1e-06): """ bf = vtk.vtkIntersectionPolyDataFilter() bf.SetGlobalWarningDisplay(0) - poly1 = self.polydata() - poly2 = mesh2.polydata() + poly1 = self + poly2 = mesh2 bf.SetTolerance(tol) bf.SetInputData(0, poly1) bf.SetInputData(1, poly2) @@ -2319,7 +2329,7 @@ def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): if not self.line_locator: self.line_locator = vtk.vtkOBBTree() - self.line_locator.SetDataSet(self.polydata()) + self.line_locator.SetDataSet(self) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 self.line_locator.SetTolerance(tol) @@ -2363,7 +2373,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): plane.SetNormal(normal) cutter = vtk.vtkPolyDataPlaneCutter() - cutter.SetInputData(self.polydata()) + cutter.SetInputData(self) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() cutter.ComputeNormalsOff() @@ -2392,7 +2402,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): # n : (int) # number of cuts # """ - # poly = self.polydata() + # poly = self # planes = vtk.vtkPlanes() # planes.SetOrigin(numpy2vtk(origins)) @@ -2428,8 +2438,8 @@ def collide_with(self, mesh2, tol=0, return_bool=False): # ipdf.SetBoxTolerance(tol) ipdf.SetCellTolerance(tol) - ipdf.SetInputData(0, self.polydata()) - ipdf.SetInputData(1, mesh2.polydata()) + ipdf.SetInputData(0, self) + ipdf.SetInputData(1, mesh2) ipdf.SetTransform(0, transform0) ipdf.SetTransform(1, transform1) if return_bool: @@ -2480,7 +2490,7 @@ def geodesic(self, start, end): end = pa.closest_point(end, return_point_id=True) dijkstra = vtk.vtkDijkstraGraphGeodesicPath() - dijkstra.SetInputData(self.polydata()) + dijkstra.SetInputData(self) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) dijkstra.Update() @@ -2545,7 +2555,7 @@ def binarize( ![](https://vedo.embl.es/images/volumetric/mesh2volume.png) """ # https://vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataToImageData - pd = self.polydata() + pd = self whiteImage = vtk.vtkImageData() if direction_matrix: @@ -2635,7 +2645,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu img.AllocateScalars(vtk.VTK_FLOAT, 1) imp = vtk.vtkImplicitPolyDataDistance() - imp.SetInput(self.polydata()) + imp.SetInput(self) b2 = bounds[2] b4 = bounds[4] d0, d1, d2 = dims diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3b662fe8..ad9e7c29 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -55,19 +55,14 @@ def merge(*meshs, flag=False): - [value_iteration.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/value_iteration.py) """ - acts = [a for a in utils.flatten(meshs) if a] + objs = [a for a in utils.flatten(meshs) if a] - if not acts: + if not objs: return None idarr = [] polyapp = vtk.vtkAppendPolyData() - for i, a in enumerate(acts): - try: - poly = a.polydata() - except AttributeError: - # so a vtkPolydata can also be passed - poly = a + for i, poly in enumerate(objs): polyapp.AddInputData(poly) if flag: idarr += [i] * poly.GetNumberOfPoints() @@ -78,19 +73,20 @@ def merge(*meshs, flag=False): varr = utils.numpy2vtk(idarr, dtype=np.uint16, name="OriginalMeshID") mpoly.GetPointData().AddArray(varr) - if isinstance(acts[0], vedo.Mesh): + if isinstance(objs[0], vedo.Mesh): msh = vedo.Mesh(mpoly) else: msh = Points(mpoly) - if isinstance(acts[0], vtk.vtkActor): + if isinstance(objs[0], vtk.vtkActor): cprp = vtk.vtkProperty() - cprp.DeepCopy(acts[0].GetProperty()) - msh.SetProperty(cprp) + cprp.DeepCopy(objs[0].GetProperty()) + msh.actor.SetProperty(cprp) msh.property = cprp msh.pipeline = utils.OperationNode( - "merge", parents=acts, + "merge", + parents=objs, comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", ) return msh @@ -134,7 +130,7 @@ def visible_points(mesh, area=(), tol=None, invert=False): """ # specify a rectangular region svp = vtk.vtkSelectVisiblePoints() - svp.SetInputData(mesh.polydata()) + svp.SetInputData(mesh) svp.SetRenderer(vedo.plotter_instance.renderer) if len(area) == 4: @@ -186,13 +182,12 @@ def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0 plist = np.ascontiguousarray(plist) plist = utils.make3d(plist) - ############################################# + ######################################################### if mode == "scipy": from scipy.spatial import Delaunay as scipy_delaunay - tri = scipy_delaunay(plist[:, 0:2]) return vedo.mesh.Mesh([plist, tri.simplices]) - ############################################# + ########################################################## pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() @@ -302,7 +297,7 @@ def voronoi(pts, padding=0.0, fit=False, method="vtk"): elif method == "vtk": vor = vtk.vtkVoronoi2D() if isinstance(pts, Points): - vor.SetInputData(pts.polydata()) + vor.SetInputData(pts) else: pts = np.asarray(pts) if pts.shape[1] == 2: @@ -759,6 +754,7 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() self.transform = LinearTransform() + self.actor.data = self # self.name = "Points" # better not to give it a name here if blur: @@ -943,14 +939,7 @@ def _repr_html_(self): return "\n".join(allt) - ################################################################################## - def _update(self, polydata): - # Overwrite the polygonal mesh with a new vtkPolyData - # self = polydata - # self.mapper.SetInputData(polydata) - # self.mapper.Modified() - return self - + ################################################################################## def __add__(self, meshs): if isinstance(meshs, list): alist = [self] @@ -966,8 +955,10 @@ def __add__(self, meshs): return vedo.assembly.Assembly([self, meshs]) + def polydata(self, transformed=True): """Obsolete.""" + print("WARNING: method polydata() is obsolete, you can remove it from your code.") return self def clone(self, deep=True): @@ -996,30 +987,32 @@ def clone(self, deep=True): pr = vtk.vtkProperty() pr.DeepCopy(self.property) - cloned.SetProperty(pr) + cloned.actor.SetProperty(pr) cloned.property = pr - if self.GetBackfaceProperty(): + if self.actor.GetBackfaceProperty(): bfpr = vtk.vtkProperty() bfpr.DeepCopy(self.GetBackfaceProperty()) - cloned.SetBackfaceProperty(bfpr) - - if self.transform: - # already has a so use that - try: - cloned.SetUserTransform(self.transform) - except TypeError: # transform which can be non linear - cloned.SetOrigin(self.GetOrigin()) - cloned.SetScale(self.GetScale()) - cloned.SetOrientation(self.GetOrientation()) - cloned.SetPosition(self.GetPosition()) + cloned.actor.SetBackfaceProperty(bfpr) + + cloned.transform = self.transform + + # if self.transform: + # # already has a so use that + # try: + # cloned.SetUserTransform(self.transform) + # except TypeError: # transform which can be non linear + # cloned.SetOrigin(self.GetOrigin()) + # cloned.SetScale(self.GetScale()) + # cloned.SetOrientation(self.GetOrientation()) + # cloned.SetPosition(self.GetPosition()) - else: - # assign the same transformation to the copy - cloned.SetOrigin(self.GetOrigin()) - cloned.SetScale(self.GetScale()) - cloned.SetOrientation(self.GetOrientation()) - cloned.SetPosition(self.GetPosition()) + # else: + # # assign the same transformation to the copy + # cloned.SetOrigin(self.GetOrigin()) + # cloned.SetScale(self.GetScale()) + # cloned.SetOrientation(self.GetOrientation()) + # cloned.SetPosition(self.GetPosition()) mp = cloned.mapper sm = self.mapper @@ -1033,8 +1026,8 @@ def clone(self, deep=True): if lut: mp.SetLookupTable(lut) - if self.GetTexture(): - cloned.texture(self.GetTexture()) + if self.actor.GetTexture(): + cloned.texture(self.actor.GetTexture()) cloned.actor.SetPickable(self.actor.GetPickable()) @@ -1101,7 +1094,7 @@ def clone2d( scale = 350 / msiz cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale).polydata() + poly = cmsh.pos(0, 0, 0).scale(scale) mapper3d = self.mapper cm = mapper3d.GetColorMode() @@ -1195,7 +1188,7 @@ def update_trail(self): self.trail_points.pop(0) data = np.array(self.trail_points) - currentpos + self.trail_offset - tpoly = self.trail.polydata(False) + tpoly = self.trail tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) self.trail.SetPosition(currentpos) return self @@ -1290,7 +1283,7 @@ def update_shadows(self): point = sha.info['point'] direction = sha.info['direction'] new_sha = self._compute_shadow(plane, point, direction) - sha._update(new_sha) + sha.DeepCopy(new_sha) return self @@ -1337,7 +1330,7 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): invert : (bool) flip all normals """ - poly = self.polydata() + poly = self pcan = vtk.vtkPCANormalEstimation() pcan.SetInputData(poly) pcan.SetSampleSize(n) @@ -1421,8 +1414,8 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): """ if pcloud.inputdata().GetNumberOfPolys(): - poly1 = self.polydata() - poly2 = pcloud.polydata() + poly1 = self + poly2 = pcloud df = vtk.vtkDistancePolyDataFilter() df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) @@ -1440,7 +1433,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): if not pcloud.point_locator: pcloud.point_locator = vtk.vtkPointLocator() - pcloud.point_locator.SetDataSet(pcloud.polydata()) + pcloud.point_locator.SetDataSet(pcloud) pcloud.point_locator.BuildLocator() ids = [] @@ -1551,13 +1544,12 @@ def clean(self): cpd.ConvertStripsToPolysOn() cpd.SetInputData(self.inputdata()) cpd.Update() - out = self._update(cpd.GetOutput()) - - out.pipeline = utils.OperationNode( + self.DeepCopy(cpd.GetOutput()) + self.pipeline = utils.OperationNode( "clean", parents=[self], - comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + comment=f"#pts {self.inputdata().GetNumberOfPoints()}" ) - return out + return self def subsample(self, fraction, absolute=False): """ @@ -1600,12 +1592,13 @@ def subsample(self, fraction, absolute=False): if self.property.GetRepresentation() == 0: ps = self.property.GetPointSize() - out = self._update(cpd.GetOutput()).ps(ps) + self.DeepCopy(cpd.GetOutput()) + self.ps(ps) - out.pipeline = utils.OperationNode( - "subsample", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" + self.pipeline = utils.OperationNode( + "subsample", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - return out + return self def threshold(self, scalars, above=None, below=None, on="points"): """ @@ -1657,9 +1650,9 @@ def threshold(self, scalars, above=None, below=None, on="points"): gf = vtk.vtkGeometryFilter() gf.SetInputData(thres.GetOutput()) gf.Update() - out = self._update(gf.GetOutput()) - out.pipeline = utils.OperationNode("threshold", parents=[self]) - return out + self.DeepCopy(gf.GetOutput()) + self.pipeline = utils.OperationNode("threshold", parents=[self]) + return self def quantize(self, value): """ @@ -1671,9 +1664,10 @@ def quantize(self, value): qp.SetInputData(poly) qp.SetQFactor(value) qp.Update() - out = self._update(qp.GetOutput()).flat() - out.pipeline = utils.OperationNode("quantize", parents=[self]) - return out + self.DeepCopy(qp.GetOutput()) + self.flat() + self.pipeline = utils.OperationNode("quantize", parents=[self]) + return self def average_size(self): """ @@ -1690,14 +1684,14 @@ def average_size(self): def center_of_mass(self): """Get the center of mass of mesh.""" cmf = vtk.vtkCenterOfMass() - cmf.SetInputData(self.polydata()) + cmf.SetInputData(self) cmf.Update() c = cmf.GetCenter() return np.array(c) def normal_at(self, i): """Return the normal vector at vertex point `i`.""" - normals = self.polydata().GetPointData().GetNormals() + normals = self.GetPointData().GetNormals() return np.array(normals.GetTuple(i)) def normals(self, cells=False, recompute=True): @@ -1712,16 +1706,16 @@ def normals(self, cells=False, recompute=True): Note that this might modify the number of mesh points. """ if cells: - vtknormals = self.polydata().GetCellData().GetNormals() + vtknormals = self.GetCellData().GetNormals() else: - vtknormals = self.polydata().GetPointData().GetNormals() + vtknormals = self.GetPointData().GetNormals() if not vtknormals and recompute: try: self.compute_normals(cells=cells) if cells: - vtknormals = self.polydata().GetCellData().GetNormals() + vtknormals = self.GetCellData().GetNormals() else: - vtknormals = self.polydata().GetPointData().GetNormals() + vtknormals = self.GetPointData().GetNormals() except AttributeError: # can be that 'Points' object has no attribute 'compute_normals' pass @@ -1920,9 +1914,9 @@ def labels( lpoly = vtk.vtkPolyData() ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) - ids.GetProperty().LightingOff() - ids.PickableOff() - ids.SetUseBounds(False) + ids.property.LightingOff() + ids.actor.PickableOff() + ids.actor.SetUseBounds(False) return ids def labels2d( @@ -1986,10 +1980,10 @@ def labels2d( return None cellcloud = Points(self.cell_centers()) arr = self.inputdata().GetCellData().GetScalars() - poly = cellcloud.polydata(False) + poly = cellcloud poly.GetPointData().SetScalars(arr) else: - poly = self.polydata() + poly = self if content != "id" and content not in self.pointdata.keys(): vedo.logger.error(f"In labels2d: point array {content} does not exist.") return None @@ -2422,8 +2416,8 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F ![](https://vedo.embl.es/images/basic/align2.png) """ icp = vtk.vtkIterativeClosestPointTransform() - icp.SetSource(self.polydata()) - icp.SetTarget(target.polydata()) + icp.SetSource(self) + icp.SetTarget(target) if invert: icp.Inverse() icp.SetMaximumNumberOfIterations(iters) @@ -2432,16 +2426,8 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F icp.SetStartByMatchingCentroids(use_centroids) icp.Update() - M = icp.GetMatrix() - if invert: - M.Invert() # icp.GetInverse() doesnt work! - # self.apply_transform(M) - self.SetUserMatrix(M) - - self.transform = self.GetUserTransform() - self.point_locator = None - self.cell_locator = None - self.line_locator = None + T = LinearTransform(icp.GetMatrix()) + self.apply_transform(T) self.pipeline = utils.OperationNode( "align_to", parents=[self, target], comment=f"rigid = {rigid}" @@ -2470,7 +2456,7 @@ def transform_with_landmarks( for p in source_landmarks: ss.InsertNextPoint(p) else: - ss = source_landmarks.polydata().GetPoints() + ss = source_landmarks.GetPoints() if least_squares: source_landmarks = source_landmarks.points() @@ -2479,7 +2465,7 @@ def transform_with_landmarks( for p in target_landmarks: st.InsertNextPoint(p) else: - st = target_landmarks.polydata().GetPoints() + st = target_landmarks.GetPoints() if least_squares: target_landmarks = target_landmarks.points() @@ -2493,6 +2479,7 @@ def transform_with_landmarks( lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) lmt.SetModeToSimilarity() + if rigid: lmt.SetModeToRigidBody() lmt.Update() @@ -2515,9 +2502,7 @@ def transform_with_landmarks( lmt.Translate(cmt) lmt.Concatenate(M) lmt.Translate(-cms) - self.apply_transform(lmt, concatenate=True) - else: - self.SetUserTransform(lmt) + self.apply_transform(lmt) self.transform = lmt self.point_locator = None @@ -2527,24 +2512,9 @@ def transform_with_landmarks( return self - def apply_transform(self, T, reset=False, concatenate=False): - """Obsolete, use `self.transform` instead.""" + def apply_transform(self, T): # """ # Apply a linear or non-linear transformation to the mesh polygonal data. - - # Arguments: - # T : (matrix) - # `vtkTransform`, `vtkMatrix4x4` or a 4x4 or 3x3 python or numpy matrix. - # reset : (bool) - # if True reset the current transformation matrix - # to identity after having moved the object, otherwise the internal - # matrix will stay the same (to only affect visualization). - # It the input transformation has no internal defined matrix (ie. non linear) - # then reset will be assumed as True. - # concatenate : (bool) - # concatenate the transformation with the current existing one - - # Example: # ```python # from vedo import Cube, show # c1 = Cube().rotate_z(5).x(2).y(1) @@ -2559,63 +2529,6 @@ def apply_transform(self, T, reset=False, concatenate=False): # ``` # ![](https://vedo.embl.es/images/feats/apply_transform.png) # """ - # self.point_locator = None - # self.cell_locator = None - # self.line_locator = None - - # if isinstance(T, vtk.vtkMatrix4x4): - # tr = vtk.vtkTransform() - # tr.SetMatrix(T) - # T = tr - - # elif utils.is_sequence(T): - # M = vtk.vtkMatrix4x4() - # n = len(T[0]) - # for i in range(n): - # for j in range(n): - # M.SetElement(i, j, T[i][j]) - # tr = vtk.vtkTransform() - # tr.SetMatrix(M) - # T = tr - - # if reset or not hasattr(T, "GetScale"): # might be non-linear - - # tf = vtk.vtkTransformPolyDataFilter() - # tf.SetTransform(T) - # tf.SetInputData(self.polydata()) - # tf.Update() - - # I = vtk.vtkMatrix4x4() - # self.PokeMatrix(I) # reset to identity - # self.SetUserTransform(None) - - # self._update(tf.GetOutput()) ### UPDATE - # self.transform = T - - # else: - - # if concatenate: - - # M = vtk.vtkTransform() - # M.PostMultiply() - # M.SetMatrix(self.GetMatrix()) - - # M.Concatenate(T) - - # self.SetScale(M.GetScale()) - # self.SetOrientation(M.GetOrientation()) - # self.SetPosition(M.GetPosition()) - # self.transform = M - # self.SetUserTransform(None) - - # else: - - # self.SetScale(T.GetScale()) - # self.SetOrientation(T.GetOrientation()) - # self.SetPosition(T.GetPosition()) - # self.SetUserTransform(None) - - # self.transform = T self.transform = T return self._move() @@ -2628,19 +2541,6 @@ def normalize(self): pts = coords - cm xyz2 = np.sum(pts * pts, axis=0) scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) - # t = vtk.vtkTransform() - # t.PostMultiply() - # # t.Translate(-cm) - # t.Scale(scale, scale, scale) - # # t.Translate(cm) - # tf = vtk.vtkTransformPolyDataFilter() - # tf.SetInputData(self.inputdata()) - # tf.SetTransform(t) - # tf.Update() - # self.point_locator = None - # self.cell_locator = None - # self.line_locator = None - # return self._update(tf.GetOutput()) self.scale(scale).pos(cm) return self @@ -2674,12 +2574,16 @@ def mirror(self, axis="x", origin=None): rs.ReverseNormalsOn() rs.Update() outpoly = rs.GetOutput() + self.DeepCopy(outpoly) + self.point_locator = None + self.cell_locator = None + self.line_locator = None + self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) return self - def flip_normals(self): """Flip all mesh normals. Same as `mesh.mirror('n')`.""" rs = vtk.vtkReverseSense() @@ -2687,9 +2591,9 @@ def flip_normals(self): rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() - out = self._update(rs.GetOutput()) + self.DeepCopy(rs.GetOutput()) self.pipeline = utils.OperationNode("flip_normals", parents=[self]) - return out + return self ##################################################################################### def cmap( @@ -3030,10 +2934,10 @@ def interpolate_data_from( raise RuntimeError if on == "points": - points = source.polydata() + points = source elif on == "cells": poly2 = vtk.vtkPolyData() - poly2.ShallowCopy(source.polydata()) + poly2.ShallowCopy(source) c2p = vtk.vtkCellDataToPointData() c2p.SetInputData(poly2) c2p.Update() @@ -3068,7 +2972,7 @@ def interpolate_data_from( kern.SetKernelFootprintToRadius() interpolator = vtk.vtkPointInterpolator() - interpolator.SetInputData(self.polydata()) + interpolator.SetInputData(self) interpolator.SetSourceData(points) interpolator.SetKernel(kern) interpolator.SetLocator(locator) @@ -3088,24 +2992,12 @@ def interpolate_data_from( else: cpoly = interpolator.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + self.DeepCopy(cpoly) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self + def add_gaussian_noise(self, sigma=1.0): """ Add gaussian noise to point positions. @@ -3129,8 +3021,8 @@ def add_gaussian_noise(self, sigma=1.0): vpts = vtk.vtkPoints() vpts.SetNumberOfPoints(n) vpts.SetData(utils.numpy2vtk(pts + ns, dtype=np.float32)) - self.inputdata().SetPoints(vpts) - self.inputdata().GetPoints().Modified() + self.SetPoints(vpts) + self.GetPoints().Modified() self.pointdata["GaussianNoise"] = -ns self.pipeline = utils.OperationNode( "gaussian_noise", parents=[self], shape="egg", comment=f"sigma = {sigma}" @@ -3166,7 +3058,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell if ((n > 1 or radius) or (n == 1 and return_point_id)) and not return_cell_id: poly = None if not self.point_locator: - poly = self.polydata() + poly = self self.point_locator = vtk.vtkStaticPointLocator() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() @@ -3189,7 +3081,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell ######## if not poly: - poly = self.polydata() + poly = self trgp = [] for i in range(vtklist.GetNumberOfIds()): trgp_ = [0, 0, 0] @@ -3203,7 +3095,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell else: if not self.cell_locator: - poly = self.polydata() + poly = self # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 @@ -3258,8 +3150,8 @@ def hausdorff_distance(self, points): ![](https://vedo.embl.es/images/feats/heart.png) """ hp = vtk.vtkHausdorffDistancePointSetFilter() - hp.SetInputData(0, self.polydata()) - hp.SetInputData(1, points.polydata()) + hp.SetInputData(0, self) + hp.SetInputData(1, points) hp.SetTargetDistanceMethodToPointToCell() hp.Update() return hp.GetHausdorffDistance() @@ -3271,11 +3163,11 @@ def chamfer_distance(self, pcloud): """ if not pcloud.point_locator: pcloud.point_locator = vtk.vtkPointLocator() - pcloud.point_locator.SetDataSet(pcloud.polydata()) + pcloud.point_locator.SetDataSet(pcloud) pcloud.point_locator.BuildLocator() if not self.point_locator: self.point_locator = vtk.vtkPointLocator() - self.point_locator.SetDataSet(self.polydata()) + self.point_locator.SetDataSet(self) self.point_locator.BuildLocator() ps1 = self.points() @@ -3296,6 +3188,7 @@ def chamfer_distance(self, pcloud): db = np.mean(np.linalg.norm(deltav, axis=1)) return (da + db) / 2 + def remove_outliers(self, radius, neighbors=5): """ Remove outliers from a cloud of points within the specified `radius` search. @@ -3313,7 +3206,7 @@ def remove_outliers(self, radius, neighbors=5): ![](https://vedo.embl.es/images/basic/clustering.png) """ removal = vtk.vtkRadiusOutlierRemoval() - removal.SetInputData(self.polydata()) + removal.SetInputData(self) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) removal.GenerateOutliersOff() @@ -3325,7 +3218,7 @@ def remove_outliers(self, radius, neighbors=5): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) - self._update(inputobj) + self.DeepCopy(inputobj) self.mapper.ScalarVisibilityOff() self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self @@ -3374,8 +3267,8 @@ def smooth_mls_1d(self, f=0.2, radius=None): vdata = utils.numpy2vtk(np.array(variances)) vdata.SetName("Variances") - self.inputdata().GetPointData().AddArray(vdata) - self.inputdata().GetPointData().Modified() + self.GetPointData().AddArray(vdata) + self.GetPointData().Modified() self.points(newline) self.pipeline = utils.OperationNode("smooth_mls_1d", parents=[self]) return self @@ -3700,7 +3593,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): plane.SetNormal(normal) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() @@ -3709,22 +3602,11 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): clipper.Update() cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) - + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_plane", parents=[self]) return self @@ -3752,7 +3634,7 @@ def cut_with_planes(self, origins, normals, invert=False): planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) # must be True clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) clipper.GenerateClippedOutputOff() @@ -3761,22 +3643,11 @@ def cut_with_planes(self, origins, normals, invert=False): clipper.Update() cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) - + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_planes", parents=[self]) return self @@ -3814,30 +3685,20 @@ def cut_with_box(self, bounds, invert=False): box.SetBounds(bounds) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() - cpoly = clipper.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_box", parents=[self]) return self @@ -3874,30 +3735,20 @@ def cut_with_line(self, points, invert=False, closed=True): pplane.SetPolyLine(polyline) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() - cpoly = clipper.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_line", parents=[self]) return self @@ -3947,7 +3798,7 @@ def cut_with_cookiecutter(self, lines): iline = list(range(len(lines))) + [0] poly = utils.buildPolyData(lines, lines=[iline]) else: - poly = lines.polydata() + poly = lines # if invert: # not working # rev = vtk.vtkReverseSense() @@ -3963,30 +3814,20 @@ def cut_with_cookiecutter(self, lines): boundaryPoly = build_loops.GetOutput() ccut = vtk.vtkCookieCutter() - ccut.SetInputData(self.polydata()) + ccut.SetInputData(self) ccut.SetLoopsData(boundaryPoly) ccut.SetPointInterpolationToMeshEdges() # ccut.SetPointInterpolationToLoopEdges() ccut.PassCellDataOn() # ccut.PassPointDataOn() ccut.Update() - cpoly = ccut.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + cpoly = ccut.GetOutput() + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_cookiecutter", parents=[self]) return self @@ -4032,30 +3873,20 @@ def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) cyl.SetRadius(r) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() - cpoly = clipper.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_cylinder", parents=[self]) return self @@ -4088,7 +3919,7 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): sph.SetRadius(r) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata(True)) # must be True + clipper.SetInputData(self) clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() @@ -4096,22 +3927,11 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() + self.DeepCopy(cpoly) - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) - + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_sphere", parents=[self]) return self @@ -4139,8 +3959,8 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ - polymesh = mesh.polydata() - poly = self.polydata() + polymesh = mesh + poly = self # Create an array to hold distance information signed_distances = vtk.vtkFloatArray() @@ -4171,6 +3991,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): clipper.SetValue(0.0) clipper.Update() cpoly = clipper.GetOutput() + if keep: kpoly = clipper.GetOutput(1) @@ -4178,21 +3999,12 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): if currentscals: cpoly.GetPointData().SetActiveScalars(currentscals) vis = self.mapper.GetScalarVisibility() + + self.DeepCopy(cpoly) - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pointdata.remove("SignedDistances") self.mapper.SetScalarVisibility(vis) @@ -4203,7 +4015,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): cutoff = vedo.Points(kpoly) cutoff.property = vtk.vtkProperty() cutoff.property.DeepCopy(self.property) - cutoff.SetProperty(cutoff.property) + cutoff.actor.SetProperty(cutoff.property) cutoff.c("k5").alpha(0.2) return vedo.Assembly([self, cutoff]) @@ -4233,7 +4045,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar """ if isinstance(points, Points): parents = [points] - vpts = points.polydata().GetPoints() + vpts = points.GetPoints() points = points.points() else: parents = [self] @@ -4247,7 +4059,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() clipper = vtk.vtkExtractPolyDataGeometry() - clipper.SetInputData(self.polydata()) + clipper.SetInputData(self) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) @@ -4256,7 +4068,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() - spol.SetInputData(self.polydata()) + spol.SetInputData(self) spol.Update() clipper = vtk.vtkClipPolyData() clipper.SetInputData(spol.GetOutput()) @@ -4265,21 +4077,11 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar clipper.Update() cpoly = clipper.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(clipper.GetOutput()) - tf.Update() - self._update(tf.GetOutput()) + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_pointloop", parents=parents) return self @@ -4316,8 +4118,13 @@ def cut_with_scalar(self, value, name="", invert=False): clipper.GenerateClippedOutputOff() clipper.SetInsideOut(not invert) clipper.Update() - self._update(clipper.GetOutput()) + cpoly = clipper.GetOutput() + + self.DeepCopy(cpoly) + self.point_locator = None + self.line_locator = None + self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_scalars", parents=[self]) return self @@ -4371,7 +4178,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No cu.SetBounds(bounds) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self.polydata()) + clipper.SetInputData(self) clipper.SetClipFunction(cu) clipper.InsideOutOn() clipper.GenerateClippedOutputOff() @@ -4380,20 +4187,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No clipper.Update() cpoly = clipper.GetOutput() - if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: - self._update(cpoly) - else: - # bring the underlying polydata to where _data is - M = vtk.vtkMatrix4x4() - M.DeepCopy(self.GetMatrix()) - M.Invert() - tr = vtk.vtkTransform() - tr.SetMatrix(M) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetTransform(tr) - tf.SetInputData(cpoly) - tf.Update() - self._update(tf.GetOutput()) + self.DeepCopy(cpoly) self.point_locator = None self.line_locator = None @@ -4413,7 +4207,7 @@ def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist= maxdist = self.diagonal_size() / 2 imp = vtk.vtkImplicitModeller() - imp.SetInputData(self.polydata()) + imp.SetInputData(self) imp.SetSampleDimensions(res) imp.SetMaximumDistance(maxdist) imp.SetModelBounds(bounds) @@ -4621,7 +4415,7 @@ def reconstruct_surface( z1 + (z1 - z0) * padding, ) - pd = self.polydata() + pd = self if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) @@ -4730,7 +4524,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html cpf = vtk.vtkConnectedPointsFilter() - cpf.SetInputData(self.polydata()) + cpf.SetInputData(self) cpf.SetRadius(radius) if mode == 0: # Extract all regions pass @@ -4761,7 +4555,8 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( cpf.SetNormalAngle(angle) cpf.Update() - return self._update(cpf.GetOutput()) + self.DeepCopy(cpf.GetOutput()) + return self def compute_camera_distance(self): """ @@ -4769,12 +4564,12 @@ def compute_camera_distance(self): A pointdata array is created with name 'DistanceToCamera'. """ if vedo.plotter_instance.renderer: - poly = self.polydata() + poly = self dc = vtk.vtkDistanceToCamera() dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() - return self._update(dc.GetOutput()) + self.DeepCopy(dc.GetOutput()) return self def density( @@ -4805,7 +4600,7 @@ def density( ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ pdf = vtk.vtkPointDensityFilter() - pdf.SetInputData(self.polydata()) + pdf.SetInputData(self) if not utils.is_sequence(dims): dims = [dims, dims, dims] @@ -4949,7 +4744,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu if maxradius is None: maxradius = self.diagonal_size() / 2 dist = vtk.vtkSignedDistance() - dist.SetInputData(self.polydata()) + dist.SetInputData(self) dist.SetRadius(maxradius) dist.SetBounds(bounds) dist.SetDimensions(dims) @@ -5005,7 +4800,7 @@ def tovolume( vedo.logger.error("please set either radius or n") raise RuntimeError - poly = self.polydata() + poly = self # Create a probe volume probe = vtk.vtkImageData() @@ -5078,7 +4873,7 @@ def generate_random_data(self): gen.GenerateCellScalarsOn() gen.Update() - m = self._update(gen.GetOutput()) + self.DeepCopy(gen.GetOutput()) - m.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) - return m + self.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) + return self diff --git a/vedo/shapes.py b/vedo/shapes.py index 3087b2a2..a9cfcb3e 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -730,7 +730,7 @@ def sweep(self, direction=(1, 0, 0), res=1): surface.SetPolys(polys) asurface = vedo.Mesh(surface) prop = vtk.vtkProperty() - prop.DeepCopy(self.GetProperty()) + prop.DeepCopy(self.property) asurface.SetProperty(prop) asurface.property = prop asurface.lighting("default") @@ -1029,8 +1029,8 @@ def __init__( Mesh.__init__(self, polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: - self.GetProperty().SetLineStipplePattern(0xF0F0) - self.GetProperty().SetLineStippleRepeatFactor(1) + self.property.SetLineStipplePattern(0xF0F0) + self.property.SetLineStippleRepeatFactor(1) self.name = "Lines" @@ -1345,7 +1345,7 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): self.actor.PickableOff() prop = vtk.vtkProperty() - prop.DeepCopy(msh.GetProperty()) + prop.DeepCopy(msh.property) self.actor.SetProperty(prop) self.property = prop self.property.LightingOff() @@ -2337,7 +2337,7 @@ class Triangle(Mesh): def __init__(self, p1, p2, p3, c="green7", alpha=1.0): """Create a triangle from 3 points in space.""" Mesh.__init__(self, [[p1, p2, p3], [[0, 1, 2]]], c, alpha) - self.GetProperty().LightingOff() + self.property.LightingOff() self.name = "Triangle" @@ -2360,7 +2360,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): if len(pos) == 2: pos = (pos[0], pos[1], 0) self.actor.SetPosition(pos) - self.GetProperty().LightingOff() + self.property.LightingOff() self.name = "Polygon " + str(nsides) @@ -2796,7 +2796,7 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): self.mapper().ScalarVisibilityOn() else: self.mapper().ScalarVisibilityOff() - self.GetProperty().SetColor(get_color(c)) + self.property.SetColor(get_color(c)) self.name = "Spheres" @@ -3829,7 +3829,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0): [10,1, 0],[10,11, 9]] Mesh.__init__(self, [pts, fcs], c, alpha) - self.RotateX(90) + self.rotate_x(90) self.scale(r).lighting("shiny") if len(pos) == 2: @@ -4912,15 +4912,15 @@ def VedoLogo(distance=0.0, c=None, bc="t", version=False, frame=True): font = "Comae" vlogo = Text3D("vэdo", font=font, s=1350, depth=0.2, c=c, hspacing=0.8) vlogo.scale([1, 0.95, 1]).x(-2525).pickable(False).bc(bc) - vlogo.GetProperty().LightingOn() + vlogo.property.LightingOn() vr, rul = None, None if version: vr = Text3D( vedo.__version__, font=font, s=165, depth=0.2, c=c, hspacing=1 ).scale([1, 0.7, 1]) - vr.RotateZ(90) - vr.pos(2450, 50, 80).bc(bc).pickable(False) + vr.rotate_z(90).pos(2450, 50, 80) + vr.bc(bc).pickable(False) elif frame: rul = vedo.RulerAxes( (-2600, 2110, 0, 1650, 0, 0), diff --git a/vedo/transformations.py b/vedo/transformations.py index e77d8843..2a88963c 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -39,6 +39,16 @@ def __init__(self, T=None): if T is None: T = vtk.vtkTransform() + elif isinstance(T, vtk.vtkMatrix4x4): + S = vtk.vtkTransform() + S.SetMatrix(T) + T = S + + elif isinstance(T, vtk.vtkLandmarkTransform): + S = vtk.vtkTransform() + S.SetMatrix(T.GetMatrix()) + T = S + elif _is_sequence(T): S = vtk.vtkTransform() M = vtk.vtkMatrix4x4() @@ -48,11 +58,12 @@ def __init__(self, T=None): M.SetElement(i, j, T[i][j]) S.SetMatrix(M) T = S - + self.T = T self.T.PostMultiply() self.inverse_flag = False + def __str__(self): return "Transformation Matrix 4x4:\n" + str(self.matrix) @@ -83,7 +94,7 @@ def apply_to(self, obj): obj.point_locator = None obj.cell_locator = None obj.line_locator = None - # obj.actor.SetOrigin(self.T.GetPosition()) + def reset(self): """Reset transformation.""" diff --git a/vedo/utils.py b/vedo/utils.py index 5be8ce1b..9ad2fe71 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1503,16 +1503,19 @@ def _print_data(poly, c): vedo.printc("no point or cell data is present.", c=c, bold=False) ################################ - def _printvtkactor(actor): + def _printvtkactor(objt): + poly = objt + actor = objt.actor + pro = objt.property if not actor.GetPickable(): return - mapper = actor.GetMapper() - if hasattr(actor, "polydata"): - poly = actor.polydata() - else: - poly = mapper.GetInput() + # mapper = actor.GetMapper() + # if hasattr(actor, "polydata"): + # poly = actor + # else: + # poly = mapper.GetInput() pro = actor.GetProperty() pos = actor.GetPosition() From 759840c47e07d3c44a497bffc5af73422c5eace1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 4 Oct 2023 21:25:58 +0200 Subject: [PATCH 007/251] first pass on basic examples --- examples/basic/closewindow.py | 2 +- examples/basic/manypoints.py | 21 ------ vedo/addons.py | 37 +++++----- vedo/base.py | 130 +++++++++++++++++----------------- vedo/mesh.py | 30 ++++---- vedo/plotter.py | 16 ++--- vedo/pointcloud.py | 41 ++++++----- vedo/shapes.py | 80 ++++++++++----------- vedo/utils.py | 18 ++--- 9 files changed, 172 insertions(+), 203 deletions(-) delete mode 100644 examples/basic/manypoints.py diff --git a/examples/basic/closewindow.py b/examples/basic/closewindow.py index 6faaccdb..91118883 100644 --- a/examples/basic/closewindow.py +++ b/examples/basic/closewindow.py @@ -28,7 +28,7 @@ ################################################################## # Can now create a brand new Plotter and show the old object in it plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) -plt2.show(plt1.actors[0].color('red')) +plt2.show(plt1.actors[0].data.color('red')) ################################################################## # Create a third new Plotter and then close the second diff --git a/examples/basic/manypoints.py b/examples/basic/manypoints.py deleted file mode 100644 index 4ad48743..00000000 --- a/examples/basic/manypoints.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Colorize a large cloud of 1M points by passing -colors and transparencies in the format (R,G,B,A)""" -import time -from vedo import * - -N = 1000000 - -pts = np.random.rand(N, 3) -RGB = pts * 255 -Alpha = pts[:, 2] * 255 -RGBA = np.c_[RGB, Alpha] # concatenate - -t0 = time.time() - -# passing c in format (R,G,B,A) is ~50x faster -pts = Points(pts, r=2, c=RGBA) - -t1 = time.time() -print("-> elapsed time:", t1-t0, "seconds for N:", N) - -show(pts, __doc__, axes=True).close() diff --git a/vedo/addons.py b/vedo/addons.py index 8f3b0c1f..9dbfdfee 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -897,7 +897,7 @@ def ScalarBar( return None lut = vtkscalars.GetLookupTable() if not lut: - lut = obj.mapper().GetLookupTable() + lut = obj.mapper.GetLookupTable() if not lut: return None @@ -1064,11 +1064,11 @@ def ScalarBar3D( """ if isinstance(obj, Points): - lut = obj.mapper().GetLookupTable() + lut = obj.mapper.GetLookupTable() if not lut or lut.GetTable().GetNumberOfTuples() == 0: # create the most similar to the default obj.cmap("jet_r") - lut = obj.mapper().GetLookupTable() + lut = obj.mapper.GetLookupTable() vmin, vmax = lut.GetRange() elif isinstance(obj, (Volume, TetMesh)): @@ -1707,7 +1707,7 @@ def add_to(self, plt): self.mesh._update(cpoly) out = self.clipper.GetClippedOutputPort() - self.remnant.mapper().SetInputConnection(out) + self.remnant.mapper.SetInputConnection(out) self.remnant.alpha(self._alpha).color((0.5, 0.5, 0.5)) self.remnant.lighting('off').wireframe() plt.add(self.remnant) @@ -2413,8 +2413,8 @@ def Ruler( acts = [lb, lc1, lc2, c1, c2, ml1, ml2] macts = merge(acts).pos(p1).c(c).alpha(alpha) - macts.GetProperty().LightingOff() - macts.GetProperty().SetLineWidth(lw) + macts.property.LightingOff() + macts.property.SetLineWidth(lw) macts.actor.UseBoundsOff() macts.base = q1 macts.top = q2 @@ -3941,7 +3941,7 @@ def Axes( for a in acts: a.actor.PickableOff() a.actor.AddPosition(orig) - a.actor.GetProperty().LightingOff() + a.property.LightingOff() asse = Assembly(acts) asse.SetOrigin(orig) asse.PickableOff() @@ -4128,7 +4128,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): a.actor.PickableOff() ass = Assembly(acts) ass.PickableOff() - plt.renderer.AddActor(ass) + plt.add(ass) plt.axes_instances[r] = ass elif plt.axes == 4: @@ -4236,9 +4236,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): oc_actor.GetProperty().SetColor(lc) oc_actor.PickableOff() oc_actor.UseBoundsOn() - plt.renderer.AddActor(oc_actor) plt.axes_instances[r] = oc_actor - plt.renderer.AddActor(oc_actor) + plt.add(oc_actor) elif plt.axes == 7: vbb = compute_visible_bounds()[0] @@ -4247,8 +4246,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): if not rulax: return None rulax.actor.UseBoundsOn() - rulax.PickableOff() - plt.renderer.AddActor(rulax) + rulax.actor.PickableOff() + plt.add(rulax) elif plt.axes == 8: vbb = compute_visible_bounds()[0] @@ -4269,7 +4268,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca - plt.renderer.AddActor(ca) + plt.add(ca) elif plt.axes == 9: vbb = compute_visible_bounds()[0] @@ -4280,10 +4279,10 @@ def add_global_axes(axtype=None, c=None, bounds=()): src.Update() ca = Mesh(src.GetOutput(), c, 0.5).wireframe(True) ca.pos((vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2) - ca.PickableOff() + ca.actor.PickableOff() ca.actor.UseBoundsOff() plt.axes_instances[r] = ca - plt.renderer.AddActor(ca) + plt.add(ca) elif plt.axes == 10: vbb = compute_visible_bounds()[0] @@ -4301,7 +4300,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca = xc + yc + zc ca.PickableOff() ca.UseBoundsOn() - plt.renderer.AddActor(ca) + plt.add(ca) plt.axes_instances[r] = ca elif plt.axes == 11: @@ -4312,7 +4311,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): gr.lighting("off").actor.PickableOff() gr.actor.UseBoundsOff() plt.axes_instances[r] = gr - plt.renderer.AddActor(gr) + plt.add(gr) elif plt.axes == 12: polaxes = vtk.vtkPolarAxesActor() @@ -4343,7 +4342,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): polaxes.UseBoundsOn() polaxes.actor.PickableOff() plt.axes_instances[r] = polaxes - plt.renderer.AddActor(polaxes) + plt.add(polaxes) elif plt.axes == 13: # draws a simple ruler at the bottom of the window @@ -4368,7 +4367,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls - plt.renderer.AddActor(ls) + plt.add(ls) elif plt.axes == 14: try: diff --git a/vedo/base.py b/vedo/base.py index 69c7d0f8..b38fd5dd 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -189,11 +189,11 @@ def rename(self, oldname, newname): def select(self, key): """Select one specific array by its name to make it the `active` one.""" if self.association == 0: - data = self.GetPointData() - self.mapper.SetScalarModeToUsePointData() + data = self.obj.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.GetCellData() - self.mapper.SetScalarModeToUseCellData() + data = self.obj.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) @@ -296,11 +296,11 @@ def _get_str(pd, header): return out if self.association == 0: - out = _get_str(self.actor._data.GetPointData(), "Point Data") + out = _get_str(self.GetPointData(), "Point Data") elif self.association == 1: - out = _get_str(self.actor._data.GetCellData(), "Cell Data") + out = _get_str(self.GetCellData(), "Cell Data") elif self.association == 2: - pd = self.actor._data.GetFieldData() + pd = self.GetFieldData() if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.actor.name: @@ -368,7 +368,7 @@ def memory_address(self): def pickable(self, value=None): """Set/get the pickability property of an object.""" if value is None: - return self.GetPickable() + return self.actor.GetPickable() self.actor.SetPickable(value) return self @@ -862,11 +862,11 @@ def points(self, pts=None, transformed=True): pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] arr = utils.numpy2vtk(pts, dtype=np.float32) - vpts = self._data.GetPoints() + vpts = self.GetPoints() vpts.SetData(arr) vpts.Modified() # reset mesh to identity matrix position/rotation: - self.PokeMatrix(vtk.vtkMatrix4x4()) + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.point_locator = None self.cell_locator = None self.transform = None @@ -901,7 +901,7 @@ def delete_cells(self, ids): data.Modified() self._mapper.Modified() self.pipeline = utils.OperationNode( - "delete_cells", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}" + "delete_cells", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" ) return self @@ -911,11 +911,11 @@ def mark_boundaries(self): A new array called `BoundaryCells` is added to the mesh. """ mb = vtk.vtkMarkBoundaryFilter() - mb.SetInputData(self._data) + mb.SetInputData(self) mb.Update() - out = self._update(mb.GetOutput()) - out.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) - return out + self.DeepCopy(mb.GetOutput()) + self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) + return self def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): """ @@ -952,7 +952,7 @@ def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" vc = vtk.vtkCountVertices() - vc.SetInputData(self._data) + vc.SetInputData(self) vc.SetOutputArrayName("VertexCount") vc.Update() varr = vc.GetOutput().GetCellData().GetArray("VertexCount") @@ -1175,9 +1175,9 @@ def map_cells_to_points(self, arrays=(), move=False): c2p.ProcessAllArraysOn() c2p.Update() self.mapper.SetScalarModeToUsePointData() - out = self._update(c2p.GetOutput()) - out.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) - return out + self.DeepCopy(c2p.GetOutput()) + self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) + return self def map_points_to_cells(self, arrays=(), move=False): """ @@ -1206,9 +1206,9 @@ def map_points_to_cells(self, arrays=(), move=False): p2c.ProcessAllArraysOn() p2c.Update() self.mapper.SetScalarModeToUseCellData() - out = self._update(p2c.GetOutput()) - out.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) - return out + self.DeepCopy(p2c.GetOutput()) + self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) + return self def resample_data_from(self, source, tol=None, categorical=False): """ @@ -1250,7 +1250,7 @@ def resample_data_from(self, source, tol=None, categorical=False): rs.SetComputeTolerance(False) rs.SetTolerance(tol) rs.Update() - self._update(rs.GetOutput()) + self.DeepCopy(rs.GetOutput()) self.pipeline = utils.OperationNode( f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] ) @@ -1266,7 +1266,7 @@ def add_ids(self): ids.SetPointIdsArrayName("PointID") ids.SetCellIdsArrayName("CellID") ids.Update() - self._update(ids.GetOutput()) + self.DeepCopy(ids.GetOutput()) self.pipeline = utils.OperationNode("add_ids", parents=[self]) return self @@ -1581,10 +1581,10 @@ def __init__(self): # ----------------------------------------------------------- - def _update(self, data): - self.mapper.SetInputData(self.tomesh()) - self.mapper.Modified() - return self + # def _update(self, data): + # self.mapper.SetInputData(self.tomesh()) + # self.mapper.Modified() + # return self def tomesh(self, fill=True, shrink=1.0): """ @@ -1599,7 +1599,7 @@ def tomesh(self, fill=True, shrink=1.0): gf = vtk.vtkGeometryFilter() if fill: sf = vtk.vtkShrinkFilter() - sf.SetInputData(self._data) + sf.SetInputData(self) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) @@ -1615,7 +1615,7 @@ def tomesh(self, fill=True, shrink=1.0): cleanPolyData.Update() poly = cleanPolyData.GetOutput() else: - gf.SetInputData(self._data) + gf.SetInputData(self) gf.Update() poly = gf.GetOutput() @@ -1640,7 +1640,7 @@ def cells(self): The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ - arr1d = utils.vtk2numpy(self._data.GetCells().GetData()) + arr1d = utils.vtk2numpy(self.GetCells().GetData()) if arr1d is None: return [] @@ -1687,9 +1687,9 @@ def color(self, col, alpha=None, vmin=None, vmax=None): return self if vmin is None: - vmin, _ = self._data.GetScalarRange() + vmin, _ = self.GetScalarRange() if vmax is None: - _, vmax = self._data.GetScalarRange() + _, vmax = self.GetScalarRange() ctf = self.property.GetRGBTransferFunction() ctf.RemoveAllPoints() self._color = col @@ -1746,9 +1746,9 @@ def alpha(self, alpha, vmin=None, vmax=None): will get an opacity of 40% and above 123 alpha is set to 90%. """ if vmin is None: - vmin, _ = self._data.GetScalarRange() + vmin, _ = self.GetScalarRange() if vmax is None: - _, vmax = self._data.GetScalarRange() + _, vmax = self.GetScalarRange() otf = self.property.GetScalarOpacity() otf.RemoveAllPoints() self._alpha = alpha @@ -1800,7 +1800,7 @@ def shrink(self, fraction=0.8): sf.SetInputData(self) sf.SetShrinkFactor(fraction) sf.Update() - self._update(sf.GetOutput()) + self.DeepCopy(sf.GetOutput()) self.pipeline = utils.OperationNode( "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" ) @@ -1818,7 +1818,7 @@ def isosurface(self, value=None, flying_edges=True): ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ - scrange = self._data.GetScalarRange() + scrange = self.GetScalarRange() if flying_edges: cf = vtk.vtkFlyingEdges3D() @@ -1827,7 +1827,7 @@ def isosurface(self, value=None, flying_edges=True): cf = vtk.vtkContourFilter() cf.UseScalarTreeOn() - cf.SetInputData(self._data) + cf.SetInputData(self) cf.ComputeNormalsOn() if utils.is_sequence(value): @@ -1878,11 +1878,11 @@ def legosurface( ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ dataset = vtk.vtkImplicitDataSet() - dataset.SetDataSet(self._data) + dataset.SetDataSet(self) window = vtk.vtkImplicitWindowFunction() window.SetImplicitFunction(dataset) - srng = list(self._data.GetScalarRange()) + srng = list(self.GetScalarRange()) if vmin is not None: srng[0] = vmin if vmax is not None: @@ -1893,7 +1893,7 @@ def legosurface( window.SetWindowRange(srng) extract = vtk.vtkExtractGeometry() - extract.SetInputData(self._data) + extract.SetInputData(self) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) @@ -1936,7 +1936,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self._data) + clipper.SetInputData(self) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() @@ -1947,14 +1947,14 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return ug else: - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self @@ -1979,7 +1979,7 @@ def cut_with_box(self, box): # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self._data) + bc.SetInputData(self) if isinstance(box, vtk.vtkProp): boxb = box.GetBounds() else: @@ -1991,14 +1991,14 @@ def cut_with_box(self, box): if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return ug else: - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return self @@ -2012,7 +2012,7 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal # if isinstance(self, vedo.Volume): # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") - ug = self._data + ug = self ippd = vtk.vtkImplicitPolyDataDistance() ippd.SetInput(mesh) @@ -2058,14 +2058,14 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return ug else: - self._update(cout) + self.DeepCopy(cout) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return self @@ -2074,7 +2074,7 @@ def extract_cells_on_plane(self, origin, normal): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self._data) + bf.SetInputData(self) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2085,11 +2085,11 @@ def extract_cells_on_plane(self, origin, normal): bf.SetImplicitFunction(plane) bf.Update() - self._update(bf.GetOutput()) + self.DeepCopy(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_plane", parents=[self], - comment=f"#cells {self._data.GetNumberOfCells()}", + comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b", ) return self @@ -2099,7 +2099,7 @@ def extract_cells_on_sphere(self, center, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self._data) + bf.SetInputData(self) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2110,11 +2110,11 @@ def extract_cells_on_sphere(self, center, radius): bf.SetImplicitFunction(sph) bf.Update() - self._update(bf.GetOutput()) + self.DeepCopy(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_sphere", parents=[self], - comment=f"#cells {self._data.GetNumberOfCells()}", + comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b", ) return self @@ -2124,7 +2124,7 @@ def extract_cells_on_cylinder(self, center, axis, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self._data) + bf.SetInputData(self) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2139,10 +2139,10 @@ def extract_cells_on_cylinder(self, center, axis, radius): self.pipeline = utils.OperationNode( "extract_cells_on_cylinder", parents=[self], - comment=f"#cells {self._data.GetNumberOfCells()}", + comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b", ) - self._update(bf.GetOutput()) + self.DeepCopy(bf.GetOutput()) return self def clean(self): @@ -2150,15 +2150,15 @@ def clean(self): Cleanup unused points and empty cells """ cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self._data) + cl.SetInputData(self) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() cl.AveragePointDataOff() cl.Update() - self._update(cl.GetOutput()) + self.DeepCopy(cl.GetOutput()) self.pipeline = utils.OperationNode( - "clean", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b" + "clean", parents=[self], comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b" ) return self @@ -2170,7 +2170,7 @@ def find_cell(self, p): subId = vtk.mutable(0) pcoords = [0, 0, 0] weights = [0, 0, 0] - cid = self._data.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) + cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) return cid def extract_cells_by_id(self, idlist, use_point_ids=False): @@ -2188,7 +2188,7 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): selection = vtk.vtkSelection() selection.AddNode(selectionNode) es = vtk.vtkExtractSelection() - es.SetInputData(0, self._data) + es.SetInputData(0, self) es.SetInputData(1, selection) es.Update() @@ -2207,7 +2207,7 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): ug.pipeline = utils.OperationNode( "extract_cells_by_id", parents=[self], - comment=f"#cells {self._data.GetNumberOfCells()}", + comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b", ) return ug diff --git a/vedo/mesh.py b/vedo/mesh.py index 7b897d53..a880d5a2 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -66,10 +66,12 @@ def __init__(self, inputobj=None, c=None, alpha=1): inputtype = str(type(inputobj)) + _data = inputobj + if inputobj is None: - pass + _data = vtk.vtkPolyData() - elif isinstance(inputobj, (Mesh, vtk.vtkActor)): + elif isinstance(inputobj, vtk.vtkActor): _data = inputobj.GetMapper().GetInput() self.mapper.SetInputData(self) self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) @@ -574,7 +576,7 @@ def texture( self.property.SetColor(1, 1, 1) self.mapper.ScalarVisibilityOff() - self.SetTexture(tu) + self.actor.SetTexture(tu) if seam_threshold is not None: tname = self.GetPointData().GetTCoords().GetName() @@ -1436,7 +1438,7 @@ def subdivide(self, n=1, method=0, mel=None): self.DeepCopy(sdf.GetOutput()) self.pipeline = OperationNode( - "subdivide", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" + "subdivide", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -2101,16 +2103,12 @@ def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): rf.SetTranslation(zshift) rf.SetDeltaRadius(dR) rf.Update() + m = Mesh(rf.GetOutput(), c=self.c(), alpha=self.alpha()) prop = vtk.vtkProperty() prop.DeepCopy(self.property) - m.SetProperty(prop) + m.actor.SetProperty(prop) m.property = prop - # assign the same transformation - m.SetOrigin(self.GetOrigin()) - m.SetScale(self.GetScale()) - m.SetOrientation(self.GetOrientation()) - m.SetPosition(self.GetPosition()) m.compute_normals(cells=False).flat().lighting("default") @@ -2298,7 +2296,7 @@ def intersect_with(self, mesh2, tol=1e-06): bf.SetInputData(1, poly2) bf.Update() msh = Mesh(bf.GetOutput(), "k", 1).lighting("off") - msh.GetProperty().SetLineWidth(3) + msh.property.SetLineWidth(3) msh.name = "SurfaceIntersection" msh.pipeline = OperationNode( @@ -2784,17 +2782,19 @@ def tetralize( #################################################### class Follower(vedo.base.BaseActor, vtk.vtkFollower): - def __init__(self, actor, camera=None): + def __init__(self, objt, camera=None): + actor = objt.actor + mapper = objt.mapper vtk.vtkFollower.__init__(self) vedo.base.BaseActor.__init__(self) - self.name = actor.name + self.name = objt.name self._isfollower = False - self.SetMapper(actor.GetMapper()) + self.SetMapper(mapper) - self.SetProperty(actor.GetProperty()) + self.SetProperty(objt.property) self.SetBackfaceProperty(actor.GetBackfaceProperty()) self.SetTexture(actor.GetTexture()) diff --git a/vedo/plotter.py b/vedo/plotter.py index 38f0d8b9..31087c23 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2063,8 +2063,8 @@ def add_hover_legend( def _legfunc(evt): if not evt.actor or not self.renderer or at != evt.at: - if hoverlegend._mapper.GetInput(): # clear and return - hoverlegend._mapper.SetInput("") + if hoverlegend.mapper.GetInput(): # clear and return + hoverlegend.mapper.SetInput("") self.interactor.Render() return @@ -2124,11 +2124,11 @@ def _legfunc(evt): cdata = indata.GetCellData() if pdata.GetScalars() and pdata.GetScalars().GetName(): t += f"\nPoint array : {pdata.GetScalars().GetName()}" - if pdata.GetScalars().GetName() == evt.actor.mapper().GetArrayName(): + if pdata.GetScalars().GetName() == evt.actor.mapper.GetArrayName(): t += " *" if cdata.GetScalars() and cdata.GetScalars().GetName(): t += f"\nCell array : {cdata.GetScalars().GetName()}" - if cdata.GetScalars().GetName() == evt.actor.mapper().GetArrayName(): + if cdata.GetScalars().GetName() == evt.actor.mapper.GetArrayName(): t += " *" if evt.isPicture: @@ -2140,8 +2140,8 @@ def _legfunc(evt): # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): actcol = evt.actor.GetProperty().GetColor() - if hoverlegend._mapper.GetTextProperty().GetBackgroundColor() != actcol: - hoverlegend._mapper.GetTextProperty().SetBackgroundColor(actcol) + if hoverlegend.mapper.GetTextProperty().GetBackgroundColor() != actcol: + hoverlegend.mapper.GetTextProperty().SetBackgroundColor(actcol) # adapt to changes in bg color bgcol = self.renderers[at].GetBackground() @@ -2153,8 +2153,8 @@ def _legfunc(evt): if len(set(_bgcol).intersection(bgcol)) < 3: hoverlegend.color(_bgcol) - if hoverlegend._mapper.GetInput() != t: - hoverlegend._mapper.SetInput(t) + if hoverlegend.mapper.GetInput() != t: + hoverlegend.mapper.SetInput(t) self.interactor.Render() self.add(hoverlegend, at=at) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index ad9e7c29..ecae30e2 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -599,9 +599,9 @@ def pca_ellipse(points, pvalue=0.673, res=60): elli = vedo.shapes.Circle(alpha=0.75, res=res) # assign the transformation - elli.SetScale(vtra.GetScale()) - elli.SetOrientation(vtra.GetOrientation()) - elli.SetPosition(vtra.GetPosition()) + # elli.SetScale(vtra.GetScale()) + # elli.SetOrientation(vtra.GetOrientation()) + # elli.SetPosition(vtra.GetPosition()) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n @@ -669,9 +669,9 @@ def pca_ellipsoid(points, pvalue=0.673): vtra.SetMatrix(matri) # assign the transformation - elli.SetScale(vtra.GetScale()) - elli.SetOrientation(vtra.GetOrientation()) - elli.SetPosition(vtra.GetPosition()) + # elli.SetScale(vtra.GetScale()) + # elli.SetOrientation(vtra.GetOrientation()) + # elli.SetPosition(vtra.GetPosition()) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n @@ -698,11 +698,10 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): """ if isinstance(pos, vtk.vtkActor): pos = pos.GetPosition() - pd = utils.buildPolyData([[0, 0, 0]]) if len(pos) == 2: pos = (pos[0], pos[1], 0.0) + pd = utils.buildPolyData([pos]) pt = Points(pd, r, c, alpha) - pt.SetPosition(pos) pt.name = "Point" return pt @@ -992,7 +991,7 @@ def clone(self, deep=True): if self.actor.GetBackfaceProperty(): bfpr = vtk.vtkProperty() - bfpr.DeepCopy(self.GetBackfaceProperty()) + bfpr.DeepCopy(self.actor.GetBackfaceProperty()) cloned.actor.SetBackfaceProperty(bfpr) cloned.transform = self.transform @@ -1206,17 +1205,17 @@ def _compute_shadow(self, plane, point, direction): # we dont see glitches due to coplanar points # we leave a small tolerance of 0.1% in thickness x0, x1 = self.xbounds() - pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[0] + pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] shad.points(pts) shad.x(point) elif plane == 'y': x0, x1 = self.ybounds() - pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[1] + pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] shad.points(pts) shad.y(point) elif plane == "z": x0, x1 = self.zbounds() - pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[2] + pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[2] shad.points(pts) shad.z(point) else: @@ -1472,9 +1471,9 @@ def alpha(self, opacity=None): if bfp: if opacity < 1: self._bfprop = bfp - self.SetBackfaceProperty(None) + self.property.SetBackfaceProperty(None) else: - self.SetBackfaceProperty(self._bfprop) + self.property.SetBackfaceProperty(self._bfprop) return self def opacity(self, alpha=None): @@ -1485,12 +1484,12 @@ def force_opaque(self, value=True): """ Force the Mesh, Line or point cloud to be treated as opaque""" ## force the opaque pass, fixes picking in vtk9 # but causes other bad troubles with lines.. - self.SetForceOpaque(value) + self.actor.SetForceOpaque(value) return self def force_translucent(self, value=True): """ Force the Mesh, Line or point cloud to be treated as translucent""" - self.SetForceTranslucent(value) + self.actor.SetForceTranslucent(value) return self def point_size(self, value=None): @@ -2150,7 +2149,7 @@ def flagpole( cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] - box.SetOrigin(cnt) + # box.SetOrigin(cnt) box.scale([1 + padding, 1 + 2 * padding, 1]) acts.append(box) @@ -2181,11 +2180,11 @@ def flagpole( acts.append(con) macts = vedo.merge(acts).c(c).alpha(alpha) - macts.SetOrigin(pt) + # macts.SetOrigin(pt) macts.bc("tomato").pickable(False) - macts.GetProperty().LightingOff() - macts.GetProperty().SetLineWidth(lw) - macts.UseBoundsOff() + macts.property.LightingOff() + macts.property.SetLineWidth(lw) + macts.actor.UseBoundsOff() macts.name = "FlagPole" return macts diff --git a/vedo/shapes.py b/vedo/shapes.py index a9cfcb3e..ca7822a4 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -211,15 +211,14 @@ def __init__( lighting = None if utils.is_sequence(mesh): # create a cloud of points - poly = Points(mesh).polydata() + poly = Points(mesh) elif isinstance(mesh, vtk.vtkPolyData): poly = mesh else: - poly = mesh.polydata() + poly = mesh if isinstance(glyph, Points): lighting = glyph.property.GetLighting() - glyph = glyph.polydata() cmap = "" if isinstance(c, str) and c in cmaps_names: @@ -292,12 +291,12 @@ def __init__( for i in range(512): r, g, b = color_map(i, cmap, 0, 512) lut.SetTableValue(i, r, g, b, 1) - self.mapper().SetLookupTable(lut) - self.mapper().ScalarVisibilityOn() - self.mapper().SetScalarModeToUsePointData() + self.mapper.SetLookupTable(lut) + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarModeToUsePointData() if gly.GetOutput().GetPointData().GetScalars(): rng = gly.GetOutput().GetPointData().GetScalars().GetRange() - self.mapper().SetScalarRange(rng[0], rng[1]) + self.mapper.SetScalarRange(rng[0], rng[1]) self.name = "Glyph" @@ -362,7 +361,7 @@ def __init__( ![](https://vedo.embl.es/images/volumetric/tensor_grid.png) """ if isinstance(source, Points): - src = source.normalize().polydata(False) + src = source.normalize() else: if "ellip" in source: src = vtk.vtkSphereSource() @@ -582,7 +581,7 @@ def pattern(self, stipple, repeats=10): image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 255) i_dim += 1 - polyData = self.polydata(False) + polyData = self # Create texture coordinates tcoords = vtk.vtkDoubleArray() @@ -691,7 +690,7 @@ def sweep(self, direction=(1, 0, 0), res=1): ``` ![](https://vedo.embl.es/images/feats/sweepline.png) """ - line = self.polydata() + line = self rows = line.GetNumberOfPoints() spacing = 1 / res @@ -1312,7 +1311,7 @@ class NormalLines(Mesh): def __init__(self, msh, ratio=1, on="cells", scale=1.0): - poly = msh.clone().compute_normals().polydata() + poly = msh.clone().compute_normals() if "cell" in on: centers = vtk.vtkCellCenters() @@ -1349,7 +1348,7 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): self.actor.SetProperty(prop) self.property = prop self.property.LightingOff() - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.name = "NormalLines" @@ -1518,9 +1517,9 @@ def StreamLines( if isinstance(domain, vedo.Points): if extrapolate_to_box: - grid = _interpolate2vol(domain.polydata(), **extrapolate_to_box) + grid = _interpolate2vol(domain, **extrapolate_to_box) else: - grid = domain.polydata() + grid = domain elif isinstance(domain, vedo.BaseVolume): grid = domain.inputdata() else: @@ -1621,9 +1620,9 @@ def read_points(): scals = grid.GetPointData().GetScalars() if scals: - sta.mapper().SetScalarRange(scals.GetRange()) + sta.mapper.SetScalarRange(scals.GetRange()) if scalar_range is not None: - sta.mapper().SetScalarRange(scalar_range) + sta.mapper.SetScalarRange(scalar_range) sta.phong() sta.name = "StreamLines" @@ -1635,14 +1634,14 @@ def read_points(): if lw is not None and len(tubes) == 0 and not ribbons: sta.lw(lw) - sta.mapper().SetResolveCoincidentTopologyToPolygonOffset() + sta.mapper.SetResolveCoincidentTopologyToPolygonOffset() sta.lighting("off") scals = grid.GetPointData().GetScalars() if scals: - sta.mapper().SetScalarRange(scals.GetRange()) + sta.mapper.SetScalarRange(scals.GetRange()) if scalar_range is not None: - sta.mapper().SetScalarRange(scalar_range) + sta.mapper.SetScalarRange(scalar_range) sta.name = "StreamLines" return sta @@ -1719,10 +1718,10 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): Mesh.__init__(self, tuf.GetOutput(), c, alpha) self.phong() if usingColScals: - self.mapper().SetScalarModeToUsePointFieldData() - self.mapper().ScalarVisibilityOn() - self.mapper().SelectColorArray("TubeColors") - self.mapper().Modified() + self.mapper.SetScalarModeToUsePointFieldData() + self.mapper.ScalarVisibilityOn() + self.mapper.SelectColorArray("TubeColors") + self.mapper.Modified() self.base = base self.top = top @@ -1828,7 +1827,7 @@ def __init__( ############################################# ribbon_filter = vtk.vtkRibbonFilter() aline = Line(line1) - ribbon_filter.SetInputData(aline.polydata()) + ribbon_filter.SetInputData(aline) if width is None: width = aline.diagonal_size() / 20.0 ribbon_filter.SetWidth(width) @@ -2277,7 +2276,7 @@ def __init__( Glyph.__init__( self, pts, - arr.polydata(False), + arr, orientation_array=orients, scale_by_vector_size=True, c=c, @@ -2793,9 +2792,9 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): self.top = centers[-1] self.phong() if cisseq: - self.mapper().ScalarVisibilityOn() + self.mapper.ScalarVisibilityOn() else: - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.property.SetColor(get_color(c)) self.name = "Spheres" @@ -3386,7 +3385,7 @@ def __init__( diff = diff / length theta = np.arccos(diff[2]) phi = np.arctan2(diff[1], diff[0]) - sp = Line(pts).polydata(False) + sp = Line(pts) t = vtk.vtkTransform() t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) @@ -3586,7 +3585,7 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.actor.SetPosition(pos) self.name = "Paraboloid" @@ -3619,7 +3618,7 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() - self.mapper().ScalarVisibilityOff() + self.mapper.ScalarVisibilityOff() self.actor.SetPosition(pos) self.name = "Hyperboloid" @@ -3787,10 +3786,10 @@ def __init__( cmt.rotate_z(90 + angle) cmt.scale(1 / (cx1 - cx0) * s * len(comment) / 5) cmt.shift(x1 * (1 + padding2), 0, 0) - poly = merge(br, cmt).polydata() + poly = merge(br, cmt) else: - poly = br.polydata() + poly = br tr = vtk.vtkTransform() tr.RotateZ(angler) @@ -3847,15 +3846,14 @@ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0): """ Build a 3D cross shape, mainly useful as a 3D marker. """ + if len(pos) == 2: + pos = (pos[0], pos[1], 0) + c1 = Cylinder(r=thickness * s, height=2 * s) c2 = Cylinder(r=thickness * s, height=2 * s).rotate_x(90) c3 = Cylinder(r=thickness * s, height=2 * s).rotate_y(90) - poly = merge(c1, c2, c3).color(c).alpha(alpha).polydata(False) + poly = merge(c1, c2, c3).color(c).alpha(alpha).pos(pos) Mesh.__init__(self, poly, c, alpha) - - if len(pos) == 2: - pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) self.name = "Cross3D" @@ -4574,7 +4572,7 @@ def __init__( TextBase.__init__(self) self.mapper = vtk.vtkTextMapper() - self.actor.SetMapper(self.mapper) + self.SetMapper(self.mapper) self.property = self.mapper.GetTextProperty() @@ -4594,7 +4592,7 @@ def __init__( self.font(font).color(c).background(bg, alpha).bold(bold).italic(italic) self.pos(pos, justify).size(s).text(txt).line_spacing(1.2).line_offset(5) - self.actor.PickableOff() + self.PickableOff() def pos(self, pos="top-left", justify=""): """ @@ -4650,7 +4648,7 @@ def pos(self, pos="top-left", justify=""): if "right" in justify: self.property.SetJustificationToRight() - self.actor.SetPosition(pos) + self.SetPosition(pos) return self def text(self, txt=None): @@ -4860,7 +4858,7 @@ def __init__(self, pts): mesh = Points(pts) else: mesh = pts - apoly = mesh.clean().polydata() + apoly = mesh.clean() # Create the convex hull of the pointcloud z0, z1 = mesh.zbounds() diff --git a/vedo/utils.py b/vedo/utils.py index 9ad2fe71..218f59df 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1503,7 +1503,7 @@ def _print_data(poly, c): vedo.printc("no point or cell data is present.", c=c, bold=False) ################################ - def _printvtkactor(objt): + def _print_vtkactor(objt): poly = objt actor = objt.actor pro = objt.property @@ -1511,15 +1511,9 @@ def _printvtkactor(objt): if not actor.GetPickable(): return - # mapper = actor.GetMapper() - # if hasattr(actor, "polydata"): - # poly = actor - # else: - # poly = mapper.GetInput() - - pro = actor.GetProperty() - pos = actor.GetPosition() - bnds = actor.bounds() + pro = poly.property + pos = poly.pos() + bnds = poly.bounds() col = precision(pro.GetColor(), 3) alpha = pro.GetOpacity() npt = poly.GetNumberOfPoints() @@ -1623,7 +1617,7 @@ def _printvtkactor(objt): vedo.printc(f"\tmean: {tmea}", c=cf) elif isinstance(obj, vedo.Points): - _printvtkactor(obj) + _print_vtkactor(obj) elif isinstance(obj, vedo.Assembly): vedo.printc("Assembly".ljust(75), c="g", bold=True, invert=True) @@ -1647,7 +1641,7 @@ def _printvtkactor(objt): for _ in range(obj.GetNumberOfPaths()): act = vtk.vtkActor.SafeDownCast(cl.GetNextProp()) if isinstance(act, vtk.vtkActor): - _printvtkactor(act) + _print_vtkactor(act) elif isinstance(obj, vedo.TetMesh): cf = "m" From f90ebde4089e24025fad4855d05398bef7a54f98 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 5 Oct 2023 21:03:47 +0200 Subject: [PATCH 008/251] fix button and other fixes --- vedo/addons.py | 194 +++++++++++++++---------------------------- vedo/applications.py | 81 +++++++++--------- vedo/base.py | 41 +++++---- vedo/plotter.py | 164 ++++++++++++++++-------------------- vedo/shapes.py | 48 +++++------ vedo/utils.py | 61 +++++++++++++- 6 files changed, 285 insertions(+), 304 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 9dbfdfee..5aa0d0d9 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -347,7 +347,7 @@ def __init__( self.LockBorderOn() -class Button(vtk.vtkTextActor): +class Button(vedo.shapes.Text2D): """ Build a Button object. """ @@ -357,14 +357,13 @@ def __init__( states=("Button"), c=("white"), bc=("green4"), - pos=(0.7, 0.05), + pos=(0.7, 0.1), size=24, - font=None, - bold=False, + font="Courier", + bold=True, italic=False, alpha=1, angle=0, - name="Button", ): """ Build a Button object to be shown in the rendering window. @@ -392,8 +391,6 @@ def __init__( opacity level angle : (float) anticlockwise rotation in degrees - name : (str) - name of the button (useful for multiple buttons in callbacks) Examples: - [buttons.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons.py) @@ -407,9 +404,12 @@ def __init__( ![](https://vedo.embl.es/images/advanced/timer_callback1.jpg) """ - vtk.vtkTextActor.__init__(self) + super().__init__() self.status_idx = 0 + + self.spacer = " " + self.states = states if not utils.is_sequence(c): @@ -424,78 +424,18 @@ def __init__( self.function = fnc self.function_id = None - self.name = name - - self.GetActualPositionCoordinate().SetCoordinateSystemToNormalizedViewport() - self.SetPosition(pos[0], pos[1]) - - self.offset = 5 - self.spacer = " " - - self.len_states = max([len(s) for s in states]) - - self.text_property = self.GetTextProperty() - self.text_property.SetJustificationToCentered() - - if not font: - font = settings.default_font - - if font.lower() == "courier": - self.text_property.SetFontFamilyToCourier() - elif font.lower() == "times": - self.text_property.SetFontFamilyToTimes() - elif font.lower() == "arial": - self.text_property.SetFontFamilyToArial() - else: - self.text_property.SetFontFamily(vtk.VTK_FONT_FILE) - self.text_property.SetFontFile(utils.get_font_path(font)) - self.text_property.SetFontSize(size) - - self.text_property.SetBackgroundOpacity(alpha) - - self.text_property.BoldOff() - if bold: - self.text_property.BoldOn() - - self.text_property.ItalicOff() - if italic: - self.text_property.ItalicOn() - - self.text_property.ShadowOff() - self.text_property.SetOrientation(angle) - self.text_property.SetLineOffset(self.offset) - - self.hasframe = hasattr(self.text_property, "FrameOn") self.status(0) - def text(self, txt="", c=None): - if txt: - self.SetInput(self.spacer + str(txt) + self.spacer) - else: - return self.GetInput() + if font == "courier": + font = font.capitalize() + self.font(font).bold(bold).italic(italic) - if c is not None: - self.text_property.SetColor(get_color(c)) - return self + self.alpha(alpha).angle(angle) + self.size(size/20) + self.pos(pos, "center") + self.PickableOn() - def backcolor(self, c): - self.text_property.SetBackgroundColor(get_color(c)) - return self - - def frame(self, lw=None, c=None): - if self.hasframe: - self.text_property.FrameOn() - if lw is not None: - if lw > 0: - self.text_property.FrameOn() - self.text_property.SetFrameWidth(lw) - else: - self.text_property.FrameOff() - return self - if c is not None: - self.text_property.SetFrameColor(get_color(c)) - return self def status(self, s=None): """ @@ -507,10 +447,10 @@ def status(self, s=None): if isinstance(s, str): s = self.states.index(s) self.status_idx = s - self.text(self.states[s]) + self.text(self.spacer + self.states[s] + self.spacer) s = s % len(self.bcolors) - self.text(c=self.colors[s]) - self.backcolor(self.bcolors[s]) + self.color(self.colors[s]) + self.background(self.bcolors[s]) return self def switch(self): @@ -1168,7 +1108,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - a.actor.RotateZ(label_rotation) + a.rotate_z(label_rotation) else: a = shapes.Text3D( tx, @@ -1197,7 +1137,7 @@ def ScalarBar3D( italic=italic, font=title_font, ) - t.actor.RotateZ(90 + title_rotation) + t.rotate_z(90 + title_rotation) t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) @@ -1227,7 +1167,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - btx.actor.RotateZ(label_rotation) + btx.rotate_z(label_rotation) else: btx = shapes.Text3D( below_text, @@ -1266,7 +1206,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - atx.actor.RotateZ(label_rotation) + atx.rotate_z(label_rotation) else: atx = shapes.Text3D( above_text, @@ -1305,7 +1245,7 @@ def ScalarBar3D( italic=italic, font=label_font, ) - nantx.actor.RotateZ(label_rotation) + nantx.rotate_z(label_rotation) else: nantx = shapes.Text3D( nan_text, @@ -2392,7 +2332,7 @@ def Ruler( lb = shapes.Text3D(label, pos=(q1 + q2) / 2, s=s, font=font, italic=italic, justify="center") if label_rotation: - lb.actor.RotateZ(label_rotation) + lb.rotate_z(label_rotation) x0, x1 = lb.xbounds() gap = [(x1 - x0) / 2, 0, 0] @@ -2405,8 +2345,8 @@ def Ruler( zs = np.array([0, d / 50 * (1 / units_scale), 0]) ml1 = shapes.Line(-zs, zs).pos(q1) ml2 = shapes.Line(-zs, zs).pos(q2) - ml1.actor.RotateZ(tick_angle - 90) - ml2.actor.RotateZ(tick_angle - 90) + ml1.rotate_z(tick_angle - 90) + ml2.rotate_z(tick_angle - 90) c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=20) c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) @@ -3154,14 +3094,14 @@ def Axes( if yzgrid and ytitle and ztitle: if not yzgrid_transparent: gyz = shapes.Grid(s=(zticks_float, yticks_float)) - gyz.alpha(yzalpha).c(yzplane_color).lw(0).actor.RotateY(-90) + gyz.alpha(yzalpha).c(yzplane_color).lw(0).rotate_y(-90) if yzshift: gyz.shift(yzshift*dx,0,0) elif tol: gyz.shift(-tol*gscale,0,0) gyz.name = "yzGrid" grids.append(gyz) if grid_linewidth: gyz_lines = shapes.Grid(s=(zticks_float, yticks_float)) - gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).actor.RotateY(-90) + gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).rotate_y(-90) if yzshift: gyz_lines.shift(yzshift*dx,0,0) elif tol: gyz_lines.shift(-tol*gscale,0,0) gyz_lines.name = "yzGridLines" @@ -3170,14 +3110,14 @@ def Axes( if zxgrid and ztitle and xtitle: if not zxgrid_transparent: gzx = shapes.Grid(s=(xticks_float, zticks_float)) - gzx.alpha(zxalpha).c(zxplane_color).lw(0).actor.RotateX(90) + gzx.alpha(zxalpha).c(zxplane_color).lw(0).rotate_x(90) if zxshift: gzx.shift(0,zxshift*dy,0) elif tol: gzx.shift(0,-tol*gscale,0) gzx.name = "zxGrid" grids.append(gzx) if grid_linewidth: gzx_lines = shapes.Grid(s=(xticks_float, zticks_float)) - gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).actor.RotateX(90) + gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).rotate_x(90) if zxshift: gzx_lines.shift(0,zxshift*dy,0) elif tol: gzx_lines.shift(0,-tol*gscale,0) gzx_lines.name = "zxGridLines" @@ -3201,13 +3141,13 @@ def Axes( if yzgrid2 and ytitle and ztitle: if not yzgrid2_transparent: gyz2 = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2.alpha(yzalpha).c(yzplane_color).lw(0).actor.RotateY(-90) + gyz2.alpha(yzalpha).c(yzplane_color).lw(0).rotate_y(-90) if tol: gyz2.shift(tol*gscale,0,0) gyz2.name = "yzGrid2" grids.append(gyz2) if grid_linewidth: gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).actor.RotateY(-90) + gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).rotate_y(-90) if tol: gyz2_lines.shift(tol*gscale,0,0) gyz2_lines.name = "yzGrid2Lines" grids.append(gyz2_lines) @@ -3215,13 +3155,13 @@ def Axes( if zxgrid2 and ztitle and xtitle: if not zxgrid2_transparent: gzx2 = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2.alpha(zxalpha).c(zxplane_color).lw(0).actor.RotateX(90) + gzx2.alpha(zxalpha).c(zxplane_color).lw(0).rotate_x(90) if tol: gzx2.shift(0,tol*gscale,0) gzx2.name = "zxGrid2" grids.append(gzx2) if grid_linewidth: gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).actor.RotateX(90) + gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).rotate_x(90) if tol: gzx2_lines.shift(0,tol*gscale,0) gzx2_lines.name = "zxGrid2Lines" grids.append(gzx2_lines) @@ -3365,7 +3305,7 @@ def Axes( if len(xticks) > 1: xmajticks = merge(xticks).c(xlabel_color) if xaxis_rotation: - xmajticks.actor.RotateX(xaxis_rotation) + xmajticks.rotate_x(xaxis_rotation) if xyshift: xmajticks.shift(0,0,xyshift*dz) if zxshift: xmajticks.shift(0,zxshift*dy,0) if xshift_along_y: xmajticks.shift(0,xshift_along_y*dy,0) @@ -3382,7 +3322,7 @@ def Axes( if len(yticks) > 1: ymajticks = merge(yticks).c(ylabel_color) if yaxis_rotation: - ymajticks.actor.RotateY(yaxis_rotation) + ymajticks.rotate_y(yaxis_rotation) if xyshift: ymajticks.shift(0,0,xyshift*dz) if yzshift: ymajticks.shift(yzshift*dx,0,0) if yshift_along_x: ymajticks.shift(yshift_along_x*dx,0,0) @@ -3398,8 +3338,8 @@ def Axes( zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) - zmajticks.actor.RotateZ(-45 + zaxis_rotation) - zmajticks.actor.RotateY(-90) + zmajticks.rotate_z(-45 + zaxis_rotation) + zmajticks.rotate_y(-90) if yzshift: zmajticks.shift(yzshift*dx,0,0) if zxshift: zmajticks.shift(0,zxshift*dy,0) if zshift_along_x: zmajticks.shift(zshift_along_x*dx,0,0) @@ -3447,7 +3387,7 @@ def Axes( if ticks: xminticks = merge(ticks).c(xlabel_color) if xaxis_rotation: - xminticks.actor.RotateX(xaxis_rotation) + xminticks.rotate_x(xaxis_rotation) if xyshift: xminticks.shift(0,0,xyshift*dz) if zxshift: xminticks.shift(0,zxshift*dy,0) if xshift_along_y: xminticks.shift(0,xshift_along_y*dy,0) @@ -3494,7 +3434,7 @@ def Axes( if ticks: yminticks = merge(ticks).c(ylabel_color) if yaxis_rotation: - yminticks.actor.RotateY(yaxis_rotation) + yminticks.rotate_y(yaxis_rotation) if xyshift: yminticks.shift(0,0,xyshift*dz) if yzshift: yminticks.shift(yzshift*dx,0,0) if yshift_along_x: yminticks.shift(yshift_along_x*dx,0,0) @@ -3540,8 +3480,8 @@ def Axes( if ticks: zminticks = merge(ticks).c(zlabel_color) - zminticks.actor.RotateZ(-45 + zaxis_rotation) - zminticks.actor.RotateY(-90) + zminticks.rotate_z(-45 + zaxis_rotation) + zminticks.rotate_y(-90) if yzshift: zminticks.shift(yzshift*dx,0,0) if zxshift: zminticks.shift(0,zxshift*dy,0) if zshift_along_x: zminticks.shift(zshift_along_x*dx,0,0) @@ -3593,9 +3533,9 @@ def Axes( xlab.pos(v + offs) if xaxis_rotation: xlab.rotate_x(xaxis_rotation) - if zRot: xlab.actor.RotateZ(zRot) - if xRot: xlab.actor.RotateX(xRot) - if yRot: xlab.actor.RotateY(yRot) + if zRot: xlab.rotate_z(zRot) + if xRot: xlab.rotate_x(xRot) + if yRot: xlab.rotate_y(yRot) if xyshift: xlab.shift(0,0,xyshift*dz) if zxshift: xlab.shift(0,zxshift*dy,0) if xshift_along_y: xlab.shift(0,xshift_along_y*dy,0) @@ -3644,9 +3584,9 @@ def Axes( ylab.pos(v + offs) if yaxis_rotation: ylab.rotate_y(yaxis_rotation) - if zRot: ylab.actor.RotateZ(zRot) - if yRot: ylab.actor.RotateY(yRot) - if xRot: ylab.actor.RotateX(xRot) + if zRot: ylab.rotate_z(zRot) + if yRot: ylab.rotate_y(yRot) + if xRot: ylab.rotate_x(xRot) if xyshift: ylab.shift(0,0,xyshift*dz) if yzshift: ylab.shift(yzshift*dx,0,0) if yshift_along_x: ylab.shift(yshift_along_x*dx,0,0) @@ -3694,10 +3634,10 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zlab.actor.RotateZ(angle + yRot) # vtk inverts order of rotations + zlab.rotate_z(angle + yRot) # vtk inverts order of rotations if xRot: - zlab.actor.RotateY(-xRot) # ..second - zlab.actor.RotateX(90 + zRot) # ..first + zlab.rotate_y(-xRot) # ..second + zlab.rotate_x(90 + zRot) # ..first zlab.pos(v + offs) if zaxis_rotation: zlab.rotate_z(zaxis_rotation) @@ -3752,11 +3692,11 @@ def Axes( if xtitle_backface_color: xt.backcolor(xtitle_backface_color) if zRot: - xt.actor.RotateZ(zRot) + xt.rotate_z(zRot) if xRot: - xt.actor.RotateX(xRot) + xt.rotate_x(xRot) if yRot: - xt.actor.RotateY(yRot) + xt.rotate_y(yRot) shift = 0 if xlab: # xlab is the last created numeric text label.. lt0, lt1 = xlab.GetBounds()[2:4] @@ -3822,9 +3762,9 @@ def Axes( if ytitle_backface_color: yt.backcolor(ytitle_backface_color) - if zRot: yt.actor.RotateZ(zRot) - if yRot: yt.actor.RotateY(yRot) - if xRot: yt.actor.RotateX(xRot) + if zRot: yt.rotate_z(zRot) + if yRot: yt.rotate_y(yRot) + if xRot: yt.rotate_x(xRot) shift = 0 if ylab: # this is the last created num label.. @@ -3885,10 +3825,10 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zt.actor.RotateZ(angle + yRot) # vtk inverts order of rotations + zt.rotate_z(angle + yRot) # vtk inverts order of rotations if xRot: - zt.actor.RotateY(-xRot) # ..second - zt.actor.RotateX(90 + zRot) # ..first + zt.rotate_y(-xRot) # ..second + zt.rotate_x(90 + zRot) # ..first shift = 0 if zlab: # this is the last created one.. @@ -4103,7 +4043,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 40 * s, (y0 + y1) / 2, 0] yt = shapes.Text3D("y", pos=(0, 0, 0), s=aves / 40 * s, c=ycol) - yt.pos(wpos).actor.RotateZ(90) + yt.pos(wpos).rotate_z(90) acts += [yl, yc, yt] if dz > aves / 100: @@ -4121,8 +4061,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 50 * s, -aves / 50 * s, (z0 + z1) / 2] zt = shapes.Text3D("z", pos=(0, 0, 0), s=aves / 40 * s, c=zcol) - zt.pos(wpos).actor.RotateZ(45) - zt.actor.RotateX(90) + zt.pos(wpos).rotate_z(45) + zt.rotate_x(90) acts += [zl, zc, zt] for a in acts: a.actor.PickableOff() @@ -4291,9 +4231,9 @@ def add_global_axes(axtype=None, c=None, bounds=()): rm = max(rx, ry, rz) xc = shapes.Disc(x0, r1=rm, r2=rm, c="lr", res=(1, 72)) yc = shapes.Disc(x0, r1=rm, r2=rm, c="lg", res=(1, 72)) - yc.actor.RotateX(90) + yc.rotate_x(90) zc = shapes.Disc(x0, r1=rm, r2=rm, c="lb", res=(1, 72)) - yc.actor.RotateY(90) + yc.rotate_y(90) xc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() yc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() zc.clean().alpha(0.5).wireframe().linewidth(2).actor.PickableOff() @@ -4340,7 +4280,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): polaxes.SetMaximumAngle(315.0) polaxes.SetNumberOfPolarAxisTicks(5) polaxes.UseBoundsOn() - polaxes.actor.PickableOff() + polaxes.PickableOff() plt.axes_instances[r] = polaxes plt.add(polaxes) @@ -4363,7 +4303,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): pr = ls.GetBottomAxis().GetLabelTextProperty() pr.SetFontFamily(vtk.VTK_FONT_FILE) pr.SetFontFile(utils.get_font_path(settings.default_font)) - ls.actor.PickableOff() + ls.PickableOff() # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls diff --git a/vedo/applications.py b/vedo/applications.py index 948aea70..f6578740 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -231,23 +231,22 @@ def slider_function_z(widget, event): ) ################# - def buttonfunc(evt): - if evt.actor and evt.actor.name == bu.name: - bu.switch() - self._cmap_slicer = bu.status() - for m in self.actors: - try: - if "Slice" in m.name: - m.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - if len(cmaps) > 1: - self.remove("scalarbar") - m2 = m.clone() - m2.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) - m2.scalarbar.name = "scalarbar" - self.add(m2.scalarbar) - except AttributeError: - pass - self.render() + def buttonfunc(_obj, _ename): + bu.switch() + self._cmap_slicer = bu.status() + for m in self.actors: + try: + if "Slice" in m.name: + m.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) + if len(cmaps) > 1: + self.remove("scalarbar") + m2 = m.clone() + m2.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) + m2.scalarbar.name = "scalarbar" + self.add(m2.scalarbar) + except AttributeError: + pass + self.render() if len(cmaps) > 1: bu = self.add_button( @@ -258,8 +257,8 @@ def buttonfunc(evt): bc=["k1"] * len(cmaps), # colors of states size=14, bold=True, - name="slicer_button", ) + bu.pos([0.24, 0.005], "bottom-left") ################# if show_histo: @@ -494,12 +493,11 @@ def sliderA2(widget, event): w2.GetRepresentation().SetTitleHeight(0.016) # add a button - def button_func_mode(evt): - if evt.actor and evt.actor.name == bum.name: - s = volume.mode() - snew = (s + 1) % 2 - volume.mode(snew) - bum.switch() + def button_func_mode(_obj, _ename): + s = volume.mode() + snew = (s + 1) % 2 + volume.mode(snew) + bum.switch() bum = self.add_button( button_func_mode, @@ -511,7 +509,6 @@ def button_func_mode(evt): size=16, bold=0, italic=False, - name="raycast_button", ) bum.frame(c='w') bum.status(volume.mode()) @@ -1657,7 +1654,7 @@ def __init__( c=("white", "white"), bc=("green3","red4"), button_size=25, - button_pos=(0.5,0.08), + button_pos=(0.5,0.04), button_gap=0.055, slider_length=0.5, slider_pos=(0.5,0.055), @@ -1678,7 +1675,9 @@ def __init__( self.is_playing = False self._loop = loop - self.timer_callback_id = self.add_callback("timer", self._handle_timer) + self.timer_callback_id = self.add_callback( + "timer", self._handle_timer, enable_picking=False + ) self.timer_id = None self.play_pause_button = self.add_button( @@ -1688,7 +1687,6 @@ def __init__( font="Kanopus", size=button_size, bc=bc, - name="play_pause_button", ) self.button_oneback = self.add_button( self.onebackward, @@ -1698,7 +1696,6 @@ def __init__( size=button_size, c=c, bc=bc, - name="button_oneback", ) self.button_oneforward = self.add_button( self.oneforward, @@ -1707,7 +1704,6 @@ def __init__( font="Kanopus", size=button_size, bc=bc, - name="button_oneforward", ) d = (1-slider_length)/2 self.slider: SliderWidget = self.add_slider( @@ -1737,25 +1733,22 @@ def resume(self) -> None: self.is_playing = True self.play_pause_button.status(self.PAUSE_SYMBOL) - def toggle(self, evt) -> None: + def toggle(self, _obj, _evt) -> None: """Toggle between play and pause.""" - if evt.actor and evt.actor.name == "play_pause_button": - if not self.is_playing: - self.resume() - else: - self.pause() + if not self.is_playing: + self.resume() + else: + self.pause() - def oneforward(self, evt) -> None: + def oneforward(self, _obj, _evt) -> None: """Advance the animation by one frame.""" - if evt.actor and evt.actor.name == "button_oneforward": - self.pause() - self.set_frame(self.value + 1) + self.pause() + self.set_frame(self.value + 1) - def onebackward(self, evt) -> None: + def onebackward(self, _obj, _evt) -> None: """Go back one frame in the animation.""" - if evt.actor and evt.actor.name == "button_oneback": - self.pause() - self.set_frame(self.value - 1) + self.pause() + self.set_frame(self.value - 1) def set_frame(self, value: int) -> None: """Set the current value of the animation.""" diff --git a/vedo/base.py b/vedo/base.py index b38fd5dd..dbfe8424 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -739,6 +739,12 @@ def show(self, **options): """ return vedo.plotter.show(self, **options) + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd + def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): """Build a thumbnail of the object and return it as an array.""" # speed is about 20Hz for size=[200,200] @@ -2235,20 +2241,20 @@ def layer(self, value=None): self.SetLayerNumber(value) return self - # def pos(self, px=None, py=None): - # """Set/Get the screen-coordinate position.""" - # if isinstance(px, str): - # vedo.logger.error("Use string descriptors only inside the constructor") - # return self - # if px is None: - # return np.array(self.GetPosition(), dtype=int) - # if py is not None: - # p = [px, py] - # else: - # p = px - # assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" - # self.SetPosition(p) - # return self + def pos(self, px=None, py=None): + """Set/Get the screen-coordinate position.""" + if isinstance(px, str): + vedo.logger.error("Use string descriptors only inside the constructor") + return self + if px is None: + return np.array(self.GetPosition(), dtype=int) + if py is not None: + p = [px, py] + else: + p = px + assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" + self.SetPosition(p) + return self def coordinate_system(self, value=None): """ @@ -2285,6 +2291,7 @@ def toggle(self): return self def pickable(self, value=True): + """Set object pickability.""" self.SetPickable(value) return self @@ -2308,6 +2315,12 @@ def ontop(self, value=True): else: self.property.SetDisplayLocationToBackground() return self + + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd ############################################################################### funcs diff --git a/vedo/plotter.py b/vedo/plotter.py index 31087c23..9ac272b5 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -1589,14 +1589,13 @@ def add_button( states=("On", "Off"), c=("w", "w"), bc=("green4", "red4"), - pos=(0.7, 0.05), + pos=(0.7, 0.1), size=24, - font=None, - bold=False, + font="Courier", + bold=True, italic=False, alpha=1, angle=0, - name="Button", ): """ Add a button to the renderer window. @@ -1632,10 +1631,11 @@ def add_button( ![](https://user-images.githubusercontent.com/32848391/50738870-c0fe2500-11d8-11e9-9b78-92754f5c5968.jpg) """ if self.interactor: - bu = addons.Button(fnc, states, c, bc, pos, size, font, bold, italic, alpha, angle, name) + bu = addons.Button(fnc, states, c, bc, pos, size, font, bold, italic, alpha, angle) self.renderer.AddActor2D(bu) self.buttons.append(bu) - bu.function_id = self.add_callback("LeftButtonPress", bu.function) + # bu.function_id = self.add_callback("LeftButtonPress", bu.function) + bu.function_id = bu.add_observer("pick", bu.function, priority=10) return bu def add_spline_tool( @@ -2255,12 +2255,13 @@ def sifunc(iren, ev): sifunc(0, 0) return fractor - def fill_event(self, ename="", pos=()): + def fill_event(self, ename="", pos=(), enable_picking=True): """ - Create an Event object. + Create an Event object with information of what was clicked. - A 2D screen-position can be provided to be picked. - """ + If `enable_picking` is False, no picking will be performed. + This can be useful to avoid double picking when using buttons. + """ if not self.interactor: return Event() @@ -2270,26 +2271,8 @@ def fill_event(self, ename="", pos=()): else: x, y = self.interactor.GetEventPosition() self.renderer = self.interactor.FindPokedRenderer(x, y) - if not self.picker: - self.picker = vtk.vtkPropPicker() - self.picked2d = (x, y) - self.picker.PickProp(x, y, self.renderer) - xp, yp = self.interactor.GetLastEventPosition() - actor = self.picker.GetProp3D() - delta3d = np.array([0, 0, 0]) - if actor: - picked3d = np.array(self.picker.GetPickPosition()) - if isinstance(actor, vedo.base.Base3DProp): # needed! - if actor.picked3d is not None: - delta3d = picked3d - actor.picked3d - actor.picked3d = picked3d - else: - picked3d = None - if not actor: # try 2D - actor = self.picker.GetActor2D() - - dx, dy = x - xp, y - yp + self.picked2d = (x, y) key = self.interactor.GetKeySym() @@ -2314,6 +2297,29 @@ def fill_event(self, ename="", pos=()): if self.interactor.GetAltKey(): key = "Alt+" + key + if enable_picking: + if not self.picker: + self.picker = vtk.vtkPropPicker() + + self.picker.PickProp(x, y, self.renderer) + + xp, yp = self.interactor.GetLastEventPosition() + actor = self.picker.GetProp3D() + delta3d = np.array([0, 0, 0]) + if actor: + picked3d = np.array(self.picker.GetPickPosition()) + if isinstance(actor, vedo.base.Base3DProp): # needed! + if actor.picked3d is not None: + delta3d = picked3d - actor.picked3d + actor.picked3d = picked3d + else: + picked3d = None + + if not actor: # try 2D + actor = self.picker.GetActor2D() + + dx, dy = x - xp, y - yp + event = Event() event.name = ename event.title = self.title @@ -2322,29 +2328,29 @@ def fill_event(self, ename="", pos=()): event.priority = -1 # will be set by the timer wrapper function event.time = time.time() event.at = self.renderers.index(self.renderer) - event.actor = actor - event.picked3d = picked3d event.keyPressed = key # obsolete, will disappear. Use "keypress" event.keypress = key - event.picked2d = (x, y) - event.delta2d = (dx, dy) - event.angle2d = np.arctan2(dy, dx) - event.speed2d = np.sqrt(dx * dx + dy * dy) - event.delta3d = delta3d - event.speed3d = np.sqrt(np.dot(delta3d, delta3d)) - event.isPoints = isinstance(actor, vedo.Points) - event.isMesh = isinstance(actor, vedo.Mesh) - event.isAssembly = isinstance(actor, vedo.Assembly) - event.isVolume = isinstance(actor, vedo.Volume) - event.isPicture = isinstance(actor, vedo.Picture) - event.isActor2D = isinstance(actor, vtk.vtkActor2D) + if enable_picking: + event.actor = actor + event.picked3d = picked3d + event.picked2d = (x, y) + event.delta2d = (dx, dy) + event.angle2d = np.arctan2(dy, dx) + event.speed2d = np.sqrt(dx * dx + dy * dy) + event.delta3d = delta3d + event.speed3d = np.sqrt(np.dot(delta3d, delta3d)) + event.isPoints = isinstance(actor, vedo.Points) + event.isMesh = isinstance(actor, vedo.Mesh) + event.isAssembly = isinstance(actor, vedo.Assembly) + event.isVolume = isinstance(actor, vedo.Volume) + event.isPicture = isinstance(actor, vedo.Picture) + event.isActor2D = isinstance(actor, vtk.vtkActor2D) return event - def add_callback(self, event_name, func, priority=0.0): + def add_callback(self, event_name, func, priority=0.0, enable_picking=True): """ Add a function to be executed while show() is active. - Information about the event can be acquired with method getEvent(). Return a unique id for the callback. @@ -2355,9 +2361,9 @@ def add_callback(self, event_name, func, priority=0.0): - `priority`: event priority (float), - `interactor`: the interactor object, - `at`: renderer nr. where the event occurred + - `keypress`: key pressed as string - `actor`: object picked by the mouse - `picked3d`: point picked in world coordinates - - `keypress`: key pressed as string - `picked2d`: screen coords of the mouse pointer - `delta2d`: shift wrt previous position (to calculate speed, direction) - `delta3d`: ...same but in 3D world coords @@ -2370,6 +2376,9 @@ def add_callback(self, event_name, func, priority=0.0): - `isVolume`: True if of class Volume - `isPicture`: True if of class + If `enable_picking` is False, no picking will be performed. + This can be useful to avoid double picking when using buttons. + Frequently used events are: - `KeyPress`, `KeyRelease`: listen to keyboard events - `LeftButtonPress`, `LeftButtonRelease`: listen to mouse clicks @@ -2417,40 +2426,19 @@ def func(evt): if not self.interactor: return None - # as vtk names are ugly and difficult to remember: - ln = event_name.lower() - if "click" in ln or "button" in ln: - event_name = "LeftButtonPress" - if "right" in ln: - event_name = "RightButtonPress" - elif "mid" in ln: - event_name = "MiddleButtonPress" - if "release" in ln: - event_name = event_name.replace("Press", "Release") - else: - if "key" in ln: - if "release" in ln: - event_name = "KeyRelease" - else: - event_name = "KeyPress" - - if ("mouse" in ln and "mov" in ln) or "over" in ln: - event_name = "MouseMove" - if "timer" in ln: - event_name = "Timer" - - if not event_name.endswith("Event"): - event_name += "Event" - + ######################################### @calldata_type(vtk.VTK_INT) def _func_wrap(iren, ename, timerid=None): - event = self.fill_event(ename=ename) + event = self.fill_event(ename=ename, enable_picking=enable_picking) event.timerid = timerid event.id = cid event.priority = priority self.last_event = event func(event) return ## _func_wrap + ######################################### + + event_name = utils.get_vtk_name_event(event_name) # Not compatible with ProcessEvents() if "MouseMove" in event_name or "Timer" in event_name: @@ -2472,28 +2460,7 @@ def remove_callback(self, cid): """ if self.interactor: if isinstance(cid, str): - # as vtk names are ugly and difficult to remember: - ln = cid.lower() - if "click" in ln or "button" in ln: - cid = "LeftButtonPress" - if "right" in ln: - cid = "RightButtonPress" - elif "mid" in ln: - cid = "MiddleButtonPress" - if "release" in ln: - cid.replace("Press", "Release") - else: - if "key" in ln: - if "release" in ln: - cid = "KeyRelease" - else: - cid = "KeyPress" - if ("mouse" in ln and "mov" in ln) or "over" in ln: - cid = "MouseMove" - if "timer" in ln: - cid = "Timer" - if not cid.endswith("Event"): - cid += "Event" + cid = utils.get_vtk_name_event(cid) self.interactor.RemoveObservers(cid) else: self.interactor.RemoveObserver(cid) @@ -2539,6 +2506,15 @@ def timer_callback(self, action, timer_id=None, dt=1, one_shot=False): vedo.logger.error(e) return timer_id + def add_observer(self, event_name, func, priority=0): + """ + Add a callback function that will be called when an event occurs. + Consider using `add_callback()` instead. + """ + event_name = utils.get_vtk_name_event(event_name) + idd = self.interactor.AddObserver(event_name, func, priority) + return idd + def compute_world_coordinate( self, pos2d, at=None, objs=(), bounds=(), offset=None, pixeltol=None, worldtol=None ): diff --git a/vedo/shapes.py b/vedo/shapes.py index ca7822a4..95fe5447 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2455,7 +2455,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.property.LightingOff() self.name = "Star" @@ -2496,7 +2496,7 @@ def __init__( ps.Update() Mesh.__init__(self, ps.GetOutput(), c, alpha) self.flat() - self.actor.SetPosition(utils.make3d(pos)) + self.pos(utils.make3d(pos)) self.name = "Disc" @@ -2555,7 +2555,7 @@ def __init__( ar.SetResolution(res) ar.Update() Mesh.__init__(self, ar.GetOutput(), c, alpha) - self.actor.SetPosition(self.base) + self.pos(self.base) self.lw(2).lighting("off") self.name = "Arc" @@ -2627,7 +2627,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): pts = utils.versor(self.points()) * r self.points(pts) - self.actor.SetPosition(pos) + self.pos(pos) self.name = "IcoSphere" @@ -2695,7 +2695,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) Mesh.__init__(self, ss.GetOutput(), c, alpha) self.phong() - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Sphere" @@ -2787,7 +2787,7 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): glyph.Update() Mesh.__init__(self, glyph.GetOutput(), alpha=alpha) - self.actor.SetPosition(base) + self.pos(base) self.base = base self.top = centers[-1] self.phong() @@ -2795,7 +2795,7 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): self.mapper.ScalarVisibilityOn() else: self.mapper.ScalarVisibilityOff() - self.property.SetColor(get_color(c)) + self.c(c) self.name = "Spheres" @@ -2824,7 +2824,7 @@ def __init__(self, style=1, r=1.0): pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) atext.InterpolateOn() - self.actor.SetTexture(atext) + self.texture(atext) self.name = "Earth" @@ -2905,7 +2905,7 @@ def __init__( self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Ellipsoid" def asphericity(self): @@ -3042,7 +3042,7 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. tf0.Update() poly = tf0.GetOutput() Mesh.__init__(self, poly, c, alpha) - self.actor.SetPosition(pos) + self.pos(pos) self.wireframe().lw(lw) self.property.LightingOff() @@ -3090,7 +3090,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tf.Update() Mesh.__init__(self, tf.GetOutput(), c, alpha) self.lighting("off") - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Plane" self.top = self.normal self.bottom = np.array([0.0, 0.0, 0.0]) @@ -3204,7 +3204,7 @@ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1 faces = [(0, 1, 2, 3)] Mesh.__init__(self, [pts, faces], color, alpha) - self.actor.SetPosition(p1) + self.pos(p1) self.property.LightingOff() self.name = "Rectangle" @@ -3278,7 +3278,7 @@ def __init__(self, pos=(0, 0, 0), Mesh.__init__(self, pd, c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Box" @@ -3329,7 +3329,7 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al tbs.Update() poly = tbs.GetOutput() Mesh.__init__(self, poly, c=c, alpha=alpha) - self.actor.SetPosition(pos) + self.pos(pos) self.lw(1).lighting("off") self.base = np.array([0.5, 0.5, 0.0]) self.top = np.array([0.5, 0.5, 1.0]) @@ -3403,7 +3403,7 @@ def __init__( tuf.Update() Mesh.__init__(self, tuf.GetOutput(), c, alpha) self.phong() - self.actor.SetPosition(start_pt) + self.pos(start_pt) self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Spring" @@ -3459,7 +3459,7 @@ def __init__( Mesh.__init__(self, pd, c, alpha) self.phong() - self.actor.SetPosition(pos) + self.pos(pos) self.base = base + pos self.top = top + pos self.name = "Cylinder" @@ -3481,7 +3481,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) v = utils.versor(axis) * height / 2 self.base = pos - v self.top = pos + v @@ -3551,7 +3551,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Torus" @@ -3586,7 +3586,7 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Paraboloid" @@ -3619,7 +3619,7 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Hyperboloid" @@ -3803,7 +3803,7 @@ def __init__( poly = tf.GetOutput() Mesh.__init__(self, poly, c, alpha) - self.actor.SetPosition(mq) + self.pos(mq) self.name = "Brace" self.base = q1 self.top = q2 @@ -3833,7 +3833,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0): if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) self.name = "Star3D" @@ -4139,7 +4139,7 @@ def __init__( Mesh.__init__(self, tpoly, c, alpha) self.lighting("off") - self.actor.SetPosition(pos) + self.pos(pos) self.actor.PickableOff() self.actor.DragableOff() self.name = "Text3D" @@ -4492,7 +4492,7 @@ def off(self): self.actor.SetVisibility(False) return self -class Text2D(TextBase, vtk.vtkActor2D): +class Text2D(TextBase, vedo.base.BaseActor2D): """ Create a 2D text object. """ diff --git a/vedo/utils.py b/vedo/utils.py index 218f59df..1434b23d 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -2683,4 +2683,63 @@ def ctf2lut(tvobj, logscale=False): return lut except AttributeError: - return None \ No newline at end of file + return None + + +def get_vtk_name_event(name): + """ + Return the name of a VTK event. + + Frequently used events are: + - KeyPress, KeyRelease: listen to keyboard events + - LeftButtonPress, LeftButtonRelease: listen to mouse clicks + - MiddleButtonPress, MiddleButtonRelease + - RightButtonPress, RightButtonRelease + - MouseMove: listen to mouse pointer changing position + - MouseWheelForward, MouseWheelBackward + - Enter, Leave: listen to mouse entering or leaving the window + - Pick, StartPick, EndPick: listen to object picking + - ResetCamera, ResetCameraClippingRange + - Error, Warning, Char, Timer + + Check the complete list of events here: + https://vtk.org/doc/nightly/html/classvtkCommand.html + """ + # as vtk names are ugly and difficult to remember: + ln = name.lower() + if "click" in ln or "button" in ln: + event_name = "LeftButtonPress" + if "right" in ln: + event_name = "RightButtonPress" + elif "mid" in ln: + event_name = "MiddleButtonPress" + if "release" in ln: + event_name = event_name.replace("Press", "Release") + else: + event_name = name + if "key" in ln: + if "release" in ln: + event_name = "KeyRelease" + else: + event_name = "KeyPress" + + if ("mouse" in ln and "mov" in ln) or "over" in ln: + event_name = "MouseMove" + + words = [ + "pick", "timer", "reset", "enter", "leave", "char", + "error", "warning", "start", "end", "wheel", "clipping", + "range", "camera", "render", + ] + for w in words: + if w in ln: + event_name = event_name.replace(w, w.capitalize()) + + event_name = event_name.replace(" ", "") + + if not event_name.endswith("Event"): + event_name += "Event" + + # print("event_name", event_name) + return event_name + From 888f1509b9739b4450f22b92604d49fdb976362c Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 6 Oct 2023 16:41:29 +0200 Subject: [PATCH 009/251] fix transformations concatenation --- examples/advanced/timer_callback1.py | 15 ++-- examples/advanced/timer_callback2.py | 6 +- examples/basic/buttons.py | 14 ++- examples/basic/input_box.py | 6 +- examples/basic/sliders2.py | 13 ++- vedo/addons.py | 123 +++++++++++++++------------ vedo/base.py | 78 ++++++++++------- vedo/plotter.py | 11 ++- vedo/shapes.py | 23 ++--- vedo/transformations.py | 44 +++++++--- 10 files changed, 194 insertions(+), 139 deletions(-) diff --git a/examples/advanced/timer_callback1.py b/examples/advanced/timer_callback1.py index 582cee23..5f23f57c 100644 --- a/examples/advanced/timer_callback1.py +++ b/examples/advanced/timer_callback1.py @@ -7,14 +7,13 @@ from vedo.pyplot import plot -def bfunc(event): +def bfunc(obj, ename): global timer_id - if event.actor and event.actor.name == "Button": - plotter.timer_callback("destroy", timer_id) - if "Play" in button.status(): - # instruct to call handle_timer() every 10 msec: - timer_id = plotter.timer_callback("create", dt=10) - button.switch() + plotter.timer_callback("destroy", timer_id) + if "Play" in button.status(): + # instruct to call handle_timer() every 10 msec: + timer_id = plotter.timer_callback("create", dt=10) + button.switch() def handle_timer(event): t = time.time() - t0 @@ -33,7 +32,7 @@ def handle_timer(event): t0 = time.time() plotter= Plotter(size=(1200,600)) button = plotter.add_button(bfunc, states=[" Play ","Pause"], size=40) -evntId = plotter.add_callback("timer", handle_timer) +evntid = plotter.add_callback("timer", handle_timer, enable_picking=False) x = np.linspace(0, 4*np.pi, 50) y = np.sin(x) * np.sin(x/12) diff --git a/examples/advanced/timer_callback2.py b/examples/advanced/timer_callback2.py index 039e6917..1e5ec04e 100644 --- a/examples/advanced/timer_callback2.py +++ b/examples/advanced/timer_callback2.py @@ -14,7 +14,7 @@ def __init__(self, *args, **kwargs): self.button = None self.plotter = vedo.Plotter(*args, **kwargs) # setup the Plotter object - self.timerevt = self.plotter.add_callback('timer', self.handle_timer) + self.timerevt = self.plotter.add_callback('timer', self.handle_timer, enable_picking=False) def initialize(self): # initialize here extra elements like buttons etc.. @@ -30,9 +30,7 @@ def show(self, *args, **kwargs): plt = self.plotter.show(*args, **kwargs) return plt - def _buttonfunc(self, event): - if not event.actor or event.actor.name != "Button": - return + def _buttonfunc(self, obj, ename): if self.timer_id is not None: self.plotter.timer_callback("destroy", self.timer_id) if not self.isplaying: diff --git a/examples/basic/buttons.py b/examples/basic/buttons.py index b7903b0a..03401fe2 100644 --- a/examples/basic/buttons.py +++ b/examples/basic/buttons.py @@ -4,11 +4,10 @@ # Define a function that toggles the transparency of a mesh # and changes the button state -def buttonfunc(evt): - if evt.actor and evt.actor.name == "mybutton": - mesh.alpha(1 - mesh.alpha()) # toggle mesh transparency - bu.switch() # change to next status - printc(bu.status(), box="_", dim=True) +def buttonfunc(obj, ename): + mesh.alpha(1 - mesh.alpha()) # toggle mesh transparency + bu.switch() # change to next status + printc(bu.status(), box="_", dim=True) # Load a mesh and set its color to violet mesh = Mesh(dataurl+"magnolia.vtk").c("violet").flat() @@ -19,15 +18,14 @@ def buttonfunc(evt): # Add a button to the plotter with buttonfunc as the callback function bu = plt.add_button( buttonfunc, - pos=(0.7, 0.05), # x,y fraction from bottom left corner + pos=(0.7, 0.1), # x,y fraction from bottom left corner states=["click to hide", "click to show"], # text for each state c=["w", "w"], # font color for each state bc=["dg", "dv"], # background color for each state font="courier", # font type - size=25, # font size + size=30, # font size bold=True, # bold font italic=False, # non-italic font style - name="mybutton", ) # Show the mesh, docstring, and button in the plot diff --git a/examples/basic/input_box.py b/examples/basic/input_box.py index f2324d5e..0561f116 100644 --- a/examples/basic/input_box.py +++ b/examples/basic/input_box.py @@ -23,20 +23,20 @@ def kfunc(evt): bu.text(msg) plt.render() -def bfunc(event): +def bfunc(obj, ename=""): mesh.color(msg) plt.render() plt = Plotter(axes=1) -plt.interactor.RemoveObservers("CharEvent") # might be needed +plt.remove_callback("CharEvent") # might be needed msg = "" plt.add_callback("key press", kfunc) bu = plt.add_button( bfunc, - pos=(0.7, 0.05), # x,y fraction from bottom left corner + pos=(0.5, 0.1), # x,y fraction from bottom left corner states=["input box"], c=["w"], bc=["dg"], # colors of states diff --git a/examples/basic/sliders2.py b/examples/basic/sliders2.py index fd224406..410db1ba 100644 --- a/examples/basic/sliders2.py +++ b/examples/basic/sliders2.py @@ -11,11 +11,10 @@ def slider1(widget, event): widget.title = get_color_name(val) cube.color(val) -def buttonfunc(event): - if event.actor and event.actor.name == "Button": - cube.alpha(1 - cube.alpha()) # toggle mesh transparency - sphere.alpha(1 - sphere.alpha()) - button.switch() # change to next status +def button_func(obj, ename): + cube.alpha(1 - cube.alpha()) # toggle mesh transparency + sphere.alpha(1 - sphere.alpha()) + button.switch() # change to next status ###### sphere = Sphere(r=0.6).alpha(0.9).color(0) @@ -46,8 +45,8 @@ def buttonfunc(event): ###### button = plt.at(1).add_button( - buttonfunc, - pos=(0.5, 0.9), # x,y fraction from bottom left corner + button_func, + pos=(0.5, 0.95), # x,y fraction from bottom left corner states=["HIGH alpha (click here!)", "LOW alpha (click here!)"], c = ["w", "k"], # colors of states (foreground) bc= ["k", "grey"], # colors of states (background) diff --git a/vedo/addons.py b/vedo/addons.py index 5aa0d0d9..dfd32d67 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1264,13 +1264,14 @@ def ScalarBar3D( for a in tacts: a.actor.PickableOff() + a.pos(pos) + a.lighting("off") - mtacts = merge(tacts).lighting("off") + mtacts = merge(tacts) mtacts.actor.PickableOff() scale.actor.PickableOff() sact = Assembly(scales + tacts) - sact.SetPosition(pos) sact.PickableOff() sact.UseBoundsOff() sact.name = "ScalarBar3D" @@ -2212,14 +2213,16 @@ def __init__(self, mesh, pos=3, size=0.08): ##################################################################### -def compute_visible_bounds(actors=None): - """Calculate max meshes bounds and sizes.""" +def compute_visible_bounds(objs=None): + """Calculate max objects bounds and sizes.""" bns = [] - if actors is None: - actors = vedo.plotter_instance.actors - elif not utils.is_sequence(actors): - actors = [actors] + if objs is None: + obj = vedo.plotter_instance.actors + elif not utils.is_sequence(objs): + obj = [objs] + + actors = [ob.actor for ob in obj if hasattr(ob, 'actor') and ob.actor] try: # this block fails for VolumeSlice as vtkImageSlice.GetBounds() returns a pointer.. @@ -2330,9 +2333,10 @@ def Ruler( if units: label += "~" + units - lb = shapes.Text3D(label, pos=(q1 + q2) / 2, s=s, font=font, italic=italic, justify="center") + lb = shapes.Text3D(label, s=s, font=font, italic=italic, justify="center") if label_rotation: lb.rotate_z(label_rotation) + lb.pos((q1 + q2) / 2) x0, x1 = lb.xbounds() gap = [(x1 - x0) / 2, 0, 0] @@ -2343,10 +2347,10 @@ def Ruler( lc2 = shapes.Line(q2 + v / 50, pc2) zs = np.array([0, d / 50 * (1 / units_scale), 0]) - ml1 = shapes.Line(-zs, zs).pos(q1) - ml2 = shapes.Line(-zs, zs).pos(q2) - ml1.rotate_z(tick_angle - 90) - ml2.rotate_z(tick_angle - 90) + ml1 = shapes.Line(-zs, zs) + ml2 = shapes.Line(-zs, zs) + ml1.rotate_z(tick_angle - 90).pos(q1) + ml2.rotate_z(tick_angle - 90).pos(q2) c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=20) c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) @@ -2988,15 +2992,6 @@ def Axes( if not ylabel_color: ylabel_color = yline_color if not zlabel_color: zlabel_color = zline_color - # vtk version<9 dont like depthpeeling: force switching off grids - if settings.use_depth_peeling and not utils.vtk_version_at_least(9): - xygrid = False - yzgrid = False - zxgrid = False - xygrid2 = False - yzgrid2 = False - zxgrid2 = False - if tip_size is None: tip_size = 0.005 * gscale if not ztitle: @@ -3044,6 +3039,15 @@ def Axes( zticks_str[-1] = "" zhighlight_zero = False + xrange = (x0, x1) + yrange = (y0, y1) + zrange = (z0, z1) + + print("xrange", xrange) + print("yrange", yrange) + print("zrange", zrange) + print("dx, dy, dz", dx, dy, dz) + ################################################ axes lines lines = [] if xtitle: @@ -3256,10 +3260,10 @@ def Axes( else: cx = shapes.Cone((dx,0,0), r=tip_size, height=tip_size*2, axis=(1,0,0), c=xline_color, res=12) - if xyshift: cx.shift(0,0,xyshift*dz) - if zxshift: cx.shift(0,zxshift*dy,0) - if xshift_along_y: cx.shift(0,xshift_along_y*dy,0) - if xshift_along_z: cx.shift(0,0,xshift_along_z*dz) + # if xyshift: cx.shift(0,0,xyshift*dz) + # if zxshift: cx.shift(0,zxshift*dy,0) + # if xshift_along_y: cx.shift(0,xshift_along_y*dy,0) + # if xshift_along_z: cx.shift(0,0,xshift_along_z*dz) cx.name = "xTipCone" cones.append(cx) @@ -3338,8 +3342,8 @@ def Axes( zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) - zmajticks.rotate_z(-45 + zaxis_rotation) - zmajticks.rotate_y(-90) + # zmajticks.rotate_x(-90) + # zmajticks.rotate_z(-45 + zaxis_rotation) if yzshift: zmajticks.shift(yzshift*dx,0,0) if zxshift: zmajticks.shift(0,zxshift*dy,0) if zshift_along_x: zmajticks.shift(zshift_along_x*dx,0,0) @@ -3524,25 +3528,31 @@ def Axes( xoffs, yoffs, zoffs = xlabel_offset else: xoffs, yoffs, zoffs = 0, xlabel_offset, 0 + xlab = shapes.Text3D( - t, s=xlabel_size * text_scale * gscale, font=label_font, justify=jus + t, s=xlabel_size * text_scale * gscale, font=label_font, justify=jus, + c=xlabel_color, ) tb = xlab.ybounds() # must be ybounds: height of char + v = (xticks_float[i], 0, 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) - xlab.pos(v + offs) + if xaxis_rotation: xlab.rotate_x(xaxis_rotation) - if zRot: xlab.rotate_z(zRot) - if xRot: xlab.rotate_x(xRot) if yRot: xlab.rotate_y(yRot) + if xRot: xlab.rotate_x(xRot) + if zRot: xlab.rotate_z(zRot) + + xlab.pos(v + offs) if xyshift: xlab.shift(0,0,xyshift*dz) if zxshift: xlab.shift(0,zxshift*dy,0) if xshift_along_y: xlab.shift(0,xshift_along_y*dy,0) if xshift_along_z: xlab.shift(0,0,xshift_along_z*dz) + xlab.name = f"xNumericLabel{i}" - xlab.actor.SetUseBounds(x_use_bounds) - labels.append(xlab.c(xlabel_color)) + xlab.use_bounds(x_use_bounds) + labels.append(xlab) if ylabel_size and ytitle: @@ -3581,12 +3591,14 @@ def Axes( tb = ylab.ybounds() # must be ybounds: height of char v = (0, yticks_float[i], 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) - ylab.pos(v + offs) + if yaxis_rotation: ylab.rotate_y(yaxis_rotation) if zRot: ylab.rotate_z(zRot) if yRot: ylab.rotate_y(yRot) if xRot: ylab.rotate_x(xRot) + + ylab.pos(v + offs) if xyshift: ylab.shift(0,0,xyshift*dz) if yzshift: ylab.shift(yzshift*dx,0,0) if yshift_along_x: ylab.shift(yshift_along_x*dx,0,0) @@ -3638,14 +3650,16 @@ def Axes( if xRot: zlab.rotate_y(-xRot) # ..second zlab.rotate_x(90 + zRot) # ..first - zlab.pos(v + offs) + if zaxis_rotation: zlab.rotate_z(zaxis_rotation) + + zlab.pos(v + offs) if yzshift: zlab.shift(yzshift*dx,0,0) if zxshift: zlab.shift(0,zxshift*dy,0) if zshift_along_x: zlab.shift(zshift_along_x*dx,0,0) if zshift_along_y: zlab.shift(0,zshift_along_y*dy,0) - zlab.actor.SetUseBounds(z_use_bounds) + zlab.use_bounds(z_use_bounds) zlab.name = f"zNumericLabel{i}" labels.append(zlab.c(zlabel_color)) @@ -3712,9 +3726,9 @@ def Axes( xt.shift(0, xshift_along_y * dy, 0) if xshift_along_z: xt.shift(0, 0, xshift_along_z * dz) - xt.actor.SetUseBounds(x_use_bounds) + xt.use_bounds(x_use_bounds) if xtitle == " ": - xt.actor.SetUseBounds(False) + xt.use_bounds(False) xt.name = f"xtitle {xtitle}" titles.append(xt) if xtitle_box: @@ -3777,9 +3791,9 @@ def Axes( if xyshift: yt.shift(0, 0, xyshift*dz) if yshift_along_x: yt.shift(yshift_along_x*dx, 0, 0) if yshift_along_z: yt.shift(0, 0, yshift_along_z*dz) - yt.actor.SetUseBounds(y_use_bounds) + yt.use_bounds(y_use_bounds) if ytitle == " ": - yt.actor.SetUseBounds(False) + yt.use_bounds(False) yt.name = f"ytitle {ytitle}" titles.append(yt) if ytitle_box: @@ -3844,9 +3858,9 @@ def Axes( if zxshift: zt.shift(0,zxshift*dy,0) if zshift_along_x: zt.shift(zshift_along_x*dx,0,0) if zshift_along_y: zt.shift(0,zshift_along_y*dy,0) - zt.actor.SetUseBounds(z_use_bounds) + zt.use_bounds(z_use_bounds) if ztitle == " ": - zt.actor.SetUseBounds(False) + zt.use_bounds(False) zt.name = f"ztitle {ztitle}" titles.append(zt) @@ -3866,7 +3880,7 @@ def Axes( italic=htitle_italic, ) if htitle_rotation: - htit.actor.RotateX(htitle_rotation) + htit.rotate_x(htitle_rotation) wpos = [(0.5 + htitle_offset[0]) * dx, (1 + htitle_offset[1]) * dy, htitle_offset[2] * dz] htit.pos(wpos) if xyshift: @@ -3878,15 +3892,16 @@ def Axes( acts = titles + lines + labels + grids + framelines acts += highlights + majorticks + minorticks + cones orig = (min_bns[0], min_bns[2], min_bns[4]) + # print("orig", orig) for a in acts: + # a.shift(orig) + # a.shift(-1,0,0) a.actor.PickableOff() - a.actor.AddPosition(orig) a.property.LightingOff() asse = Assembly(acts) - asse.SetOrigin(orig) asse.PickableOff() asse.name = "Axes" - return asse + return acts def add_global_axes(axtype=None, c=None, bounds=()): @@ -4176,6 +4191,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): oc_actor.GetProperty().SetColor(lc) oc_actor.PickableOff() oc_actor.UseBoundsOn() + oc_actor.LightingOff() plt.axes_instances[r] = oc_actor plt.add(oc_actor) @@ -4191,6 +4207,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 8: vbb = compute_visible_bounds()[0] + print("vbb", vbb) ca = vtk.vtkCubeAxesActor() ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) @@ -4208,7 +4225,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca - plt.add(ca) + plt.renderer.AddActor(ca) elif plt.axes == 9: vbb = compute_visible_bounds()[0] @@ -4222,7 +4239,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca.actor.PickableOff() ca.actor.UseBoundsOff() plt.axes_instances[r] = ca - plt.add(ca) + plt.renderer.AddActor(ca) elif plt.axes == 10: vbb = compute_visible_bounds()[0] @@ -4240,7 +4257,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca = xc + yc + zc ca.PickableOff() ca.UseBoundsOn() - plt.add(ca) + plt.renderer.AddActor(ca) plt.axes_instances[r] = ca elif plt.axes == 11: @@ -4251,7 +4268,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): gr.lighting("off").actor.PickableOff() gr.actor.UseBoundsOff() plt.axes_instances[r] = gr - plt.add(gr) + plt.renderer.AddActor(gr) elif plt.axes == 12: polaxes = vtk.vtkPolarAxesActor() @@ -4282,7 +4299,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): polaxes.UseBoundsOn() polaxes.PickableOff() plt.axes_instances[r] = polaxes - plt.add(polaxes) + plt.renderer.AddActor(polaxes) elif plt.axes == 13: # draws a simple ruler at the bottom of the window @@ -4307,7 +4324,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls - plt.add(ls) + plt.renderer.AddActor(ls) elif plt.axes == 14: try: diff --git a/vedo/base.py b/vedo/base.py index dbfe8424..97bfc538 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -380,23 +380,32 @@ def draggable(self, value=None): # NOT FUNCTIONAL? return self - def _move(self): - m = self.transform.T.GetMatrix() - M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] - if np.allclose(M - np.eye(4), 0): + def _move(self, LT, concatenate=True, deep_copy=True): + + if LT.is_identity(): return self + if concatenate: + self.transform.concatenate(LT) + tp = vtk.vtkTransformPolyDataFilter() - tp.SetTransform(self.transform.T) + tp.SetTransform(LT.T) tp.SetInputData(self) tp.Update() out = tp.GetOutput() - self.DeepCopy(out) + print("_move", self.transform) + + if deep_copy: + self.DeepCopy(out) + else: + self.ShallowCopy(out) + self.point_locator = None self.cell_locator = None self.line_locator = None return self + def pos(self, x=None, y=None, z=None): """Set/Get object position.""" @@ -412,20 +421,18 @@ def pos(self, x=None, y=None, z=None): elif z is None: # assume x,y is of the form x, y z = 0 - # try: - self.transform.set_position([x, y, z]) - return self._move() + q = self.transform.position + LT = LinearTransform() + LT.translate([x,y,z]-q) + return self._move(LT) def shift(self, dx=0, dy=0, dz=0): """Add a vector to the current object position.""" if utils.is_sequence(dx): - if len(dx) == 2: - self.transform.translate([dx[0], dx[1], 0]) - else: - self.transform.translate(dx) - else: - self.transform.translate([dx, dy, dz]) - return self._move() + utils.make3d(dx) + dx, dy, dz = dx + LT = LinearTransform().translate([dx, dy, dz]) + return self._move(LT) def x(self, val=None): """Set/Get object position along x axis.""" @@ -468,8 +475,10 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ - self.rotate(angle, axis, point, rad) - return self._move() + # self.rotate(angle, axis, point, rad) + LT = LinearTransform() + LT.rotate(angle, axis, point, rad) + return self._move(LT) def rotate_x(self, angle, rad=False, around=None): """ @@ -477,8 +486,8 @@ def rotate_x(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - self.transform.rotate_x(angle, rad, around) - return self._move() + LT = LinearTransform().rotate_x(angle, rad, around) + return self._move(LT) def rotate_y(self, angle, rad=False, around=None): """ @@ -486,8 +495,8 @@ def rotate_y(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - self.transform.rotate_y(angle, rad, around) - return self._move() + LT = LinearTransform().rotate_y(angle, rad, around) + return self._move(LT) def rotate_z(self, angle, rad=False, around=None): """ @@ -495,15 +504,15 @@ def rotate_z(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ - self.transform.rotate_z(angle, rad, around) - return self._move() + LT = LinearTransform().rotate_z(angle, rad, around) + return self._move(LT) #TODO def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): return self - def scale(self, s=None, reset=False): + def scale(self, s=None, reset=False, origin=True): """ Set/get object's scaling factor. @@ -512,18 +521,25 @@ def scale(self, s=None, reset=False): scaling factor(s). reset : (bool) if True previous scaling factors are ignored. + origin : (bool) + if True scaling is applied with respect to object's position, + otherwise is applied respect to (0,0,0). Note: use `s=(sx,sy,sz)` to scale differently in the three coordinates. """ if s is None: return np.array(self.transform.T.GetScale()) - + + LT = LinearTransform() if reset: - self.transform.set_scale(s) + LT.set_scale(s) else: - self.transform.scale(s) - return self._move() + if origin: + LT.scale(s, origin=self.transform.position) + else: + LT.scale(s, origin=False) + return self._move(LT) def align_to_bounding_box(self, msh, rigid=False): @@ -572,8 +588,8 @@ def align_to_bounding_box(self, msh, rigid=False): lmt.Update() T = LinearTransform(lmt) - self.apply_transform(T) - return self + # self.apply_transform(T) + return self._move(LT) def on(self): """Switch on object visibility. Object is not removed.""" diff --git a/vedo/plotter.py b/vedo/plotter.py index 9ac272b5..45f8f3fc 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -856,9 +856,9 @@ def add(self, *actors, at=None): return self - def remove(self, *actors, at=None): + def remove(self, *objs, at=None): """ - Remove input object to the internal list of actors to be shown. + Remove input object to the internal list of objects to be shown. This method is typically used in loops or callback functions. Objects to be removed can be referenced by their assigned name. @@ -871,7 +871,7 @@ def remove(self, *actors, at=None): else: ren = self.renderer - actors = utils.flatten(actors) + actors = [a.actor for a in utils.flatten(objs) if a] actors_in_ren = None @@ -921,6 +921,11 @@ def remove(self, *actors, at=None): del self.actors[i] return self + + # @property + # def actors(self): + # """Return the list of actors.""" + # return self._actors def remove_lights(self): """Remove all the present lights in the current renderer.""" diff --git a/vedo/shapes.py b/vedo/shapes.py index 95fe5447..37c774af 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1994,9 +1994,9 @@ def __init__( tf.Update() Mesh.__init__(self, tf.GetOutput(), c, alpha) + self.pos(start_pt) self.phong().lighting("plastic") - self.actor.SetPosition(start_pt) self.actor.PickableOff() self.actor.DragableOff() self.base = np.array(start_pt, dtype=float) @@ -2197,7 +2197,7 @@ def __init__( tf.Update() Mesh.__init__(self, tf.GetOutput(), c="k1") - self.actor.SetPosition(start_pt) + self.pos(start_pt) self.lighting("off") self.actor.DragableOff() self.actor.PickableOff() @@ -2358,7 +2358,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): Mesh.__init__(self, [np.c_[x, y], faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.actor.SetPosition(pos) + self.pos(pos) self.property.LightingOff() self.name = "Polygon " + str(nsides) @@ -4686,8 +4686,9 @@ class CornerAnnotation(vtk.vtkCornerAnnotation, TextBase): """ def __init__(self, c=None): - vtk.vtkCornerAnnotation.__init__(self) - TextBase.__init__(self) + # vtk.vtkCornerAnnotation.__init__(self) + # TextBase.__init__(self) + super().__init__() self.property = self.GetTextProperty() @@ -4704,8 +4705,8 @@ def __init__(self, c=None): else: c = (0.5, 0.5, 0.5) - self.actor.SetNonlinearFontScaleFactor(1 / 2.75) - self.actor.PickableOff() + self.SetNonlinearFontScaleFactor(1 / 2.75) + self.PickableOff() self.property.SetColor(get_color(c)) self.property.SetBold(False) self.property.SetItalic(False) @@ -4720,9 +4721,9 @@ def size(self, s, linear=False): `f' = linearScale * pow(f,nonlinearScale)` """ if linear: - self.actor.SetLinearFontScaleFactor(s * 5.5) + self.SetLinearFontScaleFactor(s * 5.5) else: - self.actor.SetNonlinearFontScaleFactor(s / 2.75) + self.SetNonlinearFontScaleFactor(s / 2.75) return self def text(self, txt, pos=2): @@ -4827,9 +4828,9 @@ def build_img_plt(formula, tfile): build_img_plt(formula, tmp_file.name) Picture.__init__(self, tmp_file.name, channels=4) + self.pos(pos) self.alpha(alpha) - self.actor.SetScale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) - self.actor.SetPosition(pos) + self.scale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) self.name = "Latex" except: diff --git a/vedo/transformations.py b/vedo/transformations.py index 2a88963c..f7b5c36d 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -65,11 +65,13 @@ def __init__(self, T=None): def __str__(self): - return "Transformation Matrix 4x4:\n" + str(self.matrix) - + s = "Transformation Matrix 4x4:\n" + s+= str(self.matrix) + s+= f"\n({self.n_concatenated_transforms} concatenated transforms)" + return s + def __repr__(self): - return "Transformation Matrix 4x4:\n" + str(self.matrix) - + return self.__str__() def apply_to(self, obj): """Apply transformation.""" @@ -113,6 +115,14 @@ def invert(self): self.inverse_flag = bool(self.T.GetInverseFlag()) return self + def is_identity(self): + """Check if identity.""" + m = self.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] + if np.allclose(M - np.eye(4), 0): + return True + return False + def compute_inverse(self): """Compute inverse.""" return LinearTransform(self.T.GetInverse()) @@ -125,7 +135,10 @@ def concatenate(self, T, pre_multiply=False): """Post multiply.""" if pre_multiply: self.T.PreMultiply() - self.T.Concatenate(T.T) + try: + self.T.Concatenate(T) + except: + self.T.Concatenate(T.T) self.T.PostMultiply() return self @@ -139,14 +152,20 @@ def n_concatenated_transforms(self): return self.T.GetNumberOfConcatenatedTransforms() def translate(self, p): - """Translate.""" + """Translate, same as `shift`.""" + print("translate", p) self.T.Translate(*p) return self - def scale(self, s=None, origin=True): + def shift(self, p): + """Shift, same as `translate`.""" + return self.translate(*p) + + def scale(self, s, origin=True): """Scale.""" if not _is_sequence(s): s = [s, s, s] + if origin is True: p = np.array(self.T.GetPosition()) if np.linalg.norm(p) > 0: @@ -155,11 +174,14 @@ def scale(self, s=None, origin=True): self.T.Translate(p) else: self.T.Scale(*s) + elif _is_sequence(origin): - p = np.array(self.T.GetPosition()) - self.T.Translate(-p) + print("sdf") + origin = np.asarray(origin) + self.T.Translate(-origin) self.T.Scale(*s) - self.T.Translate(p) + self.T.Translate(origin) + else: self.T.Scale(*s) return self @@ -253,7 +275,7 @@ def set_position(self, p): q = np.array(self.T.GetPosition()) self.T.Translate(p - q) return self - + def set_scale(self, s): """Set absolute scale.""" if not _is_sequence(s): From 99e82a2f5b7c8351f55f23b8db8abb32069aa6cc Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 6 Oct 2023 17:46:24 +0200 Subject: [PATCH 010/251] fix transformations concatenation 3 --- vedo/addons.py | 67 ++++++++++++++++++----------------------- vedo/assembly.py | 4 +-- vedo/base.py | 2 +- vedo/plotter.py | 4 ++- vedo/transformations.py | 2 -- 5 files changed, 35 insertions(+), 44 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index dfd32d67..1e1512ee 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -3039,15 +3039,6 @@ def Axes( zticks_str[-1] = "" zhighlight_zero = False - xrange = (x0, x1) - yrange = (y0, y1) - zrange = (z0, z1) - - print("xrange", xrange) - print("yrange", yrange) - print("zrange", zrange) - print("dx, dy, dz", dx, dy, dz) - ################################################ axes lines lines = [] if xtitle: @@ -3260,10 +3251,10 @@ def Axes( else: cx = shapes.Cone((dx,0,0), r=tip_size, height=tip_size*2, axis=(1,0,0), c=xline_color, res=12) - # if xyshift: cx.shift(0,0,xyshift*dz) - # if zxshift: cx.shift(0,zxshift*dy,0) - # if xshift_along_y: cx.shift(0,xshift_along_y*dy,0) - # if xshift_along_z: cx.shift(0,0,xshift_along_z*dz) + if xyshift: cx.shift(0,0,xyshift*dz) + if zxshift: cx.shift(0,zxshift*dy,0) + if xshift_along_y: cx.shift(0,xshift_along_y*dy,0) + if xshift_along_z: cx.shift(0,0,xshift_along_z*dz) cx.name = "xTipCone" cones.append(cx) @@ -3342,8 +3333,8 @@ def Axes( zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) - # zmajticks.rotate_x(-90) - # zmajticks.rotate_z(-45 + zaxis_rotation) + zmajticks.rotate_y(-90) + zmajticks.rotate_z(-45 + zaxis_rotation) if yzshift: zmajticks.shift(yzshift*dx,0,0) if zxshift: zmajticks.shift(0,zxshift*dy,0) if zshift_along_x: zmajticks.shift(zshift_along_x*dx,0,0) @@ -3484,8 +3475,8 @@ def Axes( if ticks: zminticks = merge(ticks).c(zlabel_color) - zminticks.rotate_z(-45 + zaxis_rotation) zminticks.rotate_y(-90) + zminticks.rotate_z(-45 + zaxis_rotation) if yzshift: zminticks.shift(yzshift*dx,0,0) if zxshift: zminticks.shift(0,zxshift*dy,0) if zshift_along_x: zminticks.shift(zshift_along_x*dx,0,0) @@ -3594,9 +3585,9 @@ def Axes( if yaxis_rotation: ylab.rotate_y(yaxis_rotation) - if zRot: ylab.rotate_z(zRot) - if yRot: ylab.rotate_y(yRot) if xRot: ylab.rotate_x(xRot) + if yRot: ylab.rotate_y(yRot) + if zRot: ylab.rotate_z(zRot) ylab.pos(v + offs) if xyshift: ylab.shift(0,0,xyshift*dz) @@ -3646,13 +3637,14 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zlab.rotate_z(angle + yRot) # vtk inverts order of rotations + + zlab.rotate_x(90 + zRot) # ..first if xRot: zlab.rotate_y(-xRot) # ..second - zlab.rotate_x(90 + zRot) # ..first + zlab.rotate_z(angle + yRot) if zaxis_rotation: - zlab.rotate_z(zaxis_rotation) + zlab.rotate_z(zaxis_rotation) ###CAN BE BUG zlab.pos(v + offs) if yzshift: zlab.shift(yzshift*dx,0,0) @@ -3705,12 +3697,11 @@ def Axes( ) if xtitle_backface_color: xt.backcolor(xtitle_backface_color) - if zRot: - xt.rotate_z(zRot) - if xRot: - xt.rotate_x(xRot) - if yRot: - xt.rotate_y(yRot) + + if xRot: xt.rotate_x(xRot) + if yRot: xt.rotate_y(yRot) + if zRot: xt.rotate_z(zRot) + shift = 0 if xlab: # xlab is the last created numeric text label.. lt0, lt1 = xlab.GetBounds()[2:4] @@ -3776,9 +3767,9 @@ def Axes( if ytitle_backface_color: yt.backcolor(ytitle_backface_color) - if zRot: yt.rotate_z(zRot) - if yRot: yt.rotate_y(yRot) if xRot: yt.rotate_x(xRot) + if yRot: yt.rotate_y(yRot) + if zRot: yt.rotate_z(zRot) shift = 0 if ylab: # this is the last created num label.. @@ -3839,10 +3830,10 @@ def Axes( angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 - zt.rotate_z(angle + yRot) # vtk inverts order of rotations + zt.rotate_x(90 + zRot) # ..first if xRot: zt.rotate_y(-xRot) # ..second - zt.rotate_x(90 + zRot) # ..first + zt.rotate_z(angle + yRot) shift = 0 if zlab: # this is the last created one.. @@ -3892,16 +3883,15 @@ def Axes( acts = titles + lines + labels + grids + framelines acts += highlights + majorticks + minorticks + cones orig = (min_bns[0], min_bns[2], min_bns[4]) - # print("orig", orig) for a in acts: - # a.shift(orig) - # a.shift(-1,0,0) + a.shift(orig) a.actor.PickableOff() a.property.LightingOff() asse = Assembly(acts) asse.PickableOff() asse.name = "Axes" - return acts + print(asse) + return asse def add_global_axes(axtype=None, c=None, bounds=()): @@ -4058,7 +4048,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 40 * s, (y0 + y1) / 2, 0] yt = shapes.Text3D("y", pos=(0, 0, 0), s=aves / 40 * s, c=ycol) - yt.pos(wpos).rotate_z(90) + yt.rotate_z(90) + yt.pos(wpos) acts += [yl, yc, yt] if dz > aves / 100: @@ -4076,8 +4067,9 @@ def add_global_axes(axtype=None, c=None, bounds=()): if centered: wpos = [-aves / 50 * s, -aves / 50 * s, (z0 + z1) / 2] zt = shapes.Text3D("z", pos=(0, 0, 0), s=aves / 40 * s, c=zcol) - zt.pos(wpos).rotate_z(45) + zt.rotate_z(45) zt.rotate_x(90) + zt.pos(wpos) acts += [zl, zc, zt] for a in acts: a.actor.PickableOff() @@ -4207,7 +4199,6 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 8: vbb = compute_visible_bounds()[0] - print("vbb", vbb) ca = vtk.vtkCubeAxesActor() ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) diff --git a/vedo/assembly.py b/vedo/assembly.py index f10ba523..d83e03f9 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -226,7 +226,7 @@ def __init__(self, *meshs): else: meshs = vedo.utils.flatten(meshs) - self.actors = meshs + self.actors = [m.actor for m in meshs] if meshs and hasattr(meshs[0], "top"): self.base = meshs[0].base @@ -236,7 +236,7 @@ def __init__(self, *meshs): self.top = None scalarbars = [] - for a in meshs: + for a in self.actors: if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): self.AddPart(a) if hasattr(a, "scalarbar") and a.scalarbar is not None: diff --git a/vedo/base.py b/vedo/base.py index 97bfc538..0a889c60 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -394,7 +394,7 @@ def _move(self, LT, concatenate=True, deep_copy=True): tp.Update() out = tp.GetOutput() - print("_move", self.transform) + # print("_move", self.transform) if deep_copy: self.DeepCopy(out) diff --git a/vedo/plotter.py b/vedo/plotter.py index 45f8f3fc..87883cfb 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2677,10 +2677,12 @@ def _scan_input(self, wannabeacts): wannabeacts2 = [] for a in wannabeacts: + # wannabeacts2.append(a.actor) + try: wannabeacts2.append(a.actor) except: - pass + wannabeacts2.append(a) scannedacts = [] for a in wannabeacts2: # scan content of list diff --git a/vedo/transformations.py b/vedo/transformations.py index f7b5c36d..2c2e7387 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -153,7 +153,6 @@ def n_concatenated_transforms(self): def translate(self, p): """Translate, same as `shift`.""" - print("translate", p) self.T.Translate(*p) return self @@ -176,7 +175,6 @@ def scale(self, s, origin=True): self.T.Scale(*s) elif _is_sequence(origin): - print("sdf") origin = np.asarray(origin) self.T.Translate(-origin) self.T.Scale(*s) From fb2828cd4e986fb2622b2678513c560eeb07eb73 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 6 Oct 2023 19:52:55 +0200 Subject: [PATCH 011/251] plotter fixes --- vedo/addons.py | 7 +- vedo/assembly.py | 70 ++++++------ vedo/base.py | 7 +- vedo/plotter.py | 275 ++++++++++++++++++++------------------------- vedo/pointcloud.py | 6 +- vedo/pyplot.py | 19 ++-- vedo/shapes.py | 2 +- 7 files changed, 178 insertions(+), 208 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 1e1512ee..5f91ba93 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2218,11 +2218,11 @@ def compute_visible_bounds(objs=None): bns = [] if objs is None: - obj = vedo.plotter_instance.actors + objs = vedo.plotter_instance.actors elif not utils.is_sequence(objs): - obj = [objs] + objs = [objs] - actors = [ob.actor for ob in obj if hasattr(ob, 'actor') and ob.actor] + actors = [ob.actor for ob in objs if hasattr(ob, 'actor') and ob.actor] try: # this block fails for VolumeSlice as vtkImageSlice.GetBounds() returns a pointer.. @@ -3890,7 +3890,6 @@ def Axes( asse = Assembly(acts) asse.PickableOff() asse.name = "Axes" - print(asse) return asse diff --git a/vedo/assembly.py b/vedo/assembly.py index d83e03f9..32e46386 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -225,12 +225,15 @@ def __init__(self, *meshs): meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) + + self.actor = self - self.actors = [m.actor for m in meshs] + self.objects = meshs + self.actors = [m.actor for m in self.objects] - if meshs and hasattr(meshs[0], "top"): - self.base = meshs[0].base - self.top = meshs[0].top + if self.objects: + self.base = self.objects[0].base + self.top = self.objects[0].top else: self.base = None self.top = None @@ -248,9 +251,12 @@ def __init__(self, *meshs): self.scalarbar = scalarbars[0] self.pipeline = vedo.utils.OperationNode( - "Assembly", parents=meshs, comment=f"#meshes {len(meshs)}", c="#f08080" + "Assembly", + parents=self.objects, + comment=f"#meshes {len(self.objects)}", + c="#f08080", ) - ################################################################### + ########################################## def _repr_html_(self): """ @@ -320,40 +326,41 @@ def __add__(self, obj): Add an object to the assembly """ if isinstance(obj, vtk.vtkProp3D): - self.AddPart(obj) - self.actors.append(obj) + self.objects.append(obj) + self.actors.append(obj.actor) + self.AddPart(obj.actor) - if hasattr(obj, "scalarbar") and obj.scalarbar is not None: - if self.scalarbar is None: - self.scalarbar = obj.scalarbar - return self + if hasattr(obj, "scalarbar") and obj.scalarbar is not None: + if self.scalarbar is None: + self.scalarbar = obj.scalarbar + return self - def unpack_group(scalarbar): - if isinstance(scalarbar, Group): - return scalarbar.unpack() - else: - return scalarbar + def unpack_group(scalarbar): + if isinstance(scalarbar, Group): + return scalarbar.unpack() + else: + return scalarbar - if isinstance(self.scalarbar, Group): - self.scalarbar += unpack_group(obj.scalarbar) - else: - self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) - self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") + if isinstance(self.scalarbar, Group): + self.scalarbar += unpack_group(obj.scalarbar) + else: + self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) + self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") return self def __contains__(self, obj): """Allows to use ``in`` to check if an object is in the Assembly.""" - return obj in self.actors + return obj in self.objects def clone(self): """Make a clone copy of the object.""" newlist = [] - for a in self.actors: + for a in self.objects: newlist.append(a.clone()) return Assembly(newlist) - def unpack(self, i=None, transformed=False): + def unpack(self, i=None): """Unpack the list of objects from a ``Assembly``. If `i` is given, get `i-th` object from a ``Assembly``. @@ -363,19 +370,12 @@ def unpack(self, i=None, transformed=False): Examples: - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) """ - if transformed: - actors = [] - for a in self.actors: - actors.append(a.clone(transformed=True)) - else: - actors = self.actors - if i is None: - return actors + return self.objects elif isinstance(i, int): - return actors[i] + return self.objects[i] elif isinstance(i, str): - for m in actors: + for m in self.objects: if i in m.name: return m diff --git a/vedo/base.py b/vedo/base.py index 0a889c60..04b722b9 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -382,6 +382,11 @@ def draggable(self, value=None): # NOT FUNCTIONAL? def _move(self, LT, concatenate=True, deep_copy=True): + if isinstance(self, vedo.assembly.Assembly): + self.SetPosition(LT.position) + return self + # print(type(self), LT.position) + if LT.is_identity(): return self @@ -891,7 +896,7 @@ def points(self, pts=None, transformed=True): self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.point_locator = None self.cell_locator = None - self.transform = None + self.transform = LinearTransform() return self diff --git a/vedo/plotter.py b/vedo/plotter.py index 87883cfb..2e82c891 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -43,7 +43,6 @@ class Event: "at", "actor", "picked3d", - "keyPressed", # obsolete, will disappear. Use "keypress" "keypress", "picked2d", "delta2d", @@ -74,7 +73,7 @@ def __repr__(self): f = "---------- ----------\n" for n in self.__slots__: try: - if n == "actor" and self.actor and self.actor.name: + if n == "actor" and self.actor and self.actor.data and self.actor.data.name: f += f"event.{n} = {self.actor.name} ({self.actor.npoints} points)\n" else: f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" @@ -400,7 +399,8 @@ def __init__( else: interactive = True - self.actors = [] # list of actors to be shown + self.objects = [] # list of actors to be shown + self.clicked_actor = None # holds the actor that has been clicked self.renderer = None # current renderer self.renderers = [] # list of renderers @@ -752,30 +752,9 @@ def __init__( if settings.enable_default_keyboard_callbacks: self.interactor.AddObserver("KeyPressEvent", self._keypress) - # self._timer_event_id = None - # if settings.allow_interaction: - # def win_interact(iren, event): # flushing interactor events - # if event == "TimerEvent": - # iren.ExitCallback() - # self._timer_event_id = self.interactor.AddObserver("TimerEvent", win_interact) - ##################################################################### ..init ends here. - # def allow_interaction(self): - # """Call this method from inside a loop to allow mouse and keyboard interaction.""" - # if ( - # self.interactor - # and self._timer_event_id is not None - # and settings.immediate_rendering - # ): - # self._repeatingtimer_id = self.interactor.CreateRepeatingTimer(1) - # self.interactor.Start() - # if self.interactor: - # self.interactor.DestroyTimer(self._repeatingtimer_id) - # self._repeatingtimer_id = None - # return self - def __iadd__(self, actors): self.add(actors) return self @@ -816,10 +795,9 @@ def at(self, nren, yren=None): return self - def add(self, *actors, at=None): + def add(self, *objs, at=None): """ Append the input objects to the internal list of actors to be shown. - This method is typically used in loops or callback functions. Arguments: at : (int) @@ -830,30 +808,23 @@ def add(self, *actors, at=None): else: ren = self.renderer - actors = utils.flatten(actors) - actors = self._scan_input(actors) + objs = utils.flatten(objs) + for ob in objs: + if ob: + self.objects.append(ob) + + acts = self._scan_input(objs) - for a in actors: + for a in acts: if isinstance(a, vtk.vtkInteractorObserver): a.add_to(self) continue - - if a not in self.actors: - self.actors.append(a) - if ren: ren.AddActor(a) - if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.add(ir) - if hasattr(a, "scalarbar") and a.scalarbar: - ren.AddActor(a.scalarbar) - - if hasattr(a, "_isfollower") and a._isfollower: # set by mesh.follow_camera() - a.SetCamera(self.camera) - return self def remove(self, *objs, at=None): @@ -871,33 +842,33 @@ def remove(self, *objs, at=None): else: ren = self.renderer - actors = [a.actor for a in utils.flatten(objs) if a] + objs = [ob for ob in utils.flatten(objs) if ob] - actors_in_ren = None + objects_in_ren = None + objects_r = [] + for a in objs: - actors_r = [] - for i, a in enumerate(actors): - - if isinstance(a, vtk.vtkInteractorObserver): - a.remove_from(self) - continue ### + # if isinstance(a, vtk.vtkInteractorObserver): + # a.remove_from(self) + # continue ### if isinstance(a, str): - if actors_in_ren is None: - actors_in_ren = self.get_meshes( + if objects_in_ren is None: + objects_in_ren = self.get_meshes( include_non_pickables=True, unpack_assemblies=False, ) - for b in set(self.actors + actors_in_ren): + for b in set(self.objects + objects_in_ren): if hasattr(b, "name") and a in b.name: - actors_r.append(b) + objects_r.append(b) else: - actors_r.append(a) + objects_r.append(a) - for a in set(actors_r): + for ob in set(objects_r): if ren: + a = ob.actor ren.RemoveActor(a) if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) @@ -916,16 +887,17 @@ def remove(self, *objs, at=None): for sha in a.trail.shadows: ren.RemoveActor(sha) - if a in self.actors: - i = self.actors.index(a) - del self.actors[i] + for i, ob in enumerate(objs): + if ob in self.objects: + i = self.objects.index(a) + del self.objects[i] return self - # @property - # def actors(self): - # """Return the list of actors.""" - # return self._actors + @property + def actors(self): + """Return the list of actors.""" + return [ob.actor for ob in self.objects if hasattr(ob, "actor")] def remove_lights(self): """Remove all the present lights in the current renderer.""" @@ -943,8 +915,8 @@ def pop(self, at=None): vedo.logger.error("argument of pop() must be an integer") raise RuntimeError() - if self.actors: - self.remove(self.actors[-1], at) + if self.objects: + self.remove(self.objects[-1], at) return self def render(self, resetcam=False): @@ -1072,7 +1044,7 @@ def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=Tru else: acs = renderer.GetViewProps() - actors = [] + objs = [] acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): @@ -1089,8 +1061,8 @@ def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=Tru continue if has_global_axes and a in self.axes_instances[at].actors: continue - actors.append(a) - return actors + objs.append(a.data) + return objs def get_volumes(self, at=None, include_non_pickables=False): """ @@ -1114,7 +1086,7 @@ def get_volumes(self, at=None, include_non_pickables=False): for _ in range(acs.GetNumberOfItems()): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): - vols.append(a) + vols.append(a.data) return vols def reset_camera(self, tight=None): @@ -2670,108 +2642,100 @@ def mode_select(objs): return afru - def _scan_input(self, wannabeacts): + def _scan_input(self, wannabe_acts): # scan the input of show - if not utils.is_sequence(wannabeacts): - wannabeacts = [wannabeacts] + if not utils.is_sequence(wannabe_acts): + wannabe_acts = [wannabe_acts] - wannabeacts2 = [] - for a in wannabeacts: - # wannabeacts2.append(a.actor) - + wannabe_acts2 = [] + for a in wannabe_acts: try: - wannabeacts2.append(a.actor) + wannabe_acts2.append(a.actor) except: - wannabeacts2.append(a) + wannabe_acts2.append(a) # already actor - scannedacts = [] - for a in wannabeacts2: # scan content of list + scanned_acts = [] + for a in wannabe_acts2: # scan content of list if a is None: pass elif isinstance(a, vtk.vtkActor): - scannedacts.append(a) + scanned_acts.append(a) if isinstance(a, vedo.base.BaseActor): if a.shadows: - # a.update_shadows() - scannedacts.extend(a.shadows) + for sh in a.shadows: + scanned_acts.append(sh.actor) - if a.trail and a.trail not in self.actors: - # a.update_trail() - scannedacts.append(a.trail) + if a.trail: + scanned_acts.append(a.trail.actor) # trails may also have shadows: if a.trail.shadows: - # a.trail.update_shadows() - scannedacts.extend(a.trail.shadows) + for sh in a.trail.shadows: + scanned_acts.append(sh.actor) - if a._caption and a._caption not in self.actors: - scannedacts.append(a._caption) + if a._caption: + scanned_acts.append(a._caption) elif isinstance(a, vtk.vtkActor2D): - scannedacts.append(a) + scanned_acts.append(a) elif isinstance(a, vtk.vtkAssembly): - scannedacts.append(a) - if a.trail and a.trail not in self.actors: - scannedacts.append(a.trail) + scanned_acts.append(a) + if a.trail: + scanned_acts.append(a.trail.actor) elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): - scannedacts.append(a) + scanned_acts.append(a.actor) elif isinstance(a, vtk.vtkImageData): - scannedacts.append(vedo.Volume(a)) + scanned_acts.append(vedo.Volume(a).actor) - elif isinstance(a, vedo.TetMesh): + elif isinstance(a, (vedo.TetMesh, vedo.UGrid)): # check ugrid is all made of tets - ugrid = a.inputdata() - uarr = ugrid.GetCellTypesArray() - celltypes = np.unique(utils.vtk2numpy(uarr)) - ncelltypes = len(celltypes) - if ncelltypes > 1 or (ncelltypes == 1 and celltypes[0] != 10): - scannedacts.append(a.tomesh()) - else: - if not ugrid.GetPointData().GetScalars(): - if not ugrid.GetCellData().GetScalars(): - # add dummy array for vtkProjectedTetrahedraMapper to work: - a.celldata["DummyOneArray"] = np.ones(a.ncells) - scannedacts.append(a) - - elif isinstance(a, vedo.UGrid): - scannedacts.append(a.tomesh()) + # ugrid = a + # uarr = ugrid.GetCellTypesArray() + # celltypes = np.unique(utils.vtk2numpy(uarr)) + # ncelltypes = len(celltypes) + # if ncelltypes > 1 or (ncelltypes == 1 and celltypes[0] != 10): + # scanned_acts.append(a.tomesh()) + # else: + # if not ugrid.GetPointData().GetScalars(): + # if not ugrid.GetCellData().GetScalars(): + # # add dummy array for vtkProjectedTetrahedraMapper to work: + # a.celldata["DummyOneArray"] = np.ones(a.ncells) + # scanned_acts.append(a) + scanned_acts.append(a.actor) elif isinstance(a, vtk.vtkVolume): # order matters! dont move above TetMesh - vvol = vedo.Volume(a.GetMapper().GetInput()) - vprop = vtk.vtkVolumeProperty() - vprop.DeepCopy(a.GetProperty()) - vvol.SetProperty(vprop) - scannedacts.append(vvol) + scanned_acts.append(a) elif isinstance(a, str): # assume a 2D comment was given - changed = False # check if one already exists so to just update text - if self.renderer: # might be jupyter - acs = self.renderer.GetActors2D() - acs.InitTraversal() - for i in range(acs.GetNumberOfItems()): - act = acs.GetNextItem() - if isinstance(act, vedo.shapes.Text2D): - aposx, aposy = act.GetPosition() - if aposx < 0.01 and aposy > 0.99: # "top-left" - act.text(a) # update content! no appending nada - changed = True - break - if not changed: - out = vedo.shapes.Text2D(a) # append a new one - scannedacts.append(out) + # changed = False # check if one already exists so to just update text + # if self.renderer: # might be jupyter + # acs = self.renderer.GetActors2D() + # acs.InitTraversal() + # for i in range(acs.GetNumberOfItems()): + # act = acs.GetNextItem() + # if isinstance(act, vedo.shapes.Text2D): + # aposx, aposy = act.GetPosition() + # if aposx < 0.01 and aposy > 0.99: # "top-left" + # act.text(a) # update content! no appending nada + # changed = True + # break + # if not changed: + # out = vedo.shapes.Text2D(a) # append a new one + # scanned_acts.append(out) + scanned_acts.append(vedo.shapes.Text2D(a)) elif isinstance(a, vtk.vtkImageActor): - scannedacts.append(a) + scanned_acts.append(a) elif isinstance(a, vtk.vtkBillboardTextActor3D): - scannedacts.append(a) + scanned_acts.append(a) elif isinstance(a, vtk.vtkLight): self.renderer.AddLight(a) @@ -2780,34 +2744,35 @@ def _scan_input(self, wannabeacts): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) if isinstance(b, vtk.vtkPolyData): - scannedacts.append(vedo.Mesh(b)) + scanned_acts.append(vedo.Mesh(b).actor) elif isinstance(b, vtk.vtkImageData): - scannedacts.append(vedo.Volume(b)) + scanned_acts.append(vedo.Volume(b).actor) - elif "PolyData" in str(type(a)): # assume pyvista or vtkPolydata - scannedacts.append(vedo.Mesh(a)) + elif isinstance(a, vtk.vtkPolyData): + scanned_acts.append(vedo.Mesh(a).actor) - elif "dolfin" in str(type(a)): # assume a dolfin.Mesh object - import vedo.dolfin as dlf - scannedacts.append(dlf.MeshActor(a)) + elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): + scanned_acts.append(a) elif "trimesh" in str(type(a)): - scannedacts.append(utils.trimesh2vedo(a)) + scanned_acts.append(utils.trimesh2vedo(a)) elif "meshlab" in str(type(a)): if "MeshSet" in str(type(a)): for i in range(a.number_meshes()): if a.mesh_id_exists(i): - scannedacts.append(utils.meshlab2vedo(a.mesh(i))) + scanned_acts.append(utils.meshlab2vedo(a.mesh(i))) else: - scannedacts.append(utils.meshlab2vedo(a)) + scanned_acts.append(utils.meshlab2vedo(a)) - elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): - scannedacts.append(a) + elif "dolfin" in str(type(a)): # assume a dolfin.Mesh object + import vedo.dolfin as dlf + scanned_acts.append(dlf.MeshActor(a).actor) else: vedo.logger.error(f"cannot understand input in show(): {type(a)}") - return scannedacts + + return scanned_acts def show( @@ -2985,7 +2950,7 @@ def show( # Backend ############################################################### if settings.default_backend != "vtk": if settings.default_backend in ["k3d"]: - return backends.get_notebook_backend(self.actors) + return backends.get_notebook_backend(self.objects) ######################################################################### for ia in utils.flatten(actors): @@ -3198,16 +3163,15 @@ def clear(self, at=None, deep=False): if deep: renderer.RemoveAllViewProps() else: - for a in set(self.get_meshes() + self.get_volumes() + self.actors + self.axes_instances): - if isinstance(a, vedo.shapes.Text2D): + for ob in set(self.get_meshes() + self.get_volumes() + self.objects + self.axes_instances): + if isinstance(ob, vedo.shapes.Text2D): continue - self.remove(a) + self.remove(ob) try: - if a.scalarbar: - self.remove(a.scalarbar) + if ob.scalarbar: + self.remove(ob.scalarbar) except AttributeError: pass - self.actors = [] return self def break_interaction(self): @@ -3325,7 +3289,6 @@ def close_window(self): def close(self): """Close the Plotter instance and release resources.""" self.close_window() - self.actors = [] if vedo.plotter_instance == self: vedo.plotter_instance = None @@ -4044,9 +4007,9 @@ def _keypress(self, iren, event): self.remove(self.cutter_widget) self.cutter_widget = None else: - for a in self.actors: - if isinstance(a, vtk.vtkVolume): - addons.add_cutter_tool(a) + for ob in self.objects: + if isinstance(ob, vedo.Volume): + addons.add_cutter_tool(ob) return vedo.printc("Click object and press X to open the cutter box widget.", c=4) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index ecae30e2..bebd2cc3 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1264,9 +1264,9 @@ def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, c except AttributeError: pass - shad.GetProperty().LightingOff() - shad.SetPickable(False) - shad.SetUseBounds(True) + shad.property.LightingOff() + shad.actor.SetPickable(False) + shad.actor.SetUseBounds(True) if shad not in self.shadows: self.shadows.append(shad) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 0cd5725c..8c6b5518 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -401,7 +401,8 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py b = shapes.Arrow2D(a.base, a.top, s=a.s, fill=a.fill).z(a.z()) - b.SetProperty(prop) + b.actor.SetProperty(prop) + b.property = prop b.y(py * self.yscale) a = b @@ -452,8 +453,8 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): # print("insert(): cannot cut", [a]) pass - self.AddPart(a) - self.actors.append(a) + self.AddPart(a.actor) + self.objects.append(a) return self @@ -600,7 +601,8 @@ def add_legend( box.shift(0, 0, -dy / 100).pickable(False) if lc: box.lc(lc).lw(lw) - aleg.AddPart(box) + aleg.AddPart(box.actor) + aleg.objects.append(box) xlim = self.xlim ylim = self.ylim @@ -1023,7 +1025,7 @@ def __init__( # r.texture(texture) # c = 'w' - r.PickableOff() + r.actor.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, myedges[0], myedges[-1]) @@ -1494,7 +1496,7 @@ def __init__( r.texture(texture) c = "w" - r.PickableOff() + r.actor.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, edges[0], edges[-1]) @@ -3083,7 +3085,8 @@ def _histogram_quad_bin(x, y, **kwargs): histo.actors[2] = msh histo.RemovePart(gr) - histo.AddPart(msh) + histo.AddPart(msh.actor) + histo.objects.append(msh) return histo @@ -3145,7 +3148,7 @@ def _histogram_hex_bin( col = i h = Mesh(tf.GetOutput(), c=col, alpha=alpha).flat() h.lighting("plastic") - h.PickableOff() + h.actor.PickableOff() hexs.append(h) if ne > binmax: binmax = ne diff --git a/vedo/shapes.py b/vedo/shapes.py index 37c774af..70a9204b 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -3677,7 +3677,7 @@ def Marker(symbol, pos=(0, 0, 0), c="k", alpha=1.0, s=0.1, filled=True): mesh.flat().lighting("off").wireframe(not filled).c(c).alpha(alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) - mesh.SetPosition(pos) + mesh.pos(pos) mesh.name = "Marker" return mesh From 260ce2eb87d0b9cf55e1370d9853c31ba6bf6e4a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 6 Oct 2023 22:55:43 +0200 Subject: [PATCH 012/251] more fixes --- examples/advanced/fitline.py | 2 +- examples/advanced/geological_model.py | 2 +- examples/advanced/warp4.py | 2 +- examples/basic/color_mesh_cells2.py | 2 +- examples/basic/colorlines.py | 4 +- examples/basic/fillholes.py | 2 +- examples/other/remesh_ACVD.py | 2 +- examples/other/trame_ex3.py | 4 +- examples/simulations/optics_base.py | 16 ++--- vedo/addons.py | 28 ++++---- vedo/assembly.py | 2 +- vedo/base.py | 83 ++++++++++++++--------- vedo/file_io.py | 12 ++-- vedo/mesh.py | 22 +++---- vedo/picture.py | 4 +- vedo/plotter.py | 53 +++++++++++---- vedo/pointcloud.py | 94 +++++++++------------------ vedo/pyplot.py | 38 +++++------ vedo/shapes.py | 4 +- 19 files changed, 195 insertions(+), 181 deletions(-) diff --git a/examples/advanced/fitline.py b/examples/advanced/fitline.py index 3d7c5575..6617a9de 100644 --- a/examples/advanced/fitline.py +++ b/examples/advanced/fitline.py @@ -24,7 +24,7 @@ # 'data' still contains the last iteration points plt += Points(data, r=10, c="yellow") -print("Line 0 Fit slope = ", plt.actors[0].slope) +print("Line 0 Fit slope = ", plt.objects[0].slope) plane = fit_plane(data).c("green4") # fit a plane print("Plane Fit normal =", plane.normal) diff --git a/examples/advanced/geological_model.py b/examples/advanced/geological_model.py index 8ba2cf3f..2775ea00 100644 --- a/examples/advanced/geological_model.py +++ b/examples/advanced/geological_model.py @@ -129,7 +129,7 @@ Wells.name = "Pre-existing wellbores" plt += Wells -for a in plt.actors: +for a in plt.objects: # change scale to kilometers in x and y, but expand z scale by 1.5! a.scale([0.001, 0.001, 0.001*1.5]) diff --git a/examples/advanced/warp4.py b/examples/advanced/warp4.py index 7171f8b7..e5a4916d 100644 --- a/examples/advanced/warp4.py +++ b/examples/advanced/warp4.py @@ -96,7 +96,7 @@ def onkeypress(self, evt): ###################################### MORPH & GENER mw = self.mesh1.clone().apply_transform(warped_plane.transform).c('red4') output.append(mw) - T_inv = warped_plane.transform.GetInverse() + T_inv = warped_plane.transform.compute_inverse() a = Points(self.arrow_starts, r=10).apply_transform(warped_plane.transform) b = Points(self.arrow_stops, r=10).apply_transform(warped_plane.transform) self.dottedln = Lines(a,b, res=self.n).apply_transform(T_inv).point_size(5) diff --git a/examples/basic/color_mesh_cells2.py b/examples/basic/color_mesh_cells2.py index 4077fbd2..51cc8003 100644 --- a/examples/basic/color_mesh_cells2.py +++ b/examples/basic/color_mesh_cells2.py @@ -3,7 +3,7 @@ # Define the callback function to change the color of the clicked cell to red def func(evt): - msh = evt.actor + msh = evt.object if not msh: return pt = evt.picked3d diff --git a/examples/basic/colorlines.py b/examples/basic/colorlines.py index 2311e68e..fecb1bf0 100644 --- a/examples/basic/colorlines.py +++ b/examples/basic/colorlines.py @@ -21,9 +21,9 @@ # Define a callback function to print the length of the clicked line segment def clickfunc(evt): - if evt.actor: + if evt.object: # Get the ID of the closest point on the clicked line segment - idl = evt.actor.closest_point(evt.picked3d, return_cell_id=True) + idl = evt.object.closest_point(evt.picked3d, return_cell_id=True) # Print the length of the line segment with 3 decimal places print('clicked line', idl, 'length =', precision(dist[idl],3)) diff --git a/examples/basic/fillholes.py b/examples/basic/fillholes.py index f988cf83..b620f467 100644 --- a/examples/basic/fillholes.py +++ b/examples/basic/fillholes.py @@ -5,6 +5,6 @@ a = Mesh(dataurl+"bunny.obj").lw(0.1).bc('red') b = a.clone() # make a copy -b.fill_holes(size=0.1).color("lb").bc('green') +b.fill_holes(size=0.1).color("lb").bc('red5') show(a, b, __doc__, elevation=-40).close() diff --git a/examples/other/remesh_ACVD.py b/examples/other/remesh_ACVD.py index dec34353..03da0951 100644 --- a/examples/other/remesh_ACVD.py +++ b/examples/other/remesh_ACVD.py @@ -9,7 +9,7 @@ mesh = Sphere(res=50).subdivide().lw(0.2).cut_with_plane().clean() -clus = Clustering(wrap(mesh.polydata())) +clus = Clustering(wrap(mesh)) clus.cluster(1000, maxiter=100, iso_try=10, debug=False) pvremesh = clus.create_mesh() diff --git a/examples/other/trame_ex3.py b/examples/other/trame_ex3.py index 92acd1b5..767e2c16 100644 --- a/examples/other/trame_ex3.py +++ b/examples/other/trame_ex3.py @@ -5,8 +5,10 @@ import vedo cone = vedo.Cone() +axes = vedo.Axes(cone).unpack() + plt = vedo.Plotter() -plt += [cone, vedo.Axes(cone).unpack(transformed=True)] +plt += [cone, axes] # ----------------------------------------------------------------------------- # Trame setup diff --git a/examples/simulations/optics_base.py b/examples/simulations/optics_base.py index 819173c4..b9d435a0 100644 --- a/examples/simulations/optics_base.py +++ b/examples/simulations/optics_base.py @@ -31,10 +31,10 @@ def hits_type(self): class Lens(vedo.Mesh, OpticalElement): """A refractive object of arbitrary shape defined by an arbitrary mesh""" - def __init__(self, actor, ref_index="glass"): - vedo.Mesh.__init__(self, actor.polydata(), "blue8", 0.5) + def __init__(self, obj, ref_index="glass"): + vedo.Mesh.__init__(self, obj, "blue8", 0.5) OpticalElement.__init__(self) - self.name = actor.name + self.name = obj.name self.type = "lens" self.compute_normals(cells=True, points=False) self.lighting('off') @@ -58,11 +58,11 @@ def n_at(self, wave_length): # in meters class Mirror(vedo.Mesh, OpticalElement): """A mirror surface defined by an arbitrary Mesh""" - def __init__(self, actor): - vedo.Mesh.__init__(self, actor.polydata(), "blue8", 0.5) + def __init__(self, obj): + vedo.Mesh.__init__(self, obj, "blue8", 0.5) OpticalElement.__init__(self) self.compute_normals(cells=True, points=True) - self.name = actor.name + self.name = obj.name self.type = "mirror" self.normals = self.celldata["Normals"] self.color('silver').lw(0).wireframe(False).alpha(1).phong() @@ -92,8 +92,8 @@ def __init__(self, sizex, sizey): class Detector(vedo.Mesh, OpticalElement): """A detector surface defined by an arbitrary Mesh""" - def __init__(self, actor): - vedo.Mesh.__init__(self, actor.polydata(), "k5", 0.5) + def __init__(self, obj): + vedo.Mesh.__init__(self, obj, "k5", 0.5) OpticalElement.__init__(self) self.compute_normals() self.name = "Detector" diff --git a/vedo/addons.py b/vedo/addons.py index 5f91ba93..41cfb22c 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1645,7 +1645,7 @@ def add_to(self, plt): plt.widgets.append(self.widget) cpoly = self.clipper.GetOutput() - self.mesh._update(cpoly) + self.mesh.DeepCopy(cpoly) out = self.clipper.GetClippedOutputPort() self.remnant.mapper.SetInputConnection(out) @@ -4156,15 +4156,18 @@ def add_global_axes(axtype=None, c=None, bounds=()): ocf = vtk.vtkOutlineCornerFilter() ocf.SetCornerFactor(0.1) largestact, sz = None, -1 - for a in plt.actors: - if a.GetPickable(): - b = a.GetBounds() - if b is None: - return - d = max(b[1] - b[0], b[3] - b[2], b[5] - b[4]) - if sz < d: - largestact = a - sz = d + for a in plt.objects: + try: + if a.pickable(): + b = a.actor.GetBounds() + if b is None: + return + d = max(b[1] - b[0], b[3] - b[2], b[5] - b[4]) + if sz < d: + largestact = a + sz = d + except AttributeError: + pass if isinstance(largestact, Assembly): ocf.SetInputData(largestact.unpack(0)) else: @@ -4182,7 +4185,6 @@ def add_global_axes(axtype=None, c=None, bounds=()): oc_actor.GetProperty().SetColor(lc) oc_actor.PickableOff() oc_actor.UseBoundsOn() - oc_actor.LightingOff() plt.axes_instances[r] = oc_actor plt.add(oc_actor) @@ -4229,7 +4231,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): ca.actor.PickableOff() ca.actor.UseBoundsOff() plt.axes_instances[r] = ca - plt.renderer.AddActor(ca) + plt.add(ca) elif plt.axes == 10: vbb = compute_visible_bounds()[0] @@ -4258,7 +4260,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): gr.lighting("off").actor.PickableOff() gr.actor.UseBoundsOff() plt.axes_instances[r] = gr - plt.renderer.AddActor(gr) + plt.add(gr) elif plt.axes == 12: polaxes = vtk.vtkPolarAxesActor() diff --git a/vedo/assembly.py b/vedo/assembly.py index 32e46386..9d6dbee8 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -48,7 +48,7 @@ def procrustes_alignment(sources, rigid=False): if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() - group.AddInputData(source.polydata()) + group.AddInputData(source) procrustes = vtk.vtkProcrustesAlignmentFilter() procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) diff --git a/vedo/base.py b/vedo/base.py index 04b722b9..e3aa6fe7 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -380,27 +380,49 @@ def draggable(self, value=None): # NOT FUNCTIONAL? return self - def _move(self, LT, concatenate=True, deep_copy=True): - - if isinstance(self, vedo.assembly.Assembly): + def apply_transform(self, LT, concatenate=True, deep_copy=True): + """ + Apply a linear or non-linear transformation to the mesh polygonal data. + ```python + from vedo import Cube, show + c1 = Cube().rotate_z(5).x(2).y(1) + print("cube1 position", c1.pos()) + T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y + c2 = Cube().c('r4') + c2.apply_transform(T) # ignore previous movements + c2.apply_transform(T, concatenate=True) + c2.apply_transform(T, concatenate=True) + print("cube2 position", c2.pos()) + show(c1, c2, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/apply_transform.png) + """ + if isinstance(self, (vedo.assembly.Assembly, vtk.vtkImageActor)): self.SetPosition(LT.position) - return self - # print(type(self), LT.position) - - if LT.is_identity(): + self.SetOrientation(LT.T.GetOrientation()) + self.SetScale(LT.T.GetScale()) return self - if concatenate: - self.transform.concatenate(LT) + if isinstance(LT, LinearTransform): + tr = LT.T + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkTransform, np.ndarray)): + LT = LinearTransform(LT) + if LT.is_identity(): + return self + tr = LT.T + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, vtk.vtkThinPlateSplineTransform): + tr = LT tp = vtk.vtkTransformPolyDataFilter() - tp.SetTransform(LT.T) + tp.SetTransform(tr) tp.SetInputData(self) tp.Update() out = tp.GetOutput() - # print("_move", self.transform) - if deep_copy: self.DeepCopy(out) else: @@ -429,7 +451,7 @@ def pos(self, x=None, y=None, z=None): q = self.transform.position LT = LinearTransform() LT.translate([x,y,z]-q) - return self._move(LT) + return self.apply_transform(LT) def shift(self, dx=0, dy=0, dz=0): """Add a vector to the current object position.""" @@ -437,7 +459,7 @@ def shift(self, dx=0, dy=0, dz=0): utils.make3d(dx) dx, dy, dz = dx LT = LinearTransform().translate([dx, dy, dz]) - return self._move(LT) + return self.apply_transform(LT) def x(self, val=None): """Set/Get object position along x axis.""" @@ -483,7 +505,7 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): # self.rotate(angle, axis, point, rad) LT = LinearTransform() LT.rotate(angle, axis, point, rad) - return self._move(LT) + return self.apply_transform(LT) def rotate_x(self, angle, rad=False, around=None): """ @@ -492,7 +514,7 @@ def rotate_x(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ LT = LinearTransform().rotate_x(angle, rad, around) - return self._move(LT) + return self.apply_transform(LT) def rotate_y(self, angle, rad=False, around=None): """ @@ -501,7 +523,7 @@ def rotate_y(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ LT = LinearTransform().rotate_y(angle, rad, around) - return self._move(LT) + return self.apply_transform(LT) def rotate_z(self, angle, rad=False, around=None): """ @@ -510,7 +532,7 @@ def rotate_z(self, angle, rad=False, around=None): Use `around` to define a pivoting point. """ LT = LinearTransform().rotate_z(angle, rad, around) - return self._move(LT) + return self.apply_transform(LT) #TODO def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): @@ -544,7 +566,7 @@ def scale(self, s=None, reset=False, origin=True): LT.scale(s, origin=self.transform.position) else: LT.scale(s, origin=False) - return self._move(LT) + return self.apply_transform(LT) def align_to_bounding_box(self, msh, rigid=False): @@ -592,9 +614,9 @@ def align_to_bounding_box(self, msh, rigid=False): lmt.SetModeToRigidBody() lmt.Update() - T = LinearTransform(lmt) - # self.apply_transform(T) - return self._move(LT) + LT = LinearTransform(lmt) + self.apply_transform(LT) + return self def on(self): """Switch on object visibility. Object is not removed.""" @@ -667,22 +689,23 @@ def box(self, scale=1, padding=0, fill=False): height * scale + padding[2], c="gray", ) - if hasattr(self, "GetProperty"): # could be Assembly - if isinstance(self.property, vtk.vtkProperty): # could be volume - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - bx.SetProperty(pr) - bx.property = pr + try: + pr = vtk.vtkProperty() + pr.DeepCopy(self.GetProperty()) + bx.SetProperty(pr) + bx.property = pr + except (AttributeError, TypeError): + pass bx.wireframe(not fill) bx.flat().lighting("off") return bx - def use_bounds(self, ub=True): + def use_bounds(self, value=True): """ Instruct the current camera to either take into account or ignore the object bounds when resetting. """ - self.actor.SetUseBounds(ub) + self.actor.SetUseBounds(value) return self def bounds(self): diff --git a/vedo/file_io.py b/vedo/file_io.py index 73cfa565..0a384ecf 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -451,7 +451,7 @@ def _load_file(filename, unpack): else: actor = Mesh(routput) if fl.endswith(".txt") or fl.endswith(".xyz"): - actor.GetProperty().SetPointSize(4) + actor.point_size(4) actor.filename = filename actor.file_size, actor.created = file_info(filename) @@ -893,7 +893,7 @@ def _fillmesh(obj, adict): adict["LUT"] = lutvals adict["LUT_range"] = lut.GetRange() - prp = obj.actor.GetProperty() + prp = obj.property adict["alpha"] = prp.GetOpacity() adict["representation"] = prp.GetRepresentation() adict["pointsize"] = prp.GetPointSize() @@ -913,8 +913,8 @@ def _fillmesh(obj, adict): adict["color"] = prp.GetColor() adict["lighting_is_on"] = prp.GetLighting() adict["backcolor"] = None - if obj.GetBackfaceProperty(): - adict["backcolor"] = obj.GetBackfaceProperty().GetColor() + if obj.actor.GetBackfaceProperty(): + adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() adict["texture"] = obj._texture if hasattr(obj, "_texture") else None @@ -947,7 +947,7 @@ def _fillmesh(obj, adict): adict["mode"] = obj.mode() # adict['jittering'] = obj.mapper.GetUseJittering() - prp = obj.actor.GetProperty() + prp = obj.property ctf = prp.GetRGBTransferFunction() otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() @@ -1512,7 +1512,7 @@ def export_window(fileoutput, binary=False): allobjs = list(set(allobjs)) # make sure its unique for a in allobjs: - if a.GetVisibility(): + if a.actor.GetVisibility(): sdict["objects"].append(tonumpy(a)) if fr.endswith(".npz"): diff --git a/vedo/mesh.py b/vedo/mesh.py index a880d5a2..98710673 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -965,7 +965,7 @@ def stretch(self, q1, q2): T.Translate(q1) - self.SetUserMatrix(T.GetMatrix()) + self.apply_transform(T) return self @@ -1008,19 +1008,14 @@ def cap(self, return_cap=False): if return_cap: m = Mesh(tf.GetOutput()) - # assign the same transformation to the copy - m.SetOrigin(self.GetOrigin()) - m.SetScale(self.GetScale()) - m.SetOrientation(self.GetOrientation()) - m.SetPosition(self.GetPosition()) - m.pipeline = OperationNode( - "cap", parents=[self], comment=f"#pts {m._data.GetNumberOfPoints()}" + "cap", parents=[self], + comment=f"#pts {m.GetNumberOfPoints()}" ) return m polyapp = vtk.vtkAppendPolyData() - polyapp.AddInputData(poly) + polyapp.AddInputData(self) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() @@ -1163,7 +1158,7 @@ def join_segments(self, closed=True, tol=1e-03): newline.pipeline = OperationNode( "join_segments", parents=[self], - comment=f"#pts {newline._data.GetNumberOfPoints()}", + comment=f"#pts {newline.GetNumberOfPoints()}", ) vlines.append(newline) @@ -1486,7 +1481,8 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): self.DeepCopy(decimate.GetOutput()) self.pipeline = OperationNode( - "decimate", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" + "decimate", parents=[self], + comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -2520,12 +2516,12 @@ def geodesic(self, start, end): prop.DeepCopy(self.property) prop.SetLineWidth(3) prop.SetOpacity(1) - dmesh.SetProperty(prop) + dmesh.actor.SetProperty(prop) dmesh.property = prop dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( - "GeodesicLine", parents=[self], comment=f"#pts {dmesh._data.GetNumberOfPoints()}" + "GeodesicLine", parents=[self], comment=f"#pts {dmesh.GetNumberOfPoints()}" ) return dmesh diff --git a/vedo/picture.py b/vedo/picture.py index 1e474456..a0adc83b 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -261,9 +261,9 @@ def __init__(self, obj=None, channels=3, flip=False): flip : (bool) flip xy axis convention (when input is a numpy array) """ + super().__init__() - vtk.vtkImageActor.__init__(self) - vedo.base.Base3DProp.__init__(self) + self.actor = self if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, flip) diff --git a/vedo/plotter.py b/vedo/plotter.py index 2e82c891..68831a61 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -41,7 +41,9 @@ class Event: "time", "priority", "at", - "actor", + "object", + "actor", # obsolete use object instead + "vtk_actor", "picked3d", "keypress", "picked2d", @@ -812,6 +814,7 @@ def add(self, *objs, at=None): for ob in objs: if ob: self.objects.append(ob) + # self.objects = list(set(self.objects)) acts = self._scan_input(objs) @@ -820,7 +823,10 @@ def add(self, *objs, at=None): a.add_to(self) continue if ren: - ren.AddActor(a) + try: + ren.AddActor(a) + except TypeError: + ren.AddActor(a.actor) if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.add(ir) @@ -868,8 +874,13 @@ def remove(self, *objs, at=None): for ob in set(objects_r): if ren: - a = ob.actor + try: + a = ob.actor + except AttributeError: + a = ob + ren.RemoveActor(a) + if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.discard(ir) @@ -889,8 +900,11 @@ def remove(self, *objs, at=None): for i, ob in enumerate(objs): if ob in self.objects: - i = self.objects.index(a) - del self.objects[i] + try: + i = self.objects.index(a) + del self.objects[i] + except ValueError: + pass return self @@ -1061,7 +1075,10 @@ def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=Tru continue if has_global_axes and a in self.axes_instances[at].actors: continue - objs.append(a.data) + try: + objs.append(a.data) + except AttributeError: + pass return objs def get_volumes(self, at=None, include_non_pickables=False): @@ -1086,7 +1103,10 @@ def get_volumes(self, at=None, include_non_pickables=False): for _ in range(acs.GetNumberOfItems()): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): - vols.append(a.data) + try: + vols.append(a.data) + except AttributeError: + pass return vols def reset_camera(self, tight=None): @@ -2286,14 +2306,15 @@ def fill_event(self, ename="", pos=(), enable_picking=True): if actor: picked3d = np.array(self.picker.GetPickPosition()) if isinstance(actor, vedo.base.Base3DProp): # needed! - if actor.picked3d is not None: - delta3d = picked3d - actor.picked3d - actor.picked3d = picked3d + if actor.data.picked3d is not None: + delta3d = picked3d - actor.data.picked3d + actor.data.picked3d = picked3d else: picked3d = None if not actor: # try 2D actor = self.picker.GetActor2D() + # print(enable_picking, xp, yp, picked3d, [actor] ) dx, dy = x - xp, y - yp @@ -2305,10 +2326,16 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.priority = -1 # will be set by the timer wrapper function event.time = time.time() event.at = self.renderers.index(self.renderer) - event.keyPressed = key # obsolete, will disappear. Use "keypress" event.keypress = key if enable_picking: - event.actor = actor + event.vtk_actor = actor + try: + event.actor = actor.data # obsolete use object instead + event.object = actor.data + except AttributeError: + # print("Warning: actor.data is None") + event.actor = None + event.object = None event.picked3d = picked3d event.picked2d = (x, y) event.delta2d = (dx, dy) @@ -2534,7 +2561,7 @@ def compute_world_coordinate( else: pp = vtk.vtkPolygonalSurfacePointPlacer() for ob in objs: - pp.AddProp(ob) + pp.AddProp(ob.actor) if len(bounds) == 6: pp.SetPointBounds(bounds) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index bebd2cc3..21c995fe 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -696,8 +696,8 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): .. note:: if you are creating many points you should definitely use class `Points` instead! """ - if isinstance(pos, vtk.vtkActor): - pos = pos.GetPosition() + if isinstance(pos, vedo.Base3DProp): + pos = pos.pos() if len(pos) == 2: pos = (pos[0], pos[1], 0.0) pd = utils.buildPolyData([pos]) @@ -816,22 +816,36 @@ def fibonacci_sphere(n): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.SetVerts(carr) - - - elif utils.is_sequence(inputobj): # passing point coords - pd = utils.buildPolyData(utils.make3d(inputobj)) c = colors.get_color(c) self.property.SetColor(c) - self.property.SetOpacity(alpha) + self.property.SetOpacity(alpha) + + elif utils.is_sequence(inputobj): # passing point coords + pd = utils.buildPolyData(utils.make3d(inputobj)) + if utils.is_sequence(c) and len(c) == len(inputobj): + cols = vtk.vtkUnsignedCharArray() + cols.SetNumberOfComponents(4) + cols.SetName("PointsRGBA") + for i in range(len(inputobj)): + r, g, b = c[i] + cols.InsertNextTuple4(r, g, b, 255) + pd.GetPointData().SetScalars(cols) + else: + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) self.DeepCopy(pd) - self.pipeline = utils.OperationNode(self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") - + self.pipeline = utils.OperationNode( + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj self.DeepCopy(verts) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) else: # try to extract the points from a generic VTK input data object try: @@ -848,9 +862,6 @@ def fibonacci_sphere(n): vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) self.property.SetRepresentationToPoints() self.property.SetPointSize(r) self.property.LightingOff() @@ -996,23 +1007,6 @@ def clone(self, deep=True): cloned.transform = self.transform - # if self.transform: - # # already has a so use that - # try: - # cloned.SetUserTransform(self.transform) - # except TypeError: # transform which can be non linear - # cloned.SetOrigin(self.GetOrigin()) - # cloned.SetScale(self.GetScale()) - # cloned.SetOrientation(self.GetOrientation()) - # cloned.SetPosition(self.GetPosition()) - - # else: - # # assign the same transformation to the copy - # cloned.SetOrigin(self.GetOrigin()) - # cloned.SetScale(self.GetScale()) - # cloned.SetOrientation(self.GetOrientation()) - # cloned.SetPosition(self.GetPosition()) - mp = cloned.mapper sm = self.mapper mp.SetScalarVisibility(sm.GetScalarVisibility()) @@ -1161,7 +1155,7 @@ def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) """ if self.trail is None: - pos = self.GetPosition() + pos = self.pos() self.trail_offset = np.asarray(offset) self.trail_points = [pos] * n @@ -1178,10 +1172,7 @@ def update_trail(self): """ Update the trailing line of a moving object. """ - if isinstance(self, vedo.shapes.Arrow): - currentpos = self.tipPoint() # the tip of Arrow - else: - currentpos = np.array(self.GetPosition()) + currentpos = self.pos() self.trail_points.append(currentpos) # cycle self.trail_points.pop(0) @@ -1189,7 +1180,7 @@ def update_trail(self): data = np.array(self.trail_points) - currentpos + self.trail_offset tpoly = self.trail tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) - self.trail.SetPosition(currentpos) + self.trail.pos(currentpos) return self @@ -2510,27 +2501,6 @@ def transform_with_landmarks( self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) return self - - def apply_transform(self, T): - # """ - # Apply a linear or non-linear transformation to the mesh polygonal data. - # ```python - # from vedo import Cube, show - # c1 = Cube().rotate_z(5).x(2).y(1) - # print("cube1 position", c1.pos()) - # T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y - # c2 = Cube().c('r4') - # c2.apply_transform(T) # ignore previous movements - # c2.apply_transform(T, concatenate=True) - # c2.apply_transform(T, concatenate=True) - # print("cube2 position", c2.pos()) - # show(c1, c2, axes=1).close() - # ``` - # ![](https://vedo.embl.es/images/feats/apply_transform.png) - # """ - self.transform = T - return self._move() - def normalize(self): """Scale Mesh average size to unit.""" coords = self.points() @@ -3432,15 +3402,15 @@ def project_on_plane(self, plane="z", point=None, direction=None): coords = self.points() if plane == "x": - coords[:, 0] = self.GetOrigin()[0] + coords[:, 0] = self.transform.position[0] intercept = self.xbounds()[0] if point is None else point self.x(intercept) elif plane == "y": - coords[:, 1] = self.GetOrigin()[1] + coords[:, 1] = self.transform.position[1] intercept = self.ybounds()[0] if point is None else point self.y(intercept) elif plane == "z": - coords[:, 2] = self.GetOrigin()[2] + coords[:, 2] = self.transform.position[2] intercept = self.zbounds()[0] if point is None else point self.z(intercept) @@ -3542,8 +3512,8 @@ def warp(self, source, target, sigma=1.0, mode="3d"): T.SetSigma(sigma) T.SetSourceLandmarks(ptsou) T.SetTargetLandmarks(pttar) - self.transform = T - self.apply_transform(T, reset=True) + # self.transform = T + self.apply_transform(T) self.pipeline = utils.OperationNode("warp", parents=parents) return self @@ -4154,7 +4124,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No ![](https://user-images.githubusercontent.com/32848391/57081955-0ef1e800-6cf6-11e9-99de-b45220939bc9.png) """ cu = vtk.vtkBox() - pos = np.array(self.GetPosition()) + pos = np.array(self.pos()) x0, x1, y0, y1, z0, z1 = self.bounds() x0, y0, z0 = [x0, y0, z0] - pos x1, y1, z1 = [x1, y1, z1] - pos diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 8c6b5518..7820e1d1 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -45,16 +45,14 @@ ] ########################################################################## -def _to2d(actor, offset, scale): - - poly = actor.polydata() +def _to2d(obj, offset, scale): tp = vtk.vtkTransformPolyDataFilter() transform = vtk.vtkTransform() transform.Scale(scale, scale, scale) transform.Translate(-offset[0], -offset[1], 0) tp.SetTransform(transform) - tp.SetInputData(poly) + tp.SetInputData(obj) tp.Update() poly = tp.GetOutput() @@ -65,10 +63,10 @@ def _to2d(actor, offset, scale): act2d = vtk.vtkActor2D() act2d.SetMapper(mapper2d) - act2d.GetProperty().SetColor(actor.color()) - act2d.GetProperty().SetOpacity(actor.alpha()) - act2d.GetProperty().SetLineWidth(actor.GetProperty().GetLineWidth()) - act2d.GetProperty().SetPointSize(actor.GetProperty().GetPointSize()) + act2d.GetProperty().SetColor(obj.color()) + act2d.GetProperty().SetOpacity(obj.alpha()) + act2d.GetProperty().SetLineWidth(obj.property.GetLineWidth()) + act2d.GetProperty().SetPointSize(obj.property.GetPointSize()) act2d.PickableOff() @@ -396,7 +394,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): if isinstance(a, (shapes.Arrow, shapes.Arrow2D)): # discard input Arrow and substitute it with a brand new one # (because scaling would fatally distort the shape) - prop = a.GetProperty() + prop = a.property prop.LightingOff() py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py @@ -734,7 +732,7 @@ def as2d(self, pos="bottom-left", scale=1, padding=0.05): continue if a.npoints == 0: continue - if a.GetProperty().GetRepresentation() == 1: + if a.property.GetRepresentation() == 1: # wireframe is not rendered correctly in 2d continue a2d = _to2d(a, offset, scale * 550 / (x1 - x0)) @@ -2733,13 +2731,9 @@ def _plot_fxy( return None if zlim[0]: - tmpact1 = Mesh(poly) - a = tmpact1.cut_with_plane((0, 0, zlim[0]), (0, 0, 1)) - poly = a.polydata() + poly = Mesh(poly).cut_with_plane((0, 0, zlim[0]), (0, 0, 1)) if zlim[1]: - tmpact2 = Mesh(poly) - a = tmpact2.cut_with_plane((0, 0, zlim[1]), (0, 0, -1)) - poly = a.polydata() + poly = Mesh(poly).cut_with_plane((0, 0, zlim[1]), (0, 0, -1)) cmap = "" if c in colors.cmaps_names: @@ -2772,7 +2766,7 @@ def _plot_fxy( bcf.Update() zpoly = bcf.GetContourEdgesOutput() zbandsact = Mesh(zpoly, "k", alpha).lw(1).lighting("off") - zbandsact.mapper().SetResolveCoincidentTopologyToPolygonOffset() + zbandsact.mapper.SetResolveCoincidentTopologyToPolygonOffset() acts.append(zbandsact) if show_nan and todel: @@ -2783,7 +2777,7 @@ def _plot_fxy( zm = (bb[4] + bb[5]) / 2 nans = np.array(nans) + [0, 0, zm] nansact = shapes.Points(nans, r=2, c="red5", alpha=alpha) - nansact.GetProperty().RenderPointsAsSpheresOff() + nansact.property.RenderPointsAsSpheresOff() acts.append(nansact) if isinstance(axes, dict): @@ -3025,7 +3019,7 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha if scalarbar: xm = np.max([np.max(pts[0]), 1]) ym = np.max([np.abs(np.max(pts[1])), 1]) - ssurf.mapper().SetScalarRange(np.min(newr), np.max(newr)) + ssurf.mapper.SetScalarRange(np.min(newr), np.max(newr)) sb3d = ssurf.add_scalarbar3d(size=(xm * 0.07, ym), c="k").scalarbar sb3d.rotate_x(90).pos(xm * 1.1, 0, -0.5) else: @@ -3628,7 +3622,7 @@ def whisker(data, s=0.25, c="k", lw=2, bc="blue", alpha=0.25, r=5, jitter=True, pts = shapes.Points([xvals, data], c=c, r=r) rec = shapes.Rectangle([-s / 2, dq25], [s / 2, dq75], c=bc, alpha=alpha) - rec.GetProperty().LightingOff() + rec.property.LightingOff() rl = shapes.Line([[-s / 2, dq25], [s / 2, dq25], [s / 2, dq75], [-s / 2, dq75]], closed=True) l1 = shapes.Line([0, dq05, 0], [0, dq25, 0], c=c, lw=lw) l2 = shapes.Line([0, dq75, 0], [0, dq95, 0], c=c, lw=lw) @@ -4282,7 +4276,7 @@ def build(self): if not diagsz: return None - dgraph.SetScale(1 / diagsz) + dgraph.scale(1 / diagsz) if self.rotX: dgraph.rotate_x(self.rotX) if self.rotY: @@ -4305,7 +4299,7 @@ def build(self): arrow_glyph.SetInputData(1, arrow_source.GetOutput()) arrow_glyph.Update() arrows = Mesh(arrow_glyph.GetOutput()) - arrows.SetScale(1 / diagsz) + arrows.scale(1 / diagsz) arrows.lighting("off").color(self._c) if self.rotX: arrows.rotate_x(self.rotX) diff --git a/vedo/shapes.py b/vedo/shapes.py index 70a9204b..94419455 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -452,9 +452,9 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): self.res = res if isinstance(p1, Points): - p1 = p1.GetPosition() + p1 = p1.pos() if isinstance(p0, Points): - p0 = p0.GetPosition() + p0 = p0.pos() if isinstance(p0, Points): p0 = p0.points() From 9484dfff45435ba87886bf46203113b0353d32c3 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 15:42:42 +0200 Subject: [PATCH 013/251] assembly changes --- vedo/assembly.py | 149 +++++++++++++++++++++++++-- vedo/base.py | 9 +- vedo/plotter.py | 258 +++++++++++++++++++++++++---------------------- vedo/pyplot.py | 9 +- 4 files changed, 279 insertions(+), 146 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index 9d6dbee8..8ff5d5cf 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -8,6 +8,8 @@ import vtkmodules.all as vtk import vedo +from vedo.transformations import LinearTransform + __docformat__ = "google" @@ -78,10 +80,9 @@ class Group(vtk.vtkPropAssembly): def __init__(self, objects=()): """Form groups of generic objects (not necessarily meshes).""" - vtk.vtkPropAssembly.__init__(self) + super().__init__() self.name = "" - self.created = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 @@ -89,15 +90,17 @@ def __init__(self, objects=()): self.shadows = [] self.info = {} self.rendered_at = set() - self.transform = None self.scalarbar = None + self.transform = LinearTransform() + for a in vedo.utils.flatten(objects): if a: self.AddPart(a) self.PickableOff() + def __iadd__(self, obj): """ Add an object to the group @@ -184,10 +187,6 @@ def bounds(self): """ return self.GetBounds() - def diagonal_size(self): - """Get the length of the diagonal""" - b = self.GetBounds() - return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2) def show(self, **options): """ @@ -203,7 +202,7 @@ def show(self, **options): ################################################# -class Assembly(vedo.base.Base3DProp, vtk.vtkAssembly): +class Assembly(vtk.vtkAssembly): """ Group many objects and treat them as a single new object. """ @@ -218,8 +217,7 @@ def __init__(self, *meshs): ![](https://vedo.embl.es/images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif) """ - vtk.vtkAssembly.__init__(self) - vedo.base.Base3DProp.__init__(self) + super().__init__() if len(meshs) == 1: meshs = meshs[0] @@ -228,6 +226,18 @@ def __init__(self, *meshs): self.actor = self + self.name = "" + self.trail = None + self.trail_points = [] + self.trail_segment_size = 0 + self.trail_offset = None + self.shadows = [] + self.info = {} + self.rendered_at = set() + self.scalarbar = None + + self.transform = LinearTransform() + self.objects = meshs self.actors = [m.actor for m in self.objects] @@ -350,9 +360,114 @@ def unpack_group(scalarbar): return self def __contains__(self, obj): - """Allows to use ``in`` to check if an object is in the Assembly.""" + """Allows to use ``in`` to check if an object is in the `Assembly`.""" return obj in self.objects + + def apply_transform(self, LT, concatenate=False): + """ + """ + self.SetPosition(LT.T.GetPosition()) + self.SetOrientation(LT.T.GetOrientation()) + self.SetScale(LT.T.GetScale()) + if concatenate: + self.transform.concatenate(LT) + return self + + def pos(self, x=None, y=None, z=None): + """Set/Get object position.""" + if x is None: # get functionality + return self.transform.position + + if z is None and y is None: # assume x is of the form (x,y,z) + if len(x) == 3: + x, y, z = x + else: + x, y = x + z = 0 + elif z is None: # assume x,y is of the form x, y + z = 0 + + q = self.transform.position + LT = LinearTransform() + LT.translate([x,y,z]-q) + return self.apply_transform(LT) + + def shift(self, dx, dy=0, dz=0): + """Add a vector to the current object position.""" + if vedo.utils.is_sequence(dx): + vedo.utils.make3d(dx) + dx, dy, dz = dx + LT = LinearTransform().translate([dx, dy, dz]) + return self.apply_transform(LT) + + def scale(self, s): + """Multiply object size by `s` factor.""" + LT = LinearTransform().scale(s) + return self.apply_transform(LT) + + def x(self, val=None): + """Set/Get object position along x axis.""" + p = self.transform.position + if val is None: + return p[0] + self.pos(val, p[1], p[2]) + return self + + def y(self, val=None): + """Set/Get object position along y axis.""" + p = self.transform.position + if val is None: + return p[1] + self.pos(p[0], val, p[2]) + return self + + def z(self, val=None): + """Set/Get object position along z axis.""" + p = self.transform.position + if val is None: + return p[2] + self.pos(p[0], p[1], val) + return self + + def rotate_z(self, angle): + """Rotate object around z axis.""" + LT = LinearTransform().rotate_z(angle) + return self.apply_transform(LT) + + + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + return self.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + def clone(self): """Make a clone copy of the object.""" newlist = [] @@ -412,3 +527,15 @@ def pickable(self, value=None): # set property for self using inherited pickable() return super().pickable(value=value) + + def show(self, **options): + """ + Create on the fly an instance of class ``Plotter`` or use the last existing one to + show one single object. + + This method is meant as a shortcut. If more than one object needs to be visualised + please use the syntax `show(mesh1, mesh2, volume, ..., options)`. + + Returns the ``Plotter`` class instance. + """ + return vedo.plotter.show(self, **options) diff --git a/vedo/base.py b/vedo/base.py index e3aa6fe7..c1dac16d 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -331,7 +331,6 @@ def __init__(self): self.filename = "" self.name = "" self.file_size = "" - self.created = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 @@ -339,7 +338,7 @@ def __init__(self): self.shadows = [] self.axes = None self.picked3d = None - self.units = None + self.top = np.array([0, 0, 1]) self.base = np.array([0, 0, 0]) self.info = {} @@ -397,12 +396,6 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ - if isinstance(self, (vedo.assembly.Assembly, vtk.vtkImageActor)): - self.SetPosition(LT.position) - self.SetOrientation(LT.T.GetOrientation()) - self.SetScale(LT.T.GetScale()) - return self - if isinstance(LT, LinearTransform): tr = LT.T if concatenate: diff --git a/vedo/plotter.py b/vedo/plotter.py index 68831a61..2b24e6ae 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -469,7 +469,10 @@ def __init__( self.window = vtk.vtkRenderWindow() self.window.GlobalWarningDisplayOff() - self.window.SetWindowName(self.title) + + if self.title == "vedo": # check if dev version + if "dev" in vedo.__version__: + self.title = f"vedo ({vedo.__version__})" # more settings if settings.use_depth_peeling: @@ -812,16 +815,17 @@ def add(self, *objs, at=None): objs = utils.flatten(objs) for ob in objs: - if ob: + if ob and ob not in self.objects: self.objects.append(ob) - # self.objects = list(set(self.objects)) - acts = self._scan_input(objs) + acts = self._scan_input_return_acts(objs) for a in acts: - if isinstance(a, vtk.vtkInteractorObserver): - a.add_to(self) - continue + + # if isinstance(a, vtk.vtkInteractorObserver): + # a.add_to(self) + # continue + if ren: try: ren.AddActor(a) @@ -836,7 +840,6 @@ def add(self, *objs, at=None): def remove(self, *objs, at=None): """ Remove input object to the internal list of objects to be shown. - This method is typically used in loops or callback functions. Objects to be removed can be referenced by their assigned name. Arguments: @@ -850,64 +853,73 @@ def remove(self, *objs, at=None): objs = [ob for ob in utils.flatten(objs) if ob] - objects_in_ren = None - objects_r = [] - for a in objs: - - # if isinstance(a, vtk.vtkInteractorObserver): - # a.remove_from(self) - # continue ### - - if isinstance(a, str): - if objects_in_ren is None: - objects_in_ren = self.get_meshes( - include_non_pickables=True, - unpack_assemblies=False, - ) - - for b in set(self.objects + objects_in_ren): - if hasattr(b, "name") and a in b.name: - objects_r.append(b) - - else: - objects_r.append(a) - - for ob in set(objects_r): - if ren: + has_str = False + for ob in objs: + if isinstance(ob, str): + has_str = True + break + + has_actor = False + for ob in objs: + if isinstance(ob, vedo.base.Base3DProp): + has_actor = True + break + + if has_str or has_actor: + # need to get the actors + acts = self.get_meshes(include_non_pickables=True, + unpack_assemblies=False) + for a in acts: try: - a = ob.actor + if a.data.name: + objs.append(a) except AttributeError: - a = ob - - ren.RemoveActor(a) + pass + + ids = [] + ir = self.renderers.index(ren) - if hasattr(a, "rendered_at"): - ir = self.renderers.index(ren) - a.rendered_at.discard(ir) - if hasattr(a, "scalarbar") and a.scalarbar: - ren.RemoveActor(a.scalarbar) - if hasattr(a, "_caption") and a._caption: - ren.RemoveActor(a._caption) - if hasattr(a, "shadows") and a.shadows: - for sha in a.shadows: - ren.RemoveActor(sha) - if hasattr(a, "trail") and a.trail: - ren.RemoveActor(a.trail) - a.trail_points = [] - if hasattr(a.trail, "shadows") and a.trail.shadows: - for sha in a.trail.shadows: - ren.RemoveActor(sha) - - for i, ob in enumerate(objs): - if ob in self.objects: + for ob in set(objs): + # remove it from internal list if possible + if ob in list(self.objects): try: - i = self.objects.index(a) - del self.objects[i] + idx = self.objects.index(ob) + ids.append(idx) except ValueError: pass + + if ren: ### remove it from the renderer + + try: + ren.RemoveActor(ob) + except TypeError: + try: + ren.RemoveActor(ob.actor) + except AttributeError: + pass + + if hasattr(ob, "rendered_at"): + ob.rendered_at.discard(ir) + + if hasattr(ob, "scalarbar") and ob.scalarbar: + ren.RemoveActor(ob.scalarbar.actor) + if hasattr(ob, "_caption") and ob._caption: + ren.RemoveActor(ob._caption.actor) + if hasattr(ob, "shadows") and ob.shadows: + for sha in ob.shadows: + ren.RemoveActor(sha.actor) + if hasattr(ob, "trail") and ob.trail: + ren.RemoveActor(ob.trail.actor) + ob.trail_points = [] + if hasattr(ob.trail, "shadows") and ob.trail.shadows: + for sha in ob.trail.shadows: + ren.RemoveActor(sha.actor) + + for i in ids: + del self.objects[i] return self - + @property def actors(self): """Return the list of actors.""" @@ -2136,7 +2148,7 @@ def _legfunc(evt): # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): - actcol = evt.actor.GetProperty().GetColor() + actcol = evt.actor.property.GetColor() if hoverlegend.mapper.GetTextProperty().GetBackgroundColor() != actcol: hoverlegend.mapper.GetTextProperty().SetBackgroundColor(actcol) @@ -2669,7 +2681,7 @@ def mode_select(objs): return afru - def _scan_input(self, wannabe_acts): + def _scan_input_return_acts(self, wannabe_acts): # scan the input of show if not utils.is_sequence(wannabe_acts): wannabe_acts = [wannabe_acts] @@ -2691,28 +2703,28 @@ def _scan_input(self, wannabe_acts): scanned_acts.append(a) - if isinstance(a, vedo.base.BaseActor): - if a.shadows: - for sh in a.shadows: - scanned_acts.append(sh.actor) + # if isinstance(a, vedo.base.BaseActor): + # if a.shadows: + # for sh in a.shadows: + # scanned_acts.append(sh.actor) - if a.trail: - scanned_acts.append(a.trail.actor) - # trails may also have shadows: - if a.trail.shadows: - for sh in a.trail.shadows: - scanned_acts.append(sh.actor) + # if a.trail: + # scanned_acts.append(a.trail.actor) + # # trails may also have shadows: + # if a.trail.shadows: + # for sh in a.trail.shadows: + # scanned_acts.append(sh.actor) - if a._caption: - scanned_acts.append(a._caption) + # if a._caption: + # scanned_acts.append(a._caption) elif isinstance(a, vtk.vtkActor2D): scanned_acts.append(a) elif isinstance(a, vtk.vtkAssembly): scanned_acts.append(a) - if a.trail: - scanned_acts.append(a.trail.actor) + # if a.trail: + # scanned_acts.append(a.trail.actor) elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): scanned_acts.append(a.actor) @@ -3499,41 +3511,41 @@ def _keypress(self, iren, event): elif key == "Down": if self.clicked_actor in self.get_meshes(): - self.clicked_actor.GetProperty().SetOpacity(0.02) - bfp = self.clicked_actor.GetBackfaceProperty() + self.clicked_actor.property.SetOpacity(0.02) + bfp = self.clicked_actor.actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_actor, "_bfprop"): self.clicked_actor._bfprop = bfp # save it - self.clicked_actor.SetBackfaceProperty(None) + self.clicked_actor.actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): - a.GetProperty().SetOpacity(0.02) - bfp = a.GetBackfaceProperty() + a.property.SetOpacity(0.02) + bfp = a.actor.GetBackfaceProperty() if bfp and hasattr(a, "_bfprop"): a._bfprop = bfp - a.SetBackfaceProperty(None) + a.actor.SetBackfaceProperty(None) elif key == "Left": if self.clicked_actor in self.get_meshes(): - ap = self.clicked_actor.GetProperty() + ap = self.clicked_actor.property aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) - bfp = self.clicked_actor.GetBackfaceProperty() + bfp = self.clicked_actor.actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_actor, "_bfprop"): self.clicked_actor._bfprop = bfp - self.clicked_actor.SetBackfaceProperty(None) + self.clicked_actor.actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): - ap = a.GetProperty() + ap = a.property aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) - bfp = a.GetBackfaceProperty() + bfp = a.actor.GetBackfaceProperty() if bfp and hasattr(a, "_bfprop"): a._bfprop = bfp - a.SetBackfaceProperty(None) + a.actor.SetBackfaceProperty(None) elif key == "Right": if self.clicked_actor in self.get_meshes(): - ap = self.clicked_actor.GetProperty() + ap = self.clicked_actor.property aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if ( @@ -3542,25 +3554,25 @@ def _keypress(self, iren, event): and self.clicked_actor._bfprop ): # put back - self.clicked_actor.SetBackfaceProperty(self.clicked_actor._bfprop) + self.clicked_actor.actor.SetBackfaceProperty(self.clicked_actor._bfprop) else: for a in self.get_meshes(): - ap = a.GetProperty() + ap = a.property aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if aal == 1 and hasattr(a, "_bfprop") and a._bfprop: - a.SetBackfaceProperty(a._bfprop) + a.actor.SetBackfaceProperty(a._bfprop) elif key in ("slash", "Up"): if self.clicked_actor in self.get_meshes(): - self.clicked_actor.GetProperty().SetOpacity(1) + self.clicked_actor.property.SetOpacity(1) if hasattr(self.clicked_actor, "_bfprop") and self.clicked_actor._bfprop: - self.clicked_actor.SetBackfaceProperty(self.clicked_actor._bfprop) + self.clicked_actor.actor.SetBackfaceProperty(self.clicked_actor._bfprop) else: for a in self.get_meshes(): - a.GetProperty().SetOpacity(1) + a.property.SetOpacity(1) if hasattr(a, "_bfprop") and a._bfprop: - a.SetBackfaceProperty(a._bfprop) + a.actor.SetBackfaceProperty(a._bfprop) elif key == "P": if self.clicked_actor in self.get_meshes(): @@ -3569,19 +3581,13 @@ def _keypress(self, iren, event): acts = self.get_meshes() for ia in acts: try: - ps = ia.GetProperty().GetPointSize() + ps = ia.property.GetPointSize() if ps > 1: - ia.GetProperty().SetPointSize(ps - 1) - ia.GetProperty().SetRepresentationToPoints() + ia.property.SetPointSize(ps - 1) + ia.property.SetRepresentationToPoints() except AttributeError: pass - elif key == "U": - pval = renderer.GetActiveCamera().GetParallelProjection() - renderer.GetActiveCamera().SetParallelProjection(not pval) - if pval: - renderer.ResetCamera() - elif key == "p": if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] @@ -3589,21 +3595,27 @@ def _keypress(self, iren, event): acts = self.get_meshes() for ia in acts: try: - ps = ia.GetProperty().GetPointSize() - ia.GetProperty().SetPointSize(ps + 2) - ia.GetProperty().SetRepresentationToPoints() + ps = ia.property.GetPointSize() + ia.property.SetPointSize(ps + 2) + ia.property.SetRepresentationToPoints() except AttributeError: pass elif key == "w": if self.clicked_actor and self.clicked_actor in self.get_meshes(): - self.clicked_actor.GetProperty().SetRepresentationToWireframe() + self.clicked_actor.property.SetRepresentationToWireframe() else: for a in self.get_meshes(): - if a.GetProperty().GetRepresentation() == 1: # toggle - a.GetProperty().SetRepresentationToSurface() + if a.property.GetRepresentation() == 1: # toggle + a.property.SetRepresentationToSurface() else: - a.GetProperty().SetRepresentationToWireframe() + a.property.SetRepresentationToWireframe() + + elif key == "U": + pval = renderer.GetActiveCamera().GetParallelProjection() + renderer.GetActiveCamera().SetParallelProjection(not pval) + if pval: + renderer.ResetCamera() elif key == "r": renderer.ResetCamera() @@ -3753,17 +3765,17 @@ def _keypress(self, iren, event): elif key == "s": if self.clicked_actor and self.clicked_actor in self.get_meshes(): - self.clicked_actor.GetProperty().SetRepresentationToSurface() + self.clicked_actor.property.SetRepresentationToSurface() else: for a in self.get_meshes(): - a.GetProperty().SetRepresentationToSurface() + a.property.SetRepresentationToSurface() elif key == "1": self._icol += 1 if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] - self.clicked_actor.GetProperty().SetColor(pal[(self._icol) % 10]) + self.clicked_actor.property.SetColor(pal[(self._icol) % 10]) elif key == "2": self._icol += 1 @@ -3772,14 +3784,14 @@ def _keypress(self, iren, event): if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] - self.clicked_actor.GetProperty().SetColor(pal[(self._icol) % 10]) + self.clicked_actor.property.SetColor(pal[(self._icol) % 10]) elif key == "3": bsc = ["b5", "cyan5", "g4", "o5", "p5", "r4", "teal4", "yellow4"] self._icol += 1 if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() - self.clicked_actor.GetProperty().SetColor(vedo.get_color(bsc[(self._icol) % len(bsc)])) + self.clicked_actor.property.SetColor(vedo.get_color(bsc[(self._icol) % len(bsc)])) elif key == "4": if self.clicked_actor: @@ -3968,10 +3980,10 @@ def _keypress(self, iren, event): acts = self.get_meshes() for ia in acts: try: - ev = ia.GetProperty().GetEdgeVisibility() - ia.GetProperty().SetEdgeVisibility(not ev) - ia.GetProperty().SetRepresentationToSurface() - ia.GetProperty().SetLineWidth(0.1) + ev = ia.property.GetEdgeVisibility() + ia.property.SetEdgeVisibility(not ev) + ia.property.SetRepresentationToSurface() + ia.property.SetLineWidth(0.1) except AttributeError: pass @@ -3997,12 +4009,12 @@ def _keypress(self, iren, event): for ia in acts: if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) - intrp = ia.GetProperty().GetInterpolation() - # print(intrp, ia.GetProperty().GetInterpolationAsString()) + intrp = ia.property.GetInterpolation() + # print(intrp, ia.property.GetInterpolationAsString()) if intrp > 0: - ia.GetProperty().SetInterpolation(0) # flat + ia.property.SetInterpolation(0) # flat else: - ia.GetProperty().SetInterpolation(2) # phong + ia.property.SetInterpolation(2) # phong elif key == "n": # show normals to an actor if self.clicked_actor in self.get_meshes(): diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 7820e1d1..c21a0cf8 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -380,13 +380,13 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): """ for a in objs: - if a in self.actors: + if a in self.objects: # should not add twice the same object in plot continue if isinstance(a, vedo.Points): # hacky way to identify Points if a.ncells == a.npoints: - poly = a.polydata(False) + poly = a if poly.GetNumberOfPolys() == 0 and poly.GetNumberOfLines() == 0: as3d = False rescale = True @@ -412,7 +412,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): # rx2,ry2,rz2 = a.corner2 # ry2 = (ry2-py) * self.yscale + py # b = shapes.Rectangle([rx1,0,rz1], [rx2,ry2,rz2], radius=a.radius).z(a.z()) - # b.SetProperty(a.GetProperty()) + # b.SetProperty(a.property) # b.y(py / self.yscale) # a = b @@ -650,7 +650,8 @@ def add_legend( px, py = pos[0], pos[1] shx, shy = x0, y1 - aleg.pos(px - shx, py * self.yscale - shy, self.z() + sx / 50 + z) + zpos = aleg.GetPosition()[2] + aleg.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg From dfa75f5d4bfa4a725e19bdc44a21835cb9251dfc Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 18:17:43 +0200 Subject: [PATCH 014/251] apply super() --- vedo/addons.py | 8 +-- vedo/assembly.py | 32 ++++++--- vedo/base.py | 144 ++++++---------------------------------- vedo/plotter.py | 52 ++++++++------- vedo/pointcloud.py | 109 +++++++++++++++++++++++++++++- vedo/shapes.py | 88 ++++++++++++------------ vedo/tetmesh.py | 5 +- vedo/transformations.py | 80 +++++++++++++++++++++- vedo/ugrid.py | 5 +- vedo/utils.py | 83 ++--------------------- vedo/version.py | 2 +- vedo/volume.py | 20 +++--- 12 files changed, 326 insertions(+), 302 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 41cfb22c..7913a264 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1260,12 +1260,12 @@ def ScalarBar3D( tacts.append(nantx) if draw_box: - tacts.append(scale.box().lw(1)) + tacts.append(scale.box().lw(1).c(c)) - for a in tacts: + for a in tacts+scales: + a.shift(pos) a.actor.PickableOff() - a.pos(pos) - a.lighting("off") + a.property.LightingOff() mtacts = merge(tacts) mtacts.actor.PickableOff() diff --git a/vedo/assembly.py b/vedo/assembly.py index 8ff5d5cf..61b58de8 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -364,15 +364,22 @@ def __contains__(self, obj): return obj in self.objects - def apply_transform(self, LT, concatenate=False): - """ - """ - self.SetPosition(LT.T.GetPosition()) - self.SetOrientation(LT.T.GetOrientation()) - self.SetScale(LT.T.GetScale()) + def apply_transform(self, LT, concatenate=1): + """Apply a linear transformation to the object.""" if concatenate: self.transform.concatenate(LT) + self.SetPosition(self.transform.T.GetPosition()) + self.SetOrientation(self.transform.T.GetOrientation()) + self.SetScale(self.transform.T.GetScale()) return self + + # TODO #### + def propagate_transform(self): + """Propagate the transformation to all parts.""" + # navigate the assembly and apply the transform to all parts + # and reset position, orientation and scale of the assembly + raise NotImplementedError() + def pos(self, x=None, y=None, z=None): """Set/Get object position.""" @@ -389,8 +396,7 @@ def pos(self, x=None, y=None, z=None): z = 0 q = self.transform.position - LT = LinearTransform() - LT.translate([x,y,z]-q) + LT = LinearTransform().translate([x,y,z]-q) return self.apply_transform(LT) def shift(self, dx, dy=0, dz=0): @@ -430,6 +436,16 @@ def z(self, val=None): self.pos(p[0], p[1], val) return self + def rotate_x(self, angle): + """Rotate object around x axis.""" + LT = LinearTransform().rotate_x(angle) + return self.apply_transform(LT) + + def rotate_y(self, angle): + """Rotate object around y axis.""" + LT = LinearTransform().rotate_y(angle) + return self.apply_transform(LT) + def rotate_z(self, angle): """Rotate object around z axis.""" LT = LinearTransform().rotate_z(angle) diff --git a/vedo/base.py b/vedo/base.py index c1dac16d..283cb7bc 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -30,7 +30,7 @@ ############################################################################### -class _DataArrayHelper: +class DataArrayHelper: # Internal use only. # Helper class to manage data associated to either # points (or vertices) and cells (or faces). @@ -443,7 +443,7 @@ def pos(self, x=None, y=None, z=None): q = self.transform.position LT = LinearTransform() - LT.translate([x,y,z]-q) + LT.translate([x,y,z] - q) return self.apply_transform(LT) def shift(self, dx=0, dy=0, dz=0): @@ -710,7 +710,7 @@ def bounds(self): pts = self.points() xmin, ymin, zmin = np.min(pts, axis=0) xmax, ymax, zmax = np.max(pts, axis=0) - return [xmin, xmax, ymin, ymax, zmin, zmax] + return (xmin, xmax, ymin, ymax, zmin, zmax) except (AttributeError, ValueError): return self.GetBounds() @@ -833,6 +833,8 @@ def __init__(self): super().__init__() + print("BaseActor __init__") + self.mapper = None self._caption = None self.property = None @@ -847,15 +849,6 @@ def inputdata(self): # return self.GetMapper().GetInput() return self - # def modified(self): - # """Use in conjunction with `tonumpy()` - # to update any modifications to the volume array""" - # sc = self.GetPointData().GetScalars() - # if sc: - # sc.Modified() - # self.GetPointData().Modified() - # return self - @property def npoints(self): """Retrieve the number of points.""" @@ -909,9 +902,9 @@ def points(self, pts=None, transformed=True): vpts.SetData(arr) vpts.Modified() # reset mesh to identity matrix position/rotation: - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.point_locator = None self.cell_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.transform = LinearTransform() return self @@ -936,13 +929,12 @@ def delete_cells(self, ids): Remove cells from the mesh object by their ID. Points (vertices) are not removed (you may use `.clean()` to remove those). """ - data = self - data.BuildLinks() + self.BuildLinks() for cid in ids: - data.DeleteCell(cid) - data.RemoveDeletedCells() - data.Modified() - self._mapper.Modified() + self.DeleteCell(cid) + self.RemoveDeletedCells() + self.Modified() + self.mapper.Modified() self.pipeline = utils.OperationNode( "delete_cells", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" ) @@ -1001,98 +993,6 @@ def count_vertices(self): varr = vc.GetOutput().GetCellData().GetArray("VertexCount") return utils.vtk2numpy(varr) - def lighting( - self, - style="", - ambient=None, - diffuse=None, - specular=None, - specular_power=None, - specular_color=None, - metallicity=None, - roughness=None, - ): - """ - Set the ambient, diffuse, specular and specular_power lighting constants. - - Arguments: - style : (str) - preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` - ambient : (float) - ambient fraction of emission [0-1] - diffuse : (float) - emission of diffused light in fraction [0-1] - specular : (float) - fraction of reflected light [0-1] - specular_power : (float) - precision of reflection [1-100] - specular_color : (color) - color that is being reflected by the surface - - - - Examples: - - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) - """ - pr = self.property - - if style: - - if isinstance(pr, vtk.vtkVolumeProperty): - self.shade(True) - if style == "off": - self.shade(False) - elif style == "ambient": - style = "default" - self.shade(False) - else: - if style != "off": - pr.LightingOn() - - if style == "off": - pr.SetInterpolationToFlat() - pr.LightingOff() - return self ############## - - if hasattr(pr, "GetColor"): # could be Volume - c = pr.GetColor() - else: - c = (1, 1, 0.99) - mpr = self.mapper - if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): - c = (1,1,0.99) - if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] - elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] - elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] - elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] - elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] - elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] - else: - vedo.logger.error("in lighting(): Available styles are") - vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") - raise RuntimeError() - pr.SetAmbient(pars[0]) - pr.SetDiffuse(pars[1]) - pr.SetSpecular(pars[2]) - pr.SetSpecularPower(pars[3]) - if hasattr(pr, "GetColor"): - pr.SetSpecularColor(pars[4]) - - if ambient is not None: pr.SetAmbient(ambient) - if diffuse is not None: pr.SetDiffuse(diffuse) - if specular is not None: pr.SetSpecular(specular) - if specular_power is not None: pr.SetSpecularPower(specular_power) - if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) - if utils.vtk_version_at_least(9): - if metallicity is not None: - pr.SetInterpolationToPBR() - pr.SetMetallic(metallicity) - if roughness is not None: - pr.SetInterpolationToPBR() - pr.SetRoughness(roughness) - - return self - def print_histogram( self, bins=10, @@ -1158,7 +1058,7 @@ def pointdata(self): `myobj.pointdata.remove(name)` to remove this array """ - return _DataArrayHelper(self, 0) + return DataArrayHelper(self, 0) @property def celldata(self): @@ -1175,7 +1075,7 @@ def celldata(self): `myobj.celldata.remove(name)` to remove this array """ - return _DataArrayHelper(self, 1) + return DataArrayHelper(self, 1) @property def metadata(self): @@ -1192,7 +1092,7 @@ def metadata(self): `myobj.metadata.remove(name)` to remove this array """ - return _DataArrayHelper(self, 2) + return DataArrayHelper(self, 2) def map_cells_to_points(self, arrays=(), move=False): """ @@ -2267,10 +2167,12 @@ class BaseActor2D(vtk.vtkActor2D): def __init__(self): """Manage 2D objects.""" super().__init__() + self.mapper = None self.property = self.GetProperty() self.filename = "" + def layer(self, value=None): """Set/Get the layer number in the overlay planes into which to render.""" if value is None: @@ -2361,12 +2263,6 @@ def add_observer(self, event_name, func, priority=0): ############################################################################### funcs -def _getinput(obj): - if isinstance(obj, (vtk.vtkVolume, vtk.vtkActor)): - return obj.GetMapper().GetInput() - return obj - - def probe_points(dataset, pts): """ Takes a `Volume` (or any other vtk data set) @@ -2400,7 +2296,7 @@ def _readpoints(): src = vtk.vtkProgrammableSource() src.SetExecuteMethod(_readpoints) src.Update() - img = _getinput(dataset) + img = dataset probeFilter = vtk.vtkProbeFilter() probeFilter.SetSourceData(img) probeFilter.SetInputConnection(src.GetOutputPort()) @@ -2432,9 +2328,8 @@ def probe_line(dataset, p1, p2, res=100): line.SetResolution(res) line.SetPoint1(p1) line.SetPoint2(p2) - img = _getinput(dataset) probeFilter = vtk.vtkProbeFilter() - probeFilter.SetSourceData(img) + probeFilter.SetSourceData(dataset) probeFilter.SetInputConnection(line.GetOutputPort()) probeFilter.Update() poly = probeFilter.GetOutput() @@ -2455,12 +2350,11 @@ def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) """ - img = _getinput(dataset) plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) planeCut = vtk.vtkCutter() - planeCut.SetInputData(img) + planeCut.SetInputData(dataset) planeCut.SetCutFunction(plane) planeCut.Update() poly = planeCut.GetOutput() diff --git a/vedo/plotter.py b/vedo/plotter.py index 2b24e6ae..f4cf338b 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2682,49 +2682,51 @@ def mode_select(objs): def _scan_input_return_acts(self, wannabe_acts): - # scan the input of show + # scan the input and return a list of actors if not utils.is_sequence(wannabe_acts): wannabe_acts = [wannabe_acts] wannabe_acts2 = [] for a in wannabe_acts: - try: + + try: wannabe_acts2.append(a.actor) - except: + except AttributeError: wannabe_acts2.append(a) # already actor + try: + wannabe_acts2.append(a.scalarbar) + except AttributeError: pass + + try: + for sh in a.shadows: + wannabe_acts2.append(sh.actor) + except AttributeError: pass + + try: + wannabe_acts2.append(a.trail.actor) + if a.trail.shadows: # trails may also have shadows + for sh in a.trail.shadows: + wannabe_acts2.append(sh.actor) + except AttributeError: pass + + # try: wannabe_acts2.append(a.axes) + # except AttributeError: pass + scanned_acts = [] for a in wannabe_acts2: # scan content of list if a is None: - pass + continue elif isinstance(a, vtk.vtkActor): - scanned_acts.append(a) - # if isinstance(a, vedo.base.BaseActor): - # if a.shadows: - # for sh in a.shadows: - # scanned_acts.append(sh.actor) - - # if a.trail: - # scanned_acts.append(a.trail.actor) - # # trails may also have shadows: - # if a.trail.shadows: - # for sh in a.trail.shadows: - # scanned_acts.append(sh.actor) - - # if a._caption: - # scanned_acts.append(a._caption) - elif isinstance(a, vtk.vtkActor2D): scanned_acts.append(a) elif isinstance(a, vtk.vtkAssembly): scanned_acts.append(a) - # if a.trail: - # scanned_acts.append(a.trail.actor) elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): scanned_acts.append(a.actor) @@ -2779,6 +2781,9 @@ def _scan_input_return_acts(self, wannabe_acts): elif isinstance(a, vtk.vtkLight): self.renderer.AddLight(a) + elif isinstance(a, vtk.vtkPolyData): + scanned_acts.append(vedo.Mesh(a).actor) + elif isinstance(a, vtk.vtkMultiBlockDataSet): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) @@ -2787,9 +2792,6 @@ def _scan_input_return_acts(self, wannabe_acts): elif isinstance(b, vtk.vtkImageData): scanned_acts.append(vedo.Volume(b).actor) - elif isinstance(a, vtk.vtkPolyData): - scanned_acts.append(vedo.Mesh(a).actor) - elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): scanned_acts.append(a) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 21c995fe..818d02c2 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -706,8 +706,22 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): return pt + +class PointsVisual: + """Class to manage the visual aspects of a ``Points`` object.""" + pass + # def __init__(self): + # self.actor = vtk.vtkActor() + + # self.data = None + # self.mapper = None + # self.property = None + + # print("PPP") + + ################################################### -class Points(BaseActor, vtk.vtkPolyData): +class Points(PointsVisual, BaseActor, vtk.vtkPolyData): """Work with point clouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1, blur=False, emissive=True): @@ -752,6 +766,7 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() + self.transform = LinearTransform() self.actor.data = self # self.name = "Points" # better not to give it a name here @@ -1452,6 +1467,98 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): ) return dists + def lighting( + self, + style="", + ambient=None, + diffuse=None, + specular=None, + specular_power=None, + specular_color=None, + metallicity=None, + roughness=None, + ): + """ + Set the ambient, diffuse, specular and specular_power lighting constants. + + Arguments: + style : (str) + preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` + ambient : (float) + ambient fraction of emission [0-1] + diffuse : (float) + emission of diffused light in fraction [0-1] + specular : (float) + fraction of reflected light [0-1] + specular_power : (float) + precision of reflection [1-100] + specular_color : (color) + color that is being reflected by the surface + + + + Examples: + - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) + """ + pr = self.property + + if style: + + if isinstance(pr, vtk.vtkVolumeProperty): + self.shade(True) + if style == "off": + self.shade(False) + elif style == "ambient": + style = "default" + self.shade(False) + else: + if style != "off": + pr.LightingOn() + + if style == "off": + pr.SetInterpolationToFlat() + pr.LightingOff() + return self ############## + + if hasattr(pr, "GetColor"): # could be Volume + c = pr.GetColor() + else: + c = (1, 1, 0.99) + mpr = self.mapper + if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): + c = (1,1,0.99) + if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] + elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] + elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] + elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] + elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] + elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] + else: + vedo.logger.error("in lighting(): Available styles are") + vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") + raise RuntimeError() + pr.SetAmbient(pars[0]) + pr.SetDiffuse(pars[1]) + pr.SetSpecular(pars[2]) + pr.SetSpecularPower(pars[3]) + if hasattr(pr, "GetColor"): + pr.SetSpecularColor(pars[4]) + + if ambient is not None: pr.SetAmbient(ambient) + if diffuse is not None: pr.SetDiffuse(diffuse) + if specular is not None: pr.SetSpecular(specular) + if specular_power is not None: pr.SetSpecularPower(specular_power) + if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) + if utils.vtk_version_at_least(9): + if metallicity is not None: + pr.SetInterpolationToPBR() + pr.SetMetallic(metallicity) + if roughness is not None: + pr.SetInterpolationToPBR() + pr.SetRoughness(roughness) + + return self + def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: diff --git a/vedo/shapes.py b/vedo/shapes.py index 94419455..297ddd8d 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -279,7 +279,7 @@ def __init__( gly.Update() - Mesh.__init__(self, gly.GetOutput(), c, alpha) + super().__init__(gly.GetOutput(), c, alpha) self.flat() if lighting is not None: self.property.SetLighting(lighting) @@ -407,7 +407,7 @@ def __init__( tgn = vtk.vtkPolyDataNormals() tgn.SetInputData(tg.GetOutput()) tgn.Update() - Mesh.__init__(self, tgn.GetOutput(), c, alpha) + super().__init__(tgn.GetOutput(), c, alpha) self.name = "Tensors" @@ -502,7 +502,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): top = np.asarray(p1, dtype=float) base = np.asarray(p0, dtype=float) - Mesh.__init__(self, poly, c, alpha) + super().__init__(poly, c, alpha) self.lw(lw) self.property.LightingOff() self.actor.PickableOff() @@ -799,7 +799,7 @@ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1 xmx = np.max(listp, axis=0) dlen = np.linalg.norm(xmx - xmn) * np.clip(spacing, 0.01, 1.0) / 10 if not dlen: - Mesh.__init__(self, vtk.vtkPolyData(), c, alpha) + super().__init__(vtk.vtkPolyData(), c, alpha) self.name = "DashedLine (void)" return @@ -837,7 +837,7 @@ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1 polylns.AddInputData(line_source.GetOutput()) polylns.Update() - Mesh.__init__(self, polylns.GetOutput(), c, alpha) + super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") self.base = listp[0] if closed: @@ -938,7 +938,7 @@ def _getpts(pts, revd=False): vct = vtk.vtkContourTriangulator() vct.SetInputData(poly) vct.Update() - Mesh.__init__(self, vct.GetOutput(), c, alpha) + super().__init__(vct.GetOutput(), c, alpha) self.flat() self.property.LightingOff() self.name = "RoundedLine" @@ -1025,7 +1025,7 @@ def __init__( polylns.Update() - Mesh.__init__(self, polylns.GetOutput(), c, alpha) + super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: self.property.SetLineStipplePattern(0xF0F0) @@ -1340,7 +1340,7 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): glyph.OrientOn() glyph.Update() - Mesh.__init__(self, glyph.GetOutput()) + super().__init__(glyph.GetOutput()) self.actor.PickableOff() prop = vtk.vtkProperty() @@ -1715,7 +1715,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): c = None tuf.Update() - Mesh.__init__(self, tuf.GetOutput(), c, alpha) + super().__init__(tuf.GetOutput(), c, alpha) self.phong() if usingColScals: self.mapper.SetScalarModeToUsePointFieldData() @@ -1832,7 +1832,7 @@ def __init__( width = aline.diagonal_size() / 20.0 ribbon_filter.SetWidth(width) ribbon_filter.Update() - Mesh.__init__(self, ribbon_filter.GetOutput(), c, alpha) + super().__init__(ribbon_filter.GetOutput(), c, alpha) self.name = "Ribbon" ############################################## return ###################################### @@ -1905,7 +1905,7 @@ def __init__( rsf.SetInputData(merged_pd.GetOutput()) rsf.Update() - Mesh.__init__(self, rsf.GetOutput(), c, alpha) + super().__init__(rsf.GetOutput(), c, alpha) self.name = "Ribbon" @@ -1993,7 +1993,7 @@ def __init__( tf.SetTransform(t) tf.Update() - Mesh.__init__(self, tf.GetOutput(), c, alpha) + super().__init__(tf.GetOutput(), c, alpha) self.pos(start_pt) self.phong().lighting("plastic") @@ -2196,7 +2196,7 @@ def __init__( tf.SetTransform(t) tf.Update() - Mesh.__init__(self, tf.GetOutput(), c="k1") + super().__init__(tf.GetOutput(), c="k1") self.pos(start_pt) self.lighting("off") self.actor.DragableOff() @@ -2335,7 +2335,7 @@ class Triangle(Mesh): def __init__(self, p1, p2, p3, c="green7", alpha=1.0): """Create a triangle from 3 points in space.""" - Mesh.__init__(self, [[p1, p2, p3], [[0, 1, 2]]], c, alpha) + super().__init__([[p1, p2, p3], [[0, 1, 2]]], c, alpha) self.property.LightingOff() self.name = "Triangle" @@ -2355,7 +2355,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): x, y = utils.pol2cart(np.ones_like(t) * r, t) faces = [list(range(nsides))] # do not use: vtkRegularPolygonSource - Mesh.__init__(self, [np.c_[x, y], faces], c, alpha) + super().__init__([np.c_[x, y], faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) @@ -2442,7 +2442,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al if line: apts.append(pts[0]) poly = utils.buildPolyData(apts, lines=list(range(len(apts)))) - Mesh.__init__(self, poly, c, alpha) + super().__init__(poly, c, alpha) self.lw(2) else: apts.append((0, 0, 0)) @@ -2451,7 +2451,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al cell = [2 * n, i, i + 1] cells.append(cell) cells.append([2 * n, i + 1, 0]) - Mesh.__init__(self, [apts, cells], c, alpha) + super().__init__([apts, cells], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) @@ -2494,7 +2494,7 @@ def __init__( ps.SetRadialResolution(res_r) ps.SetCircumferentialResolution(res_phi) ps.Update() - Mesh.__init__(self, ps.GetOutput(), c, alpha) + super().__init__(ps.GetOutput(), c, alpha) self.flat() self.pos(utils.make3d(pos)) self.name = "Disc" @@ -2554,7 +2554,7 @@ def __init__( ar.SetNegative(invert) ar.SetResolution(res) ar.Update() - Mesh.__init__(self, ar.GetOutput(), c, alpha) + super().__init__(ar.GetOutput(), c, alpha) self.pos(self.base) self.lw(2).lighting("off") self.name = "Arc" @@ -2620,7 +2620,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): [8, 6, 7], [9, 8, 1], ] - Mesh.__init__(self, [points * r, faces], c=c, alpha=alpha) + super().__init__([points * r, faces], c=c, alpha=alpha) for _ in range(subdivisions): self.subdivide(method=1) @@ -2666,7 +2666,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) gf = vtk.vtkGeometryFilter() gf.SetInputData(img) gf.Update() - Mesh.__init__(self, gf.GetOutput(), c, alpha) + super().__init__(gf.GetOutput(), c, alpha) self.lw(0.1) cgpts = self.points() - (0.5, 0.5, 0.5) @@ -2692,7 +2692,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) ss.SetPhiResolution(res_phi) ss.Update() - Mesh.__init__(self, ss.GetOutput(), c, alpha) + super().__init__(ss.GetOutput(), c, alpha) self.phong() self.pos(pos) @@ -2786,7 +2786,7 @@ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): glyph.SetInputData(pd) glyph.Update() - Mesh.__init__(self, glyph.GetOutput(), alpha=alpha) + super().__init__(glyph.GetOutput(), alpha=alpha) self.pos(base) self.base = base self.top = centers[-1] @@ -2817,7 +2817,7 @@ def __init__(self, style=1, r=1.0): tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) - Mesh.__init__(self, tss, c="w") + super().__init__(tss, c="w") atext = vtk.vtkTexture() pnm_reader = vtk.vtkJPEGReader() fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) @@ -2901,7 +2901,7 @@ def __init__( pd = tf.GetOutput() self.transformation = t - Mesh.__init__(self, pd, c, alpha) + super().__init__(pd, c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) @@ -3027,7 +3027,7 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) verts = np.array(verts) - Mesh.__init__(self, [verts, faces], c, alpha) + super().__init__([verts, faces], c, alpha) else: ps = vtk.vtkPlaneSource() @@ -3041,7 +3041,7 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. tf0.SetTransform(t0) tf0.Update() poly = tf0.GetOutput() - Mesh.__init__(self, poly, c, alpha) + super().__init__(poly, c, alpha) self.pos(pos) self.wireframe().lw(lw) @@ -3088,7 +3088,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tf.SetInputData(poly) tf.SetTransform(t) tf.Update() - Mesh.__init__(self, tf.GetOutput(), c, alpha) + super().__init__(tf.GetOutput(), c, alpha) self.lighting("off") self.pos(pos) self.name = "Plane" @@ -3203,7 +3203,7 @@ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1 pts = ([0.0, 0.0, 0.0], p1r - p1, p2 - p1, p2l - p1) faces = [(0, 1, 2, 3)] - Mesh.__init__(self, [pts, faces], color, alpha) + super().__init__([pts, faces], color, alpha) self.pos(p1) self.property.LightingOff() self.name = "Rectangle" @@ -3275,7 +3275,7 @@ def __init__(self, pos=(0, 0, 0), ] vtc = utils.numpy2vtk(tc) pd.GetPointData().SetTCoords(vtc) - Mesh.__init__(self, pd, c, alpha) + super().__init__(pd, c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) @@ -3328,7 +3328,7 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al tbs.SetOutputPointsPrecision(vtk.vtkAlgorithm.SINGLE_PRECISION) tbs.Update() poly = tbs.GetOutput() - Mesh.__init__(self, poly, c=c, alpha=alpha) + super().__init__(poly, c=c, alpha=alpha) self.pos(pos) self.lw(1).lighting("off") self.base = np.array([0.5, 0.5, 0.0]) @@ -3401,7 +3401,7 @@ def __init__( thickness = r1 / 10 tuf.SetRadius(thickness) tuf.Update() - Mesh.__init__(self, tuf.GetOutput(), c, alpha) + super().__init__(tuf.GetOutput(), c, alpha) self.phong() self.pos(start_pt) self.base = np.array(start_pt, dtype=float) @@ -3457,7 +3457,7 @@ def __init__( tf.Update() pd = tf.GetOutput() - Mesh.__init__(self, pd, c, alpha) + super().__init__(pd, c, alpha) self.phong() self.pos(pos) self.base = base + pos @@ -3477,7 +3477,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), con.SetHeight(height) con.SetDirection(axis) con.Update() - Mesh.__init__(self, con.GetOutput(), c, alpha) + super().__init__(con.GetOutput(), c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) @@ -3534,7 +3534,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow for i in range(n - 1): faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) - Mesh.__init__(self, [pts, faces], c, alpha) + super().__init__([pts, faces], c, alpha) else: @@ -3546,7 +3546,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) pfs.Update() - Mesh.__init__(self, pfs.GetOutput(), c, alpha) + super().__init__(pfs.GetOutput(), c, alpha) self.phong() if len(pos) == 2: @@ -3583,7 +3583,7 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): contours.GenerateValues(1, 0.01, 0.01) contours.Update() - Mesh.__init__(self, contours.GetOutput(), c, alpha) + super().__init__(contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() self.pos(pos) @@ -3616,7 +3616,7 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 contours.GenerateValues(1, value, value) contours.Update() - Mesh.__init__(self, contours.GetOutput(), c, alpha) + super().__init__(contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper.ScalarVisibilityOff() self.pos(pos) @@ -3802,7 +3802,7 @@ def __init__( tf.Update() poly = tf.GetOutput() - Mesh.__init__(self, poly, c, alpha) + super().__init__(poly, c, alpha) self.pos(mq) self.name = "Brace" self.base = q1 @@ -3827,7 +3827,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0): [7, 1, 8], [7, 11, 6], [8, 1, 9], [8, 11, 7], [9, 1,10], [9, 11, 8], [10,1, 0],[10,11, 9]] - Mesh.__init__(self, [pts, fcs], c, alpha) + super().__init__([pts, fcs], c, alpha) self.rotate_x(90) self.scale(r).lighting("shiny") @@ -3853,7 +3853,7 @@ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0): c2 = Cylinder(r=thickness * s, height=2 * s).rotate_x(90) c3 = Cylinder(r=thickness * s, height=2 * s).rotate_y(90) poly = merge(c1, c2, c3).color(c).alpha(alpha).pos(pos) - Mesh.__init__(self, poly, c, alpha) + super().__init__(poly, c, alpha) self.name = "Cross3D" @@ -3970,7 +3970,7 @@ def __init__(self, name, res=51, n=25, seed=1): pfs.SetScalarModeToZ() pfs.Update() - Mesh.__init__(self, pfs.GetOutput()) + super().__init__(pfs.GetOutput()) if name != 'Kuen': self.normalize() if name == 'Dini': self.scale(0.4) @@ -4137,7 +4137,7 @@ def __init__( txt, s, font, hspacing, vspacing, depth, italic, justify, literal ) - Mesh.__init__(self, tpoly, c, alpha) + super().__init__(tpoly, c, alpha) self.lighting("off") self.pos(pos) self.actor.PickableOff() @@ -4882,7 +4882,7 @@ def __init__(self, pts): fe.Update() out = fe.GetOutput() - Mesh.__init__(self, out, c=mesh.color(), alpha=0.75) + super().__init__(out, c=mesh.color(), alpha=0.75) # self.triangulate() self.flat() self.name = "ConvexHull" diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 97a85b31..19432a72 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -126,8 +126,9 @@ def __init__( mapper : (str) choose a visualization style in `['tetra', 'raycast', 'zsweep']` """ - vtk.vtkVolume.__init__(self) - BaseGrid.__init__(self) +# vtk.vtkVolume.__init__(self) +# BaseGrid.__init__(self) + super().__init__() # inputtype = str(type(inputobj)) # print('TetMesh inputtype', inputtype) diff --git a/vedo/transformations.py b/vedo/transformations.py index 2c2e7387..5f04ed48 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -16,7 +16,17 @@ ![](https://vedo.embl.es/images/basic/pca.png) """ -__all__ = ["LinearTransform"] +__all__ = [ + "LinearTransform", + "spher2cart", + "cart2spher", + "cart2cyl", + "cyl2cart", + "cyl2spher", + "spher2cyl", + "cart2pol", + "pol2cart", +] ################################################### def _is_sequence(arg): @@ -399,3 +409,71 @@ def set_orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=F # self.point_locator = None # self.cell_locator = None return self + + + +######################################################################## +# 2d ###### +def cart2pol(x, y): + """2D Cartesian to Polar coordinates conversion.""" + theta = np.arctan2(y, x) + rho = np.hypot(x, y) + return np.array([rho, theta]) + + +def pol2cart(rho, theta): + """2D Polar to Cartesian coordinates conversion.""" + x = rho * np.cos(theta) + y = rho * np.sin(theta) + return np.array([x, y]) + +# 3d ###### +def cart2spher(x, y, z): + """3D Cartesian to Spherical coordinate conversion.""" + hxy = np.hypot(x, y) + rho = np.hypot(hxy, z) + theta = np.arctan2(hxy, z) + phi = np.arctan2(y, x) + return np.array([rho, theta, phi]) + + +def spher2cart(rho, theta, phi): + """3D Spherical to Cartesian coordinate conversion.""" + st = np.sin(theta) + sp = np.sin(phi) + ct = np.cos(theta) + cp = np.cos(phi) + rst = rho * st + x = rst * cp + y = rst * sp + z = rho * ct + return np.array([x, y, z]) + + +def cart2cyl(x, y, z): + """3D Cartesian to Cylindrical coordinate conversion.""" + rho = np.sqrt(x * x + y * y) + theta = np.arctan2(y, x) + return np.array([rho, theta, z]) + + +def cyl2cart(rho, theta, z): + """3D Cylindrical to Cartesian coordinate conversion.""" + x = rho * np.cos(theta) + y = rho * np.sin(theta) + return np.array([x, y, z]) + + +def cyl2spher(rho, theta, z): + """3D Cylindrical to Spherical coordinate conversion.""" + rhos = np.sqrt(rho * rho + z * z) + phi = np.arctan2(rho, z) + return np.array([rhos, phi, theta]) + + +def spher2cyl(rho, theta, phi): + """3D Spherical to Cylindrical coordinate conversion.""" + rhoc = rho * np.sin(theta) + z = rho * np.cos(theta) + return np.array([rhoc, phi, z]) + diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 47d951e4..9ff6da00 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -44,8 +44,9 @@ def __init__(self, inputobj=None): - VTK_PENTAGONAL_PRISM = 16 """ - vtk.vtkActor.__init__(self) - BaseGrid.__init__(self) + #vtk.vtkActor.__init__(self) + #BaseGrid.__init__(self) + super().__init__() inputtype = str(type(inputobj)) self._data = None diff --git a/vedo/utils.py b/vedo/utils.py index 1434b23d..1d0a9557 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -43,14 +43,6 @@ "print_info", "make_bands", "pack_spheres", - "spher2cart", - "cart2spher", - "cart2cyl", - "cyl2cart", - "cyl2spher", - "spher2cyl", - "cart2pol", - "pol2cart", "humansort", "print_histogram", "camera_from_quaternion", @@ -1339,73 +1331,6 @@ def precision(x, p, vrange=None, delimiter="e"): return "".join(out) -################################################################################## -# 2d ###### -def cart2pol(x, y): - """2D Cartesian to Polar coordinates conversion.""" - theta = np.arctan2(y, x) - rho = np.hypot(x, y) - return np.array([rho, theta]) - - -def pol2cart(rho, theta): - """2D Polar to Cartesian coordinates conversion.""" - x = rho * np.cos(theta) - y = rho * np.sin(theta) - return np.array([x, y]) - - -# 3d ###### -def cart2spher(x, y, z): - """3D Cartesian to Spherical coordinate conversion.""" - hxy = np.hypot(x, y) - rho = np.hypot(hxy, z) - theta = np.arctan2(hxy, z) - phi = np.arctan2(y, x) - return np.array([rho, theta, phi]) - - -def spher2cart(rho, theta, phi): - """3D Spherical to Cartesian coordinate conversion.""" - st = np.sin(theta) - sp = np.sin(phi) - ct = np.cos(theta) - cp = np.cos(phi) - rst = rho * st - x = rst * cp - y = rst * sp - z = rho * ct - return np.array([x, y, z]) - - -def cart2cyl(x, y, z): - """3D Cartesian to Cylindrical coordinate conversion.""" - rho = np.sqrt(x * x + y * y) - theta = np.arctan2(y, x) - return np.array([rho, theta, z]) - - -def cyl2cart(rho, theta, z): - """3D Cylindrical to Cartesian coordinate conversion.""" - x = rho * np.cos(theta) - y = rho * np.sin(theta) - return np.array([x, y, z]) - - -def cyl2spher(rho, theta, z): - """3D Cylindrical to Spherical coordinate conversion.""" - rhos = np.sqrt(rho * rho + z * z) - phi = np.arctan2(rho, z) - return np.array([rhos, phi, theta]) - - -def spher2cyl(rho, theta, phi): - """3D Spherical to Cylindrical coordinate conversion.""" - rhoc = rho * np.sin(theta) - z = rho * np.cos(theta) - return np.array([rhoc, phi, z]) - - ################################################################################## def grep(filename, tag, column=None, first_occurrence_only=False): """Greps the line in a file that starts with a specific `tag` string inside the file.""" @@ -2689,7 +2614,7 @@ def ctf2lut(tvobj, logscale=False): def get_vtk_name_event(name): """ Return the name of a VTK event. - + Frequently used events are: - KeyPress, KeyRelease: listen to keyboard events - LeftButtonPress, LeftButtonRelease: listen to mouse clicks @@ -2725,9 +2650,9 @@ def get_vtk_name_event(name): if ("mouse" in ln and "mov" in ln) or "over" in ln: event_name = "MouseMove" - + words = [ - "pick", "timer", "reset", "enter", "leave", "char", + "pick", "timer", "reset", "enter", "leave", "char", "error", "warning", "start", "end", "wheel", "clipping", "range", "camera", "render", ] @@ -2735,7 +2660,7 @@ def get_vtk_name_event(name): if w in ln: event_name = event_name.replace(w, w.capitalize()) - event_name = event_name.replace(" ", "") + event_name = event_name.replace(" ", "") if not event_name.endswith("Event"): event_name += "Event" diff --git a/vedo/version.py b/vedo/version.py index e7495b36..d2a2c8f6 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev1' +_version = '2023.5.0+dev2' diff --git a/vedo/volume.py b/vedo/volume.py index e4b15ae3..2ff12909 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -423,7 +423,7 @@ def pad(self, voxels=10, value=0): number of voxels to be added (or a list of length 4) value : (int) intensity value (gray-scale color) of the padding - + Example: ```python from vedo import Volume, dataurl, show @@ -440,14 +440,14 @@ def pad(self, voxels=10, value=0): pf.SetConstant(value) if utils.is_sequence(voxels): pf.SetOutputWholeExtent( - x0 - voxels[0], x1 + voxels[1], - y0 - voxels[2], y1 + voxels[3], - z0 - voxels[4], z1 + voxels[5], + x0 - voxels[0], x1 + voxels[1], + y0 - voxels[2], y1 + voxels[3], + z0 - voxels[4], z1 + voxels[5], ) else: pf.SetOutputWholeExtent( - x0 - voxels, x1 + voxels, - y0 - voxels, y1 + voxels, + x0 - voxels, x1 + voxels, + y0 - voxels, y1 + voxels, z0 - voxels, z1 + voxels, ) pf.Update() @@ -948,10 +948,10 @@ def __init__( if a `list` of values is used for `alphas` this is interpreted as a transfer function along the range of the scalar. """ - vtk.vtkVolume.__init__(self) - BaseGrid.__init__(self) - BaseVolume.__init__(self) - # super().__init__() + #vtk.vtkVolume.__init__(self) + #BaseGrid.__init__(self) + #BaseVolume.__init__(self) + super().__init__() ################### if isinstance(inputobj, str): From c54ca129a7561b86334f8b99761f3ab591334172 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:12:23 +0200 Subject: [PATCH 015/251] disable super() in Points --- vedo/addons.py | 93 +- vedo/applications.py | 31 +- vedo/assembly.py | 20 +- vedo/base.py | 22 +- vedo/dolfin.py | 4 +- vedo/mesh.py | 15 +- vedo/picture.py | 10 +- vedo/pointcloud.py | 2192 +++++++++++++++++++++--------------------- vedo/pyplot.py | 16 +- vedo/settings.py | 2 +- 10 files changed, 1206 insertions(+), 1199 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 7913a264..8abf65e1 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -105,7 +105,7 @@ def __init__( ![](https://vedo.embl.es/images/other/flag_labels2.png) """ - vtk.vtkFlagpoleLabel.__init__(self) + super().__init__() base = utils.make3d(base) top = utils.make3d(top) @@ -257,8 +257,9 @@ def __init__( ![](https://vedo.embl.es/images/other/flag_labels.png) """ - vtk.vtkLegendBoxActor.__init__(self) - shapes.TextBase.__init__(self) +# vtk.vtkLegendBoxActor.__init__(self) +# shapes.TextBase.__init__(self) + super().__init__() self.name = "LegendBox" self.entries = entries[:nmax] @@ -352,17 +353,17 @@ class Button(vedo.shapes.Text2D): Build a Button object. """ def __init__( - self, - fnc=None, - states=("Button"), - c=("white"), + self, + fnc=None, + states=("Button"), + c=("white"), bc=("green4"), - pos=(0.7, 0.1), - size=24, - font="Courier", - bold=True, - italic=False, - alpha=1, + pos=(0.7, 0.1), + size=24, + font="Courier", + bold=True, + italic=False, + alpha=1, angle=0, ): """ @@ -391,7 +392,7 @@ def __init__( opacity level angle : (float) anticlockwise rotation in degrees - + Examples: - [buttons.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons.py) @@ -495,7 +496,7 @@ def __init__(self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, o ![](https://vedo.embl.es/images/basic/spline_tool.png) """ - vtk.vtkContourWidget.__init__(self) + super().__init__() self.representation = vtk.vtkOrientedGlyphContourRepresentation() self.representation.SetAlwaysOnTop(ontop) @@ -584,7 +585,7 @@ class SliderWidget(vtk.vtkSliderWidget): """Helper class for vtkSliderWidget""" def __init__(self): - vtk.vtkSliderWidget.__init__(self) + super().__init__() @property def interactor(self): @@ -851,7 +852,7 @@ def ScalarBar( rgb = color_map(i, c, 0, 256) data.append([x[i], rgb]) lut = build_lut(data) - + elif not hasattr(obj, "mapper"): vedo.logger.error(f"in add_scalarbar(): input is invalid {type(obj)}. Skip.") return None @@ -1014,7 +1015,7 @@ def ScalarBar3D( elif isinstance(obj, (Volume, TetMesh)): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() - + elif isinstance(obj, vedo.UGrid): # TODO return None # lut = utils.ctf2lut(obj) # returns None @@ -1358,7 +1359,7 @@ def __init__( tube_width = options.pop("tube_width", 0.0075) title_height = options.pop("title_height", 0.025) tformat = options.pop("tformat", None) - + if options: vedo.logger.warning(f"in Slider2D unknown option(s): {options}") @@ -1497,7 +1498,9 @@ def __init__( if abs(pos[0][0] - pos[1][0]) < 0.1: slider_rep.GetTitleProperty().SetOrientation(90) - SliderWidget.__init__(self) +# SliderWidget.__init__(self) + super().__init__() + self.SetAnimationModeToJump() self.SetRepresentation(slider_rep) @@ -1596,7 +1599,8 @@ def __init__( slider_rep.GetTubeProperty().SetColor(c) - SliderWidget.__init__(self) +# SliderWidget.__init__(self) + super().__init__() self.SetRepresentation(slider_rep) self.SetAnimationModeToJump() @@ -1626,7 +1630,7 @@ def bounds(self, value=None): else: self._implicit_func.SetBounds(value) return self - + def on(self): """Switch the widget on or off.""" self.widget.On() @@ -1635,7 +1639,7 @@ def on(self): def off(self): """Switch the widget on or off.""" self.widget.Off() - return self + return self def add_to(self, plt): """Assign the widget to the provided `Plotter` instance.""" @@ -1648,7 +1652,7 @@ def add_to(self, plt): self.mesh.DeepCopy(cpoly) out = self.clipper.GetClippedOutputPort() - self.remnant.mapper.SetInputConnection(out) + self.remnant.mapper.SetInputConnection(out) self.remnant.alpha(self._alpha).color((0.5, 0.5, 0.5)) self.remnant.lighting('off').wireframe() plt.add(self.remnant) @@ -1658,7 +1662,7 @@ def add_to(self, plt): self._select_polygons(self.widget, "InteractionEvent") plt.interactor.Render() return self - + def remove_from(self, plt): """Remove the widget to the provided `Plotter` instance.""" self.widget.Off() @@ -1716,7 +1720,7 @@ def __init__( self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) - + self._alpha = alpha self._keypress_id = None @@ -1763,13 +1767,13 @@ def __init__( self.widget.SetOrigin(origin) else: self.widget.SetOrigin(mesh.center_of_mass()) - + if len(normal) == 3: self.widget.SetNormal(normal) else: self.widget.SetNormal((1, 0, 0)) - + def _select_polygons(self, vobj, event): vobj.GetPlane(self._implicit_func) @@ -1795,7 +1799,7 @@ def _keypress(self, vobj, event): self.widget.SetNormal((0, 0, 1)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() - self.widget.GetInteractor().Render() + self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): @@ -1876,7 +1880,7 @@ def __init__( self.widget.OutlineCursorWiresOn() self.widget.GetSelectedOutlineProperty().SetColor(get_color("red3")) self.widget.GetSelectedHandleProperty().SetColor(get_color("red5")) - + self.widget.GetOutlineProperty().SetColor(c) self.widget.GetOutlineProperty().SetOpacity(1) self.widget.GetOutlineProperty().SetLineWidth(1) @@ -1965,13 +1969,13 @@ def __init__( else: origin = mesh.center_of_mass() self._implicit_func.SetCenter(origin) - + if radius > 0: self._implicit_func.SetRadius(radius) else: radius = mesh.average_size() * 2 self._implicit_func.SetRadius(radius) - + poly = mesh self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() @@ -2076,7 +2080,8 @@ def __init__(self, c="k", alpha=None, lw=None, padding=None): cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) - vtk.vtkActor2D.__init__(self) +# vtk.vtkActor2D.__init__(self) + super().__init__() self.GetPositionCoordinate().SetValue(0, 0) self.GetPosition2Coordinate().SetValue(1, 1) @@ -2096,7 +2101,7 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): Arguments: n : (int) - number of iterations. + number of iterations. If None, you need to call `update(fraction)` manually. c : (color) color of the line. @@ -2130,14 +2135,15 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) - vtk.vtkActor2D.__init__(self) - +# vtk.vtkActor2D.__init__(self) + super().__init__() + self.SetMapper(mapper) self.GetProperty().SetOpacity(alpha) self.GetProperty().SetColor(get_color(c)) self.GetProperty().SetLineWidth(lw*2) - + def lw(self, value): """Set width.""" self.GetProperty().SetLineWidth(value*2) @@ -2148,7 +2154,7 @@ def c(self, color): c = get_color(color) self.GetProperty().SetColor(c) return self - + def alpha(self, value): """Set opacity.""" self.GetProperty().SetOpacity(value) @@ -2170,7 +2176,7 @@ def update(self, fraction=None): vpts = utils.numpy2vtk(psqr, dtype=np.float32) self._data.GetPoints().SetData(vpts) return self - + def reset(self): """Reset progress bar.""" self.n = 0 @@ -2196,7 +2202,8 @@ def __init__(self, mesh, pos=3, size=0.08): Examples: - [icon.py](https://github.com/marcomusy/vedo/tree/master/examples/other/icon.py) """ - vtk.vtkOrientationMarkerWidget.__init__(self) + super().__init__() + self.SetOrientationMarker(mesh) if utils.is_sequence(pos): @@ -2221,7 +2228,7 @@ def compute_visible_bounds(objs=None): objs = vedo.plotter_instance.actors elif not utils.is_sequence(objs): objs = [objs] - + actors = [ob.actor for ob in objs if hasattr(ob, 'actor') and ob.actor] try: @@ -2566,7 +2573,7 @@ def __init__( ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ - vtk.vtkAxisActor2D.__init__(self) + super().__init__() plt = vedo.plotter_instance if not plt: @@ -2683,7 +2690,7 @@ def __init__(self, plotter=None, c="k", lw=2): ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ - Group.__init__(self) + super().__init__() self.p0 = [0, 0, 0] self.p1 = [0, 0, 0] diff --git a/vedo/applications.py b/vedo/applications.py index f6578740..ea9127f3 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -80,7 +80,7 @@ def __init__( """ ################################ - Plotter.__init__(self, **kwargs) + super().__init__(**kwargs) self.at(at) ################################ @@ -119,7 +119,7 @@ def __init__( msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if len(cmaps) > 1: msh.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) - msh.scalarbar.name = "scalarbar" + msh.scalarbar.name = "scalarbar" # self.add(msh.clone()) # BUG self.add(msh) @@ -296,7 +296,8 @@ def __init__(self, volume, levels=(None, None), histo_color="red5", **kwargs): ] kwargs["shape"] = custom_shape - Plotter.__init__(self, **kwargs) +# Plotter.__init__(self, **kwargs) + super().__init__(**kwargs) # reuse the same underlying data as in vol vsl = vedo.volume.VolumeSlice(volume) @@ -375,7 +376,7 @@ def __init__(self, volume, **kwargs): ![](https://vedo.embl.es/images/advanced/app_raycaster.gif) """ - Plotter.__init__(self, **kwargs) + super().__init__(**kwargs) self.alphaslider0 = 0.33 self.alphaslider1 = 0.66 @@ -577,8 +578,7 @@ def __init__( ![](https://vedo.embl.es/images/advanced/app_isobrowser.gif) """ - Plotter.__init__( - self, + super().__init__( pos=pos, bg=bg, bg2=bg2, @@ -749,7 +749,8 @@ def __init__( """ kwargs.pop("N", 1) kwargs.pop("shape", []) - Plotter.__init__(self, axes=axes, **kwargs) + kwargs.pop("axes", 1) + super().__init__(**kwargs) if isinstance(objects, str): objects = vedo.file_io.load(objects) @@ -792,7 +793,7 @@ def slider_function(widget=None, event=None): ak.off() except AttributeError: pass - + try: tx = str(k) if slider_title: @@ -805,7 +806,7 @@ def slider_function(widget=None, event=None): except: pass self.slider.title = tx - + if resetcam: self.reset_camera() self.render() @@ -823,7 +824,7 @@ def slider_function(widget=None, event=None): ) self.slider.GetRepresentation().SetTitleHeight(0.020) slider_function() # init call - + def play(self, dt=100): """Start playing the slides at a given speed.""" self.timer_callback_id = self.add_callback("timer", self.slider_function) @@ -1225,7 +1226,7 @@ def __init__( video_filename="animation.mp4", video_fps=12, ): - Plotter.__init__(self) + super().__init__() self.resetcam = True self.events = [] @@ -1603,12 +1604,12 @@ def play(self): class AnimationPlayer(vedo.Plotter): """ A Plotter with play/pause, step forward/backward and slider functionalties. - Useful for inspecting time series. + Useful for inspecting time series. - The user has the responsibility to update all actors in the callback function. + The user has the responsibility to update all actors in the callback function. Pay attention to that the idx can both increment and decrement, as well as make large jumps. - + Arguments: func : (Callable) a function that passes an integer as input and updates the scene @@ -1875,7 +1876,7 @@ def __init__(self, h=None, m=None, s=None, font="Quikhand", title="", c="k"): txt.pos(0, -0.25, 0.001) labels.z(0.001) minu.z(0.002) - vedo.Assembly.__init__(self, [back1, labels, ore, minu, secs, txt]) + super().__init__([back1, labels, ore, minu, secs, txt]) self.name = "Clock" def update(self, h=None, m=None, s=None): diff --git a/vedo/assembly.py b/vedo/assembly.py index 61b58de8..0388b1a6 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -223,7 +223,7 @@ def __init__(self, *meshs): meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) - + self.actor = self self.name = "" @@ -263,7 +263,7 @@ def __init__(self, *meshs): self.pipeline = vedo.utils.OperationNode( "Assembly", parents=self.objects, - comment=f"#meshes {len(self.objects)}", + comment=f"#meshes {len(self.objects)}", c="#f08080", ) ########################################## @@ -372,7 +372,7 @@ def apply_transform(self, LT, concatenate=1): self.SetOrientation(self.transform.T.GetOrientation()) self.SetScale(self.transform.T.GetScale()) return self - + # TODO #### def propagate_transform(self): """Propagate the transformation to all parts.""" @@ -396,7 +396,7 @@ def pos(self, x=None, y=None, z=None): z = 0 q = self.transform.position - LT = LinearTransform().translate([x,y,z]-q) + LT = LinearTransform().translate([x,y,z]-q) return self.apply_transform(LT) def shift(self, dx, dy=0, dz=0): @@ -404,9 +404,9 @@ def shift(self, dx, dy=0, dz=0): if vedo.utils.is_sequence(dx): vedo.utils.make3d(dx) dx, dy, dz = dx - LT = LinearTransform().translate([dx, dy, dz]) + LT = LinearTransform().translate([dx, dy, dz]) return self.apply_transform(LT) - + def scale(self, s): """Multiply object size by `s` factor.""" LT = LinearTransform().scale(s) @@ -435,12 +435,12 @@ def z(self, val=None): return p[2] self.pos(p[0], p[1], val) return self - + def rotate_x(self, angle): """Rotate object around x axis.""" LT = LinearTransform().rotate_x(angle) return self.apply_transform(LT) - + def rotate_y(self, angle): """Rotate object around y axis.""" LT = LinearTransform().rotate_y(angle) @@ -450,7 +450,7 @@ def rotate_z(self, angle): """Rotate object around z axis.""" LT = LinearTransform().rotate_z(angle) return self.apply_transform(LT) - + def bounds(self): """ @@ -483,7 +483,7 @@ def zbounds(self, i=None): if i == 1: return b[5] return (b[4], b[5]) - + def clone(self): """Make a clone copy of the object.""" newlist = [] diff --git a/vedo/base.py b/vedo/base.py index 283cb7bc..ee768624 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -425,7 +425,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.cell_locator = None self.line_locator = None return self - + def pos(self, x=None, y=None, z=None): """Set/Get object position.""" @@ -443,7 +443,7 @@ def pos(self, x=None, y=None, z=None): q = self.transform.position LT = LinearTransform() - LT.translate([x,y,z] - q) + LT.translate([x,y,z] - q) return self.apply_transform(LT) def shift(self, dx=0, dy=0, dz=0): @@ -451,7 +451,7 @@ def shift(self, dx=0, dy=0, dz=0): if utils.is_sequence(dx): utils.make3d(dx) dx, dy, dz = dx - LT = LinearTransform().translate([dx, dy, dz]) + LT = LinearTransform().translate([dx, dy, dz]) return self.apply_transform(LT) def x(self, val=None): @@ -550,7 +550,7 @@ def scale(self, s=None, reset=False, origin=True): """ if s is None: return np.array(self.transform.T.GetScale()) - + LT = LinearTransform() if reset: LT.set_scale(s) @@ -833,8 +833,6 @@ def __init__(self): super().__init__() - print("BaseActor __init__") - self.mapper = None self._caption = None self.property = None @@ -897,7 +895,7 @@ def points(self, pts=None, transformed=True): if pts.shape[1] == 2: pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] arr = utils.numpy2vtk(pts, dtype=np.float32) - + vpts = self.GetPoints() vpts.SetData(arr) vpts.Modified() @@ -1628,7 +1626,7 @@ def color(self, col, alpha=None, vmin=None, vmax=None): if col is None: return self - + if vmin is None: vmin, _ = self.GetScalarRange() if vmax is None: @@ -1866,7 +1864,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): normal vector to the cutting plane """ # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") + # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") strn = str(normal) if strn == "x": normal = (1, 0, 0) @@ -1919,7 +1917,7 @@ def cut_with_box(self, box): ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") + # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") bc = vtk.vtkBoxClipDataSet() bc.SetInputData(self) @@ -1953,7 +1951,7 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal Use `invert` to return cut off part of the input object. """ # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") + # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") ug = self @@ -2254,7 +2252,7 @@ def ontop(self, value=True): else: self.property.SetDisplayLocationToBackground() return self - + def add_observer(self, event_name, func, priority=0): """Add a callback function that will be called when an event occurs.""" event_name = utils.get_vtk_name_event(event_name) diff --git a/vedo/dolfin.py b/vedo/dolfin.py index b7e9c907..dfaef141 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -32,7 +32,7 @@ ![](https://user-images.githubusercontent.com/32848391/53026243-d2d31900-3462-11e9-9dde-518218c241b6.jpg) .. note:: - Find many more examples in directory + Find many more examples in directory [vedo/examples/dolfin](https://github.com/marcomusy/vedo/blob/master/examples/other/dolfin). """ @@ -680,7 +680,7 @@ def __init__(self, *inputobj, **options): else: poly = utils.buildPolyData(coords, cells) - Mesh.__init__(self, poly, c=c, alpha=alpha) + super().__init__(poly, c, alpha) if compute_normals: self.compute_normals() diff --git a/vedo/mesh.py b/vedo/mesh.py index 98710673..04b7acc5 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -382,7 +382,7 @@ def lines(self, flat=False): def edges(self, ids=()): """ Return an array containing the edges connectivity. - + If ids is set, return only the edges of the given cells. """ extractEdges = vtk.vtkExtractEdges() @@ -1009,7 +1009,7 @@ def cap(self, return_cap=False): if return_cap: m = Mesh(tf.GetOutput()) m.pipeline = OperationNode( - "cap", parents=[self], + "cap", parents=[self], comment=f"#pts {m.GetNumberOfPoints()}" ) return m @@ -1085,7 +1085,7 @@ def join(self, polys=True, reset=False): poly.GetPoints().SetData(vpts) else: poly = sf.GetOutput() - + self.DeepCopy(poly) self.pipeline = OperationNode( @@ -1481,7 +1481,7 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): self.DeepCopy(decimate.GetOutput()) self.pipeline = OperationNode( - "decimate", parents=[self], + "decimate", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -1585,7 +1585,7 @@ def fill_holes(self, size=None): fh.SetHoleSize(size) fh.SetInputData(self) fh.Update() - + self.DeepCopy(fh.GetOutput()) self.pipeline = OperationNode( @@ -2782,8 +2782,9 @@ def __init__(self, objt, camera=None): actor = objt.actor mapper = objt.mapper - vtk.vtkFollower.__init__(self) - vedo.base.BaseActor.__init__(self) + #vtk.vtkFollower.__init__(self) + #vedo.base.BaseActor.__init__(self) + super().__inint__() self.name = objt.name self._isfollower = False diff --git a/vedo/picture.py b/vedo/picture.py index a0adc83b..5fa41ce0 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -165,7 +165,7 @@ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify="") justify : (str) define the anchor point ("top-left", "top-center", ...) """ - vedo.BaseActor2D.__init__(self) + super().__init__() # print("input type:", fig.__class__) self.array = None @@ -548,14 +548,14 @@ def pad(self, pixels=10, value=255): pf.SetConstant(value) if utils.is_sequence(pixels): pf.SetOutputWholeExtent( - x0 - pixels[0], x1 + pixels[1], - y0 - pixels[2], y1 + pixels[3], + x0 - pixels[0], x1 + pixels[1], + y0 - pixels[2], y1 + pixels[3], 0, 0 ) else: pf.SetOutputWholeExtent( - x0 - pixels, x1 + pixels, - y0 - pixels, y1 + pixels, + x0 - pixels, x1 + pixels, + y0 - pixels, y1 + pixels, 0, 0 ) pf.Update() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 818d02c2..aeefecb5 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -706,94 +706,15 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): return pt - +################################################### class PointsVisual: """Class to manage the visual aspects of a ``Points`` object.""" - pass - # def __init__(self): - # self.actor = vtk.vtkActor() - - # self.data = None - # self.mapper = None - # self.property = None - - # print("PPP") - - -################################################### -class Points(PointsVisual, BaseActor, vtk.vtkPolyData): - """Work with point clouds.""" - - def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1, blur=False, emissive=True): - """ - Build an object made of only vertex points for a list of 2D/3D points. - Both shapes (N, 3) or (3, N) are accepted as input, if N>3. - For very large point clouds a list of colors and alpha can be assigned to each - point in the form c=[(R,G,B,A), ... ] where 0<=R<256, ... 0<=A<256. - - Arguments: - inputobj : (list, tuple) - r : (int) - Point radius in units of pixels. - c : (str, list) - Color name or rgb tuple. - alpha : (float) - Transparency in range [0,1]. - blur : (bool) - Apply a gaussian convolution filter to the points. - In this case the radius `r` is in absolute units of the mesh coordinates. - emissive : (bool) - Halo of point becomes emissive. - - Example: - ```python - from vedo import * - - def fibonacci_sphere(n): - s = np.linspace(0, n, num=n, endpoint=False) - theta = s * 2.399963229728653 - y = 1 - s * (2/(n-1)) - r = np.sqrt(1 - y * y) - x = np.cos(theta) * r - z = np.sin(theta) * r - return [x,y,z] - Points(fibonacci_sphere(1000)).show(axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/fibonacci.png) - """ - super().__init__() + def __init__(self): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() - - self.transform = LinearTransform() - self.actor.data = self - # self.name = "Points" # better not to give it a name here - - if blur: - self.mapper = vtk.vtkPointGaussianMapper() - if emissive: - self.mapper.SetEmissive(bool(emissive)) - self.mapper.SetScaleFactor(r * 1.4142) - - # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ - if alpha < 1: - self.mapper.SetSplatShaderCode( - "//VTK::Color::Impl\n" - "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" - "if (dist > 1.0) {\n" - " discard;\n" - "} else {\n" - f" float scale = ({alpha} - dist);\n" - " ambientColor *= scale;\n" - " diffuseColor *= scale;\n" - "}\n" - ) - alpha = 1 - - else: - self.mapper = vtk.vtkPolyDataMapper() + self.mapper = vtk.vtkPolyDataMapper() self._bfprop = None # backface property holder self._scals_idx = 0 # index of the active scalar changed from CLI @@ -801,352 +722,502 @@ def fibonacci_sphere(n): self._cmap_name = "" # remember the name for self._keypress try: - if not blur: - self.property.RenderPointsAsSpheresOn() + self.property.RenderPointsAsSpheresOn() except AttributeError: pass - if inputobj is None: #################### - return - ######################################## - if isinstance(inputobj, vedo.BaseActor): - inputobj = inputobj.points() # numpy + def color(self, c=False, alpha=None): + """ + Set/get mesh's color. + If None is passed as input, will use colors from active scalars. + Same as `mesh.c()`. + """ + # overrides base.color() + if c is False: + return np.array(self.property.GetColor()) + if c is None: + self.mapper.ScalarVisibilityOn() + return self + self.mapper.ScalarVisibilityOff() + cc = colors.get_color(c) + self.property.SetColor(cc) + if self.trail: + self.trail.GetProperty().SetColor(cc) + if alpha is not None: + self.alpha(alpha) + return self - ###### - if isinstance(inputobj, vtk.vtkActor): - pd = inputobj.GetMapper().GetInput() - self.DeepCopy(pd) - pr = vtk.vtkProperty() - pr.DeepCopy(inputobj.GetProperty()) - self.actor.SetProperty(pr) - self.property = pr - self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) + def alpha(self, opacity=None): + """Set/get mesh's transparency. Same as `mesh.opacity()`.""" + if opacity is None: + return self.property.GetOpacity() - elif isinstance(inputobj, vtk.vtkPolyData): - self.DeepCopy(inputobj) - if self.GetNumberOfCells() == 0: - carr = vtk.vtkCellArray() - for i in range(self.GetNumberOfPoints()): - carr.InsertNextCell(1) - carr.InsertCellPoint(i) - self.SetVerts(carr) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - - elif utils.is_sequence(inputobj): # passing point coords - pd = utils.buildPolyData(utils.make3d(inputobj)) - if utils.is_sequence(c) and len(c) == len(inputobj): - cols = vtk.vtkUnsignedCharArray() - cols.SetNumberOfComponents(4) - cols.SetName("PointsRGBA") - for i in range(len(inputobj)): - r, g, b = c[i] - cols.InsertNextTuple4(r, g, b, 255) - pd.GetPointData().SetScalars(cols) + self.property.SetOpacity(opacity) + bfp = self.actor.GetBackfaceProperty() + if bfp: + if opacity < 1: + self._bfprop = bfp + self.property.SetBackfaceProperty(None) else: - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - self.DeepCopy(pd) - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") + self.property.SetBackfaceProperty(self._bfprop) + return self - elif isinstance(inputobj, str): - verts = vedo.file_io.load(inputobj) - self.filename = inputobj - self.DeepCopy(verts) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - else: - # try to extract the points from a generic VTK input data object - try: - vvpts = inputobj.GetPoints() - self.SetPoints(vvpts) - for i in range(inputobj.GetPointData().GetNumberOfArrays()): - arr = inputobj.GetPointData().GetArray(i) - self.GetPointData().AddArray(arr) + def opacity(self, alpha=None): + """Set/get mesh's transparency. Same as `mesh.alpha()`.""" + return self.alpha(alpha) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - except: - vedo.logger.error(f"cannot build Points from type {type(inputobj)}") - raise RuntimeError() + def force_opaque(self, value=True): + """ Force the Mesh, Line or point cloud to be treated as opaque""" + ## force the opaque pass, fixes picking in vtk9 + # but causes other bad troubles with lines.. + self.actor.SetForceOpaque(value) + return self - self.property.SetRepresentationToPoints() - self.property.SetPointSize(r) - self.property.LightingOff() + def force_translucent(self, value=True): + """ Force the Mesh, Line or point cloud to be treated as translucent""" + self.actor.SetForceTranslucent(value) + return self - self.actor.SetMapper(self.mapper) - self.mapper.SetInputData(self) + def point_size(self, value=None): + """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" + if value is None: + return self.property.GetPointSize() + #self.property.SetRepresentationToSurface() + else: + self.property.SetRepresentationToPoints() + self.property.SetPointSize(value) + return self - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" - ) + def ps(self, pointsize=None): + """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" + return self.point_size(pointsize) + def render_points_as_spheres(self, value=True): + """Make points look spheric or make them look as squares.""" + self.property.SetRenderPointsAsSpheres(value) + return self - def _repr_html_(self): + def lighting( + self, + style="", + ambient=None, + diffuse=None, + specular=None, + specular_power=None, + specular_color=None, + metallicity=None, + roughness=None, + ): """ - HTML representation of the Point cloud object for Jupyter Notebooks. + Set the ambient, diffuse, specular and specular_power lighting constants. - Returns: - HTML text with the image and some properties. - """ - import io - import base64 - from PIL import Image + Arguments: + style : (str) + preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` + ambient : (float) + ambient fraction of emission [0-1] + diffuse : (float) + emission of diffused light in fraction [0-1] + specular : (float) + fraction of reflected light [0-1] + specular_power : (float) + precision of reflection [1-100] + specular_color : (color) + color that is being reflected by the surface - library_name = "vedo.pointcloud.Points" - help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html" + - arr = self.thumbnail() - im = Image.fromarray(arr) - buffered = io.BytesIO() - im.save(buffered, format="PNG", quality=100) - encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") - url = "data:image/png;base64," + encoded - image = f"" + Examples: + - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) + """ + pr = self.property - bounds = "
".join( - [ - utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) - for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) - ] - ) - average_size = "{size:.3f}".format(size=self.average_size()) + if style: - help_text = "" - if self.name: - help_text += f" {self.name}:   " - help_text += '' + library_name + "" - if self.filename: - dots = "" - if len(self.filename) > 30: - dots = "..." - help_text += f"
({dots}{self.filename[-30:]})" + if isinstance(pr, vtk.vtkVolumeProperty): + self.shade(True) + if style == "off": + self.shade(False) + elif style == "ambient": + style = "default" + self.shade(False) + else: + if style != "off": + pr.LightingOn() - pdata = "" - if self.GetPointData().GetScalars(): - if self.GetPointData().GetScalars().GetName(): - name = self.GetPointData().GetScalars().GetName() - pdata = " point data array " + name + "" - - cdata = "" - if self.GetCellData().GetScalars(): - if self.GetCellData().GetScalars().GetName(): - name = self.GetCellData().GetScalars().GetName() - cdata = " cell data array " + name + "" + if style == "off": + pr.SetInterpolationToFlat() + pr.LightingOff() + return self ############## - allt = [ - "", - "", - "", - "
", - image, - "
", - help_text, - "", - "", - "", - "", - "", - pdata, - cdata, - "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " - + utils.precision(self.center_of_mass(), 3) - + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", - "
", - ] - return "\n".join(allt) + if hasattr(pr, "GetColor"): # could be Volume + c = pr.GetColor() + else: + c = (1, 1, 0.99) + mpr = self.mapper + if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): + c = (1,1,0.99) + if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] + elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] + elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] + elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] + elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] + elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] + else: + vedo.logger.error("in lighting(): Available styles are") + vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") + raise RuntimeError() + pr.SetAmbient(pars[0]) + pr.SetDiffuse(pars[1]) + pr.SetSpecular(pars[2]) + pr.SetSpecularPower(pars[3]) + if hasattr(pr, "GetColor"): + pr.SetSpecularColor(pars[4]) + if ambient is not None: pr.SetAmbient(ambient) + if diffuse is not None: pr.SetDiffuse(diffuse) + if specular is not None: pr.SetSpecular(specular) + if specular_power is not None: pr.SetSpecularPower(specular_power) + if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) + if utils.vtk_version_at_least(9): + if metallicity is not None: + pr.SetInterpolationToPBR() + pr.SetMetallic(metallicity) + if roughness is not None: + pr.SetInterpolationToPBR() + pr.SetRoughness(roughness) - ################################################################################## - def __add__(self, meshs): - if isinstance(meshs, list): - alist = [self] - for l in meshs: - if isinstance(l, vedo.Assembly): - alist += l.unpack() - else: - alist += l - return vedo.assembly.Assembly(alist) + return self - if isinstance(meshs, vedo.Assembly): - return meshs + self # use Assembly.__add__ + def blurring(emissive=False): + """Set point blurring. + Apply a gaussian convolution filter to the points. + In this case the radius `r` is in absolute units of the mesh coordinates. + With emissive set, the halo of point becomes light-emissive. + """ + if emissive: + self.mapper.SetEmissive(bool(emissive)) + self.mapper.SetScaleFactor(r * 1.4142) + + # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ + if alpha < 1: + self.mapper.SetSplatShaderCode( + "//VTK::Color::Impl\n" + "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" + "if (dist > 1.0) {\n" + " discard;\n" + "} else {\n" + f" float scale = ({alpha} - dist);\n" + " ambientColor *= scale;\n" + " diffuseColor *= scale;\n" + "}\n" + ) + alpha = 1 - return vedo.assembly.Assembly([self, meshs]) + self.mapper.Modified() + self.actor.Modified() + self.property.SetOpacity(alpha) + self.actor.SetMapper(self.mapper) + return self - def polydata(self, transformed=True): - """Obsolete.""" - print("WARNING: method polydata() is obsolete, you can remove it from your code.") + def cell_individual_colors(self, colorlist): + self.cellcolors = colorlist + print("Please use property mesh.cellcolors=... instead of mesh.cell_individual_colors()") return self - def clone(self, deep=True): + @property + def cellcolors(self): """ - Clone a `PointCloud` or `Mesh` object to make an exact copy of it. + Colorize each cell (face) of a mesh by passing + a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. + Colors levels and opacities must be in the range [0,255]. - Arguments: - deep : (bool) - if False only build a shallow copy of the object (faster copy). + A single constant color can also be passed as string or RGBA. + + A cell array named "CellsRGBA" is automatically created. Examples: - - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) + - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) + - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) - ![](https://vedo.embl.es/images/basic/mirror.png) + ![](https://vedo.embl.es/images/basic/colorMeshCells.png) """ - poly_copy = vtk.vtkPolyData() - if deep: - poly_copy.DeepCopy(self) - else: - poly_copy.ShallowCopy(self) - - if isinstance(self, vedo.Mesh): - cloned = vedo.Mesh(poly_copy) - else: - cloned = Points(poly_copy) + if "CellsRGBA" not in self.celldata.keys(): + lut = self.mapper.GetLookupTable() + vscalars = self.GetCellData().GetScalars() + if vscalars is None or lut is None: + arr = np.zeros([self.ncells, 4], dtype=np.uint8) + col = np.array(self.property.GetColor()) + col = np.round(col * 255).astype(np.uint8) + alf = self.property.GetOpacity() + alf = np.round(alf * 255).astype(np.uint8) + arr[:, (0, 1, 2)] = col + arr[:, 3] = alf + else: + cols = lut.MapScalars(vscalars, 0, 0) + arr = utils.vtk2numpy(cols) + self.celldata["CellsRGBA"] = arr + self.celldata.select("CellsRGBA") + return self.celldata["CellsRGBA"] - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - cloned.actor.SetProperty(pr) - cloned.property = pr + @cellcolors.setter + def cellcolors(self, value): + if isinstance(value, str): + c = colors.get_color(value) + value = np.array([*c, 1]) * 255 + value = np.round(value) - if self.actor.GetBackfaceProperty(): - bfpr = vtk.vtkProperty() - bfpr.DeepCopy(self.actor.GetBackfaceProperty()) - cloned.actor.SetBackfaceProperty(bfpr) + value = np.asarray(value) + n = self.ncells - cloned.transform = self.transform + if value.ndim == 1: + value = np.repeat([value], n, axis=0) - mp = cloned.mapper - sm = self.mapper - mp.SetScalarVisibility(sm.GetScalarVisibility()) - mp.SetScalarRange(sm.GetScalarRange()) - mp.SetColorMode(sm.GetColorMode()) - lsr = sm.GetUseLookupTableScalarRange() - mp.SetUseLookupTableScalarRange(lsr) - mp.SetScalarMode(sm.GetScalarMode()) - lut = sm.GetLookupTable() - if lut: - mp.SetLookupTable(lut) + if value.shape[1] == 3: + z = np.zeros((n, 1), dtype=np.uint8) + value = np.append(value, z + 255, axis=1) - if self.actor.GetTexture(): - cloned.texture(self.actor.GetTexture()) + assert n == value.shape[0] - cloned.actor.SetPickable(self.actor.GetPickable()) + self.celldata["CellsRGBA"] = value.astype(np.uint8) + self.celldata.select("CellsRGBA") - cloned.base = np.array(self.base) - cloned.top = np.array(self.top) - cloned.name = str(self.name) - cloned.filename = str(self.filename) - cloned.info = dict(self.info) - # better not to share the same locators with original obj - cloned.point_locator = None - cloned.cell_locator = None - cloned.line_locator = None + @property + def pointcolors(self): + """ + Colorize each point (or vertex of a mesh) by passing + a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. + Colors levels and opacities must be in the range [0,255]. - cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") - return cloned + A single constant color can also be passed as string or RGBA. - def clone2d( - self, - pos=(0, 0), - coordsys=4, - scale=None, - c=None, - alpha=None, - ps=2, - lw=1, - sendback=False, - layer=0, - ): + A point array named "PointsRGBA" is automatically created. """ - Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. + if "PointsRGBA" not in self.pointdata.keys(): + lut = self.mapper.GetLookupTable() + vscalars = self.GetPointData().GetScalars() + if vscalars is None or lut is None: + arr = np.zeros([self.npoints, 4], dtype=np.uint8) + col = np.array(self.property.GetColor()) + col = np.round(col * 255).astype(np.uint8) + alf = self.property.GetOpacity() + alf = np.round(alf * 255).astype(np.uint8) + arr[:, (0, 1, 2)] = col + arr[:, 3] = alf + else: + cols = lut.MapScalars(vscalars, 0, 0) + arr = utils.vtk2numpy(cols) + self.pointdata["PointsRGBA"] = arr + self.pointdata.select("PointsRGBA") + return self.pointdata["PointsRGBA"] - Arguments: - coordsys : (int) - the coordinate system, options are - - 0 = Displays - - 1 = Normalized Display - - 2 = Viewport (origin is the bottom-left corner of the window) - - 3 = Normalized Viewport - - 4 = View (origin is the center of the window) - - 5 = World (anchor the 2d image to mesh) + @pointcolors.setter + def pointcolors(self, value): + if isinstance(value, str): + c = colors.get_color(value) + value = np.array([*c, 1]) * 255 + value = np.round(value) - ps : (int) - point size in pixel units + value = np.asarray(value) + n = self.npoints - lw : (int) - line width in pixel units + if value.ndim == 1: + value = np.repeat([value], n, axis=0) - sendback : (bool) - put it behind any other 3D object + if value.shape[1] == 3: + z = np.zeros((n, 1), dtype=np.uint8) + value = np.append(value, z + 255, axis=1) - Examples: - - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) + assert n == value.shape[0] - ![](https://vedo.embl.es/images/other/clone2d.png) + self.pointdata["PointsRGBA"] = value.astype(np.uint8) + self.pointdata.select("PointsRGBA") + + ##################################################################################### + def cmap( + self, + input_cmap, + input_array=None, + on="points", + name="Scalars", + vmin=None, + vmax=None, + n_colors=256, + alpha=1.0, + logscale=False, + ): """ - if scale is None: - msiz = self.diagonal_size() - if vedo.plotter_instance and vedo.plotter_instance.window: - sz = vedo.plotter_instance.window.GetSize() - dsiz = utils.mag(sz) - scale = dsiz / msiz / 10 + Set individual point/cell colors by providing a list of scalar values and a color map. + + Arguments: + input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) + color map scheme to transform a real number into a color. + input_array : (str, list, vtkArray) + can be the string name of an existing array, a numpy array or a `vtkArray`. + on : (str) + either 'points' or 'cells'. + Apply the color map to data which is defined on either points or cells. + name : (str) + give a name to the provided numpy array (if input_array is a numpy array) + vmin : (float) + clip scalars to this minimum value + vmax : (float) + clip scalars to this maximum value + n_colors : (int) + number of distinct colors to be used in colormap table. + alpha : (float, list) + Mesh transparency. Can be a `list` of values one for each vertex. + logscale : (bool) + Use logscale + + Examples: + - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) + - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) + - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) + (and many others) + + ![](https://vedo.embl.es/images/basic/mesh_custom.png) + """ + self._cmap_name = input_cmap + poly = self.inputdata() + + if input_array is None: + if not self.pointdata.keys() and self.celldata.keys(): + on = "cells" + if not poly.GetCellData().GetScalars(): + input_array = 0 # pick the first at hand + + if on.startswith("point"): + data = poly.GetPointData() + n = poly.GetNumberOfPoints() + elif on.startswith("cell"): + data = poly.GetCellData() + n = poly.GetNumberOfCells() + else: + vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") + raise RuntimeError() + + if input_array is None: # if None try to fetch the active scalars + arr = data.GetScalars() + if not arr: + vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") + return self + + if not arr.GetName(): # sometimes arrays dont have a name.. + arr.SetName(name) + + elif isinstance(input_array, str): # if a string is passed + arr = data.GetArray(input_array) + if not arr: + vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") + return self + + elif isinstance(input_array, int): # if an int is passed + if input_array < data.GetNumberOfArrays(): + arr = data.GetArray(input_array) else: - scale = 350 / msiz + vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") + return self - cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale) + elif utils.is_sequence(input_array): # if a numpy array is passed + npts = len(input_array) + if npts != n: + vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") + return self + arr = utils.numpy2vtk(input_array, name=name, dtype=float) + data.AddArray(arr) + data.Modified() - mapper3d = self.mapper - cm = mapper3d.GetColorMode() - lut = mapper3d.GetLookupTable() - sv = mapper3d.GetScalarVisibility() - use_lut = mapper3d.GetUseLookupTableScalarRange() - vrange = mapper3d.GetScalarRange() - sm = mapper3d.GetScalarMode() + elif isinstance(input_array, vtk.vtkArray): # if a vtkArray is passed + arr = input_array + data.AddArray(arr) + data.Modified() - mapper2d = vtk.vtkPolyDataMapper2D() - mapper2d.ShallowCopy(mapper3d) - mapper2d.SetInputData(poly) - mapper2d.SetColorMode(cm) - mapper2d.SetLookupTable(lut) - mapper2d.SetScalarVisibility(sv) - mapper2d.SetUseLookupTableScalarRange(use_lut) - mapper2d.SetScalarRange(vrange) - mapper2d.SetScalarMode(sm) + else: + vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") + raise RuntimeError() - act2d = vtk.vtkActor2D() - act2d.SetMapper(mapper2d) - act2d.SetLayerNumber(layer) - csys = act2d.GetPositionCoordinate() - csys.SetCoordinateSystem(coordsys) - act2d.SetPosition(pos) - if c is not None: - c = colors.get_color(c) - act2d.GetProperty().SetColor(c) - mapper2d.SetScalarVisibility(False) + # Now we have array "arr" + array_name = arr.GetName() + + if arr.GetNumberOfComponents() == 1: + if vmin is None: + vmin = arr.GetRange()[0] + if vmax is None: + vmax = arr.GetRange()[1] else: - act2d.GetProperty().SetColor(cmsh.color()) - if alpha is not None: - act2d.GetProperty().SetOpacity(alpha) + if vmin is None or vmax is None: + vn = utils.mag(utils.vtk2numpy(arr)) + if vmin is None: + vmin = vn.min() + if vmax is None: + vmax = vn.max() + + # interpolate alphas if they are not constant + if not utils.is_sequence(alpha): + alpha = [alpha] * n_colors else: - act2d.GetProperty().SetOpacity(cmsh.alpha()) - act2d.GetProperty().SetPointSize(ps) - act2d.GetProperty().SetLineWidth(lw) - act2d.GetProperty().SetDisplayLocationToForeground() - if sendback: - act2d.GetProperty().SetDisplayLocationToBackground() + v = np.linspace(0, 1, n_colors, endpoint=True) + xp = np.linspace(0, 1, len(alpha), endpoint=True) + alpha = np.interp(v, xp, alpha) - # print(csys.GetCoordinateSystemAsString()) - # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) - return act2d + ########################### build the look-up table + if isinstance(input_cmap, vtk.vtkLookupTable): # vtkLookupTable + lut = input_cmap + + elif utils.is_sequence(input_cmap): # manual sequence of colors + lut = vtk.vtkLookupTable() + if logscale: + lut.SetScaleToLog10() + lut.SetRange(vmin, vmax) + ncols = len(input_cmap) + lut.SetNumberOfTableValues(ncols) + + for i, c in enumerate(input_cmap): + r, g, b = colors.get_color(c) + lut.SetTableValue(i, r, g, b, alpha[i]) + lut.Build() + + else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap + lut = vtk.vtkLookupTable() + if logscale: + lut.SetScaleToLog10() + lut.SetVectorModeToMagnitude() + lut.SetRange(vmin, vmax) + lut.SetNumberOfTableValues(n_colors) + mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) + for i, c in enumerate(mycols): + r, g, b = c + lut.SetTableValue(i, r, g, b, alpha[i]) + lut.Build() + + arr.SetLookupTable(lut) + + data.SetActiveScalars(array_name) + # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars + # data.SetActiveAttribute(array_name, 0) # boh! + + if data.GetScalars(): + data.GetScalars().SetLookupTable(lut) + data.GetScalars().Modified() + + self.mapper.SetLookupTable(lut) + self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars + + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarRange(lut.GetRange()) + if on.startswith("point"): + self.mapper.SetScalarModeToUsePointData() + else: + self.mapper.SetScalarModeToUseCellData() + if hasattr(self.mapper, "SetArrayName"): + self.mapper.SetArrayName(array_name) + + return self def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): """ @@ -1292,344 +1363,571 @@ def update_shadows(self): return self - def delete_cells_by_point_index(self, indices): +################################################### +class Points(PointsVisual, BaseActor, vtk.vtkPolyData): + """>Work with point clouds.""" + + def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): """ - Delete a list of vertices identified by any of their vertex index. + Build an object made of only vertex points for a list of 2D/3D points. + Both shapes (N, 3) or (3, N) are accepted as input, if N>3. + For very large point clouds a list of colors and alpha can be assigned to each + point in the form c=[(R,G,B,A), ... ] where 0<=R<256, ... 0<=A<256. - See also `delete_cells()`. + Arguments: + inputobj : (list, tuple) + r : (int) + Point radius in units of pixels. + c : (str, list) + Color name or rgb tuple. + alpha : (float) + Transparency in range [0,1]. - Examples: - - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) + Example: + ```python + from vedo import * - ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) - """ - cell_ids = vtk.vtkIdList() - data = self.inputdata() - data.BuildLinks() - n = 0 - for i in np.unique(indices): - data.GetPointCells(i, cell_ids) - for j in range(cell_ids.GetNumberOfIds()): - data.DeleteCell(cell_ids.GetId(j)) # flag cell - n += 1 - - data.RemoveDeletedCells() - self.mapper.Modified() - self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) - return self - - def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): - """ - Generate point normals using PCA (principal component analysis). - Basically this estimates a local tangent plane around each sample point p - by considering a small neighborhood of points around p, and fitting a plane - to the neighborhood (via PCA). + def fibonacci_sphere(n): + s = np.linspace(0, n, num=n, endpoint=False) + theta = s * 2.399963229728653 + y = 1 - s * (2/(n-1)) + r = np.sqrt(1 - y * y) + x = np.cos(theta) * r + z = np.sin(theta) * r + return [x,y,z] - Arguments: - n : (int) - neighborhood size to calculate the normal - orientation_point : (list) - adjust the +/- sign of the normals so that - the normals all point towards a specified point. If None, perform a traversal - of the point cloud and flip neighboring normals so that they are mutually consistent. - invert : (bool) - flip all normals + Points(fibonacci_sphere(1000)).show(axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/fibonacci.png) """ - poly = self - pcan = vtk.vtkPCANormalEstimation() - pcan.SetInputData(poly) - pcan.SetSampleSize(n) + # super().__init__() ## super is not working here + vtk.vtkPolyData.__init__(self) + BaseActor.__init__(self) + PointsVisual.__init__(self) - if orientation_point is not None: - pcan.SetNormalOrientationToPoint() - pcan.SetOrientationPoint(orientation_point) - else: - pcan.SetNormalOrientationToGraphTraversal() + self.transform = LinearTransform() + self.actor.data = self + # self.name = "Points" # better not to give it a name here - if invert: - pcan.FlipNormalsOn() - pcan.Update() + if inputobj is None: #################### + return + ######################################## - varr = pcan.GetOutput().GetPointData().GetNormals() - varr.SetName("Normals") - self.inputdata().GetPointData().SetNormals(varr) - self.inputdata().GetPointData().Modified() - return self + if isinstance(inputobj, vedo.BaseActor): + inputobj = inputobj.points() # numpy - def compute_acoplanarity(self, n=25, radius=None, on="points"): - """ - Compute acoplanarity which is a measure of how much a local region of the mesh - differs from a plane. - The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. - Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. - If a radius value is given and not enough points fall inside it, then a -1 is stored. + ###### + if isinstance(inputobj, vtk.vtkActor): + pd = inputobj.GetMapper().GetInput() + self.DeepCopy(pd) + pr = vtk.vtkProperty() + pr.DeepCopy(inputobj.GetProperty()) + self.actor.SetProperty(pr) + self.property = pr + self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) - Example: - ```python - from vedo import * - msh = ParametricShape('RandomHills') - msh.compute_acoplanarity(radius=0.1, on='cells') - msh.cmap("coolwarm", on='cells').add_scalarbar() - msh.show(axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) - """ - acoplanarities = [] - if "point" in on: - pts = self.points() - elif "cell" in on: - pts = self.cell_centers() - else: - raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") + elif isinstance(inputobj, vtk.vtkPolyData): + self.DeepCopy(inputobj) + if self.GetNumberOfCells() == 0: + carr = vtk.vtkCellArray() + for i in range(self.GetNumberOfPoints()): + carr.InsertNextCell(1) + carr.InsertCellPoint(i) + self.SetVerts(carr) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + + elif utils.is_sequence(inputobj): # passing point coords + pd = utils.buildPolyData(utils.make3d(inputobj)) + if utils.is_sequence(c) and len(c) == len(inputobj): + cols = vtk.vtkUnsignedCharArray() + cols.SetNumberOfComponents(4) + cols.SetName("PointsRGBA") + for i in range(len(inputobj)): + r, g, b = c[i] + cols.InsertNextTuple4(r, g, b, 255) + pd.GetPointData().SetScalars(cols) + else: + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + self.DeepCopy(pd) + self.pipeline = utils.OperationNode( + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") - for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): - if n: - data = self.closest_point(p, n=n) - npts = n - elif radius: - data = self.closest_point(p, radius=radius) - npts = len(data) + elif isinstance(inputobj, str): + verts = vedo.file_io.load(inputobj) + self.filename = inputobj + self.DeepCopy(verts) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + else: + # try to extract the points from a generic VTK input data object try: - center = data.mean(axis=0) - res = np.linalg.svd(data - center) - acoplanarities.append(res[1][2] / npts) + vvpts = inputobj.GetPoints() + self.SetPoints(vvpts) + for i in range(inputobj.GetPointData().GetNumberOfArrays()): + arr = inputobj.GetPointData().GetArray(i) + self.GetPointData().AddArray(arr) + + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) except: - acoplanarities.append(-1.0) + vedo.logger.error(f"cannot build Points from type {type(inputobj)}") + raise RuntimeError() - if "point" in on: - self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) - else: - self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) - return self + self.property.SetRepresentationToPoints() + self.property.SetPointSize(r) + self.property.LightingOff() - def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): - """ - Computes the distance from one point cloud or mesh to another point cloud or mesh. - This new `pointdata` array is saved with default name "Distance". + self.actor.SetMapper(self.mapper) + self.mapper.SetInputData(self) - Keywords `signed` and `invert` are used to compute signed distance, - but the mesh in that case must have polygonal faces (not a simple point cloud), - and normals must also be computed. + self.pipeline = utils.OperationNode( + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" + ) - Examples: - - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) - ![](https://vedo.embl.es/images/basic/distance2mesh.png) + def _repr_html_(self): """ - if pcloud.inputdata().GetNumberOfPolys(): + HTML representation of the Point cloud object for Jupyter Notebooks. - poly1 = self - poly2 = pcloud - df = vtk.vtkDistancePolyDataFilter() - df.ComputeSecondDistanceOff() - df.SetInputData(0, poly1) - df.SetInputData(1, poly2) - df.SetSignedDistance(signed) - df.SetNegateDistance(invert) - df.Update() - scals = df.GetOutput().GetPointData().GetScalars() - dists = utils.vtk2numpy(scals) + Returns: + HTML text with the image and some properties. + """ + import io + import base64 + from PIL import Image - else: # has no polygons and vtkDistancePolyDataFilter wants them (dont know why) + library_name = "vedo.pointcloud.Points" + help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html" - if signed: - vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") + arr = self.thumbnail() + im = Image.fromarray(arr) + buffered = io.BytesIO() + im.save(buffered, format="PNG", quality=100) + encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") + url = "data:image/png;base64," + encoded + image = f"" - if not pcloud.point_locator: - pcloud.point_locator = vtk.vtkPointLocator() - pcloud.point_locator.SetDataSet(pcloud) - pcloud.point_locator.BuildLocator() + bounds = "
".join( + [ + utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) + for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) + ] + ) + average_size = "{size:.3f}".format(size=self.average_size()) - ids = [] - ps1 = self.points() - ps2 = pcloud.points() - for p in ps1: - pid = pcloud.point_locator.FindClosestPoint(p) - ids.append(pid) + help_text = "" + if self.name: + help_text += f" {self.name}:   " + help_text += '' + library_name + "" + if self.filename: + dots = "" + if len(self.filename) > 30: + dots = "..." + help_text += f"
({dots}{self.filename[-30:]})" - deltas = ps2[ids] - ps1 - dists = np.linalg.norm(deltas, axis=1).astype(np.float32) - scals = utils.numpy2vtk(dists) + pdata = "" + if self.GetPointData().GetScalars(): + if self.GetPointData().GetScalars().GetName(): + name = self.GetPointData().GetScalars().GetName() + pdata = " point data array " + name + "" - scals.SetName(name) - self.inputdata().GetPointData().AddArray(scals) # must be self.inputdata() ! - self.inputdata().GetPointData().SetActiveScalars(scals.GetName()) - rng = scals.GetRange() - self.mapper.SetScalarRange(rng[0], rng[1]) - self.mapper.ScalarVisibilityOn() + cdata = "" + if self.GetCellData().GetScalars(): + if self.GetCellData().GetScalars().GetName(): + name = self.GetCellData().GetScalars().GetName() + cdata = " cell data array " + name + "" - self.pipeline = utils.OperationNode( - "distance_to", - parents=[self, pcloud], - shape="cylinder", - comment=f"#pts {self.GetNumberOfPoints()}", - ) - return dists + allt = [ + "", + "", + "", + "
", + image, + "
", + help_text, + "", + "", + "", + "", + "", + pdata, + cdata, + "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + + utils.precision(self.center_of_mass(), 3) + + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", + "
", + ] + return "\n".join(allt) - def lighting( - self, - style="", - ambient=None, - diffuse=None, - specular=None, - specular_power=None, - specular_color=None, - metallicity=None, - roughness=None, - ): + + ################################################################################## + def __add__(self, meshs): + if isinstance(meshs, list): + alist = [self] + for l in meshs: + if isinstance(l, vedo.Assembly): + alist += l.unpack() + else: + alist += l + return vedo.assembly.Assembly(alist) + + if isinstance(meshs, vedo.Assembly): + return meshs + self # use Assembly.__add__ + + return vedo.assembly.Assembly([self, meshs]) + + + def polydata(self, **kwargs): + """Obsolete. + You can remove it anywhere from your code. """ - Set the ambient, diffuse, specular and specular_power lighting constants. + print("WARNING: call to .polydata() is obsolete, you can remove it from your code.") + return self - Arguments: - style : (str) - preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` - ambient : (float) - ambient fraction of emission [0-1] - diffuse : (float) - emission of diffused light in fraction [0-1] - specular : (float) - fraction of reflected light [0-1] - specular_power : (float) - precision of reflection [1-100] - specular_color : (color) - color that is being reflected by the surface + def clone(self, deep=True): + """ + Clone a `PointCloud` or `Mesh` object to make an exact copy of it. - + Arguments: + deep : (bool) + if False only build a shallow copy of the object (faster copy). Examples: - - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) + - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) + + ![](https://vedo.embl.es/images/basic/mirror.png) """ - pr = self.property + poly_copy = vtk.vtkPolyData() + if deep: + poly_copy.DeepCopy(self) + else: + poly_copy.ShallowCopy(self) - if style: + if isinstance(self, vedo.Mesh): + cloned = vedo.Mesh(poly_copy) + else: + cloned = Points(poly_copy) - if isinstance(pr, vtk.vtkVolumeProperty): - self.shade(True) - if style == "off": - self.shade(False) - elif style == "ambient": - style = "default" - self.shade(False) - else: - if style != "off": - pr.LightingOn() + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + cloned.actor.SetProperty(pr) + cloned.property = pr - if style == "off": - pr.SetInterpolationToFlat() - pr.LightingOff() - return self ############## + if self.actor.GetBackfaceProperty(): + bfpr = vtk.vtkProperty() + bfpr.DeepCopy(self.actor.GetBackfaceProperty()) + cloned.actor.SetBackfaceProperty(bfpr) - if hasattr(pr, "GetColor"): # could be Volume - c = pr.GetColor() - else: - c = (1, 1, 0.99) - mpr = self.mapper - if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): - c = (1,1,0.99) - if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] - elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] - elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] - elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] - elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] - elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] - else: - vedo.logger.error("in lighting(): Available styles are") - vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") - raise RuntimeError() - pr.SetAmbient(pars[0]) - pr.SetDiffuse(pars[1]) - pr.SetSpecular(pars[2]) - pr.SetSpecularPower(pars[3]) - if hasattr(pr, "GetColor"): - pr.SetSpecularColor(pars[4]) + cloned.transform = self.transform - if ambient is not None: pr.SetAmbient(ambient) - if diffuse is not None: pr.SetDiffuse(diffuse) - if specular is not None: pr.SetSpecular(specular) - if specular_power is not None: pr.SetSpecularPower(specular_power) - if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) - if utils.vtk_version_at_least(9): - if metallicity is not None: - pr.SetInterpolationToPBR() - pr.SetMetallic(metallicity) - if roughness is not None: - pr.SetInterpolationToPBR() - pr.SetRoughness(roughness) + mp = cloned.mapper + sm = self.mapper + mp.SetScalarVisibility(sm.GetScalarVisibility()) + mp.SetScalarRange(sm.GetScalarRange()) + mp.SetColorMode(sm.GetColorMode()) + lsr = sm.GetUseLookupTableScalarRange() + mp.SetUseLookupTableScalarRange(lsr) + mp.SetScalarMode(sm.GetScalarMode()) + lut = sm.GetLookupTable() + if lut: + mp.SetLookupTable(lut) - return self + if self.actor.GetTexture(): + cloned.texture(self.actor.GetTexture()) - def alpha(self, opacity=None): - """Set/get mesh's transparency. Same as `mesh.opacity()`.""" - if opacity is None: - return self.property.GetOpacity() + cloned.actor.SetPickable(self.actor.GetPickable()) - self.property.SetOpacity(opacity) - bfp = self.actor.GetBackfaceProperty() - if bfp: - if opacity < 1: - self._bfprop = bfp - self.property.SetBackfaceProperty(None) - else: - self.property.SetBackfaceProperty(self._bfprop) - return self + cloned.base = np.array(self.base) + cloned.top = np.array(self.top) + cloned.name = str(self.name) + cloned.filename = str(self.filename) + cloned.info = dict(self.info) - def opacity(self, alpha=None): - """Set/get mesh's transparency. Same as `mesh.alpha()`.""" - return self.alpha(alpha) + # better not to share the same locators with original obj + cloned.point_locator = None + cloned.cell_locator = None + cloned.line_locator = None - def force_opaque(self, value=True): - """ Force the Mesh, Line or point cloud to be treated as opaque""" - ## force the opaque pass, fixes picking in vtk9 - # but causes other bad troubles with lines.. - self.actor.SetForceOpaque(value) - return self + cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") + return cloned - def force_translucent(self, value=True): - """ Force the Mesh, Line or point cloud to be treated as translucent""" - self.actor.SetForceTranslucent(value) - return self + def clone2d( + self, + pos=(0, 0), + coordsys=4, + scale=None, + c=None, + alpha=None, + ps=2, + lw=1, + sendback=False, + layer=0, + ): + """ + Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. - def point_size(self, value=None): - """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" - if value is None: - return self.property.GetPointSize() - #self.property.SetRepresentationToSurface() - else: - self.property.SetRepresentationToPoints() - self.property.SetPointSize(value) - return self + Arguments: + coordsys : (int) + the coordinate system, options are + - 0 = Displays + - 1 = Normalized Display + - 2 = Viewport (origin is the bottom-left corner of the window) + - 3 = Normalized Viewport + - 4 = View (origin is the center of the window) + - 5 = World (anchor the 2d image to mesh) - def ps(self, pointsize=None): - """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" - return self.point_size(pointsize) + ps : (int) + point size in pixel units - def render_points_as_spheres(self, value=True): - """Make points look spheric or make them look as squares.""" - self.property.SetRenderPointsAsSpheres(value) - return self + lw : (int) + line width in pixel units - def color(self, c=False, alpha=None): - """ - Set/get mesh's color. - If None is passed as input, will use colors from active scalars. - Same as `mesh.c()`. + sendback : (bool) + put it behind any other 3D object + + Examples: + - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) + + ![](https://vedo.embl.es/images/other/clone2d.png) """ - # overrides base.color() - if c is False: - return np.array(self.property.GetColor()) - if c is None: - self.mapper.ScalarVisibilityOn() - return self - self.mapper.ScalarVisibilityOff() - cc = colors.get_color(c) - self.property.SetColor(cc) - if self.trail: - self.trail.GetProperty().SetColor(cc) + if scale is None: + msiz = self.diagonal_size() + if vedo.plotter_instance and vedo.plotter_instance.window: + sz = vedo.plotter_instance.window.GetSize() + dsiz = utils.mag(sz) + scale = dsiz / msiz / 10 + else: + scale = 350 / msiz + + cmsh = self.clone() + poly = cmsh.pos(0, 0, 0).scale(scale) + + mapper3d = self.mapper + cm = mapper3d.GetColorMode() + lut = mapper3d.GetLookupTable() + sv = mapper3d.GetScalarVisibility() + use_lut = mapper3d.GetUseLookupTableScalarRange() + vrange = mapper3d.GetScalarRange() + sm = mapper3d.GetScalarMode() + + mapper2d = vtk.vtkPolyDataMapper2D() + mapper2d.ShallowCopy(mapper3d) + mapper2d.SetInputData(poly) + mapper2d.SetColorMode(cm) + mapper2d.SetLookupTable(lut) + mapper2d.SetScalarVisibility(sv) + mapper2d.SetUseLookupTableScalarRange(use_lut) + mapper2d.SetScalarRange(vrange) + mapper2d.SetScalarMode(sm) + + act2d = vtk.vtkActor2D() + act2d.SetMapper(mapper2d) + act2d.SetLayerNumber(layer) + csys = act2d.GetPositionCoordinate() + csys.SetCoordinateSystem(coordsys) + act2d.SetPosition(pos) + if c is not None: + c = colors.get_color(c) + act2d.GetProperty().SetColor(c) + mapper2d.SetScalarVisibility(False) + else: + act2d.GetProperty().SetColor(cmsh.color()) if alpha is not None: - self.alpha(alpha) + act2d.GetProperty().SetOpacity(alpha) + else: + act2d.GetProperty().SetOpacity(cmsh.alpha()) + act2d.GetProperty().SetPointSize(ps) + act2d.GetProperty().SetLineWidth(lw) + act2d.GetProperty().SetDisplayLocationToForeground() + if sendback: + act2d.GetProperty().SetDisplayLocationToBackground() + + # print(csys.GetCoordinateSystemAsString()) + # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) + return act2d + + def delete_cells_by_point_index(self, indices): + """ + Delete a list of vertices identified by any of their vertex index. + + See also `delete_cells()`. + + Examples: + - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) + + ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) + """ + cell_ids = vtk.vtkIdList() + data = self.inputdata() + data.BuildLinks() + n = 0 + for i in np.unique(indices): + data.GetPointCells(i, cell_ids) + for j in range(cell_ids.GetNumberOfIds()): + data.DeleteCell(cell_ids.GetId(j)) # flag cell + n += 1 + + data.RemoveDeletedCells() + self.mapper.Modified() + self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) + return self + + def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): + """ + Generate point normals using PCA (principal component analysis). + Basically this estimates a local tangent plane around each sample point p + by considering a small neighborhood of points around p, and fitting a plane + to the neighborhood (via PCA). + + Arguments: + n : (int) + neighborhood size to calculate the normal + orientation_point : (list) + adjust the +/- sign of the normals so that + the normals all point towards a specified point. If None, perform a traversal + of the point cloud and flip neighboring normals so that they are mutually consistent. + invert : (bool) + flip all normals + """ + poly = self + pcan = vtk.vtkPCANormalEstimation() + pcan.SetInputData(poly) + pcan.SetSampleSize(n) + + if orientation_point is not None: + pcan.SetNormalOrientationToPoint() + pcan.SetOrientationPoint(orientation_point) + else: + pcan.SetNormalOrientationToGraphTraversal() + + if invert: + pcan.FlipNormalsOn() + pcan.Update() + + varr = pcan.GetOutput().GetPointData().GetNormals() + varr.SetName("Normals") + self.inputdata().GetPointData().SetNormals(varr) + self.inputdata().GetPointData().Modified() + return self + + def compute_acoplanarity(self, n=25, radius=None, on="points"): + """ + Compute acoplanarity which is a measure of how much a local region of the mesh + differs from a plane. + The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. + Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. + If a radius value is given and not enough points fall inside it, then a -1 is stored. + + Example: + ```python + from vedo import * + msh = ParametricShape('RandomHills') + msh.compute_acoplanarity(radius=0.1, on='cells') + msh.cmap("coolwarm", on='cells').add_scalarbar() + msh.show(axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) + """ + acoplanarities = [] + if "point" in on: + pts = self.points() + elif "cell" in on: + pts = self.cell_centers() + else: + raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") + + for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): + if n: + data = self.closest_point(p, n=n) + npts = n + elif radius: + data = self.closest_point(p, radius=radius) + npts = len(data) + + try: + center = data.mean(axis=0) + res = np.linalg.svd(data - center) + acoplanarities.append(res[1][2] / npts) + except: + acoplanarities.append(-1.0) + + if "point" in on: + self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) + else: + self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) return self + def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): + """ + Computes the distance from one point cloud or mesh to another point cloud or mesh. + This new `pointdata` array is saved with default name "Distance". + + Keywords `signed` and `invert` are used to compute signed distance, + but the mesh in that case must have polygonal faces (not a simple point cloud), + and normals must also be computed. + + Examples: + - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) + + ![](https://vedo.embl.es/images/basic/distance2mesh.png) + """ + if pcloud.inputdata().GetNumberOfPolys(): + + poly1 = self + poly2 = pcloud + df = vtk.vtkDistancePolyDataFilter() + df.ComputeSecondDistanceOff() + df.SetInputData(0, poly1) + df.SetInputData(1, poly2) + df.SetSignedDistance(signed) + df.SetNegateDistance(invert) + df.Update() + scals = df.GetOutput().GetPointData().GetScalars() + dists = utils.vtk2numpy(scals) + + else: # has no polygons and vtkDistancePolyDataFilter wants them (dont know why) + + if signed: + vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") + + if not pcloud.point_locator: + pcloud.point_locator = vtk.vtkPointLocator() + pcloud.point_locator.SetDataSet(pcloud) + pcloud.point_locator.BuildLocator() + + ids = [] + ps1 = self.points() + ps2 = pcloud.points() + for p in ps1: + pid = pcloud.point_locator.FindClosestPoint(p) + ids.append(pid) + + deltas = ps2[ids] - ps1 + dists = np.linalg.norm(deltas, axis=1).astype(np.float32) + scals = utils.numpy2vtk(dists) + + scals.SetName(name) + self.inputdata().GetPointData().AddArray(scals) # must be self.inputdata() ! + self.inputdata().GetPointData().SetActiveScalars(scals.GetName()) + rng = scals.GetRange() + self.mapper.SetScalarRange(rng[0], rng[1]) + self.mapper.ScalarVisibilityOn() + + self.pipeline = utils.OperationNode( + "distance_to", + parents=[self, pcloud], + shape="cylinder", + comment=f"#pts {self.GetNumberOfPoints()}", + ) + return dists + def clean(self): """ Clean pointcloud or mesh by removing coincident points. @@ -2487,487 +2785,189 @@ def caption( def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False): """ - Aligned to target mesh through the `Iterative Closest Point` algorithm. - - The core of the algorithm is to match each vertex in one surface with - the closest surface point on the other, then apply the transformation - that modify one surface to best match the other (in the least-square sense). - - Arguments: - rigid : (bool) - if True do not allow scaling - invert : (bool) - if True start by aligning the target to the source but - invert the transformation finally. Useful when the target is smaller - than the source. - use_centroids : (bool) - start by matching the centroids of the two objects. - - Examples: - - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) - - ![](https://vedo.embl.es/images/basic/align1.png) - - - [align2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align2.py) - - ![](https://vedo.embl.es/images/basic/align2.png) - """ - icp = vtk.vtkIterativeClosestPointTransform() - icp.SetSource(self) - icp.SetTarget(target) - if invert: - icp.Inverse() - icp.SetMaximumNumberOfIterations(iters) - if rigid: - icp.GetLandmarkTransform().SetModeToRigidBody() - icp.SetStartByMatchingCentroids(use_centroids) - icp.Update() - - T = LinearTransform(icp.GetMatrix()) - self.apply_transform(T) - - self.pipeline = utils.OperationNode( - "align_to", parents=[self, target], comment=f"rigid = {rigid}" - ) - return self - - def transform_with_landmarks( - self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False - ): - """ - Transform mesh orientation and position based on a set of landmarks points. - The algorithm finds the best matching of source points to target points - in the mean least square sense, in one single step. - - If affine is True the x, y and z axes can scale independently but stay collinear. - With least_squares they can vary orientation. - - Examples: - - [align5.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align5.py) - - ![](https://vedo.embl.es/images/basic/align5.png) - """ - - if utils.is_sequence(source_landmarks): - ss = vtk.vtkPoints() - for p in source_landmarks: - ss.InsertNextPoint(p) - else: - ss = source_landmarks.GetPoints() - if least_squares: - source_landmarks = source_landmarks.points() - - if utils.is_sequence(target_landmarks): - st = vtk.vtkPoints() - for p in target_landmarks: - st.InsertNextPoint(p) - else: - st = target_landmarks.GetPoints() - if least_squares: - target_landmarks = target_landmarks.points() - - if ss.GetNumberOfPoints() != st.GetNumberOfPoints(): - n1 = ss.GetNumberOfPoints() - n2 = st.GetNumberOfPoints() - vedo.logger.error(f"source and target have different nr of points {n1} vs {n2}") - raise RuntimeError() - - lmt = vtk.vtkLandmarkTransform() - lmt.SetSourceLandmarks(ss) - lmt.SetTargetLandmarks(st) - lmt.SetModeToSimilarity() - - if rigid: - lmt.SetModeToRigidBody() - lmt.Update() - self.SetUserTransform(lmt) - - elif affine: - lmt.SetModeToAffine() - lmt.Update() - self.SetUserTransform(lmt) - - elif least_squares: - cms = source_landmarks.mean(axis=0) - cmt = target_landmarks.mean(axis=0) - m = np.linalg.lstsq(source_landmarks - cms, target_landmarks - cmt, rcond=None)[0] - M = vtk.vtkMatrix4x4() - for i in range(3): - for j in range(3): - M.SetElement(j, i, m[i][j]) - lmt = vtk.vtkTransform() - lmt.Translate(cmt) - lmt.Concatenate(M) - lmt.Translate(-cms) - self.apply_transform(lmt) - - self.transform = lmt - self.point_locator = None - self.cell_locator = None - self.line_locator = None - self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) - return self - - def normalize(self): - """Scale Mesh average size to unit.""" - coords = self.points() - if not coords.shape[0]: - return self - cm = np.mean(coords, axis=0) - pts = coords - cm - xyz2 = np.sum(pts * pts, axis=0) - scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) - self.scale(scale).pos(cm) - return self - - def mirror(self, axis="x", origin=None): - """ - Mirror the mesh along one of the cartesian axes - - Arguments: - axis : (str) - axis to use for mirroring, must be set to x, y, z or n. - Or any combination of those. Adding 'n' reverses mesh faces (hence normals). - origin : (list) - use this point as the origin of the mirroring transformation. - - Examples: - - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) - - ![](https://vedo.embl.es/images/basic/mirror.png) - """ - sx, sy, sz = 1, 1, 1 - if "x" in axis.lower(): sx = -1 - if "y" in axis.lower(): sy = -1 - if "z" in axis.lower(): sz = -1 - - self.transform.scale([sx, sy, sz], origin=origin) - - outpoly = self - if sx * sy * sz < 0 or "n" in axis: - rs = vtk.vtkReverseSense() - rs.SetInputData(self) - rs.ReverseNormalsOn() - rs.Update() - outpoly = rs.GetOutput() - - self.DeepCopy(outpoly) - - self.point_locator = None - self.cell_locator = None - self.line_locator = None - - self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) - return self - - def flip_normals(self): - """Flip all mesh normals. Same as `mesh.mirror('n')`.""" - rs = vtk.vtkReverseSense() - rs.SetInputData(self.inputdata()) - rs.ReverseCellsOff() - rs.ReverseNormalsOn() - rs.Update() - self.DeepCopy(rs.GetOutput()) - self.pipeline = utils.OperationNode("flip_normals", parents=[self]) - return self - - ##################################################################################### - def cmap( - self, - input_cmap, - input_array=None, - on="points", - name="Scalars", - vmin=None, - vmax=None, - n_colors=256, - alpha=1.0, - logscale=False, - ): - """ - Set individual point/cell colors by providing a list of scalar values and a color map. - - Arguments: - input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) - color map scheme to transform a real number into a color. - input_array : (str, list, vtkArray) - can be the string name of an existing array, a numpy array or a `vtkArray`. - on : (str) - either 'points' or 'cells'. - Apply the color map to data which is defined on either points or cells. - name : (str) - give a name to the provided numpy array (if input_array is a numpy array) - vmin : (float) - clip scalars to this minimum value - vmax : (float) - clip scalars to this maximum value - n_colors : (int) - number of distinct colors to be used in colormap table. - alpha : (float, list) - Mesh transparency. Can be a `list` of values one for each vertex. - logscale : (bool) - Use logscale - - Examples: - - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) - - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) - (and many others) - - ![](https://vedo.embl.es/images/basic/mesh_custom.png) - """ - self._cmap_name = input_cmap - poly = self.inputdata() - - if input_array is None: - if not self.pointdata.keys() and self.celldata.keys(): - on = "cells" - if not poly.GetCellData().GetScalars(): - input_array = 0 # pick the first at hand - - if on.startswith("point"): - data = poly.GetPointData() - n = poly.GetNumberOfPoints() - elif on.startswith("cell"): - data = poly.GetCellData() - n = poly.GetNumberOfCells() - else: - vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") - raise RuntimeError() - - if input_array is None: # if None try to fetch the active scalars - arr = data.GetScalars() - if not arr: - vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") - return self - - if not arr.GetName(): # sometimes arrays dont have a name.. - arr.SetName(name) - - elif isinstance(input_array, str): # if a string is passed - arr = data.GetArray(input_array) - if not arr: - vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") - return self - - elif isinstance(input_array, int): # if an int is passed - if input_array < data.GetNumberOfArrays(): - arr = data.GetArray(input_array) - else: - vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") - return self - - elif utils.is_sequence(input_array): # if a numpy array is passed - npts = len(input_array) - if npts != n: - vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") - return self - arr = utils.numpy2vtk(input_array, name=name, dtype=float) - data.AddArray(arr) - data.Modified() - - elif isinstance(input_array, vtk.vtkArray): # if a vtkArray is passed - arr = input_array - data.AddArray(arr) - data.Modified() - - else: - vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") - raise RuntimeError() - - # Now we have array "arr" - array_name = arr.GetName() - - if arr.GetNumberOfComponents() == 1: - if vmin is None: - vmin = arr.GetRange()[0] - if vmax is None: - vmax = arr.GetRange()[1] - else: - if vmin is None or vmax is None: - vn = utils.mag(utils.vtk2numpy(arr)) - if vmin is None: - vmin = vn.min() - if vmax is None: - vmax = vn.max() - - # interpolate alphas if they are not constant - if not utils.is_sequence(alpha): - alpha = [alpha] * n_colors - else: - v = np.linspace(0, 1, n_colors, endpoint=True) - xp = np.linspace(0, 1, len(alpha), endpoint=True) - alpha = np.interp(v, xp, alpha) - - ########################### build the look-up table - if isinstance(input_cmap, vtk.vtkLookupTable): # vtkLookupTable - lut = input_cmap - - elif utils.is_sequence(input_cmap): # manual sequence of colors - lut = vtk.vtkLookupTable() - if logscale: - lut.SetScaleToLog10() - lut.SetRange(vmin, vmax) - ncols = len(input_cmap) - lut.SetNumberOfTableValues(ncols) - - for i, c in enumerate(input_cmap): - r, g, b = colors.get_color(c) - lut.SetTableValue(i, r, g, b, alpha[i]) - lut.Build() - - else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap - lut = vtk.vtkLookupTable() - if logscale: - lut.SetScaleToLog10() - lut.SetVectorModeToMagnitude() - lut.SetRange(vmin, vmax) - lut.SetNumberOfTableValues(n_colors) - mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) - for i, c in enumerate(mycols): - r, g, b = c - lut.SetTableValue(i, r, g, b, alpha[i]) - lut.Build() + Aligned to target mesh through the `Iterative Closest Point` algorithm. - arr.SetLookupTable(lut) + The core of the algorithm is to match each vertex in one surface with + the closest surface point on the other, then apply the transformation + that modify one surface to best match the other (in the least-square sense). - data.SetActiveScalars(array_name) - # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars - # data.SetActiveAttribute(array_name, 0) # boh! + Arguments: + rigid : (bool) + if True do not allow scaling + invert : (bool) + if True start by aligning the target to the source but + invert the transformation finally. Useful when the target is smaller + than the source. + use_centroids : (bool) + start by matching the centroids of the two objects. - if data.GetScalars(): - data.GetScalars().SetLookupTable(lut) - data.GetScalars().Modified() + Examples: + - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) - self.mapper.SetLookupTable(lut) - self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars + ![](https://vedo.embl.es/images/basic/align1.png) - self.mapper.ScalarVisibilityOn() - self.mapper.SetScalarRange(lut.GetRange()) - if on.startswith("point"): - self.mapper.SetScalarModeToUsePointData() - else: - self.mapper.SetScalarModeToUseCellData() - if hasattr(self.mapper, "SetArrayName"): - self.mapper.SetArrayName(array_name) + - [align2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align2.py) - return self + ![](https://vedo.embl.es/images/basic/align2.png) + """ + icp = vtk.vtkIterativeClosestPointTransform() + icp.SetSource(self) + icp.SetTarget(target) + if invert: + icp.Inverse() + icp.SetMaximumNumberOfIterations(iters) + if rigid: + icp.GetLandmarkTransform().SetModeToRigidBody() + icp.SetStartByMatchingCentroids(use_centroids) + icp.Update() - def cell_individual_colors(self, colorlist): - # DEPRECATED - self.cellcolors = colorlist - print("Please use property mesh.cellcolors=... instead of mesh.cell_individual_colors()") + T = LinearTransform(icp.GetMatrix()) + self.apply_transform(T) + + self.pipeline = utils.OperationNode( + "align_to", parents=[self, target], comment=f"rigid = {rigid}" + ) return self - @property - def cellcolors(self): + def transform_with_landmarks( + self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False + ): """ - Colorize each cell (face) of a mesh by passing - a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. - Colors levels and opacities must be in the range [0,255]. - - A single constant color can also be passed as string or RGBA. + Transform mesh orientation and position based on a set of landmarks points. + The algorithm finds the best matching of source points to target points + in the mean least square sense, in one single step. - A cell array named "CellsRGBA" is automatically created. + If affine is True the x, y and z axes can scale independently but stay collinear. + With least_squares they can vary orientation. Examples: - - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) - - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) + - [align5.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align5.py) - ![](https://vedo.embl.es/images/basic/colorMeshCells.png) + ![](https://vedo.embl.es/images/basic/align5.png) """ - if "CellsRGBA" not in self.celldata.keys(): - lut = self.mapper.GetLookupTable() - vscalars = self.GetCellData().GetScalars() - if vscalars is None or lut is None: - arr = np.zeros([self.ncells, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) - col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() - alf = np.round(alf * 255).astype(np.uint8) - arr[:, (0, 1, 2)] = col - arr[:, 3] = alf - else: - cols = lut.MapScalars(vscalars, 0, 0) - arr = utils.vtk2numpy(cols) - self.celldata["CellsRGBA"] = arr - self.celldata.select("CellsRGBA") - return self.celldata["CellsRGBA"] - @cellcolors.setter - def cellcolors(self, value): - if isinstance(value, str): - c = colors.get_color(value) - value = np.array([*c, 1]) * 255 - value = np.round(value) + if utils.is_sequence(source_landmarks): + ss = vtk.vtkPoints() + for p in source_landmarks: + ss.InsertNextPoint(p) + else: + ss = source_landmarks.GetPoints() + if least_squares: + source_landmarks = source_landmarks.points() - value = np.asarray(value) - n = self.ncells + if utils.is_sequence(target_landmarks): + st = vtk.vtkPoints() + for p in target_landmarks: + st.InsertNextPoint(p) + else: + st = target_landmarks.GetPoints() + if least_squares: + target_landmarks = target_landmarks.points() - if value.ndim == 1: - value = np.repeat([value], n, axis=0) + if ss.GetNumberOfPoints() != st.GetNumberOfPoints(): + n1 = ss.GetNumberOfPoints() + n2 = st.GetNumberOfPoints() + vedo.logger.error(f"source and target have different nr of points {n1} vs {n2}") + raise RuntimeError() - if value.shape[1] == 3: - z = np.zeros((n, 1), dtype=np.uint8) - value = np.append(value, z + 255, axis=1) + lmt = vtk.vtkLandmarkTransform() + lmt.SetSourceLandmarks(ss) + lmt.SetTargetLandmarks(st) + lmt.SetModeToSimilarity() - assert n == value.shape[0] + if rigid: + lmt.SetModeToRigidBody() + lmt.Update() + self.SetUserTransform(lmt) - self.celldata["CellsRGBA"] = value.astype(np.uint8) - self.celldata.select("CellsRGBA") + elif affine: + lmt.SetModeToAffine() + lmt.Update() + self.SetUserTransform(lmt) + elif least_squares: + cms = source_landmarks.mean(axis=0) + cmt = target_landmarks.mean(axis=0) + m = np.linalg.lstsq(source_landmarks - cms, target_landmarks - cmt, rcond=None)[0] + M = vtk.vtkMatrix4x4() + for i in range(3): + for j in range(3): + M.SetElement(j, i, m[i][j]) + lmt = vtk.vtkTransform() + lmt.Translate(cmt) + lmt.Concatenate(M) + lmt.Translate(-cms) + self.apply_transform(lmt) - @property - def pointcolors(self): - """ - Colorize each point (or vertex of a mesh) by passing - a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. - Colors levels and opacities must be in the range [0,255]. + self.transform = lmt + self.point_locator = None + self.cell_locator = None + self.line_locator = None + self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) + return self - A single constant color can also be passed as string or RGBA. + def normalize(self): + """Scale Mesh average size to unit.""" + coords = self.points() + if not coords.shape[0]: + return self + cm = np.mean(coords, axis=0) + pts = coords - cm + xyz2 = np.sum(pts * pts, axis=0) + scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) + self.scale(scale).pos(cm) + return self - A point array named "PointsRGBA" is automatically created. + def mirror(self, axis="x", origin=None): """ - if "PointsRGBA" not in self.pointdata.keys(): - lut = self.mapper.GetLookupTable() - vscalars = self.GetPointData().GetScalars() - if vscalars is None or lut is None: - arr = np.zeros([self.npoints, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) - col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() - alf = np.round(alf * 255).astype(np.uint8) - arr[:, (0, 1, 2)] = col - arr[:, 3] = alf - else: - cols = lut.MapScalars(vscalars, 0, 0) - arr = utils.vtk2numpy(cols) - self.pointdata["PointsRGBA"] = arr - self.pointdata.select("PointsRGBA") - return self.pointdata["PointsRGBA"] + Mirror the mesh along one of the cartesian axes - @pointcolors.setter - def pointcolors(self, value): - if isinstance(value, str): - c = colors.get_color(value) - value = np.array([*c, 1]) * 255 - value = np.round(value) + Arguments: + axis : (str) + axis to use for mirroring, must be set to x, y, z or n. + Or any combination of those. Adding 'n' reverses mesh faces (hence normals). + origin : (list) + use this point as the origin of the mirroring transformation. - value = np.asarray(value) - n = self.npoints + Examples: + - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) - if value.ndim == 1: - value = np.repeat([value], n, axis=0) + ![](https://vedo.embl.es/images/basic/mirror.png) + """ + sx, sy, sz = 1, 1, 1 + if "x" in axis.lower(): sx = -1 + if "y" in axis.lower(): sy = -1 + if "z" in axis.lower(): sz = -1 - if value.shape[1] == 3: - z = np.zeros((n, 1), dtype=np.uint8) - value = np.append(value, z + 255, axis=1) + self.transform.scale([sx, sy, sz], origin=origin) + + outpoly = self + if sx * sy * sz < 0 or "n" in axis: + rs = vtk.vtkReverseSense() + rs.SetInputData(self) + rs.ReverseNormalsOn() + rs.Update() + outpoly = rs.GetOutput() + + self.DeepCopy(outpoly) - assert n == value.shape[0] + self.point_locator = None + self.cell_locator = None + self.line_locator = None - self.pointdata["PointsRGBA"] = value.astype(np.uint8) - self.pointdata.select("PointsRGBA") + self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) + return self + def flip_normals(self): + """Flip all mesh normals. Same as `mesh.mirror('n')`.""" + rs = vtk.vtkReverseSense() + rs.SetInputData(self.inputdata()) + rs.ReverseCellsOff() + rs.ReverseNormalsOn() + rs.Update() + self.DeepCopy(rs.GetOutput()) + self.pipeline = utils.OperationNode("flip_normals", parents=[self]) + return self def interpolate_data_from( self, diff --git a/vedo/pyplot.py b/vedo/pyplot.py index c21a0cf8..f0ca7a62 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -194,7 +194,7 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * self.axes = None if xlim[0] >= xlim[1] or ylim[0] >= ylim[1]: vedo.logger.warning(f"Null range for Figure {self.title}... returning an empty Assembly.") - Assembly.__init__(self) + super.__init__() self.yscale = 0 return @@ -240,7 +240,7 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * self.axes = addons.Axes(**axes_opts) - Assembly.__init__(self, [self.axes]) + super().__init__([self.axes]) self.name = "Figure" vedo.last_figure = self if settings.remember_last_figure_format else None @@ -969,7 +969,7 @@ def __init__( fig_kwargs["label"] = nlab ############################################### Figure init - Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) + super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return @@ -1284,7 +1284,7 @@ def __init__( axes_opts["htitle_offset"] = [-0.49, 0.01, 0] ############################################### Figure init - Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) + super.__init__(xlim, ylim, aspect, padding, **fig_kwargs) if self.yscale: ##################### the grid @@ -1467,7 +1467,7 @@ def __init__( self.edges = edges self.centers = centers self.bins = edges # internal used by "like" - Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) + super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return @@ -1743,7 +1743,7 @@ def __init__( fig_kwargs["label"] = nlab ############################################### Figure init - Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) + super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return @@ -4088,7 +4088,7 @@ def __init__(self, **kargs): ![](https://vedo.embl.es/images/pyplot/graph_network.png) """ - vedo.Assembly.__init__(self) + super().__init__() self.nodes = [] self.edges = [] @@ -4326,6 +4326,6 @@ def build(self): edge_labels.color(self._c).pickable(True) edge_labels.name = "DirectedGraphEdgeLabels" - Assembly.__init__(self, [dgraph, node_labels, edge_labels, arrows]) + super().__init__([dgraph, node_labels, edge_labels, arrows]) self.name = "DirectedGraphAssembly" return self diff --git a/vedo/settings.py b/vedo/settings.py index 3475cf8a..48569791 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -31,7 +31,7 @@ class Settings: # [DISABLED] Allow to continuously interact with scene during interactive() execution allow_interaction = True - # Enable tracking pipeline functionality: + # Enable tracking pipeline functionality: # allows to show a graph with the pipeline of action which let to a final object # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) self.enable_pipeline = True From 81274ba42683b86ea4ed5d3e7116f55c0bb47999 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:27:38 +0200 Subject: [PATCH 016/251] voronoi --- examples/advanced/voronoi2.py | 4 +- examples/basic/voronoi1.py | 4 +- vedo/base.py | 13 +- vedo/pointcloud.py | 282 +++++++++++++++++----------------- 4 files changed, 148 insertions(+), 155 deletions(-) diff --git a/examples/advanced/voronoi2.py b/examples/advanced/voronoi2.py index 44cab42e..1a8e65f6 100644 --- a/examples/advanced/voronoi2.py +++ b/examples/advanced/voronoi2.py @@ -1,5 +1,5 @@ """Voronoi tessellation of a pointcloud on a grid""" -from vedo import dataurl, Points, Grid, voronoi, show +from vedo import dataurl, Points, Grid, show pts0 = Points(dataurl+'rios.xyz').color('k') pts1 = pts0.clone().smooth_lloyd_2d() @@ -7,7 +7,7 @@ grid = Grid([14500,61700], s=[22000,24000], res=[30,30]).ps(1) allpts = pts1.points().tolist() + grid.points().tolist() -msh = voronoi(allpts, method='scipy') +msh = Points(allpts).generate_voronoi(method='scipy') msh.lw(0.1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') centers = Points(msh.cell_centers(), c='k') diff --git a/examples/basic/voronoi1.py b/examples/basic/voronoi1.py index 3d22aab2..aea6efac 100644 --- a/examples/basic/voronoi1.py +++ b/examples/basic/voronoi1.py @@ -1,11 +1,11 @@ """Voronoi convex tiling of the plane from a set of random points""" -from vedo import Points, voronoi, show import numpy as np +from vedo import Points, show points = np.random.random((500, 2)) pts = Points(points).subsample(0.02) # impose a min distance of 2% -vor = voronoi(pts, padding=0.01) +vor = pts.generate_voronoi(padding=0.01) vor.cmap('Set3', "VoronoiID", on='cells').wireframe(False) lab = vor.labels("VoronoiID", on='cells', scale=0.01) diff --git a/vedo/base.py b/vedo/base.py index ee768624..bbf88bba 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -836,15 +836,11 @@ def __init__(self): self.mapper = None self._caption = None self.property = None - self.mapper = None def inputdata(self): """Obsolete, use `self` instead.""" - # """Return the VTK input data object.""" - # if self.mapper: - # return self.mapper.GetInput() - # return self.GetMapper().GetInput() + print("WARNING: inputdata() is obsolete, use self instead.") return self @property @@ -1034,13 +1030,6 @@ def print_histogram( ) return self - def c(self, color=False, alpha=None): - """ - Shortcut for `color()`. - If None is passed as input, will use colors from current active scalars. - """ - return self.color(color, alpha) - @property def pointdata(self): """ diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index aeefecb5..2b973a5b 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -27,7 +27,6 @@ "merge", "visible_points", "delaunay2d", - "voronoi", "fit_line", "fit_circle", "fit_plane", @@ -87,7 +86,7 @@ def merge(*meshs, flag=False): msh.pipeline = utils.OperationNode( "merge", parents=objs, - comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", + comment=f"#pts {msh.GetNumberOfPoints()}", ) return msh @@ -224,112 +223,11 @@ def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0 msh.pipeline = utils.OperationNode( "delaunay2d", parents=parents, - comment=f"#cells {msh.inputdata().GetNumberOfCells()}" + comment=f"#cells {msh.GetNumberOfCells()}" ) return msh -def voronoi(pts, padding=0.0, fit=False, method="vtk"): - """ - Generate the 2D Voronoi convex tiling of the input points (z is ignored). - The points are assumed to lie in a plane. The output is a Mesh. Each output cell is a convex polygon. - - The 2D Voronoi tessellation is a tiling of space, where each Voronoi tile represents the region nearest - to one of the input points. Voronoi tessellations are important in computational geometry - (and many other fields), and are the dual of Delaunay triangulations. - - Thus the triangulation is constructed in the x-y plane, and the z coordinate is ignored - (although carried through to the output). - If you desire to triangulate in a different plane, you can use fit=True. - - A brief summary is as follows. Each (generating) input point is associated with - an initial Voronoi tile, which is simply the bounding box of the point set. - A locator is then used to identify nearby points: each neighbor in turn generates a - clipping line positioned halfway between the generating point and the neighboring point, - and orthogonal to the line connecting them. Clips are readily performed by evaluationg the - vertices of the convex Voronoi tile as being on either side (inside,outside) of the clip line. - If two intersections of the Voronoi tile are found, the portion of the tile "outside" the clip - line is discarded, resulting in a new convex, Voronoi tile. As each clip occurs, - the Voronoi "Flower" error metric (the union of error spheres) is compared to the extent of the region - containing the neighboring clip points. The clip region (along with the points contained in it) is grown - by careful expansion (e.g., outward spiraling iterator over all candidate clip points). - When the Voronoi Flower is contained within the clip region, the algorithm terminates and the Voronoi - tile is output. Once complete, it is possible to construct the Delaunay triangulation from the Voronoi - tessellation. Note that topological and geometric information is used to generate a valid triangulation - (e.g., merging points and validating topology). - - Arguments: - pts : (list) - list of input points. - padding : (float) - padding distance. The default is 0. - fit : (bool) - detect automatically the best fitting plane. The default is False. - - Examples: - - [voronoi1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi1.py) - - ![](https://vedo.embl.es/images/basic/voronoi1.png) - - - [voronoi2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi2.py) - - ![](https://vedo.embl.es/images/advanced/voronoi2.png) - """ - if method == "scipy": - from scipy.spatial import Voronoi as scipy_voronoi - - pts = np.asarray(pts)[:, (0, 1)] - vor = scipy_voronoi(pts) - regs = [] # filter out invalid indices - for r in vor.regions: - flag = True - for x in r: - if x < 0: - flag = False - break - if flag and len(r) > 0: - regs.append(r) - - m = vedo.Mesh([vor.vertices, regs], c="orange5") - m.celldata["VoronoiID"] = np.array(list(range(len(regs)))).astype(int) - m.locator = None - - elif method == "vtk": - vor = vtk.vtkVoronoi2D() - if isinstance(pts, Points): - vor.SetInputData(pts) - else: - pts = np.asarray(pts) - if pts.shape[1] == 2: - pts = np.c_[pts, np.zeros(len(pts))] - pd = vtk.vtkPolyData() - vpts = vtk.vtkPoints() - vpts.SetData(utils.numpy2vtk(pts, dtype=np.float32)) - pd.SetPoints(vpts) - vor.SetInputData(pd) - vor.SetPadding(padding) - vor.SetGenerateScalarsToPointIds() - if fit: - vor.SetProjectionPlaneModeToBestFittingPlane() - else: - vor.SetProjectionPlaneModeToXYPlane() - vor.Update() - poly = vor.GetOutput() - arr = poly.GetCellData().GetArray(0) - if arr: - arr.SetName("VoronoiID") - m = vedo.Mesh(poly, c="orange5") - m.locator = vor.GetLocator() - - else: - vedo.logger.error(f"Unknown method {method} in voronoi()") - raise RuntimeError - - m.lw(2).lighting("off").wireframe() - m.name = "Voronoi" - return m - - def _rotate_points(points, n0=None, n1=(0, 0, 1)): # Rotate a set of 3D points from direction n0 to direction n1. # Return the rotated points and the normal to the fitting plane (if n0 is None). @@ -748,6 +646,13 @@ def color(self, c=False, alpha=None): self.alpha(alpha) return self + def c(self, color=False, alpha=None): + """ + Shortcut for `color()`. + If None is passed as input, will use colors from current active scalars. + """ + return self.color(color, alpha) + def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: @@ -1083,20 +988,19 @@ def cmap( ![](https://vedo.embl.es/images/basic/mesh_custom.png) """ self._cmap_name = input_cmap - poly = self.inputdata() if input_array is None: if not self.pointdata.keys() and self.celldata.keys(): on = "cells" - if not poly.GetCellData().GetScalars(): + if not self.GetCellData().GetScalars(): input_array = 0 # pick the first at hand if on.startswith("point"): - data = poly.GetPointData() - n = poly.GetNumberOfPoints() + data = self.GetPointData() + n = self.GetNumberOfPoints() elif on.startswith("cell"): - data = poly.GetCellData() - n = poly.GetNumberOfCells() + data = self.GetCellData() + n = self.GetNumberOfCells() else: vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") raise RuntimeError() @@ -1765,16 +1669,15 @@ def delete_cells_by_point_index(self, indices): ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) """ cell_ids = vtk.vtkIdList() - data = self.inputdata() - data.BuildLinks() + self.BuildLinks() n = 0 for i in np.unique(indices): - data.GetPointCells(i, cell_ids) + self.GetPointCells(i, cell_ids) for j in range(cell_ids.GetNumberOfIds()): - data.DeleteCell(cell_ids.GetId(j)) # flag cell + self.DeleteCell(cell_ids.GetId(j)) # flag cell n += 1 - data.RemoveDeletedCells() + self.RemoveDeletedCells() self.mapper.Modified() self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) return self @@ -1813,8 +1716,8 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): varr = pcan.GetOutput().GetPointData().GetNormals() varr.SetName("Normals") - self.inputdata().GetPointData().SetNormals(varr) - self.inputdata().GetPointData().Modified() + self.GetPointData().SetNormals(varr) + self.GetPointData().Modified() return self def compute_acoplanarity(self, n=25, radius=None, on="points"): @@ -1878,7 +1781,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ - if pcloud.inputdata().GetNumberOfPolys(): + if pcloud.GetNumberOfPolys(): poly1 = self poly2 = pcloud @@ -1914,8 +1817,8 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): scals = utils.numpy2vtk(dists) scals.SetName(name) - self.inputdata().GetPointData().AddArray(scals) # must be self.inputdata() ! - self.inputdata().GetPointData().SetActiveScalars(scals.GetName()) + self.GetPointData().AddArray(scals) + self.GetPointData().SetActiveScalars(scals.GetName()) rng = scals.GetRange() self.mapper.SetScalarRange(rng[0], rng[1]) self.mapper.ScalarVisibilityOn() @@ -1937,12 +1840,12 @@ def clean(self): cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self.inputdata()) + cpd.SetInputData(self) cpd.Update() self.DeepCopy(cpd.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], - comment=f"#pts {self.inputdata().GetNumberOfPoints()}" + comment=f"#pts {self.GetNumberOfPoints()}" ) return self @@ -1975,7 +1878,7 @@ def subsample(self, fraction, absolute=False): cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self.inputdata()) + cpd.SetInputData(self) if absolute: cpd.SetTolerance(fraction / self.diagonal_size()) # cpd.SetToleranceIsAbsolute(absolute) @@ -2013,7 +1916,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ thres = vtk.vtkThreshold() - thres.SetInputData(self.inputdata()) + thres.SetInputData(self) if on.startswith("c"): asso = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS @@ -2054,9 +1957,8 @@ def quantize(self, value): The user should input a value and all {x,y,z} coordinates will be quantized to that absolute grain size. """ - poly = self.inputdata() qp = vtk.vtkQuantizePolyDataPoints() - qp.SetInputData(poly) + qp.SetInputData(self) qp.SetQFactor(value) qp.Update() self.DeepCopy(qp.GetOutput()) @@ -2206,12 +2108,12 @@ def labels( if content is None: mode = 0 if cells: - if self.inputdata().GetCellData().GetScalars(): - name = self.inputdata().GetCellData().GetScalars().GetName() + if self.GetCellData().GetScalars(): + name = self.GetCellData().GetScalars().GetName() arr = self.celldata[name] else: - if self.inputdata().GetPointData().GetScalars(): - name = self.inputdata().GetPointData().GetScalars().GetName() + if self.GetPointData().GetScalars(): + name = self.GetPointData().GetScalars().GetName() arr = self.pointdata[name] elif isinstance(content, (str, int)): if content == "id": @@ -2257,7 +2159,6 @@ def labels( tx_poly = tx.GetOutput() else: tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) - tx_poly = tx_poly.inputdata() if tx_poly.GetNumberOfPoints() == 0: continue ####################### @@ -2374,7 +2275,7 @@ def labels2d( vedo.logger.error(f"In labels2d: cell array {content} does not exist.") return None cellcloud = Points(self.cell_centers()) - arr = self.inputdata().GetCellData().GetScalars() + arr = self.GetCellData().GetScalars() poly = cellcloud poly.GetPointData().SetScalars(arr) else: @@ -2961,7 +2862,7 @@ def mirror(self, axis="x", origin=None): def flip_normals(self): """Flip all mesh normals. Same as `mesh.mirror('n')`.""" rs = vtk.vtkReverseSense() - rs.SetInputData(self.inputdata()) + rs.SetInputData(self) rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() @@ -4385,7 +4286,7 @@ def generate_mesh( cmesh.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], - comment=f"#quads {cmesh.inputdata().GetNumberOfCells()}", + comment=f"#quads {cmesh.GetNumberOfCells()}", ) return cmesh ############################################# @@ -4431,7 +4332,7 @@ def generate_mesh( dln.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], - comment=f"#cells {dln.inputdata().GetNumberOfCells()}", + comment=f"#cells {dln.GetNumberOfCells()}", ) return dln @@ -4524,7 +4425,7 @@ def reconstruct_surface( m.pipeline = utils.OperationNode( "reconstruct_surface", parents=[self], - comment=f"#pts {m.inputdata().GetNumberOfPoints()}" + comment=f"#pts {m.GetNumberOfPoints()}" ) return m @@ -4539,13 +4440,13 @@ def compute_clustering(self, radius): ![](https://vedo.embl.es/images/basic/clustering.png) """ cluster = vtk.vtkEuclideanClusterExtraction() - cluster.SetInputData(self.inputdata()) + cluster.SetInputData(self) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) cluster.ColorClustersOn() cluster.Update() idsarr = cluster.GetOutput().GetPointData().GetArray("ClusterId") - self.inputdata().GetPointData().AddArray(idsarr) + self.GetPointData().AddArray(idsarr) self.pipeline = utils.OperationNode( "compute_clustering", parents=[self], comment=f"radius = {radius}" @@ -4787,7 +4688,7 @@ def _readPoints(): cld.pipeline = utils.OperationNode( "densify", parents=[self], c="#e9c46a:", - comment=f"#pts {cld.inputdata().GetNumberOfPoints()}" + comment=f"#pts {cld.GetNumberOfPoints()}" ) return cld @@ -4953,3 +4854,106 @@ def generate_random_data(self): self.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) return self + + + def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): + """ + Generate the 2D Voronoi convex tiling of the input points (z is ignored). + The points are assumed to lie in a plane. The output is a Mesh. Each output cell is a convex polygon. + + The 2D Voronoi tessellation is a tiling of space, where each Voronoi tile represents the region nearest + to one of the input points. Voronoi tessellations are important in computational geometry + (and many other fields), and are the dual of Delaunay triangulations. + + Thus the triangulation is constructed in the x-y plane, and the z coordinate is ignored + (although carried through to the output). + If you desire to triangulate in a different plane, you can use fit=True. + + A brief summary is as follows. Each (generating) input point is associated with + an initial Voronoi tile, which is simply the bounding box of the point set. + A locator is then used to identify nearby points: each neighbor in turn generates a + clipping line positioned halfway between the generating point and the neighboring point, + and orthogonal to the line connecting them. Clips are readily performed by evaluationg the + vertices of the convex Voronoi tile as being on either side (inside,outside) of the clip line. + If two intersections of the Voronoi tile are found, the portion of the tile "outside" the clip + line is discarded, resulting in a new convex, Voronoi tile. As each clip occurs, + the Voronoi "Flower" error metric (the union of error spheres) is compared to the extent of the region + containing the neighboring clip points. The clip region (along with the points contained in it) is grown + by careful expansion (e.g., outward spiraling iterator over all candidate clip points). + When the Voronoi Flower is contained within the clip region, the algorithm terminates and the Voronoi + tile is output. Once complete, it is possible to construct the Delaunay triangulation from the Voronoi + tessellation. Note that topological and geometric information is used to generate a valid triangulation + (e.g., merging points and validating topology). + + Arguments: + pts : (list) + list of input points. + padding : (float) + padding distance. The default is 0. + fit : (bool) + detect automatically the best fitting plane. The default is False. + + Examples: + - [voronoi1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi1.py) + + ![](https://vedo.embl.es/images/basic/voronoi1.png) + + - [voronoi2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi2.py) + + ![](https://vedo.embl.es/images/advanced/voronoi2.png) + """ + pts = self.points() + + if method == "scipy": + from scipy.spatial import Voronoi as scipy_voronoi + + pts = np.asarray(pts)[:, (0, 1)] + vor = scipy_voronoi(pts) + regs = [] # filter out invalid indices + for r in vor.regions: + flag = True + for x in r: + if x < 0: + flag = False + break + if flag and len(r) > 0: + regs.append(r) + + m = vedo.Mesh([vor.vertices, regs], c="orange5") + m.celldata["VoronoiID"] = np.array(list(range(len(regs)))).astype(int) + m.locator = None + + elif method == "vtk": + vor = vtk.vtkVoronoi2D() + if isinstance(pts, Points): + vor.SetInputData(pts) + else: + pts = np.asarray(pts) + if pts.shape[1] == 2: + pts = np.c_[pts, np.zeros(len(pts))] + pd = vtk.vtkPolyData() + vpts = vtk.vtkPoints() + vpts.SetData(utils.numpy2vtk(pts, dtype=np.float32)) + pd.SetPoints(vpts) + vor.SetInputData(pd) + vor.SetPadding(padding) + vor.SetGenerateScalarsToPointIds() + if fit: + vor.SetProjectionPlaneModeToBestFittingPlane() + else: + vor.SetProjectionPlaneModeToXYPlane() + vor.Update() + poly = vor.GetOutput() + arr = poly.GetCellData().GetArray(0) + if arr: + arr.SetName("VoronoiID") + m = vedo.Mesh(poly, c="orange5") + m.locator = vor.GetLocator() + + else: + vedo.logger.error(f"Unknown method {method} in voronoi()") + raise RuntimeError + + m.lw(2).lighting("off").wireframe() + m.name = "Voronoi" + return m From 6cf718bce6d52d3c77c2c660139cff2a64c8ea77 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:37:02 +0200 Subject: [PATCH 017/251] move delauney2d and voronoi as Points methods --- vedo/pointcloud.py | 2563 ++++++++++++++++++++++---------------------- 1 file changed, 1286 insertions(+), 1277 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 2b973a5b..cbe126f4 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -146,33 +146,7 @@ def visible_points(mesh, area=(), tol=None, invert=False): def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None): - """ - Create a mesh from points in the XY plane. - If `mode='fit'` then the filter computes a best fitting - plane and projects the points onto it. - - Arguments: - tol : (float) - specify a tolerance to control discarding of closely spaced points. - This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. - alpha : (float) - for a non-zero alpha value, only edges or triangles contained - within a sphere centered at mesh vertices will be output. - Otherwise, only triangles will be output. - offset : (float) - multiplier to control the size of the initial, bounding Delaunay triangulation. - transform: vtkTransform - a VTK transformation (eg. a thinplate spline) - which is applied to points to generate a 2D problem. - This maps a 3D dataset into a 2D dataset where triangulation can be done on the XY plane. - The points are transformed and triangulated. - The topology of triangulated points is used as the output topology. - - Examples: - - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) - - ![](https://vedo.embl.es/images/basic/delaunay2d.png) - """ + """delaunay2d() is deprecated, use Points().generate_delaunay2d() instead""" if isinstance(plist, Points): parents = [plist] plist = plist.points() @@ -180,52 +154,9 @@ def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0 parents = [] plist = np.ascontiguousarray(plist) plist = utils.make3d(plist) - - ######################################################### - if mode == "scipy": - from scipy.spatial import Delaunay as scipy_delaunay - tri = scipy_delaunay(plist[:, 0:2]) - return vedo.mesh.Mesh([plist, tri.simplices]) - ########################################################## - - pd = vtk.vtkPolyData() - vpts = vtk.vtkPoints() - vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) - pd.SetPoints(vpts) - - delny = vtk.vtkDelaunay2D() - delny.SetInputData(pd) - if tol: - delny.SetTolerance(tol) - delny.SetAlpha(alpha) - delny.SetOffset(offset) - if transform: - if hasattr(transform, "transform"): - transform = transform.transform - delny.SetTransform(transform) - - if mode == "xy" and boundaries: - boundary = vtk.vtkPolyData() - boundary.SetPoints(vpts) - cell_array = vtk.vtkCellArray() - for b in boundaries: - cpolygon = vtk.vtkPolygon() - for idd in b: - cpolygon.GetPointIds().InsertNextId(idd) - cell_array.InsertNextCell(cpolygon) - boundary.SetPolys(cell_array) - delny.SetSourceData(boundary) - - if mode == "fit": - delny.SetProjectionPlaneMode(vtk.VTK_BEST_FITTING_PLANE) - delny.Update() - msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") - - msh.pipeline = utils.OperationNode( - "delaunay2d", parents=parents, - comment=f"#cells {msh.GetNumberOfCells()}" - ) - return msh + pp = Points(plist).generate_delaunay2d(**kwargs) + print("WARNING: delaunay2d() is deprecated, use Points().generate_delaunay2d() instead") + return pp def _rotate_points(points, n0=None, n1=(0, 0, 1)): @@ -1267,1422 +1198,1423 @@ def update_shadows(self): return self -################################################### -class Points(PointsVisual, BaseActor, vtk.vtkPolyData): - """>Work with point clouds.""" - - def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): + def labels( + self, + content=None, + on="points", + scale=None, + xrot=0.0, + yrot=0.0, + zrot=0.0, + ratio=1, + precision=None, + italic=False, + font="", + justify="bottom-left", + c="black", + alpha=1.0, + cells=None, + ): """ - Build an object made of only vertex points for a list of 2D/3D points. - Both shapes (N, 3) or (3, N) are accepted as input, if N>3. - For very large point clouds a list of colors and alpha can be assigned to each - point in the form c=[(R,G,B,A), ... ] where 0<=R<256, ... 0<=A<256. + Generate value or ID labels for mesh cells or points. + For large nr. of labels use `font="VTK"` which is much faster. + + See also: + `labels2d()`, `flagpole()`, `caption()` and `legend()`. Arguments: - inputobj : (list, tuple) - r : (int) - Point radius in units of pixels. - c : (str, list) - Color name or rgb tuple. - alpha : (float) - Transparency in range [0,1]. + content : (list,int,str) + either 'id', 'cellid', array name or array number. + A array can also be passed (must match the nr. of points or cells). + on : (str) + generate labels for "cells" instead of "points" + scale : (float) + absolute size of labels, if left as None it is automatic + zrot : (float) + local rotation angle of label in degrees + ratio : (int) + skipping ratio, to reduce nr of labels for large meshes + precision : (int) + numeric precision of labels - Example: - ```python - from vedo import * + ```python + from vedo import * + s = Sphere(res=10).linewidth(1).c("orange").compute_normals() + point_ids = s.labels('id', on="points").c('green') + cell_ids = s.labels('id', on="cells" ).c('black') + show(s, point_ids, cell_ids) + ``` + ![](https://vedo.embl.es/images/feats/labels.png) - def fibonacci_sphere(n): - s = np.linspace(0, n, num=n, endpoint=False) - theta = s * 2.399963229728653 - y = 1 - s * (2/(n-1)) - r = np.sqrt(1 - y * y) - x = np.cos(theta) * r - z = np.sin(theta) * r - return [x,y,z] + Examples: + - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) - Points(fibonacci_sphere(1000)).show(axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/fibonacci.png) + ![](https://vedo.embl.es/images/basic/boundaries.png) """ - # super().__init__() ## super is not working here - vtk.vtkPolyData.__init__(self) - BaseActor.__init__(self) - PointsVisual.__init__(self) - - self.transform = LinearTransform() - self.actor.data = self - # self.name = "Points" # better not to give it a name here + if cells is not None: # deprecation message + vedo.logger.warning("In labels(cells=...) please use labels(on='cells') instead") - if inputobj is None: #################### - return - ######################################## + if "cell" in on or "face" in on: + cells = True - if isinstance(inputobj, vedo.BaseActor): - inputobj = inputobj.points() # numpy + if isinstance(content, str): + if content in ("cellid", "cellsid"): + cells = True + content = "id" - ###### - if isinstance(inputobj, vtk.vtkActor): - pd = inputobj.GetMapper().GetInput() - self.DeepCopy(pd) - pr = vtk.vtkProperty() - pr.DeepCopy(inputobj.GetProperty()) - self.actor.SetProperty(pr) - self.property = pr - self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) + if cells: + elems = self.cell_centers() + norms = self.normals(cells=True, recompute=False) + ns = np.sqrt(self.ncells) + else: + elems = self.points() + norms = self.normals(cells=False, recompute=False) + ns = np.sqrt(self.npoints) - elif isinstance(inputobj, vtk.vtkPolyData): - self.DeepCopy(inputobj) - if self.GetNumberOfCells() == 0: - carr = vtk.vtkCellArray() - for i in range(self.GetNumberOfPoints()): - carr.InsertNextCell(1) - carr.InsertCellPoint(i) - self.SetVerts(carr) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - - elif utils.is_sequence(inputobj): # passing point coords - pd = utils.buildPolyData(utils.make3d(inputobj)) - if utils.is_sequence(c) and len(c) == len(inputobj): - cols = vtk.vtkUnsignedCharArray() - cols.SetNumberOfComponents(4) - cols.SetName("PointsRGBA") - for i in range(len(inputobj)): - r, g, b = c[i] - cols.InsertNextTuple4(r, g, b, 255) - pd.GetPointData().SetScalars(cols) - else: - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - self.DeepCopy(pd) - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") + hasnorms = False + if len(norms) > 0: + hasnorms = True - elif isinstance(inputobj, str): - verts = vedo.file_io.load(inputobj) - self.filename = inputobj - self.DeepCopy(verts) + if scale is None: + if not ns: + ns = 100 + scale = self.diagonal_size() / ns / 10 - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - else: - # try to extract the points from a generic VTK input data object - try: - vvpts = inputobj.GetPoints() - self.SetPoints(vvpts) - for i in range(inputobj.GetPointData().GetNumberOfArrays()): - arr = inputobj.GetPointData().GetArray(i) - self.GetPointData().AddArray(arr) + arr = None + mode = 0 + if content is None: + mode = 0 + if cells: + if self.GetCellData().GetScalars(): + name = self.GetCellData().GetScalars().GetName() + arr = self.celldata[name] + else: + if self.GetPointData().GetScalars(): + name = self.GetPointData().GetScalars().GetName() + arr = self.pointdata[name] + elif isinstance(content, (str, int)): + if content == "id": + mode = 1 + elif cells: + mode = 0 + arr = self.celldata[content] + else: + mode = 0 + arr = self.pointdata[content] + elif utils.is_sequence(content): + mode = 0 + arr = content + # print('WEIRD labels() test', content) + # exit() - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - except: - vedo.logger.error(f"cannot build Points from type {type(inputobj)}") - raise RuntimeError() + if arr is None and mode == 0: + vedo.logger.error("in labels(), array not found for points or cells") + return None - self.property.SetRepresentationToPoints() - self.property.SetPointSize(r) - self.property.LightingOff() + tapp = vtk.vtkAppendPolyData() + ninputs = 0 - self.actor.SetMapper(self.mapper) - self.mapper.SetInputData(self) + for i, e in enumerate(elems): + if i % ratio: + continue - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" - ) + if mode == 1: + txt_lab = str(i) + else: + if precision: + txt_lab = utils.precision(arr[i], precision) + else: + txt_lab = str(arr[i]) + if not txt_lab: + continue - def _repr_html_(self): - """ - HTML representation of the Point cloud object for Jupyter Notebooks. + if font == "VTK": + tx = vtk.vtkVectorText() + tx.SetText(txt_lab) + tx.Update() + tx_poly = tx.GetOutput() + else: + tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) - Returns: - HTML text with the image and some properties. - """ - import io - import base64 - from PIL import Image + if tx_poly.GetNumberOfPoints() == 0: + continue ####################### + ninputs += 1 - library_name = "vedo.pointcloud.Points" - help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html" - - arr = self.thumbnail() - im = Image.fromarray(arr) - buffered = io.BytesIO() - im.save(buffered, format="PNG", quality=100) - encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") - url = "data:image/png;base64," + encoded - image = f"" - - bounds = "
".join( - [ - utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) - for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) - ] - ) - average_size = "{size:.3f}".format(size=self.average_size()) - - help_text = "" - if self.name: - help_text += f" {self.name}:   " - help_text += '' + library_name + "" - if self.filename: - dots = "" - if len(self.filename) > 30: - dots = "..." - help_text += f"
({dots}{self.filename[-30:]})" - - pdata = "" - if self.GetPointData().GetScalars(): - if self.GetPointData().GetScalars().GetName(): - name = self.GetPointData().GetScalars().GetName() - pdata = " point data array " + name + "" - - cdata = "" - if self.GetCellData().GetScalars(): - if self.GetCellData().GetScalars().GetName(): - name = self.GetCellData().GetScalars().GetName() - cdata = " cell data array " + name + "" - - allt = [ - "", - "", - "", - "
", - image, - "
", - help_text, - "", - "", - "", - "", - "", - pdata, - cdata, - "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " - + utils.precision(self.center_of_mass(), 3) - + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", - "
", - ] - return "\n".join(allt) - - - ################################################################################## - def __add__(self, meshs): - if isinstance(meshs, list): - alist = [self] - for l in meshs: - if isinstance(l, vedo.Assembly): - alist += l.unpack() - else: - alist += l - return vedo.assembly.Assembly(alist) - - if isinstance(meshs, vedo.Assembly): - return meshs + self # use Assembly.__add__ + T = vtk.vtkTransform() + T.PostMultiply() + if italic: + T.Concatenate([1,0.2,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1]) + if hasnorms: + ni = norms[i] + if cells: # center-justify + bb = tx_poly.GetBounds() + dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 + T.Translate(-dx, -dy, 0) + if xrot: + T.RotateX(xrot) + if yrot: + T.RotateY(yrot) + if zrot: + T.RotateZ(zrot) + crossvec = np.cross([0, 0, 1], ni) + angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 + T.RotateWXYZ(angle, crossvec) + if cells: # small offset along normal only for cells + T.Translate(ni * scale / 2) + else: + if xrot: + T.RotateX(xrot) + if yrot: + T.RotateY(yrot) + if zrot: + T.RotateZ(zrot) + T.Scale(scale, scale, scale) + T.Translate(e) + tf = vtk.vtkTransformPolyDataFilter() + tf.SetInputData(tx_poly) + tf.SetTransform(T) + tf.Update() + tapp.AddInputData(tf.GetOutput()) - return vedo.assembly.Assembly([self, meshs]) + if ninputs: + tapp.Update() + lpoly = tapp.GetOutput() + else: # return an empty obj + lpoly = vtk.vtkPolyData() + ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) + ids.property.LightingOff() + ids.actor.PickableOff() + ids.actor.SetUseBounds(False) + return ids - def polydata(self, **kwargs): - """Obsolete. - You can remove it anywhere from your code. + def labels2d( + self, + content="id", + on="points", + scale=1.0, + precision=4, + font="Calco", + justify="bottom-left", + angle=0.0, + frame=False, + c="black", + bc=None, + alpha=1.0, + ): """ - print("WARNING: call to .polydata() is obsolete, you can remove it from your code.") - return self + Generate value or ID bi-dimensional labels for mesh cells or points. - def clone(self, deep=True): - """ - Clone a `PointCloud` or `Mesh` object to make an exact copy of it. + See also: `labels()`, `flagpole()`, `caption()` and `legend()`. Arguments: - deep : (bool) - if False only build a shallow copy of the object (faster copy). - - Examples: - - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) + content : (str) + either 'id', 'cellid', or array name + on : (str) + generate labels for "cells" instead of "points" (the default) + scale : (float) + size scaling of labels + precision : (int) + precision of numeric labels + angle : (float) + local rotation angle of label in degrees + frame : (bool) + draw a frame around the label + bc : (str) + background color of the label - ![](https://vedo.embl.es/images/basic/mirror.png) + ```python + from vedo import Sphere, show + sph = Sphere(quads=True, res=4).compute_normals().wireframe() + sph.celldata["zvals"] = sph.cell_centers()[:,2] + l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') + show(sph, l2d, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/labels2d.png) """ - poly_copy = vtk.vtkPolyData() - if deep: - poly_copy.DeepCopy(self) - else: - poly_copy.ShallowCopy(self) - - if isinstance(self, vedo.Mesh): - cloned = vedo.Mesh(poly_copy) - else: - cloned = Points(poly_copy) + cells = False + if isinstance(content, str): + if content in ("cellid", "cellsid"): + cells = True + content = "id" - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - cloned.actor.SetProperty(pr) - cloned.property = pr + if "cell" in on: + cells = True + elif "point" in on: + cells = False - if self.actor.GetBackfaceProperty(): - bfpr = vtk.vtkProperty() - bfpr.DeepCopy(self.actor.GetBackfaceProperty()) - cloned.actor.SetBackfaceProperty(bfpr) + if cells: + if content != "id" and content not in self.celldata.keys(): + vedo.logger.error(f"In labels2d: cell array {content} does not exist.") + return None + cellcloud = Points(self.cell_centers()) + arr = self.GetCellData().GetScalars() + poly = cellcloud + poly.GetPointData().SetScalars(arr) + else: + poly = self + if content != "id" and content not in self.pointdata.keys(): + vedo.logger.error(f"In labels2d: point array {content} does not exist.") + return None + self.pointdata.select(content) - cloned.transform = self.transform + mp = vtk.vtkLabeledDataMapper() - mp = cloned.mapper - sm = self.mapper - mp.SetScalarVisibility(sm.GetScalarVisibility()) - mp.SetScalarRange(sm.GetScalarRange()) - mp.SetColorMode(sm.GetColorMode()) - lsr = sm.GetUseLookupTableScalarRange() - mp.SetUseLookupTableScalarRange(lsr) - mp.SetScalarMode(sm.GetScalarMode()) - lut = sm.GetLookupTable() - if lut: - mp.SetLookupTable(lut) + if content == "id": + mp.SetLabelModeToLabelIds() + else: + mp.SetLabelModeToLabelScalars() + if precision is not None: + mp.SetLabelFormat(f"%-#.{precision}g") - if self.actor.GetTexture(): - cloned.texture(self.actor.GetTexture()) + pr = mp.GetLabelTextProperty() + c = colors.get_color(c) + pr.SetColor(c) + pr.SetOpacity(alpha) + pr.SetFrame(frame) + pr.SetFrameColor(c) + pr.SetItalic(False) + pr.BoldOff() + pr.ShadowOff() + pr.UseTightBoundingBoxOn() + pr.SetOrientation(angle) + pr.SetFontFamily(vtk.VTK_FONT_FILE) + fl = utils.get_font_path(font) + pr.SetFontFile(fl) + pr.SetFontSize(int(20 * scale)) - cloned.actor.SetPickable(self.actor.GetPickable()) + if "cent" in justify or "mid" in justify: + pr.SetJustificationToCentered() + elif "rig" in justify: + pr.SetJustificationToRight() + elif "left" in justify: + pr.SetJustificationToLeft() + # ------ + if "top" in justify: + pr.SetVerticalJustificationToTop() + else: + pr.SetVerticalJustificationToBottom() - cloned.base = np.array(self.base) - cloned.top = np.array(self.top) - cloned.name = str(self.name) - cloned.filename = str(self.filename) - cloned.info = dict(self.info) + if bc is not None: + bc = colors.get_color(bc) + pr.SetBackgroundColor(bc) + pr.SetBackgroundOpacity(alpha) - # better not to share the same locators with original obj - cloned.point_locator = None - cloned.cell_locator = None - cloned.line_locator = None + mp.SetInputData(poly) + a2d = vtk.vtkActor2D() + a2d.PickableOff() + a2d.SetMapper(mp) + return a2d - cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") - return cloned + def legend(self, txt): + """Book a legend text.""" + self.info["legend"] = txt + return self - def clone2d( + def flagpole( self, - pos=(0, 0), - coordsys=4, - scale=None, + txt=None, + point=None, + offset=None, + s=None, + font="", + rounded=True, c=None, - alpha=None, - ps=2, - lw=1, - sendback=False, - layer=0, + alpha=1.0, + lw=2, + italic=0.0, + padding=0.1, ): """ - Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. - - Arguments: - coordsys : (int) - the coordinate system, options are - - 0 = Displays - - 1 = Normalized Display - - 2 = Viewport (origin is the bottom-left corner of the window) - - 3 = Normalized Viewport - - 4 = View (origin is the center of the window) - - 5 = World (anchor the 2d image to mesh) + Generate a flag pole style element to describe an object. + Returns a `Mesh` object. - ps : (int) - point size in pixel units + Use flagpole.follow_camera() to make it face the camera in the scene. - lw : (int) - line width in pixel units + See also `flagpost()`. - sendback : (bool) - put it behind any other 3D object + Arguments: + txt : (str) + Text to display. The default is the filename or the object name. + point : (list) + position of the flagpole pointer. + offset : (list) + text offset wrt the application point. + s : (float) + size of the flagpole. + font : (str) + font face. Check [available fonts here](https://vedo.embl.es/fonts). + rounded : (bool) + draw a rounded or squared box around the text. + c : (list) + text and box color. + alpha : (float) + opacity of text and box. + lw : (float) + line with of box frame. + italic : (float) + italicness of text. Examples: - - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) + - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) - ![](https://vedo.embl.es/images/other/clone2d.png) + ![](https://vedo.embl.es/images/pyplot/intersect2d.png) + + - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) + - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ - if scale is None: - msiz = self.diagonal_size() - if vedo.plotter_instance and vedo.plotter_instance.window: - sz = vedo.plotter_instance.window.GetSize() - dsiz = utils.mag(sz) - scale = dsiz / msiz / 10 + acts = [] + + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name else: - scale = 350 / msiz + return None + + x0, x1, y0, y1, z0, z1 = self.bounds() + d = self.diagonal_size() + if point is None: + if d: + point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) + else: # it's a Point + point = self.transform.position + + pt = utils.make3d(point) + + if offset is None: + offset = [(x1 - x0) / 2, (y1 - y0) / 6, 0] + offset = utils.make3d(offset) + + if s is None: + s = d / 20 - cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale) + sph = None + if d and (z1 - z0) / d > 0.1: + sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) - mapper3d = self.mapper - cm = mapper3d.GetColorMode() - lut = mapper3d.GetLookupTable() - sv = mapper3d.GetScalarVisibility() - use_lut = mapper3d.GetUseLookupTableScalarRange() - vrange = mapper3d.GetScalarRange() - sm = mapper3d.GetScalarMode() + if c is None: + c = np.array(self.color()) / 1.4 - mapper2d = vtk.vtkPolyDataMapper2D() - mapper2d.ShallowCopy(mapper3d) - mapper2d.SetInputData(poly) - mapper2d.SetColorMode(cm) - mapper2d.SetLookupTable(lut) - mapper2d.SetScalarVisibility(sv) - mapper2d.SetUseLookupTableScalarRange(use_lut) - mapper2d.SetScalarRange(vrange) - mapper2d.SetScalarMode(sm) + lb = vedo.shapes.Text3D( + txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center-left" + ) + acts.append(lb) - act2d = vtk.vtkActor2D() - act2d.SetMapper(mapper2d) - act2d.SetLayerNumber(layer) - csys = act2d.GetPositionCoordinate() - csys.SetCoordinateSystem(coordsys) - act2d.SetPosition(pos) - if c is not None: - c = colors.get_color(c) - act2d.GetProperty().SetColor(c) - mapper2d.SetScalarVisibility(False) - else: - act2d.GetProperty().SetColor(cmsh.color()) - if alpha is not None: - act2d.GetProperty().SetOpacity(alpha) + if d and not sph: + sph = vedo.shapes.Circle(pt, r=s / 3, res=15) + acts.append(sph) + + x0, x1, y0, y1, z0, z1 = lb.GetBounds() + if rounded: + box = vedo.shapes.KSpline( + [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0)], closed=True + ) else: - act2d.GetProperty().SetOpacity(cmsh.alpha()) - act2d.GetProperty().SetPointSize(ps) - act2d.GetProperty().SetLineWidth(lw) - act2d.GetProperty().SetDisplayLocationToForeground() - if sendback: - act2d.GetProperty().SetDisplayLocationToBackground() + box = vedo.shapes.Line( + [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z0)] + ) - # print(csys.GetCoordinateSystemAsString()) - # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) - return act2d + cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] - def delete_cells_by_point_index(self, indices): - """ - Delete a list of vertices identified by any of their vertex index. + # box.SetOrigin(cnt) + box.scale([1 + padding, 1 + 2 * padding, 1]) + acts.append(box) - See also `delete_cells()`. + # pts = box.points() + # bfaces = [] + # for i, pt in enumerate(pts): + # if i: + # face = [i-1, i, 0] + # bfaces.append(face) + # bpts = [cnt] + pts.tolist() + # box2 = vedo.Mesh([bpts, bfaces]).z(-cnt[0]/10)#.c('w').alpha(0.1) + # #should be made assembly otherwise later merge() nullifies it + # box2.SetOrigin(cnt) + # acts.append(box2) - Examples: - - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) + x0, x1, y0, y1, z0, z1 = box.bounds() + if x0 < pt[0] < x1: + c0 = box.closest_point(pt) + c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] + elif (pt[0] - x0) < (x1 - pt[0]): + c0 = [x0, (y0 + y1) / 2, pt[2]] + c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] + else: + c0 = [x1, (y0 + y1) / 2, pt[2]] + c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] - ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) - """ - cell_ids = vtk.vtkIdList() - self.BuildLinks() - n = 0 - for i in np.unique(indices): - self.GetPointCells(i, cell_ids) - for j in range(cell_ids.GetNumberOfIds()): - self.DeleteCell(cell_ids.GetId(j)) # flag cell - n += 1 + con = vedo.shapes.Line([c0, c1, pt]) + acts.append(con) - self.RemoveDeletedCells() - self.mapper.Modified() - self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) - return self + macts = vedo.merge(acts).c(c).alpha(alpha) + # macts.SetOrigin(pt) + macts.bc("tomato").pickable(False) + macts.property.LightingOff() + macts.property.SetLineWidth(lw) + macts.actor.UseBoundsOff() + macts.name = "FlagPole" + return macts - def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): + def flagpost( + self, + txt=None, + point=None, + offset=None, + s=1.0, + c="k9", + bc="k1", + alpha=1, + lw=0, + font="Calco", + justify="center-left", + vspacing=1.0, + ): """ - Generate point normals using PCA (principal component analysis). - Basically this estimates a local tangent plane around each sample point p - by considering a small neighborhood of points around p, and fitting a plane - to the neighborhood (via PCA). + Generate a flag post style element to describe an object. Arguments: - n : (int) - neighborhood size to calculate the normal - orientation_point : (list) - adjust the +/- sign of the normals so that - the normals all point towards a specified point. If None, perform a traversal - of the point cloud and flip neighboring normals so that they are mutually consistent. - invert : (bool) - flip all normals - """ - poly = self - pcan = vtk.vtkPCANormalEstimation() - pcan.SetInputData(poly) - pcan.SetSampleSize(n) - - if orientation_point is not None: - pcan.SetNormalOrientationToPoint() - pcan.SetOrientationPoint(orientation_point) - else: - pcan.SetNormalOrientationToGraphTraversal() - - if invert: - pcan.FlipNormalsOn() - pcan.Update() + txt : (str) + Text to display. The default is the filename or the object name. + point : (list) + position of the flag anchor point. The default is None. + offset : (list) + a 3D displacement or offset. The default is None. + s : (float) + size of the text to be shown + c : (list) + color of text and line + bc : (list) + color of the flag background + alpha : (float) + opacity of text and box. + lw : (int) + line with of box frame. The default is 0. + font : (str) + font name. Use a monospace font for better rendering. The default is "Calco". + Type `vedo -r fonts` for a font demo. + Check [available fonts here](https://vedo.embl.es/fonts). + justify : (str) + internal text justification. The default is "center-left". + vspacing : (float) + vertical spacing between lines. - varr = pcan.GetOutput().GetPointData().GetNormals() - varr.SetName("Normals") - self.GetPointData().SetNormals(varr) - self.GetPointData().Modified() - return self + Examples: + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) - def compute_acoplanarity(self, n=25, radius=None, on="points"): + ![](https://vedo.embl.es/images/other/flag_labels2.png) """ - Compute acoplanarity which is a measure of how much a local region of the mesh - differs from a plane. - The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. - Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. - If a radius value is given and not enough points fall inside it, then a -1 is stored. + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name + else: + return None - Example: - ```python - from vedo import * - msh = ParametricShape('RandomHills') - msh.compute_acoplanarity(radius=0.1, on='cells') - msh.cmap("coolwarm", on='cells').add_scalarbar() - msh.show(axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) - """ - acoplanarities = [] - if "point" in on: - pts = self.points() - elif "cell" in on: - pts = self.cell_centers() - else: - raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") + x0, x1, y0, y1, z0, z1 = self.bounds() + d = self.diagonal_size() + if point is None: + if d: + point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) + else: # it's a Point + point = self.transform.position - for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): - if n: - data = self.closest_point(p, n=n) - npts = n - elif radius: - data = self.closest_point(p, radius=radius) - npts = len(data) + point = utils.make3d(point) - try: - center = data.mean(axis=0) - res = np.linalg.svd(data - center) - acoplanarities.append(res[1][2] / npts) - except: - acoplanarities.append(-1.0) + if offset is None: + offset = [0, 0, (z1 - z0) / 2] + offset = utils.make3d(offset) - if "point" in on: - self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) - else: - self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) - return self + fpost = vedo.addons.Flagpost( + txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing + ) + self._caption = fpost + return fpost - def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): + def caption( + self, + txt=None, + point=None, + size=(0.30, 0.15), + padding=5, + font="Calco", + justify="center-right", + vspacing=1.0, + c=None, + alpha=1.0, + lw=1, + ontop=True, + ): """ - Computes the distance from one point cloud or mesh to another point cloud or mesh. - This new `pointdata` array is saved with default name "Distance". + Add a 2D caption to an object which follows the camera movements. + Latex is not supported. Returns the same input object for concatenation. - Keywords `signed` and `invert` are used to compute signed distance, - but the mesh in that case must have polygonal faces (not a simple point cloud), - and normals must also be computed. + See also `flagpole()`, `flagpost()`, `labels()` and `legend()` + with similar functionality. + + Arguments: + txt : (str) + text to be rendered. The default is the file name. + point : (list) + anchoring point. The default is None. + size : (list) + (width, height) of the caption box. The default is (0.30, 0.15). + padding : (float) + padding space of the caption box in pixels. The default is 5. + font : (str) + font name. Use a monospace font for better rendering. The default is "VictorMono". + Type `vedo -r fonts` for a font demo. + Check [available fonts here](https://vedo.embl.es/fonts). + justify : (str) + internal text justification. The default is "center-right". + vspacing : (float) + vertical spacing between lines. The default is 1. + c : (str) + text and box color. The default is 'lb'. + alpha : (float) + text and box transparency. The default is 1. + lw : (int) + line width in pixels. The default is 1. + ontop : (bool) + keep the 2d caption always on top. The default is True. Examples: - - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) + - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) - ![](https://vedo.embl.es/images/basic/distance2mesh.png) + ![](https://vedo.embl.es/images/pyplot/caption.png) + + - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ - if pcloud.GetNumberOfPolys(): + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name - poly1 = self - poly2 = pcloud - df = vtk.vtkDistancePolyDataFilter() - df.ComputeSecondDistanceOff() - df.SetInputData(0, poly1) - df.SetInputData(1, poly2) - df.SetSignedDistance(signed) - df.SetNegateDistance(invert) - df.Update() - scals = df.GetOutput().GetPointData().GetScalars() - dists = utils.vtk2numpy(scals) + if not txt: # disable it + self._caption = None + return self - else: # has no polygons and vtkDistancePolyDataFilter wants them (dont know why) + for r in vedo.shapes._reps: + txt = txt.replace(r[0], r[1]) - if signed: - vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") + if c is None: + c = np.array(self.property.GetColor()) / 2 + else: + c = colors.get_color(c) - if not pcloud.point_locator: - pcloud.point_locator = vtk.vtkPointLocator() - pcloud.point_locator.SetDataSet(pcloud) - pcloud.point_locator.BuildLocator() + if point is None: + x0, x1, y0, y1, _, z1 = self.GetBounds() + pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] + point = self.closest_point(pt) - ids = [] - ps1 = self.points() - ps2 = pcloud.points() - for p in ps1: - pid = pcloud.point_locator.FindClosestPoint(p) - ids.append(pid) + capt = vtk.vtkCaptionActor2D() + capt.SetAttachmentPoint(point) + capt.SetBorder(True) + capt.SetLeader(True) + sph = vtk.vtkSphereSource() + sph.Update() + capt.SetLeaderGlyphData(sph.GetOutput()) + capt.SetMaximumLeaderGlyphSize(5) + capt.SetPadding(int(padding)) + capt.SetCaption(txt) + capt.SetWidth(size[0]) + capt.SetHeight(size[1]) + capt.SetThreeDimensionalLeader(not ontop) - deltas = ps2[ids] - ps1 - dists = np.linalg.norm(deltas, axis=1).astype(np.float32) - scals = utils.numpy2vtk(dists) + pra = capt.GetProperty() + pra.SetColor(c) + pra.SetOpacity(alpha) + pra.SetLineWidth(lw) - scals.SetName(name) - self.GetPointData().AddArray(scals) - self.GetPointData().SetActiveScalars(scals.GetName()) - rng = scals.GetRange() - self.mapper.SetScalarRange(rng[0], rng[1]) - self.mapper.ScalarVisibilityOn() + pr = capt.GetCaptionTextProperty() + pr.SetFontFamily(vtk.VTK_FONT_FILE) + fl = utils.get_font_path(font) + pr.SetFontFile(fl) + pr.ShadowOff() + pr.BoldOff() + pr.FrameOff() + pr.SetColor(c) + pr.SetOpacity(alpha) + pr.SetJustificationToLeft() + if "top" in justify: + pr.SetVerticalJustificationToTop() + if "bottom" in justify: + pr.SetVerticalJustificationToBottom() + if "cent" in justify: + pr.SetVerticalJustificationToCentered() + pr.SetJustificationToCentered() + if "left" in justify: + pr.SetJustificationToLeft() + if "right" in justify: + pr.SetJustificationToRight() + pr.SetLineSpacing(vspacing) + self._caption = capt + return self - self.pipeline = utils.OperationNode( - "distance_to", - parents=[self, pcloud], - shape="cylinder", - comment=f"#pts {self.GetNumberOfPoints()}", - ) - return dists - def clean(self): - """ - Clean pointcloud or mesh by removing coincident points. - """ - cpd = vtk.vtkCleanPolyData() - cpd.PointMergingOn() - cpd.ConvertLinesToPointsOn() - cpd.ConvertPolysToLinesOn() - cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self) - cpd.Update() - self.DeepCopy(cpd.GetOutput()) - self.pipeline = utils.OperationNode( - "clean", parents=[self], - comment=f"#pts {self.GetNumberOfPoints()}" - ) - return self - def subsample(self, fraction, absolute=False): +################################################### +class Points(PointsVisual, BaseActor, vtk.vtkPolyData): + """>Work with point clouds.""" + + def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): """ - Subsample a point cloud by requiring that the points - or vertices are far apart at least by the specified fraction of the object size. - If a Mesh is passed the polygonal faces are not removed - but holes can appear as vertices are removed. + Build an object made of only vertex points for a list of 2D/3D points. + Both shapes (N, 3) or (3, N) are accepted as input, if N>3. + For very large point clouds a list of colors and alpha can be assigned to each + point in the form c=[(R,G,B,A), ... ] where 0<=R<256, ... 0<=A<256. - Examples: - - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) + Arguments: + inputobj : (list, tuple) + r : (int) + Point radius in units of pixels. + c : (str, list) + Color name or rgb tuple. + alpha : (float) + Transparency in range [0,1]. - ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) + Example: + ```python + from vedo import * - - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) + def fibonacci_sphere(n): + s = np.linspace(0, n, num=n, endpoint=False) + theta = s * 2.399963229728653 + y = 1 - s * (2/(n-1)) + r = np.sqrt(1 - y * y) + x = np.cos(theta) * r + z = np.sin(theta) * r + return [x,y,z] - ![](https://vedo.embl.es/images/advanced/recosurface.png) + Points(fibonacci_sphere(1000)).show(axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/fibonacci.png) """ - if not absolute: - if fraction > 1: - vedo.logger.warning( - f"subsample(fraction=...), fraction must be < 1, but is {fraction}" - ) - if fraction <= 0: - return self - - cpd = vtk.vtkCleanPolyData() - cpd.PointMergingOn() - cpd.ConvertLinesToPointsOn() - cpd.ConvertPolysToLinesOn() - cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self) - if absolute: - cpd.SetTolerance(fraction / self.diagonal_size()) - # cpd.SetToleranceIsAbsolute(absolute) - else: - cpd.SetTolerance(fraction) - cpd.Update() + # super().__init__() ## super is not working here + vtk.vtkPolyData.__init__(self) + BaseActor.__init__(self) + PointsVisual.__init__(self) - ps = 2 - if self.property.GetRepresentation() == 0: - ps = self.property.GetPointSize() + self.transform = LinearTransform() + self.actor.data = self + # self.name = "Points" # better not to give it a name here - self.DeepCopy(cpd.GetOutput()) - self.ps(ps) + if inputobj is None: #################### + return + ######################################## - self.pipeline = utils.OperationNode( - "subsample", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" - ) - return self + if isinstance(inputobj, vedo.BaseActor): + inputobj = inputobj.points() # numpy - def threshold(self, scalars, above=None, below=None, on="points"): - """ - Extracts cells where scalar value satisfies threshold criterion. + ###### + if isinstance(inputobj, vtk.vtkActor): + pd = inputobj.GetMapper().GetInput() + self.DeepCopy(pd) + pr = vtk.vtkProperty() + pr.DeepCopy(inputobj.GetProperty()) + self.actor.SetProperty(pr) + self.property = pr + self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) - Arguments: - scalars : (str) - name of the scalars array. - above : (float) - minimum value of the scalar - below : (float) - maximum value of the scalar - on : (str) - if 'cells' assume array of scalars refers to cell data. + elif isinstance(inputobj, vtk.vtkPolyData): + self.DeepCopy(inputobj) + if self.GetNumberOfCells() == 0: + carr = vtk.vtkCellArray() + for i in range(self.GetNumberOfPoints()): + carr.InsertNextCell(1) + carr.InsertCellPoint(i) + self.SetVerts(carr) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + + elif utils.is_sequence(inputobj): # passing point coords + pd = utils.buildPolyData(utils.make3d(inputobj)) + if utils.is_sequence(c) and len(c) == len(inputobj): + cols = vtk.vtkUnsignedCharArray() + cols.SetNumberOfComponents(4) + cols.SetName("PointsRGBA") + for i in range(len(inputobj)): + r, g, b = c[i] + cols.InsertNextTuple4(r, g, b, 255) + pd.GetPointData().SetScalars(cols) + else: + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + self.DeepCopy(pd) + self.pipeline = utils.OperationNode( + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") - Examples: - - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) - """ - thres = vtk.vtkThreshold() - thres.SetInputData(self) + elif isinstance(inputobj, str): + verts = vedo.file_io.load(inputobj) + self.filename = inputobj + self.DeepCopy(verts) - if on.startswith("c"): - asso = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) else: - asso = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS + # try to extract the points from a generic VTK input data object + try: + vvpts = inputobj.GetPoints() + self.SetPoints(vvpts) + for i in range(inputobj.GetPointData().GetNumberOfArrays()): + arr = inputobj.GetPointData().GetArray(i) + self.GetPointData().AddArray(arr) - thres.SetInputArrayToProcess(0, 0, 0, asso, scalars) + c = colors.get_color(c) + self.property.SetColor(c) + self.property.SetOpacity(alpha) + except: + vedo.logger.error(f"cannot build Points from type {type(inputobj)}") + raise RuntimeError() - if above is None and below is not None: - try: # vtk 9.2 - thres.ThresholdByLower(below) - except AttributeError: # vtk 9.3 - thres.SetUpperThreshold(below) + self.property.SetRepresentationToPoints() + self.property.SetPointSize(r) + self.property.LightingOff() - elif below is None and above is not None: - try: - thres.ThresholdByUpper(above) - except AttributeError: - thres.SetLowerThreshold(above) - else: - try: - thres.ThresholdBetween(above, below) - except AttributeError: - thres.SetUpperThreshold(below) - thres.SetLowerThreshold(above) + self.actor.SetMapper(self.mapper) + self.mapper.SetInputData(self) - thres.Update() + self.pipeline = utils.OperationNode( + self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" + ) - gf = vtk.vtkGeometryFilter() - gf.SetInputData(thres.GetOutput()) - gf.Update() - self.DeepCopy(gf.GetOutput()) - self.pipeline = utils.OperationNode("threshold", parents=[self]) - return self - def quantize(self, value): - """ - The user should input a value and all {x,y,z} coordinates - will be quantized to that absolute grain size. + def _repr_html_(self): """ - qp = vtk.vtkQuantizePolyDataPoints() - qp.SetInputData(self) - qp.SetQFactor(value) - qp.Update() - self.DeepCopy(qp.GetOutput()) - self.flat() - self.pipeline = utils.OperationNode("quantize", parents=[self]) - return self + HTML representation of the Point cloud object for Jupyter Notebooks. - def average_size(self): - """ - Calculate the average size of a mesh. - This is the mean of the vertex distances from the center of mass. + Returns: + HTML text with the image and some properties. """ - coords = self.points() - cm = np.mean(coords, axis=0) - if coords.shape[0] == 0: - return 0.0 - cc = coords - cm - return np.mean(np.linalg.norm(cc, axis=1)) - - def center_of_mass(self): - """Get the center of mass of mesh.""" - cmf = vtk.vtkCenterOfMass() - cmf.SetInputData(self) - cmf.Update() - c = cmf.GetCenter() - return np.array(c) + import io + import base64 + from PIL import Image - def normal_at(self, i): - """Return the normal vector at vertex point `i`.""" - normals = self.GetPointData().GetNormals() - return np.array(normals.GetTuple(i)) + library_name = "vedo.pointcloud.Points" + help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html" - def normals(self, cells=False, recompute=True): - """Retrieve vertex normals as a numpy array. + arr = self.thumbnail() + im = Image.fromarray(arr) + buffered = io.BytesIO() + im.save(buffered, format="PNG", quality=100) + encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") + url = "data:image/png;base64," + encoded + image = f"" - Arguments: - cells : (bool) - if `True` return cell normals. + bounds = "
".join( + [ + utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) + for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) + ] + ) + average_size = "{size:.3f}".format(size=self.average_size()) - recompute : (bool) - if `True` normals are recalculated if not already present. - Note that this might modify the number of mesh points. - """ - if cells: - vtknormals = self.GetCellData().GetNormals() - else: - vtknormals = self.GetPointData().GetNormals() - if not vtknormals and recompute: - try: - self.compute_normals(cells=cells) - if cells: - vtknormals = self.GetCellData().GetNormals() - else: - vtknormals = self.GetPointData().GetNormals() - except AttributeError: - # can be that 'Points' object has no attribute 'compute_normals' - pass + help_text = "" + if self.name: + help_text += f" {self.name}:   " + help_text += '' + library_name + "" + if self.filename: + dots = "" + if len(self.filename) > 30: + dots = "..." + help_text += f"
({dots}{self.filename[-30:]})" - if not vtknormals: - return np.array([]) - return utils.vtk2numpy(vtknormals) + pdata = "" + if self.GetPointData().GetScalars(): + if self.GetPointData().GetScalars().GetName(): + name = self.GetPointData().GetScalars().GetName() + pdata = " point data array " + name + "" - def labels( - self, - content=None, - on="points", - scale=None, - xrot=0.0, - yrot=0.0, - zrot=0.0, - ratio=1, - precision=None, - italic=False, - font="", - justify="bottom-left", - c="black", - alpha=1.0, - cells=None, - ): - """ - Generate value or ID labels for mesh cells or points. - For large nr. of labels use `font="VTK"` which is much faster. + cdata = "" + if self.GetCellData().GetScalars(): + if self.GetCellData().GetScalars().GetName(): + name = self.GetCellData().GetScalars().GetName() + cdata = " cell data array " + name + "" - See also: - `labels2d()`, `flagpole()`, `caption()` and `legend()`. + allt = [ + "", + "", + "", + "
", + image, + "
", + help_text, + "", + "", + "", + "", + "", + pdata, + cdata, + "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + + utils.precision(self.center_of_mass(), 3) + + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", + "
", + ] + return "\n".join(allt) - Arguments: - content : (list,int,str) - either 'id', 'cellid', array name or array number. - A array can also be passed (must match the nr. of points or cells). - on : (str) - generate labels for "cells" instead of "points" - scale : (float) - absolute size of labels, if left as None it is automatic - zrot : (float) - local rotation angle of label in degrees - ratio : (int) - skipping ratio, to reduce nr of labels for large meshes - precision : (int) - numeric precision of labels - ```python - from vedo import * - s = Sphere(res=10).linewidth(1).c("orange").compute_normals() - point_ids = s.labels('id', on="points").c('green') - cell_ids = s.labels('id', on="cells" ).c('black') - show(s, point_ids, cell_ids) - ``` - ![](https://vedo.embl.es/images/feats/labels.png) + ################################################################################## + def __add__(self, meshs): + if isinstance(meshs, list): + alist = [self] + for l in meshs: + if isinstance(l, vedo.Assembly): + alist += l.unpack() + else: + alist += l + return vedo.assembly.Assembly(alist) - Examples: - - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) + if isinstance(meshs, vedo.Assembly): + return meshs + self # use Assembly.__add__ - ![](https://vedo.embl.es/images/basic/boundaries.png) - """ - if cells is not None: # deprecation message - vedo.logger.warning("In labels(cells=...) please use labels(on='cells') instead") + return vedo.assembly.Assembly([self, meshs]) - if "cell" in on or "face" in on: - cells = True - if isinstance(content, str): - if content in ("cellid", "cellsid"): - cells = True - content = "id" + def polydata(self, **kwargs): + """Obsolete. + You can remove it anywhere from your code. + """ + print("WARNING: call to .polydata() is obsolete, you can remove it from your code.") + return self - if cells: - elems = self.cell_centers() - norms = self.normals(cells=True, recompute=False) - ns = np.sqrt(self.ncells) - else: - elems = self.points() - norms = self.normals(cells=False, recompute=False) - ns = np.sqrt(self.npoints) + def clone(self, deep=True): + """ + Clone a `PointCloud` or `Mesh` object to make an exact copy of it. - hasnorms = False - if len(norms) > 0: - hasnorms = True + Arguments: + deep : (bool) + if False only build a shallow copy of the object (faster copy). - if scale is None: - if not ns: - ns = 100 - scale = self.diagonal_size() / ns / 10 + Examples: + - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) - arr = None - mode = 0 - if content is None: - mode = 0 - if cells: - if self.GetCellData().GetScalars(): - name = self.GetCellData().GetScalars().GetName() - arr = self.celldata[name] - else: - if self.GetPointData().GetScalars(): - name = self.GetPointData().GetScalars().GetName() - arr = self.pointdata[name] - elif isinstance(content, (str, int)): - if content == "id": - mode = 1 - elif cells: - mode = 0 - arr = self.celldata[content] - else: - mode = 0 - arr = self.pointdata[content] - elif utils.is_sequence(content): - mode = 0 - arr = content - # print('WEIRD labels() test', content) - # exit() + ![](https://vedo.embl.es/images/basic/mirror.png) + """ + poly_copy = vtk.vtkPolyData() + if deep: + poly_copy.DeepCopy(self) + else: + poly_copy.ShallowCopy(self) - if arr is None and mode == 0: - vedo.logger.error("in labels(), array not found for points or cells") - return None + if isinstance(self, vedo.Mesh): + cloned = vedo.Mesh(poly_copy) + else: + cloned = Points(poly_copy) - tapp = vtk.vtkAppendPolyData() - ninputs = 0 + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + cloned.actor.SetProperty(pr) + cloned.property = pr - for i, e in enumerate(elems): - if i % ratio: - continue + if self.actor.GetBackfaceProperty(): + bfpr = vtk.vtkProperty() + bfpr.DeepCopy(self.actor.GetBackfaceProperty()) + cloned.actor.SetBackfaceProperty(bfpr) - if mode == 1: - txt_lab = str(i) - else: - if precision: - txt_lab = utils.precision(arr[i], precision) - else: - txt_lab = str(arr[i]) + cloned.transform = self.transform - if not txt_lab: - continue + mp = cloned.mapper + sm = self.mapper + mp.SetScalarVisibility(sm.GetScalarVisibility()) + mp.SetScalarRange(sm.GetScalarRange()) + mp.SetColorMode(sm.GetColorMode()) + lsr = sm.GetUseLookupTableScalarRange() + mp.SetUseLookupTableScalarRange(lsr) + mp.SetScalarMode(sm.GetScalarMode()) + lut = sm.GetLookupTable() + if lut: + mp.SetLookupTable(lut) - if font == "VTK": - tx = vtk.vtkVectorText() - tx.SetText(txt_lab) - tx.Update() - tx_poly = tx.GetOutput() - else: - tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) + if self.actor.GetTexture(): + cloned.texture(self.actor.GetTexture()) - if tx_poly.GetNumberOfPoints() == 0: - continue ####################### - ninputs += 1 + cloned.actor.SetPickable(self.actor.GetPickable()) - T = vtk.vtkTransform() - T.PostMultiply() - if italic: - T.Concatenate([1,0.2,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1]) - if hasnorms: - ni = norms[i] - if cells: # center-justify - bb = tx_poly.GetBounds() - dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 - T.Translate(-dx, -dy, 0) - if xrot: - T.RotateX(xrot) - if yrot: - T.RotateY(yrot) - if zrot: - T.RotateZ(zrot) - crossvec = np.cross([0, 0, 1], ni) - angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 - T.RotateWXYZ(angle, crossvec) - if cells: # small offset along normal only for cells - T.Translate(ni * scale / 2) - else: - if xrot: - T.RotateX(xrot) - if yrot: - T.RotateY(yrot) - if zrot: - T.RotateZ(zrot) - T.Scale(scale, scale, scale) - T.Translate(e) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(tx_poly) - tf.SetTransform(T) - tf.Update() - tapp.AddInputData(tf.GetOutput()) + cloned.base = np.array(self.base) + cloned.top = np.array(self.top) + cloned.name = str(self.name) + cloned.filename = str(self.filename) + cloned.info = dict(self.info) - if ninputs: - tapp.Update() - lpoly = tapp.GetOutput() - else: # return an empty obj - lpoly = vtk.vtkPolyData() + # better not to share the same locators with original obj + cloned.point_locator = None + cloned.cell_locator = None + cloned.line_locator = None - ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) - ids.property.LightingOff() - ids.actor.PickableOff() - ids.actor.SetUseBounds(False) - return ids + cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") + return cloned - def labels2d( + def clone2d( self, - content="id", - on="points", - scale=1.0, - precision=4, - font="Calco", - justify="bottom-left", - angle=0.0, - frame=False, - c="black", - bc=None, - alpha=1.0, + pos=(0, 0), + coordsys=4, + scale=None, + c=None, + alpha=None, + ps=2, + lw=1, + sendback=False, + layer=0, ): """ - Generate value or ID bi-dimensional labels for mesh cells or points. + Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. + + Arguments: + coordsys : (int) + the coordinate system, options are + - 0 = Displays + - 1 = Normalized Display + - 2 = Viewport (origin is the bottom-left corner of the window) + - 3 = Normalized Viewport + - 4 = View (origin is the center of the window) + - 5 = World (anchor the 2d image to mesh) - See also: `labels()`, `flagpole()`, `caption()` and `legend()`. + ps : (int) + point size in pixel units - Arguments: - content : (str) - either 'id', 'cellid', or array name - on : (str) - generate labels for "cells" instead of "points" (the default) - scale : (float) - size scaling of labels - precision : (int) - precision of numeric labels - angle : (float) - local rotation angle of label in degrees - frame : (bool) - draw a frame around the label - bc : (str) - background color of the label + lw : (int) + line width in pixel units - ```python - from vedo import Sphere, show - sph = Sphere(quads=True, res=4).compute_normals().wireframe() - sph.celldata["zvals"] = sph.cell_centers()[:,2] - l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') - show(sph, l2d, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/labels2d.png) - """ - cells = False - if isinstance(content, str): - if content in ("cellid", "cellsid"): - cells = True - content = "id" + sendback : (bool) + put it behind any other 3D object - if "cell" in on: - cells = True - elif "point" in on: - cells = False + Examples: + - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) - if cells: - if content != "id" and content not in self.celldata.keys(): - vedo.logger.error(f"In labels2d: cell array {content} does not exist.") - return None - cellcloud = Points(self.cell_centers()) - arr = self.GetCellData().GetScalars() - poly = cellcloud - poly.GetPointData().SetScalars(arr) - else: - poly = self - if content != "id" and content not in self.pointdata.keys(): - vedo.logger.error(f"In labels2d: point array {content} does not exist.") - return None - self.pointdata.select(content) + ![](https://vedo.embl.es/images/other/clone2d.png) + """ + if scale is None: + msiz = self.diagonal_size() + if vedo.plotter_instance and vedo.plotter_instance.window: + sz = vedo.plotter_instance.window.GetSize() + dsiz = utils.mag(sz) + scale = dsiz / msiz / 10 + else: + scale = 350 / msiz - mp = vtk.vtkLabeledDataMapper() + cmsh = self.clone() + poly = cmsh.pos(0, 0, 0).scale(scale) - if content == "id": - mp.SetLabelModeToLabelIds() - else: - mp.SetLabelModeToLabelScalars() - if precision is not None: - mp.SetLabelFormat(f"%-#.{precision}g") + mapper3d = self.mapper + cm = mapper3d.GetColorMode() + lut = mapper3d.GetLookupTable() + sv = mapper3d.GetScalarVisibility() + use_lut = mapper3d.GetUseLookupTableScalarRange() + vrange = mapper3d.GetScalarRange() + sm = mapper3d.GetScalarMode() - pr = mp.GetLabelTextProperty() - c = colors.get_color(c) - pr.SetColor(c) - pr.SetOpacity(alpha) - pr.SetFrame(frame) - pr.SetFrameColor(c) - pr.SetItalic(False) - pr.BoldOff() - pr.ShadowOff() - pr.UseTightBoundingBoxOn() - pr.SetOrientation(angle) - pr.SetFontFamily(vtk.VTK_FONT_FILE) - fl = utils.get_font_path(font) - pr.SetFontFile(fl) - pr.SetFontSize(int(20 * scale)) + mapper2d = vtk.vtkPolyDataMapper2D() + mapper2d.ShallowCopy(mapper3d) + mapper2d.SetInputData(poly) + mapper2d.SetColorMode(cm) + mapper2d.SetLookupTable(lut) + mapper2d.SetScalarVisibility(sv) + mapper2d.SetUseLookupTableScalarRange(use_lut) + mapper2d.SetScalarRange(vrange) + mapper2d.SetScalarMode(sm) - if "cent" in justify or "mid" in justify: - pr.SetJustificationToCentered() - elif "rig" in justify: - pr.SetJustificationToRight() - elif "left" in justify: - pr.SetJustificationToLeft() - # ------ - if "top" in justify: - pr.SetVerticalJustificationToTop() + act2d = vtk.vtkActor2D() + act2d.SetMapper(mapper2d) + act2d.SetLayerNumber(layer) + csys = act2d.GetPositionCoordinate() + csys.SetCoordinateSystem(coordsys) + act2d.SetPosition(pos) + if c is not None: + c = colors.get_color(c) + act2d.GetProperty().SetColor(c) + mapper2d.SetScalarVisibility(False) else: - pr.SetVerticalJustificationToBottom() + act2d.GetProperty().SetColor(cmsh.color()) + if alpha is not None: + act2d.GetProperty().SetOpacity(alpha) + else: + act2d.GetProperty().SetOpacity(cmsh.alpha()) + act2d.GetProperty().SetPointSize(ps) + act2d.GetProperty().SetLineWidth(lw) + act2d.GetProperty().SetDisplayLocationToForeground() + if sendback: + act2d.GetProperty().SetDisplayLocationToBackground() - if bc is not None: - bc = colors.get_color(bc) - pr.SetBackgroundColor(bc) - pr.SetBackgroundOpacity(alpha) + # print(csys.GetCoordinateSystemAsString()) + # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) + return act2d - mp.SetInputData(poly) - a2d = vtk.vtkActor2D() - a2d.PickableOff() - a2d.SetMapper(mp) - return a2d + def delete_cells_by_point_index(self, indices): + """ + Delete a list of vertices identified by any of their vertex index. - def legend(self, txt): - """Book a legend text.""" - self.info["legend"] = txt - return self + See also `delete_cells()`. - def flagpole( - self, - txt=None, - point=None, - offset=None, - s=None, - font="", - rounded=True, - c=None, - alpha=1.0, - lw=2, - italic=0.0, - padding=0.1, - ): + Examples: + - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) + + ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) """ - Generate a flag pole style element to describe an object. - Returns a `Mesh` object. + cell_ids = vtk.vtkIdList() + self.BuildLinks() + n = 0 + for i in np.unique(indices): + self.GetPointCells(i, cell_ids) + for j in range(cell_ids.GetNumberOfIds()): + self.DeleteCell(cell_ids.GetId(j)) # flag cell + n += 1 - Use flagpole.follow_camera() to make it face the camera in the scene. + self.RemoveDeletedCells() + self.mapper.Modified() + self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) + return self - See also `flagpost()`. + def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): + """ + Generate point normals using PCA (principal component analysis). + Basically this estimates a local tangent plane around each sample point p + by considering a small neighborhood of points around p, and fitting a plane + to the neighborhood (via PCA). Arguments: - txt : (str) - Text to display. The default is the filename or the object name. - point : (list) - position of the flagpole pointer. - offset : (list) - text offset wrt the application point. - s : (float) - size of the flagpole. - font : (str) - font face. Check [available fonts here](https://vedo.embl.es/fonts). - rounded : (bool) - draw a rounded or squared box around the text. - c : (list) - text and box color. - alpha : (float) - opacity of text and box. - lw : (float) - line with of box frame. - italic : (float) - italicness of text. + n : (int) + neighborhood size to calculate the normal + orientation_point : (list) + adjust the +/- sign of the normals so that + the normals all point towards a specified point. If None, perform a traversal + of the point cloud and flip neighboring normals so that they are mutually consistent. + invert : (bool) + flip all normals + """ + poly = self + pcan = vtk.vtkPCANormalEstimation() + pcan.SetInputData(poly) + pcan.SetSampleSize(n) - Examples: - - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) + if orientation_point is not None: + pcan.SetNormalOrientationToPoint() + pcan.SetOrientationPoint(orientation_point) + else: + pcan.SetNormalOrientationToGraphTraversal() - ![](https://vedo.embl.es/images/pyplot/intersect2d.png) + if invert: + pcan.FlipNormalsOn() + pcan.Update() - - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) - - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) + varr = pcan.GetOutput().GetPointData().GetNormals() + varr.SetName("Normals") + self.GetPointData().SetNormals(varr) + self.GetPointData().Modified() + return self + + def compute_acoplanarity(self, n=25, radius=None, on="points"): """ - acts = [] + Compute acoplanarity which is a measure of how much a local region of the mesh + differs from a plane. + The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. + Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. + If a radius value is given and not enough points fall inside it, then a -1 is stored. - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name - else: - return None + Example: + ```python + from vedo import * + msh = ParametricShape('RandomHills') + msh.compute_acoplanarity(radius=0.1, on='cells') + msh.cmap("coolwarm", on='cells').add_scalarbar() + msh.show(axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) + """ + acoplanarities = [] + if "point" in on: + pts = self.points() + elif "cell" in on: + pts = self.cell_centers() + else: + raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") - x0, x1, y0, y1, z0, z1 = self.bounds() - d = self.diagonal_size() - if point is None: - if d: - point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) - else: # it's a Point - point = self.transform.position + for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): + if n: + data = self.closest_point(p, n=n) + npts = n + elif radius: + data = self.closest_point(p, radius=radius) + npts = len(data) - pt = utils.make3d(point) + try: + center = data.mean(axis=0) + res = np.linalg.svd(data - center) + acoplanarities.append(res[1][2] / npts) + except: + acoplanarities.append(-1.0) - if offset is None: - offset = [(x1 - x0) / 2, (y1 - y0) / 6, 0] - offset = utils.make3d(offset) + if "point" in on: + self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) + else: + self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) + return self - if s is None: - s = d / 20 + def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): + """ + Computes the distance from one point cloud or mesh to another point cloud or mesh. + This new `pointdata` array is saved with default name "Distance". - sph = None - if d and (z1 - z0) / d > 0.1: - sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) + Keywords `signed` and `invert` are used to compute signed distance, + but the mesh in that case must have polygonal faces (not a simple point cloud), + and normals must also be computed. - if c is None: - c = np.array(self.color()) / 1.4 + Examples: + - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) - lb = vedo.shapes.Text3D( - txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center-left" - ) - acts.append(lb) + ![](https://vedo.embl.es/images/basic/distance2mesh.png) + """ + if pcloud.GetNumberOfPolys(): - if d and not sph: - sph = vedo.shapes.Circle(pt, r=s / 3, res=15) - acts.append(sph) + poly1 = self + poly2 = pcloud + df = vtk.vtkDistancePolyDataFilter() + df.ComputeSecondDistanceOff() + df.SetInputData(0, poly1) + df.SetInputData(1, poly2) + df.SetSignedDistance(signed) + df.SetNegateDistance(invert) + df.Update() + scals = df.GetOutput().GetPointData().GetScalars() + dists = utils.vtk2numpy(scals) - x0, x1, y0, y1, z0, z1 = lb.GetBounds() - if rounded: - box = vedo.shapes.KSpline( - [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0)], closed=True - ) - else: - box = vedo.shapes.Line( - [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z0)] - ) + else: # has no polygons and vtkDistancePolyDataFilter wants them (dont know why) - cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] + if signed: + vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") - # box.SetOrigin(cnt) - box.scale([1 + padding, 1 + 2 * padding, 1]) - acts.append(box) + if not pcloud.point_locator: + pcloud.point_locator = vtk.vtkPointLocator() + pcloud.point_locator.SetDataSet(pcloud) + pcloud.point_locator.BuildLocator() - # pts = box.points() - # bfaces = [] - # for i, pt in enumerate(pts): - # if i: - # face = [i-1, i, 0] - # bfaces.append(face) - # bpts = [cnt] + pts.tolist() - # box2 = vedo.Mesh([bpts, bfaces]).z(-cnt[0]/10)#.c('w').alpha(0.1) - # #should be made assembly otherwise later merge() nullifies it - # box2.SetOrigin(cnt) - # acts.append(box2) + ids = [] + ps1 = self.points() + ps2 = pcloud.points() + for p in ps1: + pid = pcloud.point_locator.FindClosestPoint(p) + ids.append(pid) - x0, x1, y0, y1, z0, z1 = box.bounds() - if x0 < pt[0] < x1: - c0 = box.closest_point(pt) - c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] - elif (pt[0] - x0) < (x1 - pt[0]): - c0 = [x0, (y0 + y1) / 2, pt[2]] - c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] - else: - c0 = [x1, (y0 + y1) / 2, pt[2]] - c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] + deltas = ps2[ids] - ps1 + dists = np.linalg.norm(deltas, axis=1).astype(np.float32) + scals = utils.numpy2vtk(dists) - con = vedo.shapes.Line([c0, c1, pt]) - acts.append(con) + scals.SetName(name) + self.GetPointData().AddArray(scals) + self.GetPointData().SetActiveScalars(scals.GetName()) + rng = scals.GetRange() + self.mapper.SetScalarRange(rng[0], rng[1]) + self.mapper.ScalarVisibilityOn() - macts = vedo.merge(acts).c(c).alpha(alpha) - # macts.SetOrigin(pt) - macts.bc("tomato").pickable(False) - macts.property.LightingOff() - macts.property.SetLineWidth(lw) - macts.actor.UseBoundsOff() - macts.name = "FlagPole" - return macts + self.pipeline = utils.OperationNode( + "distance_to", + parents=[self, pcloud], + shape="cylinder", + comment=f"#pts {self.GetNumberOfPoints()}", + ) + return dists - def flagpost( - self, - txt=None, - point=None, - offset=None, - s=1.0, - c="k9", - bc="k1", - alpha=1, - lw=0, - font="Calco", - justify="center-left", - vspacing=1.0, - ): + def clean(self): """ - Generate a flag post style element to describe an object. + Clean pointcloud or mesh by removing coincident points. + """ + cpd = vtk.vtkCleanPolyData() + cpd.PointMergingOn() + cpd.ConvertLinesToPointsOn() + cpd.ConvertPolysToLinesOn() + cpd.ConvertStripsToPolysOn() + cpd.SetInputData(self) + cpd.Update() + self.DeepCopy(cpd.GetOutput()) + self.pipeline = utils.OperationNode( + "clean", parents=[self], + comment=f"#pts {self.GetNumberOfPoints()}" + ) + return self - Arguments: - txt : (str) - Text to display. The default is the filename or the object name. - point : (list) - position of the flag anchor point. The default is None. - offset : (list) - a 3D displacement or offset. The default is None. - s : (float) - size of the text to be shown - c : (list) - color of text and line - bc : (list) - color of the flag background - alpha : (float) - opacity of text and box. - lw : (int) - line with of box frame. The default is 0. - font : (str) - font name. Use a monospace font for better rendering. The default is "Calco". - Type `vedo -r fonts` for a font demo. - Check [available fonts here](https://vedo.embl.es/fonts). - justify : (str) - internal text justification. The default is "center-left". - vspacing : (float) - vertical spacing between lines. + def subsample(self, fraction, absolute=False): + """ + Subsample a point cloud by requiring that the points + or vertices are far apart at least by the specified fraction of the object size. + If a Mesh is passed the polygonal faces are not removed + but holes can appear as vertices are removed. Examples: - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) + - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) - ![](https://vedo.embl.es/images/other/flag_labels2.png) + ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) + + - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) + + ![](https://vedo.embl.es/images/advanced/recosurface.png) """ - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name - else: - return None + if not absolute: + if fraction > 1: + vedo.logger.warning( + f"subsample(fraction=...), fraction must be < 1, but is {fraction}" + ) + if fraction <= 0: + return self - x0, x1, y0, y1, z0, z1 = self.bounds() - d = self.diagonal_size() - if point is None: - if d: - point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) - else: # it's a Point - point = self.transform.position + cpd = vtk.vtkCleanPolyData() + cpd.PointMergingOn() + cpd.ConvertLinesToPointsOn() + cpd.ConvertPolysToLinesOn() + cpd.ConvertStripsToPolysOn() + cpd.SetInputData(self) + if absolute: + cpd.SetTolerance(fraction / self.diagonal_size()) + # cpd.SetToleranceIsAbsolute(absolute) + else: + cpd.SetTolerance(fraction) + cpd.Update() - point = utils.make3d(point) + ps = 2 + if self.property.GetRepresentation() == 0: + ps = self.property.GetPointSize() - if offset is None: - offset = [0, 0, (z1 - z0) / 2] - offset = utils.make3d(offset) + self.DeepCopy(cpd.GetOutput()) + self.ps(ps) - fpost = vedo.addons.Flagpost( - txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing + self.pipeline = utils.OperationNode( + "subsample", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" ) - self._caption = fpost - return fpost + return self - def caption( - self, - txt=None, - point=None, - size=(0.30, 0.15), - padding=5, - font="Calco", - justify="center-right", - vspacing=1.0, - c=None, - alpha=1.0, - lw=1, - ontop=True, - ): + def threshold(self, scalars, above=None, below=None, on="points"): """ - Add a 2D caption to an object which follows the camera movements. - Latex is not supported. Returns the same input object for concatenation. - - See also `flagpole()`, `flagpost()`, `labels()` and `legend()` - with similar functionality. + Extracts cells where scalar value satisfies threshold criterion. Arguments: - txt : (str) - text to be rendered. The default is the file name. - point : (list) - anchoring point. The default is None. - size : (list) - (width, height) of the caption box. The default is (0.30, 0.15). - padding : (float) - padding space of the caption box in pixels. The default is 5. - font : (str) - font name. Use a monospace font for better rendering. The default is "VictorMono". - Type `vedo -r fonts` for a font demo. - Check [available fonts here](https://vedo.embl.es/fonts). - justify : (str) - internal text justification. The default is "center-right". - vspacing : (float) - vertical spacing between lines. The default is 1. - c : (str) - text and box color. The default is 'lb'. - alpha : (float) - text and box transparency. The default is 1. - lw : (int) - line width in pixels. The default is 1. - ontop : (bool) - keep the 2d caption always on top. The default is True. + scalars : (str) + name of the scalars array. + above : (float) + minimum value of the scalar + below : (float) + maximum value of the scalar + on : (str) + if 'cells' assume array of scalars refers to cell data. Examples: - - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) - - ![](https://vedo.embl.es/images/pyplot/caption.png) - - - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) + - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name + thres = vtk.vtkThreshold() + thres.SetInputData(self) - if not txt: # disable it - self._caption = None - return self + if on.startswith("c"): + asso = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + else: + asso = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - for r in vedo.shapes._reps: - txt = txt.replace(r[0], r[1]) + thres.SetInputArrayToProcess(0, 0, 0, asso, scalars) - if c is None: - c = np.array(self.property.GetColor()) / 2 - else: - c = colors.get_color(c) + if above is None and below is not None: + try: # vtk 9.2 + thres.ThresholdByLower(below) + except AttributeError: # vtk 9.3 + thres.SetUpperThreshold(below) - if point is None: - x0, x1, y0, y1, _, z1 = self.GetBounds() - pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] - point = self.closest_point(pt) + elif below is None and above is not None: + try: + thres.ThresholdByUpper(above) + except AttributeError: + thres.SetLowerThreshold(above) + else: + try: + thres.ThresholdBetween(above, below) + except AttributeError: + thres.SetUpperThreshold(below) + thres.SetLowerThreshold(above) - capt = vtk.vtkCaptionActor2D() - capt.SetAttachmentPoint(point) - capt.SetBorder(True) - capt.SetLeader(True) - sph = vtk.vtkSphereSource() - sph.Update() - capt.SetLeaderGlyphData(sph.GetOutput()) - capt.SetMaximumLeaderGlyphSize(5) - capt.SetPadding(int(padding)) - capt.SetCaption(txt) - capt.SetWidth(size[0]) - capt.SetHeight(size[1]) - capt.SetThreeDimensionalLeader(not ontop) + thres.Update() - pra = capt.GetProperty() - pra.SetColor(c) - pra.SetOpacity(alpha) - pra.SetLineWidth(lw) + gf = vtk.vtkGeometryFilter() + gf.SetInputData(thres.GetOutput()) + gf.Update() + self.DeepCopy(gf.GetOutput()) + self.pipeline = utils.OperationNode("threshold", parents=[self]) + return self - pr = capt.GetCaptionTextProperty() - pr.SetFontFamily(vtk.VTK_FONT_FILE) - fl = utils.get_font_path(font) - pr.SetFontFile(fl) - pr.ShadowOff() - pr.BoldOff() - pr.FrameOff() - pr.SetColor(c) - pr.SetOpacity(alpha) - pr.SetJustificationToLeft() - if "top" in justify: - pr.SetVerticalJustificationToTop() - if "bottom" in justify: - pr.SetVerticalJustificationToBottom() - if "cent" in justify: - pr.SetVerticalJustificationToCentered() - pr.SetJustificationToCentered() - if "left" in justify: - pr.SetJustificationToLeft() - if "right" in justify: - pr.SetJustificationToRight() - pr.SetLineSpacing(vspacing) - self._caption = capt + def quantize(self, value): + """ + The user should input a value and all {x,y,z} coordinates + will be quantized to that absolute grain size. + """ + qp = vtk.vtkQuantizePolyDataPoints() + qp.SetInputData(self) + qp.SetQFactor(value) + qp.Update() + self.DeepCopy(qp.GetOutput()) + self.flat() + self.pipeline = utils.OperationNode("quantize", parents=[self]) return self + def average_size(self): + """ + Calculate the average size of a mesh. + This is the mean of the vertex distances from the center of mass. + """ + coords = self.points() + cm = np.mean(coords, axis=0) + if coords.shape[0] == 0: + return 0.0 + cc = coords - cm + return np.mean(np.linalg.norm(cc, axis=1)) + + def center_of_mass(self): + """Get the center of mass of mesh.""" + cmf = vtk.vtkCenterOfMass() + cmf.SetInputData(self) + cmf.Update() + c = cmf.GetCenter() + return np.array(c) + + def normal_at(self, i): + """Return the normal vector at vertex point `i`.""" + normals = self.GetPointData().GetNormals() + return np.array(normals.GetTuple(i)) + + def normals(self, cells=False, recompute=True): + """Retrieve vertex normals as a numpy array. + + Arguments: + cells : (bool) + if `True` return cell normals. + + recompute : (bool) + if `True` normals are recalculated if not already present. + Note that this might modify the number of mesh points. + """ + if cells: + vtknormals = self.GetCellData().GetNormals() + else: + vtknormals = self.GetPointData().GetNormals() + if not vtknormals and recompute: + try: + self.compute_normals(cells=cells) + if cells: + vtknormals = self.GetCellData().GetNormals() + else: + vtknormals = self.GetPointData().GetNormals() + except AttributeError: + # can be that 'Points' object has no attribute 'compute_normals' + pass + + if not vtknormals: + return np.array([]) + return utils.vtk2numpy(vtknormals) def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False): """ @@ -4856,6 +4788,83 @@ def generate_random_data(self): return self + def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None): + """ + Create a mesh from points in the XY plane. + If `mode='fit'` then the filter computes a best fitting + plane and projects the points onto it. + + Arguments: + tol : (float) + specify a tolerance to control discarding of closely spaced points. + This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. + alpha : (float) + for a non-zero alpha value, only edges or triangles contained + within a sphere centered at mesh vertices will be output. + Otherwise, only triangles will be output. + offset : (float) + multiplier to control the size of the initial, bounding Delaunay triangulation. + transform: vtkTransform + a VTK transformation (eg. a thinplate spline) + which is applied to points to generate a 2D problem. + This maps a 3D dataset into a 2D dataset where triangulation can be done on the XY plane. + The points are transformed and triangulated. + The topology of triangulated points is used as the output topology. + + Examples: + - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) + + ![](https://vedo.embl.es/images/basic/delaunay2d.png) + """ + plist = self.points() + + ######################################################### + if mode == "scipy": + from scipy.spatial import Delaunay as scipy_delaunay + tri = scipy_delaunay(plist[:, 0:2]) + return vedo.mesh.Mesh([plist, tri.simplices]) + ########################################################## + + pd = vtk.vtkPolyData() + vpts = vtk.vtkPoints() + vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) + pd.SetPoints(vpts) + + delny = vtk.vtkDelaunay2D() + delny.SetInputData(pd) + if tol: + delny.SetTolerance(tol) + delny.SetAlpha(alpha) + delny.SetOffset(offset) + if transform: + if hasattr(transform, "transform"): + transform = transform.transform + delny.SetTransform(transform) + + if mode == "xy" and boundaries: + boundary = vtk.vtkPolyData() + boundary.SetPoints(vpts) + cell_array = vtk.vtkCellArray() + for b in boundaries: + cpolygon = vtk.vtkPolygon() + for idd in b: + cpolygon.GetPointIds().InsertNextId(idd) + cell_array.InsertNextCell(cpolygon) + boundary.SetPolys(cell_array) + delny.SetSourceData(boundary) + + if mode == "fit": + delny.SetProjectionPlaneMode(vtk.VTK_BEST_FITTING_PLANE) + delny.Update() + msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") + + msh.pipeline = utils.OperationNode( + "delaunay2d", parents=parents, + comment=f"#cells {msh.GetNumberOfCells()}" + ) + return msh + + def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): """ Generate the 2D Voronoi convex tiling of the input points (z is ignored). From 59cac2b070b72b751a4fedacdad14497191ffb13 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:47:16 +0200 Subject: [PATCH 018/251] add MeshVisual --- vedo/mesh.py | 191 +++++++++++++++++++++++---------------------- vedo/pointcloud.py | 4 +- 2 files changed, 99 insertions(+), 96 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index 04b7acc5..0e8ebce4 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -25,9 +25,104 @@ __all__ = ["Mesh"] +class MeshVisual: + """Class to manage the visual aspects of a ``Maesh`` object.""" + + def wireframe(self, value=True): + """Set mesh's representation as wireframe or solid surface.""" + if value: + self.property.SetRepresentationToWireframe() + else: + self.property.SetRepresentationToSurface() + return self + + def flat(self): + """Set surface interpolation to flat. + + + """ + self.property.SetInterpolationToFlat() + return self + + def phong(self): + """Set surface interpolation to "phong".""" + self.property.SetInterpolationToPhong() + return self + + def backface_culling(self, value=True): + """Set culling of polygons based on orientation of normal with respect to camera.""" + self.property.SetBackfaceCulling(value) + return self + + def render_lines_as_tubes(self, value=True): + """Wrap a fake tube around a simple line for visualization""" + self.property.SetRenderLinesAsTubes(value) + return self + + def frontface_culling(self, value=True): + """Set culling of polygons based on orientation of normal with respect to camera.""" + self.property.SetFrontfaceCulling(value) + return self + + def backcolor(self, bc=None): + """ + Set/get mesh's backface color. + """ + backProp = self.actor.GetBackfaceProperty() + + if bc is None: + if backProp: + return backProp.GetDiffuseColor() + return self + + if self.property.GetOpacity() < 1: + return self + + if not backProp: + backProp = vtk.vtkProperty() + + backProp.SetDiffuseColor(get_color(bc)) + backProp.SetOpacity(self.property.GetOpacity()) + self.actor.SetBackfaceProperty(backProp) + self.mapper.ScalarVisibilityOff() + return self + + def bc(self, backcolor=False): + """Shortcut for `mesh.backcolor()`.""" + return self.backcolor(backcolor) + + def linewidth(self, lw=None): + """Set/get width of mesh edges. Same as `lw()`.""" + if lw is not None: + if lw == 0: + self.property.EdgeVisibilityOff() + self.property.SetRepresentationToSurface() + return self + self.property.EdgeVisibilityOn() + self.property.SetLineWidth(lw) + else: + return self.property.GetLineWidth() + return self + + def lw(self, linewidth=None): + """Set/get width of mesh edges. Same as `linewidth()`.""" + return self.linewidth(linewidth) + + def linecolor(self, lc=None): + """Set/get color of mesh edges. Same as `lc()`.""" + if lc is None: + return self.property.GetEdgeColor() + self.property.EdgeVisibilityOn() + self.property.SetEdgeColor(get_color(lc)) + return self + + def lc(self, linecolor=None): + """Set/get color of mesh edges. Same as `linecolor()`.""" + return self.linecolor(linecolor) + #################################################### -class Mesh(Points): +class Mesh(MeshVisual, Points): """ Build an instance of object `Mesh` derived from `vedo.PointCloud`. """ @@ -54,6 +149,8 @@ def __init__(self, inputobj=None, c=None, alpha=1): ![](https://vedo.embl.es/images/basic/buildmesh.png) """ super().__init__() + # MeshVisual.__init__(self) + # Points.__init__(self) self.mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping @@ -691,98 +788,6 @@ def reverse(self, cells=True, normals=False): self.pipeline = OperationNode("reverse", parents=[self]) return self - def wireframe(self, value=True): - """Set mesh's representation as wireframe or solid surface.""" - if value: - self.property.SetRepresentationToWireframe() - else: - self.property.SetRepresentationToSurface() - return self - - def flat(self): - """Set surface interpolation to flat. - - - """ - self.property.SetInterpolationToFlat() - return self - - def phong(self): - """Set surface interpolation to "phong".""" - self.property.SetInterpolationToPhong() - return self - - def backface_culling(self, value=True): - """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetBackfaceCulling(value) - return self - - def render_lines_as_tubes(self, value=True): - """Wrap a fake tube around a simple line for visualization""" - self.property.SetRenderLinesAsTubes(value) - return self - - def frontface_culling(self, value=True): - """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetFrontfaceCulling(value) - return self - - def backcolor(self, bc=None): - """ - Set/get mesh's backface color. - """ - backProp = self.actor.GetBackfaceProperty() - - if bc is None: - if backProp: - return backProp.GetDiffuseColor() - return self - - if self.property.GetOpacity() < 1: - return self - - if not backProp: - backProp = vtk.vtkProperty() - - backProp.SetDiffuseColor(get_color(bc)) - backProp.SetOpacity(self.property.GetOpacity()) - self.actor.SetBackfaceProperty(backProp) - self.mapper.ScalarVisibilityOff() - return self - - def bc(self, backcolor=False): - """Shortcut for `mesh.backcolor()`.""" - return self.backcolor(backcolor) - - def linewidth(self, lw=None): - """Set/get width of mesh edges. Same as `lw()`.""" - if lw is not None: - if lw == 0: - self.property.EdgeVisibilityOff() - self.property.SetRepresentationToSurface() - return self - self.property.EdgeVisibilityOn() - self.property.SetLineWidth(lw) - else: - return self.property.GetLineWidth() - return self - - def lw(self, linewidth=None): - """Set/get width of mesh edges. Same as `linewidth()`.""" - return self.linewidth(linewidth) - - def linecolor(self, lc=None): - """Set/get color of mesh edges. Same as `lc()`.""" - if lc is None: - return self.property.GetEdgeColor() - self.property.EdgeVisibilityOn() - self.property.SetEdgeColor(get_color(lc)) - return self - - def lc(self, linecolor=None): - """Set/get color of mesh edges. Same as `linecolor()`.""" - return self.linecolor(linecolor) - def volume(self): """Get/set the volume occupied by mesh.""" mass = vtk.vtkMassProperties() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index cbe126f4..a6e96bbb 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -145,13 +145,11 @@ def visible_points(mesh, area=(), tol=None, invert=False): return m -def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None): +def delaunay2d(plist, **kwargs): """delaunay2d() is deprecated, use Points().generate_delaunay2d() instead""" if isinstance(plist, Points): - parents = [plist] plist = plist.points() else: - parents = [] plist = np.ascontiguousarray(plist) plist = utils.make3d(plist) pp = Points(plist).generate_delaunay2d(**kwargs) From 8c474ecd48b377f1c0f33d03c45b4886c3084ad5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:48:55 +0200 Subject: [PATCH 019/251] fix blurring(self) --- vedo/pointcloud.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index a6e96bbb..458cc987 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -725,7 +725,7 @@ def lighting( return self - def blurring(emissive=False): + def blurring(self, r=1, emissive=False): """Set point blurring. Apply a gaussian convolution filter to the points. In this case the radius `r` is in absolute units of the mesh coordinates. @@ -4857,7 +4857,7 @@ def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") msh.pipeline = utils.OperationNode( - "delaunay2d", parents=parents, + "delaunay2d", parents=[self], comment=f"#cells {msh.GetNumberOfCells()}" ) return msh From 62f0a6904d6bb5c033c0191ac77ad0b6793e8aca Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 19:55:33 +0200 Subject: [PATCH 020/251] move visible_points to Points.visible_points --- vedo/pointcloud.py | 110 ++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 458cc987..253273da 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -25,8 +25,7 @@ "Points", "Point", "merge", - "visible_points", - "delaunay2d", + "delaunay2d", # deprecated "fit_line", "fit_circle", "fit_plane", @@ -91,60 +90,6 @@ def merge(*meshs, flag=False): return msh -#################################################### -def visible_points(mesh, area=(), tol=None, invert=False): - """ - Extract points based on whether they are visible or not. - Visibility is determined by accessing the z-buffer of a rendering window. - The position of each input point is converted into display coordinates, - and then the z-value at that point is obtained. - If within the user-specified tolerance, the point is considered visible. - Associated data attributes are passed to the output as well. - - This filter also allows you to specify a rectangular window in display (pixel) - coordinates in which the visible points must lie. - - Arguments: - area : (list) - specify a rectangular region as (xmin,xmax,ymin,ymax) - tol : (float) - a tolerance in normalized display coordinate system - invert : (bool) - select invisible points instead. - - Example: - ```python - from vedo import Ellipsoid, show, visible_points - s = Ellipsoid().rotate_y(30) - - #Camera options: pos, focal_point, viewup, distance, - camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) - show(s, camera=camopts, offscreen=True) - - m = visible_points(s) - #print('visible pts:', m.points()) # numpy array - show(m, new=True, axes=1) # optionally draw result on a new window - ``` - ![](https://vedo.embl.es/images/feats/visible_points.png) - """ - # specify a rectangular region - svp = vtk.vtkSelectVisiblePoints() - svp.SetInputData(mesh) - svp.SetRenderer(vedo.plotter_instance.renderer) - - if len(area) == 4: - svp.SetSelection(area[0], area[1], area[2], area[3]) - if tol is not None: - svp.SetTolerance(tol) - if invert: - svp.SelectInvisibleOn() - svp.Update() - - m = Points(svp.GetOutput()).point_size(5) - m.name = "VisiblePoints" - return m - - def delaunay2d(plist, **kwargs): """delaunay2d() is deprecated, use Points().generate_delaunay2d() instead""" if isinstance(plist, Points): @@ -4964,3 +4909,56 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.lw(2).lighting("off").wireframe() m.name = "Voronoi" return m + + #################################################### + def visible_points(self, area=(), tol=None, invert=False): + """ + Extract points based on whether they are visible or not. + Visibility is determined by accessing the z-buffer of a rendering window. + The position of each input point is converted into display coordinates, + and then the z-value at that point is obtained. + If within the user-specified tolerance, the point is considered visible. + Associated data attributes are passed to the output as well. + + This filter also allows you to specify a rectangular window in display (pixel) + coordinates in which the visible points must lie. + + Arguments: + area : (list) + specify a rectangular region as (xmin,xmax,ymin,ymax) + tol : (float) + a tolerance in normalized display coordinate system + invert : (bool) + select invisible points instead. + + Example: + ```python + from vedo import Ellipsoid, show, visible_points + s = Ellipsoid().rotate_y(30) + + #Camera options: pos, focal_point, viewup, distance, + camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) + show(s, camera=camopts, offscreen=True) + + m = s.visible_points() + #print('visible pts:', m.points()) # numpy array + show(m, new=True, axes=1) # optionally draw result on a new window + ``` + ![](https://vedo.embl.es/images/feats/visible_points.png) + """ + svp = vtk.vtkSelectVisiblePoints() + svp.SetInputData(self) + svp.SetRenderer(vedo.plotter_instance.renderer) + + if len(area) == 4: + # specify a rectangular region + svp.SetSelection(area[0], area[1], area[2], area[3]) + if tol is not None: + svp.SetTolerance(tol) + if invert: + svp.SelectInvisibleOn() + svp.Update() + + m = Points(svp.GetOutput()).point_size(5) + m.name = "VisiblePoints" + return m From 7366189fd579e5f0c78bf10e9af7cd09b546cbc9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 20:26:49 +0200 Subject: [PATCH 021/251] new palettes --- examples/basic/delaunay2d.py | 15 ++- vedo/plotter.py | 182 +++++++++++++++++++---------------- vedo/pointcloud.py | 10 +- 3 files changed, 109 insertions(+), 98 deletions(-) diff --git a/examples/basic/delaunay2d.py b/examples/basic/delaunay2d.py index 1215f64a..3423853e 100644 --- a/examples/basic/delaunay2d.py +++ b/examples/basic/delaunay2d.py @@ -1,22 +1,19 @@ -"""Delaunay 2D meshing -with point loops defining holes""" +"""Delaunay 2D meshing with point loops defining holes""" from vedo import * # Generate a grid and add gaussian noise to it # then extract the points from the grid and store them in the variable gp -gp = Grid().add_gaussian_noise([0.5,0.5,0]).points() +gp = Grid().add_gaussian_noise([0.5,0.5,0]).point_size(8) # Define two internal holes using point ids ids = [[24,35,36,37,26,15,14,25], [84,95,96,85]] -# Create a point cloud object using the extracted points gp -pts = Points(gp, r=6).c('blue3') - # Use the Delaunay triangulation algorithm to create a 2D mesh # from the points in gp, with the given boundary ids -dly = delaunay2d(gp, mode='xy', boundaries=ids).c('w').lc('o').lw(1) +dly = gp.generate_delaunay2d(mode='xy', boundaries=ids) +dly.c('white').lc('orange').lw(1) # Create labels for the point ids and set their z to 0.01 -labels = pts.labels('id').z(0.01) +labels = gp.labels('id').z(0.01) -show(pts, labels, dly, __doc__, bg="Mint").close() +show(gp, labels, dly, __doc__, bg="Mint", zoom='tight').close() diff --git a/vedo/plotter.py b/vedo/plotter.py index f4cf338b..941f0877 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -403,7 +403,7 @@ def __init__( self.objects = [] # list of actors to be shown - self.clicked_actor = None # holds the actor that has been clicked + self.clicked_object = None # holds the actor that has been clicked self.renderer = None # current renderer self.renderers = [] # list of renderers self.shape = shape # don't remove this line @@ -3432,8 +3432,8 @@ def _mouseleftclick(self, iren, event): self.renderer = renderer - clicked_actor = picker.GetActor() - # clicked_actor2D = picker.GetActor2D() + clicked_object = picker.GetActor() + # clicked_object2D = picker.GetActor2D() # print('_mouseleftclick mouse at', x, y) # print("picked Volume:", [picker.GetVolume()]) @@ -3441,26 +3441,26 @@ def _mouseleftclick(self, iren, event): # print("picked Assembly:", [picker.GetAssembly()]) # print("picked Prop3D:", [picker.GetProp3D()]) - if not clicked_actor: - clicked_actor = picker.GetAssembly() + if not clicked_object: + clicked_object = picker.GetAssembly() - if not clicked_actor: - clicked_actor = picker.GetProp3D() + if not clicked_object: + clicked_object = picker.GetProp3D() - if not hasattr(clicked_actor, "GetPickable") or not clicked_actor.GetPickable(): + if not hasattr(clicked_object, "GetPickable") or not clicked_object.GetPickable(): return self.picked3d = picker.GetPickPosition() self.picked2d = np.array([x, y]) - if not clicked_actor: + if not clicked_object: return self.justremoved = None - self.clicked_actor = clicked_actor - if hasattr(clicked_actor, "picked3d"): # might be not a vedo obj - clicked_actor.picked3d = picker.GetPickPosition() + self.clicked_object = clicked_object + if hasattr(clicked_object, "picked3d"): # might be not a vedo obj + clicked_object.picked3d = picker.GetPickPosition() x, y = iren.GetEventPosition() # ----------- @@ -3512,73 +3512,73 @@ def _keypress(self, iren, event): sys.exit(0) elif key == "Down": - if self.clicked_actor in self.get_meshes(): - self.clicked_actor.property.SetOpacity(0.02) - bfp = self.clicked_actor.actor.GetBackfaceProperty() - if bfp and hasattr(self.clicked_actor, "_bfprop"): - self.clicked_actor._bfprop = bfp # save it - self.clicked_actor.actor.SetBackfaceProperty(None) + if self.clicked_object in self.get_meshes(): + self.clicked_object.property.SetOpacity(0.02) + bfp = self.clicked_object.actor.GetBackfaceProperty() + if bfp and hasattr(self.clicked_object, "property_backface"): + self.clicked_object.property_backface = bfp # save it + self.clicked_object.actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): a.property.SetOpacity(0.02) bfp = a.actor.GetBackfaceProperty() - if bfp and hasattr(a, "_bfprop"): - a._bfprop = bfp + if bfp and hasattr(a, "property_backface"): + a.property_backface = bfp a.actor.SetBackfaceProperty(None) elif key == "Left": - if self.clicked_actor in self.get_meshes(): - ap = self.clicked_actor.property + if self.clicked_object in self.get_meshes(): + ap = self.clicked_object.property aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) - bfp = self.clicked_actor.actor.GetBackfaceProperty() - if bfp and hasattr(self.clicked_actor, "_bfprop"): - self.clicked_actor._bfprop = bfp - self.clicked_actor.actor.SetBackfaceProperty(None) + bfp = self.clicked_object.actor.GetBackfaceProperty() + if bfp and hasattr(self.clicked_object, "property_backface"): + self.clicked_object.property_backface = bfp + self.clicked_object.actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): ap = a.property aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = a.actor.GetBackfaceProperty() - if bfp and hasattr(a, "_bfprop"): - a._bfprop = bfp + if bfp and hasattr(a, "property_backface"): + a.property_backface = bfp a.actor.SetBackfaceProperty(None) elif key == "Right": - if self.clicked_actor in self.get_meshes(): - ap = self.clicked_actor.property + if self.clicked_object in self.get_meshes(): + ap = self.clicked_object.property aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if ( aal == 1 - and hasattr(self.clicked_actor, "_bfprop") - and self.clicked_actor._bfprop + and hasattr(self.clicked_object, "property_backface") + and self.clicked_object.property_backface ): # put back - self.clicked_actor.actor.SetBackfaceProperty(self.clicked_actor._bfprop) + self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.property_backface) else: for a in self.get_meshes(): ap = a.property aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) - if aal == 1 and hasattr(a, "_bfprop") and a._bfprop: - a.actor.SetBackfaceProperty(a._bfprop) + if aal == 1 and hasattr(a, "property_backface") and a.property_backface: + a.actor.SetBackfaceProperty(a.property_backface) elif key in ("slash", "Up"): - if self.clicked_actor in self.get_meshes(): - self.clicked_actor.property.SetOpacity(1) - if hasattr(self.clicked_actor, "_bfprop") and self.clicked_actor._bfprop: - self.clicked_actor.actor.SetBackfaceProperty(self.clicked_actor._bfprop) + if self.clicked_object in self.get_meshes(): + self.clicked_object.property.SetOpacity(1) + if hasattr(self.clicked_object, "property_backface") and self.clicked_object.property_backface: + self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.property_backface) else: for a in self.get_meshes(): a.property.SetOpacity(1) - if hasattr(a, "_bfprop") and a._bfprop: - a.actor.SetBackfaceProperty(a._bfprop) + if hasattr(a, "property_backface") and a.property_backface: + a.actor.SetBackfaceProperty(a.property_backface) elif key == "P": - if self.clicked_actor in self.get_meshes(): - acts = [self.clicked_actor] + if self.clicked_object in self.get_meshes(): + acts = [self.clicked_object] else: acts = self.get_meshes() for ia in acts: @@ -3591,8 +3591,8 @@ def _keypress(self, iren, event): pass elif key == "p": - if self.clicked_actor in self.get_meshes(): - acts = [self.clicked_actor] + if self.clicked_object in self.get_meshes(): + acts = [self.clicked_object] else: acts = self.get_meshes() for ia in acts: @@ -3604,8 +3604,8 @@ def _keypress(self, iren, event): pass elif key == "w": - if self.clicked_actor and self.clicked_actor in self.get_meshes(): - self.clicked_actor.property.SetRepresentationToWireframe() + if self.clicked_object and self.clicked_object in self.get_meshes(): + self.clicked_object.property.SetRepresentationToWireframe() else: for a in self.get_meshes(): if a.property.GetRepresentation() == 1: # toggle @@ -3766,38 +3766,50 @@ def _keypress(self, iren, event): self.reset_viewup() elif key == "s": - if self.clicked_actor and self.clicked_actor in self.get_meshes(): - self.clicked_actor.property.SetRepresentationToSurface() + if self.clicked_object and self.clicked_object in self.get_meshes(): + self.clicked_object.property.SetRepresentationToSurface() else: for a in self.get_meshes(): a.property.SetRepresentationToSurface() elif key == "1": self._icol += 1 - if isinstance(self.clicked_actor, vedo.Points): - self.clicked_actor.GetMapper().ScalarVisibilityOff() + if isinstance(self.clicked_object, vtk.vtkActor): + self.clicked_object.GetMapper().ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] - self.clicked_actor.property.SetColor(pal[(self._icol) % 10]) + self.clicked_object.GetProperty().SetColor(pal[(self._icol) % 10]) elif key == "2": + bsc = ["k1", "k2", "k3", "k4", + "b1", "b2", "b3", "b4", + "p1", "p2", "p3", "p4", + "g1", "g2", "g3", "g4", + "r1", "r2", "r3", "r4", + "o1", "o2", "o3", "o4", + "y1", "y2", "y3", "y4"] self._icol += 1 - settings.palette += 1 - settings.palette = settings.palette % len(vedo.colors.palettes) - if isinstance(self.clicked_actor, vedo.Points): - self.clicked_actor.GetMapper().ScalarVisibilityOff() - pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] - self.clicked_actor.property.SetColor(pal[(self._icol) % 10]) + if isinstance(self.clicked_object, vtk.vtkActor): + self.clicked_object.GetMapper().ScalarVisibilityOff() + newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) + self.clicked_object.GetProperty().SetColor(newcol) elif key == "3": - bsc = ["b5", "cyan5", "g4", "o5", "p5", "r4", "teal4", "yellow4"] + bsc = ["k6", "k7", "k8", "k9", + "b6", "b7", "b8", "b9", + "p6", "p7", "p8", "p9", + "g6", "g7", "g8", "g9", + "r6", "r7", "r8", "r9", + "o6", "o7", "o8", "o9", + "y6", "y7", "y8", "y9"] self._icol += 1 - if isinstance(self.clicked_actor, vedo.Points): - self.clicked_actor.GetMapper().ScalarVisibilityOff() - self.clicked_actor.property.SetColor(vedo.get_color(bsc[(self._icol) % len(bsc)])) + if isinstance(self.clicked_object, vtk.vtkActor): + self.clicked_object.GetMapper().ScalarVisibilityOff() + newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) + self.clicked_object.GetProperty().SetColor(newcol) elif key == "4": - if self.clicked_actor: - acts = [self.clicked_actor] + if self.clicked_object: + acts = [self.clicked_object] else: acts = self.get_meshes() for ia in acts: @@ -3976,8 +3988,8 @@ def _keypress(self, iren, event): self.window.Render() elif key == "l": - if self.clicked_actor in self.get_meshes(): - acts = [self.clicked_actor] + if self.clicked_object in self.get_meshes(): + acts = [self.clicked_object] else: acts = self.get_meshes() for ia in acts: @@ -3990,8 +4002,8 @@ def _keypress(self, iren, event): pass elif key == "k": # lightings - if self.clicked_actor in self.get_meshes(): - acts = [self.clicked_actor] + if self.clicked_object in self.get_meshes(): + acts = [self.clicked_object] else: acts = self.get_meshes() shds = ("default", "metallic", "plastic", "shiny", "glossy", "off") @@ -4004,8 +4016,8 @@ def _keypress(self, iren, event): pass elif key == "K": # shading - if self.clicked_actor in self.get_meshes(): - acts = [self.clicked_actor] + if self.clicked_object in self.get_meshes(): + acts = [self.clicked_object] else: acts = self.get_meshes() for ia in acts: @@ -4019,29 +4031,29 @@ def _keypress(self, iren, event): ia.property.SetInterpolation(2) # phong elif key == "n": # show normals to an actor - if self.clicked_actor in self.get_meshes(): - if self.clicked_actor.GetPickable(): - self.renderer.AddActor(vedo.shapes.NormalLines(self.clicked_actor)) + if self.clicked_object in self.get_meshes(): + if self.clicked_object.GetPickable(): + self.renderer.AddActor(vedo.shapes.NormalLines(self.clicked_object)) iren.Render() else: print("Click an actor and press n to add normals.") elif key == "x": if self.justremoved is None: - if self.clicked_actor in self.get_meshes() or isinstance( - self.clicked_actor, vtk.vtkAssembly + if self.clicked_object in self.get_meshes() or isinstance( + self.clicked_object, vtk.vtkAssembly ): - self.justremoved = self.clicked_actor - self.renderer.RemoveActor(self.clicked_actor) + self.justremoved = self.clicked_object + self.renderer.RemoveActor(self.clicked_object) else: self.renderer.AddActor(self.justremoved) self.renderer.Render() self.justremoved = None elif key == "X": - if self.clicked_actor: + if self.clicked_object: if not self.cutter_widget: - self.cutter_widget = addons.BoxCutter(self.clicked_actor) + self.cutter_widget = addons.BoxCutter(self.clicked_object) self.add(self.cutter_widget) print("Press Shift+X to close the cutter box widget, Ctrl+s to save the cut section.") else: @@ -4065,8 +4077,8 @@ def _keypress(self, iren, event): vedo.printc(":idea: Try: firefox scene.html", c="blue") elif key == "i": # print info - if self.clicked_actor: - utils.print_info(self.clicked_actor) + if self.clicked_object: + utils.print_info(self.clicked_object) else: utils.print_info(self) @@ -4075,12 +4087,12 @@ def _keypress(self, iren, event): self.color_picker([x, y], verbose=True) elif key == "y": - if self.clicked_actor and self.clicked_actor.pipeline: - # self.clicked_actor.pipeline = utils.OperationNode( - # "show", parents=[self.clicked_actor], + if self.clicked_object and self.clicked_object.pipeline: + # self.clicked_object.pipeline = utils.OperationNode( + # "show", parents=[self.clicked_object], # shape="circle", # ) - self.clicked_actor.pipeline.show() + self.clicked_object.pipeline.show() if iren: iren.Render() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 253273da..4ec8f024 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -25,7 +25,7 @@ "Points", "Point", "merge", - "delaunay2d", # deprecated + "delaunay2d", # deprecated, use .generate_delaunay2d() "fit_line", "fit_circle", "fit_plane", @@ -488,7 +488,8 @@ def __init__(self): self.property = self.actor.GetProperty() self.mapper = vtk.vtkPolyDataMapper() - self._bfprop = None # backface property holder + self.property_backface = None + self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI self._cmap_name = "" # remember the name for self._keypress @@ -536,10 +537,10 @@ def alpha(self, opacity=None): bfp = self.actor.GetBackfaceProperty() if bfp: if opacity < 1: - self._bfprop = bfp + self.property_backface = bfp self.property.SetBackfaceProperty(None) else: - self.property.SetBackfaceProperty(self._bfprop) + self.property.SetBackfaceProperty(self.property_backface) return self @@ -4910,6 +4911,7 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.name = "Voronoi" return m + #################################################### def visible_points(self, area=(), tol=None, invert=False): """ From 6cfc83399879c5f2814b06253ef1ff307ff236e0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 21:09:27 +0200 Subject: [PATCH 022/251] clone Plane and Line --- vedo/shapes.py | 78 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/vedo/shapes.py b/vedo/shapes.py index 297ddd8d..13aca8ef 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -17,7 +17,7 @@ from vedo.pointcloud import Points, merge from vedo.mesh import Mesh from vedo.picture import Picture - +from vedo.transformations import pol2cart __docformat__ = "google" @@ -435,7 +435,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): alpha : (float) opacity in range [0,1] """ - self.slope = [] # populated by analysis.fitLine + self.slope = [] # populated by analysis.fit_line self.center = [] self.variances = [] @@ -467,7 +467,10 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): p0 = utils.make3d(p0) # detect if user is passing a list of points: - if utils.is_sequence(p0[0]): + if isinstance(p0, vtk.vtkPolyData): + poly = p0 + + elif utils.is_sequence(p0[0]): p0 = utils.make3d(p0) ppoints = vtk.vtkPoints() # Generate the polyline @@ -511,6 +514,37 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): self.top = top self.name = "Line" + def clone(self): + """ + Return a copy of the ``Line`` object. + + Example: + ```python + from vedo import Line + ln = Line([0,0,0], [1,1,1]) + ln2 = ln.clone().c('red') + ln2.show(axes=1) + ``` + ![](https://vedo.embl.es/images/feats/line_clone.png) + """ + name = self.name + base = self.base + top = self.top + pickable = self.actor.GetPickable() + drg = self.actor.GetDragable() + prop = vtk.vtkProperty() + prop.DeepCopy(self.property) + + ln = Line(self) + ln.actor.SetProperty(prop) + ln.property = prop + ln.name = name + ln.base = base + ln.top = top + ln.actor.SetPickable(pickable) + ln.actor.SetDragable(drg) + return ln + def linecolor(self, lc=None): """Assign a color to the line""" # overrides mesh.linecolor which would have no effect here @@ -2352,7 +2386,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestRegularPolygonSource.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=nsides, endpoint=False) - x, y = utils.pol2cart(np.ones_like(t) * r, t) + x, y = pol2cart(np.ones_like(t) * r, t) faces = [list(range(nsides))] # do not use: vtkRegularPolygonSource super().__init__([np.c_[x, y], faces], c, alpha) @@ -3066,8 +3100,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra pos = utils.make3d(pos) sx, sy = s - self.normal = np.asarray(normal, dtype=float) - self.center = np.asarray(pos, dtype=float) + normal = np.asarray(normal, dtype=float) self.variance = 0 ps = vtk.vtkPlaneSource() @@ -3075,8 +3108,9 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tri = vtk.vtkTriangleFilter() tri.SetInputConnection(ps.GetOutputPort()) tri.Update() + poly = tri.GetOutput() - axis = self.normal / np.linalg.norm(normal) + axis = normal / np.linalg.norm(normal) theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtk.vtkTransform() @@ -3088,12 +3122,38 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tf.SetInputData(poly) tf.SetTransform(t) tf.Update() + super().__init__(tf.GetOutput(), c, alpha) self.lighting("off") self.pos(pos) self.name = "Plane" - self.top = self.normal - self.bottom = np.array([0.0, 0.0, 0.0]) + self.top = normal + self.base = np.array([0.0, 0.0, 0.0]) + + def clone(self): + newplane = Plane() + prop = vtk.vtkProperty() + prop.DeepCopy(self.property) + newplane.actor.SetProperty(prop) + newplane.property = prop + newplane.variance = 0 + newplane.top = self.normal + newplane.base = self.base + return newplane + + @property + def normal(self): + pts = self.points() + AB = pts[1] - pts[0] + AC = pts[2] - pts[0] + normal = np.cross(AB, AC) + normal = normal / np.linalg.norm(normal) + return normal + + @property + def center(self): + pts = self.points() + return np.mean(pts, axis=0) def contains(self, points): """ From 21f01ebfa6fbe456edc0e98b6cdbdb56e0ccf517 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 8 Oct 2023 22:05:25 +0200 Subject: [PATCH 023/251] fix follower --- examples/pyplot/markpoint.py | 3 +- vedo/base.py | 199 +++++++++++++++++------------------ vedo/mesh.py | 107 +++++++++---------- vedo/plotter.py | 2 + 4 files changed, 150 insertions(+), 161 deletions(-) diff --git a/examples/pyplot/markpoint.py b/examples/pyplot/markpoint.py index 9e417cdd..2d011dd2 100644 --- a/examples/pyplot/markpoint.py +++ b/examples/pyplot/markpoint.py @@ -8,6 +8,7 @@ tx1 = Text3D("Fixed Text", pts[10], s=0.07, depth=0.1, c="lb") tx2 = Text3D("Follower Text", pts[144], s=0.07, c="lg").follow_camera() -fp = sp.flagpole("The\nNorth Pole", c='k6', rounded=True).scale(0.4).follow_camera() +fp = sp.flagpole("The\nNorth Pole", c='k6', rounded=True) +fp = fp.scale(0.4).follow_camera() show(sp, tx1, tx2, fp, __doc__, bg='bb', axes=1).close() diff --git a/vedo/base.py b/vedo/base.py index bbf88bba..c4cbcb5d 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -345,7 +345,6 @@ def __init__(self): self.time = time.time() self.rendered_at = set() self.transform = LinearTransform() - self._isfollower = False # set by mesh.follow_camera() self.point_locator = None self.cell_locator = None @@ -2250,102 +2249,102 @@ def add_observer(self, event_name, func, priority=0): ############################################################################### funcs -def probe_points(dataset, pts): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars at the specified points in space. - - Note that a mask is also output with valid/invalid points which can be accessed - with `mesh.pointdata['vtkValidPointMask']`. - - Examples: - - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) - - ![](https://vedo.embl.es/images/volumetric/probePoints.png) - """ - if isinstance(pts, vedo.pointcloud.Points): - pts = pts.points() - - def _readpoints(): - output = src.GetPolyDataOutput() - points = vtk.vtkPoints() - for p in pts: - x, y, z = p - points.InsertNextPoint(x, y, z) - output.SetPoints(points) - - cells = vtk.vtkCellArray() - cells.InsertNextCell(len(pts)) - for i in range(len(pts)): - cells.InsertCellPoint(i) - output.SetVerts(cells) - - src = vtk.vtkProgrammableSource() - src.SetExecuteMethod(_readpoints) - src.Update() - img = dataset - probeFilter = vtk.vtkProbeFilter() - probeFilter.SetSourceData(img) - probeFilter.SetInputConnection(src.GetOutputPort()) - probeFilter.Update() - poly = probeFilter.GetOutput() - pm = vedo.mesh.Mesh(poly) - pm.name = "ProbePoints" - pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) - return pm - - -def probe_line(dataset, p1, p2, res=100): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars along a line defined by 2 points `p1` and `p2`. - - Note that a mask is also output with valid/invalid points which can be accessed - with `mesh.pointdata['vtkValidPointMask']`. - - Use `res` to set the nr of points along the line - - Examples: - - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) - - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) - - ![](https://vedo.embl.es/images/volumetric/probeLine2.png) - """ - line = vtk.vtkLineSource() - line.SetResolution(res) - line.SetPoint1(p1) - line.SetPoint2(p2) - probeFilter = vtk.vtkProbeFilter() - probeFilter.SetSourceData(dataset) - probeFilter.SetInputConnection(line.GetOutputPort()) - probeFilter.Update() - poly = probeFilter.GetOutput() - lnn = vedo.mesh.Mesh(poly) - lnn.name = "ProbeLine" - lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) - return lnn - - -def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars on a plane defined by a point and a normal. - - Examples: - - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) - - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) - - ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) - """ - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - planeCut = vtk.vtkCutter() - planeCut.SetInputData(dataset) - planeCut.SetCutFunction(plane) - planeCut.Update() - poly = planeCut.GetOutput() - cutmesh = vedo.mesh.Mesh(poly) - cutmesh.name = "ProbePlane" - cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) - return cutmesh +# def probe_points(dataset, pts): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars at the specified points in space. + +# Note that a mask is also output with valid/invalid points which can be accessed +# with `mesh.pointdata['vtkValidPointMask']`. + +# Examples: +# - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) + +# ![](https://vedo.embl.es/images/volumetric/probePoints.png) +# """ +# if isinstance(pts, vedo.pointcloud.Points): +# pts = pts.points() + +# def _readpoints(): +# output = src.GetPolyDataOutput() +# points = vtk.vtkPoints() +# for p in pts: +# x, y, z = p +# points.InsertNextPoint(x, y, z) +# output.SetPoints(points) + +# cells = vtk.vtkCellArray() +# cells.InsertNextCell(len(pts)) +# for i in range(len(pts)): +# cells.InsertCellPoint(i) +# output.SetVerts(cells) + +# src = vtk.vtkProgrammableSource() +# src.SetExecuteMethod(_readpoints) +# src.Update() +# img = dataset +# probeFilter = vtk.vtkProbeFilter() +# probeFilter.SetSourceData(img) +# probeFilter.SetInputConnection(src.GetOutputPort()) +# probeFilter.Update() +# poly = probeFilter.GetOutput() +# pm = vedo.mesh.Mesh(poly) +# pm.name = "ProbePoints" +# pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) +# return pm + + +# def probe_line(dataset, p1, p2, res=100): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars along a line defined by 2 points `p1` and `p2`. + +# Note that a mask is also output with valid/invalid points which can be accessed +# with `mesh.pointdata['vtkValidPointMask']`. + +# Use `res` to set the nr of points along the line + +# Examples: +# - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) +# - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) + +# ![](https://vedo.embl.es/images/volumetric/probeLine2.png) +# """ +# line = vtk.vtkLineSource() +# line.SetResolution(res) +# line.SetPoint1(p1) +# line.SetPoint2(p2) +# probeFilter = vtk.vtkProbeFilter() +# probeFilter.SetSourceData(dataset) +# probeFilter.SetInputConnection(line.GetOutputPort()) +# probeFilter.Update() +# poly = probeFilter.GetOutput() +# lnn = vedo.mesh.Mesh(poly) +# lnn.name = "ProbeLine" +# lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) +# return lnn + + +# def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars on a plane defined by a point and a normal. + +# Examples: +# - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) +# - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) + +# ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) +# """ +# plane = vtk.vtkPlane() +# plane.SetOrigin(origin) +# plane.SetNormal(normal) +# planeCut = vtk.vtkCutter() +# planeCut.SetInputData(dataset) +# planeCut.SetCutFunction(plane) +# planeCut.Update() +# poly = planeCut.GetOutput() +# cutmesh = vedo.mesh.Mesh(poly) +# cutmesh.name = "ProbePlane" +# cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) +# return cutmesh diff --git a/vedo/mesh.py b/vedo/mesh.py index 0e8ebce4..e2692196 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -28,6 +28,53 @@ class MeshVisual: """Class to manage the visual aspects of a ``Maesh`` object.""" + def follow_camera(self, camera=None): + """ + Return an object that will follow camera movements and stay locked to it. + Use `mesh.follow_camera(False)` to disable it. + + A `vtkCamera` object can also be passed. + """ + if camera is False: + try: + self.SetCamera(None) + return self + except AttributeError: + return self + + factor = vtk.vtkFollower() + factor.SetMapper(self.mapper) + factor.SetProperty(self.property) + factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) + factor.SetTexture(self.actor.GetTexture()) + factor.SetOrigin(self.actor.GetOrigin()) + factor.SetScale(self.actor.GetScale()) + factor.SetOrientation(self.actor.GetOrientation()) + factor.SetPosition(self.actor.GetPosition()) + factor.SetUseBounds(self.actor.GetUseBounds()) + factor.PickableOff() + + # factor = vtk.vtkFollower() # not working + # self.mapper = vtk.vtkPolyDataMapper() + # self.mapper.SetInputData(self) + + if isinstance(camera, vtk.vtkCamera): + factor.SetCamera(camera) + else: + plt = vedo.plotter_instance + if plt and plt.renderer and plt.renderer.GetActiveCamera(): + factor.SetCamera(plt.renderer.GetActiveCamera()) + + factor.pipeline = OperationNode( + "Follower", parents=[self], shape="component", c="#d9ed92") + # factor.SetMapper(self.mapper) + # self.actor = factor # not working + # self.actor.Modified() + # self.mapper.Modified() + # return self + return factor + + def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface.""" if value: @@ -1926,34 +1973,6 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): m.pipeline = OperationNode("silhouette", parents=[self]) return m - - def follow_camera(self, camera=None): - """ - Return an object that will follow camera movements and stay locked to it. - Use `mesh.follow_camera(False)` to disable it. - - A `vtkCamera` object can also be passed. - """ - if camera is False: - try: - self.SetCamera(None) - return self - except AttributeError: - return self - - factor = Follower(self, camera) - - if isinstance(camera, vtk.vtkCamera): - factor.SetCamera(camera) - else: - plt = vedo.plotter_instance - if plt and plt.renderer and plt.renderer.GetActiveCamera(): - factor.SetCamera(plt.renderer.GetActiveCamera()) - else: - factor._isfollower = True # postpone to show() call - - return factor - def isobands(self, n=10, vmin=None, vmax=None): """ Return a new `Mesh` representing the isobands of the active scalars. @@ -2778,35 +2797,3 @@ def tetralize( "tetralize", parents=[self], comment=f"#tets = {tmesh.ncells}", c="#e9c46a:#9e2a2b" ) return tmesh - - -#################################################### -class Follower(vedo.base.BaseActor, vtk.vtkFollower): - - def __init__(self, objt, camera=None): - actor = objt.actor - mapper = objt.mapper - - #vtk.vtkFollower.__init__(self) - #vedo.base.BaseActor.__init__(self) - super().__inint__() - - self.name = objt.name - self._isfollower = False - - self.SetMapper(mapper) - - self.SetProperty(objt.property) - self.SetBackfaceProperty(actor.GetBackfaceProperty()) - self.SetTexture(actor.GetTexture()) - - self.SetCamera(camera) - self.SetOrigin(actor.GetOrigin()) - self.SetScale(actor.GetScale()) - self.SetOrientation(actor.GetOrientation()) - self.SetPosition(actor.GetPosition()) - self.SetUseBounds(actor.GetUseBounds()) - - self.PickableOff() - - self.pipeline = OperationNode("Follower", parents=[actor], shape="component", c="#d9ed92") diff --git a/vedo/plotter.py b/vedo/plotter.py index 941f0877..f218bd67 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -834,6 +834,8 @@ def add(self, *objs, at=None): if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.add(ir) + if isinstance(a, vtk.vtkFollower): + a.SetCamera(self.camera) return self From 7e6d8864c1e6d03a74b6ad3828682ecd53b9d727 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 12:31:03 +0200 Subject: [PATCH 024/251] add line_line_distance segment_segment_distance in utils --- vedo/base.py | 6 +++--- vedo/utils.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/vedo/base.py b/vedo/base.py index c4cbcb5d..3a8b1922 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -23,9 +23,9 @@ "BaseActor", "BaseActor2D", "BaseGrid", - "probe_points", - "probe_line", - "probe_plane", + # "probe_points", + # "probe_line", + # "probe_plane", ] diff --git a/vedo/utils.py b/vedo/utils.py index 1d0a9557..92a9fdb5 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -995,6 +995,38 @@ def point_line_distance(p, p1, p2): """ return np.sqrt(vtk.vtkLine.DistanceToLine(p, p1, p2)) +def line_line_distance(p1, p2, q1, q2): + """ + Compute the distance of a line to a line (not the segment) + defined by `p1` and `p2` and `q1` and `q2`. + + Returns the distance, + the closest point on line 1, the closest point on line 2. + Their parametric coords (-inf <= t0, t1 <= inf) are also returned. + """ + closest_pt1 = [0,0,0] + closest_pt2 = [0,0,0] + t1, t2 = 0.0, 0.0 + d = vtk.vtkLine.DistanceBetweenLines( + p1, p2, q1, q2, closest_pt1, closest_pt2, t1, t2) + return np.sqrt(d), closest_pt1, closest_pt2, t1, t2 + +def segment_segment_distance(p1, p2, q1, q2): + """ + Compute the distance of a segment to a segment + defined by `p1` and `p2` and `q1` and `q2`. + + Returns the distance, + the closest point on line 1, the closest point on line 2. + Their parametric coords (-inf <= t0, t1 <= inf) are also returned. + """ + closest_pt1 = [0,0,0] + closest_pt2 = [0,0,0] + t1, t2 = 0.0, 0.0 + d = vtk.vtkLine.DistanceBetweenLineSegments( + p1, p2, q1, q2, closest_pt1, closest_pt2, t1, t2) + return np.sqrt(d), closest_pt1, closest_pt2, t1, t2 + def closest(point, points, n=1, return_ids=False, use_tree=False): """ From b66cb7346666bda5c9e871203cf0399a5b812bf9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 12:54:38 +0200 Subject: [PATCH 025/251] fix transform_with_landmarks --- examples/basic/align2.py | 19 ++++++++++++------- vedo/base.py | 8 ++++++-- vedo/pointcloud.py | 17 ++++++++++------- vedo/vtkclasses.py | 3 ++- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/examples/basic/align2.py b/examples/basic/align2.py index 25abd7e1..42fc9aa8 100644 --- a/examples/basic/align2.py +++ b/examples/basic/align2.py @@ -1,7 +1,9 @@ """Generate two random sets of points and align them using the Iterative Closest Point algorithm""" from random import uniform as u -from vedo import Points, Arrows, Plotter +from vedo import settings, Points, Arrows, Plotter + +settings.default_font = "Calco" N1 = 25 # number of points of first set N2 = 35 # number of points of second set @@ -10,19 +12,22 @@ # Create two sets of random points with different colors pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N1)] pts2 = [(u(0, x)+3, u(0, x)+i/3+2, u(0, x)+i+1) for i in range(N2)] -vpts1 = Points(pts1, r=8, c="blue5") -vpts2 = Points(pts2, r=8, c="red5") +vpts1 = Points(pts1, r=10, c="blue5") +vpts2 = Points(pts2, r=10, c="red5") # Find best alignment between the 2 sets of Points, # e.i. find how to move vpts1 to best match vpts2 aligned_pts1 = vpts1.clone().align_to(vpts2, invert=False) +print(aligned_pts1.transform) +txt = aligned_pts1.transform.__str__() # Create arrows to visualize how the points move during alignment -arrows = Arrows(pts1, aligned_pts1, s=0.7, c='black', alpha=0.2) +arrows = Arrows(pts1, aligned_pts1, s=0.7, c='black') # Create a plotter with two subplots plt = Plotter(N=2, axes=1) -plt.at(0).show(vpts1, vpts2, __doc__) -plt.at(1).show(aligned_pts1, arrows, vpts2, viewup="z") -plt.interactive().close() +plt.at(0).show(__doc__, vpts1, vpts2) +plt.at(1).show(txt, aligned_pts1, arrows, vpts2, viewup="z") +plt.interactive() +plt.close() diff --git a/vedo/base.py b/vedo/base.py index 3a8b1922..00928e43 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -397,17 +397,20 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): """ if isinstance(LT, LinearTransform): tr = LT.T + if LT.is_identity(): + return self if concatenate: self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkTransform, np.ndarray)): + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): LT = LinearTransform(LT) if LT.is_identity(): return self tr = LT.T if concatenate: self.transform.concatenate(LT) - elif isinstance(LT, vtk.vtkThinPlateSplineTransform): + elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): tr = LT + # cannot concatenate here tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) @@ -420,6 +423,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): else: self.ShallowCopy(out) + # reset the locators self.point_locator = None self.cell_locator = None self.line_locator = None diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 4ec8f024..ca6b0874 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2647,6 +2647,12 @@ def transform_with_landmarks( vedo.logger.error(f"source and target have different nr of points {n1} vs {n2}") raise RuntimeError() + if int(rigid) + int(affine) + int(least_squares) > 1: + vedo.logger.error( + "only one of rigid, affine, least_squares can be True at a time" + ) + raise RuntimeError() + lmt = vtk.vtkLandmarkTransform() lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) @@ -2655,12 +2661,10 @@ def transform_with_landmarks( if rigid: lmt.SetModeToRigidBody() lmt.Update() - self.SetUserTransform(lmt) elif affine: lmt.SetModeToAffine() lmt.Update() - self.SetUserTransform(lmt) elif least_squares: cms = source_landmarks.mean(axis=0) @@ -2674,12 +2678,11 @@ def transform_with_landmarks( lmt.Translate(cmt) lmt.Concatenate(M) lmt.Translate(-cms) - self.apply_transform(lmt) - self.transform = lmt - self.point_locator = None - self.cell_locator = None - self.line_locator = None + else: + lmt.Update() + + self.apply_transform(lmt) self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) return self diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index d27e6f3b..ab266bd6 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -102,8 +102,9 @@ from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, + vtkLinearTransform, vtkThinPlateSplineTransform, - vtkTransform + vtkTransform, ) from vtkmodules.vtkFiltersCore import ( From f9cba2759fe5910a8d8f32e2236015d473911d88 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 13:20:44 +0200 Subject: [PATCH 026/251] fix clone line and plane --- docs/changes.md | 2 ++ examples/basic/cells_within_bounds.py | 9 ++++++--- vedo/plotter.py | 6 +----- vedo/shapes.py | 4 ++++ 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 644904b5..b114bf73 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -31,6 +31,8 @@ examples/volumetric/slicer1.py ### Broken Examples ``` +background_image.py + ``` diff --git a/examples/basic/cells_within_bounds.py b/examples/basic/cells_within_bounds.py index fdb0c6d4..e031ab8a 100644 --- a/examples/basic/cells_within_bounds.py +++ b/examples/basic/cells_within_bounds.py @@ -8,7 +8,7 @@ mesh.color('aqua').linewidth(1) # Define the lower and upper bounds for the z-axis -z1, z2 = -1.5, -1.0 +z1, z2 = -1.5, -0.5 # Find the cell IDs of cells within the z-axis bounds ids = mesh.find_cells_in(zbounds=(z1,z2)) @@ -17,8 +17,11 @@ printc('IDs of cells within bounds:\n', ids, c='g') # Create two Plane objects at the specified z-positions -p1 = Plane(normal=(0,0,1), s=[2,2]).z(z1) +p1 = Plane(normal=(0,0,1), s=[2,2]).z(z1).alpha(0.5) p2 = p1.clone().z(z2) +# Set the color of cells within the bounds to red +mesh.cellcolors[ids] = [200,10,10, 255] #RGBA + # Show the mesh, the two planes, the docstring -show(mesh, p1, p2, __doc__, axes=9).close() +show(mesh, p1, p2, __doc__, axes=1).close() diff --git a/vedo/plotter.py b/vedo/plotter.py index f218bd67..56398659 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -4080,7 +4080,7 @@ def _keypress(self, iren, event): elif key == "i": # print info if self.clicked_object: - utils.print_info(self.clicked_object) + utils.print_info(self.clicked_object.data) else: utils.print_info(self) @@ -4090,10 +4090,6 @@ def _keypress(self, iren, event): elif key == "y": if self.clicked_object and self.clicked_object.pipeline: - # self.clicked_object.pipeline = utils.OperationNode( - # "show", parents=[self.clicked_object], - # shape="circle", - # ) self.clicked_object.pipeline.show() if iren: diff --git a/vedo/shapes.py b/vedo/shapes.py index 13aca8ef..d83f7d31 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -536,6 +536,8 @@ def clone(self): prop.DeepCopy(self.property) ln = Line(self) + ln.DeepCopy(self) + ln.transform = self.transform ln.actor.SetProperty(prop) ln.property = prop ln.name = name @@ -3132,6 +3134,8 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra def clone(self): newplane = Plane() + newplane.DeepCopy(self) + newplane.transform = self.transform prop = vtk.vtkProperty() prop.DeepCopy(self.property) newplane.actor.SetProperty(prop) From a5a4cd60290120132f38e42143a26be92fcec787 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 13:32:48 +0200 Subject: [PATCH 027/251] change name glyphs_arrows.py --- docs/changes.md | 4 +++ examples/basic/extrude.py | 4 +-- .../basic/{glyphs_arrows.py => glyphs2.py} | 0 vedo/mesh.py | 26 +++++++++---------- vedo/shapes.py | 10 +++---- 5 files changed, 24 insertions(+), 20 deletions(-) rename examples/basic/{glyphs_arrows.py => glyphs2.py} (100%) diff --git a/docs/changes.md b/docs/changes.md index b114bf73..21e2a4c3 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -32,6 +32,10 @@ examples/volumetric/slicer1.py ### Broken Examples ``` background_image.py +cut_interactive.py +glyphs1.py + + ``` diff --git a/examples/basic/extrude.py b/examples/basic/extrude.py index eb9b17c0..36e175cf 100644 --- a/examples/basic/extrude.py +++ b/examples/basic/extrude.py @@ -2,11 +2,11 @@ from vedo import Star, show # Create a yellow star and rotate it around the x-axis -star = Star().color('y').rotate_x(10) +star = Star().color('y') # Extrude the star along the z-axis, with a shift of 1, # a rotation of 10 degrees, a decrease in radius of 0.2, -epol = star.extrude(zshift=1, rotation=10, dR=-0.2, cap=False, res=1) +epol = star.extrude(zshift=1, rotation=10, dr=-0.2, cap=False, res=1) # Set the back color of the extruded polygon to violet epol.bc('violet').lighting("default") diff --git a/examples/basic/glyphs_arrows.py b/examples/basic/glyphs2.py similarity index 100% rename from examples/basic/glyphs_arrows.py rename to examples/basic/glyphs2.py diff --git a/vedo/mesh.py b/vedo/mesh.py index e2692196..aec75b31 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -611,7 +611,7 @@ def texture( elif isinstance(tname, vedo.Picture): tu = vtk.vtkTexture() - outimg = tname.inputdata() + outimg = tname elif is_sequence(tname): tu = vtk.vtkTexture() @@ -1699,7 +1699,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): if isinstance(pts, Points): varr.SetName("IsInside") - pts.inputdata().GetPointData().AddArray(varr) + pts.GetPointData().AddArray(varr) if return_ids: return ids @@ -1709,7 +1709,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): pcl.pipeline = OperationNode( "inside_points", parents=[self, ptsa], - comment=f"#pts {pcl.inputdata().GetNumberOfPoints()}" + comment=f"#pts {pcl.GetNumberOfPoints()}" ) return pcl @@ -1802,7 +1802,7 @@ def boundaries( "boundaries", parents=[self], shape="octagon", - comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", + comment=f"#pts {msh.GetNumberOfPoints()}", ) return msh @@ -2071,7 +2071,7 @@ def isolines(self, n=10, vmin=None, vmax=None): msh.pipeline = OperationNode("isolines", parents=[self]) return msh - def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): + def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): """ Sweep a polygonal data creating a "skirt" from free edges and lines, and lines from vertices. The input dataset is swept around the z-axis to create new polygonal primitives. @@ -2121,7 +2121,7 @@ def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): rf.SetCapping(cap) rf.SetAngle(rotation) rf.SetTranslation(zshift) - rf.SetDeltaRadius(dR) + rf.SetDeltaRadius(dr) rf.Update() m = Mesh(rf.GetOutput(), c=self.c(), alpha=self.alpha()) @@ -2134,7 +2134,7 @@ def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): m.pipeline = OperationNode( "extrude", parents=[self], - comment=f"#pts {m.inputdata().GetNumberOfPoints()}" + comment=f"#pts {m.GetNumberOfPoints()}" ) return m @@ -2214,7 +2214,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T l[0].pipeline = OperationNode( f"split mesh {i}", parents=[self], - comment=f"#pts {l[0].inputdata().GetNumberOfPoints()}", + comment=f"#pts {l[0].GetNumberOfPoints()}", ) return blist @@ -2246,7 +2246,7 @@ def extract_largest_region(self): m.pipeline = OperationNode( "extract_largest_region", parents=[self], - comment=f"#pts {m.inputdata().GetNumberOfPoints()}" + comment=f"#pts {m.GetNumberOfPoints()}" ) return m @@ -2294,7 +2294,7 @@ def boolean(self, operation, mesh2, method=0, tol=None): "boolean " + operation, parents=[self, mesh2], shape="cylinder", - comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", + comment=f"#pts {msh.GetNumberOfPoints()}", ) return msh @@ -2403,7 +2403,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], - comment=f"#pts {msh.inputdata().GetNumberOfPoints()}" + comment=f"#pts {msh.GetNumberOfPoints()}" ) return msh @@ -2439,7 +2439,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): # msh.pipeline = OperationNode( # "intersect_with_multiplanes", # parents=[self], - # comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", + # comment=f"#pts {msh.GetNumberOfPoints()}", # ) # return msh @@ -2481,7 +2481,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): msh.pipeline = OperationNode( "collide_with", parents=[self, mesh2], - comment=f"#pts {msh.inputdata().GetNumberOfPoints()}" + comment=f"#pts {msh.GetNumberOfPoints()}" ) return msh diff --git a/vedo/shapes.py b/vedo/shapes.py index d83f7d31..bd779660 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -191,8 +191,8 @@ def __init__( glyph mesh is colored based on the vector size Examples: - - [glyphs1.py](]https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs1.py) - - [glyphs_arrows.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs_arrows.py) + - [glyphs1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs1.py) + - [glyphs2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs2.py) ![](https://vedo.embl.es/images/basic/glyphs.png) """ @@ -1557,7 +1557,7 @@ def StreamLines( else: grid = domain elif isinstance(domain, vedo.BaseVolume): - grid = domain.inputdata() + grid = domain else: grid = domain @@ -2087,7 +2087,7 @@ def __init__( set arrow resolution Examples: - - [glyphs_arrows.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs_arrows.py) + - [glyphs2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs2.py) ![](https://user-images.githubusercontent.com/32848391/55897850-a1a0da80-5bc1-11e9-81e0-004c8f396b43.jpg) """ @@ -2465,7 +2465,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al ![](https://vedo.embl.es/images/basic/extrude.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=n, endpoint=False) - x, y = utils.pol2cart(np.ones_like(t) * r2, t) + x, y = pol2cart(np.ones_like(t) * r2, t) pts = np.c_[x, y, np.zeros_like(x)] apts = [] From 2a2d4198b040779a20979bf831cb2a001ba46c2d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 13:44:35 +0200 Subject: [PATCH 028/251] fix hoverlegend --- examples/basic/hover_legend.py | 9 ++--- vedo/plotter.py | 60 +++++++++++++++++----------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/examples/basic/hover_legend.py b/examples/basic/hover_legend.py index 1550a812..4173723b 100644 --- a/examples/basic/hover_legend.py +++ b/examples/basic/hover_legend.py @@ -9,16 +9,17 @@ mesh.celldata['MYCELLARRAY'] = mesh.cell_centers()[:,1] # Create more objects -sph = Sphere(r=0.02, pos=(-0.1,0.05,0.05)) +sph = Sphere(pos=(-0.1,0.05,0.05), r=0.02) cub = Cube().alpha(0.5).linewidth(2) -pts = Points(cub.points(), r=50, c='v') +pts = Points(cub).c("violet").point_size(50) pts.name = 'The cube vertices' # can give a name to any objects # Create an instance of the plotter window -plt = Plotter(N=2, axes=1, sharecam=False) +plt = Plotter(N=2, sharecam=False) # Add a 2D hover legend to both renderers and show: plt.at(0).add_hover_legend().show(mesh, sph, __doc__) plt.at(1).add_hover_legend().show(cub, pts) -plt.interactive().close() +plt.interactive() +plt.close() diff --git a/vedo/plotter.py b/vedo/plotter.py index 56398659..e68f9c28 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2073,15 +2073,15 @@ def add_hover_legend( at = self.renderers.index(self.renderer) def _legfunc(evt): - if not evt.actor or not self.renderer or at != evt.at: + if not evt.object or not self.renderer or at != evt.at: if hoverlegend.mapper.GetInput(): # clear and return hoverlegend.mapper.SetInput("") - self.interactor.Render() + self.render() return if use_info: - if hasattr(evt.actor, "info"): - t = str(evt.actor.info) + if hasattr(evt.object, "info"): + t = str(evt.object.info) else: return else: @@ -2090,8 +2090,8 @@ def _legfunc(evt): tp = "Mesh " elif evt.isPoints: tp = "Points " - # elif evt.isVolume: - # tp = "Volume " + elif evt.isVolume: + tp = "Volume " elif evt.isPicture: tp = "Pict " elif evt.isAssembly: @@ -2100,32 +2100,32 @@ def _legfunc(evt): return if evt.isAssembly: - if not evt.actor.name: - t += f"Assembly object of {len(evt.actor.unpack())} parts\n" + if not evt.object.name: + t += f"Assembly object of {len(evt.object.unpack())} parts\n" else: - t += f"Assembly name: {evt.actor.name} ({len(evt.actor.unpack())} parts)\n" + t += f"Assembly name: {evt.object.name} ({len(evt.object.unpack())} parts)\n" else: - if evt.actor.name: + if evt.object.name: t += f"{tp}name" if evt.isPoints: t += " " if evt.isMesh: t += " " - t += f": {evt.actor.name[:maxlength]}".ljust(maxlength) + "\n" + t += f": {evt.object.name[:maxlength]}".ljust(maxlength) + "\n" - if evt.actor.filename: + if evt.object.filename: t += f"{tp}filename: " - t += f"{os.path.basename(evt.actor.filename[-maxlength:])}".ljust(maxlength) + t += f"{os.path.basename(evt.object.filename[-maxlength:])}".ljust(maxlength) t += "\n" - if not evt.actor.file_size: - evt.actor.file_size, evt.actor.created = vedo.file_io.file_info(evt.actor.filename) - if evt.actor.file_size: + if not evt.object.file_size: + evt.object.file_size, evt.object.created = vedo.file_io.file_info(evt.object.filename) + if evt.object.file_size: t += " : " - sz, created = evt.actor.file_size, evt.actor.created + sz, created = evt.object.file_size, evt.object.created t += f"{created[4:-5]} ({sz})" + "\n" if evt.isPoints: - indata = evt.actor.polydata(False) + indata = evt.object if indata.GetNumberOfPoints(): t += ( f"#points/cells: {indata.GetNumberOfPoints()}" @@ -2135,22 +2135,22 @@ def _legfunc(evt): cdata = indata.GetCellData() if pdata.GetScalars() and pdata.GetScalars().GetName(): t += f"\nPoint array : {pdata.GetScalars().GetName()}" - if pdata.GetScalars().GetName() == evt.actor.mapper.GetArrayName(): + if pdata.GetScalars().GetName() == evt.object.mapper.GetArrayName(): t += " *" if cdata.GetScalars() and cdata.GetScalars().GetName(): t += f"\nCell array : {cdata.GetScalars().GetName()}" - if cdata.GetScalars().GetName() == evt.actor.mapper.GetArrayName(): + if cdata.GetScalars().GetName() == evt.object.mapper.GetArrayName(): t += " *" if evt.isPicture: - t = f"{os.path.basename(evt.actor.filename[:maxlength+10])}".ljust(maxlength+10) - t += f"\nImage shape: {evt.actor.shape}" + t = f"{os.path.basename(evt.object.filename[:maxlength+10])}".ljust(maxlength+10) + t += f"\nImage shape: {evt.object.shape}" pcol = self.color_picker(evt.picked2d) t += f"\nPixel color: {vedo.colors.rgb2hex(pcol/255)} {pcol}" # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): - actcol = evt.actor.property.GetColor() + actcol = evt.object.property.GetColor() if hoverlegend.mapper.GetTextProperty().GetBackgroundColor() != actcol: hoverlegend.mapper.GetTextProperty().SetBackgroundColor(actcol) @@ -2357,12 +2357,12 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.speed2d = np.sqrt(dx * dx + dy * dy) event.delta3d = delta3d event.speed3d = np.sqrt(np.dot(delta3d, delta3d)) - event.isPoints = isinstance(actor, vedo.Points) - event.isMesh = isinstance(actor, vedo.Mesh) - event.isAssembly = isinstance(actor, vedo.Assembly) - event.isVolume = isinstance(actor, vedo.Volume) - event.isPicture = isinstance(actor, vedo.Picture) - event.isActor2D = isinstance(actor, vtk.vtkActor2D) + event.isPoints = isinstance(event.object, vedo.Points) + event.isMesh = isinstance(event.object, vedo.Mesh) + event.isAssembly = isinstance(event.object, vedo.Assembly) + event.isVolume = isinstance(event.object, vedo.Volume) + event.isPicture = isinstance(event.object, vedo.Picture) + event.isActor2D = isinstance(event.object, vtk.vtkActor2D) return event @@ -2420,7 +2420,7 @@ def add_callback(self, event_name, func, priority=0.0, enable_picking=True): def func(evt): # this function is called every time the mouse moves # (evt is a dotted dictionary) - if not evt.actor: + if not evt.object: return # no hit, return print("point coords =", evt.picked3d) # print("full event dump:", evt) From 9ca0981f0f4ccb13c79d44b7c2ad90abcbb29d80 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 13:58:56 +0200 Subject: [PATCH 029/251] fix legendbox.py --- examples/basic/legendbox.py | 17 ++++++----------- vedo/addons.py | 13 +++++-------- vedo/plotter.py | 2 +- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/examples/basic/legendbox.py b/examples/basic/legendbox.py index 80781b6b..4b517a71 100644 --- a/examples/basic/legendbox.py +++ b/examples/basic/legendbox.py @@ -4,19 +4,14 @@ s = Sphere() c = Cube().x(2) e = Ellipsoid().x(4) -h = Hyperboloid().x(6).legend('The description for\nthis one is quite long') -lb = LegendBox([s,c,e,h], width=0.3, height=0.4, markers='s').font("Kanopus") +h = Hyperboloid().x(6) +h.legend('The description for\nthis one is quite long') -cam = dict( # press C in window to get these numbers - position=(10.4414, -7.62994, 4.18818), - focal_point=(4.10196, 0.335224, -0.148651), - viewup=(-0.252830, 0.299657, 0.919936), - distance=11.0653, - clipping_range=(3.69605, 21.2641), -) +lbox = LegendBox([s,c,e,h], width=0.3, height=0.4, markers='s') +lbox.font("Kanopus") -show(s, c, e, h, lb, __doc__, - axes=1, bg='lightyellow', bg2='white', size=(1400,800), camera=cam +show(s, c, e, h, lbox, __doc__, + axes=1, bg='lightyellow', bg2='white', size=(1200,800), viewup='z' ).close() diff --git a/vedo/addons.py b/vedo/addons.py index 8abf65e1..5d9884f0 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -274,9 +274,6 @@ def __init__( ename = "" else: ename = str(e.info["legend"]) - - if not isinstance(e, vtk.vtkActor): - ename = "" if ename: n += 1 texts.append(ename) @@ -286,7 +283,7 @@ def __init__( return self.ScalarVisibilityOff() - self.actor.PickableOff() + self.PickableOff() self.SetPadding(padding) self.property.ShadowOff() @@ -307,13 +304,13 @@ def __init__( continue e = entries[i] if c is None: - col = e.GetProperty().GetColor() + col = e.property.GetColor() if col == (1, 1, 1): col = (0.2, 0.2, 0.2) else: col = get_color(c) if markers is None: # default - poly = e.inputdata() + poly = e else: marker = markers[i] if utils.is_sequence(markers) else markers if isinstance(marker, vedo.Points): @@ -831,9 +828,9 @@ def ScalarBar( """ if isinstance(obj, Points): - vtkscalars = obj.inputdata().GetPointData().GetScalars() + vtkscalars = obj.GetPointData().GetScalars() if vtkscalars is None: - vtkscalars = obj.inputdata().GetCellData().GetScalars() + vtkscalars = obj.GetCellData().GetScalars() if not vtkscalars: return None lut = vtkscalars.GetLookupTable() diff --git a/vedo/plotter.py b/vedo/plotter.py index e68f9c28..da63de67 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2774,7 +2774,7 @@ def _scan_input_return_acts(self, wannabe_acts): # scanned_acts.append(out) scanned_acts.append(vedo.shapes.Text2D(a)) - elif isinstance(a, vtk.vtkImageActor): + elif isinstance(a, (vtk.vtkImageActor, vtkLegendBoxActor)): scanned_acts.append(a) elif isinstance(a, vtk.vtkBillboardTextActor3D): From 696525c95677cefed677dd24a9ae15ec9e03985e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 18:05:13 +0200 Subject: [PATCH 030/251] fix reorient() --- docs/changes.md | 2 +- examples/basic/mesh_coloring.py | 9 +- examples/basic/mesh_custom.py | 12 +-- examples/pyplot/fit_circle.py | 14 ++-- examples/pyplot/goniometer.py | 6 +- examples/simulations/gyroscope2.py | 5 +- vedo/addons.py | 52 +++++++----- vedo/base.py | 25 +++++- vedo/plotter.py | 56 ++++++------- vedo/transformations.py | 128 +++++++++++++---------------- 10 files changed, 160 insertions(+), 149 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 21e2a4c3..3283a4b7 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -34,7 +34,7 @@ examples/volumetric/slicer1.py background_image.py cut_interactive.py glyphs1.py - +lights.py ``` diff --git a/examples/basic/mesh_coloring.py b/examples/basic/mesh_coloring.py index 32d15cd0..6831ca62 100644 --- a/examples/basic/mesh_coloring.py +++ b/examples/basic/mesh_coloring.py @@ -28,8 +28,9 @@ man3.cmap("afmhot", scals, on='cells') # add a fancier 3D scalar bar embedded in the scene -man3.add_scalarbar3d(size=[None,3]) -man3.scalarbar.rotate_x(90).y(0.2) -plt.at(2).show(man3, "mesh.cmap(on='cells')") +man3.add_scalarbar3d(size=[0.2,3]) +man3.scalarbar.rotate_x(90).shift(0,-2,-0.5) -plt.interactive().close() +plt.at(2).show(man3, "mesh.cmap(on='cells')") +plt.interactive() +plt.close() diff --git a/examples/basic/mesh_custom.py b/examples/basic/mesh_custom.py index 9a166ae8..c7613744 100644 --- a/examples/basic/mesh_custom.py +++ b/examples/basic/mesh_custom.py @@ -2,11 +2,7 @@ of a Mesh with various color map definitions""" from vedo import * -# "depth peeling" may improve the rendering of transparent objects -settings.use_depth_peeling = True -settings.multi_samples = 0 - -man = Mesh(dataurl+"man.vtk") +man = Mesh(dataurl + "man.vtk") # let the scalar be the z coordinate of the mesh vertices scals = man.points()[:, 2] @@ -21,9 +17,9 @@ mycmap = ["darkblue", "magenta", (1, 1, 0)] alphas = [0.8, 0.6, 0.2] - # - OR by generating a palette between 2 colors: - #mycmap = makePalette('pink', 'green', N=500, hsv=True) - #alphas = 1 +# - OR by generating a palette between 2 colors: +#mycmap = makePalette('pink', 'green', N=500, hsv=True) +#alphas = 1 man.cmap(mycmap, scals, alpha=alphas).add_scalarbar() diff --git a/examples/pyplot/fit_circle.py b/examples/pyplot/fit_circle.py index b1033475..4afea353 100644 --- a/examples/pyplot/fit_circle.py +++ b/examples/pyplot/fit_circle.py @@ -2,10 +2,13 @@ the signed curvature of a line""" from vedo import * -shape = Spline([[1.0, 2.0, -1.0], - [1.5, 0.0, 0.4], - [2.0, 4.0, 0.5], - [4.0, 1.5, -0.3]], res=200) +shape = Spline([ + [1.0, 2.0, -1.0], + [1.5, 0.0, 0.4], + [2.0, 4.0, 0.5], + [4.0, 1.5, -0.3]], + res=200, +) n = 5 # nr. of points to use for the fit npt = shape.npoints @@ -19,7 +22,8 @@ z = cross(pts[-1]-pts[0], center-pts[0])[2] curvs[i] = sqrt(1/R) * z/abs(z) if R < 0.75: - circle = Circle(center, r=R).wireframe().orientation(normal) + circle = Circle(center, r=R).wireframe() + circle.reorient(normal) circles.append(circle) fitpts.append(center) diff --git a/examples/pyplot/goniometer.py b/examples/pyplot/goniometer.py index f79c6bf1..1c781466 100644 --- a/examples/pyplot/goniometer.py +++ b/examples/pyplot/goniometer.py @@ -14,16 +14,16 @@ + "~μm^3", s=0.1, ) - fp.color("r3").scale(0.7) # measure the angle formed by 3 points gon = Goniometer( - [-0.5, 1, 2], [2.5, 2, 2], [-0.5, 3, 3], prefix=":alpha_c =~", lw=2, s=0.8 + [-0.5, 1, 2], [2.5, 2, 2], [-0.5, 3, 3], + prefix=":alpha_c =~", lw=2, s=0.8 ) # show distance of 2 points -rul = Ruler( +rul = Ruler3D( (-0.5, 2, 1.9), (2.5, 2, 2.9), prefix="L_x =", diff --git a/examples/simulations/gyroscope2.py b/examples/simulations/gyroscope2.py index 0cae1660..d468f315 100644 --- a/examples/simulations/gyroscope2.py +++ b/examples/simulations/gyroscope2.py @@ -58,8 +58,9 @@ def loop_func(event): gaxis = (Lshaft + 0.03) * vector(st * sp, ct, st * cp) # set orientation along gaxis and rotate it around its axis by psidot*t degrees - gyro.orientation(gaxis, rotation=psidot * t, rad=True) - plt.add(Point(gaxis, r=3, c="red4")).render() + gyro.reorient(None, gaxis, rotation=psidot * t, rad=True) + plt.add(Point(gaxis, r=3, c="red4")) + plt.render() t = 0 plt.add_callback("timer", loop_func) diff --git a/vedo/addons.py b/vedo/addons.py index 5d9884f0..14a4e6ae 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -36,9 +36,9 @@ "Light", "Axes", "RendererFrame", - "Ruler", - "RulerAxes", "Ruler2D", + "Ruler3D", + "RulerAxes", "DistanceTool", "SplineTool", "Goniometer", @@ -695,9 +695,9 @@ def Goniometer( ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ - if isinstance(p1, Points): p1 = p1.GetPosition() - if isinstance(p2, Points): p2 = p2.GetPosition() - if isinstance(p3, Points): p3 = p3.GetPosition() + if isinstance(p1, Points): p1 = p1.pos() + if isinstance(p2, Points): p2 = p2.pos() + if isinstance(p3, Points): p3 = p3.pos() if len(p1)==2: p1=[p1[0], p1[1], 0.0] if len(p2)==2: p2=[p2[0], p2[1], 0.0] if len(p3)==2: p3=[p3[0], p3[1], 0.0] @@ -725,13 +725,14 @@ def Goniometer( lb = shapes.Text3D( prefix + utils.precision(angle, precision) + "º", - s=r / 12 * s, + s=r/12 * s, font=font, italic=italic, justify="center", ) cr = np.cross(va, vb) - lb.pos(p2 + vc * r / 1.75).orientation(cr * np.sign(cr[2]), rotation=rotation) + lb.pos(p2 + vc * r / 1.75) + lb.reorient(None, cr * np.sign(cr[2]), rotation=rotation) lb.c(c).bc("tomato").lighting("off") acts.append(lb) @@ -744,6 +745,7 @@ def Goniometer( acts.append(msh) asse = Assembly(acts) + asse.name = "Goniometer" return asse @@ -2253,7 +2255,7 @@ def compute_visible_bounds(objs=None): ##################################################################### -def Ruler( +def Ruler3D( p1, p2, units_scale=1, @@ -2303,23 +2305,29 @@ def Ruler( ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ + if units_scale != 1.0 and units == "": raise ValueError( "When setting 'units_scale' to a value other than 1, " + "a 'units' arguments must be specified." ) - if isinstance(p1, Points): - p1 = p1.GetPosition() - if isinstance(p2, Points): - p2 = p2.GetPosition() + try: + p1 = p1.pos() + except AttributeError: + pass + + try: + p2 = p2.pos() + except AttributeError: + pass if len(p1) == 2: p1 = [p1[0], p1[1], 0.0] if len(p2) == 2: p2 = [p2[0], p2[1], 0.0] - p1, p2 = np.array(p1), np.array(p2) + p1, p2 = np.asarray(p1), np.asarray(p2) q1, q2 = [0, 0, 0], [utils.mag(p2 - p1), 0, 0] q1, q2 = np.array(q1), np.array(q2) v = q2 - q1 @@ -2360,13 +2368,15 @@ def Ruler( c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) acts = [lb, lc1, lc2, c1, c2, ml1, ml2] - macts = merge(acts).pos(p1).c(c).alpha(alpha) + macts = merge(acts) + macts.c(c).alpha(alpha).lw(lw) macts.property.LightingOff() - macts.property.SetLineWidth(lw) macts.actor.UseBoundsOff() - macts.base = q1 - macts.top = q2 - macts.orientation(p2 - p1, rotation=axis_rotation).bc("t").pickable(False) + # macts.base = q1 + # macts.top = q2 + # print(p2,p1, p2-p1) + macts.reorient(q2-q1, p2 - p1, rotation=axis_rotation) + macts.bc("tomato").pickable(False) return macts @@ -2440,7 +2450,7 @@ def RulerAxes( acts, rx, ry = [], None, None if xtitle is not None and (x1 - x0) / d > 0.1: - rx = Ruler( + rx = Ruler3D( [x0, y0 - dx, z0], [x1, y0 - dx, z0], s=s, @@ -2456,7 +2466,7 @@ def RulerAxes( ) acts.append(rx) if ytitle is not None and (y1 - y0) / d > 0.1: - ry = Ruler( + ry = Ruler3D( [x1 + dy, y0, z0], [x1 + dy, y1, z0], s=s, @@ -2472,7 +2482,7 @@ def RulerAxes( ) acts.append(ry) if ztitle is not None and (z1 - z0) / d > 0.1: - rz = Ruler( + rz = Ruler3D( [x0 - dy, y0 + dz, z0], [x0 - dy, y0 + dz, z1], s=s, diff --git a/vedo/base.py b/vedo/base.py index 00928e43..75ec34d7 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -530,10 +530,29 @@ def rotate_z(self, angle, rad=False, around=None): LT = LinearTransform().rotate_z(angle, rad, around) return self.apply_transform(LT) - #TODO - def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): - return self + def reorient(self, + newaxis, + initaxis=None, + around=(0,0,0), + rotation=0, + rad=False, + xyplane=True, + ): + """ + Reorient the object to point to a new direction from an initial one. + If `initaxis` is None, the object will be assumed in its "default" orientation. + If `xyplane` is True, the object will be rotated to lie on the xy plane. + + Use `rotation` to first rotate the object around its `initaxis`. + """ + if initaxis is None: + initaxis = np.asarray(self.top) - self.base + + q = self.transform.position + LT = LinearTransform() + LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) + return self.apply_transform(LT) def scale(self, s=None, reset=False, origin=True): """ diff --git a/vedo/plotter.py b/vedo/plotter.py index da63de67..76fa9816 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2721,13 +2721,7 @@ def _scan_input_return_acts(self, wannabe_acts): if a is None: continue - elif isinstance(a, vtk.vtkActor): - scanned_acts.append(a) - - elif isinstance(a, vtk.vtkActor2D): - scanned_acts.append(a) - - elif isinstance(a, vtk.vtkAssembly): + elif isinstance(a, (vtk.vtkActor, vtk.vtkActor2D)): scanned_acts.append(a) elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): @@ -2752,32 +2746,32 @@ def _scan_input_return_acts(self, wannabe_acts): # scanned_acts.append(a) scanned_acts.append(a.actor) - elif isinstance(a, vtk.vtkVolume): # order matters! dont move above TetMesh - scanned_acts.append(a) - elif isinstance(a, str): # assume a 2D comment was given - # changed = False # check if one already exists so to just update text - # if self.renderer: # might be jupyter - # acs = self.renderer.GetActors2D() - # acs.InitTraversal() - # for i in range(acs.GetNumberOfItems()): - # act = acs.GetNextItem() - # if isinstance(act, vedo.shapes.Text2D): - # aposx, aposy = act.GetPosition() - # if aposx < 0.01 and aposy > 0.99: # "top-left" - # act.text(a) # update content! no appending nada - # changed = True - # break - # if not changed: - # out = vedo.shapes.Text2D(a) # append a new one - # scanned_acts.append(out) - scanned_acts.append(vedo.shapes.Text2D(a)) - - elif isinstance(a, (vtk.vtkImageActor, vtkLegendBoxActor)): - scanned_acts.append(a) - - elif isinstance(a, vtk.vtkBillboardTextActor3D): + changed = False # check if one already exists so to just update text + if self.renderer: # might be jupyter + acs = self.renderer.GetActors2D() + acs.InitTraversal() + for i in range(acs.GetNumberOfItems()): + act = acs.GetNextItem() + if isinstance(act, vedo.shapes.Text2D): + aposx, aposy = act.GetPosition() + if aposx < 0.01 and aposy > 0.99: # "top-left" + act.text(a) # update content! no appending nada + changed = True + break + if not changed: + out = vedo.shapes.Text2D(a) # append a new one + scanned_acts.append(out) + # scanned_acts.append(vedo.shapes.Text2D(a)) # naive version + + elif isinstance(a, ( + vtk.vtkAssembly, + vtk.vtkVolume, # order matters! dont move above TetMesh + vtk.vtkImageActor, + vtk.vtkLegendBoxActor, + vtk.vtkBillboardTextActor3D, + )): scanned_acts.append(a) elif isinstance(a, vtk.vtkLight): diff --git a/vedo/transformations.py b/vedo/transformations.py index 5f04ed48..d859e1be 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -338,79 +338,65 @@ def matrix3x3(self): return np.array(M) - # TODO: implement this - def set_orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): - # """ - # Set/Get object orientation. - - # Arguments: - # rotation : (float) - # rotate object around newaxis. - # concatenate : (bool) - # concatenate the orientation operation with the previous existing transform (if any) - # xyplane : (bool) - # make an extra rotation to keep the object aligned to the xy-plane - # rad : (bool) - # set to True if angle is expressed in radians. - - # Example: - # ```python - # from vedo import * - # center = np.array([581/2,723/2,0]) - # objs = [] - # for a in np.linspace(0, 6.28, 7): - # v = vector(cos(a), sin(a), 0)*1000 - # pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) - # pic.orientation(v, xyplane=True) - # pic.origin(center) - # pic.pos(v - center) - # objs += [pic, Arrow(v, v+v)] - # show(objs, Point(), axes=1).close() - # ``` - # ![](https://vedo.embl.es/images/feats/orientation.png) - - # Examples: - # - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) - - # ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) - # """ - # if self.top is None or self.base is None: - # initaxis = (0, 0, 1) - # else: - # initaxis = utils.versor(self.top - self.base) - - # newaxis = utils.versor(newaxis) - # p = np.array(self.GetPosition()) - # crossvec = np.cross(initaxis, newaxis) - - # angleth = np.arccos(np.dot(initaxis, newaxis)) - - # T = vtk.vtkTransform() - # if concatenate: - # try: - # M = self.GetMatrix() - # T.SetMatrix(M) - # except: - # pass - # T.PostMultiply() - # T.Translate(-p) - # if rotation: - # if rad: - # rotation *= 180.0 / np.pi - # T.RotateWXYZ(rotation, initaxis) - # if xyplane: - # angleph = np.arctan2(newaxis[1], newaxis[0]) - # T.RotateWXYZ(np.rad2deg(angleph + angleth), initaxis) # compensation - # T.RotateWXYZ(np.rad2deg(angleth), crossvec) - # T.Translate(p) - - # self.actor.SetOrientation(T.GetOrientation()) - - # self.point_locator = None - # self.cell_locator = None - return self + def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyplane=True): + """ + Set/Get object orientation. + + Arguments: + rotation : (float) + rotate object around newaxis. + concatenate : (bool) + concatenate the orientation operation with the previous existing transform (if any) + rad : (bool) + set to True if angle is expressed in radians. + xyplane : (bool) + make an extra rotation to keep the object aligned to the xy-plane + + Example: + ```python + from vedo import * + center = np.array([581/2,723/2,0]) + objs = [] + for a in np.linspace(0, 6.28, 7): + v = vector(cos(a), sin(a), 0)*1000 + pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) + pic.reorient(v) + pic.pos(v - center) + objs += [pic, Arrow(v, v+v)] + show(objs, Point(), axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/orientation.png) + Examples: + - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) + ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) + """ + newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) + initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) + + if not np.any(initaxis + newaxis): + print("Warning: in reorient() initaxis and newaxis are parallel") + newaxis += np.array([0.0000001, 0.0000002, 0]) + angleth = np.pi + else: + angleth = np.arccos(np.dot(initaxis, newaxis)) + crossvec = np.cross(initaxis, newaxis) + + p = np.asarray(around) + self.T.Translate(-p) + if rotation: + if rad: + rotation = np.rad2deg(rotation) + self.T.RotateWXYZ(rotation, initaxis) + + self.T.RotateWXYZ(np.rad2deg(angleth), crossvec) + + if xyplane: + self.T.RotateWXYZ(self.orientation[0]*1.4142, newaxis) + + self.T.Translate(p) + return self ######################################################################## # 2d ###### From 217c367a487e134379800b0aabcf86599a5c4f18 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 18:20:15 +0200 Subject: [PATCH 031/251] fix reorient() 2 --- vedo/transformations.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vedo/transformations.py b/vedo/transformations.py index d859e1be..28038164 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -372,9 +372,12 @@ def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyp ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) """ - newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) + newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) + if not np.any(initaxis - newaxis): + return self + if not np.any(initaxis + newaxis): print("Warning: in reorient() initaxis and newaxis are parallel") newaxis += np.array([0.0000001, 0.0000002, 0]) @@ -393,7 +396,7 @@ def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyp self.T.RotateWXYZ(np.rad2deg(angleth), crossvec) if xyplane: - self.T.RotateWXYZ(self.orientation[0]*1.4142, newaxis) + self.T.RotateWXYZ(-self.orientation[0]*1.4142, newaxis) self.T.Translate(p) return self From 5b4280095b44696eab665ba28643c8e768eac79f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 18:29:19 +0200 Subject: [PATCH 032/251] fix cyl2cart etc --- vedo/plotter.py | 5 +++-- vedo/pyplot.py | 13 +++++++------ vedo/shapes.py | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 76fa9816..896a2789 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -12,6 +12,7 @@ import vtkmodules.all as vtk import vedo +from vedo import transformations from vedo import settings from vedo import utils from vedo import backends @@ -3973,12 +3974,12 @@ def _keypress(self, iren, event): else: cpos = utils.vector(self._extralight.GetPosition()) x, y, z = self._extralight.GetPosition() - cm - r, th, ph = utils.cart2spher(x, y, z) + r, th, ph = transformations.cart2spher(x, y, z) th += 0.2 if th > np.pi: th = np.random.random() * np.pi / 2 ph += 0.3 - cpos = utils.spher2cart(r, th, ph) + cm + cpos = transformations.spher2cart(r, th, ph) + cm self._extralight.SetPosition(cpos) self.window.Render() diff --git a/vedo/pyplot.py b/vedo/pyplot.py index f0ca7a62..46791663 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -10,6 +10,7 @@ import vedo from vedo import settings +from vedo.transformations import cart2spher, spher2cart from vedo import addons from vedo import colors from vedo import utils @@ -2981,7 +2982,7 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha sg.alpha(alpha).c(c).wireframe() cgpts = sg.points() - r, theta, phi = utils.cart2spher(*cgpts.T) + r, theta, phi = cart2spher(*cgpts.T) newr, inans = [], [] for i in range(len(r)): @@ -3003,10 +3004,10 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha nanpts = [] if inans: - redpts = utils.spher2cart(newr[inans], theta[inans], phi[inans]) + redpts = spher2cart(newr[inans], theta[inans], phi[inans]) nanpts.append(shapes.Points(redpts, r=4, c="r")) - pts = utils.spher2cart(newr, theta, phi) + pts = spher2cart(newr, theta, phi) ssurf = sg.clone().points(pts) if inans: @@ -3331,7 +3332,7 @@ def _histogram_polar( def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", gap=0.1): - x, y, z = utils.spher2cart(np.ones_like(thetavalues) * 1.1, thetavalues, phivalues) + x, y, z = spher2cart(np.ones_like(thetavalues) * 1.1, thetavalues, phivalues) ptsvals = np.c_[x, y, z] sg = shapes.Sphere(res=res, quads=True).shrink(1 - gap) @@ -3351,8 +3352,8 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", continue fs = sgfaces[cell] pts = sgpts[fs] - _, t1, p1 = utils.cart2spher(pts[:, 0], pts[:, 1], pts[:, 2]) - x, y, z = utils.spher2cart(1 + cn, t1, p1) + _, t1, p1 = cart2spher(pts[:, 0], pts[:, 1], pts[:, 2]) + x, y, z = spher2cart(1 + cn, t1, p1) sgpts[fs] = np.c_[x, y, z] sg.points(sgpts) diff --git a/vedo/shapes.py b/vedo/shapes.py index bd779660..2434a11a 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -12,12 +12,12 @@ import vedo from vedo import settings +from vedo.transformations import pol2cart, cart2spher, spher2cart from vedo.colors import cmaps_names, color_map, get_color, printc from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh from vedo.picture import Picture -from vedo.transformations import pol2cart __docformat__ = "google" @@ -2711,9 +2711,9 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) x = x * (1 + x * x) / 2 y = y * (1 + y * y) / 2 z = z * (1 + z * z) / 2 - _, theta, phi = utils.cart2spher(x, y, z) + _, theta, phi = cart2spher(x, y, z) - pts = utils.spher2cart(np.ones_like(phi) * r, theta, phi) + pts = spher2cart(np.ones_like(phi) * r, theta, phi) self.points(pts.T) else: From edd771e17f3abdb737c89b72b57a0ccd93250566 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 19:08:13 +0200 Subject: [PATCH 033/251] fix ruler3d --- docs/changes.md | 2 ++ vedo/addons.py | 33 ++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 3283a4b7..66352058 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -10,6 +10,8 @@ - Improvemnets on `applications.Slicer3DPlotter` - Improvements on `applications.Browser` - add background radial gradients +- add `utils.line_line_distance()` +- add `utils.segment_segment_distance()` ### Breaking changes diff --git a/vedo/addons.py b/vedo/addons.py index 14a4e6ae..97d3a94e 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2326,6 +2326,7 @@ def Ruler3D( p1 = [p1[0], p1[1], 0.0] if len(p2) == 2: p2 = [p2[0], p2[1], 0.0] + p1, p2 = np.asarray(p1), np.asarray(p2) q1, q2 = [0, 0, 0], [utils.mag(p2 - p1), 0, 0] @@ -2333,6 +2334,10 @@ def Ruler3D( v = q2 - q1 d = utils.mag(v) * units_scale + pos = np.array(p1) + p1 = p1 - pos + p2 = p2 - pos + if s is None: s = d * 0.02 * (1 / units_scale) @@ -2355,27 +2360,27 @@ def Ruler3D( pc1 = (v / 2 - gap) * 0.9 + q1 pc2 = q2 - (v / 2 - gap) * 0.9 - lc1 = shapes.Line(q1 - v / 50, pc1) - lc2 = shapes.Line(q2 + v / 50, pc2) + lc1 = shapes.Line(q1 - v / 50, pc1).lw(lw) + lc2 = shapes.Line(q2 + v / 50, pc2).lw(lw) zs = np.array([0, d / 50 * (1 / units_scale), 0]) - ml1 = shapes.Line(-zs, zs) - ml2 = shapes.Line(-zs, zs) + ml1 = shapes.Line(-zs, zs).lw(lw) + ml2 = shapes.Line(-zs, zs).lw(lw) ml1.rotate_z(tick_angle - 90).pos(q1) ml2.rotate_z(tick_angle - 90).pos(q2) - c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=20) - c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) + c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=24) + c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=24) - acts = [lb, lc1, lc2, c1, c2, ml1, ml2] - macts = merge(acts) - macts.c(c).alpha(alpha).lw(lw) + macts = merge(lb, lc1, lc2, c1, c2, ml1, ml2) + macts.c(c).alpha(alpha) + macts.property.SetLineWidth(lw) macts.property.LightingOff() macts.actor.UseBoundsOff() - # macts.base = q1 - # macts.top = q2 - # print(p2,p1, p2-p1) - macts.reorient(q2-q1, p2 - p1, rotation=axis_rotation) + macts.base = q1 + macts.top = q2 + macts.reorient(p2 - p1, rotation=axis_rotation) + macts.pos(pos) macts.bc("tomato").pickable(False) return macts @@ -2465,6 +2470,7 @@ def RulerAxes( units=units, ) acts.append(rx) + if ytitle is not None and (y1 - y0) / d > 0.1: ry = Ruler3D( [x1 + dy, y0, z0], @@ -2481,6 +2487,7 @@ def RulerAxes( units=units, ) acts.append(ry) + if ztitle is not None and (z1 - z0) / d > 0.1: rz = Ruler3D( [x0 - dy, y0 + dz, z0], From eca6fac0532a6a46be64bf468f6981d9ed689264 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 20:10:36 +0200 Subject: [PATCH 034/251] fix flagpole --- docs/changes.md | 2 ++ examples/basic/mesh_sharemap.py | 2 +- examples/basic/mirror.py | 9 ++++---- vedo/base.py | 24 +++++++++++---------- vedo/mesh.py | 9 +++++++- vedo/plotter.py | 4 ++-- vedo/pointcloud.py | 38 +++++++++++---------------------- 7 files changed, 43 insertions(+), 45 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 66352058..079ee3b4 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -37,6 +37,8 @@ background_image.py cut_interactive.py glyphs1.py lights.py +mesh_lut.py +mirror.py ``` diff --git a/examples/basic/mesh_sharemap.py b/examples/basic/mesh_sharemap.py index d2dacd65..fd155679 100644 --- a/examples/basic/mesh_sharemap.py +++ b/examples/basic/mesh_sharemap.py @@ -13,4 +13,4 @@ scals = man2.points()[:, 2] * 5 + 37 # pick z coordinates [28->44] man2.cmap("rainbow", scals, vmin=18, vmax=44).add_scalarbar() -show([(man1, __doc__), man2], N=2, elevation=-40, axes=11).close() +show([(man2, __doc__), man1], shape=(2,1), elevation=-40, axes=11).close() diff --git a/examples/basic/mirror.py b/examples/basic/mirror.py index 6966aa55..92fd1188 100644 --- a/examples/basic/mirror.py +++ b/examples/basic/mirror.py @@ -3,10 +3,11 @@ myted1 = Mesh(dataurl+"teddy.vtk") -myted2 = myted1.clone(deep=False).mirror("y") -myted2.pos(0,3,0).c("green") -fp = myted2.flagpole("mirrored\nmesh").follow_camera() +myted2 = myted1.clone() +myted2.pos(0,3,0).mirror("y") +myted2.c("green") -show(myted1, myted2, fp, __doc__, viewup="z", bg2='ly', axes=9) +fp = myted2.flagpole("mirrored\nmesh").follow_camera() +show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) diff --git a/vedo/base.py b/vedo/base.py index 75ec34d7..69eacec4 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -577,10 +577,12 @@ def scale(self, s=None, reset=False, origin=True): if reset: LT.set_scale(s) else: - if origin: + if origin is True: LT.scale(s, origin=self.transform.position) - else: + elif origin is True: LT.scale(s, origin=False) + else: + LT.scale(s, origin=origin) return self.apply_transform(LT) @@ -635,43 +637,43 @@ def align_to_bounding_box(self, msh, rigid=False): def on(self): """Switch on object visibility. Object is not removed.""" - self.VisibilityOn() + self.actor.VisibilityOn() try: - self.scalarbar.VisibilityOn() + self.scalarbar.actor.VisibilityOn() except AttributeError: pass try: - self.trail.VisibilityOn() + self.trail.actor.VisibilityOn() except AttributeError: pass try: for sh in self.shadows: - sh.VisibilityOn() + sh.actor.VisibilityOn() except AttributeError: pass return self def off(self): """Switch off object visibility. Object is not removed.""" - self.VisibilityOff() + self.actor.VisibilityOff() try: - self.scalarbar.VisibilityOff() + self.scalarbar.actor.VisibilityOff() except AttributeError: pass try: - self.trail.VisibilityOff() + self.trail.actor.VisibilityOff() except AttributeError: pass try: for sh in self.shadows: - sh.VisibilityOff() + sh.actor.VisibilityOff() except AttributeError: pass return self def toggle(self): """Toggle object visibility on/off.""" - v = self.GetVisibility() + v = self.actor.GetVisibility() if v: self.off() else: diff --git a/vedo/mesh.py b/vedo/mesh.py index aec75b31..c6520abf 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -28,7 +28,7 @@ class MeshVisual: """Class to manage the visual aspects of a ``Maesh`` object.""" - def follow_camera(self, camera=None): + def follow_camera(self, camera=None, origin=None): """ Return an object that will follow camera movements and stay locked to it. Use `mesh.follow_camera(False)` to disable it. @@ -64,6 +64,13 @@ def follow_camera(self, camera=None): plt = vedo.plotter_instance if plt and plt.renderer and plt.renderer.GetActiveCamera(): factor.SetCamera(plt.renderer.GetActiveCamera()) + + if origin is not None: + factor.SetOrigin(origin) + # else: + # x0, x1, y0, y1, z0, z1 = self.bounds() + # center = (x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2 + # factor.SetOrigin(center) factor.pipeline = OperationNode( "Follower", parents=[self], shape="component", c="#d9ed92") diff --git a/vedo/plotter.py b/vedo/plotter.py index 896a2789..9d22a72e 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -4084,8 +4084,8 @@ def _keypress(self, iren, event): self.color_picker([x, y], verbose=True) elif key == "y": - if self.clicked_object and self.clicked_object.pipeline: - self.clicked_object.pipeline.show() + if self.clicked_object and self.clicked_object.data.pipeline: + self.clicked_object.data.pipeline.show() if iren: iren.Render() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index ca6b0874..da93174d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1533,7 +1533,7 @@ def flagpole( pt = utils.make3d(point) if offset is None: - offset = [(x1 - x0) / 2, (y1 - y0) / 6, 0] + offset = [(x1 - x0) / 1.75, (y1 - y0) / 5, 0] offset = utils.make3d(offset) if s is None: @@ -1546,43 +1546,29 @@ def flagpole( if c is None: c = np.array(self.color()) / 1.4 - lb = vedo.shapes.Text3D( - txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center-left" + lab = vedo.shapes.Text3D( + txt, pos=pt+offset, s=s, + font=font, italic=italic, justify="center" ) - acts.append(lb) + acts.append(lab) if d and not sph: sph = vedo.shapes.Circle(pt, r=s / 3, res=15) acts.append(sph) - x0, x1, y0, y1, z0, z1 = lb.GetBounds() + x0, x1, y0, y1, z0, z1 = lab.bounds() + aline = [(x0,y0,z0), (x1,y0,z0), (x1,y1,z0), (x0,y1,z0)] if rounded: - box = vedo.shapes.KSpline( - [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0)], closed=True - ) + box = vedo.shapes.KSpline(aline, closed=True) else: - box = vedo.shapes.Line( - [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z0)] - ) + box = vedo.shapes.Line(aline, closed=True) cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] - # box.SetOrigin(cnt) - box.scale([1 + padding, 1 + 2 * padding, 1]) + box.actor.SetOrigin(cnt) + box.scale([1 + padding, 1 + 2 * padding, 1], origin=cnt) acts.append(box) - # pts = box.points() - # bfaces = [] - # for i, pt in enumerate(pts): - # if i: - # face = [i-1, i, 0] - # bfaces.append(face) - # bpts = [cnt] + pts.tolist() - # box2 = vedo.Mesh([bpts, bfaces]).z(-cnt[0]/10)#.c('w').alpha(0.1) - # #should be made assembly otherwise later merge() nullifies it - # box2.SetOrigin(cnt) - # acts.append(box2) - x0, x1, y0, y1, z0, z1 = box.bounds() if x0 < pt[0] < x1: c0 = box.closest_point(pt) @@ -1598,7 +1584,7 @@ def flagpole( acts.append(con) macts = vedo.merge(acts).c(c).alpha(alpha) - # macts.SetOrigin(pt) + macts.actor.SetOrigin(pt) macts.bc("tomato").pickable(False) macts.property.LightingOff() macts.property.SetLineWidth(lw) From f00256bf091e6e79d5e50e8491e5fc2c1d26d2ea Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 21:11:31 +0200 Subject: [PATCH 035/251] fix sliders_range.py and scale() --- docs/changes.md | 7 ++++++- vedo/base.py | 7 ++++++- vedo/transformations.py | 30 ++++++++++++++++-------------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 079ee3b4..1780e924 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -39,7 +39,12 @@ glyphs1.py lights.py mesh_lut.py mirror.py - +mousehover1.py +mousehover2.py +pca_ellipse.py +pca_ellipsoid.py +shadow2.py +sliders3d.py ``` diff --git a/vedo/base.py b/vedo/base.py index 69eacec4..16a97a04 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -573,9 +573,13 @@ def scale(self, s=None, reset=False, origin=True): if s is None: return np.array(self.transform.T.GetScale()) + if not utils.is_sequence(s): + s = [s, s, s] + LT = LinearTransform() if reset: - LT.set_scale(s) + old_s = np.array(self.transform.T.GetScale()) + LT.scale(s / old_s) else: if origin is True: LT.scale(s, origin=self.transform.position) @@ -583,6 +587,7 @@ def scale(self, s=None, reset=False, origin=True): LT.scale(s, origin=False) else: LT.scale(s, origin=origin) + return self.apply_transform(LT) diff --git a/vedo/transformations.py b/vedo/transformations.py index 28038164..6b644bdd 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -284,20 +284,22 @@ def set_position(self, p): self.T.Translate(p - q) return self - def set_scale(self, s): - """Set absolute scale.""" - if not _is_sequence(s): - s = [s, s, s] - s0, s1, s2 = 1, 1, 1 - b = self.T.GetScale() - if b[0]: - s0 = s[0] / b[0] - if b[1]: - s1 = s[1] / b[1] - if b[2]: - s2 = s[2] / b[2] - self.T.Scale(s0, s1, s2) - return self + # def set_scale(self, s): + # """Set absolute scale.""" + # if not _is_sequence(s): + # s = [s, s, s] + # s0, s1, s2 = 1, 1, 1 + # b = self.T.GetScale() + # print(b) + # if b[0]: + # s0 = s[0] / b[0] + # if b[1]: + # s1 = s[1] / b[1] + # if b[2]: + # s2 = s[2] / b[2] + # self.T.Scale(s0, s1, s2) + # print() + # return self def get_scale(self): """Get current scale.""" From 92594d665aa57d9cafe9f0b00974d4ac5e19ba18 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 21:37:42 +0200 Subject: [PATCH 036/251] fix clone() and specular.py --- examples/basic/specular.py | 36 ++++++++++++++++++++---------------- vedo/pointcloud.py | 3 ++- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/examples/basic/specular.py b/examples/basic/specular.py index 69e4fc33..6c1cc649 100644 --- a/examples/basic/specular.py +++ b/examples/basic/specular.py @@ -1,29 +1,33 @@ """Setting illumination properties: -ambient, diffuse, specular, specularPower, specularColor. -""" +ambient, diffuse, specular power and color.""" from vedo import Plotter, Mesh, dataurl +ambient = 0.1 +diffuse = 0 +specular = 0 +specular_power = 20 +specular_color = "white" -plt = Plotter(axes=1) +apple = Mesh(dataurl + "apple.ply") +apple.flat().c("gold") -ambient, diffuse, specular = 0.1, 0., 0. -specularPower, specularColor= 20, 'white' - -apple = Mesh(dataurl+'apple.ply').normalize().c('gold') +plt = Plotter(axes=1, bg='black', bg2='white') for i in range(8): - s = apple.clone().pos((i%4)*2.2, int(i<4)*3, 0) - - #s.phong() - s.flat() + x = (i % 4) * 2.2 + y = int(i < 4) * 3 + apple_copy = apple.clone().pos(x, y) # modify the default with specific values - s.lighting('default', ambient, diffuse, specular, specularPower, specularColor) - #ambient += 0.125 - diffuse += 0.125 - specular += 0.125 + apple_copy.lighting( + "default", ambient, diffuse, + specular, specular_power, specular_color + ) + plt += apple_copy - plt += s + ambient += 0.125 + diffuse += 0.125 + specular+= 0.125 plt += __doc__ plt.show().close() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index da93174d..d8183a39 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2054,7 +2054,8 @@ def clone(self, deep=True): bfpr.DeepCopy(self.actor.GetBackfaceProperty()) cloned.actor.SetBackfaceProperty(bfpr) - cloned.transform = self.transform + # do not copy the transform, otherwise it will be applied twice + # cloned.transform = self.transform ## NO! mp = cloned.mapper sm = self.mapper From 781034a88180ff615ed082d27c28e891e72805e5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 9 Oct 2023 22:31:25 +0200 Subject: [PATCH 037/251] fix self.transform.clone() --- vedo/mesh.py | 1 - vedo/pointcloud.py | 18 ++++++------------ vedo/transformations.py | 13 ++++++++++++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index c6520abf..555d5a86 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -323,7 +323,6 @@ def __init__(self, inputobj=None, c=None, alpha=1): self.mapper.SetInputData(self) self.actor.SetMapper(self.mapper) - # self.property = self.actor.GetProperty() self.property.SetInterpolationToPhong() # set the color by c or by scalar diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index d8183a39..e9ea5430 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2033,16 +2033,10 @@ def clone(self, deep=True): ![](https://vedo.embl.es/images/basic/mirror.png) """ - poly_copy = vtk.vtkPolyData() - if deep: - poly_copy.DeepCopy(self) - else: - poly_copy.ShallowCopy(self) - if isinstance(self, vedo.Mesh): - cloned = vedo.Mesh(poly_copy) + cloned = vedo.Mesh(self) else: - cloned = Points(poly_copy) + cloned = Points(self) pr = vtk.vtkProperty() pr.DeepCopy(self.property) @@ -2053,9 +2047,9 @@ def clone(self, deep=True): bfpr = vtk.vtkProperty() bfpr.DeepCopy(self.actor.GetBackfaceProperty()) cloned.actor.SetBackfaceProperty(bfpr) - - # do not copy the transform, otherwise it will be applied twice - # cloned.transform = self.transform ## NO! + cloned.property_backface = bfpr + + cloned.transform = self.transform.clone() mp = cloned.mapper sm = self.mapper @@ -2080,7 +2074,7 @@ def clone(self, deep=True): cloned.filename = str(self.filename) cloned.info = dict(self.info) - # better not to share the same locators with original obj + # dont share the same locators with original obj cloned.point_locator = None cloned.cell_locator = None cloned.line_locator = None diff --git a/vedo/transformations.py b/vedo/transformations.py index 6b644bdd..2bcf4f10 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -69,6 +69,16 @@ def __init__(self, T=None): S.SetMatrix(M) T = S + elif isinstance(T, vtk.vtkLinearTransform): + S = vtk.vtkTransform() + S.DeepCopy(T) + T = S + + elif isinstance(T, LinearTransform): + S = vtk.vtkTransform() + S.DeepCopy(T.T) + T = S + self.T = T self.T.PostMultiply() self.inverse_flag = False @@ -82,6 +92,7 @@ def __str__(self): def __repr__(self): return self.__str__() + def apply_to(self, obj): """Apply transformation.""" @@ -139,7 +150,7 @@ def compute_inverse(self): def clone(self): """Clone.""" - return LinearTransform(self.T.Clone()) + return LinearTransform(self.T) def concatenate(self, T, pre_multiply=False): """Post multiply.""" From 4c5d9e20811c6f5e9de3521ec1604a84a242c3c0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 14:05:15 +0200 Subject: [PATCH 038/251] fix glyphs1.py in Glyph() --- examples/basic/glyphs1.py | 18 ++++++++++++------ vedo/shapes.py | 34 +--------------------------------- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/examples/basic/glyphs1.py b/examples/basic/glyphs1.py index 80aa29a0..ddb08551 100644 --- a/examples/basic/glyphs1.py +++ b/examples/basic/glyphs1.py @@ -4,9 +4,9 @@ from vedo import * # Create a sphere with resolution 12, set its color and show as wireframe -s = Sphere(res=12).c("white", 0.1).wireframe() +sph = Sphere(res=12).c("white", 0.1).wireframe() -randvs = np.random.rand(s.npoints, 3) # random orientation vectors +randvs = np.random.rand(sph.npoints, 3) # random orientation vectors ####################################### # Create an ellipsoid glyph and scale it down @@ -14,7 +14,7 @@ # create a Glyph object that will show an ellipsoid at each vertex gsphere1 = Glyph( - s, + sph, gly1, orientation_array=randvs, scale_by_vector_size=True, @@ -22,18 +22,24 @@ c="jet", ) - ####################################### # Create a mesh glyph and scale it down gly2 = Mesh(dataurl + "shuttle.obj").rotate_y(180).scale(0.02) # Create a Glyph object that will show a shuttle at each vertex gsphere2 = Glyph( - s, + sph, gly2, orientation_array="normals", c="lightblue", ) # Show two groups of objects on N=2 renderers: -show([(s, gsphere1, __doc__), (s, gsphere2)], N=2, bg="bb", zoom=1.4).close() +show([ + (sph, gsphere1, __doc__), + (sph, gsphere2) + ], + N=2, + bg="bb", + zoom=1.4, +).close() diff --git a/vedo/shapes.py b/vedo/shapes.py index 2434a11a..29981bf8 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -173,7 +173,6 @@ def __init__( color_by_vector_size=False, c="k8", alpha=1.0, - **opts, ): """ Arguments: @@ -196,30 +195,12 @@ def __init__( ![](https://vedo.embl.es/images/basic/glyphs.png) """ - if len(opts) > 0: # Deprecations - printc(":noentry: Warning! In Glyph() unrecognized keywords:", opts, c="y") - orientation_array = opts.pop("orientationArray", orientation_array) - scale_by_scalar = opts.pop("scaleByScalar", scale_by_scalar) - scale_by_vector_size = opts.pop("scaleByVectorSize", scale_by_vector_size) - scale_by_vector_components = opts.pop( - "scaleByVectorComponents", scale_by_vector_components - ) - color_by_scalar = opts.pop("colorByScalar", color_by_scalar) - color_by_vector_size = opts.pop("colorByVectorSize", color_by_vector_size) - printc(" Please use 'snake_case' instead of 'camelCase' keywords", c="y") - - lighting = None if utils.is_sequence(mesh): # create a cloud of points poly = Points(mesh) - elif isinstance(mesh, vtk.vtkPolyData): - poly = mesh else: poly = mesh - if isinstance(glyph, Points): - lighting = glyph.property.GetLighting() - cmap = "" if isinstance(c, str) and c in cmaps_names: cmap = c @@ -281,22 +262,9 @@ def __init__( super().__init__(gly.GetOutput(), c, alpha) self.flat() - if lighting is not None: - self.property.SetLighting(lighting) if cmap: - lut = vtk.vtkLookupTable() - lut.SetNumberOfTableValues(512) - lut.Build() - for i in range(512): - r, g, b = color_map(i, cmap, 0, 512) - lut.SetTableValue(i, r, g, b, 1) - self.mapper.SetLookupTable(lut) - self.mapper.ScalarVisibilityOn() - self.mapper.SetScalarModeToUsePointData() - if gly.GetOutput().GetPointData().GetScalars(): - rng = gly.GetOutput().GetPointData().GetScalars().GetRange() - self.mapper.SetScalarRange(rng[0], rng[1]) + self.cmap(cmap, "VectorMagnitude") self.name = "Glyph" From 8fda2cd7f3378ebecc3085d873f45447bd4d65ca Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 14:31:24 +0200 Subject: [PATCH 039/251] fix mirror() --- docs/changes.md | 1 - examples/basic/mirror.py | 42 ++++++++++++++++++++++++++++++++++------ vedo/pointcloud.py | 25 +++++++----------------- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 1780e924..7840984c 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -35,7 +35,6 @@ examples/volumetric/slicer1.py ``` background_image.py cut_interactive.py -glyphs1.py lights.py mesh_lut.py mirror.py diff --git a/examples/basic/mirror.py b/examples/basic/mirror.py index 92fd1188..ba7c4ada 100644 --- a/examples/basic/mirror.py +++ b/examples/basic/mirror.py @@ -1,13 +1,43 @@ """Mirror a mesh along one of the Cartesian axes""" from vedo import dataurl, Mesh, show -myted1 = Mesh(dataurl+"teddy.vtk") +# myted1 = Mesh(dataurl+"teddy.vtk") -myted2 = myted1.clone() -myted2.pos(0,3,0).mirror("y") -myted2.c("green") +# myted2 = myted1.clone() +# myted2.pos(0,3,0).mirror("y") +# myted2.c("green") -fp = myted2.flagpole("mirrored\nmesh").follow_camera() +# fp = myted2.flagpole("mirrored\nmesh").follow_camera() -show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) +# show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) + +from vedo import * +# import vtk +s = Mesh(dataurl+"cessna.vtk") +s.rotate_z(30).shift(3,1) +s.mirror('xy', origin=(0,0,0)) +show(s, Point(), axes=1) +exit() + +s.scale([-1,1,1]) + +rs = vtk.vtkReverseSense() +rs.SetInputData(s) +rs.ReverseNormalsOff() +rs.Update() +outpoly = rs.GetOutput() + +s.DeepCopy(outpoly) + +show(s, axes=1) +exit() +# myted2 = myted1.clone() +# myted2.mirror("y") +# myted2.c("green") + +# fp = myted2.flagpole("mirrored\nmesh").follow_camera() + +show(myted1, myted2, axes=1, viewup='z') + +# myted2.pos(0,3,0).mirror("xy") diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index e9ea5430..5e3571e6 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2679,14 +2679,14 @@ def normalize(self): self.scale(scale).pos(cm) return self - def mirror(self, axis="x", origin=None): + def mirror(self, axis="x", origin=True): """ Mirror the mesh along one of the cartesian axes Arguments: axis : (str) - axis to use for mirroring, must be set to x, y, z or n. - Or any combination of those. Adding 'n' reverses mesh faces (hence normals). + axis to use for mirroring, must be set to `x, y, z`. + Or any combination of those. origin : (list) use this point as the origin of the mirroring transformation. @@ -2700,23 +2700,12 @@ def mirror(self, axis="x", origin=None): if "y" in axis.lower(): sy = -1 if "z" in axis.lower(): sz = -1 - self.transform.scale([sx, sy, sz], origin=origin) + self.scale([sx, sy, sz], origin=origin) - outpoly = self - if sx * sy * sz < 0 or "n" in axis: - rs = vtk.vtkReverseSense() - rs.SetInputData(self) - rs.ReverseNormalsOn() - rs.Update() - outpoly = rs.GetOutput() - - self.DeepCopy(outpoly) - - self.point_locator = None - self.cell_locator = None - self.line_locator = None - self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) + + if sx * sy * sz < 0: + self.reverse() return self def flip_normals(self): From 4a294708e2f6026dd174f513eff2036069c66511 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 14:32:51 +0200 Subject: [PATCH 040/251] fix mirror.py --- examples/basic/mirror.py | 41 +++++----------------------------------- 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/examples/basic/mirror.py b/examples/basic/mirror.py index ba7c4ada..d15cc453 100644 --- a/examples/basic/mirror.py +++ b/examples/basic/mirror.py @@ -1,43 +1,12 @@ """Mirror a mesh along one of the Cartesian axes""" from vedo import dataurl, Mesh, show -# myted1 = Mesh(dataurl+"teddy.vtk") +myted1 = Mesh(dataurl+"teddy.vtk") -# myted2 = myted1.clone() -# myted2.pos(0,3,0).mirror("y") -# myted2.c("green") +myted2 = myted1.clone().c("green") -# fp = myted2.flagpole("mirrored\nmesh").follow_camera() +myted2.pos([0,3,0]).mirror("y") -# show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) +fp = myted2.flagpole("mirrored\nmesh").follow_camera() - -from vedo import * -# import vtk -s = Mesh(dataurl+"cessna.vtk") -s.rotate_z(30).shift(3,1) -s.mirror('xy', origin=(0,0,0)) -show(s, Point(), axes=1) -exit() - -s.scale([-1,1,1]) - -rs = vtk.vtkReverseSense() -rs.SetInputData(s) -rs.ReverseNormalsOff() -rs.Update() -outpoly = rs.GetOutput() - -s.DeepCopy(outpoly) - -show(s, axes=1) -exit() -# myted2 = myted1.clone() -# myted2.mirror("y") -# myted2.c("green") - -# fp = myted2.flagpole("mirrored\nmesh").follow_camera() - -show(myted1, myted2, axes=1, viewup='z') - -# myted2.pos(0,3,0).mirror("xy") +show(myted1, myted2, fp, __doc__, bg2='ly', axes=1) From cf1394c47d75ebaa59883f32d4a1b0b96e7a63bf Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 15:43:17 +0200 Subject: [PATCH 041/251] fix mousehover1,2.py and plt.remove() --- docs/changes.md | 1 - examples/basic/mousehover1.py | 26 ++++++++++++------------- vedo/mesh.py | 24 +++++++---------------- vedo/plotter.py | 36 ++++++++++++++++++++--------------- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 7840984c..a2bab168 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -37,7 +37,6 @@ background_image.py cut_interactive.py lights.py mesh_lut.py -mirror.py mousehover1.py mousehover2.py pca_ellipse.py diff --git a/examples/basic/mousehover1.py b/examples/basic/mousehover1.py index d423902e..fa254065 100644 --- a/examples/basic/mousehover1.py +++ b/examples/basic/mousehover1.py @@ -4,35 +4,33 @@ from vedo import * def func(evt): ### called every time mouse moves! - msh = evt.actor + msh = evt.object # get the mesh that triggered the event if not msh: return # mouse hits nothing, return. - pt = evt.picked3d # 3d coords of point under mouse + pt = evt.picked3d # 3d coords of point under mouse pid = msh.closest_point(pt, return_point_id=True) - txt = f"Point: {precision(pt[:2] ,2)}\n" \ - f"Height: {precision(arr[pid],3)}\n" \ - f"Ground speed: {precision(evt.speed3d*100,2)}" + txt =(f"Point: {precision(pt[:2] ,2)}\n" + f"Height: {precision(arr[pid],3)}\n" + f"Ground speed: {precision(evt.speed3d*100,2)}") msg.text(txt) # update text message arw = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') - fp = msh.flagpole( - txt, point=pt, offset=(0.4,0.6), - s=0.04, c='k', font="VictorMono", - ).follow_camera() # make it always face the camera - if len(plt.actors) > 3: - plt.pop() # remove the old flagpole - plt.add(arw, fp).render() # add Arrow and the new flagpole + fpo = msh.flagpole( + txt, point=pt, offset=(0.4,0.6), s=0.04, c='k', font="VictorMono", + ).follow_camera() # make it always face the camera + plt.remove("FlagPole") # remove the old flagpole + plt.add(arw, fpo) # add Arrow and the new flagpole + plt.render() msg = Text2D(pos='bottom-left', font="VictorMono") # an empty text hil = ParametricShape('RandomHills').cmap('terrain').add_scalarbar() arr = hil.pointdata["Scalars"] # numpy array with heights +settings.use_parallel_projection = True # avoid perspective effects plt = Plotter(axes=1, bg2='lightblue') - plt.add_callback('mouse move', func) # add the callback function plt.add_callback('keyboard', lambda evt: plt.remove(plt.actors[3:]).render()) - plt.show(hil, msg, __doc__, viewup='z') plt.close() diff --git a/vedo/mesh.py b/vedo/mesh.py index 555d5a86..07066062 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -47,16 +47,14 @@ def follow_camera(self, camera=None, origin=None): factor.SetProperty(self.property) factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) factor.SetTexture(self.actor.GetTexture()) - factor.SetOrigin(self.actor.GetOrigin()) factor.SetScale(self.actor.GetScale()) factor.SetOrientation(self.actor.GetOrientation()) factor.SetPosition(self.actor.GetPosition()) factor.SetUseBounds(self.actor.GetUseBounds()) - factor.PickableOff() - # factor = vtk.vtkFollower() # not working - # self.mapper = vtk.vtkPolyDataMapper() - # self.mapper.SetInputData(self) + factor.SetOrigin(self.actor.GetOrigin()) + + factor.PickableOff() if isinstance(camera, vtk.vtkCamera): factor.SetCamera(camera) @@ -67,18 +65,10 @@ def follow_camera(self, camera=None, origin=None): if origin is not None: factor.SetOrigin(origin) - # else: - # x0, x1, y0, y1, z0, z1 = self.bounds() - # center = (x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2 - # factor.SetOrigin(center) - - factor.pipeline = OperationNode( - "Follower", parents=[self], shape="component", c="#d9ed92") - # factor.SetMapper(self.mapper) - # self.actor = factor # not working - # self.actor.Modified() - # self.mapper.Modified() - # return self + + self.actor = None + factor.data = self + self.actor = factor return factor diff --git a/vedo/plotter.py b/vedo/plotter.py index 9d22a72e..df52b98d 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -874,14 +874,22 @@ def remove(self, *objs, at=None): unpack_assemblies=False) for a in acts: try: - if a.data.name: + if a.name and a.name in objs: objs.append(a) except AttributeError: pass - ids = [] ir = self.renderers.index(ren) + # print("\nhas_str, has_actor", has_str , has_actor) + # print(acts) + # for a in acts: + # print("actorname: ", a.name) + # for o in objs: + # print("objectname: ", [o]) + + ids = [] + for ob in set(objs): # remove it from internal list if possible if ob in list(self.objects): @@ -896,7 +904,7 @@ def remove(self, *objs, at=None): try: ren.RemoveActor(ob) except TypeError: - try: + try: ren.RemoveActor(ob.actor) except AttributeError: pass @@ -905,9 +913,9 @@ def remove(self, *objs, at=None): ob.rendered_at.discard(ir) if hasattr(ob, "scalarbar") and ob.scalarbar: - ren.RemoveActor(ob.scalarbar.actor) + ren.RemoveActor(ob.scalarbar) if hasattr(ob, "_caption") and ob._caption: - ren.RemoveActor(ob._caption.actor) + ren.RemoveActor(ob._caption) if hasattr(ob, "shadows") and ob.shadows: for sha in ob.shadows: ren.RemoveActor(sha.actor) @@ -917,9 +925,11 @@ def remove(self, *objs, at=None): if hasattr(ob.trail, "shadows") and ob.trail.shadows: for sha in ob.trail.shadows: ren.RemoveActor(sha.actor) - - for i in ids: - del self.objects[i] + + # for i in ids: # wrong way of doing it + # del self.objects[i] + # instead: + self.objects = [ele for i, ele in enumerate(self.objects) if i not in ids] return self @@ -2314,13 +2324,12 @@ def fill_event(self, ename="", pos=(), enable_picking=True): self.picker = vtk.vtkPropPicker() self.picker.PickProp(x, y, self.renderer) - - xp, yp = self.interactor.GetLastEventPosition() actor = self.picker.GetProp3D() + delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) - if isinstance(actor, vedo.base.Base3DProp): # needed! + if isinstance(actor.data, vedo.base.Base3DProp): # needed! if actor.data.picked3d is not None: delta3d = picked3d - actor.data.picked3d actor.data.picked3d = picked3d @@ -2329,8 +2338,8 @@ def fill_event(self, ename="", pos=(), enable_picking=True): if not actor: # try 2D actor = self.picker.GetActor2D() - # print(enable_picking, xp, yp, picked3d, [actor] ) + xp, yp = self.interactor.GetLastEventPosition() dx, dy = x - xp, y - yp event = Event() @@ -2348,7 +2357,6 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.actor = actor.data # obsolete use object instead event.object = actor.data except AttributeError: - # print("Warning: actor.data is None") event.actor = None event.object = None event.picked3d = picked3d @@ -3703,7 +3711,6 @@ def _keypress(self, iren, event): udp = not renderer.GetUseDepthPeeling() renderer.SetUseDepthPeeling(udp) # self.renderer.SetUseDepthPeelingForVolumes(udp) - # print(self.window.GetAlphaBitPlanes()) if udp: self.window.SetAlphaBitPlanes(1) renderer.SetMaximumNumberOfPeels(settings.max_number_of_peels) @@ -4021,7 +4028,6 @@ def _keypress(self, iren, event): if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) intrp = ia.property.GetInterpolation() - # print(intrp, ia.property.GetInterpolationAsString()) if intrp > 0: ia.property.SetInterpolation(0) # flat else: From f4ed212bf39453d271ce39b6b625b08f0cfb4ab1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 15:50:38 +0200 Subject: [PATCH 042/251] bump version --- docs/changes.md | 4 ---- vedo/plotter.py | 9 --------- vedo/version.py | 2 +- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index a2bab168..7255802a 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -33,12 +33,8 @@ examples/volumetric/slicer1.py ### Broken Examples ``` -background_image.py -cut_interactive.py lights.py mesh_lut.py -mousehover1.py -mousehover2.py pca_ellipse.py pca_ellipsoid.py shadow2.py diff --git a/vedo/plotter.py b/vedo/plotter.py index df52b98d..cb4b37e4 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -881,15 +881,7 @@ def remove(self, *objs, at=None): ir = self.renderers.index(ren) - # print("\nhas_str, has_actor", has_str , has_actor) - # print(acts) - # for a in acts: - # print("actorname: ", a.name) - # for o in objs: - # print("objectname: ", [o]) - ids = [] - for ob in set(objs): # remove it from internal list if possible if ob in list(self.objects): @@ -900,7 +892,6 @@ def remove(self, *objs, at=None): pass if ren: ### remove it from the renderer - try: ren.RemoveActor(ob) except TypeError: diff --git a/vedo/version.py b/vedo/version.py index d2a2c8f6..c1fe1158 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev2' +_version = '2023.5.0+dev3' From 6d5c063ef563478a3be479c7d6138ca7c3e33edb Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 16:24:04 +0200 Subject: [PATCH 043/251] follow_cam() can modify its actor --- docs/changes.md | 2 -- examples/basic/mousehover1.py | 3 ++- examples/basic/shadow1.py | 4 ++-- examples/basic/sliders3d.py | 12 ++++++------ examples/pyplot/goniometer.py | 4 ++-- vedo/addons.py | 2 +- vedo/mesh.py | 2 +- vedo/pointcloud.py | 4 ++++ 8 files changed, 18 insertions(+), 15 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 7255802a..391461db 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -37,8 +37,6 @@ lights.py mesh_lut.py pca_ellipse.py pca_ellipsoid.py -shadow2.py -sliders3d.py ``` diff --git a/examples/basic/mousehover1.py b/examples/basic/mousehover1.py index fa254065..297630d8 100644 --- a/examples/basic/mousehover1.py +++ b/examples/basic/mousehover1.py @@ -18,7 +18,8 @@ def func(evt): ### called every time mouse moves! arw = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') fpo = msh.flagpole( txt, point=pt, offset=(0.4,0.6), s=0.04, c='k', font="VictorMono", - ).follow_camera() # make it always face the camera + ) + fpo.follow_camera() # make it always face the camera plt.remove("FlagPole") # remove the old flagpole plt.add(arw, fpo) # add Arrow and the new flagpole plt.render() diff --git a/examples/basic/shadow1.py b/examples/basic/shadow1.py index 2a15e5d4..a8029d37 100644 --- a/examples/basic/shadow1.py +++ b/examples/basic/shadow1.py @@ -2,10 +2,10 @@ from vedo import dataurl, Mesh, Sphere, show spider = Mesh(dataurl+"spider.ply") -spider.normalize().rotate_z(-90) +# spider.rotate_z(-90).normalize() spider.texture(dataurl+'textures/leather.jpg') spider.add_shadow('x', -3) -sphere = Sphere(r=0.3).pos(0.4,0,0.6).add_shadow('x', -3) +sphere = Sphere(r=0.4).pos(0.5,0,1).add_shadow('x', -3) show(spider, sphere, __doc__, axes=1, viewup="z").close() diff --git a/examples/basic/sliders3d.py b/examples/basic/sliders3d.py index 78c97192..6211f734 100644 --- a/examples/basic/sliders3d.py +++ b/examples/basic/sliders3d.py @@ -4,18 +4,18 @@ plt = Plotter() mesh = Mesh(dataurl+"spider.ply") -mesh.normalize().rotate_z(190) +# mesh.normalize().rotate_z(190) def slider_y(widget, event): - mesh.y(widget.value) # set y coordinate position + mesh.x(widget.value) # set y coordinate position plt.add_slider3d( slider_y, - pos1=[0.5, -3.5, 0.35], - pos2=[0.5, -1.0, 0.35], - xmin=-1, - xmax=1, + pos1=[1, 0, 0.35], + pos2=[6, 0, 0.35], + xmin=-2, + xmax=2, value=0, s=0.04, c="r", diff --git a/examples/pyplot/goniometer.py b/examples/pyplot/goniometer.py index 1c781466..408803e7 100644 --- a/examples/pyplot/goniometer.py +++ b/examples/pyplot/goniometer.py @@ -14,7 +14,7 @@ + "~μm^3", s=0.1, ) -fp.color("r3").scale(0.7) +fp.color("r3").scale(0.7).follow_camera() # measure the angle formed by 3 points gon = Goniometer( @@ -35,4 +35,4 @@ # make 3d rulers along the bounding box (similar to set axes=7) ax3 = RulerAxes(mesh, units="μm") -show(mesh, fp.follow_camera(), gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() +show(mesh, fp, gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() diff --git a/vedo/addons.py b/vedo/addons.py index 97d3a94e..6e5c1968 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -732,7 +732,7 @@ def Goniometer( ) cr = np.cross(va, vb) lb.pos(p2 + vc * r / 1.75) - lb.reorient(None, cr * np.sign(cr[2]), rotation=rotation) + lb.reorient(cr * np.sign(cr[2]), rotation=rotation) lb.c(c).bc("tomato").lighting("off") acts.append(lb) diff --git a/vedo/mesh.py b/vedo/mesh.py index 07066062..a7931f3e 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -69,7 +69,7 @@ def follow_camera(self, camera=None, origin=None): self.actor = None factor.data = self self.actor = factor - return factor + return self def wireframe(self, value=True): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 5e3571e6..458ef32b 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1479,6 +1479,9 @@ def flagpole( Use flagpole.follow_camera() to make it face the camera in the scene. + Consider using `settings.use_parallel_projection = True` + to avoid perspective distortions. + See also `flagpost()`. Arguments: @@ -1527,6 +1530,7 @@ def flagpole( if point is None: if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) + # point = self.closest_point([x1, y0, z1]) else: # it's a Point point = self.transform.position From c9ac3dd70a5bdea0891087c7154c63dd04bc364a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 16:57:11 +0200 Subject: [PATCH 044/251] fix pca_ellipse.py pca_ellipsoid.py --- examples/basic/pca_ellipse.py | 4 ++-- vedo/mesh.py | 2 -- vedo/pointcloud.py | 17 +++++------------ 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/examples/basic/pca_ellipse.py b/examples/basic/pca_ellipse.py index 27412c60..801b69f4 100644 --- a/examples/basic/pca_ellipse.py +++ b/examples/basic/pca_ellipse.py @@ -6,12 +6,12 @@ pts.rotate_z(30).scale([1.5, 2, 0.01]).pos(2,3,0) elli2d = pca_ellipse( pts, pvalue=0.5) -elli3d = pca_ellipsoid(pts, pvalue=0.5) +elli3d = pca_ellipsoid(pts, pvalue=0.5).alpha(0.1) extruded = elli2d.z(-0.1).extrude(0.2) # make an oval box printc("Inside ellipse :", extruded.inside_points(pts).npoints, c='b') printc("Inside ellipsoid:", elli3d.inside_points(pts).npoints, c='b') -show(pts, elli2d, elli3d, __doc__, axes=1) +show(pts, elli2d, elli3d, __doc__, axes=1).close() diff --git a/vedo/mesh.py b/vedo/mesh.py index a7931f3e..952e440b 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -193,8 +193,6 @@ def __init__(self, inputobj=None, c=None, alpha=1): ![](https://vedo.embl.es/images/basic/buildmesh.png) """ super().__init__() - # MeshVisual.__init__(self) - # Points.__init__(self) self.mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 458ef32b..3b1f7ba8 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -369,11 +369,7 @@ def pca_ellipse(points, pvalue=0.673, res=60): vtra.SetMatrix(matri) elli = vedo.shapes.Circle(alpha=0.75, res=res) - - # assign the transformation - # elli.SetScale(vtra.GetScale()) - # elli.SetOrientation(vtra.GetOrientation()) - # elli.SetPosition(vtra.GetPosition()) + elli.apply_transform(vtra) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n @@ -416,7 +412,7 @@ def pca_ellipsoid(points, pvalue=0.673): else: coords = points if len(coords) < 4: - vedo.logger.warning("in pcaEllipsoid(), there are not enough points!") + vedo.logger.warning("in pca_ellipsoid(), there are not enough points!") return None P = np.array(coords, ndmin=2, dtype=float) @@ -428,8 +424,6 @@ def pca_ellipsoid(points, pvalue=0.673): ua, ub, uc = np.sqrt(s*fppf)/cfac # semi-axes (largest first) center = np.mean(P, axis=0) # centroid of the hyperellipsoid - elli = vedo.shapes.Ellipsoid((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) - matri = vtk.vtkMatrix4x4() matri.DeepCopy(( R[0][0] * ua*2, R[1][0] * ub*2, R[2][0] * uc*2, center[0], @@ -440,10 +434,9 @@ def pca_ellipsoid(points, pvalue=0.673): vtra = vtk.vtkTransform() vtra.SetMatrix(matri) - # assign the transformation - # elli.SetScale(vtra.GetScale()) - # elli.SetOrientation(vtra.GetOrientation()) - # elli.SetPosition(vtra.GetPosition()) + elli = vedo.shapes.Ellipsoid( + (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) + elli = elli.apply_transform(vtra) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n From 7d0a46fe74356d0a6c046a3e58929fc39a121eb2 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 17:15:13 +0200 Subject: [PATCH 045/251] improve on pca_ellipsoid --- examples/basic/pca_ellipsoid.py | 8 +++----- vedo/pointcloud.py | 25 ++++++++++++++----------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/examples/basic/pca_ellipsoid.py b/examples/basic/pca_ellipsoid.py index 32ab5856..ef8133fc 100644 --- a/examples/basic/pca_ellipsoid.py +++ b/examples/basic/pca_ellipsoid.py @@ -9,9 +9,7 @@ pts = Points(np.random.randn(10000, 3)*[3,2,1] + [50,60,70]) -elli = pca_ellipsoid(pts, pvalue=0.50) - -elli.inside_points(pts, return_ids=True) +elli = pca_ellipsoid(pts, pvalue=0.50) # 50% of points inside ids = elli.inside_points(pts, return_ids=True) pts.print() # a new "IsInside" array now exists in pts @@ -37,8 +35,8 @@ a2 = Arrow(elli.center, elli.center + elli.axis2) a3 = Arrow(elli.center, elli.center + elli.axis3) -show(elli, - a1, a2, a3, +show( + elli, a1, a2, a3, Points(pin).c("green4"), Points(pout).c("red5").alpha(0.2), __doc__, diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3b1f7ba8..0400540f 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -371,15 +371,16 @@ def pca_ellipse(points, pvalue=0.673, res=60): elli = vedo.shapes.Circle(alpha=0.75, res=res) elli.apply_transform(vtra) - elli.center = np.array(vtra.GetPosition()) + elli.pvalue = pvalue + elli.center = np.array([center[0], center[1], 0]) elli.nr_of_points = n elli.va = ua elli.vb = ub + # we subtract center because it's in M elli.axis1 = np.array(vtra.TransformPoint([1, 0, 0])) - elli.center elli.axis2 = np.array(vtra.TransformPoint([0, 1, 0])) - elli.center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) - elli.transformation = vtra elli.name = "PCAEllipse" return elli @@ -424,32 +425,34 @@ def pca_ellipsoid(points, pvalue=0.673): ua, ub, uc = np.sqrt(s*fppf)/cfac # semi-axes (largest first) center = np.mean(P, axis=0) # centroid of the hyperellipsoid - matri = vtk.vtkMatrix4x4() - matri.DeepCopy(( + M = vtk.vtkMatrix4x4() + M.DeepCopy(( R[0][0] * ua*2, R[1][0] * ub*2, R[2][0] * uc*2, center[0], R[0][1] * ua*2, R[1][1] * ub*2, R[2][1] * uc*2, center[1], R[0][2] * ua*2, R[1][2] * ub*2, R[2][2] * uc*2, center[2], 0, 0, 0, 1) ) vtra = vtk.vtkTransform() - vtra.SetMatrix(matri) + vtra.SetMatrix(M) elli = vedo.shapes.Ellipsoid( (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) - elli = elli.apply_transform(vtra) + elli.property.LightingOff() + elli.apply_transform(vtra) - elli.center = np.array(vtra.GetPosition()) + elli.pvalue = pvalue elli.nr_of_points = n + elli.center = center elli.va = ua elli.vb = ub elli.vc = uc - elli.axis1 = np.array(vtra.TransformPoint([1, 0, 0])) - elli.center - elli.axis2 = np.array(vtra.TransformPoint([0, 1, 0])) - elli.center - elli.axis3 = np.array(vtra.TransformPoint([0, 0, 1])) - elli.center + # we subtract center because it's in M + elli.axis1 = np.array(vtra.TransformPoint([1, 0, 0])) - center + elli.axis2 = np.array(vtra.TransformPoint([0, 1, 0])) - center + elli.axis3 = np.array(vtra.TransformPoint([0, 0, 1])) - center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) elli.axis3 /= np.linalg.norm(elli.axis3) - elli.transformation = vtra elli.name = "PCAEllipsoid" return elli From 9a1ae789a941d1deea4756b04ccb83bb9ac55515 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 17:39:18 +0200 Subject: [PATCH 046/251] fix mesh_lut.py --- docs/changes.md | 3 --- examples/basic/mesh_lut.py | 22 +++++++++++----------- vedo/base.py | 4 +--- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 391461db..1afe5b34 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -34,9 +34,6 @@ examples/volumetric/slicer1.py ### Broken Examples ``` lights.py -mesh_lut.py -pca_ellipse.py -pca_ellipsoid.py ``` diff --git a/examples/basic/mesh_lut.py b/examples/basic/mesh_lut.py index 0ff052c4..5afb72f4 100644 --- a/examples/basic/mesh_lut.py +++ b/examples/basic/mesh_lut.py @@ -1,18 +1,16 @@ """Build a custom colormap, including out-of-range and NaN colors and labels""" -from vedo import build_lut, Sphere, show, settings +from vedo import build_lut, Sphere, show -settings.use_depth_peeling = True # might help with transparencies +# Generate a sphere and stretch it, so it sits between z=-2 and z=+2 +mesh = Sphere(quads=True).scale([1,1,1.8]).linewidth(1) -# generate a sphere and stretch it, so it sits between z=-2 and z=+2 -mesh = Sphere(quads=True).scale([1,1,2]).linewidth(0.1) - -# create some dummy data array to be associated to points -data = mesh.points()[:,2] # pick z-coords, use them as scalar data +# Create some dummy data array to be associated to points +data = mesh.points()[:,2].copy() # pick z-coords, use them as scalar data data[10:70] = float('nan') # make some values invalid by setting to NaN data[300:600] = 100 # send some values very far above-scale -# build a custom Look-Up-Table of colors: +# Build a custom Look-Up-Table of colors: # value, color, alpha lut = build_lut( [ @@ -31,12 +29,14 @@ ) # 3D scalarbar: mesh.cmap(lut, data).add_scalarbar3d(title='My 3D scalarbar', c='white') -mesh.scalarbar.scale(1.5).rotate_x(90).y(1) # make it bigger and place it +mesh.scalarbar.scale(1.5).rotate_x(90).shift(-0.5,-2) # make it bigger and place it # 2D scalarbar: # mesh.cmap(lut, data).add_scalarbar() -show(mesh, __doc__, +show(mesh, + __doc__, axes=dict(zlabel_size=.04, number_of_divisions=10), - elevation=-80, bg='blackboard', + elevation=-80, + bg='blackboard', ).close() diff --git a/vedo/base.py b/vedo/base.py index 16a97a04..54848a7b 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -882,12 +882,10 @@ def ncells(self): """Retrieve the number of cells.""" return self.GetNumberOfCells() - def points(self, pts=None, transformed=True): + def points(self, pts=None): """ Set/Get the vertex coordinates of a mesh or point cloud. Keyword `pts` can also be a list of indices to be retrieved. - - Set `transformed=False` to ignore any previous transformation applied to the mesh. """ if pts is None: ### getter From 36c7c3d68b76fcfeb3db8b0ec5f1796f6604bc6e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 18:27:06 +0200 Subject: [PATCH 047/251] fix lights --- examples/basic/lights.py | 18 ++++++------------ vedo/plotter.py | 6 ++---- vedo/pointcloud.py | 21 +++++++++++++-------- vedo/shapes.py | 16 ++++++++++------ 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/examples/basic/lights.py b/examples/basic/lights.py index 0bb12b9f..2d7fd742 100644 --- a/examples/basic/lights.py +++ b/examples/basic/lights.py @@ -1,7 +1,8 @@ """Set custom lights to a 3D scene""" from vedo import * -man = Mesh(dataurl+'man.vtk').c('white').lighting('glossy') +man = Mesh(dataurl + 'man.vtk') +man.c('white').lighting('glossy') p1 = Point([1,0,1], c='y') p2 = Point([0,0,2], c='r') @@ -14,14 +15,7 @@ l3 = Light(p3, c='b') l4 = Light(p4, c='w', intensity=0.5) -show(man, l1, l2, l3, l4, p1, p2, p3, p4, __doc__, axes=1, viewup='z').close() - - - -##################################################### -##### Equivalent code using a Plotter instance: ##### -##################################################### -# plt = Plotter(axes=1) -# plt += [man, p1, p2, p3, p4, l1, l2, l3, l4] -# plt.show(viewup='z') -##################################################### +show( + man, l1, l2, l3, l4, p1, p2, p3, p4, + __doc__, axes=1, viewup='z', +).close() diff --git a/vedo/plotter.py b/vedo/plotter.py index cb4b37e4..b7edf37c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -760,7 +760,6 @@ def __init__( ##################################################################### ..init ends here. - def __iadd__(self, actors): self.add(actors) return self @@ -2688,6 +2687,7 @@ def _scan_input_return_acts(self, wannabe_acts): if not utils.is_sequence(wannabe_acts): wannabe_acts = [wannabe_acts] + ################# wannabe_acts2 = [] for a in wannabe_acts: @@ -2712,9 +2712,7 @@ def _scan_input_return_acts(self, wannabe_acts): wannabe_acts2.append(sh.actor) except AttributeError: pass - # try: wannabe_acts2.append(a.axes) - # except AttributeError: pass - + ################# scanned_acts = [] for a in wannabe_acts2: # scan content of list diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 0400540f..e0bd90ce 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -71,16 +71,21 @@ def merge(*meshs, flag=False): varr = utils.numpy2vtk(idarr, dtype=np.uint16, name="OriginalMeshID") mpoly.GetPointData().AddArray(varr) - if isinstance(objs[0], vedo.Mesh): + has_mesh = False + for ob in objs: + if isinstance(ob, vedo.Mesh): + has_mesh = True + break + + if has_mesh: msh = vedo.Mesh(mpoly) else: msh = Points(mpoly) - if isinstance(objs[0], vtk.vtkActor): - cprp = vtk.vtkProperty() - cprp.DeepCopy(objs[0].GetProperty()) - msh.actor.SetProperty(cprp) - msh.property = cprp + cprp = vtk.vtkProperty() + cprp.DeepCopy(objs[0].property) + msh.actor.SetProperty(cprp) + msh.property = cprp msh.pipeline = utils.OperationNode( "merge", @@ -468,8 +473,8 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): pos = pos.pos() if len(pos) == 2: pos = (pos[0], pos[1], 0.0) - pd = utils.buildPolyData([pos]) - pt = Points(pd, r, c, alpha) + pt = Points([[0,0,0]], r, c, alpha) + pt.pos(pos) pt.name = "Point" return pt diff --git a/vedo/shapes.py b/vedo/shapes.py index 29981bf8..6e7da2f5 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2125,7 +2125,9 @@ def __init__( head_length=0.225, head_width=0.175, fill=True, - ): + c="red4", + alpha=1.0, + ): """ Build a 2D arrow from `start_pt` to `end_pt`. @@ -2200,7 +2202,7 @@ def __init__( tf.SetTransform(t) tf.Update() - super().__init__(tf.GetOutput(), c="k1") + super().__init__(tf.GetOutput(), c, alpha) self.pos(start_pt) self.lighting("off") self.actor.DragableOff() @@ -2708,7 +2710,7 @@ class Spheres(Mesh): Build a large set of spheres. """ - def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): + def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): """ Build a (possibly large) set of spheres at `centers` of radius `r`. @@ -3246,8 +3248,9 @@ class Box(Mesh): Build a box of specified dimensions. """ - def __init__(self, pos=(0, 0, 0), - length=1.0, width=2.0, height=3.0, size=(), c="g4", alpha=1.0): + def __init__( + self, pos=(0, 0, 0), + length=1.0, width=2.0, height=3.0, size=(), c="g4", alpha=1.0): """ Build a box of dimensions `x=length, y=width and z=height`. Alternatively dimensions can be defined by setting `size` keyword with a tuple. @@ -3447,7 +3450,8 @@ class Cylinder(Mesh): """ def __init__( - self, pos=(0, 0, 0), r=1.0, height=2.0, axis=(0, 0, 1), cap=True, res=24, c="teal3", alpha=1.0 + self, pos=(0, 0, 0), r=1.0, height=2.0, axis=(0, 0, 1), + cap=True, res=24, c="teal3", alpha=1.0 ): """ Build a cylinder of specified height and radius `r`, centered at `pos`. From 574a2a17e50e36f3c49c67fcb31a96abcc347e29 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 19:48:05 +0200 Subject: [PATCH 048/251] fix _keypress() --- docs/changes.md | 1 - examples/basic/sliders3d.py | 2 +- vedo/plotter.py | 205 ++++++++++++++++++------------------ vedo/pointcloud.py | 4 +- vedo/utils.py | 33 +++--- 5 files changed, 125 insertions(+), 120 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 1afe5b34..a9f23bb5 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -33,7 +33,6 @@ examples/volumetric/slicer1.py ### Broken Examples ``` -lights.py ``` diff --git a/examples/basic/sliders3d.py b/examples/basic/sliders3d.py index 6211f734..31ee6ad8 100644 --- a/examples/basic/sliders3d.py +++ b/examples/basic/sliders3d.py @@ -20,7 +20,7 @@ def slider_y(widget, event): s=0.04, c="r", rotation=45, - title="y position", + title="position", ) plt.show(mesh, __doc__, axes=11, bg='bb', bg2='navy') diff --git a/vedo/plotter.py b/vedo/plotter.py index b7edf37c..6c3796ab 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -404,7 +404,9 @@ def __init__( self.objects = [] # list of actors to be shown - self.clicked_object = None # holds the actor that has been clicked + self.clicked_object = None # holds the object that has been clicked + self.clicked_actor = None # holds the actor that has been clicked + self.renderer = None # current renderer self.renderers = [] # list of renderers self.shape = shape # don't remove this line @@ -474,6 +476,7 @@ def __init__( if self.title == "vedo": # check if dev version if "dev" in vedo.__version__: self.title = f"vedo ({vedo.__version__})" + self.window.SetWindowName(self.title) # more settings if settings.use_depth_peeling: @@ -3426,36 +3429,38 @@ def _mouseleftclick(self, iren, event): self.renderer = renderer - clicked_object = picker.GetActor() - # clicked_object2D = picker.GetActor2D() + clicked_actor = picker.GetActor() + # clicked_actor2D = picker.GetActor2D() - # print('_mouseleftclick mouse at', x, y) - # print("picked Volume:", [picker.GetVolume()]) - # print("picked Actor2D:", [picker.GetActor2D()]) - # print("picked Assembly:", [picker.GetAssembly()]) - # print("picked Prop3D:", [picker.GetProp3D()]) + print('_mouseleftclick mouse at', x, y) + print("picked Volume:", [picker.GetVolume()]) + print("picked Actor2D:", [picker.GetActor2D()]) + print("picked Assembly:", [picker.GetAssembly()]) + print("picked Prop3D:", [picker.GetProp3D()]) - if not clicked_object: - clicked_object = picker.GetAssembly() + if not clicked_actor: + clicked_actor = picker.GetAssembly() - if not clicked_object: - clicked_object = picker.GetProp3D() + if not clicked_actor: + clicked_actor = picker.GetProp3D() - if not hasattr(clicked_object, "GetPickable") or not clicked_object.GetPickable(): + if not hasattr(clicked_actor, "GetPickable") or not clicked_actor.GetPickable(): return self.picked3d = picker.GetPickPosition() self.picked2d = np.array([x, y]) - if not clicked_object: + if not clicked_actor: return self.justremoved = None + self.clicked_actor = clicked_actor - self.clicked_object = clicked_object - if hasattr(clicked_object, "picked3d"): # might be not a vedo obj - clicked_object.picked3d = picker.GetPickPosition() - x, y = iren.GetEventPosition() + if hasattr(clicked_actor, "data"): # might be not a vedo obj + self.clicked_object = clicked_actor.data + # save this info in the object itself + self.clicked_object.picked3d = self.picked3d + self.clicked_object.picked2d = self.picked2d # ----------- if "Histogram1D" in picker.GetAssembly().__class__.__name__: @@ -3463,14 +3468,13 @@ def _mouseleftclick(self, iren, event): if histo.verbose: x = self.picked3d[0] idx = np.digitize(x, histo.edges) - 1 - f = histo.frequencies[idx] - cn = histo.centers[idx] + f = histo.data.frequencies[idx] + cn = histo.data.centers[idx] vedo.colors.printc(f"{histo.name}, bin={idx}, center={cn}, value={f}") ####################################################################### def _keypress(self, iren, event): - # NB: qt creates and passes a vtkGenericRenderWindowInteractor key = iren.GetKeySym() @@ -3487,11 +3491,9 @@ def _keypress(self, iren, event): if iren.GetAltKey(): key = "Alt+" + key - # utils.vedo.printc('Pressed key:', key, c='y', box='-') + utils.vedo.printc('Pressed key:', key, c='y', box='-') # print(key, iren.GetShiftKey(), iren.GetAltKey(), iren.GetControlKey(), # iren.GetKeyCode(), iren.GetRepeatCount()) - # iren.ExitCallback() - # return x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) @@ -3507,28 +3509,28 @@ def _keypress(self, iren, event): elif key == "Down": if self.clicked_object in self.get_meshes(): - self.clicked_object.property.SetOpacity(0.02) - bfp = self.clicked_object.actor.GetBackfaceProperty() - if bfp and hasattr(self.clicked_object, "property_backface"): + self.clicked_object.alpha(0.02) + if hasattr(self.clicked_object, "property_backface"): + bfp = self.clicked_actor.GetBackfaceProperty() self.clicked_object.property_backface = bfp # save it - self.clicked_object.actor.SetBackfaceProperty(None) + self.clicked_actor.SetBackfaceProperty(None) else: - for a in self.get_meshes(): - a.property.SetOpacity(0.02) - bfp = a.actor.GetBackfaceProperty() - if bfp and hasattr(a, "property_backface"): - a.property_backface = bfp - a.actor.SetBackfaceProperty(None) + for obj in self.get_meshes(): + obj.alpha(0.02) + bfp = obj.actor.GetBackfaceProperty() + if bfp and hasattr(obj, "property_backface"): + obj.property_backface = bfp + obj.actor.SetBackfaceProperty(None) elif key == "Left": if self.clicked_object in self.get_meshes(): ap = self.clicked_object.property aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) - bfp = self.clicked_object.actor.GetBackfaceProperty() + bfp = self.clicked_actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_object, "property_backface"): self.clicked_object.property_backface = bfp - self.clicked_object.actor.SetBackfaceProperty(None) + self.clicked_actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): ap = a.property @@ -3550,7 +3552,8 @@ def _keypress(self, iren, event): and self.clicked_object.property_backface ): # put back - self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.property_backface) + self.clicked_actor.SetBackfaceProperty( + self.clicked_object.property_backface) else: for a in self.get_meshes(): ap = a.property @@ -3559,7 +3562,7 @@ def _keypress(self, iren, event): if aal == 1 and hasattr(a, "property_backface") and a.property_backface: a.actor.SetBackfaceProperty(a.property_backface) - elif key in ("slash", "Up"): + elif key == "Up": if self.clicked_object in self.get_meshes(): self.clicked_object.property.SetOpacity(1) if hasattr(self.clicked_object, "property_backface") and self.clicked_object.property_backface: @@ -3572,10 +3575,10 @@ def _keypress(self, iren, event): elif key == "P": if self.clicked_object in self.get_meshes(): - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() - for ia in acts: + objs = self.get_meshes() + for ia in objs: try: ps = ia.property.GetPointSize() if ps > 1: @@ -3586,10 +3589,10 @@ def _keypress(self, iren, event): elif key == "p": if self.clicked_object in self.get_meshes(): - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() - for ia in acts: + objs = self.get_meshes() + for ia in objs: try: ps = ia.property.GetPointSize() ia.property.SetPointSize(ps + 2) @@ -3760,17 +3763,17 @@ def _keypress(self, iren, event): elif key == "s": if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.property.SetRepresentationToSurface() + self.clicked_object.wireframe(False) else: for a in self.get_meshes(): - a.property.SetRepresentationToSurface() + a.wireframe() elif key == "1": self._icol += 1 - if isinstance(self.clicked_object, vtk.vtkActor): - self.clicked_object.GetMapper().ScalarVisibilityOff() + if self.clicked_object: + self.clicked_object.mapper.ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] - self.clicked_object.GetProperty().SetColor(pal[(self._icol) % 10]) + self.clicked_object.c(pal[(self._icol) % 10]) elif key == "2": bsc = ["k1", "k2", "k3", "k4", @@ -3781,10 +3784,10 @@ def _keypress(self, iren, event): "o1", "o2", "o3", "o4", "y1", "y2", "y3", "y4"] self._icol += 1 - if isinstance(self.clicked_object, vtk.vtkActor): - self.clicked_object.GetMapper().ScalarVisibilityOff() + if self.clicked_object: + self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) - self.clicked_object.GetProperty().SetColor(newcol) + self.clicked_object.c(newcol) elif key == "3": bsc = ["k6", "k7", "k8", "k9", @@ -3795,42 +3798,44 @@ def _keypress(self, iren, event): "o6", "o7", "o8", "o9", "y6", "y7", "y8", "y9"] self._icol += 1 - if isinstance(self.clicked_object, vtk.vtkActor): - self.clicked_object.GetMapper().ScalarVisibilityOff() + if self.clicked_object: + self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) - self.clicked_object.GetProperty().SetColor(newcol) + self.clicked_object.c(newcol) elif key == "4": if self.clicked_object: - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() - for ia in acts: - if not hasattr(ia, "_cmap_name"): - continue - cmap_name = ia._cmap_name - if not cmap_name: - cmap_name = "rainbow" - if isinstance(ia, vedo.pointcloud.Points): - arnames = ia.pointdata.keys() - if len(arnames) > 0: - arnam = arnames[ia._scals_idx] - if arnam and ("normals" not in arnam.lower()): # exclude normals - ia.cmap(cmap_name, arnam, on="points") - vedo.printc("..active point data set to:", arnam, c="g", bold=0) - ia._scals_idx += 1 - if ia._scals_idx >= len(arnames): - ia._scals_idx = 0 - else: - arnames = ia.celldata.keys() - if len(arnames) > 0: - arnam = arnames[ia._scals_idx] - if arnam and ("normals" not in arnam.lower()): # exclude normals - ia.cmap(cmap_name, arnam, on="cells") - vedo.printc("..active cell array set to:", arnam, c="g", bold=0) - ia._scals_idx += 1 - if ia._scals_idx >= len(arnames): - ia._scals_idx = 0 + objs = self.get_meshes() + # TODO: this is not working + # print("objs", objs._cmap_name) + # for ia in objs: + # if not hasattr(ia, "_cmap_name"): + # continue + # cmap_name = ia._cmap_name + # if not cmap_name: + # cmap_name = "rainbow" + # if isinstance(ia, vedo.pointcloud.Points): + # arnames = ia.pointdata.keys() + # if len(arnames) > 0: + # arnam = arnames[ia._scals_idx] + # if arnam and ("normals" not in arnam.lower()): # exclude normals + # ia.cmap(cmap_name, arnam, on="points") + # vedo.printc("..active point data set to:", arnam, c="g", bold=0) + # ia._scals_idx += 1 + # if ia._scals_idx >= len(arnames): + # ia._scals_idx = 0 + # else: + # arnames = ia.celldata.keys() + # if len(arnames) > 0: + # arnam = arnames[ia._scals_idx] + # if arnam and ("normals" not in arnam.lower()): # exclude normals + # ia.cmap(cmap_name, arnam, on="cells") + # vedo.printc("..active cell array set to:", arnam, c="g", bold=0) + # ia._scals_idx += 1 + # if ia._scals_idx >= len(arnames): + # ia._scals_idx = 0 elif key == "5": bgc = np.array(renderer.GetBackground()).sum() / 3 @@ -3893,7 +3898,7 @@ def _keypress(self, iren, event): self.axes += 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes + 1) % 15, c=None, bounds=bns) - self.interactor.Render() + self.render() elif "KP_" in key or key in [ "Insert", @@ -3982,10 +3987,10 @@ def _keypress(self, iren, event): elif key == "l": if self.clicked_object in self.get_meshes(): - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() - for ia in acts: + objs = self.get_meshes() + for ia in objs: try: ev = ia.property.GetEdgeVisibility() ia.property.SetEdgeVisibility(not ev) @@ -3996,11 +4001,11 @@ def _keypress(self, iren, event): elif key == "k": # lightings if self.clicked_object in self.get_meshes(): - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() + objs = self.get_meshes() shds = ("default", "metallic", "plastic", "shiny", "glossy", "off") - for ia in acts: + for ia in objs: try: lnr = (ia._ligthingnr + 1) % 6 ia.lighting(shds[lnr]) @@ -4010,10 +4015,10 @@ def _keypress(self, iren, event): elif key == "K": # shading if self.clicked_object in self.get_meshes(): - acts = [self.clicked_object] + objs = [self.clicked_object] else: - acts = self.get_meshes() - for ia in acts: + objs = self.get_meshes() + for ia in objs: if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) intrp = ia.property.GetInterpolation() @@ -4024,19 +4029,19 @@ def _keypress(self, iren, event): elif key == "n": # show normals to an actor if self.clicked_object in self.get_meshes(): - if self.clicked_object.GetPickable(): - self.renderer.AddActor(vedo.shapes.NormalLines(self.clicked_object)) + if self.clicked_actor.GetPickable(): + norml = vedo.shapes.NormalLines(self.clicked_object) + self.add(norml) iren.Render() - else: - print("Click an actor and press n to add normals.") elif key == "x": if self.justremoved is None: + print(self.get_meshes()) if self.clicked_object in self.get_meshes() or isinstance( self.clicked_object, vtk.vtkAssembly ): - self.justremoved = self.clicked_object - self.renderer.RemoveActor(self.clicked_object) + self.justremoved = self.clicked_actor + self.renderer.RemoveActor(self.clicked_actor) else: self.renderer.AddActor(self.justremoved) self.renderer.Render() @@ -4070,7 +4075,7 @@ def _keypress(self, iren, event): elif key == "i": # print info if self.clicked_object: - utils.print_info(self.clicked_object.data) + utils.print_info(self.clicked_object) else: utils.print_info(self) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index e0bd90ce..6a164581 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -539,9 +539,9 @@ def alpha(self, opacity=None): if bfp: if opacity < 1: self.property_backface = bfp - self.property.SetBackfaceProperty(None) + self.actor.SetBackfaceProperty(None) else: - self.property.SetBackfaceProperty(self.property_backface) + self.actor.SetBackfaceProperty(self.property_backface) return self diff --git a/vedo/utils.py b/vedo/utils.py index 92a9fdb5..b2cf9a64 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1460,12 +1460,13 @@ def _print_data(poly, c): vedo.printc("no point or cell data is present.", c=c, bold=False) ################################ - def _print_vtkactor(objt): - poly = objt - actor = objt.actor - pro = objt.property + def _print_vtkactor(obj): + poly = obj + actor = obj + mapper = obj.mapper + pro = obj.property - if not actor.GetPickable(): + if not obj.actor.GetPickable(): return pro = poly.property @@ -1493,13 +1494,13 @@ def _print_vtkactor(objt): vedo.printc("file name".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(actor.filename, c="g", bold=False) - if not actor.GetMapper().GetScalarVisibility(): + if not mapper.GetScalarVisibility(): vedo.printc("color".ljust(14) + ": ", c="g", bold=True, end="") cname = vedo.colors.get_color_name(pro.GetColor()) vedo.printc(f"{cname}, rgb={col}, alpha={alpha}", c="g", bold=False) - if actor.GetBackfaceProperty(): - bcol = actor.GetBackfaceProperty().GetDiffuseColor() + if obj.actor.GetBackfaceProperty(): + bcol = obj.actor.GetBackfaceProperty().GetDiffuseColor() cname = vedo.colors.get_color_name(bcol) vedo.printc("back color".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(f"{cname}, rgb={precision(bcol,3)}", c="g", bold=False) @@ -1516,16 +1517,16 @@ def _print_vtkactor(objt): vedo.printc("scale".ljust(14) + ":", c="g", bold=True, end=" ") vedo.printc(precision(actor.GetScale(), 3), c="g", bold=False) - if hasattr(actor, "polydata") and actor.npoints: + if obj.npoints: vedo.printc("center of mass".ljust(14) + ":", c="g", bold=True, end=" ") - cm = tuple(actor.center_of_mass()) + cm = tuple(obj.center_of_mass()) vedo.printc(precision(cm, 3), c="g", bold=False) vedo.printc("average size".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc(precision(actor.average_size(), 6), c="g", bold=False) + vedo.printc(precision(obj.average_size(), 6), c="g", bold=False) vedo.printc("diagonal size".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc(precision(actor.diagonal_size(), 6), c="g", bold=False) + vedo.printc(precision(obj.diagonal_size(), 6), c="g", bold=False) vedo.printc("bounds".ljust(14) + ":", c="g", bold=True, end=" ") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) @@ -1537,12 +1538,12 @@ def _print_vtkactor(objt): _print_data(poly, "g") - if hasattr(actor, "picked3d") and actor.picked3d is not None: - idpt = actor.closest_point(actor.picked3d, return_point_id=True) - idcell = actor.closest_point(actor.picked3d, return_cell_id=True) + if hasattr(obj, "picked3d") and obj.picked3d is not None: + idpt = obj.closest_point(obj.picked3d, return_point_id=True) + idcell = obj.closest_point(obj.picked3d, return_cell_id=True) vedo.printc( "clicked point".ljust(14) + ":", - precision(actor.picked3d, 6), + precision(obj.picked3d, 6), f"pointID={idpt}, cellID={idcell}", c="g", bold=True, From 758c19b37ba1d8f588d756bbbd78985f0dbde500 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 19:57:02 +0200 Subject: [PATCH 049/251] bump version dev4 --- vedo/plotter.py | 12 ++++++------ vedo/version.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 6c3796ab..2821b6af 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3432,11 +3432,11 @@ def _mouseleftclick(self, iren, event): clicked_actor = picker.GetActor() # clicked_actor2D = picker.GetActor2D() - print('_mouseleftclick mouse at', x, y) - print("picked Volume:", [picker.GetVolume()]) - print("picked Actor2D:", [picker.GetActor2D()]) - print("picked Assembly:", [picker.GetAssembly()]) - print("picked Prop3D:", [picker.GetProp3D()]) + # print('_mouseleftclick mouse at', x, y) + # print("picked Volume:", [picker.GetVolume()]) + # print("picked Actor2D:", [picker.GetActor2D()]) + # print("picked Assembly:", [picker.GetAssembly()]) + # print("picked Prop3D:", [picker.GetProp3D()]) if not clicked_actor: clicked_actor = picker.GetAssembly() @@ -3491,7 +3491,7 @@ def _keypress(self, iren, event): if iren.GetAltKey(): key = "Alt+" + key - utils.vedo.printc('Pressed key:', key, c='y', box='-') + # utils.vedo.printc('Pressed key:', key, c='y', box='-') # print(key, iren.GetShiftKey(), iren.GetAltKey(), iren.GetControlKey(), # iren.GetKeyCode(), iren.GetRepeatCount()) diff --git a/vedo/version.py b/vedo/version.py index c1fe1158..1cba1672 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev3' +_version = '2023.5.0+dev4' From 96f87aa94fde24a846afd09f81aaf66d2ae9be47 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 20:44:21 +0200 Subject: [PATCH 050/251] inherit experiment done --- vedo/assembly.py | 6 +++--- vedo/pointcloud.py | 12 ++++-------- vedo/transformations.py | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index 0388b1a6..9326ba63 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -238,8 +238,8 @@ def __init__(self, *meshs): self.transform = LinearTransform() - self.objects = meshs - self.actors = [m.actor for m in self.objects] + self.objects = [m for m in meshs if m] + self.actors = [m.actor for m in self.objects] if self.objects: self.base = self.objects[0].base @@ -364,7 +364,7 @@ def __contains__(self, obj): return obj in self.objects - def apply_transform(self, LT, concatenate=1): + def apply_transform(self, LT, concatenate=True): """Apply a linear transformation to the object.""" if concatenate: self.transform.concatenate(LT) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 6a164581..429ab5e3 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -493,7 +493,7 @@ def __init__(self): self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI - self._cmap_name = "" # remember the name for self._keypress + self._cmap_name = "" # remember the cmap name for self._keypress try: self.property.RenderPointsAsSpheresOn() @@ -576,7 +576,7 @@ def ps(self, pointsize=None): return self.point_size(pointsize) def render_points_as_spheres(self, value=True): - """Make points look spheric or make them look as squares.""" + """Make points look spheric or else make them look as squares.""" self.property.SetRenderPointsAsSpheres(value) return self @@ -672,12 +672,13 @@ def lighting( return self - def blurring(self, r=1, emissive=False): + def point_blurring(self, r=1, emissive=False): """Set point blurring. Apply a gaussian convolution filter to the points. In this case the radius `r` is in absolute units of the mesh coordinates. With emissive set, the halo of point becomes light-emissive. """ + self.property.SetRepresentationToPoints() if emissive: self.mapper.SetEmissive(bool(emissive)) self.mapper.SetScaleFactor(r * 1.4142) @@ -704,11 +705,6 @@ def blurring(self, r=1, emissive=False): return self - def cell_individual_colors(self, colorlist): - self.cellcolors = colorlist - print("Please use property mesh.cellcolors=... instead of mesh.cell_individual_colors()") - return self - @property def cellcolors(self): """ diff --git a/vedo/transformations.py b/vedo/transformations.py index 2bcf4f10..1701068b 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -13,7 +13,7 @@ __doc__ = """ Submodule to work with transformations
-![](https://vedo.embl.es/images/basic/pca.png) +![](https://vedo.embl.es/images/feats/transforms.png) """ __all__ = [ From d325b969aa2a0b5124ea621133532671a9b6ae15 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 22:00:49 +0200 Subject: [PATCH 051/251] first try with polydata as member of class Points --- vedo/addons.py | 8 +- vedo/base.py | 79 ++++++++--------- vedo/mesh.py | 122 ++++++++++++------------- vedo/pointcloud.py | 217 +++++++++++++++++++-------------------------- vedo/version.py | 2 +- 5 files changed, 191 insertions(+), 237 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 6e5c1968..7128c90b 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -3725,7 +3725,7 @@ def Axes( shift = 0 if xlab: # xlab is the last created numeric text label.. - lt0, lt1 = xlab.GetBounds()[2:4] + lt0, lt1 = xlab.bounds()[2:4] shift = lt1 - lt0 xt.pos( [(xoffs + xtitle_position) * dx, -(yoffs + xtick_length / 2) * dy - shift, zoffs * dz] @@ -3794,7 +3794,7 @@ def Axes( shift = 0 if ylab: # this is the last created num label.. - lt0, lt1 = ylab.GetBounds()[0:2] + lt0, lt1 = ylab.bounds()[0:2] shift = lt1 - lt0 yt.pos(-(xoffs + ytick_length / 2) * dx - shift, (yoffs + ytitle_position) * dy, zoffs * dz) @@ -3858,7 +3858,7 @@ def Axes( shift = 0 if zlab: # this is the last created one.. - lt0, lt1 = zlab.GetBounds()[0:2] + lt0, lt1 = zlab.bounds()[0:2] shift = lt1 - lt0 zt.pos( -(ztitle_offset + ztick_length / 5) * dx - shift, @@ -4180,7 +4180,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): for a in plt.objects: try: if a.pickable(): - b = a.actor.GetBounds() + b = a.bounds() if b is None: return d = max(b[1] - b[0], b[3] - b[2], b[5] - b[4]) diff --git a/vedo/base.py b/vedo/base.py index 54848a7b..5d42f765 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -296,11 +296,11 @@ def _get_str(pd, header): return out if self.association == 0: - out = _get_str(self.GetPointData(), "Point Data") + out = _get_str(self.dataset.GetPointData(), "Point Data") elif self.association == 1: - out = _get_str(self.GetCellData(), "Cell Data") + out = _get_str(self.dataset.GetCellData(), "Cell Data") elif self.association == 2: - pd = self.GetFieldData() + pd = self.dataset.GetFieldData() if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.actor.name: @@ -373,7 +373,7 @@ def pickable(self, value=None): def draggable(self, value=None): # NOT FUNCTIONAL? """Set/get the draggability property of an object.""" if value is None: - return self.GetDragable() + return self.actor.GetDragable() self.actor.SetDragable(value) return self @@ -414,14 +414,14 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) - tp.SetInputData(self) + tp.SetInputData(self.dataset) tp.Update() out = tp.GetOutput() if deep_copy: - self.DeepCopy(out) + self.dataset.DeepCopy(out) else: - self.ShallowCopy(out) + self.dataset.ShallowCopy(out) # reset the locators self.point_locator = None @@ -713,7 +713,7 @@ def box(self, scale=1, padding=0, fill=False): ) try: pr = vtk.vtkProperty() - pr.DeepCopy(self.GetProperty()) + pr.DeepCopy(self.property) bx.SetProperty(pr) bx.property = pr except (AttributeError, TypeError): @@ -741,7 +741,7 @@ def bounds(self): xmax, ymax, zmax = np.max(pts, axis=0) return (xmin, xmax, ymin, ymax, zmin, zmax) except (AttributeError, ValueError): - return self.GetBounds() + return self.dataset.GetBounds() def xbounds(self, i=None): """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" @@ -773,13 +773,13 @@ def diagonal_size(self): """Get the length of the diagonal of mesh bounding box.""" b = self.bounds() return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - # return self.GetLength() # ???different??? + # return self.dataset.GetLength() # ???different??? def copy_data_from(self, obj): """Copy all data (point and cell data) from this input object""" - self.GetPointData().PassData(obj.GetPointData()) - self.GetCellData().PassData(obj.GetCellData()) + self.dataset.GetPointData().PassData(obj.GetPointData()) + self.dataset.GetCellData().PassData(obj.GetCellData()) self.pipeline = utils.OperationNode( f"copy_data_from\n{obj.__class__.__name__}", parents=[self, obj], @@ -875,12 +875,12 @@ def inputdata(self): @property def npoints(self): """Retrieve the number of points.""" - return self.GetNumberOfPoints() + return self.dataset.GetNumberOfPoints() @property def ncells(self): """Retrieve the number of cells.""" - return self.GetNumberOfCells() + return self.dataset.GetNumberOfCells() def points(self, pts=None): """ @@ -890,14 +890,14 @@ def points(self, pts=None): if pts is None: ### getter if isinstance(self, vedo.Points): - vpts = self.GetPoints() + vpts = self.dataset.GetPoints() elif isinstance(self, vedo.BaseVolume): v2p = vtk.vtkImageToPoints() v2p.SetInputData(self.imagedata()) v2p.Update() vpts = v2p.GetOutput().GetPoints() else: # tetmesh et al - vpts = self.GetPoints() + vpts = self.dataset.GetPoints() if vpts: return utils.vtk2numpy(vpts.GetData()) @@ -910,7 +910,7 @@ def points(self, pts=None): if pts.ndim == 1: ### getter by point index ################### indices = pts.astype(int) - vpts = self.GetPoints() + vpts = self.dataset.GetPoints() arr = utils.vtk2numpy(vpts.GetData()) return arr[indices] ########### @@ -919,7 +919,7 @@ def points(self, pts=None): pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] arr = utils.numpy2vtk(pts, dtype=np.float32) - vpts = self.GetPoints() + vpts = self.dataset.GetPoints() vpts.SetData(arr) vpts.Modified() # reset mesh to identity matrix position/rotation: @@ -957,7 +957,7 @@ def delete_cells(self, ids): self.Modified() self.mapper.Modified() self.pipeline = utils.OperationNode( - "delete_cells", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" + "delete_cells", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" ) return self @@ -1248,10 +1248,10 @@ def gradient(self, input_array=None, on="points", fast=False): """ gra = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.GetPointData() + varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.GetCellData() + varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if input_array is None: @@ -1291,10 +1291,10 @@ def divergence(self, array_name=None, on="points", fast=False): """ div = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.GetPointData() + varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.GetCellData() + varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: @@ -1334,10 +1334,10 @@ def vorticity(self, array_name=None, on="points", fast=False): """ vort = vtk.vtkGradientFilter() if on.startswith("p"): - varr = self.GetPointData() + varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - varr = self.GetCellData() + varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: @@ -1597,7 +1597,7 @@ def cells(self): The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ - arr1d = utils.vtk2numpy(self.GetCells().GetData()) + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) if arr1d is None: return [] @@ -1644,9 +1644,9 @@ def color(self, col, alpha=None, vmin=None, vmax=None): return self if vmin is None: - vmin, _ = self.GetScalarRange() + vmin, _ = self.dataset.GetScalarRange() if vmax is None: - _, vmax = self.GetScalarRange() + _, vmax = self.dataset.GetScalarRange() ctf = self.property.GetRGBTransferFunction() ctf.RemoveAllPoints() self._color = col @@ -1703,9 +1703,9 @@ def alpha(self, alpha, vmin=None, vmax=None): will get an opacity of 40% and above 123 alpha is set to 90%. """ if vmin is None: - vmin, _ = self.GetScalarRange() + vmin, _ = self.dataset.GetScalarRange() if vmax is None: - _, vmax = self.GetScalarRange() + _, vmax = self.dataset.GetScalarRange() otf = self.property.GetScalarOpacity() otf.RemoveAllPoints() self._alpha = alpha @@ -1775,7 +1775,7 @@ def isosurface(self, value=None, flying_edges=True): ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ - scrange = self.GetScalarRange() + scrange = self.dataset.GetScalarRange() if flying_edges: cf = vtk.vtkFlyingEdges3D() @@ -1839,7 +1839,7 @@ def legosurface( window = vtk.vtkImplicitWindowFunction() window.SetImplicitFunction(dataset) - srng = list(self.GetScalarRange()) + srng = list(self.dataset.GetScalarRange()) if vmin is not None: srng[0] = vmin if vmax is not None: @@ -2046,7 +2046,7 @@ def extract_cells_on_plane(self, origin, normal): self.pipeline = utils.OperationNode( "extract_cells_on_plane", parents=[self], - comment=f"#cells {self.GetNumberOfCells()}", + comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return self @@ -2071,7 +2071,7 @@ def extract_cells_on_sphere(self, center, radius): self.pipeline = utils.OperationNode( "extract_cells_on_sphere", parents=[self], - comment=f"#cells {self.GetNumberOfCells()}", + comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return self @@ -2096,7 +2096,7 @@ def extract_cells_on_cylinder(self, center, axis, radius): self.pipeline = utils.OperationNode( "extract_cells_on_cylinder", parents=[self], - comment=f"#cells {self.GetNumberOfCells()}", + comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) self.DeepCopy(bf.GetOutput()) @@ -2115,7 +2115,7 @@ def clean(self): self.DeepCopy(cl.GetOutput()) self.pipeline = utils.OperationNode( - "clean", parents=[self], comment=f"#cells {self.GetNumberOfCells()}", c="#9e2a2b" + "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b" ) return self @@ -2155,16 +2155,11 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): ug.SetProperty(pr) ug.property = pr - # assign the same transformation to the copy - ug.SetOrigin(self.GetOrigin()) - ug.SetScale(self.GetScale()) - ug.SetOrientation(self.GetOrientation()) - ug.SetPosition(self.GetPosition()) ug.mapper.SetLookupTable(utils.ctf2lut(self)) ug.pipeline = utils.OperationNode( "extract_cells_by_id", parents=[self], - comment=f"#cells {self.GetNumberOfCells()}", + comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) return ug diff --git a/vedo/mesh.py b/vedo/mesh.py index 952e440b..b4cf8708 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -212,7 +212,6 @@ def __init__(self, inputobj=None, c=None, alpha=1): elif isinstance(inputobj, vtk.vtkActor): _data = inputobj.GetMapper().GetInput() - self.mapper.SetInputData(self) self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) @@ -278,7 +277,7 @@ def __init__(self, inputobj=None, c=None, alpha=1): else: # assume [vertices] or vertices _data = buildPolyData(inputobj, None) - elif hasattr(inputobj, "GetOutput"): # passing a vtk object + elif hasattr(inputobj, "GetOutput"): # passing a vtk algorithm if hasattr(inputobj, "Update"): inputobj.Update() if isinstance(inputobj.GetOutput(), vtk.vtkPolyData): @@ -290,12 +289,9 @@ def __init__(self, inputobj=None, c=None, alpha=1): _data = gf.GetOutput() elif isinstance(inputobj, str): - dataset = vedo.file_io.load(inputobj) + dataset = vedo.file_io.load(inputobj).dataset self.filename = inputobj - if "TetMesh" in str(type(dataset)): - _data = dataset.tomesh() - else: - _data = dataset + _data = dataset else: try: @@ -307,8 +303,9 @@ def __init__(self, inputobj=None, c=None, alpha=1): vedo.logger.error(f"cannot build mesh from type {inputtype}") raise RuntimeError() - self.DeepCopy(_data) - self.mapper.SetInputData(self) + self.dataset = _data + + self.mapper.SetInputData(self.dataset) self.actor.SetMapper(self.mapper) self.property.SetInterpolationToPhong() @@ -319,8 +316,8 @@ def __init__(self, inputobj=None, c=None, alpha=1): arrexists = False if c is None: - ptdata = self.GetPointData() - cldata = self.GetCellData() + ptdata = self.dataset.GetPointData() + cldata = self.dataset.GetCellData() exclude = ["normals", "tcoord"] if cldata.GetNumberOfArrays(): @@ -368,7 +365,7 @@ def __init__(self, inputobj=None, c=None, alpha=1): if alpha is not None: self.property.SetOpacity(alpha) - n = self.GetNumberOfPoints() + n = self.dataset.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") self._texture = None @@ -413,15 +410,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self.GetPointData().GetScalars(): - if self.GetPointData().GetScalars().GetName(): - name = self.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" - if self.GetCellData().GetScalars(): - if self.GetCellData().GetScalars().GetName(): - name = self.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ @@ -524,7 +521,7 @@ def edges(self, ids=()): If ids is set, return only the edges of the given cells. """ extractEdges = vtk.vtkExtractEdges() - extractEdges.SetInputData(self) + extractEdges.SetInputData(self.dataset) # eed.UseAllPointsOn() extractEdges.Update() lpoly = extractEdges.GetOutput() @@ -717,7 +714,7 @@ def texture( self.actor.SetTexture(tu) if seam_threshold is not None: - tname = self.GetPointData().GetTCoords().GetName() + tname = self.dataset.GetPointData().GetTCoords().GetName() grad = self.gradient(tname) ugrad, vgrad = np.split(grad, 2, axis=1) ugradm, vgradm = vedo.utils.mag2(ugrad), vedo.utils.mag2(vgrad) @@ -790,8 +787,8 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten pdnorm.SetSplitting(False) # print(pdnorm.GetNonManifoldTraversal()) pdnorm.Update() - self.GetPointData().SetNormals(pdnorm.GetOutput().GetPointData().GetNormals()) - self.GetCellData().SetNormals(pdnorm.GetOutput().GetCellData().GetNormals()) + self.dataset.GetPointData().SetNormals(pdnorm.GetOutput().GetPointData().GetNormals()) + self.dataset.GetCellData().SetNormals(pdnorm.GetOutput().GetCellData().GetNormals()) return self def reverse(self, cells=True, normals=False): @@ -833,7 +830,7 @@ def volume(self): """Get/set the volume occupied by mesh.""" mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) - mass.SetInputData(self) + mass.SetInputData(self.dataset) mass.Update() return mass.GetVolume() @@ -845,7 +842,7 @@ def area(self): """ mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) - mass.SetInputData(self) + mass.SetInputData(self.dataset) mass.Update() return mass.GetSurfaceArea() @@ -855,7 +852,7 @@ def is_closed(self): fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() - fe.SetInputData(self) + fe.SetInputData(self.dataset) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) @@ -866,7 +863,7 @@ def is_manifold(self): fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() - fe.SetInputData(self) + fe.SetInputData(self.dataset) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) @@ -961,7 +958,7 @@ def shrink(self, fraction=0.85): ![](https://vedo.embl.es/images/basic/shrink.png) """ shrink = vtk.vtkShrinkPolyData() - shrink.SetInputData(self) + shrink.SetInputData(self.dataset) shrink.SetShrinkFactor(fraction) shrink.Update() self.point_locator = None @@ -1027,7 +1024,7 @@ def cap(self, return_cap=False): See also: `join()`, `join_segments()`, `slice()`. """ fe = vtk.vtkFeatureEdges() - fe.SetInputData(self) + fe.SetInputData(self.dataset) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOff() @@ -1061,7 +1058,7 @@ def cap(self, return_cap=False): return m polyapp = vtk.vtkAppendPolyData() - polyapp.AddInputData(self) + polyapp.AddInputData(self.dataset) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() @@ -1115,7 +1112,7 @@ def join(self, polys=True, reset=False): sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) - sf.SetInputData(self) + sf.SetInputData(self.dataset) sf.Update() if reset: poly = sf.GetOutput() @@ -1266,7 +1263,7 @@ def triangulate(self, verts=True, lines=True): vedo.logger.debug("input in triangulate() seems to be void! Skip.") return self - tf.SetInputData(self) + tf.SetInputData(self.dataset) tf.Update() self.DeepCopy(tf.GetOutput()) self.lw(0).lighting("default").pickable() @@ -1279,28 +1276,28 @@ def triangulate(self, verts=True, lines=True): def compute_cell_area(self, name="Area"): """Add to this mesh a cell data array containing the areas of the polygonal faces""" csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self) + csf.SetInputData(self.dataset) csf.SetComputeArea(True) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(False) csf.SetAreaArrayName(name) csf.Update() - self.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) + self.dataset.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) return self def compute_cell_vertex_count(self, name="VertexCount"): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self) + csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(True) csf.SetVertexCountArrayName(name) csf.Update() - self.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) + self.dataset.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) return self def compute_quality(self, metric=6): @@ -1350,7 +1347,7 @@ def compute_quality(self, metric=6): ![](https://vedo.embl.es/images/advanced/meshquality.png) """ qf = vtk.vtkMeshQuality() - qf.SetInputData(self) + qf.SetInputData(self.dataset) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() @@ -1377,7 +1374,7 @@ def check_validity(self, tol=0): vald = vtk.vtkCellValidator() if tol: vald.SetTolerance(tol) - vald.SetInputData(self) + vald.SetInputData(self.dataset) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return vtk2numpy(varr) @@ -1400,7 +1397,7 @@ def compute_curvature(self, method=0): ![](https://user-images.githubusercontent.com/32848391/51934810-c2e88c00-2404-11e9-8e7e-ca0b7984bbb7.png) """ curve = vtk.vtkCurvatures() - curve.SetInputData(self) + curve.SetInputData(self.dataset) curve.SetCurvatureType(method) curve.Update() self.DeepCopy(curve.GetOutput()) @@ -1428,7 +1425,7 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ ef = vtk.vtkElevationFilter() - ef.SetInputData(self) + ef.SetInputData(self.dataset) ef.SetLowPoint(low) ef.SetHighPoint(high) ef.SetScalarRange(vrange) @@ -1450,7 +1447,7 @@ def subdivide(self, n=1, method=0, mel=None): Maximum Edge Length (applicable to Adaptive method only). """ triangles = vtk.vtkTriangleFilter() - triangles.SetInputData(self) + triangles.SetInputData(self.dataset) triangles.Update() originalMesh = triangles.GetOutput() if method == 0: @@ -1502,7 +1499,7 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): .. note:: Setting `fraction=0.1` leaves 10% of the original number of vertices """ - poly = self + poly = self.dataset if n: # N = desired number of points npt = poly.GetNumberOfPoints() fraction = n / npt @@ -1587,7 +1584,7 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ - poly = self + poly = self.dataset cl = vtk.vtkCleanPolyData() cl.SetInputData(poly) cl.Update() @@ -1629,7 +1626,7 @@ def fill_holes(self, size=None): mb = self.diagonal_size() size = mb / 10 fh.SetHoleSize(size) - fh.SetInputData(self) + fh.SetInputData(self.dataset) fh.Update() self.DeepCopy(fh.GetOutput()) @@ -1683,7 +1680,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): # sep = vtk.vtkExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(pointsPolydata) - sep.SetSurfaceData(self) + sep.SetSurfaceData(self.dataset) sep.SetInsideOut(invert) sep.Update() @@ -1756,7 +1753,7 @@ def boundaries( if return_point_ids or return_cell_ids: idf = vtk.vtkIdFilter() - idf.SetInputData(self) + idf.SetInputData(self.dataset) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) idf.Update() @@ -1788,7 +1785,7 @@ def boundaries( else: - fe.SetInputData(self) + fe.SetInputData(self.dataset) fe.Update() msh = Mesh(fe.GetOutput(), c="p").lw(5).lighting("off") @@ -1831,7 +1828,7 @@ def imprint(self, loopline, tol=0.01): clean_loop.Update() imp = vtk.vtkImprintFilter() - imp.SetTargetData(self) + imp.SetTargetData(self.dataset) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) imp.BoundaryEdgeInsertionOn() @@ -1928,7 +1925,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): ![](https://vedo.embl.es/images/basic/silhouette1.png) """ sil = vtk.vtkPolyDataSilhouette() - sil.SetInputData(self) + sil.SetInputData(self.dataset) sil.SetBorderEdges(border_edges) if feature_angle is False: sil.SetEnableFeatureAngle(0) @@ -2012,7 +2009,7 @@ def isobands(self, n=10, vmin=None, vmax=None): lut.SetAnnotation(i, values.GetValue(i).ToString()) bcf = vtk.vtkBandedPolyDataContourFilter() - bcf.SetInputData(self) + bcf.SetInputData(self.dataset) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): bcf.SetValue(i, band[2]) @@ -2045,7 +2042,7 @@ def isolines(self, n=10, vmin=None, vmax=None): ![](https://vedo.embl.es/images/pyplot/isolines.png) """ bcf = vtk.vtkContourFilter() - bcf.SetInputData(self) + bcf.SetInputData(self.dataset) r0, r1 = self.GetScalarRange() if vmin is None: vmin = r0 @@ -2110,7 +2107,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): rf = vtk.vtkRotationalExtrusionFilter() # rf = vtk.vtkLinearExtrusionFilter() - rf.SetInputData(self) # must not be transformed + rf.SetInputData(self.dataset) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) rf.SetAngle(rotation) @@ -2223,18 +2220,13 @@ def extract_largest_region(self): conn = vtk.vtkPolyDataConnectivityFilter() conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() - conn.SetInputData(self) + conn.SetInputData(self.dataset) conn.Update() m = Mesh(conn.GetOutput()) pr = vtk.vtkProperty() pr.DeepCopy(self.property) m.SetProperty(pr) m.property = pr - # assign the same transformation - m.SetOrigin(self.GetOrigin()) - m.SetScale(self.GetScale()) - m.SetOrientation(self.GetOrientation()) - m.SetPosition(self.GetPosition()) vis = self.mapper.GetScalarVisibility() m.mapper.SetScalarVisibility(vis) @@ -2303,7 +2295,7 @@ def intersect_with(self, mesh2, tol=1e-06): """ bf = vtk.vtkIntersectionPolyDataFilter() bf.SetGlobalWarningDisplay(0) - poly1 = self + poly1 = self.dataset poly2 = mesh2 bf.SetTolerance(tol) bf.SetInputData(0, poly1) @@ -2341,7 +2333,7 @@ def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): if not self.line_locator: self.line_locator = vtk.vtkOBBTree() - self.line_locator.SetDataSet(self) + self.line_locator.SetDataSet(self.dataset) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 self.line_locator.SetTolerance(tol) @@ -2385,7 +2377,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): plane.SetNormal(normal) cutter = vtk.vtkPolyDataPlaneCutter() - cutter.SetInputData(self) + cutter.SetInputData(self.dataset) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() cutter.ComputeNormalsOff() @@ -2414,7 +2406,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): # n : (int) # number of cuts # """ - # poly = self + # poly = self.dataset # planes = vtk.vtkPlanes() # planes.SetOrigin(numpy2vtk(origins)) @@ -2450,7 +2442,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): # ipdf.SetBoxTolerance(tol) ipdf.SetCellTolerance(tol) - ipdf.SetInputData(0, self) + ipdf.SetInputData(0, self.dataset) ipdf.SetInputData(1, mesh2) ipdf.SetTransform(0, transform0) ipdf.SetTransform(1, transform1) @@ -2502,7 +2494,7 @@ def geodesic(self, start, end): end = pa.closest_point(end, return_point_id=True) dijkstra = vtk.vtkDijkstraGraphGeodesicPath() - dijkstra.SetInputData(self) + dijkstra.SetInputData(self.dataset) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) dijkstra.Update() @@ -2567,7 +2559,7 @@ def binarize( ![](https://vedo.embl.es/images/volumetric/mesh2volume.png) """ # https://vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataToImageData - pd = self + pd = self.dataset whiteImage = vtk.vtkImageData() if direction_matrix: @@ -2657,7 +2649,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu img.AllocateScalars(vtk.VTK_FLOAT, 1) imp = vtk.vtkImplicitPolyDataDistance() - imp.SetInput(self) + imp.SetInput(self.dataset) b2 = bounds[2] b4 = bounds[4] d0, d1, d2 = dims diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 429ab5e3..6887236d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -60,10 +60,10 @@ def merge(*meshs, flag=False): idarr = [] polyapp = vtk.vtkAppendPolyData() - for i, poly in enumerate(objs): - polyapp.AddInputData(poly) + for i, ob in enumerate(objs): + polyapp.AddInputData(ob.dataset) if flag: - idarr += [i] * poly.GetNumberOfPoints() + idarr += [i] * ob.dataset.GetNumberOfPoints() polyapp.Update() mpoly = polyapp.GetOutput() @@ -90,7 +90,7 @@ def merge(*meshs, flag=False): msh.pipeline = utils.OperationNode( "merge", parents=objs, - comment=f"#pts {msh.GetNumberOfPoints()}", + comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh @@ -869,7 +869,7 @@ def cmap( if on.startswith("point"): data = self.GetPointData() - n = self.GetNumberOfPoints() + n = self.dataset.GetPointData() elif on.startswith("cell"): data = self.GetCellData() n = self.GetNumberOfCells() @@ -1135,7 +1135,8 @@ def update_shadows(self): point = sha.info['point'] direction = sha.info['direction'] new_sha = self._compute_shadow(plane, point, direction) - sha.DeepCopy(new_sha) + # sha.DeepCopy(new_sha) + sha._update(new_sha.dataset) return self @@ -1278,7 +1279,7 @@ def labels( else: tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) - if tx_poly.GetNumberOfPoints() == 0: + if tx_poly.dataset.GetPointData() == 0: continue ####################### ninputs += 1 @@ -1794,8 +1795,8 @@ def caption( ################################################### -class Points(PointsVisual, BaseActor, vtk.vtkPolyData): - """>Work with point clouds.""" +class Points(PointsVisual, BaseActor): + """Work with point clouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): """ @@ -1831,10 +1832,12 @@ def fibonacci_sphere(n): ![](https://vedo.embl.es/images/feats/fibonacci.png) """ # super().__init__() ## super is not working here - vtk.vtkPolyData.__init__(self) + # vtk.vtkPolyData.__init__(self) BaseActor.__init__(self) PointsVisual.__init__(self) + self.dataset = vtk.vtkPolyData() + self.transform = LinearTransform() self.actor.data = self # self.name = "Points" # better not to give it a name here @@ -1848,8 +1851,7 @@ def fibonacci_sphere(n): ###### if isinstance(inputobj, vtk.vtkActor): - pd = inputobj.GetMapper().GetInput() - self.DeepCopy(pd) + self.dataset = inputobj.GetMapper().GetInput() pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) @@ -1857,10 +1859,10 @@ def fibonacci_sphere(n): self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtk.vtkPolyData): - self.DeepCopy(inputobj) + self.dataset = inputobj if self.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() - for i in range(self.GetNumberOfPoints()): + for i in range(self.dataset.GetPointData()): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.SetVerts(carr) @@ -1882,14 +1884,14 @@ def fibonacci_sphere(n): c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) - self.DeepCopy(pd) + self.dataset = pd self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}") + self, parents=[], comment=f"#pts {self.dataset.GetPointData()}") elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj - self.DeepCopy(verts) + self.dataset = verts.dataset c = colors.get_color(c) self.property.SetColor(c) @@ -1898,10 +1900,10 @@ def fibonacci_sphere(n): # try to extract the points from a generic VTK input data object try: vvpts = inputobj.GetPoints() - self.SetPoints(vvpts) + self.dataset.SetPoints(vvpts) for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) - self.GetPointData().AddArray(arr) + self.dataset.GetPointData().AddArray(arr) c = colors.get_color(c) self.property.SetColor(c) @@ -1915,12 +1917,27 @@ def fibonacci_sphere(n): self.property.LightingOff() self.actor.SetMapper(self.mapper) - self.mapper.SetInputData(self) + self.mapper.SetInputData(self.dataset) self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.GetNumberOfPoints()}" + self, parents=[], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) + def _update(self, polydata, reset_locators=True): + """Overwrite the polygonal dataset with a new vtkPolyData.""" + self.dataset = polydata + self.mapper.SetInputData(self.dataset) + self.mapper.Modified() + if reset_locators: + self.point_locator = None + self.line_locator = None + self.cell_locator = None + return self + + def polydata(self): + """Return the underlying ``vtkPolyData`` object.""" + print("WARNING: call to .polydata() is obsolete, you can use property `dataset`.") + return self.dataset def _repr_html_(self): """ @@ -2348,7 +2365,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): "distance_to", parents=[self, pcloud], shape="cylinder", - comment=f"#pts {self.GetNumberOfPoints()}", + comment=f"#pts {self.dataset.GetPointData()}", ) return dists @@ -2363,10 +2380,10 @@ def clean(self): cpd.ConvertStripsToPolysOn() cpd.SetInputData(self) cpd.Update() - self.DeepCopy(cpd.GetOutput()) + self.dataset.DeepCopy(cpd.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], - comment=f"#pts {self.GetNumberOfPoints()}" + comment=f"#pts {self.dataset.GetPointData()}" ) return self @@ -2411,11 +2428,11 @@ def subsample(self, fraction, absolute=False): if self.property.GetRepresentation() == 0: ps = self.property.GetPointSize() - self.DeepCopy(cpd.GetOutput()) + self.dataset.DeepCopy(cpd.GetOutput()) self.ps(ps) self.pipeline = utils.OperationNode( - "subsample", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "subsample", parents=[self], comment=f"#pts {self.dataset.GetPointData()}" ) return self @@ -2469,7 +2486,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): gf = vtk.vtkGeometryFilter() gf.SetInputData(thres.GetOutput()) gf.Update() - self.DeepCopy(gf.GetOutput()) + self.dataset.DeepCopy(gf.GetOutput()) self.pipeline = utils.OperationNode("threshold", parents=[self]) return self @@ -2482,7 +2499,7 @@ def quantize(self, value): qp.SetInputData(self) qp.SetQFactor(value) qp.Update() - self.DeepCopy(qp.GetOutput()) + self.dataset.DeepCopy(qp.GetOutput()) self.flat() self.pipeline = utils.OperationNode("quantize", parents=[self]) return self @@ -2570,7 +2587,7 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F ![](https://vedo.embl.es/images/basic/align2.png) """ icp = vtk.vtkIterativeClosestPointTransform() - icp.SetSource(self) + icp.SetSource(self.dataset) icp.SetTarget(target) if invert: icp.Inverse() @@ -2712,11 +2729,11 @@ def mirror(self, axis="x", origin=True): def flip_normals(self): """Flip all mesh normals. Same as `mesh.mirror('n')`.""" rs = vtk.vtkReverseSense() - rs.SetInputData(self) + rs.SetInputData(self.dataset) rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() - self.DeepCopy(rs.GetOutput()) + self.dataset.DeepCopy(rs.GetOutput()) self.pipeline = utils.OperationNode("flip_normals", parents=[self]) return self @@ -2799,7 +2816,7 @@ def interpolate_data_from( kern.SetKernelFootprintToRadius() interpolator = vtk.vtkPointInterpolator() - interpolator.SetInputData(self) + interpolator.SetInputData(self.dataset) interpolator.SetSourceData(points) interpolator.SetKernel(kern) interpolator.SetLocator(locator) @@ -2819,7 +2836,7 @@ def interpolate_data_from( else: cpoly = interpolator.GetOutput() - self.DeepCopy(cpoly) + self.dataset.DeepCopy(cpoly) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self @@ -2994,7 +3011,7 @@ def chamfer_distance(self, pcloud): pcloud.point_locator.BuildLocator() if not self.point_locator: self.point_locator = vtk.vtkPointLocator() - self.point_locator.SetDataSet(self) + self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() ps1 = self.points() @@ -3033,7 +3050,7 @@ def remove_outliers(self, radius, neighbors=5): ![](https://vedo.embl.es/images/basic/clustering.png) """ removal = vtk.vtkRadiusOutlierRemoval() - removal.SetInputData(self) + removal.SetInputData(self.dataset) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) removal.GenerateOutliersOff() @@ -3045,7 +3062,7 @@ def remove_outliers(self, radius, neighbors=5): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) - self.DeepCopy(inputobj) + self.dataset.DeepCopy(inputobj) self.mapper.ScalarVisibilityOff() self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self @@ -3420,7 +3437,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): plane.SetNormal(normal) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() @@ -3428,12 +3445,8 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): clipper.SetValue(0) clipper.Update() - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) + self._update(clipper.GetOutput()) - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_plane", parents=[self]) return self @@ -3461,7 +3474,7 @@ def cut_with_planes(self, origins, normals, invert=False): planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) # must be True + clipper.SetInputData(self.dataset) # must be True clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) clipper.GenerateClippedOutputOff() @@ -3469,12 +3482,8 @@ def cut_with_planes(self, origins, normals, invert=False): clipper.SetValue(0) clipper.Update() - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) + self._update(clipper.GetOutput()) - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_planes", parents=[self]) return self @@ -3512,20 +3521,15 @@ def cut_with_box(self, bounds, invert=False): box.SetBounds(bounds) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() + self._update(clipper.GetOutput()) - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_box", parents=[self]) return self @@ -3562,20 +3566,15 @@ def cut_with_line(self, points, invert=False, closed=True): pplane.SetPolyLine(polyline) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() + self._update(clipper.GetOutput()) - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_line", parents=[self]) return self @@ -3641,20 +3640,15 @@ def cut_with_cookiecutter(self, lines): boundaryPoly = build_loops.GetOutput() ccut = vtk.vtkCookieCutter() - ccut.SetInputData(self) + ccut.SetInputData(self.dataset) ccut.SetLoopsData(boundaryPoly) ccut.SetPointInterpolationToMeshEdges() # ccut.SetPointInterpolationToLoopEdges() ccut.PassCellDataOn() # ccut.PassPointDataOn() ccut.Update() + self._update(ccut.GetOutput()) - cpoly = ccut.GetOutput() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_cookiecutter", parents=[self]) return self @@ -3700,20 +3694,15 @@ def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) cyl.SetRadius(r) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() + self._update(clipper.GetOutput()) - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_cylinder", parents=[self]) return self @@ -3746,19 +3735,14 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): sph.SetRadius(r) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) - clipper.Update() - cpoly = clipper.GetOutput() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None + clipper.Update() + self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_sphere", parents=[self]) return self @@ -3786,8 +3770,8 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ - polymesh = mesh - poly = self + polymesh = mesh.dataset + poly = self.dataset # Create an array to hold distance information signed_distances = vtk.vtkFloatArray() @@ -3827,11 +3811,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): cpoly.GetPointData().SetActiveScalars(currentscals) vis = self.mapper.GetScalarVisibility() - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None + self._update(cpoly) self.pointdata.remove("SignedDistances") self.mapper.SetScalarVisibility(vis) @@ -3886,7 +3866,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() clipper = vtk.vtkExtractPolyDataGeometry() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) @@ -3895,7 +3875,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() - spol.SetInputData(self) + spol.SetInputData(self.dataset) spol.Update() clipper = vtk.vtkClipPolyData() clipper.SetInputData(spol.GetOutput()) @@ -3903,12 +3883,8 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar clipper.SetValue(0.0) clipper.Update() cpoly = clipper.GetOutput() + self._update(clipper.GetOutput()) - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_pointloop", parents=parents) return self @@ -3940,18 +3916,14 @@ def cut_with_scalar(self, value, name="", invert=False): if name: self.pointdata.select(name) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetValue(value) clipper.GenerateClippedOutputOff() clipper.SetInsideOut(not invert) clipper.Update() cpoly = clipper.GetOutput() + self._update(clipper.GetOutput()) - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None self.pipeline = utils.OperationNode("cut_with_scalars", parents=[self]) return self @@ -4005,7 +3977,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No cu.SetBounds(bounds) clipper = vtk.vtkClipPolyData() - clipper.SetInputData(self) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(cu) clipper.InsideOutOn() clipper.GenerateClippedOutputOff() @@ -4013,15 +3985,10 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() - - self.DeepCopy(cpoly) - - self.point_locator = None - self.line_locator = None - self.cell_locator = None + self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode( - "crop", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "crop", parents=[self], comment=f"#pts {self.dataset.GetPointData()}" ) return self @@ -4034,7 +4001,7 @@ def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist= maxdist = self.diagonal_size() / 2 imp = vtk.vtkImplicitModeller() - imp.SetInputData(self) + imp.SetInputData(self.dataset) imp.SetSampleDimensions(res) imp.SetMaximumDistance(maxdist) imp.SetModelBounds(bounds) @@ -4242,7 +4209,7 @@ def reconstruct_surface( z1 + (z1 - z0) * padding, ) - pd = self + pd = self.dataset if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) @@ -4275,7 +4242,7 @@ def reconstruct_surface( m.pipeline = utils.OperationNode( "reconstruct_surface", parents=[self], - comment=f"#pts {m.GetNumberOfPoints()}" + comment=f"#pts {m.dataset.GetPointData()}" ) return m @@ -4290,7 +4257,7 @@ def compute_clustering(self, radius): ![](https://vedo.embl.es/images/basic/clustering.png) """ cluster = vtk.vtkEuclideanClusterExtraction() - cluster.SetInputData(self) + cluster.SetInputData(self.dataset) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) cluster.ColorClustersOn() @@ -4351,7 +4318,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html cpf = vtk.vtkConnectedPointsFilter() - cpf.SetInputData(self) + cpf.SetInputData(self.dataset) cpf.SetRadius(radius) if mode == 0: # Extract all regions pass @@ -4382,7 +4349,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( cpf.SetNormalAngle(angle) cpf.Update() - self.DeepCopy(cpf.GetOutput()) + self._update(cpf.GetOutput(), reset_locators=False) return self def compute_camera_distance(self): @@ -4396,7 +4363,7 @@ def compute_camera_distance(self): dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() - self.DeepCopy(dc.GetOutput()) + self._update(dc.GetOutput(), reset_locators=False) return self def density( @@ -4427,7 +4394,7 @@ def density( ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ pdf = vtk.vtkPointDensityFilter() - pdf.SetInputData(self) + pdf.SetInputData(self.dataset) if not utils.is_sequence(dims): dims = [dims, dims, dims] @@ -4538,7 +4505,7 @@ def _readPoints(): cld.pipeline = utils.OperationNode( "densify", parents=[self], c="#e9c46a:", - comment=f"#pts {cld.GetNumberOfPoints()}" + comment=f"#pts {cld.dataset.GetPointData()}" ) return cld @@ -4571,7 +4538,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu if maxradius is None: maxradius = self.diagonal_size() / 2 dist = vtk.vtkSignedDistance() - dist.SetInputData(self) + dist.SetInputData(self.dataset) dist.SetRadius(maxradius) dist.SetBounds(bounds) dist.SetDimensions(dims) @@ -4692,7 +4659,7 @@ def tovolume( def generate_random_data(self): """Fill a dataset with random attributes""" gen = vtk.vtkRandomAttributeGenerator() - gen.SetInputData(self) + gen.SetInputData(self.dataset) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() gen.GeneratePointNormalsOff() @@ -4700,7 +4667,7 @@ def generate_random_data(self): gen.GenerateCellScalarsOn() gen.Update() - self.DeepCopy(gen.GetOutput()) + self._update(gen.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) return self @@ -4923,7 +4890,7 @@ def visible_points(self, area=(), tol=None, invert=False): ![](https://vedo.embl.es/images/feats/visible_points.png) """ svp = vtk.vtkSelectVisiblePoints() - svp.SetInputData(self) + svp.SetInputData(self.dataset) svp.SetRenderer(vedo.plotter_instance.renderer) if len(area) == 4: diff --git a/vedo/version.py b/vedo/version.py index 1cba1672..964bb5a1 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev4' +_version = '2023.5.0+dev4a' From 36dc173165db566c5ba55f83e0691202a5175d0f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 10 Oct 2023 23:05:59 +0200 Subject: [PATCH 052/251] first successful try --- vedo/addons.py | 4 +- vedo/assembly.py | 2 +- vedo/base.py | 131 ++++++++++++++++++++++----------------------- vedo/mesh.py | 117 ++++++++++++++++++++-------------------- vedo/plotter.py | 2 +- vedo/pointcloud.py | 122 ++++++++++++++++++++--------------------- vedo/shapes.py | 10 ++-- vedo/utils.py | 10 ++-- 8 files changed, 198 insertions(+), 200 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 7128c90b..9d5e2eef 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -830,9 +830,9 @@ def ScalarBar( """ if isinstance(obj, Points): - vtkscalars = obj.GetPointData().GetScalars() + vtkscalars = obj.dataset.GetPointData().GetScalars() if vtkscalars is None: - vtkscalars = obj.GetCellData().GetScalars() + vtkscalars = obj.dataset.GetCellData().GetScalars() if not vtkscalars: return None lut = vtkscalars.GetLookupTable() diff --git a/vedo/assembly.py b/vedo/assembly.py index 9326ba63..4de5f194 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -50,7 +50,7 @@ def procrustes_alignment(sources, rigid=False): if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() - group.AddInputData(source) + group.AddInputData(source.dataset) procrustes = vtk.vtkProcrustesAlignmentFilter() procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) diff --git a/vedo/base.py b/vedo/base.py index 5d42f765..250ab753 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -41,13 +41,13 @@ def __init__(self, obj, association): def __getitem__(self, key): if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() elif self.association == 1: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() elif self.association == 2: - data = self.obj.GetFieldData() + data = self.obj.dataset.GetFieldData() varr = data.GetAbstractArray(key) if isinstance(varr, vtk.vtkStringArray): @@ -72,17 +72,17 @@ def __getitem__(self, key): def __setitem__(self, key, input_array): if self.association == 0: - data = self.obj.GetPointData() - n = self.obj.GetNumberOfPoints() + data = self.obj.dataset.GetPointData() + n = self.obj.dataset.GetNumberOfPoints() self.obj.mapper.SetScalarModeToUsePointData() elif self.association == 1: - data = self.obj.GetCellData() - n = self.obj.GetNumberOfCells() + data = self.obj.dataset.GetCellData() + n = self.obj.dataset.GetNumberOfCells() self.obj.mapper.SetScalarModeToUseCellData() elif self.association == 2: - data = self.obj.GetFieldData() + data = self.obj.dataset.GetFieldData() if not utils.is_sequence(input_array): input_array = [input_array] @@ -140,11 +140,11 @@ def __setitem__(self, key, input_array): def keys(self): """Return the list of available data array names""" if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() elif self.association == 1: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() elif self.association == 2: - data = self.obj.GetFieldData() + data = self.obj.dataset.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() @@ -155,20 +155,20 @@ def keys(self): def remove(self, key): """Remove a data array by name or number""" if self.association == 0: - self.obj.GetPointData().RemoveArray(key) + self.obj.dataset.GetPointData().RemoveArray(key) elif self.association == 1: - self.obj.GetCellData().RemoveArray(key) + self.obj.dataset.GetCellData().RemoveArray(key) elif self.association == 2: - self.obj.GetFieldData().RemoveArray(key) + self.obj.dataset.GetFieldData().RemoveArray(key) def clear(self): """Remove all data associated to this object""" if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() elif self.association == 1: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() elif self.association == 2: - data = self.obj.GetFieldData() + data = self.obj.dataset.GetFieldData() for i in range(data.GetNumberOfArrays()): name = data.GetArray(i).GetName() data.RemoveArray(name) @@ -176,11 +176,11 @@ def clear(self): def rename(self, oldname, newname): """Rename an array""" if self.association == 0: - varr = self.obj.GetPointData().GetArray(oldname) + varr = self.obj.dataset.GetPointData().GetArray(oldname) elif self.association == 1: - varr = self.obj.GetCellData().GetArray(oldname) + varr = self.obj.dataset.GetCellData().GetArray(oldname) elif self.association == 2: - varr = self.obj.GetFieldData().GetArray(oldname) + varr = self.obj.dataset.GetFieldData().GetArray(oldname) if varr: varr.SetName(newname) else: @@ -189,10 +189,10 @@ def rename(self, oldname, newname): def select(self, key): """Select one specific array by its name to make it the `active` one.""" if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): @@ -227,10 +227,10 @@ def select(self, key): def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): @@ -247,10 +247,10 @@ def select_scalars(self, key): def select_vectors(self, key): """Select one specific vector array by its name to make it the `active` one.""" if self.association == 0: - data = self.obj.GetPointData() + data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.obj.GetCellData() + data = self.obj.dataset.GetCellData() self.obj.mapper.SetScalarModeToUseCellData() if isinstance(key, int): @@ -778,8 +778,8 @@ def diagonal_size(self): def copy_data_from(self, obj): """Copy all data (point and cell data) from this input object""" - self.dataset.GetPointData().PassData(obj.GetPointData()) - self.dataset.GetCellData().PassData(obj.GetCellData()) + self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) + self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) self.pipeline = utils.OperationNode( f"copy_data_from\n{obj.__class__.__name__}", parents=[self, obj], @@ -938,10 +938,7 @@ def cell_centers(self): - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) """ vcen = vtk.vtkCellCenters() - if hasattr(self, "polydata"): - vcen.SetInputData(self) - else: - vcen.SetInputData(self) + vcen.SetInputData(self.dataset) vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) @@ -967,7 +964,7 @@ def mark_boundaries(self): A new array called `BoundaryCells` is added to the mesh. """ mb = vtk.vtkMarkBoundaryFilter() - mb.SetInputData(self) + mb.SetInputData(self.datset) mb.Update() self.DeepCopy(mb.GetOutput()) self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) @@ -994,7 +991,7 @@ def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): cellIds = vtk.vtkIdList() self.cell_locator = vtk.vtkCellTreeLocator() - self.cell_locator.SetDataSet(self) + self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cellIds) @@ -1008,7 +1005,7 @@ def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" vc = vtk.vtkCountVertices() - vc.SetInputData(self) + vc.SetInputData(self.datset) vc.SetOutputArrayName("VertexCount") vc.Update() varr = vc.GetOutput().GetCellData().GetArray("VertexCount") @@ -1120,7 +1117,7 @@ def map_cells_to_points(self, arrays=(), move=False): Set `move=True` to delete the original `celldata` array. """ c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(self) + c2p.SetInputData(self.datset) if not move: c2p.PassCellDataOn() if arrays: @@ -1151,7 +1148,7 @@ def map_points_to_cells(self, arrays=(), move=False): - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ p2c = vtk.vtkPointDataToCellData() - p2c.SetInputData(self) + p2c.SetInputData(self.dataset) if not move: p2c.PassPointDataOn() if arrays: @@ -1163,7 +1160,7 @@ def map_points_to_cells(self, arrays=(), move=False): p2c.ProcessAllArraysOn() p2c.Update() self.mapper.SetScalarModeToUseCellData() - self.DeepCopy(p2c.GetOutput()) + self._update(p2c.GetOutput()) self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return self @@ -1194,7 +1191,7 @@ def resample_data_from(self, source, tol=None, categorical=False): ``` """ rs = vtk.vtkResampleWithDataSet() - rs.SetInputData(self) + rs.SetInputData(self.datset) rs.SetSourceData(source) rs.SetPassPointArrays(True) @@ -1207,7 +1204,7 @@ def resample_data_from(self, source, tol=None, categorical=False): rs.SetComputeTolerance(False) rs.SetTolerance(tol) rs.Update() - self.DeepCopy(rs.GetOutput()) + self._update(rs.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode( f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] ) @@ -1216,14 +1213,14 @@ def resample_data_from(self, source, tol=None, categorical=False): def add_ids(self): """Generate point and cell ids arrays.""" ids = vtk.vtkIdFilter() - ids.SetInputData(self) + ids.SetInputData(self.datset) ids.PointIdsOn() ids.CellIdsOn() ids.FieldDataOff() ids.SetPointIdsArrayName("PointID") ids.SetCellIdsArrayName("CellID") ids.Update() - self.DeepCopy(ids.GetOutput()) + self._update(ids.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("add_ids", parents=[self]) return self @@ -1261,7 +1258,7 @@ def gradient(self, input_array=None, on="points", fast=False): vedo.logger.error(f"in gradient: no scalars found for {on}") raise RuntimeError - gra.SetInputData(self) + gra.SetInputData(self.datset) gra.SetInputScalars(tp, input_array) gra.SetResultArrayName("Gradient") gra.SetFasterApproximation(fast) @@ -1304,7 +1301,7 @@ def divergence(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in divergence(): no vectors found for {on}") raise RuntimeError - div.SetInputData(self) + div.SetInputData(self.datset) div.SetInputScalars(tp, array_name) div.ComputeDivergenceOn() div.ComputeGradientOff() @@ -1347,7 +1344,7 @@ def vorticity(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in vorticity(): no vectors found for {on}") raise RuntimeError - vort.SetInputData(self) + vort.SetInputData(self.datset) vort.SetInputScalars(tp, array_name) vort.ComputeDivergenceOff() vort.ComputeGradientOff() @@ -1556,7 +1553,7 @@ def tomesh(self, fill=True, shrink=1.0): gf = vtk.vtkGeometryFilter() if fill: sf = vtk.vtkShrinkFilter() - sf.SetInputData(self) + sf.SetInputData(self.datset) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) @@ -1572,7 +1569,7 @@ def tomesh(self, fill=True, shrink=1.0): cleanPolyData.Update() poly = cleanPolyData.GetOutput() else: - gf.SetInputData(self) + gf.SetInputData(self.datset) gf.Update() poly = gf.GetOutput() @@ -1754,10 +1751,10 @@ def shrink(self, fraction=0.8): ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ sf = vtk.vtkShrinkFilter() - sf.SetInputData(self) + sf.SetInputData(self.datset) sf.SetShrinkFactor(fraction) sf.Update() - self.DeepCopy(sf.GetOutput()) + self._update(sf.GetOutput()) self.pipeline = utils.OperationNode( "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" ) @@ -1784,7 +1781,7 @@ def isosurface(self, value=None, flying_edges=True): cf = vtk.vtkContourFilter() cf.UseScalarTreeOn() - cf.SetInputData(self) + cf.SetInputData(self.datset) cf.ComputeNormalsOn() if utils.is_sequence(value): @@ -1850,7 +1847,7 @@ def legosurface( window.SetWindowRange(srng) extract = vtk.vtkExtractGeometry() - extract.SetInputData(self) + extract.SetInputData(self.datset) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) @@ -1893,7 +1890,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self) + clipper.SetInputData(self.datset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() @@ -1904,14 +1901,14 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return ug else: - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self @@ -1936,7 +1933,7 @@ def cut_with_box(self, box): # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self) + bc.SetInputData(self.datset) if isinstance(box, vtk.vtkProp): boxb = box.GetBounds() else: @@ -1948,14 +1945,14 @@ def cut_with_box(self, box): if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return ug else: - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") return self @@ -2015,14 +2012,14 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal if isinstance(cout, vtk.vtkUnstructuredGrid): ug = vedo.UGrid(cout) if isinstance(self, vedo.UGrid): - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return self ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return ug else: - self.DeepCopy(cout) + self._update(cout) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return self @@ -2031,7 +2028,7 @@ def extract_cells_on_plane(self, origin, normal): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self) + bf.SetInputData(self.datset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2042,7 +2039,7 @@ def extract_cells_on_plane(self, origin, normal): bf.SetImplicitFunction(plane) bf.Update() - self.DeepCopy(bf.GetOutput()) + self._update(bf.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode( "extract_cells_on_plane", parents=[self], @@ -2056,7 +2053,7 @@ def extract_cells_on_sphere(self, center, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self) + bf.SetInputData(self.datset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2067,7 +2064,7 @@ def extract_cells_on_sphere(self, center, radius): bf.SetImplicitFunction(sph) bf.Update() - self.DeepCopy(bf.GetOutput()) + self._update(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_sphere", parents=[self], @@ -2081,7 +2078,7 @@ def extract_cells_on_cylinder(self, center, axis, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self) + bf.SetInputData(self.datset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -2099,7 +2096,7 @@ def extract_cells_on_cylinder(self, center, axis, radius): comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) - self.DeepCopy(bf.GetOutput()) + self._update(bf.GetOutput()) return self def clean(self): @@ -2107,13 +2104,13 @@ def clean(self): Cleanup unused points and empty cells """ cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self) + cl.SetInputData(self.datset) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() cl.AveragePointDataOff() cl.Update() - self.DeepCopy(cl.GetOutput()) + self._update(cl.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b" ) diff --git a/vedo/mesh.py b/vedo/mesh.py index b4cf8708..6ea1aada 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -294,14 +294,14 @@ def __init__(self, inputobj=None, c=None, alpha=1): _data = dataset else: - try: - gf = vtk.vtkGeometryFilter() - gf.SetInputData(inputobj) - gf.Update() - _data = gf.GetOutput() - except: - vedo.logger.error(f"cannot build mesh from type {inputtype}") - raise RuntimeError() + # try: + # gf = vtk.vtkGeometryFilter() + # gf.SetInputData(inputobj) + # gf.Update() + # _data = gf.GetOutput() + # except: + vedo.logger.error(f"cannot build mesh from type {inputtype}") + raise RuntimeError() self.dataset = _data @@ -454,14 +454,14 @@ def faces(self, ids=()): If ids is set, return only the faces of the given cells. """ - arr1d = vtk2numpy(self.GetPolys().GetData()) + arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) if arr1d is None: return [] # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. if len(arr1d) == 0: - arr1d = vtk2numpy(self.GetStrips().GetData()) + arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) if arr1d is None: return [] @@ -494,7 +494,7 @@ def lines(self, flat=False): """ # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - arr1d = vtk2numpy(self.GetLines().GetData()) + arr1d = vtk2numpy(self.dataset.GetLines().GetData()) if arr1d is None: return [] @@ -773,7 +773,7 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ - poly = self + poly = self.dataset pdnorm = vtk.vtkPolyDataNormals() pdnorm.SetInputData(poly) pdnorm.SetComputePointNormals(points) @@ -822,7 +822,7 @@ def reverse(self, cells=True, normals=False): rev.ReverseNormalsOff() rev.SetInputData(poly) rev.Update() - self.DeepCopy(rev.GetOutput()) + self._update(rev.GetOutput(), reset_locators=False) self.pipeline = OperationNode("reverse", parents=[self]) return self @@ -945,7 +945,7 @@ def non_manifold_faces(self, remove=True, tol="auto"): self.delete_cells(toremove) self.pipeline = OperationNode( - "non_manifold_faces", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" + "non_manifold_faces", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" ) return self @@ -963,7 +963,7 @@ def shrink(self, fraction=0.85): shrink.Update() self.point_locator = None self.cell_locator = None - self.DeepCopy(shrink.GetOutput()) + self._update(shrink.GetOutput()) self.pipeline = OperationNode("shrink", parents=[self]) return self @@ -1053,7 +1053,7 @@ def cap(self, return_cap=False): m = Mesh(tf.GetOutput()) m.pipeline = OperationNode( "cap", parents=[self], - comment=f"#pts {m.GetNumberOfPoints()}" + comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) return m @@ -1062,11 +1062,11 @@ def cap(self, return_cap=False): polyapp.AddInputData(tf.GetOutput()) polyapp.Update() - self.DeepCopy(polyapp.GetOutput()) + self._update(polyapp.GetOutput()) self.clean() self.pipeline = OperationNode( - "capped", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "capped", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1129,10 +1129,10 @@ def join(self, polys=True, reset=False): else: poly = sf.GetOutput() - self.DeepCopy(poly) + self._update(poly) self.pipeline = OperationNode( - "join", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "join", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1201,7 +1201,7 @@ def join_segments(self, closed=True, tol=1e-03): newline.pipeline = OperationNode( "join_segments", parents=[self], - comment=f"#pts {newline.GetNumberOfPoints()}", + comment=f"#pts {newline.dataset.GetNumberOfPoints()}", ) vlines.append(newline) @@ -1248,13 +1248,13 @@ def triangulate(self, verts=True, lines=True): if True, break input polylines into line segments. If False, input lines will be ignored and the output will have no lines. """ - if self.GetNumberOfPolys() or self.GetNumberOfStrips(): + if self.dataset.GetNumberOfPolys() or self.dataset.GetNumberOfStrips(): # print("vtkTriangleFilter") tf = vtk.vtkTriangleFilter() tf.SetPassLines(lines) tf.SetPassVerts(verts) - elif self.GetNumberOfLines(): + elif self.dataset.GetNumberOfLines(): # print("vtkContourTriangulator") tf = vtk.vtkContourTriangulator() tf.TriangulationErrorDisplayOn() @@ -1265,11 +1265,11 @@ def triangulate(self, verts=True, lines=True): tf.SetInputData(self.dataset) tf.Update() - self.DeepCopy(tf.GetOutput()) + self._update(tf.GetOutput(), reset_locators=False) self.lw(0).lighting("default").pickable() self.pipeline = OperationNode( - "triangulate", parents=[self], comment=f"#cells {self.GetNumberOfCells()}" + "triangulate", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" ) return self @@ -1351,7 +1351,7 @@ def compute_quality(self, metric=6): qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() - self.DeepCopy(qf.GetOutput()) + self._update(qf.GetOutput(), reset_locators=False) self.pipeline = OperationNode("compute_quality", parents=[self]) return self @@ -1400,7 +1400,7 @@ def compute_curvature(self, method=0): curve.SetInputData(self.dataset) curve.SetCurvatureType(method) curve.Update() - self.DeepCopy(curve.GetOutput()) + self._update(curve.GetOutput(), reset_locators=False) self.mapper.ScalarVisibilityOn() return self @@ -1430,7 +1430,7 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ef.SetHighPoint(high) ef.SetScalarRange(vrange) ef.Update() - self.DeepCopy(ef.GetOutput()) + self._update(ef.GetOutput(), reset_locators=False) self.mapper.ScalarVisibilityOn() return self @@ -1457,7 +1457,7 @@ def subdivide(self, n=1, method=0, mel=None): elif method == 2: sdf = vtk.vtkAdaptiveSubdivisionFilter() if mel is None: - mel = self.diagonal_size() / np.sqrt(self.GetNumberOfPoints()) / n + mel = self.diagonal_size() / np.sqrt(self.dataset.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: sdf = vtk.vtkButterflySubdivisionFilter() @@ -1473,10 +1473,10 @@ def subdivide(self, n=1, method=0, mel=None): sdf.SetInputData(originalMesh) sdf.Update() - self.DeepCopy(sdf.GetOutput()) + self._update(sdf.GetOutput()) self.pipeline = OperationNode( - "subdivide", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "subdivide", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1521,11 +1521,11 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): decimate.SetTargetReduction(1 - fraction) decimate.Update() - self.DeepCopy(decimate.GetOutput()) + self._update(decimate.GetOutput()) self.pipeline = OperationNode( "decimate", parents=[self], - comment=f"#pts {self.GetNumberOfPoints()}" + comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1559,7 +1559,7 @@ def collapse_edges(self, distance, iterations=1): self.compute_normals() self.pipeline = OperationNode( - "collapse_edges", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "collapse_edges", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1600,10 +1600,10 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound smf.SetBoundarySmoothing(boundary) smf.Update() - self.DeepCopy(smf.GetOutput()) + self._update(smf.GetOutput()) self.pipeline = OperationNode( - "smooth", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "smooth", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1629,10 +1629,10 @@ def fill_holes(self, size=None): fh.SetInputData(self.dataset) fh.Update() - self.DeepCopy(fh.GetOutput()) + self._update(fh.GetOutput()) self.pipeline = OperationNode( - "fill_holes", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "fill_holes", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1700,7 +1700,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): pcl.pipeline = OperationNode( "inside_points", parents=[self, ptsa], - comment=f"#pts {pcl.GetNumberOfPoints()}" + comment=f"#pts {pcl.dataset.GetNumberOfPoints()}" ) return pcl @@ -1793,7 +1793,7 @@ def boundaries( "boundaries", parents=[self], shape="octagon", - comment=f"#pts {msh.GetNumberOfPoints()}", + comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh @@ -1835,10 +1835,10 @@ def imprint(self, loopline, tol=0.01): imp.TriangulateOutputOn() imp.Update() - self.DeepCopy(imp.GetOutput()) + self._update(imp.GetOutput()) self.pipeline = OperationNode( - "imprint", parents=[self], comment=f"#pts {self.GetNumberOfPoints()}" + "imprint", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1850,7 +1850,7 @@ def connected_vertices(self, index): ![](https://vedo.embl.es/images/basic/connVtx.png) """ - poly = self + poly = self.dataset cell_idlist = vtk.vtkIdList() poly.GetPointCells(index, cell_idlist) @@ -1873,7 +1873,7 @@ def connected_cells(self, index, return_ids=False): """Find all cellls connected to an input vertex specified by its index.""" # Find all cells connected to point index - dpoly = self + dpoly = self.dataset idlist = vtk.vtkIdList() dpoly.GetPointCells(index, idlist) @@ -1981,7 +1981,7 @@ def isobands(self, n=10, vmin=None, vmax=None): Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) """ - r0, r1 = self.GetScalarRange() + r0, r1 = self.dataset.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: @@ -2043,7 +2043,7 @@ def isolines(self, n=10, vmin=None, vmax=None): """ bcf = vtk.vtkContourFilter() bcf.SetInputData(self.dataset) - r0, r1 = self.GetScalarRange() + r0, r1 = self.dataset.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: @@ -2125,7 +2125,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): m.pipeline = OperationNode( "extrude", parents=[self], - comment=f"#pts {m.GetNumberOfPoints()}" + comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) return m @@ -2149,7 +2149,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T ![](https://vedo.embl.es/images/advanced/splitmesh.png) """ - pd = self + pd = self.dataset if must_share_edge: if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") @@ -2170,7 +2170,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T if flag: self.pipeline = OperationNode("split mesh", parents=[self]) - self.DeepCopy(out) + self._update(out) return self a = Mesh(out) @@ -2205,7 +2205,7 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T l[0].pipeline = OperationNode( f"split mesh {i}", parents=[self], - comment=f"#pts {l[0].GetNumberOfPoints()}", + comment=f"#pts {l[0].dataset.GetNumberOfPoints()}", ) return blist @@ -2232,7 +2232,7 @@ def extract_largest_region(self): m.pipeline = OperationNode( "extract_largest_region", parents=[self], - comment=f"#pts {m.GetNumberOfPoints()}" + comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) return m @@ -2255,8 +2255,8 @@ def boolean(self, operation, mesh2, method=0, tol=None): else: raise ValueError(f"Unknown method={method}") - poly1 = self.compute_normals() - poly2 = mesh2.compute_normals() + poly1 = self.compute_normals().dataset + poly2 = mesh2.compute_normals().dataset if operation.lower() in ("plus", "+"): bf.SetOperationToUnion() @@ -2280,7 +2280,7 @@ def boolean(self, operation, mesh2, method=0, tol=None): "boolean " + operation, parents=[self, mesh2], shape="cylinder", - comment=f"#pts {msh.GetNumberOfPoints()}", + comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh @@ -2389,7 +2389,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], - comment=f"#pts {msh.GetNumberOfPoints()}" + comment=f"#pts {msh.dataset.GetNumberOfPoints()}" ) return msh @@ -2425,7 +2425,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): # msh.pipeline = OperationNode( # "intersect_with_multiplanes", # parents=[self], - # comment=f"#pts {msh.GetNumberOfPoints()}", + # comment=f"#pts {msh.dataset.GetNumberOfPoints()}", # ) # return msh @@ -2467,7 +2467,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): msh.pipeline = OperationNode( "collide_with", parents=[self, mesh2], - comment=f"#pts {msh.GetNumberOfPoints()}" + comment=f"#pts {msh.dataset.GetNumberOfPoints()}" ) return msh @@ -2531,7 +2531,8 @@ def geodesic(self, start, end): dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( - "GeodesicLine", parents=[self], comment=f"#pts {dmesh.GetNumberOfPoints()}" + "GeodesicLine", parents=[self], + comment=f"#pts {dmesh.dataset.GetNumberOfPoints()}" ) return dmesh diff --git a/vedo/plotter.py b/vedo/plotter.py index 2821b6af..dc79725f 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2129,7 +2129,7 @@ def _legfunc(evt): t += f"{created[4:-5]} ({sz})" + "\n" if evt.isPoints: - indata = evt.object + indata = evt.object.dataset if indata.GetNumberOfPoints(): t += ( f"#points/cells: {indata.GetNumberOfPoints()}" diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 6887236d..60d44f12 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -724,7 +724,7 @@ def cellcolors(self): """ if "CellsRGBA" not in self.celldata.keys(): lut = self.mapper.GetLookupTable() - vscalars = self.GetCellData().GetScalars() + vscalars = self.dataset.GetCellData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.ncells, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) @@ -776,7 +776,7 @@ def pointcolors(self): """ if "PointsRGBA" not in self.pointdata.keys(): lut = self.mapper.GetLookupTable() - vscalars = self.GetPointData().GetScalars() + vscalars = self.dataset.GetPointData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.npoints, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) @@ -864,15 +864,15 @@ def cmap( if input_array is None: if not self.pointdata.keys() and self.celldata.keys(): on = "cells" - if not self.GetCellData().GetScalars(): + if not self.dataset.GetCellData().GetScalars(): input_array = 0 # pick the first at hand if on.startswith("point"): - data = self.GetPointData() - n = self.dataset.GetPointData() + data = self.dataset.GetPointData() + n = self.dataset.GetNumberOfPoints() elif on.startswith("cell"): - data = self.GetCellData() - n = self.GetNumberOfCells() + data = self.dataset.GetCellData() + n = self.dataset.GetNumberOfCells() else: vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") raise RuntimeError() @@ -1227,12 +1227,12 @@ def labels( if content is None: mode = 0 if cells: - if self.GetCellData().GetScalars(): - name = self.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + name = self.dataset.GetCellData().GetScalars().GetName() arr = self.celldata[name] else: - if self.GetPointData().GetScalars(): - name = self.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + name = self.dataset.GetPointData().GetScalars().GetName() arr = self.pointdata[name] elif isinstance(content, (str, int)): if content == "id": @@ -1277,9 +1277,9 @@ def labels( tx.Update() tx_poly = tx.GetOutput() else: - tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) + tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify).dataset - if tx_poly.dataset.GetPointData() == 0: + if tx_poly.GetPointData() == 0: continue ####################### ninputs += 1 @@ -1394,7 +1394,7 @@ def labels2d( vedo.logger.error(f"In labels2d: cell array {content} does not exist.") return None cellcloud = Points(self.cell_centers()) - arr = self.GetCellData().GetScalars() + arr = self.dataset.GetCellData().GetScalars() poly = cellcloud poly.GetPointData().SetScalars(arr) else: @@ -1744,7 +1744,7 @@ def caption( c = colors.get_color(c) if point is None: - x0, x1, y0, y1, _, z1 = self.GetBounds() + x0, x1, y0, y1, _, z1 = self.dataset.GetBounds() pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] point = self.closest_point(pt) @@ -1851,7 +1851,7 @@ def fibonacci_sphere(n): ###### if isinstance(inputobj, vtk.vtkActor): - self.dataset = inputobj.GetMapper().GetInput() + self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) @@ -1859,8 +1859,8 @@ def fibonacci_sphere(n): self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtk.vtkPolyData): - self.dataset = inputobj - if self.GetNumberOfCells() == 0: + self.dataset.DeepCopy(inputobj) + if self.dataset.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(self.dataset.GetPointData()): carr.InsertNextCell(1) @@ -1980,15 +1980,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self.GetPointData().GetScalars(): - if self.GetPointData().GetScalars().GetName(): - name = self.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" - if self.GetCellData().GetScalars(): - if self.GetCellData().GetScalars().GetName(): - name = self.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ @@ -2052,9 +2052,9 @@ def clone(self, deep=True): ![](https://vedo.embl.es/images/basic/mirror.png) """ if isinstance(self, vedo.Mesh): - cloned = vedo.Mesh(self) + cloned = vedo.Mesh(self.dataset) else: - cloned = Points(self) + cloned = Points(self.dataset) pr = vtk.vtkProperty() pr.DeepCopy(self.property) @@ -2207,15 +2207,15 @@ def delete_cells_by_point_index(self, indices): ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) """ cell_ids = vtk.vtkIdList() - self.BuildLinks() + self.dataset.BuildLinks() n = 0 for i in np.unique(indices): - self.GetPointCells(i, cell_ids) + self.dataset.GetPointCells(i, cell_ids) for j in range(cell_ids.GetNumberOfIds()): - self.DeleteCell(cell_ids.GetId(j)) # flag cell + self.dataset.DeleteCell(cell_ids.GetId(j)) # flag cell n += 1 - self.RemoveDeletedCells() + self.dataset.RemoveDeletedCells() self.mapper.Modified() self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) return self @@ -2237,7 +2237,7 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): invert : (bool) flip all normals """ - poly = self + poly = self.dataset pcan = vtk.vtkPCANormalEstimation() pcan.SetInputData(poly) pcan.SetSampleSize(n) @@ -2254,8 +2254,8 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): varr = pcan.GetOutput().GetPointData().GetNormals() varr.SetName("Normals") - self.GetPointData().SetNormals(varr) - self.GetPointData().Modified() + self.dataset.GetPointData().SetNormals(varr) + self.dataset.GetPointData().Modified() return self def compute_acoplanarity(self, n=25, radius=None, on="points"): @@ -2319,10 +2319,10 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ - if pcloud.GetNumberOfPolys(): + if pcloud.dataset.GetNumberOfPolys(): - poly1 = self - poly2 = pcloud + poly1 = self.dataset + poly2 = pcloud.dataset df = vtk.vtkDistancePolyDataFilter() df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) @@ -2355,8 +2355,8 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): scals = utils.numpy2vtk(dists) scals.SetName(name) - self.GetPointData().AddArray(scals) - self.GetPointData().SetActiveScalars(scals.GetName()) + self.dataset.GetPointData().AddArray(scals) + self.dataset.GetPointData().SetActiveScalars(scals.GetName()) rng = scals.GetRange() self.mapper.SetScalarRange(rng[0], rng[1]) self.mapper.ScalarVisibilityOn() @@ -2378,7 +2378,7 @@ def clean(self): cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self) + cpd.SetInputData(self.dataset) cpd.Update() self.dataset.DeepCopy(cpd.GetOutput()) self.pipeline = utils.OperationNode( @@ -2416,7 +2416,7 @@ def subsample(self, fraction, absolute=False): cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() - cpd.SetInputData(self) + cpd.SetInputData(self.dataset) if absolute: cpd.SetTolerance(fraction / self.diagonal_size()) # cpd.SetToleranceIsAbsolute(absolute) @@ -2454,7 +2454,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ thres = vtk.vtkThreshold() - thres.SetInputData(self) + thres.SetInputData(self.dataset) if on.startswith("c"): asso = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS @@ -2496,7 +2496,7 @@ def quantize(self, value): will be quantized to that absolute grain size. """ qp = vtk.vtkQuantizePolyDataPoints() - qp.SetInputData(self) + qp.SetInputData(self.dataset) qp.SetQFactor(value) qp.Update() self.dataset.DeepCopy(qp.GetOutput()) @@ -2519,14 +2519,14 @@ def average_size(self): def center_of_mass(self): """Get the center of mass of mesh.""" cmf = vtk.vtkCenterOfMass() - cmf.SetInputData(self) + cmf.SetInputData(self.dataset) cmf.Update() c = cmf.GetCenter() return np.array(c) def normal_at(self, i): """Return the normal vector at vertex point `i`.""" - normals = self.GetPointData().GetNormals() + normals = self.dataset.GetPointData().GetNormals() return np.array(normals.GetTuple(i)) def normals(self, cells=False, recompute=True): @@ -2541,16 +2541,16 @@ def normals(self, cells=False, recompute=True): Note that this might modify the number of mesh points. """ if cells: - vtknormals = self.GetCellData().GetNormals() + vtknormals = self.dataset.GetCellData().GetNormals() else: - vtknormals = self.GetPointData().GetNormals() + vtknormals = self.dataset.GetPointData().GetNormals() if not vtknormals and recompute: try: self.compute_normals(cells=cells) if cells: - vtknormals = self.GetCellData().GetNormals() + vtknormals = self.dataset.GetCellData().GetNormals() else: - vtknormals = self.GetPointData().GetNormals() + vtknormals = self.dataset.GetPointData().GetNormals() except AttributeError: # can be that 'Points' object has no attribute 'compute_normals' pass @@ -2588,7 +2588,7 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F """ icp = vtk.vtkIterativeClosestPointTransform() icp.SetSource(self.dataset) - icp.SetTarget(target) + icp.SetTarget(target.dataset) if invert: icp.Inverse() icp.SetMaximumNumberOfIterations(iters) @@ -2627,7 +2627,7 @@ def transform_with_landmarks( for p in source_landmarks: ss.InsertNextPoint(p) else: - ss = source_landmarks.GetPoints() + ss = source_landmarks.dataset.GetPoints() if least_squares: source_landmarks = source_landmarks.points() @@ -2865,8 +2865,8 @@ def add_gaussian_noise(self, sigma=1.0): vpts = vtk.vtkPoints() vpts.SetNumberOfPoints(n) vpts.SetData(utils.numpy2vtk(pts + ns, dtype=np.float32)) - self.SetPoints(vpts) - self.GetPoints().Modified() + self.dataset.SetPoints(vpts) + self.dataset.GetPoints().Modified() self.pointdata["GaussianNoise"] = -ns self.pipeline = utils.OperationNode( "gaussian_noise", parents=[self], shape="egg", comment=f"sigma = {sigma}" @@ -2902,7 +2902,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell if ((n > 1 or radius) or (n == 1 and return_point_id)) and not return_cell_id: poly = None if not self.point_locator: - poly = self + poly = self.dataset self.point_locator = vtk.vtkStaticPointLocator() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() @@ -2925,7 +2925,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell ######## if not poly: - poly = self + poly = self.dataset trgp = [] for i in range(vtklist.GetNumberOfIds()): trgp_ = [0, 0, 0] @@ -2939,7 +2939,7 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell else: if not self.cell_locator: - poly = self + poly = self.dataset # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 @@ -3111,8 +3111,8 @@ def smooth_mls_1d(self, f=0.2, radius=None): vdata = utils.numpy2vtk(np.array(variances)) vdata.SetName("Variances") - self.GetPointData().AddArray(vdata) - self.GetPointData().Modified() + self.dataset.GetPointData().AddArray(vdata) + self.dataset.GetPointData().Modified() self.points(newline) self.pipeline = utils.OperationNode("smooth_mls_1d", parents=[self]) return self @@ -4263,7 +4263,7 @@ def compute_clustering(self, radius): cluster.ColorClustersOn() cluster.Update() idsarr = cluster.GetOutput().GetPointData().GetArray("ClusterId") - self.GetPointData().AddArray(idsarr) + self.dataset.GetPointData().AddArray(idsarr) self.pipeline = utils.OperationNode( "compute_clustering", parents=[self], comment=f"radius = {radius}" @@ -4358,7 +4358,7 @@ def compute_camera_distance(self): A pointdata array is created with name 'DistanceToCamera'. """ if vedo.plotter_instance.renderer: - poly = self + poly = self.dataset dc = vtk.vtkDistanceToCamera() dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) @@ -4594,7 +4594,7 @@ def tovolume( vedo.logger.error("please set either radius or n") raise RuntimeError - poly = self + poly = self.dataset # Create a probe volume probe = vtk.vtkImageData() @@ -4745,7 +4745,7 @@ def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, msh.pipeline = utils.OperationNode( "delaunay2d", parents=[self], - comment=f"#cells {msh.GetNumberOfCells()}" + comment=f"#cells {msh.dataset.GetNumberOfCells()}" ) return msh diff --git a/vedo/shapes.py b/vedo/shapes.py index 6e7da2f5..ccb80c1f 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -197,9 +197,9 @@ def __init__( """ if utils.is_sequence(mesh): # create a cloud of points - poly = Points(mesh) + poly = Points(mesh).dataset else: - poly = mesh + poly = mesh.dataset cmap = "" if isinstance(c, str) and c in cmaps_names: @@ -219,7 +219,7 @@ def __init__( gly = vtk.vtkGlyph3D() gly.GeneratePointIdsOn() gly.SetInputData(poly) - gly.SetSourceData(glyph) + gly.SetSourceData(glyph.dataset) if scale_by_scalar: gly.SetScaleModeToScaleByScalar() @@ -504,7 +504,7 @@ def clone(self): prop.DeepCopy(self.property) ln = Line(self) - ln.DeepCopy(self) + ln.dataset.DeepCopy(self.dataset) ln.transform = self.transform ln.actor.SetProperty(prop) ln.property = prop @@ -3104,7 +3104,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra def clone(self): newplane = Plane() - newplane.DeepCopy(self) + newplane.dataset.DeepCopy(self.dataset) newplane.transform = self.transform prop = vtk.vtkProperty() prop.DeepCopy(self.property) diff --git a/vedo/utils.py b/vedo/utils.py index b2cf9a64..2c81981b 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1461,17 +1461,17 @@ def _print_data(poly, c): ################################ def _print_vtkactor(obj): - poly = obj - actor = obj + poly = obj.dataset + actor = obj.dataset mapper = obj.mapper pro = obj.property if not obj.actor.GetPickable(): return - pro = poly.property - pos = poly.pos() - bnds = poly.bounds() + pro = obj.property + pos = obj.pos() + bnds = obj.bounds() col = precision(pro.GetColor(), 3) alpha = pro.GetOpacity() npt = poly.GetNumberOfPoints() From dda4c5a0ae315758e159f9d7e53d88f73ec5fe07 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 11 Oct 2023 13:52:32 +0200 Subject: [PATCH 053/251] finished pointcloud and mesh examples to work --- docs/changes.md | 1 + .../basic/{lights.py => light_sources.py} | 0 examples/basic/mouseclick.py | 6 +- examples/basic/mousehighlight.py | 4 +- examples/basic/sliders2.py | 6 +- examples/basic/sliders3d.py | 2 +- vedo/addons.py | 8 +- vedo/base.py | 2 +- vedo/colors.py | 12 + vedo/mesh.py | 223 ++++++------------ vedo/plotter.py | 11 +- vedo/pointcloud.py | 88 +++---- vedo/shapes.py | 11 +- 13 files changed, 157 insertions(+), 217 deletions(-) rename examples/basic/{lights.py => light_sources.py} (100%) diff --git a/docs/changes.md b/docs/changes.md index a9f23bb5..6623c7b7 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -33,6 +33,7 @@ examples/volumetric/slicer1.py ### Broken Examples ``` +glyphs2.py ``` diff --git a/examples/basic/lights.py b/examples/basic/light_sources.py similarity index 100% rename from examples/basic/lights.py rename to examples/basic/light_sources.py diff --git a/examples/basic/mouseclick.py b/examples/basic/mouseclick.py index 438545bc..238e909e 100644 --- a/examples/basic/mouseclick.py +++ b/examples/basic/mouseclick.py @@ -6,10 +6,10 @@ # callback functions def on_left_click(event): - if not event.actor: + if not event.object: return - printc("Left button pressed on", [event.actor], c=event.actor.color()) - # printc('full dump of event:', event) + printc("Left button pressed on", [event.object], c=event.object.color()) + # printc('Full dump of Event:', event) def on_drag(event): printc(event.name, 'happened at mouse position', event.picked2d) diff --git a/examples/basic/mousehighlight.py b/examples/basic/mousehighlight.py index 4d76df42..06f7df91 100644 --- a/examples/basic/mousehighlight.py +++ b/examples/basic/mousehighlight.py @@ -10,9 +10,9 @@ spheres.append(s) def func(evt): - if not evt.actor: + if not evt.object: return - sil = evt.actor.silhouette().linewidth(6).c('red5') + sil = evt.object.silhouette().linewidth(6).c('red5') sil.name = "silu" # give it a name so we can remove the old one msg.text("You clicked: "+evt.actor.name) plt.remove('silu').add(sil) diff --git a/examples/basic/sliders2.py b/examples/basic/sliders2.py index 410db1ba..e7210c38 100644 --- a/examples/basic/sliders2.py +++ b/examples/basic/sliders2.py @@ -11,14 +11,14 @@ def slider1(widget, event): widget.title = get_color_name(val) cube.color(val) -def button_func(obj, ename): +def button_func(obj, event): cube.alpha(1 - cube.alpha()) # toggle mesh transparency sphere.alpha(1 - sphere.alpha()) button.switch() # change to next status ###### -sphere = Sphere(r=0.6).alpha(0.9).color(0) -cube = Cube().alpha(0.9).color(0) +sphere = Sphere(r=0.6).lw(1).color(0).alpha(0.8) +cube = Cube().lw(1).color(0).alpha(0.8) plt = Plotter(N=2, axes=True) diff --git a/examples/basic/sliders3d.py b/examples/basic/sliders3d.py index 31ee6ad8..4086dd46 100644 --- a/examples/basic/sliders3d.py +++ b/examples/basic/sliders3d.py @@ -23,5 +23,5 @@ def slider_y(widget, event): title="position", ) -plt.show(mesh, __doc__, axes=11, bg='bb', bg2='navy') +plt.show(mesh, __doc__, axes=11, bg='bb', bg2='navy', elevation=-30) plt.close() diff --git a/vedo/addons.py b/vedo/addons.py index 9d5e2eef..ae62e492 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -310,13 +310,13 @@ def __init__( else: col = get_color(c) if markers is None: # default - poly = e + poly = e.dataset else: marker = markers[i] if utils.is_sequence(markers) else markers if isinstance(marker, vedo.Points): - poly = marker.clone(deep=False).normalize().shift(0, 1, 0) + poly = marker.clone(deep=False).normalize().shift(0, 1, 0).dataset else: # assume string marker - poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0) + poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0).dataset self.SetEntry(n, poly, ti, col) n += 1 @@ -768,7 +768,7 @@ def Light(pos, focal_point=(0, 0, 0), angle=180, c=None, intensity=1): `plotter.Plotter.remove_lights()` Examples: - - [lights.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/lights.py) + - [light_sources.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/light_sources.py) ![](https://vedo.embl.es/images/basic/lights.png) """ diff --git a/vedo/base.py b/vedo/base.py index 250ab753..fdb2d984 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -1258,7 +1258,7 @@ def gradient(self, input_array=None, on="points", fast=False): vedo.logger.error(f"in gradient: no scalars found for {on}") raise RuntimeError - gra.SetInputData(self.datset) + gra.SetInputData(self.dataset) gra.SetInputScalars(tp, input_array) gra.SetResultArrayName("Gradient") gra.SetFasterApproximation(fast) diff --git a/vedo/colors.py b/vedo/colors.py index 5eb534f8..fcce69b6 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -577,6 +577,18 @@ # default color palettes when using an index palettes = ( + ( + [0.67843137, 0.70980392, 0.74117647], # gray5 + [0.8627451 , 0.20784314, 0.27058824], # red5 + [0.99215686, 0.49411765, 0.07843137], # orange5 + [1. , 0.75686275, 0.02745098], # yellow5 + [0.83921569, 0.2 , 0.51764706], # pink5 + [0.1254902 , 0.78823529, 0.59215686], # teal5 + [0.15686275, 0.65490196, 0.27058824], # green5 + [0.09019608, 0.63529412, 0.72156863], # cyan5 + [0.05098039, 0.43137255, 0.99215686], # blue5 + [0.4 , 0.0627451 , 0.94901961], # indigo5 + ), ( (1.0, 0.832, 0.000), # gold (0.960, 0.509, 0.188), diff --git a/vedo/mesh.py b/vedo/mesh.py index 6ea1aada..54c42f2a 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -112,22 +112,22 @@ def backcolor(self, bc=None): """ Set/get mesh's backface color. """ - backProp = self.actor.GetBackfaceProperty() + back_prop = self.actor.GetBackfaceProperty() if bc is None: - if backProp: - return backProp.GetDiffuseColor() + if back_prop: + return back_prop.GetDiffuseColor() return self if self.property.GetOpacity() < 1: return self - if not backProp: - backProp = vtk.vtkProperty() + if not back_prop: + back_prop = vtk.vtkProperty() - backProp.SetDiffuseColor(get_color(bc)) - backProp.SetOpacity(self.property.GetOpacity()) - self.actor.SetBackfaceProperty(backProp) + back_prop.SetDiffuseColor(get_color(bc)) + back_prop.SetOpacity(self.property.GetOpacity()) + self.actor.SetBackfaceProperty(back_prop) self.mapper.ScalarVisibilityOff() return self @@ -171,7 +171,7 @@ class Mesh(MeshVisual, Points): Build an instance of object `Mesh` derived from `vedo.PointCloud`. """ - def __init__(self, inputobj=None, c=None, alpha=1): + def __init__(self, inputobj=None, c='gold', alpha=1): """ Input can be a list of vertices and their connectivity (faces of the polygonal mesh), or directly a `vtkPolydata` object. @@ -194,177 +194,99 @@ def __init__(self, inputobj=None, c=None, alpha=1): """ super().__init__() - self.mapper.SetInterpolateScalarsBeforeMapping( - vedo.settings.interpolate_scalars_before_mapping - ) - - if vedo.settings.use_polygon_offset: - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - pof, pou = (vedo.settings.polygon_offset_factor, vedo.settings.polygon_offset_units) - self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) - - inputtype = str(type(inputobj)) - - _data = inputobj - if inputobj is None: - _data = vtk.vtkPolyData() + pass elif isinstance(inputobj, vtk.vtkActor): - _data = inputobj.GetMapper().GetInput() - self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) + self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) + v = inputobj.GetMapper().GetScalarVisibility() + self.mapper.SetScalarVisibility(v) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) self.property = pr elif isinstance(inputobj, vtk.vtkPolyData): - _data = inputobj if inputobj.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) + self.dataset.DeepCopy(inputobj) + + elif is_sequence(inputobj): + ninp = len(inputobj) + if ninp == 2: # assume input is [vertices, faces] + self.dataset = buildPolyData(inputobj[0], inputobj[1]) + else: # assume input is [vertices] + self.dataset = buildPolyData(inputobj, None) + + elif isinstance(inputobj, str): + self.dataset = vedo.file_io.load(inputobj).dataset + self.filename = inputobj elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj) gf.Update() - _data = gf.GetOutput() + self.dataset = gf.GetOutput() - elif "meshlab" in inputtype: - _data = vedo.utils.meshlab2vedo(inputobj) + elif "meshlab" in str(type(inputobj)): + self.dataset = vedo.utils.meshlab2vedo(inputobj) - elif "trimesh" in inputtype: - _data = vedo.utils.trimesh2vedo(inputobj) + elif "trimesh" in str(type(inputobj)): + self.dataset = vedo.utils.trimesh2vedo(inputobj) - elif "meshio" in inputtype: + elif "meshio" in str(type(inputobj)): + # self.dataset = vedo.utils.meshio2vedo(inputobj) ##TODO if len(inputobj.cells) > 0: mcells = [] for cellblock in inputobj.cells: if cellblock.type in ("triangle", "quad"): mcells += cellblock.data.tolist() - _data = buildPolyData(inputobj.points, mcells) + self.dataset = buildPolyData(inputobj.points, mcells) else: - _data = buildPolyData(inputobj.points, None) + self.dataset = buildPolyData(inputobj.points, None) # add arrays: try: if len(inputobj.point_data) > 0: for k in inputobj.point_data.keys(): vdata = numpy2vtk(inputobj.point_data[k]) vdata.SetName(str(k)) - _data.GetPointData().AddArray(vdata) + self.dataset.GetPointData().AddArray(vdata) except AssertionError: print("Could not add meshio point data, skip.") - # try: - # if len(inputobj.cell_data): - # for k in inputobj.cell_data.keys(): - # #print(inputobj.cell_data) - # exit() - # vdata = numpy2vtk(inputobj.cell_data[k]) - # vdata.SetName(str(k)) - # _data.GetCellData().AddArray(vdata) - # except AssertionError: - # print("Could not add meshio cell data, skip.") - elif is_sequence(inputobj): - ninp = len(inputobj) - if ninp == 0: - _data = vtk.vtkPolyData() - elif ninp == 2: # assume [vertices, faces] - _data = buildPolyData(inputobj[0], inputobj[1]) - else: # assume [vertices] or vertices - _data = buildPolyData(inputobj, None) - - elif hasattr(inputobj, "GetOutput"): # passing a vtk algorithm - if hasattr(inputobj, "Update"): - inputobj.Update() - if isinstance(inputobj.GetOutput(), vtk.vtkPolyData): - _data = inputobj.GetOutput() - else: + else: + try: gf = vtk.vtkGeometryFilter() - gf.SetInputData(inputobj.GetOutput()) + gf.SetInputData(inputobj) gf.Update() - _data = gf.GetOutput() - - elif isinstance(inputobj, str): - dataset = vedo.file_io.load(inputobj).dataset - self.filename = inputobj - _data = dataset - - else: - # try: - # gf = vtk.vtkGeometryFilter() - # gf.SetInputData(inputobj) - # gf.Update() - # _data = gf.GetOutput() - # except: - vedo.logger.error(f"cannot build mesh from type {inputtype}") - raise RuntimeError() - - self.dataset = _data + self.dataset = gf.GetOutput() + except: + vedo.logger.error(f"cannot build mesh from type {inputtype}") + raise RuntimeError() self.mapper.SetInputData(self.dataset) self.actor.SetMapper(self.mapper) self.property.SetInterpolationToPhong() - - # set the color by c or by scalar - if _data: - - arrexists = False - - if c is None: - ptdata = self.dataset.GetPointData() - cldata = self.dataset.GetCellData() - exclude = ["normals", "tcoord"] - - if cldata.GetNumberOfArrays(): - for i in range(cldata.GetNumberOfArrays()): - iarr = cldata.GetArray(i) - if iarr: - icname = iarr.GetName() - if icname and all(s not in icname.lower() for s in exclude): - cldata.SetActiveScalars(icname) - self.mapper.ScalarVisibilityOn() - self.mapper.SetScalarModeToUseCellData() - self.mapper.SetScalarRange(iarr.GetRange()) - arrexists = True - break # stop at first good one - - # point come after so it has priority - if ptdata.GetNumberOfArrays(): - for i in range(ptdata.GetNumberOfArrays()): - iarr = ptdata.GetArray(i) - if iarr: - ipname = iarr.GetName() - if ipname and all(s not in ipname.lower() for s in exclude): - ptdata.SetActiveScalars(ipname) - self.mapper.ScalarVisibilityOn() - self.mapper.SetScalarModeToUsePointData() - self.mapper.SetScalarRange(iarr.GetRange()) - arrexists = True - break # stop at first good one - - if not arrexists: - if c is None: - c = "gold" - c = get_color(c) - elif isinstance(c, float) and c <= 1: - c = color_map(c, "rainbow", 0, 1) - else: - c = get_color(c) - self.property.SetColor(c) - self.property.SetAmbient(0.1) - self.property.SetDiffuse(1) - self.property.SetSpecular(0.05) - self.property.SetSpecularPower(5) - self.mapper.ScalarVisibilityOff() + self.property.SetColor(get_color(c)) if alpha is not None: self.property.SetOpacity(alpha) + self.mapper.SetInterpolateScalarsBeforeMapping( + vedo.settings.interpolate_scalars_before_mapping + ) + + if vedo.settings.use_polygon_offset: + self.mapper.SetResolveCoincidentTopologyToPolygonOffset() + pof = vedo.settings.polygon_offset_factor + pou = vedo.settings.polygon_offset_units + self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) + n = self.dataset.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") self._texture = None @@ -589,8 +511,8 @@ def texture( ![](https://vedo.embl.es/images/basic/texturecubes.png) """ - pd = self - outimg = None + pd = self.dataset + out_img = None if tname is None: # disable texture pd.GetPointData().SetTCoords(None) @@ -602,11 +524,11 @@ def texture( elif isinstance(tname, vedo.Picture): tu = vtk.vtkTexture() - outimg = tname + out_img = tname elif is_sequence(tname): tu = vtk.vtkTexture() - outimg = vedo.picture._get_img(tname) + out_img = vedo.picture._get_img(tname) elif isinstance(tname, str): tu = vtk.vtkTexture() @@ -637,7 +559,7 @@ def texture( return self reader.SetFileName(fn) reader.Update() - outimg = reader.GetOutput() + out_img = reader.GetOutput() else: vedo.logger.error(f"in texture() cannot understand input {type(tname)}") @@ -703,8 +625,8 @@ def texture( pd.GetPointData().SetTCoords(tc) pd.GetPointData().Modified() - if outimg: - tu.SetInputData(outimg) + if out_img: + tu.SetInputData(out_img) tu.SetInterpolate(interpolate) tu.SetRepeat(repeat) tu.SetEdgeClamp(edge_clamp) @@ -739,7 +661,7 @@ def texture( new_points[id3] = new_points[id1] self.points(new_points) - self.Modified() + self.dataset.Modified() self._texture = { "tname": tname, "tcoords": tcoords, @@ -803,7 +725,7 @@ def reverse(self, cells=True, normals=False): - `normals=True` reverses the normals by multiplying the normal vector by -1 (both point and cell normals, if present). """ - poly = self + poly = self.dataset if is_sequence(cells): for cell in cells: @@ -1641,12 +1563,12 @@ def is_inside(self, point, tol=1e-05): poly = self points = vtk.vtkPoints() points.InsertNextPoint(point) - pointsPolydata = vtk.vtkPolyData() - pointsPolydata.SetPoints(points) + poly = vtk.vtkPolyData() + poly.SetPoints(points) sep = vtk.vtkSelectEnclosedPoints() sep.SetTolerance(tol) sep.CheckSurfaceOff() - sep.SetInputData(pointsPolydata) + sep.SetInputData(poly) sep.SetSurfaceData(poly) sep.Update() return sep.IsInside(0) @@ -1667,19 +1589,19 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): ![](https://vedo.embl.es/images/basic/pca.png) """ if isinstance(pts, Points): - pointsPolydata = pts + poly = pts.dataset ptsa = pts.points() else: ptsa = np.asarray(pts) vpoints = vtk.vtkPoints() vpoints.SetData(numpy2vtk(ptsa, dtype=np.float32)) - pointsPolydata = vtk.vtkPolyData() - pointsPolydata.SetPoints(vpoints) + poly = vtk.vtkPolyData() + poly.SetPoints(vpoints) sep = vtk.vtkSelectEnclosedPoints() # sep = vtk.vtkExtractEnclosedPoints() sep.SetTolerance(tol) - sep.SetInputData(pointsPolydata) + sep.SetInputData(poly) sep.SetSurfaceData(self.dataset) sep.SetInsideOut(invert) sep.Update() @@ -1690,7 +1612,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): if isinstance(pts, Points): varr.SetName("IsInside") - pts.GetPointData().AddArray(varr) + pts.dataset.GetPointData().AddArray(varr) if return_ids: return ids @@ -2296,15 +2218,14 @@ def intersect_with(self, mesh2, tol=1e-06): bf = vtk.vtkIntersectionPolyDataFilter() bf.SetGlobalWarningDisplay(0) poly1 = self.dataset - poly2 = mesh2 + poly2 = mesh2.dataset bf.SetTolerance(tol) bf.SetInputData(0, poly1) bf.SetInputData(1, poly2) bf.Update() - msh = Mesh(bf.GetOutput(), "k", 1).lighting("off") + msh = Mesh(bf.GetOutput(), c="k", alpha=1).lighting("off") msh.property.SetLineWidth(3) msh.name = "SurfaceIntersection" - msh.pipeline = OperationNode( "intersect_with", parents=[self, mesh2], comment=f"#pts {msh.npoints}" ) diff --git a/vedo/plotter.py b/vedo/plotter.py index dc79725f..91352d66 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -43,8 +43,7 @@ class Event: "priority", "at", "object", - "actor", # obsolete use object instead - "vtk_actor", + "actor", "picked3d", "keypress", "picked2d", @@ -1693,7 +1692,7 @@ def add_spline_tool( vedo.logger.error("in add_spline_tool(), No interactor found.") raise RuntimeError sw.On() - sw.Initialize(sw.points.polydata()) + sw.Initialize(sw.points.dataset) if sw.closed: sw.representation.ClosedLoopOn() sw.representation.SetRenderer(self.renderer) @@ -2345,7 +2344,6 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.at = self.renderers.index(self.renderer) event.keypress = key if enable_picking: - event.vtk_actor = actor try: event.actor = actor.data # obsolete use object instead event.object = actor.data @@ -4036,7 +4034,6 @@ def _keypress(self, iren, event): elif key == "x": if self.justremoved is None: - print(self.get_meshes()) if self.clicked_object in self.get_meshes() or isinstance( self.clicked_object, vtk.vtkAssembly ): @@ -4084,8 +4081,8 @@ def _keypress(self, iren, event): self.color_picker([x, y], verbose=True) elif key == "y": - if self.clicked_object and self.clicked_object.data.pipeline: - self.clicked_object.data.pipeline.show() + if self.clicked_object and self.clicked_object.pipeline: + self.clicked_object.pipeline.show() if iren: iren.Render() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 60d44f12..4799e9c0 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -82,10 +82,7 @@ def merge(*meshs, flag=False): else: msh = Points(mpoly) - cprp = vtk.vtkProperty() - cprp.DeepCopy(objs[0].property) - msh.actor.SetProperty(cprp) - msh.property = cprp + msh.copy_properties_from(objs[0]) msh.pipeline = utils.OperationNode( "merge", @@ -488,8 +485,8 @@ def __init__(self): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() self.mapper = vtk.vtkPolyDataMapper() - - self.property_backface = None + + self.property_backface = self.actor.GetBackfaceProperty() self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI @@ -500,7 +497,43 @@ def __init__(self): except AttributeError: pass + ################################################## + def copy_properties_from(self, source, deep=True, actor_related=True): + """ + Copy properties from another ``Points`` object. + """ + pr = vtk.vtkProperty() + if deep: + pr.DeepCopy(source.property) + else: + pr.ShallowCopy(source.property) + self.actor.SetProperty(pr) + self.property = pr + if self.actor.GetBackfaceProperty(): + bfpr = vtk.vtkProperty() + bfpr.DeepCopy(source.actor.GetBackfaceProperty()) + self.actor.SetBackfaceProperty(bfpr) + self.property_backface = bfpr + + if not actor_related: + return self + + # mapper related: + self.mapper.SetScalarVisibility(source.mapper.GetScalarVisibility()) + self.mapper.SetScalarMode(source.mapper.GetScalarMode()) + self.mapper.SetScalarRange(source.mapper.GetScalarRange()) + self.mapper.SetLookupTable(source.mapper.GetLookupTable()) + self.mapper.SetColorMode(source.mapper.GetColorMode()) + self.mapper.SetInterpolateScalarsBeforeMapping(source.mapper.GetInterpolateScalarsBeforeMapping()) + self.mapper.SetUseLookupTableScalarRange(source.mapper.GetUseLookupTableScalarRange()) + + self.actor.SetPickable(source.actor.GetPickable()) + self.actor.SetDragable(source.actor.GetDragable()) + self.actor.SetTexture(source.actor.GetTexture()) + self.actor.SetVisibility(source.actor.GetVisibility()) + return self + def color(self, c=False, alpha=None): """ Set/get mesh's color. @@ -1048,7 +1081,7 @@ def update_trail(self): def _compute_shadow(self, plane, point, direction): shad = self.clone() - shad.GetPointData().SetTCoords(None) # remove any texture coords + shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" pts = shad.points() @@ -1793,7 +1826,6 @@ def caption( return self - ################################################### class Points(PointsVisual, BaseActor): """Work with point clouds.""" @@ -1832,7 +1864,6 @@ def fibonacci_sphere(n): ![](https://vedo.embl.es/images/feats/fibonacci.png) """ # super().__init__() ## super is not working here - # vtk.vtkPolyData.__init__(self) BaseActor.__init__(self) PointsVisual.__init__(self) @@ -1840,12 +1871,13 @@ def fibonacci_sphere(n): self.transform = LinearTransform() self.actor.data = self - # self.name = "Points" # better not to give it a name here if inputobj is None: #################### return ######################################## + self.name = "Points" # better not to give it a name here? + if isinstance(inputobj, vedo.BaseActor): inputobj = inputobj.points() # numpy @@ -1912,13 +1944,13 @@ def fibonacci_sphere(n): vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() + self.actor.SetMapper(self.mapper) + self.mapper.SetInputData(self.dataset) + self.property.SetRepresentationToPoints() self.property.SetPointSize(r) self.property.LightingOff() - self.actor.SetMapper(self.mapper) - self.mapper.SetInputData(self.dataset) - self.pipeline = utils.OperationNode( self, parents=[], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) @@ -2055,36 +2087,10 @@ def clone(self, deep=True): cloned = vedo.Mesh(self.dataset) else: cloned = Points(self.dataset) - - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - cloned.actor.SetProperty(pr) - cloned.property = pr - - if self.actor.GetBackfaceProperty(): - bfpr = vtk.vtkProperty() - bfpr.DeepCopy(self.actor.GetBackfaceProperty()) - cloned.actor.SetBackfaceProperty(bfpr) - cloned.property_backface = bfpr cloned.transform = self.transform.clone() - mp = cloned.mapper - sm = self.mapper - mp.SetScalarVisibility(sm.GetScalarVisibility()) - mp.SetScalarRange(sm.GetScalarRange()) - mp.SetColorMode(sm.GetColorMode()) - lsr = sm.GetUseLookupTableScalarRange() - mp.SetUseLookupTableScalarRange(lsr) - mp.SetScalarMode(sm.GetScalarMode()) - lut = sm.GetLookupTable() - if lut: - mp.SetLookupTable(lut) - - if self.actor.GetTexture(): - cloned.texture(self.actor.GetTexture()) - - cloned.actor.SetPickable(self.actor.GetPickable()) + cloned.copy_properties_from(self) cloned.base = np.array(self.base) cloned.top = np.array(self.top) @@ -2383,7 +2389,7 @@ def clean(self): self.dataset.DeepCopy(cpd.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], - comment=f"#pts {self.dataset.GetPointData()}" + comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self diff --git a/vedo/shapes.py b/vedo/shapes.py index ccb80c1f..5955e830 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -197,7 +197,7 @@ def __init__( """ if utils.is_sequence(mesh): # create a cloud of points - poly = Points(mesh).dataset + poly = utils.buildPolyData(mesh) else: poly = mesh.dataset @@ -219,7 +219,10 @@ def __init__( gly = vtk.vtkGlyph3D() gly.GeneratePointIdsOn() gly.SetInputData(poly) - gly.SetSourceData(glyph.dataset) + try: + gly.SetSourceData(glyph) + except TypeError: + gly.SetSourceData(glyph.dataset) if scale_by_scalar: gly.SetScaleModeToScaleByScalar() @@ -1315,7 +1318,7 @@ class NormalLines(Mesh): def __init__(self, msh, ratio=1, on="cells", scale=1.0): - poly = msh.clone().compute_normals() + poly = msh.clone().compute_normals().dataset if "cell" in on: centers = vtk.vtkCellCenters() @@ -1831,7 +1834,7 @@ def __init__( ############################################# ribbon_filter = vtk.vtkRibbonFilter() aline = Line(line1) - ribbon_filter.SetInputData(aline) + ribbon_filter.SetInputData(aline.dataset) if width is None: width = aline.diagonal_size() / 20.0 ribbon_filter.SetWidth(width) From 62e2a3ebc86f9f54ed3d7e17769f67ff67f160bb Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 11 Oct 2023 16:07:33 +0200 Subject: [PATCH 054/251] fixing point color --- docs/changes.md | 22 ++++++++ examples/advanced/capping_mesh.py | 2 +- examples/advanced/geological_model.py | 15 +++--- examples/{pyplot => basic}/glyphs3.py | 0 examples/pyplot/custom_axes1.py | 5 +- examples/pyplot/histo_polar.py | 1 - .../fourier_epicycles.py | 0 examples/simulations/gyroscope1.py | 4 +- examples/simulations/optics_base.py | 6 +-- vedo/addons.py | 2 +- vedo/assembly.py | 11 ++++ vedo/base.py | 6 +-- vedo/colors.py | 6 +-- vedo/mesh.py | 2 +- vedo/plotter.py | 29 ++++++----- vedo/pointcloud.py | 51 +++++-------------- vedo/pyplot.py | 21 ++++---- vedo/shapes.py | 27 +++++----- 18 files changed, 110 insertions(+), 100 deletions(-) rename examples/{pyplot => basic}/glyphs3.py (100%) rename examples/{pyplot => simulations}/fourier_epicycles.py (100%) diff --git a/docs/changes.md b/docs/changes.md index 6623c7b7..74e211ba 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -33,7 +33,29 @@ examples/volumetric/slicer1.py ### Broken Examples ``` +~/Projects/vedo/examples/advanced +interpolate_scalar3.py +recosurface.py +spline_draw.py +timer_callback2.py +warp4.py +warp6.py + +~/Projects/vedo/examples/pyplot glyphs2.py +explore5d.py +goniometer.py +histo_2d_a.py +histo_2d_b.py +isolines.py + + +~/Projects/vedo/examples/simulations +airplane1.py +aspring1.py +brownian2d.py +gyroscope1.py +gyroscope2.py ``` diff --git a/examples/advanced/capping_mesh.py b/examples/advanced/capping_mesh.py index 01068bc5..bd54c083 100644 --- a/examples/advanced/capping_mesh.py +++ b/examples/advanced/capping_mesh.py @@ -14,7 +14,7 @@ def capping(amsh, bias=0, invert=False, res=50): cutm = amsh.clone().cut_with_plane(origin=pln.center, normal=pln.normal) invert = cutm.npoints > amsh.npoints - pts2 = pts.clone().orientation([0,0,1]).project_on_plane('z') + pts2 = pts.clone().reorient([0,0,1]).project_on_plane('z') msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res) source = pts2.points().tolist() diff --git a/examples/advanced/geological_model.py b/examples/advanced/geological_model.py index 2775ea00..5ffeef87 100644 --- a/examples/advanced/geological_model.py +++ b/examples/advanced/geological_model.py @@ -1,6 +1,7 @@ """Recreate a model of a geothermal reservoir, Utah (Credits: A. Pollack, SCRF)""" -from vedo import printc, dataurl, settings, delaunay2d, Line, Lines, Points, Plotter +from vedo import printc, dataurl, settings, generate_delaunay2d +from vedo import Line, Lines, Points, Plotter import pandas as pd settings.use_depth_peeling = True @@ -36,7 +37,7 @@ printc("analyzing...", invert=1, end='') # create a mesh object from the 2D Delaunay triangulation of the point cloud -landSurface = delaunay2d(landSurfacePD.values) +landSurface = generate_delaunay2d(landSurfacePD.values) # in order to color it by the elevation, we use the z values of the mesh zvals = landSurface.points()[:, 2] @@ -52,28 +53,28 @@ ############################################# ## Different meshes with constant colors # Mesh of 175 C isotherm -vertices_175C = delaunay2d(vertices_175CPD.values) +vertices_175C = generate_delaunay2d(vertices_175CPD.values) vertices_175C.name = "175C temperature isosurface" plt += vertices_175C.c("orange").opacity(0.3) # Mesh of 225 C isotherm -vertices_225CT = delaunay2d(vertices_225CPD.values) +vertices_225CT = generate_delaunay2d(vertices_225CPD.values) vertices_225CT.name = "225C temperature isosurface" plt += vertices_225CT.c("red").opacity(0.4) # Negro fault, mode=fit is used because point cloud is not in xy plane -Negro_Mag_Fault_vertices = delaunay2d(Negro_Mag_Fault_verticesPD.values, mode='fit') +Negro_Mag_Fault_vertices = generate_delaunay2d(Negro_Mag_Fault_verticesPD.values, mode='fit') Negro_Mag_Fault_vertices.name = "Negro Fault" plt += Negro_Mag_Fault_vertices.c("f").opacity(0.6) # Opal fault -Opal_Mound_Fault_vertices = delaunay2d(Opal_Mound_Fault_verticesPD.values, mode='fit') +Opal_Mound_Fault_vertices = generate_delaunay2d(Opal_Mound_Fault_verticesPD.values, mode='fit') Opal_Mound_Fault_vertices.name = "Opal Mound Fault" plt += Opal_Mound_Fault_vertices.c("g").opacity(0.6) # Top Granite, (shift it a bit to avoid overlapping) xyz = top_granitoid_verticesPD.values - [0,0,20] -top_granitoid_vertices = delaunay2d(xyz).texture(dataurl+'textures/paper2.jpg') +top_granitoid_vertices = generate_delaunay2d(xyz).texture(dataurl+'textures/paper2.jpg') top_granitoid_vertices.name = "Top of granite surface" plt += top_granitoid_vertices diff --git a/examples/pyplot/glyphs3.py b/examples/basic/glyphs3.py similarity index 100% rename from examples/pyplot/glyphs3.py rename to examples/basic/glyphs3.py diff --git a/examples/pyplot/custom_axes1.py b/examples/pyplot/custom_axes1.py index d29058fb..2fe5d5aa 100644 --- a/examples/pyplot/custom_axes1.py +++ b/examples/pyplot/custom_axes1.py @@ -10,8 +10,9 @@ # a dummy spline with its shadow on the xy plane pts = Points([(-2,-3.2,-1.5), (3,-1.2,-2), (7,3,4)], r=12) -spl = Spline(pts, res=50).add_shadow(plane='z', point=-4) # make spline and add its shadow at z=-4 -lns = Lines(spl, spl.shadows[0]) # join spline points with its own shadow +spl = Spline(pts, res=50) # make a spline from points +spl.add_shadow(plane='z', point=-4) # add its shadow at z=-4 +lns = Lines(spl, spl.shadows[0]) # join spline points with its own shadow # make a dictionary of axes options axes_opts = dict( diff --git a/examples/pyplot/histo_polar.py b/examples/pyplot/histo_polar.py index fb154435..fd76e37a 100644 --- a/examples/pyplot/histo_polar.py +++ b/examples/pyplot/histo_polar.py @@ -38,7 +38,6 @@ ) rh.scale(0.15) # scale histogram to make it small rh.pos(hyp.points()[i]) # set its position on the surface - rh.orientation(hyp.normal_at(i)) # orient it along normal radhistos.append(rh) show(hyp, radhistos, at=1).interactive().close() diff --git a/examples/pyplot/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py similarity index 100% rename from examples/pyplot/fourier_epicycles.py rename to examples/simulations/fourier_epicycles.py diff --git a/examples/simulations/gyroscope1.py b/examples/simulations/gyroscope1.py index 99e03887..00adb5aa 100644 --- a/examples/simulations/gyroscope1.py +++ b/examples/simulations/gyroscope1.py @@ -48,8 +48,8 @@ def loop_func(event): gpos = cm - 1/2 * Ls * versor(Lrot) # set orientation along gaxis and rotate it around its axis by omega*t degrees - gyro.orientation(Lrot, rotation=omega*t, rad=True).pos(gpos) - spring.stretch(top, gpos) + gyro.reorient(Lrot, rotation=omega*t, rad=True).pos(gpos) + # spring.stretch(top, gpos) plt.render() t = 0 diff --git a/examples/simulations/optics_base.py b/examples/simulations/optics_base.py index b9d435a0..df869bad 100644 --- a/examples/simulations/optics_base.py +++ b/examples/simulations/optics_base.py @@ -32,7 +32,7 @@ def hits_type(self): class Lens(vedo.Mesh, OpticalElement): """A refractive object of arbitrary shape defined by an arbitrary mesh""" def __init__(self, obj, ref_index="glass"): - vedo.Mesh.__init__(self, obj, "blue8", 0.5) + vedo.Mesh.__init__(self, obj.dataset, "blue8", 0.5) OpticalElement.__init__(self) self.name = obj.name self.type = "lens" @@ -59,7 +59,7 @@ def n_at(self, wave_length): # in meters class Mirror(vedo.Mesh, OpticalElement): """A mirror surface defined by an arbitrary Mesh""" def __init__(self, obj): - vedo.Mesh.__init__(self, obj, "blue8", 0.5) + vedo.Mesh.__init__(self, obj.dataset, "blue8", 0.5) OpticalElement.__init__(self) self.compute_normals(cells=True, points=True) self.name = obj.name @@ -93,7 +93,7 @@ def __init__(self, sizex, sizey): class Detector(vedo.Mesh, OpticalElement): """A detector surface defined by an arbitrary Mesh""" def __init__(self, obj): - vedo.Mesh.__init__(self, obj, "k5", 0.5) + vedo.Mesh.__init__(self, obj.dataset, "k5", 0.5) OpticalElement.__init__(self) self.compute_normals() self.name = "Detector" diff --git a/vedo/addons.py b/vedo/addons.py index ae62e492..24480e10 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4192,7 +4192,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): if isinstance(largestact, Assembly): ocf.SetInputData(largestact.unpack(0)) else: - ocf.SetInputData(largestact) + ocf.SetInputData(largestact.dataset) ocf.Update() oc_mapper = vtk.vtkHierarchicalPolyDataMapper() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) diff --git a/vedo/assembly.py b/vedo/assembly.py index 4de5f194..b37e09f9 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -483,6 +483,17 @@ def zbounds(self, i=None): if i == 1: return b[5] return (b[4], b[5]) + + def diagonal_size(self): + """Get the diagonal size of the bounding box.""" + b = self.bounds() + return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) + + def use_bounds(self, value): + """Consider object bounds in rendering.""" + self.SetUseBounds(value) + return self + def clone(self): """Make a clone copy of the object.""" diff --git a/vedo/base.py b/vedo/base.py index fdb2d984..9ba85ed8 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -1117,7 +1117,7 @@ def map_cells_to_points(self, arrays=(), move=False): Set `move=True` to delete the original `celldata` array. """ c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(self.datset) + c2p.SetInputData(self.dataset) if not move: c2p.PassCellDataOn() if arrays: @@ -1129,7 +1129,7 @@ def map_cells_to_points(self, arrays=(), move=False): c2p.ProcessAllArraysOn() c2p.Update() self.mapper.SetScalarModeToUsePointData() - self.DeepCopy(c2p.GetOutput()) + self._update(c2p.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return self @@ -1160,7 +1160,7 @@ def map_points_to_cells(self, arrays=(), move=False): p2c.ProcessAllArraysOn() p2c.Update() self.mapper.SetScalarModeToUseCellData() - self._update(p2c.GetOutput()) + self._update(p2c.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return self diff --git a/vedo/colors.py b/vedo/colors.py index fcce69b6..907e4555 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -578,16 +578,16 @@ # default color palettes when using an index palettes = ( ( - [0.67843137, 0.70980392, 0.74117647], # gray5 - [0.8627451 , 0.20784314, 0.27058824], # red5 - [0.99215686, 0.49411765, 0.07843137], # orange5 [1. , 0.75686275, 0.02745098], # yellow5 + [0.99215686, 0.49411765, 0.07843137], # orange5 + [0.8627451 , 0.20784314, 0.27058824], # red5 [0.83921569, 0.2 , 0.51764706], # pink5 [0.1254902 , 0.78823529, 0.59215686], # teal5 [0.15686275, 0.65490196, 0.27058824], # green5 [0.09019608, 0.63529412, 0.72156863], # cyan5 [0.05098039, 0.43137255, 0.99215686], # blue5 [0.4 , 0.0627451 , 0.94901961], # indigo5 + [0.67843137, 0.70980392, 0.74117647], # gray5 ), ( (1.0, 0.832, 0.000), # gold diff --git a/vedo/mesh.py b/vedo/mesh.py index 54c42f2a..a714b25c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -265,7 +265,7 @@ def __init__(self, inputobj=None, c='gold', alpha=1): gf.Update() self.dataset = gf.GetOutput() except: - vedo.logger.error(f"cannot build mesh from type {inputtype}") + vedo.logger.error(f"cannot build mesh from type {type(inputobj)}") raise RuntimeError() self.mapper.SetInputData(self.dataset) diff --git a/vedo/plotter.py b/vedo/plotter.py index 91352d66..5e061711 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3598,16 +3598,6 @@ def _keypress(self, iren, event): except AttributeError: pass - elif key == "w": - if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.property.SetRepresentationToWireframe() - else: - for a in self.get_meshes(): - if a.property.GetRepresentation() == 1: # toggle - a.property.SetRepresentationToSurface() - else: - a.property.SetRepresentationToWireframe() - elif key == "U": pval = renderer.GetActiveCamera().GetParallelProjection() renderer.GetActiveCamera().SetParallelProjection(not pval) @@ -3760,11 +3750,24 @@ def _keypress(self, iren, event): self.reset_viewup() elif key == "s": + try: + if self.clicked_object and self.clicked_object in self.get_meshes(): + self.clicked_object.wireframe(False) + else: + for a in self.get_meshes(): + a.wireframe() + except AttributeError: + pass # Points dont have wireframe + + elif key == "w": if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.wireframe(False) + self.clicked_object.property.SetRepresentationToWireframe() else: for a in self.get_meshes(): - a.wireframe() + if a.property.GetRepresentation() == 1: # toggle + a.property.SetRepresentationToSurface() + else: + a.property.SetRepresentationToWireframe() elif key == "1": self._icol += 1 @@ -3978,7 +3981,7 @@ def _keypress(self, iren, event): if th > np.pi: th = np.random.random() * np.pi / 2 ph += 0.3 - cpos = transformations.spher2cart(r, th, ph) + cm + cpos = transformations.spher2cart(r, th, ph).T + cm self._extralight.SetPosition(cpos) self.window.Render() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 4799e9c0..9e2bdc35 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -271,8 +271,6 @@ def fit_plane(points, signed=False): xyz_max = data.max(axis=0) s = np.linalg.norm(xyz_max - xyz_min) pla = vedo.shapes.Plane(datamean, n, s=[s, s]) - pla.normal = n - pla.center = datamean pla.variance = dd[2] pla.name = "FitPlane" pla.top = n @@ -1073,7 +1071,7 @@ def update_trail(self): self.trail_points.pop(0) data = np.array(self.trail_points) - currentpos + self.trail_offset - tpoly = self.trail + tpoly = self.trail.dataset tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) self.trail.pos(currentpos) return self @@ -1894,40 +1892,19 @@ def fibonacci_sphere(n): self.dataset.DeepCopy(inputobj) if self.dataset.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() - for i in range(self.dataset.GetPointData()): + for i in range(self.dataset.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) - self.SetVerts(carr) - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) + self.dataset.SetVerts(carr) elif utils.is_sequence(inputobj): # passing point coords - pd = utils.buildPolyData(utils.make3d(inputobj)) - if utils.is_sequence(c) and len(c) == len(inputobj): - cols = vtk.vtkUnsignedCharArray() - cols.SetNumberOfComponents(4) - cols.SetName("PointsRGBA") - for i in range(len(inputobj)): - r, g, b = c[i] - cols.InsertNextTuple4(r, g, b, 255) - pd.GetPointData().SetScalars(cols) - else: - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) - self.dataset = pd - self.pipeline = utils.OperationNode( - self, parents=[], comment=f"#pts {self.dataset.GetPointData()}") - + self.dataset = utils.buildPolyData(utils.make3d(inputobj)) + elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj self.dataset = verts.dataset - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) else: # try to extract the points from a generic VTK input data object try: @@ -1936,10 +1913,6 @@ def fibonacci_sphere(n): for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) self.dataset.GetPointData().AddArray(arr) - - c = colors.get_color(c) - self.property.SetColor(c) - self.property.SetOpacity(alpha) except: vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() @@ -1947,6 +1920,8 @@ def fibonacci_sphere(n): self.actor.SetMapper(self.mapper) self.mapper.SetInputData(self.dataset) + self.property.SetColor(colors.get_color(c)) + self.property.SetOpacity(alpha) self.property.SetRepresentationToPoints() self.property.SetPointSize(r) self.property.LightingOff() @@ -2784,10 +2759,10 @@ def interpolate_data_from( raise RuntimeError if on == "points": - points = source + points = source.dataset elif on == "cells": poly2 = vtk.vtkPolyData() - poly2.ShallowCopy(source) + poly2.ShallowCopy(source.dataset) c2p = vtk.vtkCellDataToPointData() c2p.SetInputData(poly2) c2p.Update() @@ -3858,7 +3833,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar """ if isinstance(points, Points): parents = [points] - vpts = points.GetPoints() + vpts = points.dataset.GetPoints() points = points.points() else: parents = [self] @@ -4109,7 +4084,7 @@ def generate_mesh( cmesh.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], - comment=f"#quads {cmesh.GetNumberOfCells()}", + comment=f"#quads {cmesh.dataset.GetNumberOfCells()}", ) return cmesh ############################################# @@ -4148,14 +4123,14 @@ def generate_mesh( else: boundary = range(contour.npoints) - dln = delaunay2d(points, mode="xy", boundaries=[boundary]) + dln = Points(points).generate_delaunay2d(mode="xy", boundaries=[boundary]) dln.compute_normals(points=False) # fixes reversd faces dln.lw(0.5) dln.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], - comment=f"#cells {dln.GetNumberOfCells()}", + comment=f"#cells {dln.dataset.GetNumberOfCells()}", ) return dln diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 46791663..7050e8d9 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -53,7 +53,7 @@ def _to2d(obj, offset, scale): transform.Scale(scale, scale, scale) transform.Translate(-offset[0], -offset[1], 0) tp.SetTransform(transform) - tp.SetInputData(obj) + tp.SetInputData(obj.dataset) tp.Update() poly = tp.GetOutput() @@ -195,7 +195,7 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * self.axes = None if xlim[0] >= xlim[1] or ylim[0] >= ylim[1]: vedo.logger.warning(f"Null range for Figure {self.title}... returning an empty Assembly.") - super.__init__() + super().__init__() self.yscale = 0 return @@ -387,7 +387,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): if isinstance(a, vedo.Points): # hacky way to identify Points if a.ncells == a.npoints: - poly = a + poly = a.dataset if poly.GetNumberOfPolys() == 0 and poly.GetNumberOfLines() == 0: as3d = False rescale = True @@ -1285,7 +1285,7 @@ def __init__( axes_opts["htitle_offset"] = [-0.49, 0.01, 0] ############################################### Figure init - super.__init__(xlim, ylim, aspect, padding, **fig_kwargs) + super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) if self.yscale: ##################### the grid @@ -2733,9 +2733,9 @@ def _plot_fxy( return None if zlim[0]: - poly = Mesh(poly).cut_with_plane((0, 0, zlim[0]), (0, 0, 1)) + poly = Mesh(poly).cut_with_plane((0, 0, zlim[0]), (0, 0, 1)).dataset if zlim[1]: - poly = Mesh(poly).cut_with_plane((0, 0, zlim[1]), (0, 0, -1)) + poly = Mesh(poly).cut_with_plane((0, 0, zlim[1]), (0, 0, -1)).dataset cmap = "" if c in colors.cmaps_names: @@ -2772,7 +2772,7 @@ def _plot_fxy( acts.append(zbandsact) if show_nan and todel: - bb = mesh.GetBounds() + bb = mesh.bounds() if bb[4] <= 0 and bb[5] >= 0: zm = 0.0 else: @@ -3004,11 +3004,10 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha nanpts = [] if inans: - redpts = spher2cart(newr[inans], theta[inans], phi[inans]) + redpts = spher2cart(newr[inans], theta[inans], phi[inans]).T nanpts.append(shapes.Points(redpts, r=4, c="r")) - pts = spher2cart(newr, theta, phi) - + pts = spher2cart(newr, theta, phi).T ssurf = sg.clone().points(pts) if inans: ssurf.delete_cells_by_point_index(inans) @@ -3151,7 +3150,7 @@ def _histogram_hex_bin( if cmap is not None: for h in hexs: - z = h.GetBounds()[5] + z = h.bounds()[5] col = colors.color_map(z, cmap, 0, binmax) h.color(col) diff --git a/vedo/shapes.py b/vedo/shapes.py index 5955e830..8b512409 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -13,7 +13,7 @@ import vedo from vedo import settings from vedo.transformations import pol2cart, cart2spher, spher2cart -from vedo.colors import cmaps_names, color_map, get_color, printc +from vedo.colors import cmaps_names, get_color, printc from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh @@ -588,17 +588,17 @@ def pattern(self, stipple, repeats=10): image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 255) i_dim += 1 - polyData = self + poly = self.dataset # Create texture coordinates tcoords = vtk.vtkDoubleArray() tcoords.SetName("TCoordsStippledLine") tcoords.SetNumberOfComponents(1) - tcoords.SetNumberOfTuples(polyData.GetNumberOfPoints()) - for i in range(polyData.GetNumberOfPoints()): + tcoords.SetNumberOfTuples(poly.GetNumberOfPoints()) + for i in range(poly.GetNumberOfPoints()): tcoords.SetTypedTuple(i, [i / 2]) - polyData.GetPointData().SetTCoords(tcoords) - polyData.GetPointData().Modified() + poly.GetPointData().SetTCoords(tcoords) + poly.GetPointData().Modified() texture = vtk.vtkTexture() texture.SetInputData(image) texture.InterpolateOff() @@ -2686,8 +2686,8 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) z = z * (1 + z * z) / 2 _, theta, phi = cart2spher(x, y, z) - pts = spher2cart(np.ones_like(phi) * r, theta, phi) - self.points(pts.T) + pts = spher2cart(np.ones_like(phi) * r, theta, phi).T + self.points(pts) else: if utils.is_sequence(res): @@ -2826,7 +2826,7 @@ def __init__(self, style=1, r=1.0): tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) - super().__init__(tss, c="w") + super().__init__(tss.GetOutput(), c="w") atext = vtk.vtkTexture() pnm_reader = vtk.vtkJPEGReader() fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) @@ -3428,7 +3428,7 @@ def __init__( t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(sp) + tf.SetInputData(sp.dataset) tf.SetTransform(t) tf.Update() tuf = vtk.vtkTubeFilter() @@ -3825,10 +3825,10 @@ def __init__( cmt.rotate_z(90 + angle) cmt.scale(1 / (cx1 - cx0) * s * len(comment) / 5) cmt.shift(x1 * (1 + padding2), 0, 0) - poly = merge(br, cmt) + poly = merge(br, cmt).dataset else: - poly = br + poly = br.dataset tr = vtk.vtkTransform() tr.RotateZ(angler) @@ -4898,7 +4898,7 @@ def __init__(self, pts): mesh = Points(pts) else: mesh = pts - apoly = mesh.clean() + apoly = mesh.clean().dataset # Create the convex hull of the pointcloud z0, z1 = mesh.zbounds() @@ -4922,7 +4922,6 @@ def __init__(self, pts): out = fe.GetOutput() super().__init__(out, c=mesh.color(), alpha=0.75) - # self.triangulate() self.flat() self.name = "ConvexHull" From 995236913cd74e9131426921007aa8fce1b0417e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 11 Oct 2023 21:28:57 +0200 Subject: [PATCH 055/251] test experimental Gruppo class --- vedo/assembly.py | 445 +++++++++++++++++++++++++++++++++++++++++++++-- vedo/base.py | 4 +- vedo/plotter.py | 2 +- vedo/pyplot.py | 2 +- 4 files changed, 434 insertions(+), 19 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index b37e09f9..dfdd6adf 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -22,6 +22,18 @@ __all__ = ["Group", "Assembly", "procrustes_alignment"] +################################################# +def _is_sequence(arg): + """Check if the input is iterable.""" + if hasattr(arg, "strip"): + return False + if hasattr(arg, "__getslice__"): + return True + if hasattr(arg, "__iter__"): + return True + return False + + ################################################# def procrustes_alignment(sources, rigid=False): """ @@ -96,7 +108,7 @@ def __init__(self, objects=()): for a in vedo.utils.flatten(objects): if a: - self.AddPart(a) + self.AddPart(a.actor) self.PickableOff() @@ -227,12 +239,6 @@ def __init__(self, *meshs): self.actor = self self.name = "" - self.trail = None - self.trail_points = [] - self.trail_segment_size = 0 - self.trail_offset = None - self.shadows = [] - self.info = {} self.rendered_at = set() self.scalarbar = None @@ -374,11 +380,18 @@ def apply_transform(self, LT, concatenate=True): return self # TODO #### - def propagate_transform(self): - """Propagate the transformation to all parts.""" - # navigate the assembly and apply the transform to all parts - # and reset position, orientation and scale of the assembly - raise NotImplementedError() + # def propagate_transform(self): + # """Propagate the transformation to all parts.""" + # # navigate the assembly and apply the transform to all parts + # # and reset position, orientation and scale of the assembly + # for i in range(self.GetNumberOfPaths()): + # path = self.GetPath(i) + # obj = path.GetLastNode().GetViewProp() + # obj.SetUserTransform(self.transform.T) + # obj.SetPosition(0, 0, 0) + # obj.SetOrientation(0, 0, 0) + # obj.SetScale(1, 1, 1) + # raise NotImplementedError() def pos(self, x=None, y=None, z=None): @@ -451,7 +464,6 @@ def rotate_z(self, angle): LT = LinearTransform().rotate_z(angle) return self.apply_transform(LT) - def bounds(self): """ Get the object bounds. @@ -553,7 +565,7 @@ def pickable(self, value=None): elem.SetPickable(value) # set property for self using inherited pickable() - return super().pickable(value=value) + return self def show(self, **options): """ @@ -566,3 +578,408 @@ def show(self, **options): Returns the ``Plotter`` class instance. """ return vedo.plotter.show(self, **options) + + +############################################################################### +class Gruppo: + + def __init__(self, *meshes): + """ + Group many and treat them as a single new object. + """ + + self.actor = vtk.vtkPropAssembly() + self.actor.data = self #reference to this object + + self.rendered_at = set() + + self.name = "Gruppo" + + self.objects = [] + + self.transform = LinearTransform() + + for m in vedo.utils.flatten(meshes): + if m: + self.objects.append(m) + self.actor.AddPart(m.actor) + if hasattr(m, "scalarbar") and m.scalarbar is not None: + self.objects.append(m.scalarbar) + self.actor.AddPart(m.scalarbar.actor) + + self.actor.PickableOff() + + if self.objects: + self.base = self.objects[0].base + self.top = self.objects[0].top + else: + self.base = None + self.top = None + + self.pipeline = vedo.utils.OperationNode( + "Gruppo", + parents=self.objects, + comment=f"#objects {len(self.objects)}", + c="#f08080", + ) + ########################################## + + def _repr_html_(self): + """ + HTML representation of the Gruppo object for Jupyter Notebooks. + + Returns: + HTML text with the image and some properties. + """ + import io + import base64 + from PIL import Image + + library_name = "vedo.assembly.Gruppo" + help_url = "https://vedo.embl.es/docs/vedo/assembly.html" + + arr = self.thumbnail(zoom=1.1, elevation=-60) + + im = Image.fromarray(arr) + buffered = io.BytesIO() + im.save(buffered, format="PNG", quality=100) + encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") + url = "data:image/png;base64," + encoded + image = f"" + + # statisitics + bounds = "
".join( + [ + vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) + for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) + ] + ) + + help_text = "" + if self.name: + help_text += f" {self.name}:   " + help_text += '' + library_name + "" + if self.filename: + dots = "" + if len(self.filename) > 30: + dots = "..." + help_text += f"
({dots}{self.filename[-30:]})" + + allt = [ + "", + "", + "", + "
", + image, + "
", + help_text, + "", + "", + "", + "", + "", + "
nr. of objects " + + str(self.GetNumberOfPaths()) + + "
position " + str(self.transformation.position) + "
diagonal size " + + vedo.utils.precision(self.diagonal_size(), 5) + + "
bounds
(x/y/z)
" + str(bounds) + "
", + "
", + ] + return "\n".join(allt) + + def __add__(self, obj): + """ + Add an object to the `Gruppo` + """ + self.objects.append(obj) + self.AddPart(obj.actor) + + if hasattr(obj, "scalarbar") and obj.scalarbar is not None: + self.objects.append(obj.scalarbar) + self.AddPart(obj.scalarbar.actor) + return self + + def __iadd__(self, *obj): + """ + Add an object to the group + """ + for ob in obj: + if ob: + self.objects.append(ob) + self.AddPart(ob.actor) + if hasattr(ob, "scalarbar") and ob.scalarbar is not None: + self.objects.append(ob.scalarbar) + self.AddPart(ob.scalarbar.actor) + return self + + def __contains__(self, obj): + """Allows to use ``in`` to check if an object is in the `Gruppo`.""" + return obj in self.objects + + def pickable(self, value): + """Set/get the pickability property of an assembly and its elements""" + # set property to each element + for elem in self.recursive_unpack(): + elem.pickable(value) + self.actor.SetPickable(value) + return self + + def use_bounds(self, value): + """Consider object bounds in rendering.""" + self.actor.SetUseBounds(value) + return self + + def unpack(self): + """Unpack the group into its elements""" + elements = [] + self.actor.InitPathTraversal() + parts = self.actor.GetParts() + parts.InitTraversal() + for i in range(parts.GetNumberOfItems()): + ele = parts.GetItemAsObject(i) + elements.append(ele) + return elements + + def clone(self): + """Make a clone copy of the object.""" + newlist = [] + for a in self.objects: + newlist.append(a.clone()) + newg = Gruppo(newlist) + newg.name = self.name + newg.transform = self.transform.clone() + return newg + + def diagonal_size(self): + """Get the diagonal size of the bounding box.""" + b = self.bounds() + return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) + + # def g_unpack(self): + # """Unpack the group into its elements""" + + # return self.objects + + # def r_unpack(self): + # """Flatten out an Gruppo.""" + + # def _genflatten(lst): + # if not lst: + # return [] + # ## + # # if isinstance(lst[-1], Gruppo): + # # lst = lst[-1].g_unpack() + # ## + + # for elem in lst: + # if isinstance(elem, Gruppo): + # for x in elem.g_unpack(): + # yield x + # else: + # yield elem + + # l1 = list(_genflatten(self.objects)) + # return l1 + + def recursive_unpack(self): + """Flatten out an Gruppo.""" + flatlist = [] + for o1 in self.objects: + if isinstance(o1, Gruppo): + for o2 in o1.objects: + if isinstance(o2, Gruppo): + for o3 in o2.objects: + if isinstance(o3, Gruppo): + for o4 in o3.objects: + if isinstance(o3, Gruppo): + print("Warning: Gruppo.recursive_unpack() is limited to 4 levels") + else: + flatlist.append(o4) + else: + flatlist.append(o3) + else: + flatlist.append(o2) + else: + flatlist.append(o1) + return flatlist + + def unpack(self, i=None): + """Unpack the list of objects from a ``Gruppo``. + + If `i` is given, get `i-th` object from a ``Gruppo``. + Input can be a string, in this case returns the first object + whose name contains the given string. + + Examples: + - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) + """ + if i is None: + return self.objects + elif isinstance(i, int): + return self.objects[i] + elif isinstance(i, str): + for m in self.objects: + if i in m.name: + return m + + def pos(self, *p): + """Set object position.""" + if len(p) == 0: + return self.transform.position + q = self.transform.position + LT = LinearTransform().translate(-q +p) + self.transform.concatenate(LT) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + def rotate_x(self, angle, rad=False, around=None): + """ + Rotate around x-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_x(angle, rad, around) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + def rotate_y(self, angle, rad=False, around=None): + """ + Rotate around y-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_y(angle, rad, around) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + def rotate_z(self, angle, rad=False, around=None): + """ + Rotate around z-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_z(angle, rad, around) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + def x(self, val=None): + """Set/Get object position along x axis.""" + p = self.transform.position + if val is None: + return p[0] + self.pos(val, p[1], p[2]) + return self + + def y(self, val=None): + """Set/Get object position along y axis.""" + p = self.transform.position + if val is None: + return p[1] + self.pos(p[0], val, p[2]) + return self + + def z(self, val=None): + """Set/Get object position along z axis.""" + p = self.transform.position + if val is None: + return p[2] + self.pos(p[0], p[1], val) + return self + + def shift(self, *ds): + """Add a shift to the current object position.""" + LT = LinearTransform().translate(ds) + self.transform.concatenate(LT) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + def scale(self, s=None, reset=False, origin=True): + """ + Set/get object's scaling factor. + + Arguments: + s : (list, float) + scaling factor(s). + reset : (bool) + if True previous scaling factors are ignored. + origin : (bool) + if True scaling is applied with respect to object's position, + otherwise is applied respect to (0,0,0). + + Note: + use `s=(sx,sy,sz)` to scale differently in the three coordinates. + """ + if s is None: + return np.array(self.transform.T.GetScale()) + + if not _is_sequence(s): + s = [s, s, s] + + LT = LinearTransform() + if reset: + old_s = np.array(self.transform.T.GetScale()) + LT.scale(s / old_s) + else: + if origin is True: + LT.scale(s, origin=self.transform.position) + elif origin is False: + LT.scale(s, origin=False) + else: + LT.scale(s, origin=origin) + + self.transform.concatenate(LT) + for o in self.recursive_unpack(): + o.apply_transform(LT) + return self + + + def bounds(self): + """ + Get the object bounds. + Returns a list in format [xmin,xmax, ymin,ymax]. + """ + return self.actor.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + + + def show(self, **options): + """ + Create on the fly an instance of class ``Plotter`` or use the last existing one to + show one single object. + + This method is meant as a shortcut. If more than one object needs to be visualised + please use the syntax `show(mesh1, mesh2, volume, ..., options)`. + + Returns the ``Plotter`` class instance. + """ + return vedo.plotter.show(self, **options) + diff --git a/vedo/base.py b/vedo/base.py index 9ba85ed8..604c5ce2 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -533,7 +533,6 @@ def rotate_z(self, angle, rad=False, around=None): def reorient(self, newaxis, initaxis=None, - around=(0,0,0), rotation=0, rad=False, xyplane=True, @@ -549,7 +548,6 @@ def reorient(self, initaxis = np.asarray(self.top) - self.base q = self.transform.position - LT = LinearTransform() LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) return self.apply_transform(LT) @@ -583,7 +581,7 @@ def scale(self, s=None, reset=False, origin=True): else: if origin is True: LT.scale(s, origin=self.transform.position) - elif origin is True: + elif origin is False: LT.scale(s, origin=False) else: LT.scale(s, origin=origin) diff --git a/vedo/plotter.py b/vedo/plotter.py index 5e061711..3d0a8caf 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2607,7 +2607,7 @@ def compute_screen_coordinates(self, obj, full_window=False): plt = Plotter() plt.show(elli) - xyscreen = plt.compute_screen_positions(elli) + xyscreen = plt.compute_screen_coordinates(elli) print('xyscreen coords:', xyscreen) # simulate an event happening at one point diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 7050e8d9..cdf7efbb 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -758,7 +758,7 @@ def __init__( fill=True, radius=0.075, c="olivedrab", - gap=0.02, + gap=0.0, alpha=1, outline=False, lw=2, From ec7ee50b9fd1fdb4f1b2eea49e535352ea3236af Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 15:12:42 +0200 Subject: [PATCH 056/251] vtk2numpy(None) returns [] --- vedo/base.py | 1 - vedo/mesh.py | 58 ++++++++++++++++++++++++++++++++-------------- vedo/plotter.py | 7 +++--- vedo/pointcloud.py | 23 +++++++++++++++++- vedo/utils.py | 31 ++++++++++++++----------- 5 files changed, 83 insertions(+), 37 deletions(-) diff --git a/vedo/base.py b/vedo/base.py index 604c5ce2..4686b452 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -377,7 +377,6 @@ def draggable(self, value=None): # NOT FUNCTIONAL? self.actor.SetDragable(value) return self - def apply_transform(self, LT, concatenate=True, deep_copy=True): """ Apply a linear or non-linear transformation to the mesh polygonal data. diff --git a/vedo/mesh.py b/vedo/mesh.py index a714b25c..20a09cbd 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -371,21 +371,19 @@ def _repr_html_(self): def faces(self, ids=()): """ + DEPRECATED. Use property `mesh.faces` instead. + Get cell polygonal connectivity ids as a python `list`. The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. If ids is set, return only the faces of the given cells. """ arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) - if arr1d is None: - return [] # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. if len(arr1d) == 0: arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) - if arr1d is None: - return [] i = 0 conn = [] @@ -401,11 +399,37 @@ def faces(self, ids=()): return conn[ids] return conn # cannot always make a numpy array of it! + @property def cells(self): - """Alias for `faces()`.""" - return self.faces() + """ + Get cell polygonal connectivity ids as a python `list`. + The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. + + If ids is set, return only the faces of the given cells. + """ + arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) + + # Get cell connettivity ids as a 1D array. vtk format is: + # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. + if len(arr1d) == 0: + arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) + + i = 0 + conn = [] + n = len(arr1d) + if n: + while True: + cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] + conn.append(cell) + i += arr1d[i] + 1 + if i >= n: + break + if len(ids): + return conn[ids] + return conn # cannot always make a numpy array of it! - def lines(self, flat=False): + @property + def lines(self): """ Get lines connectivity ids as a numpy array. Default format is `[[id0,id1], [id3,id4], ...]` @@ -417,13 +441,6 @@ def lines(self, flat=False): # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. arr1d = vtk2numpy(self.dataset.GetLines().GetData()) - - if arr1d is None: - return [] - - if flat: - return arr1d - i = 0 conn = [] n = len(arr1d) @@ -436,7 +453,16 @@ def lines(self, flat=False): return conn # cannot always make a numpy array of it! - def edges(self, ids=()): + @property + def lines_as_flat_array(self): + """ + Get lines connectivity ids as a numpy array. + Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] + """ + return vtk2numpy(self.dataset.GetLines().GetData()) + + @property + def edges(self): """ Return an array containing the edges connectivity. @@ -460,8 +486,6 @@ def edges(self, ids=()): i += arr1d[i] + 1 if i >= n: break - if len(ids): - return conn[ids] return conn # cannot always make a numpy array of it! def texture( diff --git a/vedo/plotter.py b/vedo/plotter.py index 3d0a8caf..bb49fd68 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -493,7 +493,6 @@ def __init__( ### BUG in GetScreenSize in VTK 9.1.0 ### https://discourse.vtk.org/t/vtk9-1-0-problems/7094/3 if settings.hack_call_screen_size: # True - vtkvers = vedo.vtk_version if not self.offscreen and (vtkvers[0] < 9 or vtkvers[0] == 9 and vtkvers[1] == 0): aus = self.window.GetScreenSize() @@ -595,7 +594,7 @@ def __init__( # passing a sequence of dicts for renderers specifications if self.size == "auto": - self.size = (1200, 900) + self.size = (800, 1000) for rd in shape: x0, y0 = rd["bottomleft"] @@ -3466,8 +3465,8 @@ def _mouseleftclick(self, iren, event): if histo.verbose: x = self.picked3d[0] idx = np.digitize(x, histo.edges) - 1 - f = histo.data.frequencies[idx] - cn = histo.data.centers[idx] + f = histo.frequencies[idx] + cn = histo.centers[idx] vedo.colors.printc(f"{histo.name}, bin={idx}, center={cn}, value={f}") diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 9e2bdc35..84bd954f 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1941,9 +1941,30 @@ def _update(self, polydata, reset_locators=True): self.cell_locator = None return self + @property + def vertices(self): + """Return the vertices (points) coordinates.""" + return utils.vtk2numpy(self.dataset.GetPoints().GetData()) + + #setter + @vertices.setter + def vertices(self): + """Set vertices (points) coordinates.""" + arr = utils.numpy2vtk(pts, dtype=np.float32) + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + # reset mesh to identity matrix position/rotation: + self.point_locator = None + self.cell_locator = None + self.line_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) + self.transform = LinearTransform() + return self + def polydata(self): """Return the underlying ``vtkPolyData`` object.""" - print("WARNING: call to .polydata() is obsolete, you can use property `dataset`.") + print("WARNING: call to .polydata() is obsolete, you can use property `.dataset`.") return self.dataset def _repr_html_(self): diff --git a/vedo/utils.py b/vedo/utils.py index 2c81981b..b66dbb37 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import math import os import time - import numpy as np try: @@ -11,9 +9,8 @@ except ImportError: import vtkmodules.all as vtk -from vtkmodules.util.numpy_support import numpy_to_vtk +from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.numpy_support import numpy_to_vtkIdTypeArray -from vtkmodules.util.numpy_support import vtk_to_numpy import vedo @@ -80,7 +77,7 @@ ########################################################################### class OperationNode: """ - Keep track of the operations which led to a final object. + Keep track of the operations which led to a final state. """ # https://www.graphviz.org/doc/info/shapes.html#html # Mesh #e9c46a @@ -189,7 +186,8 @@ def __repr__(self): from treelib import Tree except ImportError: vedo.logger.error( - "To use this functionality please install treelib:" "\n pip install treelib" + "To use this functionality please install treelib:" + "\n pip install treelib" ) return "" @@ -448,6 +446,8 @@ def numpy2vtk(arr, dtype=None, deep=True, name=""): def vtk2numpy(varr): """Convert a `vtkDataArray`, `vtkIdList` or `vtTransform` into a numpy array.""" + if varr is None: + return np.array([]) if isinstance(varr, vtk.vtkIdList): return np.array([varr.GetId(i) for i in range(varr.GetNumberOfIds())]) elif isinstance(varr, vtk.vtkBitArray): @@ -462,7 +462,6 @@ def vtk2numpy(varr): n = 4 M = [[varr.GetElement(i, j) for j in range(n)] for i in range(n)] return np.array(M) - return vtk_to_numpy(varr) @@ -1323,19 +1322,23 @@ def precision(x, p, vrange=None, delimiter="e"): out.append("-") x = -x - e = int(math.log10(x)) - tens = math.pow(10, e - p + 1) - n = math.floor(x / tens) + e = int(np.log10(x)) + # tens = np.power(10, e - p + 1) + tens = 10 ** (e - p + 1) + n = np.floor(x / tens) - if n < math.pow(10, p - 1): + # if n < np.power(10, p - 1): + if n < 10 ** (p - 1): e = e - 1 - tens = math.pow(10, e - p + 1) - n = math.floor(x / tens) + # tens = np.power(10, e - p + 1) + tens = 10 ** (e - p + 1) + n = np.floor(x / tens) if abs((n + 1.0) * tens - x) <= abs(n * tens - x): n = n + 1 - if n >= math.pow(10, p): + # if n >= np.power(10, p): + if n >= 10 ** p: n = n / 10.0 e = e + 1 From d6d09f9b25811569d1ba4bfacfe1bf251d969db0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 17:04:32 +0200 Subject: [PATCH 057/251] non working experiment with assembly and Gruppo --- vedo/addons.py | 10 ++-- vedo/assembly.py | 134 ++++++++++++++++++++++++++--------------------- vedo/plotter.py | 15 +++++- vedo/pyplot.py | 31 ++++++----- 4 files changed, 112 insertions(+), 78 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 24480e10..38098eb7 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -3909,7 +3909,7 @@ def Axes( a.actor.PickableOff() a.property.LightingOff() asse = Assembly(acts) - asse.PickableOff() + asse.actor.PickableOff() asse.name = "Axes" return asse @@ -4006,8 +4006,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): asse = Axes(**plt.axes, xrange=xrange, yrange=yrange, zrange=zrange) else: asse = Axes(xrange=xrange, yrange=yrange, zrange=zrange) - - plt.renderer.AddActor(asse) + + plt.add(asse) plt.axes_instances[r] = asse elif plt.axes in (2, 3): @@ -4093,8 +4093,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): acts += [zl, zc, zt] for a in acts: a.actor.PickableOff() - ass = Assembly(acts) - ass.PickableOff() + asse = Assembly(acts) + asse.actor.PickableOff() plt.add(ass) plt.axes_instances[r] = ass diff --git a/vedo/assembly.py b/vedo/assembly.py index dfdd6adf..ebb61240 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -214,7 +214,7 @@ def show(self, **options): ################################################# -class Assembly(vtk.vtkAssembly): +class Assembly: """ Group many objects and treat them as a single new object. """ @@ -229,14 +229,13 @@ def __init__(self, *meshs): ![](https://vedo.embl.es/images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif) """ - super().__init__() - if len(meshs) == 1: meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) - self.actor = self + self.actor = vtk.vtkAssembly() + self.actor.data = self #reference to this object self.name = "" self.rendered_at = set() @@ -245,7 +244,6 @@ def __init__(self, *meshs): self.transform = LinearTransform() self.objects = [m for m in meshs if m] - self.actors = [m.actor for m in self.objects] if self.objects: self.base = self.objects[0].base @@ -254,17 +252,17 @@ def __init__(self, *meshs): self.base = None self.top = None - scalarbars = [] - for a in self.actors: - if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): - self.AddPart(a) - if hasattr(a, "scalarbar") and a.scalarbar is not None: - scalarbars.append(a.scalarbar) + # scalarbars = [] + # for a in self.actors: + # if isinstance(a, vtk.vtkProp3D): # and a.actor.GetNumberOfPoints(): + # self.actor.AddPart(a) + # if hasattr(a, "scalarbar") and a.scalarbar is not None: + # scalarbars.append(a.scalarbar) - if len(scalarbars) > 1: - self.scalarbar = Group(scalarbars) - elif len(scalarbars) == 1: - self.scalarbar = scalarbars[0] + # if len(scalarbars) > 1: + # self.scalarbar = Group(scalarbars) + # elif len(scalarbars) == 1: + # self.scalarbar = scalarbars[0] self.pipeline = vedo.utils.OperationNode( "Assembly", @@ -274,6 +272,11 @@ def __init__(self, *meshs): ) ########################################## + # @property + # def actors(self): + # """Get the list of ``vtkActor``.""" + # return [m.actor for m in self.objects] + def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. @@ -325,9 +328,9 @@ def _repr_html_(self): help_text, "", "", - "", + "", "", @@ -341,28 +344,26 @@ def __add__(self, obj): """ Add an object to the assembly """ - if isinstance(obj, vtk.vtkProp3D): - - self.objects.append(obj) - self.actors.append(obj.actor) - self.AddPart(obj.actor) - if hasattr(obj, "scalarbar") and obj.scalarbar is not None: - if self.scalarbar is None: - self.scalarbar = obj.scalarbar - return self + self.objects.append(obj) + self.actor.AddPart(obj.actor) - def unpack_group(scalarbar): - if isinstance(scalarbar, Group): - return scalarbar.unpack() - else: - return scalarbar + if hasattr(obj, "scalarbar") and obj.scalarbar is not None: + if self.scalarbar is None: + self.scalarbar = obj.scalarbar + return self - if isinstance(self.scalarbar, Group): - self.scalarbar += unpack_group(obj.scalarbar) + def unpack_group(scalarbar): + if isinstance(scalarbar, Group): + return scalarbar.unpack() else: - self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) - self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") + return scalarbar + + if isinstance(self.scalarbar, Group): + self.scalarbar += unpack_group(obj.scalarbar) + else: + self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) + self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") return self def __contains__(self, obj): @@ -374,26 +375,11 @@ def apply_transform(self, LT, concatenate=True): """Apply a linear transformation to the object.""" if concatenate: self.transform.concatenate(LT) - self.SetPosition(self.transform.T.GetPosition()) - self.SetOrientation(self.transform.T.GetOrientation()) - self.SetScale(self.transform.T.GetScale()) + self.actor.SetPosition(self.transform.T.GetPosition()) + self.actor.SetOrientation(self.transform.T.GetOrientation()) + self.actor.SetScale(self.transform.T.GetScale()) return self - # TODO #### - # def propagate_transform(self): - # """Propagate the transformation to all parts.""" - # # navigate the assembly and apply the transform to all parts - # # and reset position, orientation and scale of the assembly - # for i in range(self.GetNumberOfPaths()): - # path = self.GetPath(i) - # obj = path.GetLastNode().GetViewProp() - # obj.SetUserTransform(self.transform.T) - # obj.SetPosition(0, 0, 0) - # obj.SetOrientation(0, 0, 0) - # obj.SetScale(1, 1, 1) - # raise NotImplementedError() - - def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality @@ -469,7 +455,7 @@ def bounds(self): Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ - return self.GetBounds() + return self.actor.GetBounds() def xbounds(self, i=None): """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" @@ -503,7 +489,7 @@ def diagonal_size(self): def use_bounds(self, value): """Consider object bounds in rendering.""" - self.SetUseBounds(value) + self.actor.SetUseBounds(value) return self @@ -545,7 +531,7 @@ def _genflatten(lst): ## for elem in lst: if isinstance(elem, Assembly): - apos = elem.GetPosition() + apos = elem.actor.GetPosition() asum = np.sum(apos) for x in elem.unpack(): if asum: @@ -586,6 +572,36 @@ class Gruppo: def __init__(self, *meshes): """ Group many and treat them as a single new object. + + + from vedo import * + + c.pos(2, 1, 0) + + c1 = Cone().pos(4, 0, 0).rotate_x(90) + c2 = Gruppo(Cone().pos(5, 0, 0), Cube()) + c1.vertices[:,2] += 10 + # print(c1.vertices) + ass1 = Gruppo([c1, c2]) + + gigi = Gruppo(s, c, ass1, Ellipsoid([2,-1])) # .pos([10,0,]) + + gigi.pos(10, 0, 0)#.pos(20, 10, 0).shift(3,4,5) + gigi.scale(0.2).x(1) + gigi.pickable(1) + print(gigi.pos(), gigi.bounds()) + + objs = gigi.recursive_unpack() + + show(gigi, Point(), axes=1) + + Sitauzione: + Gruppo e' un tentativo di fare un assembly che non si basa su vtkAssembly + ma su vtkPropAssembly che e' piu' generale. + il problema e' che anche usando vtkAssembly come membro non si riesce a + visualizzare gli assi nellesempio di pyplot/histo_1d_a.py + + """ self.actor = vtk.vtkPropAssembly() @@ -692,11 +708,11 @@ def __add__(self, obj): Add an object to the `Gruppo` """ self.objects.append(obj) - self.AddPart(obj.actor) + self.actor.AddPart(obj.actor) if hasattr(obj, "scalarbar") and obj.scalarbar is not None: self.objects.append(obj.scalarbar) - self.AddPart(obj.scalarbar.actor) + self.actor.AddPart(obj.scalarbar.actor) return self def __iadd__(self, *obj): @@ -706,7 +722,7 @@ def __iadd__(self, *obj): for ob in obj: if ob: self.objects.append(ob) - self.AddPart(ob.actor) + self.actor.AddPart(ob.actor) if hasattr(ob, "scalarbar") and ob.scalarbar is not None: self.objects.append(ob.scalarbar) self.AddPart(ob.scalarbar.actor) diff --git a/vedo/plotter.py b/vedo/plotter.py index bb49fd68..d7165183 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2688,9 +2688,18 @@ def _scan_input_return_acts(self, wannabe_acts): wannabe_acts = [wannabe_acts] ################# + print("wannabe_acts", wannabe_acts) wannabe_acts2 = [] for a in wannabe_acts: + # print(a.name, a.unpack()) + if isinstance(a, vedo.Assembly): + parts = a.recursive_unpack() + # parts = a.unpack() + for p in parts: + wannabe_acts2.append(p.actor) + continue + try: wannabe_acts2.append(a.actor) except AttributeError: @@ -2713,6 +2722,7 @@ def _scan_input_return_acts(self, wannabe_acts): except AttributeError: pass ################# + print("wannabe_acts2", len(wannabe_acts2)) scanned_acts = [] for a in wannabe_acts2: # scan content of list @@ -2764,7 +2774,7 @@ def _scan_input_return_acts(self, wannabe_acts): # scanned_acts.append(vedo.shapes.Text2D(a)) # naive version elif isinstance(a, ( - vtk.vtkAssembly, + # vtk.vtkAssembly, vtk.vtkVolume, # order matters! dont move above TetMesh vtk.vtkImageActor, vtk.vtkLegendBoxActor, @@ -2772,6 +2782,9 @@ def _scan_input_return_acts(self, wannabe_acts): )): scanned_acts.append(a) + # elif isinstance(a, vedo.Assembly): + # scanned_acts.append(a.actor) + elif isinstance(a, vtk.vtkLight): self.renderer.AddLight(a) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index cdf7efbb..aac92c8a 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -117,9 +117,11 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` axes : (dict) an extra dictionary of options for the `vedo.addons.Axes` object - """ + """ + super().__init__() self.verbose = True # printing to stdout on every mouse click + self.name = "Figure" self.xlim = np.asarray(xlim) self.ylim = np.asarray(ylim) @@ -222,7 +224,8 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * if self.axopts is True or self.axopts == 1: axes_opts = {} - tp, ts = utils.make_ticks(y0lim / self.yscale, y1lim / self.yscale, number_of_divisions) + tp, ts = utils.make_ticks(y0lim / self.yscale, + y1lim / self.yscale, number_of_divisions) labs = [] for i in range(1, len(tp) - 1): ynew = utils.lin_interpolate(tp[i], [0, 1], [y0lim, y1lim]) @@ -240,13 +243,14 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * axes_opts["c"] = options["ac"] self.axes = addons.Axes(**axes_opts) - - super().__init__([self.axes]) - self.name = "Figure" + self.actor.AddPart(self.axes.actor) + self.objects.append(self.axes) + print("axes in Figure", self.axes, [self.actor]) vedo.last_figure = self if settings.remember_last_figure_format else None - return + + ################################################################## def _repr_html_(self): """ HTML representation of the Figure object for Jupyter Notebooks. @@ -452,7 +456,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): # print("insert(): cannot cut", [a]) pass - self.AddPart(a.actor) + self.actor.AddPart(a.actor) self.objects.append(a) return self @@ -579,7 +583,7 @@ def add_legend( acts = texts + mks aleg = Assembly(acts) # .show(axes=1).close() - x0, x1, y0, y1, _, _ = aleg.GetBounds() + x0, x1, y0, y1, _, _ = aleg.bounds() if alpha: dx = x1 - x0 @@ -600,7 +604,7 @@ def add_legend( box.shift(0, 0, -dy / 100).pickable(False) if lc: box.lc(lc).lw(lw) - aleg.AddPart(box.actor) + aleg.actor.AddPart(box.actor) aleg.objects.append(box) xlim = self.xlim @@ -651,8 +655,8 @@ def add_legend( px, py = pos[0], pos[1] shx, shy = x0, y1 - zpos = aleg.GetPosition()[2] - aleg.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) + zpos = aleg.actor.GetPosition()[2] + aleg.actor.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg @@ -971,6 +975,7 @@ def __init__( ############################################### Figure init super().__init__(xlim, ylim, aspect, padding, **fig_kwargs) + if not self.yscale: return @@ -3079,8 +3084,8 @@ def _histogram_quad_bin(x, y, **kwargs): msh.lw(1).lighting("ambient") histo.actors[2] = msh - histo.RemovePart(gr) - histo.AddPart(msh.actor) + histo.actor.RemovePart(gr) + histo.actor.AddPart(msh.actor) histo.objects.append(msh) return histo From a54df45f7c5e4c494fdfaaca0886a5881f1580ba Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 17:26:51 +0200 Subject: [PATCH 058/251] small changes after failed attempt to make Assembly work in member mode --- vedo/addons.py | 6 +-- vedo/assembly.py | 128 +++++++++++++++++++++-------------------------- vedo/plotter.py | 15 +----- vedo/pyplot.py | 24 ++++----- 4 files changed, 71 insertions(+), 102 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 38098eb7..c725906a 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -3909,7 +3909,7 @@ def Axes( a.actor.PickableOff() a.property.LightingOff() asse = Assembly(acts) - asse.actor.PickableOff() + asse.PickableOff() asse.name = "Axes" return asse @@ -4095,8 +4095,8 @@ def add_global_axes(axtype=None, c=None, bounds=()): a.actor.PickableOff() asse = Assembly(acts) asse.actor.PickableOff() - plt.add(ass) - plt.axes_instances[r] = ass + plt.add(asse) + plt.axes_instances[r] = asse elif plt.axes == 4: axact = vtk.vtkAxesActor() diff --git a/vedo/assembly.py b/vedo/assembly.py index ebb61240..e3cb661d 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -214,7 +214,7 @@ def show(self, **options): ################################################# -class Assembly: +class Assembly(vtk.vtkAssembly): """ Group many objects and treat them as a single new object. """ @@ -229,13 +229,14 @@ def __init__(self, *meshs): ![](https://vedo.embl.es/images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif) """ + super().__init__() + if len(meshs) == 1: meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) - self.actor = vtk.vtkAssembly() - self.actor.data = self #reference to this object + self.actor = self self.name = "" self.rendered_at = set() @@ -244,6 +245,7 @@ def __init__(self, *meshs): self.transform = LinearTransform() self.objects = [m for m in meshs if m] + self.actors = [m.actor for m in self.objects] if self.objects: self.base = self.objects[0].base @@ -252,17 +254,17 @@ def __init__(self, *meshs): self.base = None self.top = None - # scalarbars = [] - # for a in self.actors: - # if isinstance(a, vtk.vtkProp3D): # and a.actor.GetNumberOfPoints(): - # self.actor.AddPart(a) - # if hasattr(a, "scalarbar") and a.scalarbar is not None: - # scalarbars.append(a.scalarbar) + scalarbars = [] + for a in self.actors: + if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): + self.AddPart(a) + if hasattr(a, "scalarbar") and a.scalarbar is not None: + scalarbars.append(a.scalarbar) - # if len(scalarbars) > 1: - # self.scalarbar = Group(scalarbars) - # elif len(scalarbars) == 1: - # self.scalarbar = scalarbars[0] + if len(scalarbars) > 1: + self.scalarbar = Group(scalarbars) + elif len(scalarbars) == 1: + self.scalarbar = scalarbars[0] self.pipeline = vedo.utils.OperationNode( "Assembly", @@ -272,11 +274,6 @@ def __init__(self, *meshs): ) ########################################## - # @property - # def actors(self): - # """Get the list of ``vtkActor``.""" - # return [m.actor for m in self.objects] - def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. @@ -328,9 +325,9 @@ def _repr_html_(self): help_text, "
nr. of objects " - + str(self.GetNumberOfPaths()) + + str(self.actor.GetNumberOfPaths()) + "
position " + str(self.GetPosition()) + "
position " + str(self.actor.GetPosition()) + "
diagonal size " + vedo.utils.precision(self.diagonal_size(), 5) + "
", "", - "", + "", "", @@ -344,26 +341,28 @@ def __add__(self, obj): """ Add an object to the assembly """ + if isinstance(obj, vtk.vtkProp3D): - self.objects.append(obj) - self.actor.AddPart(obj.actor) + self.objects.append(obj) + self.actors.append(obj.actor) + self.AddPart(obj.actor) - if hasattr(obj, "scalarbar") and obj.scalarbar is not None: - if self.scalarbar is None: - self.scalarbar = obj.scalarbar - return self + if hasattr(obj, "scalarbar") and obj.scalarbar is not None: + if self.scalarbar is None: + self.scalarbar = obj.scalarbar + return self - def unpack_group(scalarbar): - if isinstance(scalarbar, Group): - return scalarbar.unpack() - else: - return scalarbar + def unpack_group(scalarbar): + if isinstance(scalarbar, Group): + return scalarbar.unpack() + else: + return scalarbar - if isinstance(self.scalarbar, Group): - self.scalarbar += unpack_group(obj.scalarbar) - else: - self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) - self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") + if isinstance(self.scalarbar, Group): + self.scalarbar += unpack_group(obj.scalarbar) + else: + self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) + self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") return self def __contains__(self, obj): @@ -375,11 +374,26 @@ def apply_transform(self, LT, concatenate=True): """Apply a linear transformation to the object.""" if concatenate: self.transform.concatenate(LT) - self.actor.SetPosition(self.transform.T.GetPosition()) - self.actor.SetOrientation(self.transform.T.GetOrientation()) - self.actor.SetScale(self.transform.T.GetScale()) + self.SetPosition(self.transform.T.GetPosition()) + self.SetOrientation(self.transform.T.GetOrientation()) + self.SetScale(self.transform.T.GetScale()) return self + # TODO #### + # def propagate_transform(self): + # """Propagate the transformation to all parts.""" + # # navigate the assembly and apply the transform to all parts + # # and reset position, orientation and scale of the assembly + # for i in range(self.GetNumberOfPaths()): + # path = self.GetPath(i) + # obj = path.GetLastNode().GetViewProp() + # obj.SetUserTransform(self.transform.T) + # obj.SetPosition(0, 0, 0) + # obj.SetOrientation(0, 0, 0) + # obj.SetScale(1, 1, 1) + # raise NotImplementedError() + + def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality @@ -455,7 +469,7 @@ def bounds(self): Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ - return self.actor.GetBounds() + return self.GetBounds() def xbounds(self, i=None): """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" @@ -489,7 +503,7 @@ def diagonal_size(self): def use_bounds(self, value): """Consider object bounds in rendering.""" - self.actor.SetUseBounds(value) + self.SetUseBounds(value) return self @@ -531,7 +545,7 @@ def _genflatten(lst): ## for elem in lst: if isinstance(elem, Assembly): - apos = elem.actor.GetPosition() + apos = elem.GetPosition() asum = np.sum(apos) for x in elem.unpack(): if asum: @@ -572,36 +586,6 @@ class Gruppo: def __init__(self, *meshes): """ Group many and treat them as a single new object. - - - from vedo import * - - c.pos(2, 1, 0) - - c1 = Cone().pos(4, 0, 0).rotate_x(90) - c2 = Gruppo(Cone().pos(5, 0, 0), Cube()) - c1.vertices[:,2] += 10 - # print(c1.vertices) - ass1 = Gruppo([c1, c2]) - - gigi = Gruppo(s, c, ass1, Ellipsoid([2,-1])) # .pos([10,0,]) - - gigi.pos(10, 0, 0)#.pos(20, 10, 0).shift(3,4,5) - gigi.scale(0.2).x(1) - gigi.pickable(1) - print(gigi.pos(), gigi.bounds()) - - objs = gigi.recursive_unpack() - - show(gigi, Point(), axes=1) - - Sitauzione: - Gruppo e' un tentativo di fare un assembly che non si basa su vtkAssembly - ma su vtkPropAssembly che e' piu' generale. - il problema e' che anche usando vtkAssembly come membro non si riesce a - visualizzare gli assi nellesempio di pyplot/histo_1d_a.py - - """ self.actor = vtk.vtkPropAssembly() diff --git a/vedo/plotter.py b/vedo/plotter.py index d7165183..bb49fd68 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2688,18 +2688,9 @@ def _scan_input_return_acts(self, wannabe_acts): wannabe_acts = [wannabe_acts] ################# - print("wannabe_acts", wannabe_acts) wannabe_acts2 = [] for a in wannabe_acts: - # print(a.name, a.unpack()) - if isinstance(a, vedo.Assembly): - parts = a.recursive_unpack() - # parts = a.unpack() - for p in parts: - wannabe_acts2.append(p.actor) - continue - try: wannabe_acts2.append(a.actor) except AttributeError: @@ -2722,7 +2713,6 @@ def _scan_input_return_acts(self, wannabe_acts): except AttributeError: pass ################# - print("wannabe_acts2", len(wannabe_acts2)) scanned_acts = [] for a in wannabe_acts2: # scan content of list @@ -2774,7 +2764,7 @@ def _scan_input_return_acts(self, wannabe_acts): # scanned_acts.append(vedo.shapes.Text2D(a)) # naive version elif isinstance(a, ( - # vtk.vtkAssembly, + vtk.vtkAssembly, vtk.vtkVolume, # order matters! dont move above TetMesh vtk.vtkImageActor, vtk.vtkLegendBoxActor, @@ -2782,9 +2772,6 @@ def _scan_input_return_acts(self, wannabe_acts): )): scanned_acts.append(a) - # elif isinstance(a, vedo.Assembly): - # scanned_acts.append(a.actor) - elif isinstance(a, vtk.vtkLight): self.renderer.AddLight(a) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index aac92c8a..c81e4674 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -117,11 +117,9 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` axes : (dict) an extra dictionary of options for the `vedo.addons.Axes` object - """ - super().__init__() + """ self.verbose = True # printing to stdout on every mouse click - self.name = "Figure" self.xlim = np.asarray(xlim) self.ylim = np.asarray(ylim) @@ -243,9 +241,9 @@ def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), * axes_opts["c"] = options["ac"] self.axes = addons.Axes(**axes_opts) - self.actor.AddPart(self.axes.actor) - self.objects.append(self.axes) - print("axes in Figure", self.axes, [self.actor]) + + super().__init__([self.axes]) + self.name = "Figure" vedo.last_figure = self if settings.remember_last_figure_format else None @@ -456,7 +454,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): # print("insert(): cannot cut", [a]) pass - self.actor.AddPart(a.actor) + self.AddPart(a.actor) self.objects.append(a) return self @@ -583,7 +581,7 @@ def add_legend( acts = texts + mks aleg = Assembly(acts) # .show(axes=1).close() - x0, x1, y0, y1, _, _ = aleg.bounds() + x0, x1, y0, y1, _, _ = aleg.GetBounds() if alpha: dx = x1 - x0 @@ -604,7 +602,7 @@ def add_legend( box.shift(0, 0, -dy / 100).pickable(False) if lc: box.lc(lc).lw(lw) - aleg.actor.AddPart(box.actor) + aleg.AddPart(box.actor) aleg.objects.append(box) xlim = self.xlim @@ -655,8 +653,8 @@ def add_legend( px, py = pos[0], pos[1] shx, shy = x0, y1 - zpos = aleg.actor.GetPosition()[2] - aleg.actor.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) + zpos = aleg.GetPosition()[2] + aleg.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg @@ -3084,8 +3082,8 @@ def _histogram_quad_bin(x, y, **kwargs): msh.lw(1).lighting("ambient") histo.actors[2] = msh - histo.actor.RemovePart(gr) - histo.actor.AddPart(msh.actor) + histo.RemovePart(gr) + histo.AddPart(msh.actor) histo.objects.append(msh) return histo From 9043c6ebf50bee23335eb80d68718946e7c8a8dd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 19:26:25 +0200 Subject: [PATCH 059/251] change .points() to .vertices everywhere --- docs/changes.md | 14 +++- examples/basic/align1.py | 2 +- examples/basic/align4.py | 2 +- examples/basic/boundaries.py | 5 +- examples/basic/buildmesh.py | 8 +-- examples/basic/clustering.py | 2 +- examples/basic/colorlines.py | 2 +- examples/basic/colormaps.py | 2 +- examples/basic/connected_vtx.py | 4 +- examples/basic/glyphs2.py | 7 +- examples/basic/hover_legend.py | 4 +- examples/basic/mesh_alphas.py | 4 +- examples/basic/mesh_coloring.py | 2 +- examples/basic/mesh_custom.py | 2 +- examples/basic/mesh_lut.py | 2 +- examples/basic/mesh_map2cell.py | 2 +- examples/basic/mesh_modify.py | 13 ++-- examples/basic/mesh_sharemap.py | 4 +- examples/basic/mesh_threshold.py | 2 +- examples/basic/pca_ellipsoid.py | 4 +- examples/basic/scalarbars.py | 4 +- examples/basic/silhouette2.py | 6 +- vedo/addons.py | 2 +- vedo/applications.py | 16 ++--- vedo/assembly.py | 1 + vedo/backends.py | 6 +- vedo/base.py | 14 ++-- vedo/dolfin.py | 11 ++-- vedo/file_io.py | 6 +- vedo/mesh.py | 30 ++++----- vedo/picture.py | 4 +- vedo/plotter.py | 2 +- vedo/pointcloud.py | 110 +++++++++++++++++-------------- vedo/pyplot.py | 23 +++---- vedo/shapes.py | 74 ++++++++++----------- vedo/tetmesh.py | 2 +- vedo/ugrid.py | 2 +- vedo/utils.py | 8 +-- vedo/version.py | 2 +- vedo/volume.py | 4 +- 40 files changed, 220 insertions(+), 194 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 74e211ba..ab21e74f 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -17,7 +17,7 @@ ### Breaking changes - in `plotter.add_button(func)`, must use `func(event)` instead of `func()` (thanks to @smoothumut for spotting the bug) - +- change .points() to .vertices everywhere ------------------------- ## New/Revised Examples @@ -33,6 +33,18 @@ examples/volumetric/slicer1.py ### Broken Examples ``` +~/Projects/vedo/examples/basic +align5.py +background_image.py +cut_freehand.py +cut_interactive.py +glyphs2.py +largestregion.py +rotate_image.py +slider_browser.py +ssao.py + + ~/Projects/vedo/examples/advanced interpolate_scalar3.py recosurface.py diff --git a/examples/basic/align1.py b/examples/basic/align1.py index 3614d5fb..67a8945a 100644 --- a/examples/basic/align1.py +++ b/examples/basic/align1.py @@ -12,7 +12,7 @@ # Calculate the average squared distance between the aligned rim and the limb d = 0 -for p in rim2.points(): +for p in rim2.vertices: cpt = limb.closest_point(p) d += mag2(p - cpt) # square of residual distance average_squared_distance = d / rim2.npoints diff --git a/examples/basic/align4.py b/examples/basic/align4.py index a4c70860..4846d73b 100644 --- a/examples/basic/align4.py +++ b/examples/basic/align4.py @@ -17,7 +17,7 @@ # Color the aligned splines based on their distance from the mean spline for l in alignedsplines: - darr = mag(l.points()-mean) # distance array + darr = mag(l.vertices - mean) # distance array l.cmap('hot_r', darr, vmin=0, vmax=0.007) # Add the mean spline and script description to the list of aligned splines diff --git a/examples/basic/boundaries.py b/examples/basic/boundaries.py index c8e1850b..3152276e 100644 --- a/examples/basic/boundaries.py +++ b/examples/basic/boundaries.py @@ -9,11 +9,8 @@ # Get the point IDs on the boundary of the mesh pids = b.boundaries(return_point_ids=True) -# Get the points corresponding to the boundary IDs -bpts = b.points() - # Create a Points object to represent the boundary points -pts = Points(bpts[pids], r=10, c='red5') +pts = Points(b.vertices[pids], r=10, c='red5') # Create a Label object for all the vertices in the mesh labels = b.labels('id', scale=10).c('green2') diff --git a/examples/basic/buildmesh.py b/examples/basic/buildmesh.py index 479f6f16..89798408 100644 --- a/examples/basic/buildmesh.py +++ b/examples/basic/buildmesh.py @@ -3,10 +3,10 @@ # Define the vertices and faces that make up the mesh verts = [(50,50,50), (70,40,50), (50,40,80), (80,70,50)] -faces = [(0,1,2), (2,1,3), (1,0,3)] +cells = [(0,1,2), (2,1,3), (1,0,3)] # cells same as faces # Build the polygonal Mesh object from the vertices and faces -mesh = Mesh([verts, faces]) +mesh = Mesh([verts, cells]) # Set the backcolor of the mesh to violet # and show edges with a linewidth of 2 @@ -16,8 +16,8 @@ labs = mesh.labels('id').c('black') # Print the points and faces of the mesh as numpy arrays -print('points():', mesh.points()) -print('faces() :', mesh.faces()) +print('vertices:', mesh.vertices) +print('faces :', mesh.cells) # Show the mesh, vertex labels, and docstring show(mesh, labs, __doc__, viewup='z', axes=1).close() diff --git a/examples/basic/clustering.py b/examples/basic/clustering.py index cc4b63c4..19ab32af 100644 --- a/examples/basic/clustering.py +++ b/examples/basic/clustering.py @@ -11,7 +11,7 @@ noise4 = np.random.randn(N, 3) * f / 8 + np.array([1, 1, 1]) # Create a Points object from the noisy point sets -noise4 = Points(noise4).remove_outliers(radius=0.05).points() +noise4 = Points(noise4).remove_outliers(radius=0.05).vertices pts = noise1.tolist() + noise2.tolist() + noise3.tolist() + noise4.tolist() pts = Points(pts) diff --git a/examples/basic/colorlines.py b/examples/basic/colorlines.py index fecb1bf0..f01da528 100644 --- a/examples/basic/colorlines.py +++ b/examples/basic/colorlines.py @@ -13,7 +13,7 @@ # Calculate a scalar value for each line segment as # the distance between the corresponding points on the two lines -dist = mag(l1.points()-l2.points()) +dist = mag(l1.vertices - l2.vertices) # Color the lines based on the scalar value using the 'Accent' colormap, # and add a scalar bar to the plot diff --git a/examples/basic/colormaps.py b/examples/basic/colormaps.py index 878e927c..df741487 100644 --- a/examples/basic/colormaps.py +++ b/examples/basic/colormaps.py @@ -22,7 +22,7 @@ ] mug = Mesh(dataurl+"mug.ply") -scalars = mug.points()[:, 1] # let y-coord be the scalar +scalars = mug.vertices[:, 1] # let y-coord be the scalar plt = Plotter(N=len(maps)) diff --git a/examples/basic/connected_vtx.py b/examples/basic/connected_vtx.py index f53f5eab..377cf488 100644 --- a/examples/basic/connected_vtx.py +++ b/examples/basic/connected_vtx.py @@ -7,11 +7,11 @@ # select one point on the sphere using its index index = 12 -pt = s.points()[index] +pt = s.vertices[index] # find all the vertices that are connected to the selected point ids = s.connected_vertices(index) -vtxs = s.points()[ids] +vtxs = s.vertices[ids] # create a red point at the selected point's location apt = Point(pt, c="r", r=15) diff --git a/examples/basic/glyphs2.py b/examples/basic/glyphs2.py index a445643f..8d67e8ec 100644 --- a/examples/basic/glyphs2.py +++ b/examples/basic/glyphs2.py @@ -8,14 +8,15 @@ s2 = Sphere(r=20, res=8).wireframe().c('white',0.1).pos(0,4,0) # Get the coordinates of the vertices of each sphere -coords1 = s1.points() -coords2 = s2.points() +coords1 = s1.vertices +coords2 = s2.vertices # --- color can be a colormap which maps arrow sizes # Define a title for the first set of arrows, # and create an Arrows object with coordinates and a colormap for color t1 = 'Color arrows by size\nusing a color map' -a1 = Arrows(coords1, coords2, c='coolwarm', alpha=0.4).add_scalarbar(c='w') +a1 = Arrows(coords1, coords2, c='coolwarm', alpha=0.4) +a1.add_scalarbar(c='w') # --- get a list of random rgb colors # Generate a list of random RGB colors for each arrow diff --git a/examples/basic/hover_legend.py b/examples/basic/hover_legend.py index 4173723b..a047bd71 100644 --- a/examples/basic/hover_legend.py +++ b/examples/basic/hover_legend.py @@ -5,8 +5,8 @@ mesh = Mesh(dataurl+"bunny.obj").color('k7') # Create multiple arrays associated to mesh vertices or cells -mesh.pointdata['MYPOINTARRAY'] = mesh.points()[:,0] -mesh.celldata['MYCELLARRAY'] = mesh.cell_centers()[:,1] +mesh.pointdata['MYPOINTARRAY'] = mesh.vertices[:,0] +mesh.celldata['MYCELLARRAY'] = mesh.cell_centers[:,1] # Create more objects sph = Sphere(pos=(-0.1,0.05,0.05), r=0.02) diff --git a/examples/basic/mesh_alphas.py b/examples/basic/mesh_alphas.py index 601caa96..0606af32 100644 --- a/examples/basic/mesh_alphas.py +++ b/examples/basic/mesh_alphas.py @@ -5,14 +5,14 @@ mesh = Mesh(dataurl+"beethoven.ply") # pick y coordinates of vertices and use them as scalars -scals = mesh.points()[:, 1] +scalars = mesh.vertices[:, 1] # define opacities in the range of the scalar, # at min(scals) alpha is 0.1, # at max(scals) alpha is 0.9: alphas = [0.1, 0.1, 0.3, 0.4, 0.9] -mesh.cmap("copper", scals, alpha=alphas) +mesh.cmap("copper", scalars, alpha=alphas) # mesh.print() # print(mesh.pointdata['PointScalars']) # retrieve scalars diff --git a/examples/basic/mesh_coloring.py b/examples/basic/mesh_coloring.py index 6831ca62..697df25c 100644 --- a/examples/basic/mesh_coloring.py +++ b/examples/basic/mesh_coloring.py @@ -15,7 +15,7 @@ ##################################### Point coloring man2 = Mesh(dataurl+"man_low.vtk") -scals = man2.points()[:, 0] + 37 # pick x coordinates of vertices +scals = man2.vertices[:, 0] + 37 # pick x coordinates of vertices man2.cmap("hot", scals) man2.add_scalarbar(horizontal=True) diff --git a/examples/basic/mesh_custom.py b/examples/basic/mesh_custom.py index c7613744..ab84499f 100644 --- a/examples/basic/mesh_custom.py +++ b/examples/basic/mesh_custom.py @@ -5,7 +5,7 @@ man = Mesh(dataurl + "man.vtk") # let the scalar be the z coordinate of the mesh vertices -scals = man.points()[:, 2] +scals = man.vertices[:, 2] # assign color map with specified opacities try: diff --git a/examples/basic/mesh_lut.py b/examples/basic/mesh_lut.py index 5afb72f4..d9eb225f 100644 --- a/examples/basic/mesh_lut.py +++ b/examples/basic/mesh_lut.py @@ -6,7 +6,7 @@ mesh = Sphere(quads=True).scale([1,1,1.8]).linewidth(1) # Create some dummy data array to be associated to points -data = mesh.points()[:,2].copy() # pick z-coords, use them as scalar data +data = mesh.vertices[:,2].copy() # pick z-coords, use them as scalar data data[10:70] = float('nan') # make some values invalid by setting to NaN data[300:600] = 100 # send some values very far above-scale diff --git a/examples/basic/mesh_map2cell.py b/examples/basic/mesh_map2cell.py index 0cfda718..83087c2b 100644 --- a/examples/basic/mesh_map2cell.py +++ b/examples/basic/mesh_map2cell.py @@ -8,7 +8,7 @@ # let the scalar be the z coordinate of the mesh vertices msg1 = Text2D("Scalars originally defined on points..", pos="bottom-center") -mesh1.pointdata["myzscalars"] = mesh1.points()[:, 2] +mesh1.pointdata["myzscalars"] = mesh1.vertices[:, 2] mesh1.cmap("jet", "myzscalars", on="points") diff --git a/examples/basic/mesh_modify.py b/examples/basic/mesh_modify.py index 93955e2b..676de27e 100644 --- a/examples/basic/mesh_modify.py +++ b/examples/basic/mesh_modify.py @@ -1,15 +1,14 @@ """Modify mesh vertex positions""" from vedo import * -dsc = Disc(res=(8,120)).linewidth(0.1) +disc = Disc(res=(8,120)).linewidth(0.1) -plt = Plotter(interactive=False, axes=7) -plt.show(dsc, __doc__) +plt = Plotter(interactive=False, axes=1) +plt.show(disc, Point(), __doc__) -coords = dsc.points() for i in range(100): - coords[:,2] = sin(i/10.*coords[:,0])/5 # move vertices in z - dsc.points(coords) # update mesh points - plt.render() + # Modify vertex positions + disc.vertices += [0.01, 0.01*sin(i/20), 0] + plt.reset_camera().render() plt.interactive().close() diff --git a/examples/basic/mesh_sharemap.py b/examples/basic/mesh_sharemap.py index fd155679..45a97e28 100644 --- a/examples/basic/mesh_sharemap.py +++ b/examples/basic/mesh_sharemap.py @@ -5,12 +5,12 @@ ##################################### man1 = Mesh(dataurl+"man.vtk") -scals = man1.points()[:, 2] * 5 + 27 # pick z coordinates [18->34] +scals = man1.vertices[:, 2] * 5 + 27 # pick z coordinates [18->34] man1.cmap("rainbow", scals, vmin=18, vmax=44) ##################################### man2 = Mesh(dataurl+"man.vtk") -scals = man2.points()[:, 2] * 5 + 37 # pick z coordinates [28->44] +scals = man2.vertices[:, 2] * 5 + 37 # pick z coordinates [28->44] man2.cmap("rainbow", scals, vmin=18, vmax=44).add_scalarbar() show([(man2, __doc__), man1], shape=(2,1), elevation=-40, axes=11).close() diff --git a/examples/basic/mesh_threshold.py b/examples/basic/mesh_threshold.py index 0060404f..8572da49 100644 --- a/examples/basic/mesh_threshold.py +++ b/examples/basic/mesh_threshold.py @@ -4,7 +4,7 @@ man = Mesh(dataurl+"man.vtk") -scals = man.points()[:, 0] + 37 # pick y coords of vertices +scals = man.vertices[:, 0] + 37 # pick y coords of vertices # scals data is added to mesh points with automatic name PointScalars man.cmap("cool", scals).add_scalarbar(title="threshold", horizontal=True) diff --git a/examples/basic/pca_ellipsoid.py b/examples/basic/pca_ellipsoid.py index ef8133fc..f53d7cf3 100644 --- a/examples/basic/pca_ellipsoid.py +++ b/examples/basic/pca_ellipsoid.py @@ -13,13 +13,13 @@ ids = elli.inside_points(pts, return_ids=True) pts.print() # a new "IsInside" array now exists in pts -pin = pts.points()[ids] +pin = pts.vertices[ids] print("inside points #", len(pin)) # Create an inverted mask instead of calling insidePoints(invert=True) mask = np.ones(pts.npoints, dtype=bool) mask[ids] = False -pout = pts.points()[mask] +pout = pts.vertices[mask] print("outside points #", len(pout)) # Extra info can be retrieved with: diff --git a/examples/basic/scalarbars.py b/examples/basic/scalarbars.py index 097c3450..b81c0929 100644 --- a/examples/basic/scalarbars.py +++ b/examples/basic/scalarbars.py @@ -9,8 +9,8 @@ for i in range(3): s = shape.clone(deep=False).pos(0, i * 2.2, 0) # colorize mesh - scals = s.points()[:, 2] - s.cmap(cmaps[i], scals) + scalars = s.vertices[:, 2] + s.cmap(cmaps[i], scalars) ms.append(s) # add 2D scalar bar to first mesh diff --git a/examples/basic/silhouette2.py b/examples/basic/silhouette2.py index e8cd2e60..0d264860 100644 --- a/examples/basic/silhouette2.py +++ b/examples/basic/silhouette2.py @@ -11,7 +11,7 @@ plt = Plotter(title="Example of project_on_plane()") s = Hyperboloid().rotate_x(20) -pts = s.points() +pts = s.vertices n = len(pts) plt += [s, __doc__ + settings.default_font] @@ -20,7 +20,7 @@ plane1 = Plane(pos=(2, 0, 2), normal=(1, 0, 1), s=[5, 5]).alpha(0.1) so = s.clone().project_on_plane(plane1).c("y") plt += [plane1, so, so.silhouette("2d")] -pts1 = so.silhouette("2d").points() +pts1 = so.silhouette("2d").vertices # perspective projection ############################## plane2 = Plane(pos=(3, 3, 3), normal=(1, 1, 1), s=[5, 5]).alpha(0.1) @@ -32,7 +32,7 @@ plane3 = Plane(pos=(4, 8, -4), normal=(-1, 0, 1), s=[5, 5]).alpha(0.1) sob = s.clone().project_on_plane(plane3, direction=(1, 2, -1)).c("g") plt += [plane3, sob, sob.silhouette("2d")] -pts2 = sob.silhouette("2d").points() +pts2 = sob.silhouette("2d").vertices # draw the lines for i in range(0, n, int(n / 20)): diff --git a/vedo/addons.py b/vedo/addons.py index c725906a..174f90cc 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -737,7 +737,7 @@ def Goniometer( acts.append(lb) if alpha > 0: - pts = [p2] + arc.points().tolist() + [p2] + pts = [p2] + arc.vertices.tolist() + [p2] msh = Mesh([pts, [list(range(arc.npoints + 2))]], c=lc, alpha=alpha) msh.lighting("off") msh.triangulate() diff --git a/vedo/applications.py b/vedo/applications.py index ea9127f3..91db4b4f 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -937,7 +937,7 @@ def __init__( def init(self, init_points): """Set an initial number of points to define a region""" if isinstance(init_points, Points): - self.cpoints = init_points.points() + self.cpoints = init_points.vertices else: self.cpoints = np.array(init_points) self.points = Points(self.cpoints, r=self.linewidth).c(self.pointcolor).pickable(0) @@ -999,7 +999,7 @@ def _on_keypress(self, evt): self.render() self.mesh_prev = self.mesh.clone() tol = self.mesh.diagonal_size() / 2 # size of ribbon (not shown) - pts = self.spline.points() + pts = self.spline.vertices n = fit_plane(pts, signed=True).normal # compute normal vector to points rb = Ribbon(pts - tol * n, pts + tol * n, closed=True) self.mesh.cut_with_mesh(rb, invert=inv) # CUT @@ -1904,17 +1904,17 @@ def update(self, h=None, m=None, s=None): gamma = s * 2 * np.pi / 60 + np.pi / 2 x3, y3 = np.cos(gamma), np.sin(gamma) - pts2 = parts[2].points() + pts2 = parts[2].vertices pts2[1] = [-x1 * 0.5, y1 * 0.5, 0.001] - parts[2].points(pts2) + parts[2].vertices = pts2 - pts3 = parts[3].points() + pts3 = parts[3].vertices pts3[1] = [-x2 * 0.75, y2 * 0.75, 0.002] - parts[3].points(pts3) + parts[3].vertices = pts3 if s is not None: - pts4 = parts[4].points() + pts4 = parts[4].vertices pts4[1] = [-x3 * 0.95, y3 * 0.95, 0.003] - parts[4].points(pts4) + parts[4].vertices = pts4 return self diff --git a/vedo/assembly.py b/vedo/assembly.py index e3cb661d..4762bebd 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -241,6 +241,7 @@ def __init__(self, *meshs): self.name = "" self.rendered_at = set() self.scalarbar = None + self.info = {} self.transform = LinearTransform() diff --git a/vedo/backends.py b/vedo/backends.py index 3f1dc6f2..fc0e6c43 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -240,7 +240,7 @@ def start_k3d(actors2show): vedo.logger.warning("in k3d, nr. of lines is limited to 200.") break - pts = ia.points()[ln_idx] + pts = ia.vertices[ln_idx] aves = ia.diagonal_size() * iap.GetLineWidth() / 100 @@ -277,7 +277,7 @@ def start_k3d(actors2show): # https://k3d-jupyter.org/reference/factory.mesh.html#colormap kobj = k3d.mesh( - iacloned.points(), + iacloned.vertices, iacloned.faces(), colors=cols, name=name, @@ -318,7 +318,7 @@ def start_k3d(actors2show): aves = ia.average_size() * iap.GetPointSize() / 200 kobj = k3d.points( - ia.points().astype(np.float32), + ia.vertices.astype(np.float32), color=_rgb2int(iap.GetColor()), colors=kcols, opacity=iap.GetOpacity(), diff --git a/vedo/base.py b/vedo/base.py index 4686b452..a6fdfc5c 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -733,7 +733,7 @@ def bounds(self): Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ try: - pts = self.points() + pts = self.vertices xmin, ymin, zmin = np.min(pts, axis=0) xmax, ymax, zmax = np.max(pts, axis=0) return (xmin, xmax, ymin, ymax, zmin, zmax) @@ -881,9 +881,11 @@ def ncells(self): def points(self, pts=None): """ + Obsolete, use `self.vertices` instead. + Set/Get the vertex coordinates of a mesh or point cloud. - Keyword `pts` can also be a list of indices to be retrieved. """ + print("WARNING: .points() is obsolete, use .vertices instead.") if pts is None: ### getter if isinstance(self, vedo.Points): @@ -926,7 +928,7 @@ def points(self, pts=None): self.transform = LinearTransform() return self - + @property def cell_centers(self): """ Get the coordinates of the cell centers. @@ -1177,8 +1179,8 @@ def resample_data_from(self, source, tol=None, categorical=False): ```python from vedo import * m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) - pts = m1.points() - ces = m1.cell_centers() + pts = m1.vertices + ces = m1.cell_centers m1.pointdata["xvalues"] = np.power(pts[:,0], 3) m1.celldata["yvalues"] = np.power(ces[:,1], 3) m2 = Mesh(dataurl+'bunny.obj') @@ -2280,7 +2282,7 @@ def add_observer(self, event_name, func, priority=0): # ![](https://vedo.embl.es/images/volumetric/probePoints.png) # """ # if isinstance(pts, vedo.pointcloud.Points): -# pts = pts.points() +# pts = pts.vertices # def _readpoints(): # output = src.GetPolyDataOutput() diff --git a/vedo/dolfin.py b/vedo/dolfin.py index dfaef141..37e215af 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -490,15 +490,16 @@ def plot(*inputobj, **options): if warpYfactor: scals = actor.pointdata[0] if len(scals) > 0: - pts_act = actor.points() + pts_act = actor.vertices pts_act[:, 1] = scals * warpYfactor * scaleMeshFactors[1] if warpZfactor: scals = actor.pointdata[0] if len(scals) > 0: - pts_act = actor.points() + pts_act = actor.vertices pts_act[:, 2] = scals * warpZfactor * scaleMeshFactors[2] if warpYfactor or warpZfactor: - actor.points(pts_act) + # actor.points(pts_act) + actor.vertices = pts_act if vmin is not None and vmax is not None: actor.mapper().SetScalarRange(vmin, vmax) @@ -873,9 +874,9 @@ def MeshStreamLines(*inputobj, **options): pass # it's already it elif tol: print("decimating mesh points to use them as seeds...") - probes = meshact.clone().subsample(tol).points() + probes = meshact.clone().subsample(tol).vertices else: - probes = meshact.points() + probes = meshact.vertices if len(probes) > 500: printc("Probing domain with n =", len(probes), "points") printc(" ..this may take time (or choose a larger tol value)") diff --git a/vedo/file_io.py b/vedo/file_io.py index 0a384ecf..fa2ab736 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -843,7 +843,7 @@ def _fillcommon(obj, adict): ######################################################## def _fillmesh(obj, adict): - adict["points"] = obj.points(transformed=True).astype(float) + adict["points"] = obj.vertices.astype(float) poly = obj adict["cells"] = None @@ -1302,7 +1302,7 @@ def write(objct, fileoutput, binary=True): outF.write("# OBJ file format with ext .obj\n") outF.write("# File generated by vedo\n") - for p in objct.points(): + for p in objct.vertices: outF.write("v {:.5g} {:.5g} {:.5g}\n".format(*p)) ptxt = objct.GetPointData().GetTCoords() @@ -1331,7 +1331,7 @@ def write(objct, fileoutput, binary=True): return objct elif fr.endswith(".xml"): # write tetrahedral dolfin xml - vertices = objct.points().astype(str) + vertices = objct.vertices.astype(str) faces = np.array(objct.faces()).astype(str) ncoords = vertices.shape[0] with open(fileoutput, "w", encoding="UTF-8") as outF: diff --git a/vedo/mesh.py b/vedo/mesh.py index 20a09cbd..174568fd 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -424,8 +424,6 @@ def cells(self): i += arr1d[i] + 1 if i >= n: break - if len(ids): - return conn[ids] return conn # cannot always make a numpy array of it! @property @@ -668,7 +666,7 @@ def texture( largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] uvmap = self.pointdata[tname] # collapse triangles that have large gradient - new_points = self.points(transformed=False) + new_points = self.vertices.copy() for f in self.faces(): if np.isin(f, largegrad_ids).all(): id1, id2, id3 = f @@ -683,7 +681,7 @@ def texture( elif idm == 1: new_points[id2] = new_points[id1] new_points[id3] = new_points[id1] - self.points(new_points) + self.vertices = new_points self.dataset.Modified() self._texture = { @@ -831,9 +829,9 @@ def non_manifold_faces(self, remove=True, tol="auto"): if len(toremove) == 0: return self - points = self.points() + points = self.vertices faces = self.faces() - centers = self.cell_centers() + centers = self.cell_centers copy = self.clone() copy.delete_cells(toremove).clean() @@ -1104,7 +1102,7 @@ def join_segments(self, closed=True, tol=1e-03): for ipiece, outline in enumerate(self.split(must_share_edge=False)): outline.clean() - pts = outline.points() + pts = outline.vertices if len(pts) < 3: continue avesize = outline.average_size() @@ -1486,7 +1484,7 @@ def collapse_edges(self, distance, iterations=1): return self for _ in range(iterations): medges = self.edges() - pts = self.points() + pts = self.vertices newpts = np.array(pts) moved = [] for e in medges: @@ -1500,7 +1498,7 @@ def collapse_edges(self, distance, iterations=1): newpts[id1] = p moved += [id0, id1] - self.points(newpts) + self.vertices = newpts self.clean() self.compute_normals() @@ -1614,7 +1612,7 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): """ if isinstance(pts, Points): poly = pts.dataset - ptsa = pts.points() + ptsa = pts.vertices else: ptsa = np.asarray(pts) vpoints = vtk.vtkPoints() @@ -2274,7 +2272,7 @@ def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): ![](https://user-images.githubusercontent.com/32848391/55967065-eee08300-5c79-11e9-8933-265e1bab9f7e.png) """ if isinstance(p0, Points): - p0, p1 = p0.points() + p0, p1 = p0.vertices if not self.line_locator: self.line_locator = vtk.vtkOBBTree() @@ -2433,7 +2431,7 @@ def geodesic(self, start, end): ![](https://vedo.embl.es/images/advanced/geodesic.png) """ if is_sequence(start): - cc = self.points() + cc = self.vertices pa = Points(cc) start = pa.closest_point(start, return_point_id=True) end = pa.closest_point(end, return_point_id=True) @@ -2669,7 +2667,7 @@ def tetralize( pts = (np.random.rand(n, 3) - 0.5) * np.array([x1 - x0, y1 - y0, z1 - z0]) + disp normals = surf.celldata["Normals"] - cc = surf.cell_centers() + cc = surf.cell_centers subpts = cc - normals * gap * 1.05 pts = pts.tolist() + subpts.tolist() @@ -2687,7 +2685,7 @@ def tetralize( surf.subsample(side) tmesh = vedo.tetmesh.delaunay3d(vedo.merge(fillpts, surf)) - tcenters = tmesh.cell_centers() + tcenters = tmesh.cell_centers ids = surf.inside_points(tcenters, return_ids=True) ins = np.zeros(tmesh.ncells) @@ -2695,8 +2693,8 @@ def tetralize( if debug: # vedo.pyplot.histogram(fillpts.pointdata["Distance"], xtitle=f"gap={gap}").show().close() - edges = self.edges() - points = self.points() + edges = self.edges + points = self.vertices elen = mag(points[edges][:, 0, :] - points[edges][:, 1, :]) histo = vedo.pyplot.histogram(elen, xtitle="edge length", xlim=(0, 3 * side * d)) print(".. edges min, max", elen.min(), elen.max()) diff --git a/vedo/picture.py b/vedo/picture.py index 5fa41ce0..618b842b 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -1066,10 +1066,10 @@ def warp( parents = [self] if isinstance(source_pts, vedo.Points): parents.append(source_pts) - source_pts = source_pts.points() + source_pts = source_pts.vertices if isinstance(target_pts, vedo.Points): parents.append(target_pts) - target_pts = target_pts.points() + target_pts = target_pts.vertices ns = len(source_pts) nt = len(target_pts) diff --git a/vedo/plotter.py b/vedo/plotter.py index bb49fd68..60803d88 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2615,7 +2615,7 @@ def compute_screen_coordinates(self, obj, full_window=False): ``` """ if isinstance(obj, vedo.base.Base3DProp): - pts = obj.points() + pts = obj.vertices elif utils.is_sequence(obj): pts = obj p2d = [] diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 84bd954f..3dfb250a 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -95,7 +95,7 @@ def merge(*meshs, flag=False): def delaunay2d(plist, **kwargs): """delaunay2d() is deprecated, use Points().generate_delaunay2d() instead""" if isinstance(plist, Points): - plist = plist.points() + plist = plist.vertices else: plist = np.ascontiguousarray(plist) plist = utils.make3d(plist) @@ -156,7 +156,7 @@ def fit_line(points): ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): - points = points.points() + points = points.vertices data = np.array(points) datamean = data.mean(axis=0) _, dd, vv = np.linalg.svd(data - datamean) @@ -252,7 +252,7 @@ def fit_plane(points, signed=False): ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): - points = points.points() + points = points.vertices data = np.asarray(points) datamean = data.mean(axis=0) pts = data - datamean @@ -289,7 +289,7 @@ def fit_sphere(coords): ![](https://vedo.embl.es/images/advanced/fitspheres1.jpg) """ if isinstance(coords, Points): - coords = coords.points() + coords = coords.vertices coords = np.array(coords) n = len(coords) A = np.zeros((n, 4)) @@ -343,7 +343,7 @@ def pca_ellipse(points, pvalue=0.673, res=60): from scipy.stats import f if isinstance(points, Points): - coords = points.points() + coords = points.vertices else: coords = points if len(coords) < 4: @@ -409,7 +409,7 @@ def pca_ellipsoid(points, pvalue=0.673): from scipy.stats import f if isinstance(points, Points): - coords = points.points() + coords = points.vertices else: coords = points if len(coords) < 4: @@ -1082,7 +1082,7 @@ def _compute_shadow(self, plane, point, direction): shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" - pts = shad.points() + pts = shad.vertices if plane == 'x': # shad = shad.project_on_plane('x') # instead do it manually so in case of alpha<1 @@ -1090,17 +1090,17 @@ def _compute_shadow(self, plane, point, direction): # we leave a small tolerance of 0.1% in thickness x0, x1 = self.xbounds() pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] - shad.points(pts) + shad.vertices = pts shad.x(point) elif plane == 'y': x0, x1 = self.ybounds() pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] - shad.points(pts) + shad.vertices = pts shad.y(point) elif plane == "z": x0, x1 = self.zbounds() pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[2] - shad.points(pts) + shad.vertices = pts shad.z(point) else: shad = shad.project_on_plane(plane, point, direction) @@ -1236,11 +1236,11 @@ def labels( content = "id" if cells: - elems = self.cell_centers() + elems = self.cell_centers norms = self.normals(cells=True, recompute=False) ns = np.sqrt(self.ncells) else: - elems = self.points() + elems = self.vertices norms = self.normals(cells=False, recompute=False) ns = np.sqrt(self.npoints) @@ -1877,7 +1877,7 @@ def fibonacci_sphere(n): self.name = "Points" # better not to give it a name here? if isinstance(inputobj, vedo.BaseActor): - inputobj = inputobj.points() # numpy + inputobj = inputobj.vertices # numpy ###### if isinstance(inputobj, vtk.vtkActor): @@ -1944,11 +1944,13 @@ def _update(self, polydata, reset_locators=True): @property def vertices(self): """Return the vertices (points) coordinates.""" - return utils.vtk2numpy(self.dataset.GetPoints().GetData()) + varr = self.dataset.GetPoints().GetData() + narr = utils.vtk2numpy(varr) + return narr #setter @vertices.setter - def vertices(self): + def vertices(self, pts): """Set vertices (points) coordinates.""" arr = utils.numpy2vtk(pts, dtype=np.float32) vpts = self.dataset.GetPoints() @@ -1960,6 +1962,18 @@ def vertices(self): self.line_locator = None self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.transform = LinearTransform() + # BUG + # from vedo import * + # plt = Plotter(interactive=False, axes=7) + # s = Disc(res=(8,120)).linewidth(0.1) + # print([s.dataset.GetPoints().GetData()]) + # # plt.show(s) # depends if I show it or not.. + # # plt.renderer.AddActor(s.actor) + # print([s.dataset.GetPoints().GetData()]) + # for i in progressbar(100): + # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z + # show(s, interactive=1) + # exit() return self def polydata(self): @@ -2280,7 +2294,7 @@ def compute_acoplanarity(self, n=25, radius=None, on="points"): """ acoplanarities = [] if "point" in on: - pts = self.points() + pts = self.vertices elif "cell" in on: pts = self.cell_centers() else: @@ -2346,8 +2360,8 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): pcloud.point_locator.BuildLocator() ids = [] - ps1 = self.points() - ps2 = pcloud.points() + ps1 = self.vertices + ps2 = pcloud.vertices for p in ps1: pid = pcloud.point_locator.FindClosestPoint(p) ids.append(pid) @@ -2511,7 +2525,7 @@ def average_size(self): Calculate the average size of a mesh. This is the mean of the vertex distances from the center of mass. """ - coords = self.points() + coords = self.vertices cm = np.mean(coords, axis=0) if coords.shape[0] == 0: return 0.0 @@ -2631,7 +2645,7 @@ def transform_with_landmarks( else: ss = source_landmarks.dataset.GetPoints() if least_squares: - source_landmarks = source_landmarks.points() + source_landmarks = source_landmarks.vertices if utils.is_sequence(target_landmarks): st = vtk.vtkPoints() @@ -2640,7 +2654,7 @@ def transform_with_landmarks( else: st = target_landmarks.GetPoints() if least_squares: - target_landmarks = target_landmarks.points() + target_landmarks = target_landmarks.vertices if ss.GetNumberOfPoints() != st.GetNumberOfPoints(): n1 = ss.GetNumberOfPoints() @@ -2689,7 +2703,7 @@ def transform_with_landmarks( def normalize(self): """Scale Mesh average size to unit.""" - coords = self.points() + coords = self.vertices if not coords.shape[0]: return self cm = np.mean(coords, axis=0) @@ -2861,7 +2875,7 @@ def add_gaussian_noise(self, sigma=1.0): ``` """ sz = self.diagonal_size() - pts = self.points() + pts = self.vertices n = len(pts) ns = (np.random.randn(n, 3) * sigma) * (sz / 100) vpts = vtk.vtkPoints() @@ -3016,8 +3030,8 @@ def chamfer_distance(self, pcloud): self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() - ps1 = self.points() - ps2 = pcloud.points() + ps1 = self.vertices + ps2 = pcloud.vertices ids12 = [] for p in ps1: @@ -3087,7 +3101,7 @@ def smooth_mls_1d(self, f=0.2, radius=None): ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) """ - coords = self.points() + coords = self.vertices ncoords = len(coords) if radius: @@ -3115,7 +3129,7 @@ def smooth_mls_1d(self, f=0.2, radius=None): vdata.SetName("Variances") self.dataset.GetPointData().AddArray(vdata) self.dataset.GetPointData().Modified() - self.points(newline) + self.vertices = newline self.pipeline = utils.OperationNode("smooth_mls_1d", parents=[self]) return self @@ -3138,7 +3152,7 @@ def smooth_mls_2d(self, f=0.2, radius=None): ![](https://vedo.embl.es/images/advanced/recosurface.png) """ - coords = self.points() + coords = self.vertices ncoords = len(coords) if radius: @@ -3175,7 +3189,7 @@ def smooth_mls_2d(self, f=0.2, radius=None): self.info["variances"] = np.array(variances) self.info["is_valid"] = np.array(valid) - self.points(newpts) + self.vertices = newpts self.pipeline = utils.OperationNode("smooth_mls_2d", parents=[self]) return self @@ -3232,7 +3246,7 @@ def _relax(voron): if bounds is None: bounds = self.bounds() - pts = self.points()[:, (0, 1)] + pts = self.vertices[:, (0, 1)] for i in range(iterations): vor = scipy_voronoi(pts, qhull_options=options) _constrain_points(vor.vertices) @@ -3276,7 +3290,7 @@ def project_on_plane(self, plane="z", point=None, direction=None): ![](https://vedo.embl.es/images/basic/silhouette2.png) """ - coords = self.points() + coords = self.vertices if plane == "x": coords[:, 0] = self.transform.position[0] @@ -3322,7 +3336,7 @@ def project_on_plane(self, plane="z", point=None, direction=None): raise RuntimeError() self.alpha(0.1) - self.points(coords) + self.vertices = coords return self def warp(self, source, target, sigma=1.0, mode="3d"): @@ -3351,13 +3365,13 @@ def warp(self, source, target, sigma=1.0, mode="3d"): parents = [self] if isinstance(source, Points): parents.append(source) - source = source.points() + source = source.vertices else: source = utils.make3d(source) if isinstance(target, Points): parents.append(target) - target = target.points() + target = target.vertices else: target = utils.make3d(target) @@ -3546,7 +3560,7 @@ def cut_with_line(self, points, invert=False, closed=True): """ pplane = vtk.vtkPolyPlane() if isinstance(points, Points): - points = points.points().tolist() + points = points.vertices.tolist() if closed: if isinstance(points, np.ndarray): @@ -3855,7 +3869,7 @@ def cut_with_point_loop(self, points, invert=False, on="points", include_boundar if isinstance(points, Points): parents = [points] vpts = points.dataset.GetPoints() - points = points.points() + points = points.vertices else: parents = [self] vpts = vtk.vtkPoints() @@ -3906,7 +3920,7 @@ def cut_with_scalar(self, value, name="", invert=False): ```python from vedo import * s = Sphere().lw(1) - pts = s.points() + pts = s.vertices scalars = np.sin(3*pts[:,2]) + pts[:,0] s.pointdata["somevalues"] = scalars s.cut_with_scalar(0.3) @@ -4059,9 +4073,9 @@ def generate_mesh( ![](https://vedo.embl.es/images/advanced/line2mesh_quads.png) """ if line_resolution is None: - contour = vedo.shapes.Line(self.points()) + contour = vedo.shapes.Line(self.vertices) else: - contour = vedo.shapes.Spline(self.points(), smooth=smooth, res=line_resolution) + contour = vedo.shapes.Spline(self.vertices, smooth=smooth, res=line_resolution) contour.clean() length = contour.length() @@ -4090,7 +4104,7 @@ def generate_mesh( else: grid = grid.clone() - cpts = contour.points() + cpts = contour.vertices # make sure it's closed p0, p1 = cpts[0], cpts[-1] @@ -4110,7 +4124,7 @@ def generate_mesh( return cmesh ############################################# - grid_tmp = grid.points() + grid_tmp = grid.vertices if jitter: np.random.seed(0) @@ -4123,10 +4137,10 @@ def generate_mesh( density /= np.sqrt(3) vgrid_tmp = Points(grid_tmp) - for p in contour.points(): + for p in contour.vertices: out = vgrid_tmp.closest_point(p, radius=density, return_point_id=True) todel += out.tolist() - # cpoints = contour.points() + # cpoints = contour.vertices # for i, p in enumerate(cpoints): # if i: # den = utils.mag(p-cpoints[i-1])/1.732 @@ -4138,7 +4152,7 @@ def generate_mesh( for index in sorted(list(set(todel)), reverse=True): del grid_tmp[index] - points = contour.points().tolist() + grid_tmp + points = contour.vertices.tolist() + grid_tmp if invert: boundary = reversed(range(contour.npoints)) else: @@ -4471,7 +4485,7 @@ def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=No """ src = vtk.vtkProgrammableSource() - opts = self.points() + opts = self.vertices def _readPoints(): output = src.GetPolyDataOutput() @@ -4703,7 +4717,7 @@ def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, ![](https://vedo.embl.es/images/basic/delaunay2d.png) """ - plist = self.points() + plist = self.vertices ######################################################### if mode == "scipy": @@ -4798,7 +4812,7 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): ![](https://vedo.embl.es/images/advanced/voronoi2.png) """ - pts = self.points() + pts = self.vertices if method == "scipy": from scipy.spatial import Voronoi as scipy_voronoi @@ -4886,7 +4900,7 @@ def visible_points(self, area=(), tol=None, invert=False): show(s, camera=camopts, offscreen=True) m = s.visible_points() - #print('visible pts:', m.points()) # numpy array + #print('visible pts:', m.vertices) # numpy array show(m, new=True, axes=1) # optionally draw result on a new window ``` ![](https://vedo.embl.es/images/feats/visible_points.png) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index c81e4674..bc578bab 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -2572,7 +2572,7 @@ def fit( ![](https://vedo.embl.es/images/pyplot/fitPolynomial1.png) """ if isinstance(points, vedo.pointcloud.Points): - points = points.points() + points = points.vertices points = np.asarray(points) if len(points) == 2: # assume user is passing [x,y] points = np.c_[points[0], points[1]] @@ -2667,8 +2667,8 @@ def fit( el.name = "ErrorLine for sigma=" + str(i) fitl.error_lines = error_lines - l1 = error_lines[0].points().tolist() - cband = l1 + list(reversed(error_lines[1].points().tolist())) + [l1[0]] + l1 = error_lines[0].vertices.tolist() + cband = l1 + list(reversed(error_lines[1].vertices.tolist())) + [l1[0]] fitl.error_band = shapes.Line(cband).triangulate().lw(0).c("k", 0.15) fitl.error_band.name = "PolynomialFitErrorBand" return fitl @@ -2919,7 +2919,7 @@ def _plot_polar( filling = None if fill and lw: faces = [] - coords = [[0, 0, 0]] + lines.points().tolist() + coords = [[0, 0, 0]] + lines.vertices.tolist() for i in range(1, lines.npoints): faces.append([0, i, i + 1]) filling = Mesh([coords, faces]).c(c).alpha(alpha) @@ -2984,7 +2984,7 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha sg = shapes.Sphere(res=res, quads=True) sg.alpha(alpha).c(c).wireframe() - cgpts = sg.points() + cgpts = sg.vertices r, theta, phi = cart2spher(*cgpts.T) newr, inans = [], [] @@ -3011,7 +3011,8 @@ def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha nanpts.append(shapes.Points(redpts, r=4, c="r")) pts = spher2cart(newr, theta, phi).T - ssurf = sg.clone().points(pts) + ssurf = sg.clone() + ssurf.vertices = pts if inans: ssurf.delete_cells_by_point_index(inans) @@ -3055,7 +3056,7 @@ def _histogram_quad_bin(x, y, **kwargs): s = 1 / histo.entries * len(faces) * zscale zvals = gr.pointdata["Scalars"] * s - pts1 = gr.points() + pts1 = gr.vertices pts2 = np.copy(pts1) pts2[:, 2] = zvals + tol newpts = np.vstack([pts1, pts2]) @@ -3339,7 +3340,7 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", sg = shapes.Sphere(res=res, quads=True).shrink(1 - gap) sgfaces = sg.faces() - sgpts = sg.points() + sgpts = sg.vertices cntrs = sg.cell_centers() counts = np.zeros(len(cntrs)) @@ -3358,12 +3359,12 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", x, y, z = spher2cart(1 + cn, t1, p1) sgpts[fs] = np.c_[x, y, z] - sg.points(sgpts) + sg.vertices = sgpts sg.cmap(cmap, acounts, on="cells") vals = sg.celldata["Scalars"] faces = sg.faces() - points = sg.points().tolist() + [[0.0, 0.0, 0.0]] + points = sg.vertices.tolist() + [[0.0, 0.0, 0.0]] lp = len(points) - 1 newfaces = [] newvals = [] @@ -3692,7 +3693,7 @@ def streamplot( probe = shapes.Grid(pos=((n - 1) / 2, (n - 1) / 2, 0), s=(n - 1, n - 1), res=(n - 1, n - 1)) else: if isinstance(probes, vedo.Points): - probes = probes.points() + probes = probes.vertices else: probes = np.array(probes, dtype=float) if len(probes[0]) == 2: diff --git a/vedo/shapes.py b/vedo/shapes.py index 8b512409..01494e83 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -427,7 +427,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): if isinstance(p0, Points): p0 = p0.pos() if isinstance(p0, Points): - p0 = p0.points() + p0 = p0.vertices # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: if len(p0) > 3: @@ -536,7 +536,7 @@ def eval(self, x): """ distance1 = 0.0 length = self.length() - pts = self.points() + pts = self.vertices for i in range(1, len(pts)): p0 = pts[i - 1] p1 = pts[i] @@ -609,7 +609,7 @@ def pattern(self, stipple, repeats=10): def length(self): """Calculate length of the line.""" distance = 0.0 - pts = self.points() + pts = self.vertices for i in range(1, len(pts)): distance += np.linalg.norm(pts[i] - pts[i - 1]) return distance @@ -622,14 +622,14 @@ def tangents(self): ```python from vedo import * shape = load(dataurl+"timecourse1d.npy")[58] - pts = shape.rotate_x(30).points() + pts = shape.rotate_x(30).vertices tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_tangents.png) """ - v = np.gradient(self.points())[0] + v = np.gradient(self.vertices)[0] ds_dt = np.linalg.norm(v, axis=1) tangent = np.array([1 / ds_dt] * 3).transpose() * v return tangent @@ -644,7 +644,7 @@ def curvature(self): from vedo import * from vedo.pyplot import plot shape = load(dataurl+"timecourse1d.npy")[55] - curvs = Line(shape.points()).curvature() + curvs = Line(shape.vertices).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') @@ -652,7 +652,7 @@ def curvature(self): ``` ![](https://vedo.embl.es/images/feats/line_curvature.png) """ - v = np.gradient(self.points())[0] + v = np.gradient(self.vertices)[0] a = np.gradient(v)[0] av = np.cross(a, v) mav = np.linalg.norm(av, axis=1) @@ -740,13 +740,13 @@ def sweep(self, direction=(1, 0, 0), res=1): asurface.SetProperty(prop) asurface.property = prop asurface.lighting("default") - self.points(self.points() + direction) + self.vertices = self.vertices + direction return asurface def reverse(self): """Reverse the points sequence order.""" - pts = np.flip(self.points(), axis=0) - self.points(pts) + pts = np.flip(self.vertices, axis=0) + self.vertices = pts return self @@ -774,7 +774,7 @@ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1 if isinstance(p0, vtk.vtkActor): p0 = p0.GetPosition() if isinstance(p0, Points): - p0 = p0.points() + p0 = p0.vertices # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: if len(p0) > 3: @@ -982,9 +982,9 @@ def __init__( ![](https://user-images.githubusercontent.com/32848391/52503049-ac9cb600-2be4-11e9-86af-72a538af14ef.png) """ if isinstance(start_pts, Points): - start_pts = start_pts.points() + start_pts = start_pts.vertices if isinstance(end_pts, Points): - end_pts = end_pts.points() + end_pts = end_pts.vertices if end_pts is not None: start_pts = np.stack((start_pts, end_pts), axis=1) @@ -1075,7 +1075,7 @@ def __init__(self, points, smooth=0.0, degree=2, closed=False, res=None, easing= from scipy.interpolate import splprep, splev if isinstance(points, Points): - points = points.points() + points = points.vertices points = utils.make3d(points) @@ -1157,7 +1157,7 @@ def __init__(self, points, See also: `Spline` and `CSpline`. """ if isinstance(points, Points): - points = points.points() + points = points.vertices if not res: res = len(points) * 20 @@ -1219,7 +1219,7 @@ def __init__(self, points, closed=False, res=None): """ if isinstance(points, Points): - points = points.points() + points = points.vertices if not res: res = len(points) * 20 @@ -1545,7 +1545,7 @@ def StreamLines( if utils.is_sequence(probe): pts = utils.make3d(probe) else: - pts = probe.clean().points() + pts = probe.clean().vertices src = vtk.vtkProgrammableSource() @@ -1676,7 +1676,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): ![](https://vedo.embl.es/images/basic/tube.png) """ if isinstance(points, vedo.Points): - points = points.points() + points = points.vertices base = np.asarray(points[0], dtype=float) top = np.asarray(points[-1], dtype=float) @@ -1751,7 +1751,7 @@ def ThickTube(pts, r1, r2, res=12, c=None, alpha=1.0): """ def make_cap(t1, t2): - newpoints = t1.points().tolist() + t2.points().tolist() + newpoints = t1.vertices.tolist() + t2.vertices.tolist() newfaces = [] for i in range(n - 1): newfaces.append([i, i + 1, i + n]) @@ -1825,10 +1825,10 @@ def __init__( """ if isinstance(line1, Points): - line1 = line1.points() + line1 = line1.vertices if isinstance(line2, Points): - line2 = line2.points() + line2 = line2.vertices elif line2 is None: ############################################# @@ -2020,7 +2020,7 @@ def tip_point(self, return_index=False): self.tip_index = np.argmax(arrpts[:, 0]) if return_index: return self.tip_index - return self.points()[self.tip_index] + return self.vertices[self.tip_index] class Arrows(Glyph): @@ -2063,9 +2063,9 @@ def __init__( ![](https://user-images.githubusercontent.com/32848391/55897850-a1a0da80-5bc1-11e9-81e0-004c8f396b43.jpg) """ if isinstance(start_pts, Points): - start_pts = start_pts.points() + start_pts = start_pts.vertices if isinstance(end_pts, Points): - end_pts = end_pts.points() + end_pts = end_pts.vertices start_pts = np.asarray(start_pts) if end_pts is None: @@ -2252,9 +2252,9 @@ def __init__( if False only generate the outline """ if isinstance(start_pts, Points): - start_pts = start_pts.points() + start_pts = start_pts.vertices if isinstance(end_pts, Points): - end_pts = end_pts.points() + end_pts = end_pts.vertices start_pts = np.asarray(start_pts, dtype=float) if end_pts is None: @@ -2312,9 +2312,9 @@ def __init__(self, line1, line2, tip_size=1.0, tip_width=1.0): ![](https://vedo.embl.es/images/basic/flatarrow.png) """ if isinstance(line1, Points): - line1 = line1.points() + line1 = line1.vertices if isinstance(line2, Points): - line2 = line2.points() + line2 = line2.vertices sm1, sm2 = np.array(line1[-1], dtype=float), np.array(line2[-1], dtype=float) @@ -2417,7 +2417,7 @@ def __init__(self, lat, lon, r=1.0, res=60, c="red4", alpha=1.0): coords.append([clng / np.pi + 1, clat * 2 / np.pi + 1, 0]) Polygon.__init__(self, nsides=res, c=c, alpha=alpha) - self.points(coords) # warp polygon points to match geo projection + self.vertices = coords # warp polygon points to match geo projection self.name = "Circle" @@ -2633,8 +2633,8 @@ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): for _ in range(subdivisions): self.subdivide(method=1) - pts = utils.versor(self.points()) * r - self.points(pts) + pts = utils.versor(self.vertices) * r + self.vertices = pts self.pos(pos) self.name = "IcoSphere" @@ -2678,7 +2678,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) super().__init__(gf.GetOutput(), c, alpha) self.lw(0.1) - cgpts = self.points() - (0.5, 0.5, 0.5) + cgpts = self.vertices - (0.5, 0.5, 0.5) x, y, z = cgpts.T x = x * (1 + x * x) / 2 @@ -2687,7 +2687,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) _, theta, phi = cart2spher(x, y, z) pts = spher2cart(np.ones_like(phi) * r, theta, phi).T - self.points(pts) + self.vertices = pts else: if utils.is_sequence(res): @@ -2726,7 +2726,7 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): """ if isinstance(centers, Points): - centers = centers.points() + centers = centers.vertices centers = np.asarray(centers, dtype=float) base = centers[0] @@ -3120,7 +3120,7 @@ def clone(self): @property def normal(self): - pts = self.points() + pts = self.vertices AB = pts[1] - pts[0] AC = pts[2] - pts[0] normal = np.cross(AB, AC) @@ -3129,7 +3129,7 @@ def normal(self): @property def center(self): - pts = self.points() + pts = self.vertices return np.mean(pts, axis=0) def contains(self, points): @@ -3138,7 +3138,7 @@ def contains(self, points): `points` is an array of shape (n, 3). """ points = np.array(points, dtype=float) - bounds = self.points() + bounds = self.vertices mask = np.isclose(np.dot(points - self.center, self.normal), 0) diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 19432a72..3c25140c 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -254,7 +254,7 @@ def _repr_html_(self): name = self._data.GetCellData().GetScalars().GetName() cdata = "" - pts = self.points() + pts = self.vertices cm = np.mean(pts, axis=0) allt = [ diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 9ff6da00..f47fd32a 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -219,7 +219,7 @@ def _repr_html_(self): name = self._data.GetCellData().GetScalars().GetName() cdata = "" - pts = self.points() + pts = self.vertices cm = np.mean(pts, axis=0) all = [ diff --git a/vedo/utils.py b/vedo/utils.py index b66dbb37..e2b0658e 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1116,7 +1116,7 @@ def get_uv(p, x, v): pic = Picture(dataurl+"coloured_cube_faces.jpg") cb = Mesh(dataurl+"coloured_cube.obj").lighting("off").texture(pic) - cbpts = cb.points() + cbpts = cb.vertices faces = cb.faces() uv = cb.pointdata["Material"] @@ -2367,7 +2367,7 @@ def vedo2trimesh(mesh): carr = mesh.celldata["CellIndividualColors"] ccols = carr - points = mesh.points() + points = mesh.vertices varr = mesh.pointdata["VertexColors"] vcols = varr @@ -2439,7 +2439,7 @@ def vedo2meshlab(vmesh): except ModuleNotFoundError: vedo.logger.error("Need pymeshlab to run:\npip install pymeshlab") - vertex_matrix = vmesh.points().astype(np.float64) + vertex_matrix = vmesh.vertices.astype(np.float64) try: face_matrix = np.asarray(vmesh.faces(), dtype=np.float64) @@ -2576,7 +2576,7 @@ def vedo2open3d(vedo_mesh): # create from numpy arrays o3d_mesh = o3d.geometry.TriangleMesh( - vertices=o3d.utility.Vector3dVector(vedo_mesh.points()), + vertices=o3d.utility.Vector3dVector(vedo_mesh.vertices), triangles=o3d.utility.Vector3iVector(vedo_mesh.faces()), ) # TODO: need to add some if check here in case color and normals diff --git a/vedo/version.py b/vedo/version.py index 964bb5a1..9d37a0da 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev4a' +_version = '2023.5.0+dev5a' diff --git a/vedo/volume.py b/vedo/volume.py index 2ff12909..04334271 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -1379,9 +1379,9 @@ def warp(self, source, target, sigma=1, mode="3d", fit=False): fit/adapt the old bounding box to the warped geometry """ if isinstance(source, vedo.Points): - source = source.points() + source = source.vertices if isinstance(target, vedo.Points): - target = target.points() + target = target.vertices ns = len(source) ptsou = vtk.vtkPoints() From 952a77852e575ca681365ba2a8096ace2f5b5fa3 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 19:32:40 +0200 Subject: [PATCH 060/251] change .cell_centers() to .cell_centers everywhere --- examples/advanced/voronoi2.py | 4 ++-- examples/basic/mesh_coloring.py | 2 +- examples/other/remesh_tetgen.py | 2 +- examples/pyplot/isolines.py | 2 +- examples/simulations/optics_main3.py | 2 +- examples/volumetric/tet_explode.py | 2 +- examples/volumetric/tetralize_surface.py | 2 +- vedo/pointcloud.py | 6 +++--- vedo/pyplot.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/advanced/voronoi2.py b/examples/advanced/voronoi2.py index 1a8e65f6..d550c137 100644 --- a/examples/advanced/voronoi2.py +++ b/examples/advanced/voronoi2.py @@ -5,12 +5,12 @@ pts1 = pts0.clone().smooth_lloyd_2d() grid = Grid([14500,61700], s=[22000,24000], res=[30,30]).ps(1) -allpts = pts1.points().tolist() + grid.points().tolist() +allpts = pts1.vertices.tolist() + grid.vertices.tolist() msh = Points(allpts).generate_voronoi(method='scipy') msh.lw(0.1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') -centers = Points(msh.cell_centers(), c='k') +centers = Points(msh.cell_centers, c='k') show(msh, pts0, __doc__, axes=dict(digits=3), zoom=1.3) diff --git a/examples/basic/mesh_coloring.py b/examples/basic/mesh_coloring.py index 697df25c..07051246 100644 --- a/examples/basic/mesh_coloring.py +++ b/examples/basic/mesh_coloring.py @@ -24,7 +24,7 @@ ##################################### Cell coloring man3 = Mesh(dataurl+"man_low.vtk") -scals = man3.cell_centers()[:, 2] + 37 # pick z coordinates of cells +scals = man3.cell_centers[:, 2] + 37 # pick z coordinates of cells man3.cmap("afmhot", scals, on='cells') # add a fancier 3D scalar bar embedded in the scene diff --git a/examples/other/remesh_tetgen.py b/examples/other/remesh_tetgen.py index 1b8575ef..51040202 100644 --- a/examples/other/remesh_tetgen.py +++ b/examples/other/remesh_tetgen.py @@ -25,7 +25,7 @@ # assign to each tetrahedron the id of the closest seed point cids = [] -for p in tmesh.cell_centers(): +for p in tmesh.cell_centers: cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids diff --git a/examples/pyplot/isolines.py b/examples/pyplot/isolines.py index 093136fd..1bbb12e4 100644 --- a/examples/pyplot/isolines.py +++ b/examples/pyplot/isolines.py @@ -17,7 +17,7 @@ printc('Mesh cell arrays :', mesh1.celldata.keys()) gvecs = mesh1.gradient(on='cells') -cc = mesh1.cell_centers() +cc = mesh1.cell_centers ars = Arrows(cc, cc + gvecs*0.01, c='bone_r').lighting('off') ars.add_scalarbar3d(title='|:nablaH|:dot0.01 [arb.units]') diff --git a/examples/simulations/optics_main3.py b/examples/simulations/optics_main3.py index 1796635e..f24f2682 100644 --- a/examples/simulations/optics_main3.py +++ b/examples/simulations/optics_main3.py @@ -5,7 +5,7 @@ from optics_base import Ray, Mirror, Detector # see file ./optics_base.py grid = Grid(res=[3,4]) # pick a few points in space to place cylinders -pts = grid.points().tolist() + grid.cell_centers().tolist() +pts = grid.vertices.tolist() + grid.cell_centers.tolist() # Create the mirror by merging many (y-scaled) cylinders into a single mesh object cyls = [Cylinder(p, r=0.065, height=0.2, res=2000).scale([1,1.5,1]) for p in pts] diff --git a/examples/volumetric/tet_explode.py b/examples/volumetric/tet_explode.py index 84a6b4a6..74c90526 100644 --- a/examples/volumetric/tet_explode.py +++ b/examples/volumetric/tet_explode.py @@ -15,7 +15,7 @@ # assign to each tetrahedron the id of the closest seed point cids = [] -for p in tmesh.cell_centers(): +for p in tmesh.cell_centers: cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids diff --git a/examples/volumetric/tetralize_surface.py b/examples/volumetric/tetralize_surface.py index 394535fe..bae3fb78 100644 --- a/examples/volumetric/tetralize_surface.py +++ b/examples/volumetric/tetralize_surface.py @@ -17,7 +17,7 @@ # Assign an id to each tetrahedron to visualize regions seeds = surf.clone().subsample(0.3) cids = [] -for p in tmesh.cell_centers(): +for p in tmesh.cell_centers: cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragments"] = cids diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3dfb250a..0cda366d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1403,7 +1403,7 @@ def labels2d( ```python from vedo import Sphere, show sph = Sphere(quads=True, res=4).compute_normals().wireframe() - sph.celldata["zvals"] = sph.cell_centers()[:,2] + sph.celldata["zvals"] = sph.cell_centers[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') show(sph, l2d, axes=1).close() ``` @@ -1424,7 +1424,7 @@ def labels2d( if content != "id" and content not in self.celldata.keys(): vedo.logger.error(f"In labels2d: cell array {content} does not exist.") return None - cellcloud = Points(self.cell_centers()) + cellcloud = Points(self.cell_centers) arr = self.dataset.GetCellData().GetScalars() poly = cellcloud poly.GetPointData().SetScalars(arr) @@ -2296,7 +2296,7 @@ def compute_acoplanarity(self, n=25, radius=None, on="points"): if "point" in on: pts = self.vertices elif "cell" in on: - pts = self.cell_centers() + pts = self.cell_centers else: raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") diff --git a/vedo/pyplot.py b/vedo/pyplot.py index bc578bab..fe4bde17 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -3342,7 +3342,7 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", sgfaces = sg.faces() sgpts = sg.vertices - cntrs = sg.cell_centers() + cntrs = sg.cell_centers counts = np.zeros(len(cntrs)) for p in ptsvals: cell = sg.closest_point(p, return_cell_id=True) From 14c3d67bdc6c9315c2ad656bac731534929873f0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 19:37:12 +0200 Subject: [PATCH 061/251] change .faces() to .cells everywhere --- vedo/backends.py | 4 ++-- vedo/file_io.py | 8 ++++---- vedo/mesh.py | 6 +++--- vedo/pointcloud.py | 2 +- vedo/pyplot.py | 6 +++--- vedo/utils.py | 10 +++++----- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/vedo/backends.py b/vedo/backends.py index fc0e6c43..23191791 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -256,7 +256,7 @@ def start_k3d(actors2show): ################################################################## Mesh elif isinstance(ia, Mesh) and ia.npoints and ia.polydata(False).GetNumberOfPolys(): - # print('Mesh', ia.name, ia.npoints, len(ia.faces())) + # print('Mesh', ia.name, ia.npoints, len(ia.cells)) if not vtkscals: color_attribute = None @@ -278,7 +278,7 @@ def start_k3d(actors2show): kobj = k3d.mesh( iacloned.vertices, - iacloned.faces(), + iacloned.cells, colors=cols, name=name, color=_rgb2int(iap.GetColor()), diff --git a/vedo/file_io.py b/vedo/file_io.py index fa2ab736..fbfd2d4d 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -849,9 +849,9 @@ def _fillmesh(obj, adict): adict["cells"] = None if poly.GetNumberOfPolys(): try: - adict["cells"] = np.array(obj.faces(), dtype=np.uint32) + adict["cells"] = np.array(obj.cells, dtype=np.uint32) except ValueError: # in case of inhomogeneous shape - adict["cells"] = obj.faces() + adict["cells"] = obj.cells adict["lines"] = None if poly.GetNumberOfLines(): @@ -1313,7 +1313,7 @@ def write(objct, fileoutput, binary=True): if isinstance(objct, Mesh): - for i, f in enumerate(objct.faces()): + for i, f in enumerate(objct.cells): fs = "" for fi in f: if ptxt: @@ -1332,7 +1332,7 @@ def write(objct, fileoutput, binary=True): elif fr.endswith(".xml"): # write tetrahedral dolfin xml vertices = objct.vertices.astype(str) - faces = np.array(objct.faces()).astype(str) + faces = np.array(objct.cells).astype(str) ncoords = vertices.shape[0] with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write('\n') diff --git a/vedo/mesh.py b/vedo/mesh.py index 174568fd..bce57f7b 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -667,7 +667,7 @@ def texture( uvmap = self.pointdata[tname] # collapse triangles that have large gradient new_points = self.vertices.copy() - for f in self.faces(): + for f in self.cells: if np.isin(f, largegrad_ids).all(): id1, id2, id3 = f uv1, uv2, uv3 = uvmap[f] @@ -830,7 +830,7 @@ def non_manifold_faces(self, remove=True, tol="auto"): return self points = self.vertices - faces = self.faces() + faces = self.cells centers = self.cell_centers copy = self.clone() @@ -1714,7 +1714,7 @@ def boundaries( if return_cell_ids: n = 1 if cell_edge else 0 inface = [] - for i, face in enumerate(self.faces()): + for i, face in enumerate(self.cells): # isin = np.any([vtx in npid for vtx in face]) isin = 0 for vtx in face: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 0cda366d..0872c104 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -3251,7 +3251,7 @@ def _relax(voron): vor = scipy_voronoi(pts, qhull_options=options) _constrain_points(vor.vertices) pts = _relax(vor) - # m = vedo.Mesh([pts, self.faces()]) # not yet working properly + # m = vedo.Mesh([pts, self.cells]) # not yet working properly out = Points(pts, c="k") out.pipeline = utils.OperationNode("smooth_lloyd", parents=[self]) return out diff --git a/vedo/pyplot.py b/vedo/pyplot.py index fe4bde17..cf3f8e65 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -3052,7 +3052,7 @@ def _histogram_quad_bin(x, y, **kwargs): gr.shrink(1 - gap - tol) gr.map_cells_to_points() - faces = np.array(gr.faces()) + faces = np.array(gr.cells) s = 1 / histo.entries * len(faces) * zscale zvals = gr.pointdata["Scalars"] * s @@ -3339,7 +3339,7 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", ptsvals = np.c_[x, y, z] sg = shapes.Sphere(res=res, quads=True).shrink(1 - gap) - sgfaces = sg.faces() + sgfaces = sg.cells sgpts = sg.vertices cntrs = sg.cell_centers @@ -3363,7 +3363,7 @@ def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", sg.cmap(cmap, acounts, on="cells") vals = sg.celldata["Scalars"] - faces = sg.faces() + faces = sg.cells points = sg.vertices.tolist() + [[0.0, 0.0, 0.0]] lp = len(points) - 1 newfaces = [] diff --git a/vedo/utils.py b/vedo/utils.py index e2b0658e..b676e615 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1117,7 +1117,7 @@ def get_uv(p, x, v): cb = Mesh(dataurl+"coloured_cube.obj").lighting("off").texture(pic) cbpts = cb.vertices - faces = cb.faces() + faces = cb.cells uv = cb.pointdata["Material"] pt = [-0.2, 0.75, 2] @@ -2363,7 +2363,7 @@ def vedo2trimesh(mesh): from trimesh import Trimesh - tris = mesh.faces() + tris = mesh.cells carr = mesh.celldata["CellIndividualColors"] ccols = carr @@ -2442,10 +2442,10 @@ def vedo2meshlab(vmesh): vertex_matrix = vmesh.vertices.astype(np.float64) try: - face_matrix = np.asarray(vmesh.faces(), dtype=np.float64) + face_matrix = np.asarray(vmesh.cells, dtype=np.float64) except: print("WARNING: in vedo2meshlab(), need to triangulate mesh first!") - face_matrix = np.array(vmesh.clone().triangulate().faces(), dtype=np.float64) + face_matrix = np.array(vmesh.clone().triangulate().cells, dtype=np.float64) v_normals_matrix = vmesh.normals(cells=False, recompute=False) if not v_normals_matrix.shape[0]: @@ -2577,7 +2577,7 @@ def vedo2open3d(vedo_mesh): # create from numpy arrays o3d_mesh = o3d.geometry.TriangleMesh( vertices=o3d.utility.Vector3dVector(vedo_mesh.vertices), - triangles=o3d.utility.Vector3iVector(vedo_mesh.faces()), + triangles=o3d.utility.Vector3iVector(vedo_mesh.cells), ) # TODO: need to add some if check here in case color and normals # info are not existing From 6a0ff0031e91054c82a636c8863f2948325c6ebe Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 19:42:05 +0200 Subject: [PATCH 062/251] change .faces() to .cells everywhere 2 --- examples/other/morphomatics_tube.py | 6 +++--- examples/other/napari1.py | 2 +- examples/other/pygeodesic1.py | 2 +- examples/other/remesh_meshfix.py | 4 ++-- examples/other/remesh_tetgen.py | 4 ++-- examples/other/vpolyscope.py | 2 +- examples/simulations/optics_base.py | 4 ++-- vedo/mesh.py | 1 + 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/examples/other/morphomatics_tube.py b/examples/other/morphomatics_tube.py index 2301ad08..5ee7de89 100644 --- a/examples/other/morphomatics_tube.py +++ b/examples/other/morphomatics_tube.py @@ -17,9 +17,9 @@ vmesh1 = vedo.Tube(ln1, r=0.08).triangulate().clean() vmesh2 = vedo.Tube(ln2, r=rads).triangulate().clean() -verts1 = vmesh1.points() -verts2 = vmesh2.points() -faces = np.array(vmesh1.faces()) +verts1 = vmesh1.vertices +verts2 = vmesh2.vertices +faces = np.array(vmesh1.cells) # construct model SSM = StatisticalShapeModel(lambda ref: FundamentalCoords(ref)) diff --git a/examples/other/napari1.py b/examples/other/napari1.py index e551bac7..09cb1106 100644 --- a/examples/other/napari1.py +++ b/examples/other/napari1.py @@ -7,7 +7,7 @@ surf.rotate_x(180).rotate_y(60) vertices = surf.points() -faces = np.array(surf.faces()) +faces = np.array(surf.cells) normals = surf.normals() # generate vertex values by projecting normals on a "lighting vector" values = np.dot(normals, [-1, 1, 1]) diff --git a/examples/other/pygeodesic1.py b/examples/other/pygeodesic1.py index a02f9a37..7f84bffa 100644 --- a/examples/other/pygeodesic1.py +++ b/examples/other/pygeodesic1.py @@ -4,7 +4,7 @@ m = vedo.Mesh(vedo.dataurl+"bunny.obj").c("green9") -geoalg = geodesic.PyGeodesicAlgorithmExact(m.points(), m.faces()) +geoalg = geodesic.PyGeodesicAlgorithmExact(m.points(), m.cells) # Use source and target point ids distance, path = geoalg.geodesicDistance(639, 834) diff --git a/examples/other/remesh_meshfix.py b/examples/other/remesh_meshfix.py index 176374ad..43734849 100644 --- a/examples/other/remesh_meshfix.py +++ b/examples/other/remesh_meshfix.py @@ -17,12 +17,12 @@ amesh = vedo.Mesh(vedo.dataurl+'290.vtk') # repairing also closes the mesh in a nice way -meshfix = pymeshfix.MeshFix(amesh.points(), amesh.faces()) +meshfix = pymeshfix.MeshFix(amesh.vertices, amesh.cells) meshfix.repair() repaired = vedo.Mesh(meshfix.mesh).linewidth(1).alpha(0.5) # tetralize the closed surface -tet = tetgen.TetGen(repaired.points(), repaired.faces()) +tet = tetgen.TetGen(repaired.vertices, repaired.cells) tet.tetrahedralize(order=1, mindihedral=20, minratio=1.5) tmesh = vedo.TetMesh(tet.grid) diff --git a/examples/other/remesh_tetgen.py b/examples/other/remesh_tetgen.py index 51040202..b2dcba6a 100644 --- a/examples/other/remesh_tetgen.py +++ b/examples/other/remesh_tetgen.py @@ -10,10 +10,10 @@ # repair and tetralize the closed surface amesh = Mesh(dataurl + "bunny.obj") -meshfix = pymeshfix.MeshFix(amesh.points(), amesh.faces()) +meshfix = pymeshfix.MeshFix(amesh.vertices, amesh.cells) meshfix.repair() # will make it manifold repaired = Mesh(meshfix.mesh) -tet = tetgen.TetGen(repaired.points(), repaired.faces()) +tet = tetgen.TetGen(repaired.vertices, repaired.cells) tet.tetrahedralize(order=1, mindihedral=50, minratio=1.5) tmesh = TetMesh(tet.grid) diff --git a/examples/other/vpolyscope.py b/examples/other/vpolyscope.py index 11ab5161..02c01d21 100644 --- a/examples/other/vpolyscope.py +++ b/examples/other/vpolyscope.py @@ -12,7 +12,7 @@ polyscope.set_up_dir("z_up") polyscope.init() ps_mesh = polyscope.register_surface_mesh( - "My vedo mesh", m.points(), m.faces(), color=[0.5, 0, 0], smooth_shade=True + "My vedo mesh", m.vertices, m.cells, color=[0.5, 0, 0], smooth_shade=True ) ps_mesh.add_scalar_quantity("heights", m.points()[:, 2], defined_on="vertices") ps_mesh.set_material("wax") # wax, mud, jade, candy diff --git a/examples/simulations/optics_base.py b/examples/simulations/optics_base.py index df869bad..2b6a0111 100644 --- a/examples/simulations/optics_base.py +++ b/examples/simulations/optics_base.py @@ -183,8 +183,8 @@ def _reflectance(self, r12, theta_i, theta_t, inout): return (a*a + b*b)/2 # def intersect(self, element, p0,p1): # not working (but no need to) - # points = element.points() - # faces = element.faces() + # points = element.vertices + # faces = element.cells # cids = [] # for i,f in enumerate(faces): # v0,v1,v2 = points[f] diff --git a/vedo/mesh.py b/vedo/mesh.py index bce57f7b..770c56b8 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -378,6 +378,7 @@ def faces(self, ids=()): If ids is set, return only the faces of the given cells. """ + print("WARNING: use property mesh.cells instead of mesh.faces()") arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) # Get cell connettivity ids as a 1D array. vtk format is: From 586d9c047a253c00ce838e347bb25002ec9efc43 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 19:45:59 +0200 Subject: [PATCH 063/251] change .lines() to .lines everywhere --- docs/changes.md | 5 +++++ vedo/backends.py | 2 +- vedo/file_io.py | 4 ++-- vedo/mesh.py | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index ab21e74f..eee8c88a 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -18,6 +18,11 @@ - in `plotter.add_button(func)`, must use `func(event)` instead of `func()` (thanks to @smoothumut for spotting the bug) - change .points() to .vertices everywhere +- change .cell_centers() to .cell_centers everywhere +- change .faces() to .cells everywhere +- change .lines() to .lines everywhere + + ------------------------- ## New/Revised Examples diff --git a/vedo/backends.py b/vedo/backends.py index 23191791..e0f9f94a 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -234,7 +234,7 @@ def start_k3d(actors2show): and ia.polydata(False).GetNumberOfLines() and ia.polydata(False).GetNumberOfPolys() == 0): - for i, ln_idx in enumerate(ia.lines()): + for i, ln_idx in enumerate(ia.lines): if i > 200: vedo.logger.warning("in k3d, nr. of lines is limited to 200.") diff --git a/vedo/file_io.py b/vedo/file_io.py index fbfd2d4d..986bd565 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -855,7 +855,7 @@ def _fillmesh(obj, adict): adict["lines"] = None if poly.GetNumberOfLines(): - adict["lines"] = obj.lines() + adict["lines"] = obj.lines adict["pointdata"] = [] for iname in obj.pointdata.keys(): @@ -1322,7 +1322,7 @@ def write(objct, fileoutput, binary=True): fs += f" {fi+1}" outF.write(f"f{fs}\n") - for l in objct.lines(): + for l in objct.lines: ls = "" for li in l: ls += str(li + 1) + " " diff --git a/vedo/mesh.py b/vedo/mesh.py index 770c56b8..0fe7d274 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1107,7 +1107,7 @@ def join_segments(self, closed=True, tol=1e-03): if len(pts) < 3: continue avesize = outline.average_size() - lines = outline.lines() + lines = outline.lines # print("---lines", lines, "in piece", ipiece) tol = avesize / pts.shape[0] * tol @@ -2311,7 +2311,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): from vedo import * sph = Sphere() mi = sph.clone().intersect_with_plane().join() - print(mi.lines()) + print(mi.lines) show(sph, mi, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/intersect_plane.png) From de9bf7cb3f223d98f4874d4517fbd196416c391d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 20:19:16 +0200 Subject: [PATCH 064/251] change .normals() to .vertex_normals and .cell_normals everywhere --- docs/changes.md | 9 +++- examples/advanced/capping_mesh.py | 8 ++-- examples/advanced/convex_hull.py | 2 +- examples/advanced/cut_with_points1.py | 2 +- examples/advanced/fitplanes.py | 2 +- examples/advanced/fitspheres1.py | 2 +- examples/advanced/fitspheres2.py | 11 ++--- examples/advanced/geological_model.py | 2 +- examples/advanced/interpolate_field.py | 6 +-- examples/advanced/interpolate_scalar1.py | 2 +- examples/advanced/interpolate_scalar2.py | 2 +- examples/advanced/interpolate_scalar4.py | 2 +- examples/advanced/interpolate_scalar5.py | 4 +- examples/advanced/measure_curvature.py | 2 +- examples/advanced/moving_least_squares2D.py | 6 +-- examples/advanced/warp1.py | 2 +- examples/advanced/warp2.py | 2 +- examples/advanced/warp3.py | 6 +-- examples/advanced/warp5.py | 8 ++-- examples/advanced/warp6.py | 6 +-- examples/other/napari1.py | 6 +-- vedo/mesh.py | 4 +- vedo/pointcloud.py | 51 ++++++++------------- vedo/utils.py | 6 ++- 24 files changed, 71 insertions(+), 82 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index eee8c88a..5f74aa45 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -21,6 +21,8 @@ - change .cell_centers() to .cell_centers everywhere - change .faces() to .cells everywhere - change .lines() to .lines everywhere +- change .edges() to .edges everywhere +- change .normals() to .vertex_normals and .cell_normals everywhere @@ -51,8 +53,13 @@ ssao.py ~/Projects/vedo/examples/advanced +cut_with_mesh1.py +fitspheres2.py +gyroid.py interpolate_scalar3.py -recosurface.py +mesh_smoother1.py +splitmesh.py + spline_draw.py timer_callback2.py warp4.py diff --git a/examples/advanced/capping_mesh.py b/examples/advanced/capping_mesh.py index bd54c083..53df421a 100644 --- a/examples/advanced/capping_mesh.py +++ b/examples/advanced/capping_mesh.py @@ -6,7 +6,7 @@ def capping(amsh, bias=0, invert=False, res=50): bn = amsh.boundaries().join(reset=True) pln = fit_plane(bn) - cp = [pln.closest_point(p) for p in bn.points()] + cp = [pln.closest_point(p) for p in bn.vertices] pts = Points(cp) pts.top = pln.normal @@ -17,8 +17,8 @@ def capping(amsh, bias=0, invert=False, res=50): pts2 = pts.clone().reorient([0,0,1]).project_on_plane('z') msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res) - source = pts2.points().tolist() - target = bn.points().tolist() + source = pts2.vertices.tolist() + target = bn.vertices.tolist() printc(f"..warping {len(source)} points") msh3 = msh2.clone().warp(source, target, mode='3d') @@ -28,7 +28,7 @@ def capping(amsh, bias=0, invert=False, res=50): if bias: newpts = [] - for p in msh3.points(): + for p in msh3.vertices: q = bn.closest_point(p) d = mag(p-q) newpt = p + d * pln.normal * bias diff --git a/examples/advanced/convex_hull.py b/examples/advanced/convex_hull.py index 2c186be0..4c1991b5 100644 --- a/examples/advanced/convex_hull.py +++ b/examples/advanced/convex_hull.py @@ -6,6 +6,6 @@ spid = Mesh(dataurl+"spider.ply").c("brown") -ch = ConvexHull(spid.points()).alpha(0.2) +ch = ConvexHull(spid.vertices).alpha(0.2) show(spid, ch, __doc__, axes=1).close() diff --git a/examples/advanced/cut_with_points1.py b/examples/advanced/cut_with_points1.py index 7dc7b3a7..7456eae1 100644 --- a/examples/advanced/cut_with_points1.py +++ b/examples/advanced/cut_with_points1.py @@ -7,7 +7,7 @@ s = Sphere().alpha(0.2).lw(0.1) # pick a few points on the sphere -sc = s.points() +sc = s.vertices pts = Points([sc[10], sc[15], sc[129], sc[165]], r=12) #cut loop region identified by the points diff --git a/examples/advanced/fitplanes.py b/examples/advanced/fitplanes.py index f9991f1c..1c7425b9 100644 --- a/examples/advanced/fitplanes.py +++ b/examples/advanced/fitplanes.py @@ -9,7 +9,7 @@ plt += apple.alpha(0.1) variances = [] -for i, p in enumerate(apple.points()): +for i, p in enumerate(apple.vertices): pts = apple.closest_point(p, n=12) # find the N closest points to p plane = fit_plane(pts) # find the fitting plane variances.append(plane.variance) diff --git a/examples/advanced/fitspheres1.py b/examples/advanced/fitspheres1.py index 9e427161..417a5f53 100644 --- a/examples/advanced/fitspheres1.py +++ b/examples/advanced/fitspheres1.py @@ -13,7 +13,7 @@ # load mesh and increase by a lot subdivide(2) the nr of surface vertices cow = Mesh(dataurl+"cow.vtk").alpha(0.3).subdivide(2) -for i, p in enumerate(cow.points()): +for i, p in enumerate(cow.vertices): if i % 1000: continue # skip most points pts = cow.closest_point(p, n=16) # find the n-closest points to p diff --git a/examples/advanced/fitspheres2.py b/examples/advanced/fitspheres2.py index 2b49cd67..0207cafc 100644 --- a/examples/advanced/fitspheres2.py +++ b/examples/advanced/fitspheres2.py @@ -7,9 +7,9 @@ msh = Mesh(dataurl+"cow.vtk").c("cyan7") -pts1, pts2, vals, cols = [], [], [], [] +pts1, pts2, vals = [], [], [] -msh_points = msh.points() +msh_points = msh.vertices for i in range(0, msh.npoints, 10): p = msh_points[i] pts = msh.closest_point(p, n=12) # find the n-closest points to p @@ -18,17 +18,12 @@ continue value = sph.radius * 10 - color = color_map(value, "jet", 0, 1) # map value to a RGB color n = versor(p - sph.center) # unit vector from sphere center to p vals.append(value) - cols.append(color) pts1.append(p) pts2.append(p + n / 8) -plt += msh -plt += Points(pts1, c=cols) -plt += Lines(pts1, pts2, c="black") +plt += msh, Points(pts1), Lines(pts1, pts2, c="black") plt += histogram(vals, xtitle='radius', xlim=[0,2]).as2d(pos="bottom-left") plt += __doc__ - plt.show().close() diff --git a/examples/advanced/geological_model.py b/examples/advanced/geological_model.py index 5ffeef87..3dc5714e 100644 --- a/examples/advanced/geological_model.py +++ b/examples/advanced/geological_model.py @@ -40,7 +40,7 @@ landSurface = generate_delaunay2d(landSurfacePD.values) # in order to color it by the elevation, we use the z values of the mesh -zvals = landSurface.points()[:, 2] +zvals = landSurface.vertices[:, 2] landSurface.cmap("terrain", zvals, vmin=1100) landSurface.name = "Land Surface" # give the object a name diff --git a/examples/advanced/interpolate_field.py b/examples/advanced/interpolate_field.py index 92a51d11..2bf8614d 100644 --- a/examples/advanced/interpolate_field.py +++ b/examples/advanced/interpolate_field.py @@ -15,7 +15,7 @@ apos = Points(positions, r=2) -# for p in apos.points(): ####### Uncomment to fix some points. +# for p in apos.vertices: ####### Uncomment to fix some points. # if abs(p[2]-5) > 4.999: # differences btw RBF and thinplate # sources.append(p) # will become much smaller. # deltas.append(np.zeros(3)) @@ -29,7 +29,7 @@ ################################################# warp using Thin Plate Splines warped = apos.clone().warp(sources, sources+deltas) warped.alpha(0.4).color("lg").point_size(10) -allarr = Arrows(apos.points(), warped.points()).color("k8") +allarr = Arrows(apos.vertices, warped.vertices).color("k8") set1 = [apos, warped, src, trs, arr, __doc__] plt1 = show([set1, allarr], N=2, bg='bb', interactive=0) # returns the Plotter class @@ -49,7 +49,7 @@ positions_rbf = np.vstack([positions_x, positions_y, positions_z]) warped_rbf = Points(positions_rbf, r=2).alpha(0.4).color("lg").point_size(10) -allarr_rbf = Arrows(apos.points(), warped_rbf.points()).color("k8") +allarr_rbf = Arrows(apos.vertices, warped_rbf.vertices).color("k8") arr = Arrows(sources, sources + deltas).color("k8") diff --git a/examples/advanced/interpolate_scalar1.py b/examples/advanced/interpolate_scalar1.py index 33942bb8..2cdd13df 100644 --- a/examples/advanced/interpolate_scalar1.py +++ b/examples/advanced/interpolate_scalar1.py @@ -7,7 +7,7 @@ # pick 100 points where we assume that some scalar value is known # (can be ANY points, not necessarily taken from the mesh) -pts2 = mesh.points()[:100] +pts2 = mesh.vertices[:100] # assume the value is random scalars = np.random.randint(45,123, 100) # create a set of points with this scalar values diff --git a/examples/advanced/interpolate_scalar2.py b/examples/advanced/interpolate_scalar2.py index c11ebc7e..ce0dbf2e 100644 --- a/examples/advanced/interpolate_scalar2.py +++ b/examples/advanced/interpolate_scalar2.py @@ -8,7 +8,7 @@ from scipy.interpolate import Rbf, NearestNDInterpolator as Near mesh = Mesh(dataurl+"bunny.obj").normalize() -pts = mesh.points() +pts = mesh.vertices # pick a subset of 100 points where a scalar descriptor is known ptsubset = pts[:100] diff --git a/examples/advanced/interpolate_scalar4.py b/examples/advanced/interpolate_scalar4.py index 86168cd1..ce24ac56 100644 --- a/examples/advanced/interpolate_scalar4.py +++ b/examples/advanced/interpolate_scalar4.py @@ -3,7 +3,7 @@ # Make up some quad mesh with associated scalars g1 = Grid(res=(25,25)).wireframe(0).lw(1) -scalars = g1.points()[:,1] +scalars = g1.vertices[:,1] g1.cmap("viridis", scalars, vmin=-1, vmax=1, name='gene') g1.map_points_to_cells() # move the array to cells (faces) g1.add_scalarbar(horizontal=1, pos=(0.7,0.04)) diff --git a/examples/advanced/interpolate_scalar5.py b/examples/advanced/interpolate_scalar5.py index 9d9a9189..2f79d1a6 100644 --- a/examples/advanced/interpolate_scalar5.py +++ b/examples/advanced/interpolate_scalar5.py @@ -15,7 +15,7 @@ def harmonic_shepard(pts, vals, radius): # Pick n random points on the surface ids = np.random.randint(0, surf.npoints, 10) -pts = surf.points(ids) +pts = surf.vertices[ids] # Create a set of random scalars scals1 = np.random.randn(10) * 0.1 @@ -32,7 +32,7 @@ def harmonic_shepard(pts, vals, radius): # Warp the surface to match the interpolated points ptsource, pttarget = [], [] -for pt in pts2.points(): +for pt in pts2.vertices: pt_surf = surf.closest_point(pt) ptsource.append(pt_surf) pttarget.append(pt) diff --git a/examples/advanced/measure_curvature.py b/examples/advanced/measure_curvature.py index 07a516f0..bae92a2c 100644 --- a/examples/advanced/measure_curvature.py +++ b/examples/advanced/measure_curvature.py @@ -26,7 +26,7 @@ # iterate over surface points and fit sphere for idx in range(msh2.npoints): - patch = msh2.closest_point(msh2.points()[idx], radius=radius) + patch = msh2.closest_point(msh2.vertices[idx], radius=radius) s = fit_sphere(patch) curvature[idx] = 1/(s.radius)**2 residues[idx] = s.residue diff --git a/examples/advanced/moving_least_squares2D.py b/examples/advanced/moving_least_squares2D.py index 4bbf029a..24fb55b3 100644 --- a/examples/advanced/moving_least_squares2D.py +++ b/examples/advanced/moving_least_squares2D.py @@ -9,7 +9,7 @@ mesh = Mesh(dataurl+"bunny.obj").normalize().subdivide() -pts = mesh.points() +pts = mesh.vertices pts += np.random.randn(len(pts), 3)/20 # add noise, will not mess up the original points @@ -36,8 +36,8 @@ print("min and max of variances:", vmin, vmax) vcols = [color_map(v, "jet", vmin, vmax) for v in variances] # scalars->colors -sp0 = Spheres(mls2.points(), c=vcols, r=0.02) # error as color -sp1 = Spheres(mls2.points(), c="red", r=variances/4) # error as point size +sp0 = Spheres(mls2.vertices, c=vcols, r=0.02) # error as color +sp1 = Spheres(mls2.vertices, c="red", r=variances/4) # error as point size mesh.color("k").alpha(0.05).wireframe() diff --git a/examples/advanced/warp1.py b/examples/advanced/warp1.py index ba93cc4b..2682a4c5 100644 --- a/examples/advanced/warp1.py +++ b/examples/advanced/warp1.py @@ -10,7 +10,7 @@ surf = Grid([0,0,0], res=[25,25]) ids = np.random.randint(0, surf.npoints, 10) # pick 10 indices -pts = surf.points()[ids] +pts = surf.vertices[ids] ptsource, pttarget = [], [] for pt in pts: diff --git a/examples/advanced/warp2.py b/examples/advanced/warp2.py index cd2562d4..3fe5f26f 100644 --- a/examples/advanced/warp2.py +++ b/examples/advanced/warp2.py @@ -11,7 +11,7 @@ sources = [[0.9, 0.0, 0.2]] # this point moves targets = [[1.2, 0.0, 0.4]] # ...to this. -for pt in meshdec.points(): +for pt in meshdec.vertices: if pt[0] < 0.3: # these pts don't move sources.append(pt) # (e.i. source = target) targets.append(pt) diff --git a/examples/advanced/warp3.py b/examples/advanced/warp3.py index 22cbdb37..fac4e358 100644 --- a/examples/advanced/warp3.py +++ b/examples/advanced/warp3.py @@ -32,7 +32,7 @@ def _func(self, pars): self.morphed_source = self.source.clone().warp( self.ptsource, self.ptsource + shift, sigma=self.sigma, mode="2d" ) - d = self.morphed_source.points() - self.target.points() + d = self.morphed_source.vertices - self.target.vertices chi2 = np.sum(np.multiply(d, d)) # /len(d) if chi2 < self.chi2: printc("new minimum ->", chi2) @@ -44,8 +44,8 @@ def morph(self): print("\n..minimizing with " + self.method) self.morphed_source = self.source.clone() - self.ptsource = self.source.points()[: self.npts] # pick the first npts points - self.pttarget = self.target.points()[: self.npts] + self.ptsource = self.source.vertices[: self.npts] # pick the first npts points + self.pttarget = self.target.vertices[: self.npts] delta = self.pttarget - self.ptsource x0 = delta[:, (0, 1)].T.ravel() # initial guess, a flat list of x and y shifts diff --git a/examples/advanced/warp5.py b/examples/advanced/warp5.py index 03ad23bd..db995ee8 100644 --- a/examples/advanced/warp5.py +++ b/examples/advanced/warp5.py @@ -48,7 +48,7 @@ def _func(self, pars): #calculate chi2 d2sum, n = 0.0, self.source.npoints - srcpts = self.source.points() + srcpts = self.source.vertices rng = range(0, n, int(n / self.subsample)) for i in rng: p1 = srcpts[i] @@ -77,7 +77,7 @@ def avesize(pts): # helper fnc print("\n..minimizing with " + self.method) self.msource = self.source.clone() - self.s_size = avesize(self.source.points()) + self.s_size = avesize(self.source.vertices) bnds = [(-self.bound, self.bound)] * 18 x0 = [0.0] * 18 # initial guess x0 += [1.0] # the optional scale @@ -101,13 +101,13 @@ def draw_shapes(self): sphere0 = Sphere(pos, c="gray", r=sz, res=10, quads=True).wireframe() newpts = [] - for p in self.msource.points(): + for p in self.msource.vertices: newp = self.transform(p) newpts.append(newp) self.msource.points(newpts) arrs = [] - for p in sphere0.points(): + for p in sphere0.vertices: newp = self.transform(p) arrs.append([p, newp]) hair = Arrows(arrs, s=0.3, c='jet') diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index a1d1e5b3..65bc9bbe 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -12,7 +12,7 @@ def on_keypress(event): txt.orientation(n).pos(pt) - tpts = txt.clone().subsample(0.05).points() + tpts = txt.clone().subsample(0.05).vertices kpts = [mesh.closest_point(tp) for tp in tpts] warped = txt.clone().warp(tpts, kpts, sigma=0.01, mode="2d") warped.c("purple5") @@ -25,8 +25,8 @@ def on_keypress(event): mesh = ParametricShape("RandomHills").scale([1,1,0.5]) mesh.c("gray5").alpha(0.25) -points = mesh.points() -normals = mesh.normals() +points = mesh.vertices +normals = mesh.vertex_normals plt = Plotter() plt.add_callback("key press", on_keypress) diff --git a/examples/other/napari1.py b/examples/other/napari1.py index 09cb1106..68b6f6ab 100644 --- a/examples/other/napari1.py +++ b/examples/other/napari1.py @@ -6,9 +6,9 @@ surf = vedo.Mesh(vedo.dataurl+"beethoven.ply").triangulate().compute_normals() surf.rotate_x(180).rotate_y(60) -vertices = surf.points() -faces = np.array(surf.cells) -normals = surf.normals() +vertices = surf.vertices +faces = surf.cells +normals = surf.vertex_normals # generate vertex values by projecting normals on a "lighting vector" values = np.dot(normals, [-1, 1, 1]) diff --git a/vedo/mesh.py b/vedo/mesh.py index 0fe7d274..efcff82c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -837,7 +837,7 @@ def non_manifold_faces(self, remove=True, tol="auto"): copy = self.clone() copy.delete_cells(toremove).clean() copy.compute_normals(cells=False) - normals = copy.normals() + normals = copy.vertex_normals deltas, deltas_i = [], [] for i in vedo.utils.progressbar(toremove, delay=3, title="recover faces"): @@ -1484,7 +1484,7 @@ def collapse_edges(self, distance, iterations=1): vedo.logger.error(f"distance parameter is too large, should be < {fs}, skip!") return self for _ in range(iterations): - medges = self.edges() + medges = self.edges pts = self.vertices newpts = np.array(pts) moved = [] diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 0872c104..aae2ac7f 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1237,11 +1237,13 @@ def labels( if cells: elems = self.cell_centers - norms = self.normals(cells=True, recompute=False) + # norms = self.normals(cells=True, recompute=False) + norms = self.cell_normals ns = np.sqrt(self.ncells) else: elems = self.vertices - norms = self.normals(cells=False, recompute=False) + # norms = self.normals(cells=False, recompute=False) + norms = self.vertex_normals ns = np.sqrt(self.npoints) hasnorms = False @@ -2540,39 +2542,22 @@ def center_of_mass(self): c = cmf.GetCenter() return np.array(c) - def normal_at(self, i): - """Return the normal vector at vertex point `i`.""" - normals = self.dataset.GetPointData().GetNormals() - return np.array(normals.GetTuple(i)) - - def normals(self, cells=False, recompute=True): - """Retrieve vertex normals as a numpy array. - - Arguments: - cells : (bool) - if `True` return cell normals. - - recompute : (bool) - if `True` normals are recalculated if not already present. - Note that this might modify the number of mesh points. + @property + def vertex_normals(self): """ - if cells: - vtknormals = self.dataset.GetCellData().GetNormals() - else: - vtknormals = self.dataset.GetPointData().GetNormals() - if not vtknormals and recompute: - try: - self.compute_normals(cells=cells) - if cells: - vtknormals = self.dataset.GetCellData().GetNormals() - else: - vtknormals = self.dataset.GetPointData().GetNormals() - except AttributeError: - # can be that 'Points' object has no attribute 'compute_normals' - pass + Retrieve vertex normals as a numpy array. + Check out also `compute_normals()` and `compute_normals_with_pca()`. + """ + vtknormals = self.dataset.GetPointData().GetNormals() + return utils.vtk2numpy(vtknormals) - if not vtknormals: - return np.array([]) + @property + def cell_normals(self): + """ + Retrieve vertex normals as a numpy array. + Check out also `compute_normals(cells=True)` and `compute_normals_with_pca()`. + """ + vtknormals = self.dataset.GetCellData().GetNormals() return utils.vtk2numpy(vtknormals) def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False): diff --git a/vedo/utils.py b/vedo/utils.py index b676e615..cca7f219 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -2447,11 +2447,13 @@ def vedo2meshlab(vmesh): print("WARNING: in vedo2meshlab(), need to triangulate mesh first!") face_matrix = np.array(vmesh.clone().triangulate().cells, dtype=np.float64) - v_normals_matrix = vmesh.normals(cells=False, recompute=False) + # v_normals_matrix = vmesh.normals(cells=False, recompute=False) + v_normals_matrix = vmesh.vertex_normals if not v_normals_matrix.shape[0]: v_normals_matrix = np.empty((0, 3), dtype=np.float64) - f_normals_matrix = vmesh.normals(cells=True, recompute=False) + # f_normals_matrix = vmesh.normals(cells=True, recompute=False) + f_normals_matrix = vmesh.cell_normals if not f_normals_matrix.shape[0]: f_normals_matrix = np.empty((0, 3), dtype=np.float64) From 6447dde020059ae0b03530db5866182f5e4855ec Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 12 Oct 2023 21:25:20 +0200 Subject: [PATCH 065/251] various fixes to examples --- docs/changes.md | 24 +++++++++++++++- examples/advanced/warp4.py | 2 +- examples/basic/closewindow.py | 4 +-- examples/basic/mesh_merge_vs_assembly.py | 2 +- examples/basic/mousehover1.py | 2 +- examples/basic/mousehover3.py | 2 +- examples/other/ellipt_fourier_desc.py | 2 +- examples/other/export_x3d.py | 2 +- examples/other/flag_labels2.py | 2 +- examples/other/pygeodesic1.py | 2 +- examples/other/pymeshlab2.py | 2 +- examples/other/qt_window1.py | 2 +- examples/other/qt_window3.py | 2 +- examples/other/remesh_ACVD.py | 2 +- examples/other/tensor_grid2.py | 13 +++++---- examples/other/vpolyscope.py | 2 +- examples/other/wx_window2.py | 7 +++-- examples/pyplot/anim_lines.py | 2 +- examples/pyplot/fit_circle.py | 2 +- examples/pyplot/graph_network.py | 2 +- examples/pyplot/histo_pca.py | 2 +- examples/pyplot/histo_polar.py | 2 +- examples/pyplot/lines_intersect.py | 2 +- examples/pyplot/markpoint.py | 7 +++-- examples/pyplot/quiver.py | 4 +-- examples/simulations/doubleslit.py | 10 +++---- examples/simulations/drag_chain.py | 6 ++-- examples/simulations/fourier_epicycles.py | 2 +- examples/simulations/grayscott.py | 9 ++---- examples/simulations/mag_field1.py | 2 +- examples/simulations/mag_field2.py | 2 +- examples/simulations/optics_main1.py | 34 +++-------------------- examples/simulations/optics_main2.py | 2 +- examples/simulations/self_org_maps2d.py | 6 ++-- examples/simulations/spline_ease.py | 2 +- examples/simulations/tunnelling1.py | 2 +- examples/simulations/tunnelling2.py | 2 +- examples/simulations/value_iteration.py | 13 --------- examples/simulations/wave_equation1d.py | 4 +-- examples/simulations/wave_equation2d.py | 4 +-- vedo/addons.py | 6 ++-- vedo/file_io.py | 4 +-- vedo/mesh.py | 4 +-- vedo/pointcloud.py | 6 ++-- vedo/shapes.py | 2 +- 45 files changed, 101 insertions(+), 118 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 5f74aa45..b35e40a7 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -15,6 +15,7 @@ ### Breaking changes +- plt.actors must become plt.objects - in `plotter.add_button(func)`, must use `func(event)` instead of `func()` (thanks to @smoothumut for spotting the bug) - change .points() to .vertices everywhere @@ -59,19 +60,29 @@ gyroid.py interpolate_scalar3.py mesh_smoother1.py splitmesh.py - spline_draw.py timer_callback2.py warp4.py warp6.py + ~/Projects/vedo/examples/pyplot +custom_axes1.py +caption.py +embed_matplotlib.py glyphs2.py explore5d.py goniometer.py histo_2d_a.py histo_2d_b.py +histo_hexagonal.py isolines.py +latex.py +plot_density2d.py +plot_density3d.py +plot_density4d.py +plot_stream.py +scatter_large.py ~/Projects/vedo/examples/simulations @@ -80,6 +91,17 @@ aspring1.py brownian2d.py gyroscope1.py gyroscope2.py +lorenz.py +mag_field1.py +pendulum_3d.py +trail.py + + +~/Projects/vedo/examples/other +ellipt_fourier_desc.py +export_numpy.py +flag_labels1.py + ``` diff --git a/examples/advanced/warp4.py b/examples/advanced/warp4.py index e5a4916d..a52ea047 100644 --- a/examples/advanced/warp4.py +++ b/examples/advanced/warp4.py @@ -110,7 +110,7 @@ def onkeypress(self, evt): ###################################### MORPH & GENER if not self.dottedln: return intermediates = [] - allpts = self.dottedln.points() + allpts = self.dottedln.vertices allpts = allpts.reshape(len(self.arrow_starts), self.n+1, 3) for i in range(self.n + 1): pi = allpts[:,i,:] diff --git a/examples/basic/closewindow.py b/examples/basic/closewindow.py index 91118883..5edf3666 100644 --- a/examples/basic/closewindow.py +++ b/examples/basic/closewindow.py @@ -22,13 +22,13 @@ # window should now close, the Plotter instance becomes unusable # but mesh objects still exist in it: -printc("First Plotter actors:", plt1.actors, '\nPress enter again') +printc("First Plotter:", plt1.objects, '\nPress enter again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. ################################################################## # Can now create a brand new Plotter and show the old object in it plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) -plt2.show(plt1.actors[0].data.color('red')) +plt2.show(plt1.objects[0].color('red')) ################################################################## # Create a third new Plotter and then close the second diff --git a/examples/basic/mesh_merge_vs_assembly.py b/examples/basic/mesh_merge_vs_assembly.py index 76a40134..13504594 100644 --- a/examples/basic/mesh_merge_vs_assembly.py +++ b/examples/basic/mesh_merge_vs_assembly.py @@ -1,7 +1,7 @@ ''' Mesh objects can be combined with (1) `mesh.merge` - creates a new mesh object; this new mesh inherits properties (color, etc.) of the first mesh. -(2) `assembly.Assembly` - groups meshes (or other actors); preserves properties +(2) `assembly.Assembly` - groups meshes (or other objects); preserves properties (3) `+` - equivalent to `Assembly` ''' # credits: https://github.com/icemtel diff --git a/examples/basic/mousehover1.py b/examples/basic/mousehover1.py index 297630d8..afe1614c 100644 --- a/examples/basic/mousehover1.py +++ b/examples/basic/mousehover1.py @@ -31,7 +31,7 @@ def func(evt): ### called every time mouse moves! settings.use_parallel_projection = True # avoid perspective effects plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse move', func) # add the callback function -plt.add_callback('keyboard', lambda evt: plt.remove(plt.actors[3:]).render()) +plt.add_callback('keyboard', lambda evt: plt.remove(plt.objects[3:]).render()) plt.show(hil, msg, __doc__, viewup='z') plt.close() diff --git a/examples/basic/mousehover3.py b/examples/basic/mousehover3.py index f828a192..d5d69a1a 100644 --- a/examples/basic/mousehover3.py +++ b/examples/basic/mousehover3.py @@ -14,7 +14,7 @@ def func(evt): # this is the callback function if mag(pt3d) < 0.01: return newpt = Point(pt3d).color(i) - txt.text(f'2D coords: {pt2d}\n3D coords: {pt3d}\nNpt = {len(plt.actors)}') + txt.text(f'2D coords: {pt2d}\n3D coords: {pt3d}\nNpt = {len(plt.objects)}') txt.color(i) # update text and color on the fly plt.at(i).add(newpt).render() # add new point and render i diff --git a/examples/other/ellipt_fourier_desc.py b/examples/other/ellipt_fourier_desc.py index bc98d44b..a9fee0e1 100644 --- a/examples/other/ellipt_fourier_desc.py +++ b/examples/other/ellipt_fourier_desc.py @@ -8,7 +8,7 @@ sh = shapes[55] sr = vedo.Line(sh).mirror('x').reverse() sm = vedo.merge(sh, sr).c('red5').lw(3) -pts = sm.points()[:,(0,1)] +pts = sm.vertices[:,(0,1)] rlines = [] for order in range(5,30, 5): diff --git a/examples/other/export_x3d.py b/examples/other/export_x3d.py index 8f5974e0..34175343 100644 --- a/examples/other/export_x3d.py +++ b/examples/other/export_x3d.py @@ -5,7 +5,7 @@ plt = Plotter(size=(800,600), bg='GhostWhite') embryo = Volume(dataurl+'embryo.tif').isosurface().decimate(0.5) -coords = embryo.points() +coords = embryo.vertices embryo.cmap('PRGn', coords[:,1]) # add dummy colors along y txt = Text3D(__doc__, font='Bongas', s=350, c='red2', depth=0.05) diff --git a/examples/other/flag_labels2.py b/examples/other/flag_labels2.py index 1a2151ea..f3edd244 100644 --- a/examples/other/flag_labels2.py +++ b/examples/other/flag_labels2.py @@ -3,7 +3,7 @@ s = ParametricShape("RandomHills").cmap("coolwarm") -pts = s.clone().decimate(n=10).points() +pts = s.clone().decimate(n=10).vertices fss = [] for p in pts: diff --git a/examples/other/pygeodesic1.py b/examples/other/pygeodesic1.py index 7f84bffa..c96f8085 100644 --- a/examples/other/pygeodesic1.py +++ b/examples/other/pygeodesic1.py @@ -4,7 +4,7 @@ m = vedo.Mesh(vedo.dataurl+"bunny.obj").c("green9") -geoalg = geodesic.PyGeodesicAlgorithmExact(m.points(), m.cells) +geoalg = geodesic.PyGeodesicAlgorithmExact(m.vertices, m.cells) # Use source and target point ids distance, path = geoalg.geodesicDistance(639, 834) diff --git a/examples/other/pymeshlab2.py b/examples/other/pymeshlab2.py index 960f25c3..06f98d67 100644 --- a/examples/other/pymeshlab2.py +++ b/examples/other/pymeshlab2.py @@ -3,7 +3,7 @@ import vedo import pymeshlab # tested on pymeshlab-2022.2.post2 -pts = vedo.Mesh(vedo.dataurl+'cow.vtk').points() # numpy array of vertices +pts = vedo.Mesh(vedo.dataurl+'cow.vtk').vertices # numpy array of vertices m = pymeshlab.Mesh(vertex_matrix=pts) diff --git a/examples/other/qt_window1.py b/examples/other/qt_window1.py index a4af41c4..f52709fd 100644 --- a/examples/other/qt_window1.py +++ b/examples/other/qt_window1.py @@ -38,7 +38,7 @@ def onKeypress(self, evt): @Qt.pyqtSlot() def onClick(self): printc("..calling onClick") - self.plt.actors[0].color('red').rotate_z(40) + self.plt.objects[0].color('red').rotate_z(40) self.plt.interactor.Render() def onClose(self): diff --git a/examples/other/qt_window3.py b/examples/other/qt_window3.py index 226f3e9b..1186de11 100644 --- a/examples/other/qt_window3.py +++ b/examples/other/qt_window3.py @@ -42,7 +42,7 @@ def onKeypress(self, evt): @Qt.pyqtSlot() def onClick(self): - self.plt.actors[0].color("red5").rotate_z(40) + self.plt.objects[0].color("red5").rotate_z(40) self.plt.render() def onClose(self): diff --git a/examples/other/remesh_ACVD.py b/examples/other/remesh_ACVD.py index 03da0951..fa907b3e 100644 --- a/examples/other/remesh_ACVD.py +++ b/examples/other/remesh_ACVD.py @@ -9,7 +9,7 @@ mesh = Sphere(res=50).subdivide().lw(0.2).cut_with_plane().clean() -clus = Clustering(wrap(mesh)) +clus = Clustering(wrap(mesh.dataset)) clus.cluster(1000, maxiter=100, iso_try=10, debug=False) pvremesh = clus.create_mesh() diff --git a/examples/other/tensor_grid2.py b/examples/other/tensor_grid2.py index 6f5c0e9b..3d3d1bf5 100644 --- a/examples/other/tensor_grid2.py +++ b/examples/other/tensor_grid2.py @@ -62,9 +62,10 @@ def principal_stretches_directions(T): x, y = np.meshgrid(np.linspace(-1, 1, 8), np.linspace(-1, 1, 8)) grid = vedo.Grid(s=(x[0], y.T[0])) -grid_pts = grid.points() +grid_pts = grid.vertices grid_pts_defo = deform(grid_pts[:, 0], grid_pts[:, 1]) -grid_defo = grid.clone().points(grid_pts_defo.T) +grid_defo = grid.clone() +grid_defo.vertices = grid_pts_defo.T # Initialize the vedo plotter plotter = vedo.Plotter() @@ -105,14 +106,14 @@ def principal_stretches_directions(T): # tensor because it is not a symmetric tensor. # F = deformation_gradient(*pt) # circle = vedo.Circle(r=0.05, c="black").pos(*pt) - # cpts = circle.points() + # cpts = circle.vertices # cpts_defo = F @ cpts.T[:2] - # circle.points(cpts_defo.T) + # circle.vertices = cpts_defo.T # Same as: circle = vedo.Circle(r=0.06, c="black").pos(*pt) - cpts = circle.points() + cpts = circle.vertices cpts_defo = deform(cpts[:,0], cpts[:,1]) - circle.points(cpts_defo.T) + circle.vertices = cpts_defo.T plotter += [ellipsoid_C, ellipsoid_E, circle] diff --git a/examples/other/vpolyscope.py b/examples/other/vpolyscope.py index 02c01d21..69f15995 100644 --- a/examples/other/vpolyscope.py +++ b/examples/other/vpolyscope.py @@ -14,7 +14,7 @@ ps_mesh = polyscope.register_surface_mesh( "My vedo mesh", m.vertices, m.cells, color=[0.5, 0, 0], smooth_shade=True ) -ps_mesh.add_scalar_quantity("heights", m.points()[:, 2], defined_on="vertices") +ps_mesh.add_scalar_quantity("heights", m.vertices[:, 2], defined_on="vertices") ps_mesh.set_material("wax") # wax, mud, jade, candy polyscope.show() diff --git a/examples/other/wx_window2.py b/examples/other/wx_window2.py index 24dc1a94..38155749 100644 --- a/examples/other/wx_window2.py +++ b/examples/other/wx_window2.py @@ -22,11 +22,12 @@ def func(event): txt = f"Probed point:\n{vedo.utils.precision(event.picked3d, 3)}\n" \ f"value = {vedo.utils.precision(arr[ptid], 2)}" - vpt = vedo.shapes.Sphere(mesh.points(ptid), r=0.01, c='orange2').pickable(False) + spt = mesh.vertices[ptid] + vpt = vedo.shapes.Sphere(spt, r=0.01, c='orange2').pickable(False) vig = vpt.flagpole(txt, s=.05, offset=(0.5,0.5), font="VictorMono").follow_camera() msg.text(txt) # update the 2d text message - plt.remove(plt.actors[-2:]).add([vpt, vig]) # remove last 2 objects, add the new ones + plt.remove(plt.objects[-2:]).add([vpt, vig]) # remove last 2 objects, add the new ones widget.Render() # need to manually call Render msg = vedo.Text2D(pos='bottom-left', font="VictorMono") @@ -36,7 +37,7 @@ def func(event): plt = vedo.Plotter(bg='moccasin', bg2='blue9', wx_widget=widget) plt.add([msh, axs, msg]).reset_camera() -plt.actors += [None,None,None] # place holder for sphere, flagpole, text2d +plt.objects += [None,None,None] # place holder for sphere, flagpole, text2d plt.add_callback('MouseMove', func) ##################################################### diff --git a/examples/pyplot/anim_lines.py b/examples/pyplot/anim_lines.py index c74209c4..dd5276c9 100644 --- a/examples/pyplot/anim_lines.py +++ b/examples/pyplot/anim_lines.py @@ -26,7 +26,7 @@ data[:, 1:] = data[:, :-1] # Shift data to the right data[:, 0] = np.random.uniform(0, 1, len(data)) # Fill-in new values for line, d in zip(lines, data): # Update data - newpts = line.points() + newpts = line.vertices newpts[:,2] = G * d line.points(newpts).cmap('gist_heat_r', newpts[:,2]) plt.render() diff --git a/examples/pyplot/fit_circle.py b/examples/pyplot/fit_circle.py index 4afea353..b0dd08e1 100644 --- a/examples/pyplot/fit_circle.py +++ b/examples/pyplot/fit_circle.py @@ -13,7 +13,7 @@ n = 5 # nr. of points to use for the fit npt = shape.npoints -points = shape.points() +points = shape.vertices fitpts, circles, curvs = [], [], [0]*npt for i in range(n, npt - n-1): diff --git a/examples/pyplot/graph_network.py b/examples/pyplot/graph_network.py index 86edc824..e6f32f7c 100644 --- a/examples/pyplot/graph_network.py +++ b/examples/pyplot/graph_network.py @@ -22,7 +22,7 @@ ##################### build and draw graph = g.build().unpack(0).linewidth(4) # get the vedo 3d graph lines -nodes = graph.points() # get the 3d points of the nodes +nodes = graph.vertices # get the 3d points of the nodes pts = Points(nodes, r=10).lighting('off') diff --git a/examples/pyplot/histo_pca.py b/examples/pyplot/histo_pca.py index 577b81be..63c5e0c4 100644 --- a/examples/pyplot/histo_pca.py +++ b/examples/pyplot/histo_pca.py @@ -20,7 +20,7 @@ mypts = pts.clone() # rotate back to make the histo: mypts.shift(-ec).rotate_z(-angle) histo = histogram( # a Histogram1D(Figure) object - mypts.points()[:,1], # grab the y-values (PCA2) + mypts.vertices[:,1], # grab the y-values (PCA2) ytitle='', title=' ', # no automatic title, no y-axis c='#1f77b4', # color aspect=16/9, # aspect ratio diff --git a/examples/pyplot/histo_polar.py b/examples/pyplot/histo_polar.py index fd76e37a..fbf68932 100644 --- a/examples/pyplot/histo_polar.py +++ b/examples/pyplot/histo_polar.py @@ -37,7 +37,7 @@ show_errors=False, ) rh.scale(0.15) # scale histogram to make it small - rh.pos(hyp.points()[i]) # set its position on the surface + rh.pos(hyp.vertices[i]) # set its position on the surface radhistos.append(rh) show(hyp, radhistos, at=1).interactive().close() diff --git a/examples/pyplot/lines_intersect.py b/examples/pyplot/lines_intersect.py index 50c01df9..e0357bdb 100644 --- a/examples/pyplot/lines_intersect.py +++ b/examples/pyplot/lines_intersect.py @@ -20,6 +20,6 @@ # lets fill the convex area between the first 2 hits: id0 = line1.closest_point(pint[0], return_point_id=True) id1 = line1.closest_point(pint[1], return_point_id=True) -msh = Line(line1.points()[id0:id1]).triangulate().lw(0).shift(0,0,-0.01) +msh = Line(line1.vertices[id0:id1]).triangulate().lw(0).shift(0,0,-0.01) show(line1, line2, ps, msh, __doc__+f"\narea = {msh.area()} cm:^2", axes=1).close() diff --git a/examples/pyplot/markpoint.py b/examples/pyplot/markpoint.py index 2d011dd2..c14c647a 100644 --- a/examples/pyplot/markpoint.py +++ b/examples/pyplot/markpoint.py @@ -3,10 +3,11 @@ from vedo import * sp = Sphere().wireframe() -pts = sp.points() -tx1 = Text3D("Fixed Text", pts[10], s=0.07, depth=0.1, c="lb") -tx2 = Text3D("Follower Text", pts[144], s=0.07, c="lg").follow_camera() +verts = sp.vertices +tx1 = Text3D("Fixed Text", verts[10], s=0.07, depth=0.1, c="lb") +tx2 = Text3D("Follower Text", verts[144], s=0.07, c="lg") +tx2.follow_camera() fp = sp.flagpole("The\nNorth Pole", c='k6', rounded=True) fp = fp.scale(0.4).follow_camera() diff --git a/examples/pyplot/quiver.py b/examples/pyplot/quiver.py index 746b6ca9..c36abc1b 100644 --- a/examples/pyplot/quiver.py +++ b/examples/pyplot/quiver.py @@ -3,8 +3,8 @@ # Create displacements -pts1 = Grid(s=[1.0,1.0]).points() -pts2 = Grid(s=[1.2,1.2]).rotate_z(4).points() +pts1 = Grid(s=[1.0,1.0]).vertices +pts2 = Grid(s=[1.2,1.2]).rotate_z(4).vertices quiv = Arrows2D(pts1, pts2, c="red5") diff --git a/examples/simulations/doubleslit.py b/examples/simulations/doubleslit.py index 6791a20c..e5258df0 100644 --- a/examples/simulations/doubleslit.py +++ b/examples/simulations/doubleslit.py @@ -19,7 +19,7 @@ slits = slit1 + slit2 # slits += list(slit1 + array([-2e-5, 1e-5, 0])) # add another copy of slit1 # slits = [(cos(x)*4e-5, sin(x)*4e-5, 0) for x in arange(0,2*np.pi, .1)] # Arago spot -# slits = Grid(s=[1e-4,1e-4], res=[9,9]).points() # a square lattice +# slits = Grid(s=[1e-4,1e-4], res=[9,9]).vertices # a square lattice plt = Plotter(title="The Double Slit Experiment", axes=9, bg="black") @@ -29,16 +29,16 @@ k = 0.0 + 1j * 2 * np.pi / lambda1 # complex wave number norm = len(slits) * 5e5 amplitudes = [] -screen_pts = screen.points() -for i, x in enumerate(screen_pts): +verts = screen.vertices +for i, x in enumerate(verts): psi = 0 for s in slits: r = mag(x - s) psi += np.exp(k * r) / r psi2 = np.real(psi * np.conj(psi)) # psi squared amplitudes.append(psi2) - screen_pts[i] = x + [0, 0, psi2 / norm] -screen.points(screen_pts).cmap("hot", amplitudes) + verts[i] = x + [0, 0, psi2 / norm] +screen.cmap("hot", amplitudes) plt += [screen, __doc__] plt += Points(np.array(slits) * 200, c="w") # slits scale magnified by factor 200 diff --git a/examples/simulations/drag_chain.py b/examples/simulations/drag_chain.py index 93c09712..75f7562c 100644 --- a/examples/simulations/drag_chain.py +++ b/examples/simulations/drag_chain.py @@ -7,13 +7,13 @@ def func(evt): if not evt.actor: return - coords = line.points() + coords = line.vertices coords[0] = evt.picked3d for i in range(1, n): v = versor(coords[i] - coords[i-1]) coords[i] = coords[i-1] + v * l - line.points(coords) # update positions - nodes.points(coords) + line.vertices = coords # update positions + nodes.vertices = coords plt.render() surf = Plane(s=[60, 60]) diff --git a/examples/simulations/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py index 99b1889e..ff48bd6d 100644 --- a/examples/simulations/fourier_epicycles.py +++ b/examples/simulations/fourier_epicycles.py @@ -50,7 +50,7 @@ def epicycles(time, rotation, fourier, order): shape = vedo.load(vedo.dataurl+'timecourse1d.npy')[55] shaper = vedo.Line(shape).mirror('x').reverse() shape = vedo.merge(shape, shaper) -x, y, _ = shape.points().T +x, y, _ = shape.vertices.T # Compute Fourier Discrete Transform in x and y separately: fourierX = DFT(x) diff --git a/examples/simulations/grayscott.py b/examples/simulations/grayscott.py index 8b310dff..edcf238e 100644 --- a/examples/simulations/grayscott.py +++ b/examples/simulations/grayscott.py @@ -43,12 +43,10 @@ formula = r'(u,v)=(D_u\cdot\Delta u -u v v+F(1-u), D_v\cdot\Delta v +u v v -(F+k)v)' print('Du, Dv, F, k, name =', Du, Dv, F, k, name) -plt = Plotter(bg='linen') def loop_func(event): global u, v - - for i in range(25): + for _ in range(25): Lu = ( U[0:-2, 1:-1] + U[1:-1, 0:-2] - 4*U[1:-1, 1:-1] + U[1:-1, 2:] + U[2: , 1:-1]) @@ -61,11 +59,10 @@ def loop_func(event): grd.cmap('ocean_r', V.ravel(), on='cells', name="escals") grd.map_cells_to_points() # interpolate cell data to point data - newpts = grd.points() - newpts[:,2] = grd.pointdata['escals']*25 # assign z elevation - grd.points(newpts) # set the new points + grd.vertices[:,2] = grd.pointdata['escals']*25 # assign z elevation plt.render() +plt = Plotter(bg='linen') plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(grd, __doc__, zoom=1.25, elevation=-30) diff --git a/examples/simulations/mag_field1.py b/examples/simulations/mag_field1.py index f816da32..9c76b3ce 100644 --- a/examples/simulations/mag_field1.py +++ b/examples/simulations/mag_field1.py @@ -11,7 +11,7 @@ def func(evt): txt.c('red5').background('yellow7') plt.render() - pts = sptool.spline().points() # extract the current spline + pts = sptool.spline().vertices # extract the current spline field = [] for probe in probes: B = np.zeros(3) diff --git a/examples/simulations/mag_field2.py b/examples/simulations/mag_field2.py index 2db6693e..87cf51c9 100644 --- a/examples/simulations/mag_field2.py +++ b/examples/simulations/mag_field2.py @@ -19,7 +19,7 @@ ) # compute B-field and add as pointdata to volume -volume.pointdata['B'] = coil1.getB(volume.points()) +volume.pointdata['B'] = coil1.getB(volume.vertices) # compute field lines seeds = vedo.Disc(r1=1, r2=5.2, res=(3,12)) diff --git a/examples/simulations/optics_main1.py b/examples/simulations/optics_main1.py index 0c055cec..8666a729 100644 --- a/examples/simulations/optics_main1.py +++ b/examples/simulations/optics_main1.py @@ -10,7 +10,7 @@ screen= Screen(3,3).z(5) elements = [lens, screen] -source = vedo.Disc(r1=0, r2=0.7, res=4).points() # numpy 3d points +source = vedo.Disc(r1=0, r2=0.7, res=4).vertices # numpy 3d points lines = [Ray(pt).trace(elements).asLine() for pt in source] # list of vedo.Line vedo.show("Test of 1/f = (n-1) \dot (1/R1-1/R2) \approx 1/2", @@ -39,7 +39,7 @@ screen = Screen(5,5).z(9) elements = [m2, m1, m2, m1, screen] ## NOTE ordering! source= vedo.Disc(r1=1, r2=3, res=[20,60]).cut_with_plane().cut_with_plane(normal='y').z(1) -lines = [Ray(pt).trace(elements).asLine(2) for pt in source.points()] +lines = [Ray(pt).trace(elements).asLine(2) for pt in source.vertices] vedo.show("Reflection from spherical mirrors", elements, lines, axes=1).close() @@ -47,7 +47,7 @@ s = vedo.Paraboloid(res=200).cut_with_plane([0,0,-0.4], 'z').scale([1,1,0.1]).z(1) elements = [Mirror(s), Screen(0.2,0.2).z(0.35)] source= vedo.Disc(r1=.1, r2=.3, res=[10,30]).cut_with_plane().cut_with_plane(normal='y') -lines = [Ray(pt).trace(elements).asLine() for pt in source.points()] +lines = [Ray(pt).trace(elements).asLine() for pt in source.vertices] vedo.show("Reflection from a parabolic mirror", elements, lines, axes=2, azimuth=-90).close() @@ -63,7 +63,7 @@ source = vedo.Grid(res=[30,30]).rotate_x(90).y(-1) lines=[] -for pt in source.points(): +for pt in source.vertices: ray = Ray(pt, direction=(0,1,0)).trace([mirror, detector]) line = ray.asLine(min_hits=2, max_hits=4) lines.append(line) @@ -73,29 +73,3 @@ vedo.show(mirror, detector, lines, "A Mesh mirror and a spherical detector", elevation=-90, axes=1, bg='bb', bg2='blue9').close() - -# ################################################################# interference -s1 = vedo.Sphere(res=100).rotate_y(90).cut_with_plane([0,0,0.9], normal='z').y(-.5) -s2 = vedo.Sphere(res=100).rotate_y(90).cut_with_plane([0,0,0.9], normal='z').y(+.5) -src = vedo.merge(s1,s2).clean().compute_normals() -dirs = src.pointdata["Normals"] -screen= Screen(3,3).z(4) - -grid = vedo.Grid(res=[40,40], s=[4,4]).rotate_z(90) -detector = Detector(grid).z(3.5) - -elements = [detector] -rays, lines, pols = [], [], [] -for i,pt in enumerate(src.points()): - ray = Ray(pt, direction=dirs[i], wave_length=1).trace(elements) # radio waves - line = ray.asLine() - if not i%20: - lines.append(line) - pols.append(ray.polarizations[-1]) - -detector.integrate(pols).cmap("brg", on='cells').add_scalarbar("Prob.") - -vedo.show("Interference on a detector surface", s1,s2, lines, elements, - zoom=1.5, size=(1100,700), elevation=180, azimuth=90, axes=1).close() - - diff --git a/examples/simulations/optics_main2.py b/examples/simulations/optics_main2.py index e7447da9..a95a2b9a 100644 --- a/examples/simulations/optics_main2.py +++ b/examples/simulations/optics_main2.py @@ -26,7 +26,7 @@ # Generate photons and trace them through the optical elements lines = [] -source = Grid(res=[20,20]).points() # a numpy array +source = Grid(res=[20,20]).vertices # a numpy array for pt in source: λ = np.random.uniform(low=450, high=750)*1e-09 # nanometers ray = Ray(pt, direction=(0,0,1), wave_length=λ) diff --git a/examples/simulations/self_org_maps2d.py b/examples/simulations/self_org_maps2d.py index a6518514..4147540e 100644 --- a/examples/simulations/self_org_maps2d.py +++ b/examples/simulations/self_org_maps2d.py @@ -44,11 +44,11 @@ def learn(self, n_epoch=10000, sigma=(0.25,0.01), lrate=(0.5,0.01)): if i>500 and not i%20 or i==n_epoch-1: x, y, z = [self.codebook[:,i].reshape(n,n) for i in range(3)] grd.wireframe(False).lw(0.5).bc('blue9').flat() - grdpts = grd.points() + grdpts = grd.vertices for i in range(n): for j in range(n): grdpts[i*n+j] = (x[i,j], y[i,j], z[i,j]) - grd.points(grdpts) + grd.vertices = grdpts plt.azimuth(1.0).render() plt.interactive().close() @@ -70,5 +70,5 @@ def learn(self, n_epoch=10000, sigma=(0.25,0.01), lrate=(0.5,0.01)): plt.show(__doc__, s.ps(1), grd) som = SOM((len(P), 3), D) - som.samples = s.points() + som.samples = s.vertices som.learn(n_epoch=4000, sigma=(1, 0.01), lrate=(1, 0.01)) diff --git a/examples/simulations/spline_ease.py b/examples/simulations/spline_ease.py index 9ae66ab4..2c6b0c01 100644 --- a/examples/simulations/spline_ease.py +++ b/examples/simulations/spline_ease.py @@ -20,7 +20,7 @@ redpt = Point(r=25).c('red') plt = show(vpts, gpts, line, redpt, equi_pts, axes=1, interactive=0) # Animation -pts = line.points() +pts = line.vertices for i in range(line.npoints): redpt.pos(pts[i]) # assign the new position plt.render() diff --git a/examples/simulations/tunnelling1.py b/examples/simulations/tunnelling1.py index 43465330..8cb4f3cf 100644 --- a/examples/simulations/tunnelling1.py +++ b/examples/simulations/tunnelling1.py @@ -42,7 +42,7 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method for i in range(500): Psi += d_dt(Psi) * dt # integrate for a while amp = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) - wpacket.points(np.c_[x, amp, zeros]) # update points + wpacket.vertices = np.c_[x, amp, zeros] # update vertices plt.render() plt.interactive().close() diff --git a/examples/simulations/tunnelling2.py b/examples/simulations/tunnelling2.py index df458dbc..d1a2bea5 100644 --- a/examples/simulations/tunnelling2.py +++ b/examples/simulations/tunnelling2.py @@ -57,7 +57,7 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method lines.append([Aline, A]) # store objects # now show the same lines along z representing time -plt.actors= [] # clean up internal list of objects to show +plt.objects= [] # clean up internal list of objects to show plt.elevation(20) plt.azimuth(20) bck.alpha(1) diff --git a/examples/simulations/value_iteration.py b/examples/simulations/value_iteration.py index 4d99b805..192a3099 100644 --- a/examples/simulations/value_iteration.py +++ b/examples/simulations/value_iteration.py @@ -69,16 +69,6 @@ def diffuse(Z, gamma=0.99): return P, G -def print_solution(S, start, goal): - for y,line in enumerate(Z): - for x,c in enumerate(line): - if (y,x) == start: print("[]", end='') - elif (y,x) == goal: print("[]", end='') - elif (y,x) in S[0]: print("..", end='') - elif c: print("██", end='') - else: print(" ", end='') - print() - def show_solution3d(S, start, goal): from vedo import Text3D, Cube, Line, Grid, merge, show @@ -110,8 +100,5 @@ def show_solution3d(S, start, goal): Z = maze(shape=(50, 70)) start, goal = (1,1), (Z.shape[0]-2, Z.shape[1]-2) - print("Please wait..") S = solve(Z, start, goal) - - #print_solution(S, start, goal) show_solution3d(S, start, goal).close() diff --git a/examples/simulations/wave_equation1d.py b/examples/simulations/wave_equation1d.py index 660f3003..163b7c78 100644 --- a/examples/simulations/wave_equation1d.py +++ b/examples/simulations/wave_equation1d.py @@ -103,11 +103,11 @@ def euler(y, v, t, dt): # simple euler integrator y_eu = positions_eu[i] # retrieve the list of y positions at step i y_rk = positions_rk[i] - pts = line_eu.points() + pts = line_eu.vertices pts[:,1] = y_eu line_eu.points(pts) - pts = line_rk.points() + pts = line_rk.vertices pts[:,1] = y_rk line_rk.points(pts) plt.render() diff --git a/examples/simulations/wave_equation2d.py b/examples/simulations/wave_equation2d.py index 0b61f2d3..3e1c27d4 100644 --- a/examples/simulations/wave_equation2d.py +++ b/examples/simulations/wave_equation2d.py @@ -53,9 +53,9 @@ wave = Z1.ravel() txt.text(f"frame: {i}/{nframes}, height_max = {wave.max()}") grid.cmap("Blues", wave, vmin=-2, vmax=2) - newpts = grid.points() + newpts = grid.vertices newpts[:,2] = wave - grid.points(newpts) # update the z component + grid.vertices = newpts # update the z component plt.render() plt.interactive() diff --git a/vedo/addons.py b/vedo/addons.py index 174f90cc..976299f2 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1725,7 +1725,7 @@ def __init__( self._implicit_func = vtk.vtkPlane() - poly = mesh + poly = mesh.dataset self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) @@ -1861,7 +1861,7 @@ def __init__( self._implicit_func = vtk.vtkPlanes() self._implicit_func.SetBounds(self._init_bounds) - poly = mesh + poly = mesh.dataset self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) @@ -1975,7 +1975,7 @@ def __init__( radius = mesh.average_size() * 2 self._implicit_func.SetRadius(radius) - poly = mesh + poly = mesh.dataset self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) diff --git a/vedo/file_io.py b/vedo/file_io.py index 986bd565..803e4511 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -844,7 +844,7 @@ def _fillcommon(obj, adict): def _fillmesh(obj, adict): adict["points"] = obj.vertices.astype(float) - poly = obj + poly = obj.dataset adict["cells"] = None if poly.GetNumberOfPolys(): @@ -1512,7 +1512,7 @@ def export_window(fileoutput, binary=False): allobjs = list(set(allobjs)) # make sure its unique for a in allobjs: - if a.actor.GetVisibility(): + if a.GetVisibility(): sdict["objects"].append(tonumpy(a)) if fr.endswith(".npz"): diff --git a/vedo/mesh.py b/vedo/mesh.py index efcff82c..c6101b21 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -233,10 +233,10 @@ def __init__(self, inputobj=None, c='gold', alpha=1): self.dataset = gf.GetOutput() elif "meshlab" in str(type(inputobj)): - self.dataset = vedo.utils.meshlab2vedo(inputobj) + self.dataset = vedo.utils.meshlab2vedo(inputobj).dataset elif "trimesh" in str(type(inputobj)): - self.dataset = vedo.utils.trimesh2vedo(inputobj) + self.dataset = vedo.utils.trimesh2vedo(inputobj).dataset elif "meshio" in str(type(inputobj)): # self.dataset = vedo.utils.meshio2vedo(inputobj) ##TODO diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index aae2ac7f..70a521eb 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1428,10 +1428,10 @@ def labels2d( return None cellcloud = Points(self.cell_centers) arr = self.dataset.GetCellData().GetScalars() - poly = cellcloud + poly = cellcloud.dataset poly.GetPointData().SetScalars(arr) else: - poly = self + poly = self.dataset if content != "id" and content not in self.pointdata.keys(): vedo.logger.error(f"In labels2d: point array {content} does not exist.") return None @@ -2167,7 +2167,7 @@ def clone2d( scale = 350 / msiz cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale) + poly = cmsh.pos(0, 0, 0).scale(scale).dataset mapper3d = self.mapper cm = mapper3d.GetColorMode() diff --git a/vedo/shapes.py b/vedo/shapes.py index 01494e83..fa7142ba 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -350,7 +350,7 @@ def __init__( if isinstance(domain, vtk.vtkPolyData): tg.SetInputData(domain) else: - tg.SetInputData(domain.GetMapper().GetInput()) + tg.SetInputData(domain.dataset) tg.SetSourceData(src.GetOutput()) if c is None: From 12ea009b2c9dad860ae983e9e305af0324d43ac1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 14:42:18 +0200 Subject: [PATCH 066/251] in numpy2vtk fix np.bool_ --- vedo/assembly.py | 788 +++++++++++++++++++++++------------------------ vedo/utils.py | 2 + 2 files changed, 396 insertions(+), 394 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index 4762bebd..fa724070 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -582,405 +582,405 @@ def show(self, **options): ############################################################################### -class Gruppo: - - def __init__(self, *meshes): - """ - Group many and treat them as a single new object. - """ - - self.actor = vtk.vtkPropAssembly() - self.actor.data = self #reference to this object - - self.rendered_at = set() - - self.name = "Gruppo" - - self.objects = [] - - self.transform = LinearTransform() - - for m in vedo.utils.flatten(meshes): - if m: - self.objects.append(m) - self.actor.AddPart(m.actor) - if hasattr(m, "scalarbar") and m.scalarbar is not None: - self.objects.append(m.scalarbar) - self.actor.AddPart(m.scalarbar.actor) - - self.actor.PickableOff() - - if self.objects: - self.base = self.objects[0].base - self.top = self.objects[0].top - else: - self.base = None - self.top = None - - self.pipeline = vedo.utils.OperationNode( - "Gruppo", - parents=self.objects, - comment=f"#objects {len(self.objects)}", - c="#f08080", - ) - ########################################## - - def _repr_html_(self): - """ - HTML representation of the Gruppo object for Jupyter Notebooks. - - Returns: - HTML text with the image and some properties. - """ - import io - import base64 - from PIL import Image - - library_name = "vedo.assembly.Gruppo" - help_url = "https://vedo.embl.es/docs/vedo/assembly.html" - - arr = self.thumbnail(zoom=1.1, elevation=-60) - - im = Image.fromarray(arr) - buffered = io.BytesIO() - im.save(buffered, format="PNG", quality=100) - encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") - url = "data:image/png;base64," + encoded - image = f"" - - # statisitics - bounds = "
".join( - [ - vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) - for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) - ] - ) - - help_text = "" - if self.name: - help_text += f" {self.name}:   " - help_text += '' + library_name + "" - if self.filename: - dots = "" - if len(self.filename) > 30: - dots = "..." - help_text += f"
({dots}{self.filename[-30:]})" - - allt = [ - "
nr. of objects " - + str(self.actor.GetNumberOfPaths()) + + str(self.GetNumberOfPaths()) + "
position " + str(self.actor.GetPosition()) + "
position " + str(self.GetPosition()) + "
diagonal size " + vedo.utils.precision(self.diagonal_size(), 5) + "
cell data array " + name + "
cell data array " + name + "
", - "", - "", - "
", - image, - "
", - help_text, - "", - "", - "", - "", - "", - "
nr. of objects " - + str(self.GetNumberOfPaths()) - + "
position " + str(self.transformation.position) + "
diagonal size " - + vedo.utils.precision(self.diagonal_size(), 5) - + "
bounds
(x/y/z)
" + str(bounds) + "
", - "
", - ] - return "\n".join(allt) - - def __add__(self, obj): - """ - Add an object to the `Gruppo` - """ - self.objects.append(obj) - self.actor.AddPart(obj.actor) - - if hasattr(obj, "scalarbar") and obj.scalarbar is not None: - self.objects.append(obj.scalarbar) - self.actor.AddPart(obj.scalarbar.actor) - return self - - def __iadd__(self, *obj): - """ - Add an object to the group - """ - for ob in obj: - if ob: - self.objects.append(ob) - self.actor.AddPart(ob.actor) - if hasattr(ob, "scalarbar") and ob.scalarbar is not None: - self.objects.append(ob.scalarbar) - self.AddPart(ob.scalarbar.actor) - return self +# class Gruppo: + +# def __init__(self, *meshes): +# """ +# Group many and treat them as a single new object. +# """ + +# self.actor = vtk.vtkPropAssembly() +# self.actor.data = self #reference to this object + +# self.rendered_at = set() + +# self.name = "Gruppo" + +# self.objects = [] + +# self.transform = LinearTransform() + +# for m in vedo.utils.flatten(meshes): +# if m: +# self.objects.append(m) +# self.actor.AddPart(m.actor) +# if hasattr(m, "scalarbar") and m.scalarbar is not None: +# self.objects.append(m.scalarbar) +# self.actor.AddPart(m.scalarbar.actor) + +# self.actor.PickableOff() + +# if self.objects: +# self.base = self.objects[0].base +# self.top = self.objects[0].top +# else: +# self.base = None +# self.top = None + +# self.pipeline = vedo.utils.OperationNode( +# "Gruppo", +# parents=self.objects, +# comment=f"#objects {len(self.objects)}", +# c="#f08080", +# ) +# ########################################## + +# def _repr_html_(self): +# """ +# HTML representation of the Gruppo object for Jupyter Notebooks. + +# Returns: +# HTML text with the image and some properties. +# """ +# import io +# import base64 +# from PIL import Image + +# library_name = "vedo.assembly.Gruppo" +# help_url = "https://vedo.embl.es/docs/vedo/assembly.html" + +# arr = self.thumbnail(zoom=1.1, elevation=-60) + +# im = Image.fromarray(arr) +# buffered = io.BytesIO() +# im.save(buffered, format="PNG", quality=100) +# encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") +# url = "data:image/png;base64," + encoded +# image = f"" + +# # statisitics +# bounds = "
".join( +# [ +# vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) +# for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) +# ] +# ) + +# help_text = "" +# if self.name: +# help_text += f" {self.name}:   " +# help_text += '' + library_name + "" +# if self.filename: +# dots = "" +# if len(self.filename) > 30: +# dots = "..." +# help_text += f"
({dots}{self.filename[-30:]})" + +# allt = [ +# "", +# "", +# "", +# "
", +# image, +# "
", +# help_text, +# "", +# "", +# "", +# "", +# "", +# "
nr. of objects " +# + str(self.GetNumberOfPaths()) +# + "
position " + str(self.transformation.position) + "
diagonal size " +# + vedo.utils.precision(self.diagonal_size(), 5) +# + "
bounds
(x/y/z)
" + str(bounds) + "
", +# "
", +# ] +# return "\n".join(allt) + +# def __add__(self, obj): +# """ +# Add an object to the `Gruppo` +# """ +# self.objects.append(obj) +# self.actor.AddPart(obj.actor) + +# if hasattr(obj, "scalarbar") and obj.scalarbar is not None: +# self.objects.append(obj.scalarbar) +# self.actor.AddPart(obj.scalarbar.actor) +# return self + +# def __iadd__(self, *obj): +# """ +# Add an object to the group +# """ +# for ob in obj: +# if ob: +# self.objects.append(ob) +# self.actor.AddPart(ob.actor) +# if hasattr(ob, "scalarbar") and ob.scalarbar is not None: +# self.objects.append(ob.scalarbar) +# self.AddPart(ob.scalarbar.actor) +# return self - def __contains__(self, obj): - """Allows to use ``in`` to check if an object is in the `Gruppo`.""" - return obj in self.objects - - def pickable(self, value): - """Set/get the pickability property of an assembly and its elements""" - # set property to each element - for elem in self.recursive_unpack(): - elem.pickable(value) - self.actor.SetPickable(value) - return self - - def use_bounds(self, value): - """Consider object bounds in rendering.""" - self.actor.SetUseBounds(value) - return self - - def unpack(self): - """Unpack the group into its elements""" - elements = [] - self.actor.InitPathTraversal() - parts = self.actor.GetParts() - parts.InitTraversal() - for i in range(parts.GetNumberOfItems()): - ele = parts.GetItemAsObject(i) - elements.append(ele) - return elements - - def clone(self): - """Make a clone copy of the object.""" - newlist = [] - for a in self.objects: - newlist.append(a.clone()) - newg = Gruppo(newlist) - newg.name = self.name - newg.transform = self.transform.clone() - return newg - - def diagonal_size(self): - """Get the diagonal size of the bounding box.""" - b = self.bounds() - return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) - - # def g_unpack(self): - # """Unpack the group into its elements""" +# def __contains__(self, obj): +# """Allows to use ``in`` to check if an object is in the `Gruppo`.""" +# return obj in self.objects + +# def pickable(self, value): +# """Set/get the pickability property of an assembly and its elements""" +# # set property to each element +# for elem in self.recursive_unpack(): +# elem.pickable(value) +# self.actor.SetPickable(value) +# return self + +# def use_bounds(self, value): +# """Consider object bounds in rendering.""" +# self.actor.SetUseBounds(value) +# return self + +# def unpack(self): +# """Unpack the group into its elements""" +# elements = [] +# self.actor.InitPathTraversal() +# parts = self.actor.GetParts() +# parts.InitTraversal() +# for i in range(parts.GetNumberOfItems()): +# ele = parts.GetItemAsObject(i) +# elements.append(ele) +# return elements + +# def clone(self): +# """Make a clone copy of the object.""" +# newlist = [] +# for a in self.objects: +# newlist.append(a.clone()) +# newg = Gruppo(newlist) +# newg.name = self.name +# newg.transform = self.transform.clone() +# return newg + +# def diagonal_size(self): +# """Get the diagonal size of the bounding box.""" +# b = self.bounds() +# return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) + +# # def g_unpack(self): +# # """Unpack the group into its elements""" - # return self.objects - - # def r_unpack(self): - # """Flatten out an Gruppo.""" - - # def _genflatten(lst): - # if not lst: - # return [] - # ## - # # if isinstance(lst[-1], Gruppo): - # # lst = lst[-1].g_unpack() - # ## - - # for elem in lst: - # if isinstance(elem, Gruppo): - # for x in elem.g_unpack(): - # yield x - # else: - # yield elem - - # l1 = list(_genflatten(self.objects)) - # return l1 - - def recursive_unpack(self): - """Flatten out an Gruppo.""" - flatlist = [] - for o1 in self.objects: - if isinstance(o1, Gruppo): - for o2 in o1.objects: - if isinstance(o2, Gruppo): - for o3 in o2.objects: - if isinstance(o3, Gruppo): - for o4 in o3.objects: - if isinstance(o3, Gruppo): - print("Warning: Gruppo.recursive_unpack() is limited to 4 levels") - else: - flatlist.append(o4) - else: - flatlist.append(o3) - else: - flatlist.append(o2) - else: - flatlist.append(o1) - return flatlist - - def unpack(self, i=None): - """Unpack the list of objects from a ``Gruppo``. - - If `i` is given, get `i-th` object from a ``Gruppo``. - Input can be a string, in this case returns the first object - whose name contains the given string. - - Examples: - - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) - """ - if i is None: - return self.objects - elif isinstance(i, int): - return self.objects[i] - elif isinstance(i, str): - for m in self.objects: - if i in m.name: - return m - - def pos(self, *p): - """Set object position.""" - if len(p) == 0: - return self.transform.position - q = self.transform.position - LT = LinearTransform().translate(-q +p) - self.transform.concatenate(LT) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - def rotate_x(self, angle, rad=False, around=None): - """ - Rotate around x-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_x(angle, rad, around) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - def rotate_y(self, angle, rad=False, around=None): - """ - Rotate around y-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_y(angle, rad, around) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - def rotate_z(self, angle, rad=False, around=None): - """ - Rotate around z-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_z(angle, rad, around) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - def x(self, val=None): - """Set/Get object position along x axis.""" - p = self.transform.position - if val is None: - return p[0] - self.pos(val, p[1], p[2]) - return self - - def y(self, val=None): - """Set/Get object position along y axis.""" - p = self.transform.position - if val is None: - return p[1] - self.pos(p[0], val, p[2]) - return self - - def z(self, val=None): - """Set/Get object position along z axis.""" - p = self.transform.position - if val is None: - return p[2] - self.pos(p[0], p[1], val) - return self - - def shift(self, *ds): - """Add a shift to the current object position.""" - LT = LinearTransform().translate(ds) - self.transform.concatenate(LT) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - def scale(self, s=None, reset=False, origin=True): - """ - Set/get object's scaling factor. - - Arguments: - s : (list, float) - scaling factor(s). - reset : (bool) - if True previous scaling factors are ignored. - origin : (bool) - if True scaling is applied with respect to object's position, - otherwise is applied respect to (0,0,0). - - Note: - use `s=(sx,sy,sz)` to scale differently in the three coordinates. - """ - if s is None: - return np.array(self.transform.T.GetScale()) - - if not _is_sequence(s): - s = [s, s, s] - - LT = LinearTransform() - if reset: - old_s = np.array(self.transform.T.GetScale()) - LT.scale(s / old_s) - else: - if origin is True: - LT.scale(s, origin=self.transform.position) - elif origin is False: - LT.scale(s, origin=False) - else: - LT.scale(s, origin=origin) +# # return self.objects + +# # def r_unpack(self): +# # """Flatten out an Gruppo.""" + +# # def _genflatten(lst): +# # if not lst: +# # return [] +# # ## +# # # if isinstance(lst[-1], Gruppo): +# # # lst = lst[-1].g_unpack() +# # ## + +# # for elem in lst: +# # if isinstance(elem, Gruppo): +# # for x in elem.g_unpack(): +# # yield x +# # else: +# # yield elem + +# # l1 = list(_genflatten(self.objects)) +# # return l1 + +# def recursive_unpack(self): +# """Flatten out an Gruppo.""" +# flatlist = [] +# for o1 in self.objects: +# if isinstance(o1, Gruppo): +# for o2 in o1.objects: +# if isinstance(o2, Gruppo): +# for o3 in o2.objects: +# if isinstance(o3, Gruppo): +# for o4 in o3.objects: +# if isinstance(o3, Gruppo): +# print("Warning: Gruppo.recursive_unpack() is limited to 4 levels") +# else: +# flatlist.append(o4) +# else: +# flatlist.append(o3) +# else: +# flatlist.append(o2) +# else: +# flatlist.append(o1) +# return flatlist + +# def unpack(self, i=None): +# """Unpack the list of objects from a ``Gruppo``. + +# If `i` is given, get `i-th` object from a ``Gruppo``. +# Input can be a string, in this case returns the first object +# whose name contains the given string. + +# Examples: +# - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) +# """ +# if i is None: +# return self.objects +# elif isinstance(i, int): +# return self.objects[i] +# elif isinstance(i, str): +# for m in self.objects: +# if i in m.name: +# return m + +# def pos(self, *p): +# """Set object position.""" +# if len(p) == 0: +# return self.transform.position +# q = self.transform.position +# LT = LinearTransform().translate(-q +p) +# self.transform.concatenate(LT) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + +# def rotate_x(self, angle, rad=False, around=None): +# """ +# Rotate around x-axis. If angle is in radians set `rad=True`. + +# Use `around` to define a pivoting point. +# """ +# LT = LinearTransform().rotate_x(angle, rad, around) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + +# def rotate_y(self, angle, rad=False, around=None): +# """ +# Rotate around y-axis. If angle is in radians set `rad=True`. + +# Use `around` to define a pivoting point. +# """ +# LT = LinearTransform().rotate_y(angle, rad, around) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + +# def rotate_z(self, angle, rad=False, around=None): +# """ +# Rotate around z-axis. If angle is in radians set `rad=True`. + +# Use `around` to define a pivoting point. +# """ +# LT = LinearTransform().rotate_z(angle, rad, around) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + +# def x(self, val=None): +# """Set/Get object position along x axis.""" +# p = self.transform.position +# if val is None: +# return p[0] +# self.pos(val, p[1], p[2]) +# return self + +# def y(self, val=None): +# """Set/Get object position along y axis.""" +# p = self.transform.position +# if val is None: +# return p[1] +# self.pos(p[0], val, p[2]) +# return self + +# def z(self, val=None): +# """Set/Get object position along z axis.""" +# p = self.transform.position +# if val is None: +# return p[2] +# self.pos(p[0], p[1], val) +# return self + +# def shift(self, *ds): +# """Add a shift to the current object position.""" +# LT = LinearTransform().translate(ds) +# self.transform.concatenate(LT) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + +# def scale(self, s=None, reset=False, origin=True): +# """ +# Set/get object's scaling factor. + +# Arguments: +# s : (list, float) +# scaling factor(s). +# reset : (bool) +# if True previous scaling factors are ignored. +# origin : (bool) +# if True scaling is applied with respect to object's position, +# otherwise is applied respect to (0,0,0). + +# Note: +# use `s=(sx,sy,sz)` to scale differently in the three coordinates. +# """ +# if s is None: +# return np.array(self.transform.T.GetScale()) + +# if not _is_sequence(s): +# s = [s, s, s] + +# LT = LinearTransform() +# if reset: +# old_s = np.array(self.transform.T.GetScale()) +# LT.scale(s / old_s) +# else: +# if origin is True: +# LT.scale(s, origin=self.transform.position) +# elif origin is False: +# LT.scale(s, origin=False) +# else: +# LT.scale(s, origin=origin) - self.transform.concatenate(LT) - for o in self.recursive_unpack(): - o.apply_transform(LT) - return self - - - def bounds(self): - """ - Get the object bounds. - Returns a list in format [xmin,xmax, ymin,ymax]. - """ - return self.actor.GetBounds() - - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) - - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) - - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) +# self.transform.concatenate(LT) +# for o in self.recursive_unpack(): +# o.apply_transform(LT) +# return self + + +# def bounds(self): +# """ +# Get the object bounds. +# Returns a list in format [xmin,xmax, ymin,ymax]. +# """ +# return self.actor.GetBounds() + +# def xbounds(self, i=None): +# """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" +# b = self.bounds() +# if i is not None: +# return b[i] +# return (b[0], b[1]) + +# def ybounds(self, i=None): +# """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" +# b = self.bounds() +# if i == 0: +# return b[2] +# if i == 1: +# return b[3] +# return (b[2], b[3]) + +# def zbounds(self, i=None): +# """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" +# b = self.bounds() +# if i == 0: +# return b[4] +# if i == 1: +# return b[5] +# return (b[4], b[5]) - def show(self, **options): - """ - Create on the fly an instance of class ``Plotter`` or use the last existing one to - show one single object. +# def show(self, **options): +# """ +# Create on the fly an instance of class ``Plotter`` or use the last existing one to +# show one single object. - This method is meant as a shortcut. If more than one object needs to be visualised - please use the syntax `show(mesh1, mesh2, volume, ..., options)`. +# This method is meant as a shortcut. If more than one object needs to be visualised +# please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - Returns the ``Plotter`` class instance. - """ - return vedo.plotter.show(self, **options) +# Returns the ``Plotter`` class instance. +# """ +# return vedo.plotter.show(self, **options) diff --git a/vedo/utils.py b/vedo/utils.py index cca7f219..0c6d696f 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -437,6 +437,8 @@ def numpy2vtk(arr, dtype=None, deep=True, name=""): varr = numpy_to_vtk(arr.astype(dtype), deep=deep) else: # let numpy_to_vtk() decide what is best type based on arr type + if arr.dtype == np.bool_: + arr = arr.astype(np.uint8) varr = numpy_to_vtk(arr, deep=deep) if name: From ee278b259404aa2e3ce8b8ed0ddbf5013a6f11ee Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 16:30:40 +0200 Subject: [PATCH 067/251] first try to reshuffle class structure --- docs/changes.md | 1 - vedo/base.py | 14 - vedo/mesh.py | 215 ++----- vedo/pointcloud.py | 1457 +++----------------------------------------- vedo/shapes.py | 7 +- vedo/volume.py | 103 ++++ 6 files changed, 253 insertions(+), 1544 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index b35e40a7..866f0d81 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -55,7 +55,6 @@ ssao.py ~/Projects/vedo/examples/advanced cut_with_mesh1.py -fitspheres2.py gyroid.py interpolate_scalar3.py mesh_smoother1.py diff --git a/vedo/base.py b/vedo/base.py index a6fdfc5c..7793e4ae 100644 --- a/vedo/base.py +++ b/vedo/base.py @@ -850,20 +850,6 @@ class BaseActor(Base3DProp): .. warning:: Do not use this class to instantiate objects, use one the above instead. """ - - def __init__(self): - """ - Base class to add operative and data - functionality to `Mesh`, `Assembly`, `Volume` and `Picture` objects. - """ - - super().__init__() - - self.mapper = None - self._caption = None - self.property = None - - def inputdata(self): """Obsolete, use `self` instead.""" print("WARNING: inputdata() is obsolete, use self instead.") diff --git a/vedo/mesh.py b/vedo/mesh.py index c6101b21..2ab96ed5 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -14,6 +14,7 @@ from vedo.pointcloud import Points from vedo.utils import buildPolyData, is_sequence, mag, mag2, precision from vedo.utils import numpy2vtk, vtk2numpy, OperationNode +from vedo.visuals import MeshVisual __docformat__ = "google" @@ -25,145 +26,6 @@ __all__ = ["Mesh"] -class MeshVisual: - """Class to manage the visual aspects of a ``Maesh`` object.""" - - def follow_camera(self, camera=None, origin=None): - """ - Return an object that will follow camera movements and stay locked to it. - Use `mesh.follow_camera(False)` to disable it. - - A `vtkCamera` object can also be passed. - """ - if camera is False: - try: - self.SetCamera(None) - return self - except AttributeError: - return self - - factor = vtk.vtkFollower() - factor.SetMapper(self.mapper) - factor.SetProperty(self.property) - factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) - factor.SetTexture(self.actor.GetTexture()) - factor.SetScale(self.actor.GetScale()) - factor.SetOrientation(self.actor.GetOrientation()) - factor.SetPosition(self.actor.GetPosition()) - factor.SetUseBounds(self.actor.GetUseBounds()) - - factor.SetOrigin(self.actor.GetOrigin()) - - factor.PickableOff() - - if isinstance(camera, vtk.vtkCamera): - factor.SetCamera(camera) - else: - plt = vedo.plotter_instance - if plt and plt.renderer and plt.renderer.GetActiveCamera(): - factor.SetCamera(plt.renderer.GetActiveCamera()) - - if origin is not None: - factor.SetOrigin(origin) - - self.actor = None - factor.data = self - self.actor = factor - return self - - - def wireframe(self, value=True): - """Set mesh's representation as wireframe or solid surface.""" - if value: - self.property.SetRepresentationToWireframe() - else: - self.property.SetRepresentationToSurface() - return self - - def flat(self): - """Set surface interpolation to flat. - - - """ - self.property.SetInterpolationToFlat() - return self - - def phong(self): - """Set surface interpolation to "phong".""" - self.property.SetInterpolationToPhong() - return self - - def backface_culling(self, value=True): - """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetBackfaceCulling(value) - return self - - def render_lines_as_tubes(self, value=True): - """Wrap a fake tube around a simple line for visualization""" - self.property.SetRenderLinesAsTubes(value) - return self - - def frontface_culling(self, value=True): - """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetFrontfaceCulling(value) - return self - - def backcolor(self, bc=None): - """ - Set/get mesh's backface color. - """ - back_prop = self.actor.GetBackfaceProperty() - - if bc is None: - if back_prop: - return back_prop.GetDiffuseColor() - return self - - if self.property.GetOpacity() < 1: - return self - - if not back_prop: - back_prop = vtk.vtkProperty() - - back_prop.SetDiffuseColor(get_color(bc)) - back_prop.SetOpacity(self.property.GetOpacity()) - self.actor.SetBackfaceProperty(back_prop) - self.mapper.ScalarVisibilityOff() - return self - - def bc(self, backcolor=False): - """Shortcut for `mesh.backcolor()`.""" - return self.backcolor(backcolor) - - def linewidth(self, lw=None): - """Set/get width of mesh edges. Same as `lw()`.""" - if lw is not None: - if lw == 0: - self.property.EdgeVisibilityOff() - self.property.SetRepresentationToSurface() - return self - self.property.EdgeVisibilityOn() - self.property.SetLineWidth(lw) - else: - return self.property.GetLineWidth() - return self - - def lw(self, linewidth=None): - """Set/get width of mesh edges. Same as `linewidth()`.""" - return self.linewidth(linewidth) - - def linecolor(self, lc=None): - """Set/get color of mesh edges. Same as `lc()`.""" - if lc is None: - return self.property.GetEdgeColor() - self.property.EdgeVisibilityOn() - self.property.SetEdgeColor(get_color(lc)) - return self - - def lc(self, linecolor=None): - """Set/get color of mesh edges. Same as `linecolor()`.""" - return self.linecolor(linecolor) - #################################################### class Mesh(MeshVisual, Points): @@ -400,32 +262,32 @@ def faces(self, ids=()): return conn[ids] return conn # cannot always make a numpy array of it! - @property - def cells(self): - """ - Get cell polygonal connectivity ids as a python `list`. - The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - - If ids is set, return only the faces of the given cells. - """ - arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) - - # Get cell connettivity ids as a 1D array. vtk format is: - # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - if len(arr1d) == 0: - arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) + # @property + # def cells(self): + # """ + # Get cell polygonal connectivity ids as a python `list`. + # The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - i = 0 - conn = [] - n = len(arr1d) - if n: - while True: - cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] - conn.append(cell) - i += arr1d[i] + 1 - if i >= n: - break - return conn # cannot always make a numpy array of it! + # If ids is set, return only the faces of the given cells. + # """ + # arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) + + # # Get cell connettivity ids as a 1D array. vtk format is: + # # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. + # if len(arr1d) == 0: + # arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) + + # i = 0 + # conn = [] + # n = len(arr1d) + # if n: + # while True: + # cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] + # conn.append(cell) + # i += arr1d[i] + 1 + # if i >= n: + # break + # return conn # cannot always make a numpy array of it! @property def lines(self): @@ -1300,6 +1162,15 @@ def compute_quality(self, metric=6): self.pipeline = OperationNode("compute_quality", parents=[self]) return self + def count_vertices(self): + """Count the number of vertices each cell has and return it as a numpy array""" + vc = vtk.vtkCountVertices() + vc.SetInputData(self.datset) + vc.SetOutputArrayName("VertexCount") + vc.Update() + varr = vc.GetOutput().GetCellData().GetArray("VertexCount") + return vtk2numpy(varr) + def check_validity(self, tol=0): """ Return an array of possible problematic faces following this convention: @@ -1474,6 +1345,22 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): ) return self + def delete_cells(self, ids): + """ + Remove cells from the mesh object by their ID. + Points (vertices) are not removed (you may use `.clean()` to remove those). + """ + self.BuildLinks() + for cid in ids: + self.DeleteCell(cid) + self.RemoveDeletedCells() + self.Modified() + self.mapper.Modified() + self.pipeline = OperationNode( + "delete_cells", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" + ) + return self + def collapse_edges(self, distance, iterations=1): """Collapse mesh edges so that are all above distance.""" self.clean() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 70a521eb..8779949e 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import time import numpy as np try: @@ -11,6 +12,7 @@ from vedo import colors from vedo import utils from vedo.base import BaseActor +from vedo.visuals import PointsVisual from vedo.transformations import LinearTransform __docformat__ = "google" @@ -464,1368 +466,16 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): .. note:: if you are creating many points you should definitely use class `Points` instead! """ - if isinstance(pos, vedo.Base3DProp): + try: pos = pos.pos() - if len(pos) == 2: - pos = (pos[0], pos[1], 0.0) + except AttributeError: + pass pt = Points([[0,0,0]], r, c, alpha) pt.pos(pos) pt.name = "Point" return pt -################################################### -class PointsVisual: - """Class to manage the visual aspects of a ``Points`` object.""" - - def __init__(self): - - self.actor = vtk.vtkActor() - self.property = self.actor.GetProperty() - self.mapper = vtk.vtkPolyDataMapper() - - self.property_backface = self.actor.GetBackfaceProperty() - - self._scals_idx = 0 # index of the active scalar changed from CLI - self._ligthingnr = 0 # index of the lighting mode changed from CLI - self._cmap_name = "" # remember the cmap name for self._keypress - - try: - self.property.RenderPointsAsSpheresOn() - except AttributeError: - pass - - ################################################## - def copy_properties_from(self, source, deep=True, actor_related=True): - """ - Copy properties from another ``Points`` object. - """ - pr = vtk.vtkProperty() - if deep: - pr.DeepCopy(source.property) - else: - pr.ShallowCopy(source.property) - self.actor.SetProperty(pr) - self.property = pr - - if self.actor.GetBackfaceProperty(): - bfpr = vtk.vtkProperty() - bfpr.DeepCopy(source.actor.GetBackfaceProperty()) - self.actor.SetBackfaceProperty(bfpr) - self.property_backface = bfpr - - if not actor_related: - return self - - # mapper related: - self.mapper.SetScalarVisibility(source.mapper.GetScalarVisibility()) - self.mapper.SetScalarMode(source.mapper.GetScalarMode()) - self.mapper.SetScalarRange(source.mapper.GetScalarRange()) - self.mapper.SetLookupTable(source.mapper.GetLookupTable()) - self.mapper.SetColorMode(source.mapper.GetColorMode()) - self.mapper.SetInterpolateScalarsBeforeMapping(source.mapper.GetInterpolateScalarsBeforeMapping()) - self.mapper.SetUseLookupTableScalarRange(source.mapper.GetUseLookupTableScalarRange()) - - self.actor.SetPickable(source.actor.GetPickable()) - self.actor.SetDragable(source.actor.GetDragable()) - self.actor.SetTexture(source.actor.GetTexture()) - self.actor.SetVisibility(source.actor.GetVisibility()) - return self - - def color(self, c=False, alpha=None): - """ - Set/get mesh's color. - If None is passed as input, will use colors from active scalars. - Same as `mesh.c()`. - """ - # overrides base.color() - if c is False: - return np.array(self.property.GetColor()) - if c is None: - self.mapper.ScalarVisibilityOn() - return self - self.mapper.ScalarVisibilityOff() - cc = colors.get_color(c) - self.property.SetColor(cc) - if self.trail: - self.trail.GetProperty().SetColor(cc) - if alpha is not None: - self.alpha(alpha) - return self - - def c(self, color=False, alpha=None): - """ - Shortcut for `color()`. - If None is passed as input, will use colors from current active scalars. - """ - return self.color(color, alpha) - - def alpha(self, opacity=None): - """Set/get mesh's transparency. Same as `mesh.opacity()`.""" - if opacity is None: - return self.property.GetOpacity() - - self.property.SetOpacity(opacity) - bfp = self.actor.GetBackfaceProperty() - if bfp: - if opacity < 1: - self.property_backface = bfp - self.actor.SetBackfaceProperty(None) - else: - self.actor.SetBackfaceProperty(self.property_backface) - return self - - - def opacity(self, alpha=None): - """Set/get mesh's transparency. Same as `mesh.alpha()`.""" - return self.alpha(alpha) - - def force_opaque(self, value=True): - """ Force the Mesh, Line or point cloud to be treated as opaque""" - ## force the opaque pass, fixes picking in vtk9 - # but causes other bad troubles with lines.. - self.actor.SetForceOpaque(value) - return self - - def force_translucent(self, value=True): - """ Force the Mesh, Line or point cloud to be treated as translucent""" - self.actor.SetForceTranslucent(value) - return self - - def point_size(self, value=None): - """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" - if value is None: - return self.property.GetPointSize() - #self.property.SetRepresentationToSurface() - else: - self.property.SetRepresentationToPoints() - self.property.SetPointSize(value) - return self - - def ps(self, pointsize=None): - """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" - return self.point_size(pointsize) - - def render_points_as_spheres(self, value=True): - """Make points look spheric or else make them look as squares.""" - self.property.SetRenderPointsAsSpheres(value) - return self - - def lighting( - self, - style="", - ambient=None, - diffuse=None, - specular=None, - specular_power=None, - specular_color=None, - metallicity=None, - roughness=None, - ): - """ - Set the ambient, diffuse, specular and specular_power lighting constants. - - Arguments: - style : (str) - preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` - ambient : (float) - ambient fraction of emission [0-1] - diffuse : (float) - emission of diffused light in fraction [0-1] - specular : (float) - fraction of reflected light [0-1] - specular_power : (float) - precision of reflection [1-100] - specular_color : (color) - color that is being reflected by the surface - - - - Examples: - - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) - """ - pr = self.property - - if style: - - if isinstance(pr, vtk.vtkVolumeProperty): - self.shade(True) - if style == "off": - self.shade(False) - elif style == "ambient": - style = "default" - self.shade(False) - else: - if style != "off": - pr.LightingOn() - - if style == "off": - pr.SetInterpolationToFlat() - pr.LightingOff() - return self ############## - - if hasattr(pr, "GetColor"): # could be Volume - c = pr.GetColor() - else: - c = (1, 1, 0.99) - mpr = self.mapper - if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): - c = (1,1,0.99) - if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] - elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] - elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] - elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] - elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] - elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] - else: - vedo.logger.error("in lighting(): Available styles are") - vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") - raise RuntimeError() - pr.SetAmbient(pars[0]) - pr.SetDiffuse(pars[1]) - pr.SetSpecular(pars[2]) - pr.SetSpecularPower(pars[3]) - if hasattr(pr, "GetColor"): - pr.SetSpecularColor(pars[4]) - - if ambient is not None: pr.SetAmbient(ambient) - if diffuse is not None: pr.SetDiffuse(diffuse) - if specular is not None: pr.SetSpecular(specular) - if specular_power is not None: pr.SetSpecularPower(specular_power) - if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) - if utils.vtk_version_at_least(9): - if metallicity is not None: - pr.SetInterpolationToPBR() - pr.SetMetallic(metallicity) - if roughness is not None: - pr.SetInterpolationToPBR() - pr.SetRoughness(roughness) - - return self - - def point_blurring(self, r=1, emissive=False): - """Set point blurring. - Apply a gaussian convolution filter to the points. - In this case the radius `r` is in absolute units of the mesh coordinates. - With emissive set, the halo of point becomes light-emissive. - """ - self.property.SetRepresentationToPoints() - if emissive: - self.mapper.SetEmissive(bool(emissive)) - self.mapper.SetScaleFactor(r * 1.4142) - - # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ - if alpha < 1: - self.mapper.SetSplatShaderCode( - "//VTK::Color::Impl\n" - "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" - "if (dist > 1.0) {\n" - " discard;\n" - "} else {\n" - f" float scale = ({alpha} - dist);\n" - " ambientColor *= scale;\n" - " diffuseColor *= scale;\n" - "}\n" - ) - alpha = 1 - - self.mapper.Modified() - self.actor.Modified() - self.property.SetOpacity(alpha) - self.actor.SetMapper(self.mapper) - return self - - - @property - def cellcolors(self): - """ - Colorize each cell (face) of a mesh by passing - a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. - Colors levels and opacities must be in the range [0,255]. - - A single constant color can also be passed as string or RGBA. - - A cell array named "CellsRGBA" is automatically created. - - Examples: - - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) - - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) - - ![](https://vedo.embl.es/images/basic/colorMeshCells.png) - """ - if "CellsRGBA" not in self.celldata.keys(): - lut = self.mapper.GetLookupTable() - vscalars = self.dataset.GetCellData().GetScalars() - if vscalars is None or lut is None: - arr = np.zeros([self.ncells, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) - col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() - alf = np.round(alf * 255).astype(np.uint8) - arr[:, (0, 1, 2)] = col - arr[:, 3] = alf - else: - cols = lut.MapScalars(vscalars, 0, 0) - arr = utils.vtk2numpy(cols) - self.celldata["CellsRGBA"] = arr - self.celldata.select("CellsRGBA") - return self.celldata["CellsRGBA"] - - @cellcolors.setter - def cellcolors(self, value): - if isinstance(value, str): - c = colors.get_color(value) - value = np.array([*c, 1]) * 255 - value = np.round(value) - - value = np.asarray(value) - n = self.ncells - - if value.ndim == 1: - value = np.repeat([value], n, axis=0) - - if value.shape[1] == 3: - z = np.zeros((n, 1), dtype=np.uint8) - value = np.append(value, z + 255, axis=1) - - assert n == value.shape[0] - - self.celldata["CellsRGBA"] = value.astype(np.uint8) - self.celldata.select("CellsRGBA") - - - @property - def pointcolors(self): - """ - Colorize each point (or vertex of a mesh) by passing - a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. - Colors levels and opacities must be in the range [0,255]. - - A single constant color can also be passed as string or RGBA. - - A point array named "PointsRGBA" is automatically created. - """ - if "PointsRGBA" not in self.pointdata.keys(): - lut = self.mapper.GetLookupTable() - vscalars = self.dataset.GetPointData().GetScalars() - if vscalars is None or lut is None: - arr = np.zeros([self.npoints, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) - col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() - alf = np.round(alf * 255).astype(np.uint8) - arr[:, (0, 1, 2)] = col - arr[:, 3] = alf - else: - cols = lut.MapScalars(vscalars, 0, 0) - arr = utils.vtk2numpy(cols) - self.pointdata["PointsRGBA"] = arr - self.pointdata.select("PointsRGBA") - return self.pointdata["PointsRGBA"] - - @pointcolors.setter - def pointcolors(self, value): - if isinstance(value, str): - c = colors.get_color(value) - value = np.array([*c, 1]) * 255 - value = np.round(value) - - value = np.asarray(value) - n = self.npoints - - if value.ndim == 1: - value = np.repeat([value], n, axis=0) - - if value.shape[1] == 3: - z = np.zeros((n, 1), dtype=np.uint8) - value = np.append(value, z + 255, axis=1) - - assert n == value.shape[0] - - self.pointdata["PointsRGBA"] = value.astype(np.uint8) - self.pointdata.select("PointsRGBA") - - ##################################################################################### - def cmap( - self, - input_cmap, - input_array=None, - on="points", - name="Scalars", - vmin=None, - vmax=None, - n_colors=256, - alpha=1.0, - logscale=False, - ): - """ - Set individual point/cell colors by providing a list of scalar values and a color map. - - Arguments: - input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) - color map scheme to transform a real number into a color. - input_array : (str, list, vtkArray) - can be the string name of an existing array, a numpy array or a `vtkArray`. - on : (str) - either 'points' or 'cells'. - Apply the color map to data which is defined on either points or cells. - name : (str) - give a name to the provided numpy array (if input_array is a numpy array) - vmin : (float) - clip scalars to this minimum value - vmax : (float) - clip scalars to this maximum value - n_colors : (int) - number of distinct colors to be used in colormap table. - alpha : (float, list) - Mesh transparency. Can be a `list` of values one for each vertex. - logscale : (bool) - Use logscale - - Examples: - - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) - - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) - (and many others) - - ![](https://vedo.embl.es/images/basic/mesh_custom.png) - """ - self._cmap_name = input_cmap - - if input_array is None: - if not self.pointdata.keys() and self.celldata.keys(): - on = "cells" - if not self.dataset.GetCellData().GetScalars(): - input_array = 0 # pick the first at hand - - if on.startswith("point"): - data = self.dataset.GetPointData() - n = self.dataset.GetNumberOfPoints() - elif on.startswith("cell"): - data = self.dataset.GetCellData() - n = self.dataset.GetNumberOfCells() - else: - vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") - raise RuntimeError() - - if input_array is None: # if None try to fetch the active scalars - arr = data.GetScalars() - if not arr: - vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") - return self - - if not arr.GetName(): # sometimes arrays dont have a name.. - arr.SetName(name) - - elif isinstance(input_array, str): # if a string is passed - arr = data.GetArray(input_array) - if not arr: - vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") - return self - - elif isinstance(input_array, int): # if an int is passed - if input_array < data.GetNumberOfArrays(): - arr = data.GetArray(input_array) - else: - vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") - return self - - elif utils.is_sequence(input_array): # if a numpy array is passed - npts = len(input_array) - if npts != n: - vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") - return self - arr = utils.numpy2vtk(input_array, name=name, dtype=float) - data.AddArray(arr) - data.Modified() - - elif isinstance(input_array, vtk.vtkArray): # if a vtkArray is passed - arr = input_array - data.AddArray(arr) - data.Modified() - - else: - vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") - raise RuntimeError() - - # Now we have array "arr" - array_name = arr.GetName() - - if arr.GetNumberOfComponents() == 1: - if vmin is None: - vmin = arr.GetRange()[0] - if vmax is None: - vmax = arr.GetRange()[1] - else: - if vmin is None or vmax is None: - vn = utils.mag(utils.vtk2numpy(arr)) - if vmin is None: - vmin = vn.min() - if vmax is None: - vmax = vn.max() - - # interpolate alphas if they are not constant - if not utils.is_sequence(alpha): - alpha = [alpha] * n_colors - else: - v = np.linspace(0, 1, n_colors, endpoint=True) - xp = np.linspace(0, 1, len(alpha), endpoint=True) - alpha = np.interp(v, xp, alpha) - - ########################### build the look-up table - if isinstance(input_cmap, vtk.vtkLookupTable): # vtkLookupTable - lut = input_cmap - - elif utils.is_sequence(input_cmap): # manual sequence of colors - lut = vtk.vtkLookupTable() - if logscale: - lut.SetScaleToLog10() - lut.SetRange(vmin, vmax) - ncols = len(input_cmap) - lut.SetNumberOfTableValues(ncols) - - for i, c in enumerate(input_cmap): - r, g, b = colors.get_color(c) - lut.SetTableValue(i, r, g, b, alpha[i]) - lut.Build() - - else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap - lut = vtk.vtkLookupTable() - if logscale: - lut.SetScaleToLog10() - lut.SetVectorModeToMagnitude() - lut.SetRange(vmin, vmax) - lut.SetNumberOfTableValues(n_colors) - mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) - for i, c in enumerate(mycols): - r, g, b = c - lut.SetTableValue(i, r, g, b, alpha[i]) - lut.Build() - - arr.SetLookupTable(lut) - - data.SetActiveScalars(array_name) - # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars - # data.SetActiveAttribute(array_name, 0) # boh! - - if data.GetScalars(): - data.GetScalars().SetLookupTable(lut) - data.GetScalars().Modified() - - self.mapper.SetLookupTable(lut) - self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars - - self.mapper.ScalarVisibilityOn() - self.mapper.SetScalarRange(lut.GetRange()) - if on.startswith("point"): - self.mapper.SetScalarModeToUsePointData() - else: - self.mapper.SetScalarModeToUseCellData() - if hasattr(self.mapper, "SetArrayName"): - self.mapper.SetArrayName(array_name) - - return self - - def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): - """ - Add a trailing line to mesh. - This new mesh is accessible through `mesh.trail`. - - Arguments: - offset : (float) - set an offset vector from the object center. - n : (int) - number of segments - lw : (float) - line width of the trail - - Examples: - - [trail.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/trail.py) - - ![](https://vedo.embl.es/images/simulations/trail.gif) - - - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) - """ - if self.trail is None: - pos = self.pos() - self.trail_offset = np.asarray(offset) - self.trail_points = [pos] * n - - if c is None: - col = self.property.GetColor() - else: - col = colors.get_color(c) - - tline = vedo.shapes.Line(pos, pos, res=n, c=col, alpha=alpha, lw=lw) - self.trail = tline # holds the Line - return self - - def update_trail(self): - """ - Update the trailing line of a moving object. - """ - currentpos = self.pos() - - self.trail_points.append(currentpos) # cycle - self.trail_points.pop(0) - - data = np.array(self.trail_points) - currentpos + self.trail_offset - tpoly = self.trail.dataset - tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) - self.trail.pos(currentpos) - return self - - - def _compute_shadow(self, plane, point, direction): - shad = self.clone() - shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords - shad.name = "Shadow" - - pts = shad.vertices - if plane == 'x': - # shad = shad.project_on_plane('x') - # instead do it manually so in case of alpha<1 - # we dont see glitches due to coplanar points - # we leave a small tolerance of 0.1% in thickness - x0, x1 = self.xbounds() - pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] - shad.vertices = pts - shad.x(point) - elif plane == 'y': - x0, x1 = self.ybounds() - pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] - shad.vertices = pts - shad.y(point) - elif plane == "z": - x0, x1 = self.zbounds() - pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[2] - shad.vertices = pts - shad.z(point) - else: - shad = shad.project_on_plane(plane, point, direction) - return shad - - def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, culling=0): - """ - Generate a shadow out of an `Mesh` on one of the three Cartesian planes. - The output is a new `Mesh` representing the shadow. - This new mesh is accessible through `mesh.shadow`. - By default the shadow mesh is placed on the bottom wall of the bounding box. - - See also `pointcloud.project_on_plane()`. - - Arguments: - plane : (str, Plane) - if plane is `str`, plane can be one of `['x', 'y', 'z']`, - represents x-plane, y-plane and z-plane, respectively. - Otherwise, plane should be an instance of `vedo.shapes.Plane` - point : (float, array) - if plane is `str`, point should be a float represents the intercept. - Otherwise, point is the camera point of perspective projection - direction : (list) - direction of oblique projection - culling : (int) - choose between front [1] or backface [-1] culling or None. - - Examples: - - [shadow1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shadow1.py) - - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) - - ![](https://vedo.embl.es/images/simulations/57341963-b8910900-713c-11e9-898a-84b6d3712bce.gif) - """ - shad = self._compute_shadow(plane, point, direction) - shad.c(c).alpha(alpha) - - try: - # Points dont have these methods - shad.flat() - if culling in (1, True): - shad.frontface_culling() - elif culling == -1: - shad.backface_culling() - except AttributeError: - pass - - shad.property.LightingOff() - shad.actor.SetPickable(False) - shad.actor.SetUseBounds(True) - - if shad not in self.shadows: - self.shadows.append(shad) - shad.info = dict(plane=plane, point=point, direction=direction) - return self - - def update_shadows(self): - """ - Update the shadows of a moving object. - """ - for sha in self.shadows: - plane = sha.info['plane'] - point = sha.info['point'] - direction = sha.info['direction'] - new_sha = self._compute_shadow(plane, point, direction) - # sha.DeepCopy(new_sha) - sha._update(new_sha.dataset) - return self - - - def labels( - self, - content=None, - on="points", - scale=None, - xrot=0.0, - yrot=0.0, - zrot=0.0, - ratio=1, - precision=None, - italic=False, - font="", - justify="bottom-left", - c="black", - alpha=1.0, - cells=None, - ): - """ - Generate value or ID labels for mesh cells or points. - For large nr. of labels use `font="VTK"` which is much faster. - - See also: - `labels2d()`, `flagpole()`, `caption()` and `legend()`. - - Arguments: - content : (list,int,str) - either 'id', 'cellid', array name or array number. - A array can also be passed (must match the nr. of points or cells). - on : (str) - generate labels for "cells" instead of "points" - scale : (float) - absolute size of labels, if left as None it is automatic - zrot : (float) - local rotation angle of label in degrees - ratio : (int) - skipping ratio, to reduce nr of labels for large meshes - precision : (int) - numeric precision of labels - - ```python - from vedo import * - s = Sphere(res=10).linewidth(1).c("orange").compute_normals() - point_ids = s.labels('id', on="points").c('green') - cell_ids = s.labels('id', on="cells" ).c('black') - show(s, point_ids, cell_ids) - ``` - ![](https://vedo.embl.es/images/feats/labels.png) - - Examples: - - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) - - ![](https://vedo.embl.es/images/basic/boundaries.png) - """ - if cells is not None: # deprecation message - vedo.logger.warning("In labels(cells=...) please use labels(on='cells') instead") - - if "cell" in on or "face" in on: - cells = True - - if isinstance(content, str): - if content in ("cellid", "cellsid"): - cells = True - content = "id" - - if cells: - elems = self.cell_centers - # norms = self.normals(cells=True, recompute=False) - norms = self.cell_normals - ns = np.sqrt(self.ncells) - else: - elems = self.vertices - # norms = self.normals(cells=False, recompute=False) - norms = self.vertex_normals - ns = np.sqrt(self.npoints) - - hasnorms = False - if len(norms) > 0: - hasnorms = True - - if scale is None: - if not ns: - ns = 100 - scale = self.diagonal_size() / ns / 10 - - arr = None - mode = 0 - if content is None: - mode = 0 - if cells: - if self.dataset.GetCellData().GetScalars(): - name = self.dataset.GetCellData().GetScalars().GetName() - arr = self.celldata[name] - else: - if self.dataset.GetPointData().GetScalars(): - name = self.dataset.GetPointData().GetScalars().GetName() - arr = self.pointdata[name] - elif isinstance(content, (str, int)): - if content == "id": - mode = 1 - elif cells: - mode = 0 - arr = self.celldata[content] - else: - mode = 0 - arr = self.pointdata[content] - elif utils.is_sequence(content): - mode = 0 - arr = content - # print('WEIRD labels() test', content) - # exit() - - if arr is None and mode == 0: - vedo.logger.error("in labels(), array not found for points or cells") - return None - - tapp = vtk.vtkAppendPolyData() - ninputs = 0 - - for i, e in enumerate(elems): - if i % ratio: - continue - - if mode == 1: - txt_lab = str(i) - else: - if precision: - txt_lab = utils.precision(arr[i], precision) - else: - txt_lab = str(arr[i]) - - if not txt_lab: - continue - - if font == "VTK": - tx = vtk.vtkVectorText() - tx.SetText(txt_lab) - tx.Update() - tx_poly = tx.GetOutput() - else: - tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify).dataset - - if tx_poly.GetPointData() == 0: - continue ####################### - ninputs += 1 - - T = vtk.vtkTransform() - T.PostMultiply() - if italic: - T.Concatenate([1,0.2,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1]) - if hasnorms: - ni = norms[i] - if cells: # center-justify - bb = tx_poly.GetBounds() - dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 - T.Translate(-dx, -dy, 0) - if xrot: - T.RotateX(xrot) - if yrot: - T.RotateY(yrot) - if zrot: - T.RotateZ(zrot) - crossvec = np.cross([0, 0, 1], ni) - angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 - T.RotateWXYZ(angle, crossvec) - if cells: # small offset along normal only for cells - T.Translate(ni * scale / 2) - else: - if xrot: - T.RotateX(xrot) - if yrot: - T.RotateY(yrot) - if zrot: - T.RotateZ(zrot) - T.Scale(scale, scale, scale) - T.Translate(e) - tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(tx_poly) - tf.SetTransform(T) - tf.Update() - tapp.AddInputData(tf.GetOutput()) - - if ninputs: - tapp.Update() - lpoly = tapp.GetOutput() - else: # return an empty obj - lpoly = vtk.vtkPolyData() - - ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) - ids.property.LightingOff() - ids.actor.PickableOff() - ids.actor.SetUseBounds(False) - return ids - - def labels2d( - self, - content="id", - on="points", - scale=1.0, - precision=4, - font="Calco", - justify="bottom-left", - angle=0.0, - frame=False, - c="black", - bc=None, - alpha=1.0, - ): - """ - Generate value or ID bi-dimensional labels for mesh cells or points. - - See also: `labels()`, `flagpole()`, `caption()` and `legend()`. - - Arguments: - content : (str) - either 'id', 'cellid', or array name - on : (str) - generate labels for "cells" instead of "points" (the default) - scale : (float) - size scaling of labels - precision : (int) - precision of numeric labels - angle : (float) - local rotation angle of label in degrees - frame : (bool) - draw a frame around the label - bc : (str) - background color of the label - - ```python - from vedo import Sphere, show - sph = Sphere(quads=True, res=4).compute_normals().wireframe() - sph.celldata["zvals"] = sph.cell_centers[:,2] - l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') - show(sph, l2d, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/labels2d.png) - """ - cells = False - if isinstance(content, str): - if content in ("cellid", "cellsid"): - cells = True - content = "id" - - if "cell" in on: - cells = True - elif "point" in on: - cells = False - - if cells: - if content != "id" and content not in self.celldata.keys(): - vedo.logger.error(f"In labels2d: cell array {content} does not exist.") - return None - cellcloud = Points(self.cell_centers) - arr = self.dataset.GetCellData().GetScalars() - poly = cellcloud.dataset - poly.GetPointData().SetScalars(arr) - else: - poly = self.dataset - if content != "id" and content not in self.pointdata.keys(): - vedo.logger.error(f"In labels2d: point array {content} does not exist.") - return None - self.pointdata.select(content) - - mp = vtk.vtkLabeledDataMapper() - - if content == "id": - mp.SetLabelModeToLabelIds() - else: - mp.SetLabelModeToLabelScalars() - if precision is not None: - mp.SetLabelFormat(f"%-#.{precision}g") - - pr = mp.GetLabelTextProperty() - c = colors.get_color(c) - pr.SetColor(c) - pr.SetOpacity(alpha) - pr.SetFrame(frame) - pr.SetFrameColor(c) - pr.SetItalic(False) - pr.BoldOff() - pr.ShadowOff() - pr.UseTightBoundingBoxOn() - pr.SetOrientation(angle) - pr.SetFontFamily(vtk.VTK_FONT_FILE) - fl = utils.get_font_path(font) - pr.SetFontFile(fl) - pr.SetFontSize(int(20 * scale)) - - if "cent" in justify or "mid" in justify: - pr.SetJustificationToCentered() - elif "rig" in justify: - pr.SetJustificationToRight() - elif "left" in justify: - pr.SetJustificationToLeft() - # ------ - if "top" in justify: - pr.SetVerticalJustificationToTop() - else: - pr.SetVerticalJustificationToBottom() - - if bc is not None: - bc = colors.get_color(bc) - pr.SetBackgroundColor(bc) - pr.SetBackgroundOpacity(alpha) - - mp.SetInputData(poly) - a2d = vtk.vtkActor2D() - a2d.PickableOff() - a2d.SetMapper(mp) - return a2d - - def legend(self, txt): - """Book a legend text.""" - self.info["legend"] = txt - return self - - def flagpole( - self, - txt=None, - point=None, - offset=None, - s=None, - font="", - rounded=True, - c=None, - alpha=1.0, - lw=2, - italic=0.0, - padding=0.1, - ): - """ - Generate a flag pole style element to describe an object. - Returns a `Mesh` object. - - Use flagpole.follow_camera() to make it face the camera in the scene. - - Consider using `settings.use_parallel_projection = True` - to avoid perspective distortions. - - See also `flagpost()`. - - Arguments: - txt : (str) - Text to display. The default is the filename or the object name. - point : (list) - position of the flagpole pointer. - offset : (list) - text offset wrt the application point. - s : (float) - size of the flagpole. - font : (str) - font face. Check [available fonts here](https://vedo.embl.es/fonts). - rounded : (bool) - draw a rounded or squared box around the text. - c : (list) - text and box color. - alpha : (float) - opacity of text and box. - lw : (float) - line with of box frame. - italic : (float) - italicness of text. - - Examples: - - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) - - ![](https://vedo.embl.es/images/pyplot/intersect2d.png) - - - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) - - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) - """ - acts = [] - - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name - else: - return None - - x0, x1, y0, y1, z0, z1 = self.bounds() - d = self.diagonal_size() - if point is None: - if d: - point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) - # point = self.closest_point([x1, y0, z1]) - else: # it's a Point - point = self.transform.position - - pt = utils.make3d(point) - - if offset is None: - offset = [(x1 - x0) / 1.75, (y1 - y0) / 5, 0] - offset = utils.make3d(offset) - - if s is None: - s = d / 20 - - sph = None - if d and (z1 - z0) / d > 0.1: - sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) - - if c is None: - c = np.array(self.color()) / 1.4 - - lab = vedo.shapes.Text3D( - txt, pos=pt+offset, s=s, - font=font, italic=italic, justify="center" - ) - acts.append(lab) - - if d and not sph: - sph = vedo.shapes.Circle(pt, r=s / 3, res=15) - acts.append(sph) - - x0, x1, y0, y1, z0, z1 = lab.bounds() - aline = [(x0,y0,z0), (x1,y0,z0), (x1,y1,z0), (x0,y1,z0)] - if rounded: - box = vedo.shapes.KSpline(aline, closed=True) - else: - box = vedo.shapes.Line(aline, closed=True) - - cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] - - box.actor.SetOrigin(cnt) - box.scale([1 + padding, 1 + 2 * padding, 1], origin=cnt) - acts.append(box) - - x0, x1, y0, y1, z0, z1 = box.bounds() - if x0 < pt[0] < x1: - c0 = box.closest_point(pt) - c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] - elif (pt[0] - x0) < (x1 - pt[0]): - c0 = [x0, (y0 + y1) / 2, pt[2]] - c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] - else: - c0 = [x1, (y0 + y1) / 2, pt[2]] - c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] - - con = vedo.shapes.Line([c0, c1, pt]) - acts.append(con) - - macts = vedo.merge(acts).c(c).alpha(alpha) - macts.actor.SetOrigin(pt) - macts.bc("tomato").pickable(False) - macts.property.LightingOff() - macts.property.SetLineWidth(lw) - macts.actor.UseBoundsOff() - macts.name = "FlagPole" - return macts - - def flagpost( - self, - txt=None, - point=None, - offset=None, - s=1.0, - c="k9", - bc="k1", - alpha=1, - lw=0, - font="Calco", - justify="center-left", - vspacing=1.0, - ): - """ - Generate a flag post style element to describe an object. - - Arguments: - txt : (str) - Text to display. The default is the filename or the object name. - point : (list) - position of the flag anchor point. The default is None. - offset : (list) - a 3D displacement or offset. The default is None. - s : (float) - size of the text to be shown - c : (list) - color of text and line - bc : (list) - color of the flag background - alpha : (float) - opacity of text and box. - lw : (int) - line with of box frame. The default is 0. - font : (str) - font name. Use a monospace font for better rendering. The default is "Calco". - Type `vedo -r fonts` for a font demo. - Check [available fonts here](https://vedo.embl.es/fonts). - justify : (str) - internal text justification. The default is "center-left". - vspacing : (float) - vertical spacing between lines. - - Examples: - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) - - ![](https://vedo.embl.es/images/other/flag_labels2.png) - """ - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name - else: - return None - - x0, x1, y0, y1, z0, z1 = self.bounds() - d = self.diagonal_size() - if point is None: - if d: - point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) - else: # it's a Point - point = self.transform.position - - point = utils.make3d(point) - - if offset is None: - offset = [0, 0, (z1 - z0) / 2] - offset = utils.make3d(offset) - - fpost = vedo.addons.Flagpost( - txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing - ) - self._caption = fpost - return fpost - - def caption( - self, - txt=None, - point=None, - size=(0.30, 0.15), - padding=5, - font="Calco", - justify="center-right", - vspacing=1.0, - c=None, - alpha=1.0, - lw=1, - ontop=True, - ): - """ - Add a 2D caption to an object which follows the camera movements. - Latex is not supported. Returns the same input object for concatenation. - - See also `flagpole()`, `flagpost()`, `labels()` and `legend()` - with similar functionality. - - Arguments: - txt : (str) - text to be rendered. The default is the file name. - point : (list) - anchoring point. The default is None. - size : (list) - (width, height) of the caption box. The default is (0.30, 0.15). - padding : (float) - padding space of the caption box in pixels. The default is 5. - font : (str) - font name. Use a monospace font for better rendering. The default is "VictorMono". - Type `vedo -r fonts` for a font demo. - Check [available fonts here](https://vedo.embl.es/fonts). - justify : (str) - internal text justification. The default is "center-right". - vspacing : (float) - vertical spacing between lines. The default is 1. - c : (str) - text and box color. The default is 'lb'. - alpha : (float) - text and box transparency. The default is 1. - lw : (int) - line width in pixels. The default is 1. - ontop : (bool) - keep the 2d caption always on top. The default is True. - - Examples: - - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) - - ![](https://vedo.embl.es/images/pyplot/caption.png) - - - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) - """ - if txt is None: - if self.filename: - txt = self.filename.split("/")[-1] - elif self.name: - txt = self.name - - if not txt: # disable it - self._caption = None - return self - - for r in vedo.shapes._reps: - txt = txt.replace(r[0], r[1]) - - if c is None: - c = np.array(self.property.GetColor()) / 2 - else: - c = colors.get_color(c) - - if point is None: - x0, x1, y0, y1, _, z1 = self.dataset.GetBounds() - pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] - point = self.closest_point(pt) - - capt = vtk.vtkCaptionActor2D() - capt.SetAttachmentPoint(point) - capt.SetBorder(True) - capt.SetLeader(True) - sph = vtk.vtkSphereSource() - sph.Update() - capt.SetLeaderGlyphData(sph.GetOutput()) - capt.SetMaximumLeaderGlyphSize(5) - capt.SetPadding(int(padding)) - capt.SetCaption(txt) - capt.SetWidth(size[0]) - capt.SetHeight(size[1]) - capt.SetThreeDimensionalLeader(not ontop) - - pra = capt.GetProperty() - pra.SetColor(c) - pra.SetOpacity(alpha) - pra.SetLineWidth(lw) - - pr = capt.GetCaptionTextProperty() - pr.SetFontFamily(vtk.VTK_FONT_FILE) - fl = utils.get_font_path(font) - pr.SetFontFile(fl) - pr.ShadowOff() - pr.BoldOff() - pr.FrameOff() - pr.SetColor(c) - pr.SetOpacity(alpha) - pr.SetJustificationToLeft() - if "top" in justify: - pr.SetVerticalJustificationToTop() - if "bottom" in justify: - pr.SetVerticalJustificationToBottom() - if "cent" in justify: - pr.SetVerticalJustificationToCentered() - pr.SetJustificationToCentered() - if "left" in justify: - pr.SetJustificationToLeft() - if "right" in justify: - pr.SetJustificationToRight() - pr.SetLineSpacing(vspacing) - self._caption = capt - return self - - ################################################### class Points(PointsVisual, BaseActor): """Work with point clouds.""" @@ -1863,14 +513,45 @@ def fibonacci_sphere(n): ``` ![](https://vedo.embl.es/images/feats/fibonacci.png) """ - # super().__init__() ## super is not working here - BaseActor.__init__(self) - PointsVisual.__init__(self) - self.dataset = vtk.vtkPolyData() + self.filename = "" + self.name = "" + self.file_size = "" + self.trail = None + self.trail_points = [] + self.trail_segment_size = 0 + self.trail_offset = None + self.shadows = [] + self.axes = None + self.picked3d = None + + self.top = np.array([0, 0, 1]) + self.base = np.array([0, 0, 0]) + self.info = {} + self.time = time.time() + self.rendered_at = set() + self.transform = LinearTransform() + + self.point_locator = None + self.cell_locator = None + self.line_locator = None + + self.scalarbar = None + # self.scalarbars = dict() #TODO + self.pipeline = None + self.actor = vtk.vtkActor() + self.property = self.actor.GetProperty() + self.property_backface = self.actor.GetBackfaceProperty() + self.mapper = vtk.vtkPolyDataMapper() + self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() - self.actor.data = self + self.actor.data = self # so Actor can access this object + + self._scals_idx = 0 # index of the active scalar changed from CLI + self._ligthingnr = 0 # index of the lighting mode changed from CLI + self._cmap_name = "" # remember the cmap name for self._keypress + self._caption = None if inputobj is None: #################### return @@ -1878,9 +559,6 @@ def fibonacci_sphere(n): self.name = "Points" # better not to give it a name here? - if isinstance(inputobj, vedo.BaseActor): - inputobj = inputobj.vertices # numpy - ###### if isinstance(inputobj, vtk.vtkActor): self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) @@ -1927,6 +605,10 @@ def fibonacci_sphere(n): self.property.SetRepresentationToPoints() self.property.SetPointSize(r) self.property.LightingOff() + try: + self.property.RenderPointsAsSpheresOn() + except AttributeError: + pass self.pipeline = utils.OperationNode( self, parents=[], comment=f"#pts {self.dataset.GetNumberOfPoints()}" @@ -2606,6 +1288,55 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F ) return self + def align_to_bounding_box(self, msh, rigid=False): + """ + Align the current object's bounding box to the bounding box + of the input object. + + Use `rigid` to disable scaling. + + Examples: + - [align6.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align6.py) + """ + lmt = vtk.vtkLandmarkTransform() + ss = vtk.vtkPoints() + xss0, xss1, yss0, yss1, zss0, zss1 = self.bounds() + for p in [ + [xss0, yss0, zss0], + [xss1, yss0, zss0], + [xss1, yss1, zss0], + [xss0, yss1, zss0], + [xss0, yss0, zss1], + [xss1, yss0, zss1], + [xss1, yss1, zss1], + [xss0, yss1, zss1], + ]: + ss.InsertNextPoint(p) + st = vtk.vtkPoints() + xst0, xst1, yst0, yst1, zst0, zst1 = msh.bounds() + for p in [ + [xst0, yst0, zst0], + [xst1, yst0, zst0], + [xst1, yst1, zst0], + [xst0, yst1, zst0], + [xst0, yst0, zst1], + [xst1, yst0, zst1], + [xst1, yst1, zst1], + [xst0, yst1, zst1], + ]: + st.InsertNextPoint(p) + + lmt.SetSourceLandmarks(ss) + lmt.SetTargetLandmarks(st) + lmt.SetModeToAffine() + if rigid: + lmt.SetModeToRigidBody() + lmt.Update() + + LT = LinearTransform(lmt) + self.apply_transform(LT) + return self + def transform_with_landmarks( self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False ): diff --git a/vedo/shapes.py b/vedo/shapes.py index fa7142ba..6977eef8 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1374,8 +1374,11 @@ def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=Non if bounds is None: bounds = mesh.bounds() - elif isinstance(bounds, vedo.base.Base3DProp): - bounds = bounds.bounds() + else: + try: + bounds = bounds.bounds() + except AttributeError: + pass # assume it's a list at this point # Create a domain volume domain = vtk.vtkImageData() diff --git a/vedo/volume.py b/vedo/volume.py index 04334271..7195c634 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -1676,3 +1676,106 @@ def lighting(self, window, level, ambient=1.0, diffuse=0.0): self.property.SetAmbient(ambient) self.property.SetDiffuse(diffuse) return self + + + +############################################################################### funcs +# def probe_points(dataset, pts): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars at the specified points in space. + +# Note that a mask is also output with valid/invalid points which can be accessed +# with `mesh.pointdata['vtkValidPointMask']`. + +# Examples: +# - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) + +# ![](https://vedo.embl.es/images/volumetric/probePoints.png) +# """ +# if isinstance(pts, vedo.pointcloud.Points): +# pts = pts.vertices + +# def _readpoints(): +# output = src.GetPolyDataOutput() +# points = vtk.vtkPoints() +# for p in pts: +# x, y, z = p +# points.InsertNextPoint(x, y, z) +# output.SetPoints(points) + +# cells = vtk.vtkCellArray() +# cells.InsertNextCell(len(pts)) +# for i in range(len(pts)): +# cells.InsertCellPoint(i) +# output.SetVerts(cells) + +# src = vtk.vtkProgrammableSource() +# src.SetExecuteMethod(_readpoints) +# src.Update() +# img = dataset +# probeFilter = vtk.vtkProbeFilter() +# probeFilter.SetSourceData(img) +# probeFilter.SetInputConnection(src.GetOutputPort()) +# probeFilter.Update() +# poly = probeFilter.GetOutput() +# pm = vedo.mesh.Mesh(poly) +# pm.name = "ProbePoints" +# pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) +# return pm + + +# def probe_line(dataset, p1, p2, res=100): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars along a line defined by 2 points `p1` and `p2`. + +# Note that a mask is also output with valid/invalid points which can be accessed +# with `mesh.pointdata['vtkValidPointMask']`. + +# Use `res` to set the nr of points along the line + +# Examples: +# - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) +# - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) + +# ![](https://vedo.embl.es/images/volumetric/probeLine2.png) +# """ +# line = vtk.vtkLineSource() +# line.SetResolution(res) +# line.SetPoint1(p1) +# line.SetPoint2(p2) +# probeFilter = vtk.vtkProbeFilter() +# probeFilter.SetSourceData(dataset) +# probeFilter.SetInputConnection(line.GetOutputPort()) +# probeFilter.Update() +# poly = probeFilter.GetOutput() +# lnn = vedo.mesh.Mesh(poly) +# lnn.name = "ProbeLine" +# lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) +# return lnn + + +# def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): +# """ +# Takes a `Volume` (or any other vtk data set) +# and probes its scalars on a plane defined by a point and a normal. + +# Examples: +# - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) +# - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) + +# ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) +# """ +# plane = vtk.vtkPlane() +# plane.SetOrigin(origin) +# plane.SetNormal(normal) +# planeCut = vtk.vtkCutter() +# planeCut.SetInputData(dataset) +# planeCut.SetCutFunction(plane) +# planeCut.Update() +# poly = planeCut.GetOutput() +# cutmesh = vedo.mesh.Mesh(poly) +# cutmesh.name = "ProbePlane" +# cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) +# return cutmesh From 6fa8dddd8e6f32f7ed636d029e6df8a3321384de Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 16:31:17 +0200 Subject: [PATCH 068/251] first try to reshuffle class structure add vedo/visuals.py vedo/core.py --- vedo/core.py | 1575 +++++++++++++++++++++++++++++++++++++ vedo/visuals.py | 2011 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3586 insertions(+) create mode 100644 vedo/core.py create mode 100644 vedo/visuals.py diff --git a/vedo/core.py b/vedo/core.py new file mode 100644 index 00000000..e61b6d16 --- /dev/null +++ b/vedo/core.py @@ -0,0 +1,1575 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import numpy as np + +try: + import vedo.vtkclasses as vtk +except ImportError: + import vtkmodules.all as vtk + +import vedo +from vedo import colors +from vedo import utils +from vedo.transformations import LinearTransform + + +__docformat__ = "google" + +__doc__ = "Base classes. Do not instantiate." + +# __all__ = [ +# ] + +############################################################################### +class CommonAlgorithms: + + + @property + def pointdata(self): + """ + Create and/or return a `numpy.array` associated to points (vertices). + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.pointdata["arrayname"]` + + Usage: + + `myobj.pointdata.keys()` to return the available data array names + + `myobj.pointdata.select(name)` to make this array the active one + + `myobj.pointdata.remove(name)` to remove this array + """ + return DataArrayHelper(self, 0) + + @property + def celldata(self): + """ + Create and/or return a `numpy.array` associated to cells (faces). + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.celldata["arrayname"]` + + Usage: + + `myobj.celldata.keys()` to return the available data array names + + `myobj.celldata.select(name)` to make this array the active one + + `myobj.celldata.remove(name)` to remove this array + """ + return DataArrayHelper(self, 1) + + @property + def metadata(self): + """ + Create and/or return a `numpy.array` associated to neither cells nor faces. + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.metadata["arrayname"]` + + Usage: + + `myobj.metadata.keys()` to return the available data array names + + `myobj.metadata.select(name)` to make this array the active one + + `myobj.metadata.remove(name)` to remove this array + """ + return DataArrayHelper(self, 2) + + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd + + def memory_address(self): + """ + Return a unique memory address integer which may serve as the ID of the + object, or passed to c++ code. + """ + # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ + # https://github.com/tfmoraes/polydata_connectivity + return int(self.GetAddressAsString("")[5:], 16) + + def box(self, scale=1, padding=0, fill=False): + """ + Return the bounding box as a new `Mesh`. + + Arguments: + scale : (float) + box size can be scaled by a factor + padding : (float, list) + a constant padding can be added (can be a list [padx,pady,padz]) + + Examples: + - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) + """ + b = self.bounds() + if not utils.is_sequence(padding): + padding = [padding, padding, padding] + length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] + tol = (length + width + height) / 30000 # useful for boxing 2D text + pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] + bx = vedo.shapes.Box( + pos, + length * scale + padding[0], + width * scale + padding[1], + height * scale + padding[2], + c="gray", + ) + try: + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + bx.SetProperty(pr) + bx.property = pr + except (AttributeError, TypeError): + pass + bx.wireframe(not fill) + bx.flat().lighting("off") + return bx + + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + try: + pts = self.vertices + xmin, ymin, zmin = np.min(pts, axis=0) + xmax, ymax, zmax = np.max(pts, axis=0) + return (xmin, xmax, ymin, ymax, zmin, zmax) + except (AttributeError, ValueError): + return self.dataset.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + + def diagonal_size(self): + """Get the length of the diagonal of mesh bounding box.""" + b = self.bounds() + return np.sqrt( + (b[1] - b[0])**2 + (b[3] - b[2])**2 + (b[5] - b[4])**2) + + def copy_data_from(self, obj): + """Copy all data (point and cell data) from this input object""" + self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) + self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) + self.pipeline = utils.OperationNode( + f"copy_data_from\n{obj.__class__.__name__}", + parents=[self, obj], + shape="note", + c="#ccc5b9", + ) + return self + + def print(self): + """Print information about an object.""" + utils.print_info(self) + return self + + def inputdata(self): + """Obsolete, use `self` instead.""" + print("WARNING: inputdata() is obsolete, use self instead.") + return self + + @property + def npoints(self): + """Retrieve the number of points.""" + return self.dataset.GetNumberOfPoints() + + @property + def ncells(self): + """Retrieve the number of cells.""" + return self.dataset.GetNumberOfCells() + + def points(self, pts=None): + """ + Obsolete, use `self.vertices` instead. + + Set/Get the vertex coordinates of a mesh or point cloud. + """ + print("WARNING: .points() is obsolete, use .vertices instead.") + if pts is None: ### getter + + if isinstance(self, vedo.Points): + vpts = self.dataset.GetPoints() + elif isinstance(self, vedo.BaseVolume): + v2p = vtk.vtkImageToPoints() + v2p.SetInputData(self.imagedata()) + v2p.Update() + vpts = v2p.GetOutput().GetPoints() + else: # tetmesh et al + vpts = self.dataset.GetPoints() + + if vpts: + return utils.vtk2numpy(vpts.GetData()) + return np.array([], dtype=np.float32) + + else: + + pts = np.asarray(pts, dtype=np.float32) + + if pts.ndim == 1: + ### getter by point index ################### + indices = pts.astype(int) + vpts = self.dataset.GetPoints() + arr = utils.vtk2numpy(vpts.GetData()) + return arr[indices] ########### + + ### setter #################################### + if pts.shape[1] == 2: + pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] + arr = utils.numpy2vtk(pts, dtype=np.float32) + + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + # reset mesh to identity matrix position/rotation: + self.point_locator = None + self.cell_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) + self.transform = LinearTransform() + return self + + @property + def cell_centers(self): + """ + Get the coordinates of the cell centers. + + Examples: + - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) + """ + vcen = vtk.vtkCellCenters() + vcen.SetInputData(self.dataset) + vcen.Update() + return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) + + def mark_boundaries(self): + """ + Mark cells and vertices of the mesh if they lie on a boundary. + A new array called `BoundaryCells` is added to the mesh. + """ + mb = vtk.vtkMarkBoundaryFilter() + mb.SetInputData(self.datset) + mb.Update() + self.DeepCopy(mb.GetOutput()) + self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) + return self + + + def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): + """ + Find cells that are within the specified bounds. + Setting a color will add a vtk array to colorize these cells. + """ + if len(xbounds) == 6: + bnds = xbounds + else: + bnds = list(self.bounds()) + if len(xbounds) == 2: + bnds[0] = xbounds[0] + bnds[1] = xbounds[1] + if len(ybounds) == 2: + bnds[2] = ybounds[0] + bnds[3] = ybounds[1] + if len(zbounds) == 2: + bnds[4] = zbounds[0] + bnds[5] = zbounds[1] + + cellIds = vtk.vtkIdList() + self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator.SetDataSet(self.dataset) + self.cell_locator.BuildLocator() + self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + + cids = [] + for i in range(cellIds.GetNumberOfIds()): + cid = cellIds.GetId(i) + cids.append(cid) + + return np.array(cids) + + + def map_cells_to_points(self, arrays=(), move=False): + """ + Interpolate cell data (i.e., data specified per cell or face) + into point data (i.e., data specified at each vertex). + The method of transformation is based on averaging the data values + of all cells using a particular point. + + A custom list of arrays to be mapped can be passed in input. + + Set `move=True` to delete the original `celldata` array. + """ + c2p = vtk.vtkCellDataToPointData() + c2p.SetInputData(self.dataset) + if not move: + c2p.PassCellDataOn() + if arrays: + c2p.ClearCellDataArrays() + c2p.ProcessAllArraysOff() + for arr in arrays: + c2p.AddCellDataArray(arr) + else: + c2p.ProcessAllArraysOn() + c2p.Update() + self.mapper.SetScalarModeToUsePointData() + self._update(c2p.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) + return self + + @property + def cells(self): + """ + Get the cells connectivity ids as a numpy array. + + The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. + """ + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + + # Get cell connettivity ids as a 1D array. vtk format is: + # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. + i = 0 + conn = [] + n = len(arr1d) + if n: + while True: + cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] + conn.append(cell) + i += arr1d[i] + 1 + if i >= n: + break + return conn + + + def map_points_to_cells(self, arrays=(), move=False): + """ + Interpolate point data (i.e., data specified per point or vertex) + into cell data (i.e., data specified per cell). + The method of transformation is based on averaging the data values + of all points defining a particular cell. + + A custom list of arrays to be mapped can be passed in input. + + Set `move=True` to delete the original `pointdata` array. + + Examples: + - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) + """ + p2c = vtk.vtkPointDataToCellData() + p2c.SetInputData(self.dataset) + if not move: + p2c.PassPointDataOn() + if arrays: + p2c.ClearPointDataArrays() + p2c.ProcessAllArraysOff() + for arr in arrays: + p2c.AddPointDataArray(arr) + else: + p2c.ProcessAllArraysOn() + p2c.Update() + self.mapper.SetScalarModeToUseCellData() + self._update(p2c.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) + return self + + def resample_data_from(self, source, tol=None, categorical=False): + """ + Resample point and cell data from another dataset. + The output has the same structure but its point data have + the resampled values from target. + + Use `tol` to set the tolerance used to compute whether + a point in the source is in a cell of the current object. + Points without resampled values, and their cells, are marked as blank. + If the data is categorical, then the resulting data will be determined + by a nearest neighbor interpolation scheme. + + Example: + ```python + from vedo import * + m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) + pts = m1.vertices + ces = m1.cell_centers + m1.pointdata["xvalues"] = np.power(pts[:,0], 3) + m1.celldata["yvalues"] = np.power(ces[:,1], 3) + m2 = Mesh(dataurl+'bunny.obj') + m2.resample_arrays_from(m1) + # print(m2.pointdata["xvalues"]) + show(m1, m2 , N=2, axes=1) + ``` + """ + rs = vtk.vtkResampleWithDataSet() + rs.SetInputData(self.datset) + rs.SetSourceData(source) + + rs.SetPassPointArrays(True) + rs.SetPassCellArrays(True) + rs.SetPassFieldArrays(True) + rs.SetCategoricalData(categorical) + + rs.SetComputeTolerance(True) + if tol: + rs.SetComputeTolerance(False) + rs.SetTolerance(tol) + rs.Update() + self._update(rs.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode( + f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] + ) + return self + + def add_ids(self): + """Generate point and cell ids arrays.""" + ids = vtk.vtkIdFilter() + ids.SetInputData(self.datset) + ids.PointIdsOn() + ids.CellIdsOn() + ids.FieldDataOff() + ids.SetPointIdsArrayName("PointID") + ids.SetCellIdsArrayName("CellID") + ids.Update() + self._update(ids.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("add_ids", parents=[self]) + return self + + def gradient(self, input_array=None, on="points", fast=False): + """ + Compute and return the gradiend of the active scalar field as a numpy array. + + Arguments: + input_array : (str) + array of the scalars to compute the gradient, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). + + Examples: + - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) + + ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) + """ + gra = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS + else: + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + + if input_array is None: + if varr.GetScalars(): + input_array = varr.GetScalars().GetName() + else: + vedo.logger.error(f"in gradient: no scalars found for {on}") + raise RuntimeError + + gra.SetInputData(self.dataset) + gra.SetInputScalars(tp, input_array) + gra.SetResultArrayName("Gradient") + gra.SetFasterApproximation(fast) + gra.ComputeDivergenceOff() + gra.ComputeVorticityOff() + gra.ComputeGradientOn() + gra.Update() + if on.startswith("p"): + gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) + else: + gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) + return gvecs + + def divergence(self, array_name=None, on="points", fast=False): + """ + Compute and return the divergence of a vector field as a numpy array. + + Arguments: + array_name : (str) + name of the array of vectors to compute the divergence, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). + """ + div = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS + else: + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + + if array_name is None: + if varr.GetVectors(): + array_name = varr.GetVectors().GetName() + else: + vedo.logger.error(f"in divergence(): no vectors found for {on}") + raise RuntimeError + + div.SetInputData(self.datset) + div.SetInputScalars(tp, array_name) + div.ComputeDivergenceOn() + div.ComputeGradientOff() + div.ComputeVorticityOff() + div.SetDivergenceArrayName("Divergence") + div.SetFasterApproximation(fast) + div.Update() + if on.startswith("p"): + dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) + else: + dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) + return dvecs + + def vorticity(self, array_name=None, on="points", fast=False): + """ + Compute and return the vorticity of a vector field as a numpy array. + + Arguments: + array_name : (str) + name of the array to compute the vorticity, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). + """ + vort = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS + else: + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + + if array_name is None: + if varr.GetVectors(): + array_name = varr.GetVectors().GetName() + else: + vedo.logger.error(f"in vorticity(): no vectors found for {on}") + raise RuntimeError + + vort.SetInputData(self.datset) + vort.SetInputScalars(tp, array_name) + vort.ComputeDivergenceOff() + vort.ComputeGradientOff() + vort.ComputeVorticityOn() + vort.SetVorticityArrayName("Vorticity") + vort.SetFasterApproximation(fast) + vort.Update() + if on.startswith("p"): + vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) + else: + vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) + return vvecs + + def write(self, filename, binary=True): + """Write object to file.""" + out = vedo.file_io.write(self, filename, binary) + out.pipeline = utils.OperationNode( + "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" + ) + return out + + def tomesh(self, fill=True, shrink=1.0): + """ + Build a polygonal Mesh from the current object. + + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). + + If `fill=False`, only the boundary faces will be generated. + """ + gf = vtk.vtkGeometryFilter() + if fill: + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.datset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + if shrink == 1.0: + cleanPolyData = vtk.vtkCleanPolyData() + cleanPolyData.PointMergingOn() + cleanPolyData.ConvertLinesToPointsOn() + cleanPolyData.ConvertPolysToLinesOn() + cleanPolyData.ConvertStripsToPolysOn() + cleanPolyData.SetInputData(poly) + cleanPolyData.Update() + poly = cleanPolyData.GetOutput() + else: + gf.SetInputData(self.datset) + gf.Update() + poly = gf.GetOutput() + + msh = vedo.mesh.Mesh(poly).flat() + msh.scalarbar = self.scalarbar + lut = utils.ctf2lut(self) + if lut: + msh.mapper.SetLookupTable(lut) + + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + ) + return msh + + def shrink(self, fraction=0.8): + """ + Shrink the individual cells to improve visibility. + + ![](https://vedo.embl.es/images/feats/shrink_hex.png) + """ + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.datset) + sf.SetShrinkFactor(fraction) + sf.Update() + self._update(sf.GetOutput()) + self.pipeline = utils.OperationNode( + "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" + ) + return self + + + + + + +############################################################################### +class CorePoints(CommonAlgorithms): + + def apply_transform(self, LT, concatenate=True, deep_copy=True): + """ + Apply a linear or non-linear transformation to the mesh polygonal data. + ```python + from vedo import Cube, show + c1 = Cube().rotate_z(5).x(2).y(1) + print("cube1 position", c1.pos()) + T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y + c2 = Cube().c('r4') + c2.apply_transform(T) # ignore previous movements + c2.apply_transform(T, concatenate=True) + c2.apply_transform(T, concatenate=True) + print("cube2 position", c2.pos()) + show(c1, c2, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/apply_transform.png) + """ + if isinstance(LT, LinearTransform): + tr = LT.T + if LT.is_identity(): + return self + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): + LT = LinearTransform(LT) + if LT.is_identity(): + return self + tr = LT.T + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): + tr = LT + # cannot concatenate here + + tp = vtk.vtkTransformPolyDataFilter() + tp.SetTransform(tr) + tp.SetInputData(self.dataset) + tp.Update() + out = tp.GetOutput() + + if deep_copy: + self.dataset.DeepCopy(out) + else: + self.dataset.ShallowCopy(out) + + # reset the locators + self.point_locator = None + self.cell_locator = None + self.line_locator = None + return self + + + def pos(self, x=None, y=None, z=None): + """Set/Get object position.""" + if x is None: # get functionality + return self.transform.position + + if z is None and y is None: # assume x is of the form (x,y,z) + if len(x) == 3: + x, y, z = x + else: + x, y = x + z = 0 + elif z is None: # assume x,y is of the form x, y + z = 0 + + q = self.transform.position + LT = LinearTransform() + LT.translate([x,y,z] - q) + return self.apply_transform(LT) + + def shift(self, dx=0, dy=0, dz=0): + """Add a vector to the current object position.""" + if utils.is_sequence(dx): + utils.make3d(dx) + dx, dy, dz = dx + LT = LinearTransform().translate([dx, dy, dz]) + return self.apply_transform(LT) + + def x(self, val=None): + """Set/Get object position along x axis.""" + p = self.transform.position + if val is None: + return p[0] + self.pos(val, p[1], p[2]) + return self + + def y(self, val=None): + """Set/Get object position along y axis.""" + p = self.transform.position + if val is None: + return p[1] + self.pos(p[0], val, p[2]) + return self + + def z(self, val=None): + """Set/Get object position along z axis.""" + p = self.transform.position + if val is None: + return p[2] + self.pos(p[0], p[1], val) + return self + + def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): + """ + Rotate around an arbitrary `axis` passing through `point`. + + Example: + ```python + from vedo import * + c1 = Cube() + c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 + v = vector(0.2,1,0) + p = vector(1,0,0) # axis passes through this point + c2.rotate(90, axis=v, point=p) + l = Line(-v+p, v+p).lw(3).c('red') + show(c1, l, c2, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/rotate_axis.png) + """ + # self.rotate(angle, axis, point, rad) + LT = LinearTransform() + LT.rotate(angle, axis, point, rad) + return self.apply_transform(LT) + + def rotate_x(self, angle, rad=False, around=None): + """ + Rotate around x-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_x(angle, rad, around) + return self.apply_transform(LT) + + def rotate_y(self, angle, rad=False, around=None): + """ + Rotate around y-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_y(angle, rad, around) + return self.apply_transform(LT) + + def rotate_z(self, angle, rad=False, around=None): + """ + Rotate around z-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_z(angle, rad, around) + return self.apply_transform(LT) + + def reorient(self, + newaxis, + initaxis=None, + rotation=0, + rad=False, + xyplane=True, + ): + """ + Reorient the object to point to a new direction from an initial one. + If `initaxis` is None, the object will be assumed in its "default" orientation. + If `xyplane` is True, the object will be rotated to lie on the xy plane. + + Use `rotation` to first rotate the object around its `initaxis`. + """ + if initaxis is None: + initaxis = np.asarray(self.top) - self.base + + q = self.transform.position + LT = LinearTransform() + LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) + return self.apply_transform(LT) + + def scale(self, s=None, reset=False, origin=True): + """ + Set/get object's scaling factor. + + Arguments: + s : (list, float) + scaling factor(s). + reset : (bool) + if True previous scaling factors are ignored. + origin : (bool) + if True scaling is applied with respect to object's position, + otherwise is applied respect to (0,0,0). + + Note: + use `s=(sx,sy,sz)` to scale differently in the three coordinates. + """ + if s is None: + return np.array(self.transform.T.GetScale()) + + if not utils.is_sequence(s): + s = [s, s, s] + + LT = LinearTransform() + if reset: + old_s = np.array(self.transform.T.GetScale()) + LT.scale(s / old_s) + else: + if origin is True: + LT.scale(s, origin=self.transform.position) + elif origin is False: + LT.scale(s, origin=False) + else: + LT.scale(s, origin=origin) + + return self.apply_transform(LT) + + +############################################################################### +class CoreVolumetric(CommonAlgorithms): + + def isosurface(self, value=None, flying_edges=True): + """ + Return an `Mesh` isosurface extracted from the `Volume` object. + + Set `value` as single float or list of values to draw the isosurface(s). + Use flying_edges for faster results (but sometimes can interfere with `smooth()`). + + Examples: + - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) + + ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) + """ + scrange = self.dataset.GetScalarRange() + + if flying_edges: + cf = vtk.vtkFlyingEdges3D() + cf.InterpolateAttributesOn() + else: + cf = vtk.vtkContourFilter() + cf.UseScalarTreeOn() + + cf.SetInputData(self.datset) + cf.ComputeNormalsOn() + + if utils.is_sequence(value): + cf.SetNumberOfContours(len(value)) + for i, t in enumerate(value): + cf.SetValue(i, t) + else: + if value is None: + value = (2 * scrange[0] + scrange[1]) / 3.0 + # print("automatic isosurface value =", value) + cf.SetValue(0, value) + + cf.Update() + poly = cf.GetOutput() + + out = vedo.mesh.Mesh(poly, c=None).phong() + out.mapper.SetScalarRange(scrange[0], scrange[1]) + + out.pipeline = utils.OperationNode( + "isosurface", + parents=[self], + comment=f"#pts {out.GetNumberOfPoints()}", + c="#4cc9f0:#e9c46a", + ) + return out + + + def legosurface( + self, vmin=None, vmax=None, invert=False, boundary=False, array_name="input_scalars" + ): + """ + Represent an object - typically a `Volume` - as lego blocks (voxels). + By default colors correspond to the volume's scalar. + Returns an `Mesh` object. + + Arguments: + vmin : (float) + the lower threshold, voxels below this value are not shown. + vmax : (float) + the upper threshold, voxels above this value are not shown. + boundary : (bool) + controls whether to include cells that are partially inside + array_name : (int, str) + name or index of the scalar array to be considered + + Examples: + - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) + + ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) + """ + dataset = vtk.vtkImplicitDataSet() + dataset.SetDataSet(self) + window = vtk.vtkImplicitWindowFunction() + window.SetImplicitFunction(dataset) + + srng = list(self.dataset.GetScalarRange()) + if vmin is not None: + srng[0] = vmin + if vmax is not None: + srng[1] = vmax + tol = 0.00001 * (srng[1] - srng[0]) + srng[0] -= tol + srng[1] += tol + window.SetWindowRange(srng) + + extract = vtk.vtkExtractGeometry() + extract.SetInputData(self.datset) + extract.SetImplicitFunction(window) + extract.SetExtractInside(invert) + extract.SetExtractBoundaryCells(boundary) + extract.Update() + + gf = vtk.vtkGeometryFilter() + gf.SetInputData(extract.GetOutput()) + gf.Update() + + m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() + m.map_points_to_cells() + m.celldata.select(array_name) + + m.pipeline = utils.OperationNode( + "legosurface", parents=[self], comment=f"array: {array_name}", c="#4cc9f0:#e9c46a" + ) + return m + + def cut_with_plane(self, origin=(0, 0, 0), normal="x"): + """ + Cut the object with the plane defined by a point and a normal. + + Arguments: + origin : (list) + the cutting plane goes through this point + normal : (list, str) + normal vector to the cutting plane + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") + + strn = str(normal) + if strn == "x": normal = (1, 0, 0) + elif strn == "y": normal = (0, 1, 0) + elif strn == "z": normal = (0, 0, 1) + elif strn == "-x": normal = (-1, 0, 0) + elif strn == "-y": normal = (0, -1, 0) + elif strn == "-z": normal = (0, 0, -1) + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(self.datset) + clipper.SetClipFunction(plane) + clipper.GenerateClipScalarsOff() + clipper.GenerateClippedOutputOff() + clipper.SetValue(0) + clipper.Update() + cout = clipper.GetOutput() + + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return ug + + else: + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + + + + def cut_with_box(self, box): + """ + Cut the grid with the specified bounding box. + + Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. + If an object is passed, its bounding box are used. + + Example: + ```python + from vedo import * + tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') + tetmesh.color('rainbow') + cu = Cube(side=500).x(500) # any Mesh works + tetmesh.cut_with_box(cu).show(axes=1) + ``` + ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") + + bc = vtk.vtkBoxClipDataSet() + bc.SetInputData(self.datset) + if isinstance(box, vtk.vtkProp): + boxb = box.GetBounds() + else: + boxb = box + bc.SetBoxClip(*boxb) + bc.Update() + cout = bc.GetOutput() + + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return ug + + else: + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return self + + + def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): + """ + Cut a UGrid or TetMesh with a Mesh. + + Use `invert` to return cut off part of the input object. + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") + + ug = self + + ippd = vtk.vtkImplicitPolyDataDistance() + ippd.SetInput(mesh) + + if whole_cells or only_boundary: + clipper = vtk.vtkExtractGeometry() + clipper.SetInputData(ug) + clipper.SetImplicitFunction(ippd) + clipper.SetExtractInside(not invert) + clipper.SetExtractBoundaryCells(False) + if only_boundary: + clipper.SetExtractBoundaryCells(True) + clipper.SetExtractOnlyBoundaryCells(True) + else: + signedDistances = vtk.vtkFloatArray() + signedDistances.SetNumberOfComponents(1) + signedDistances.SetName("SignedDistances") + for pointId in range(ug.GetNumberOfPoints()): + p = ug.GetPoint(pointId) + signedDistance = ippd.EvaluateFunction(p) + signedDistances.InsertNextValue(signedDistance) + ug.GetPointData().AddArray(signedDistances) + ug.GetPointData().SetActiveScalars("SignedDistances") + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(ug) + clipper.SetInsideOut(not invert) + clipper.SetValue(0.0) + + clipper.Update() + cout = clipper.GetOutput() + + # if ug.GetCellData().GetScalars(): # not working + # scalname = ug.GetCellData().GetScalars().GetName() + # if scalname: # not working + # if self.useCells: + # self.celldata.select(scalname) + # else: + # self.pointdata.select(scalname) + # self._update(cout) + # self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") + # return self + + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return ug + + else: + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return self + + def extract_cells_on_plane(self, origin, normal): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + bf.SetImplicitFunction(plane) + bf.Update() + + self._update(bf.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode( + "extract_cells_on_plane", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def extract_cells_on_sphere(self, center, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + sph = vtk.vtkSphere() + sph.SetRadius(radius) + sph.SetCenter(center) + bf.SetImplicitFunction(sph) + bf.Update() + + self._update(bf.GetOutput()) + self.pipeline = utils.OperationNode( + "extract_cells_on_sphere", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def extract_cells_on_cylinder(self, center, axis, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + cyl = vtk.vtkCylinder() + cyl.SetRadius(radius) + cyl.SetCenter(center) + cyl.SetAxis(axis) + bf.SetImplicitFunction(cyl) + bf.Update() + + self.pipeline = utils.OperationNode( + "extract_cells_on_cylinder", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + self._update(bf.GetOutput()) + return self + + def clean(self): + """ + Cleanup unused points and empty cells + """ + cl = vtk.vtkStaticCleanUnstructuredGrid() + cl.SetInputData(self.datset) + cl.RemoveUnusedPointsOn() + cl.ProduceMergeMapOff() + cl.AveragePointDataOff() + cl.Update() + + self._update(cl.GetOutput()) + self.pipeline = utils.OperationNode( + "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b" + ) + return self + + def find_cell(self, p): + """Locate the cell that contains a point and return the cell ID.""" + cell = vtk.vtkTetra() + cellId = vtk.mutable(0) + tol2 = vtk.mutable(0) + subId = vtk.mutable(0) + pcoords = [0, 0, 0] + weights = [0, 0, 0] + cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) + return cid + + def extract_cells_by_id(self, idlist, use_point_ids=False): + """Return a new UGrid composed of the specified subset of indices.""" + selectionNode = vtk.vtkSelectionNode() + if use_point_ids: + selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) + contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() + selectionNode.GetProperties().Set(contcells, 1) + else: + selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) + selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) + vidlist = utils.numpy2vtk(idlist, dtype="id") + selectionNode.SetSelectionList(vidlist) + selection = vtk.vtkSelection() + selection.AddNode(selectionNode) + es = vtk.vtkExtractSelection() + es.SetInputData(0, self) + es.SetInputData(1, selection) + es.Update() + + ug = vedo.ugrid.UGrid(es.GetOutput()) + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + ug.SetProperty(pr) + ug.property = pr + + ug.mapper.SetLookupTable(utils.ctf2lut(self)) + ug.pipeline = utils.OperationNode( + "extract_cells_by_id", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return ug + + + + +############################################################################### +class DataArrayHelper: + # Internal use only. + # Helper class to manage data associated to either + # points (or vertices) and cells (or faces). + def __init__(self, obj, association): + self.obj = obj + self.association = association + + def __getitem__(self, key): + + if self.association == 0: + data = self.obj.dataset.GetPointData() + + elif self.association == 1: + data = self.obj.dataset.GetCellData() + + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + + varr = data.GetAbstractArray(key) + if isinstance(varr, vtk.vtkStringArray): + if isinstance(key, int): + key = data.GetArrayName(key) + n = varr.GetNumberOfValues() + narr = [varr.GetValue(i) for i in range(n)] + return narr + ########### + + else: + raise RuntimeError() + + if isinstance(key, int): + key = data.GetArrayName(key) + + arr = data.GetArray(key) + if not arr: + return None + return utils.vtk2numpy(arr) + + def __setitem__(self, key, input_array): + + if self.association == 0: + data = self.obj.dataset.GetPointData() + n = self.obj.dataset.GetNumberOfPoints() + self.obj.mapper.SetScalarModeToUsePointData() + + elif self.association == 1: + data = self.obj.dataset.GetCellData() + n = self.obj.dataset.GetNumberOfCells() + self.obj.mapper.SetScalarModeToUseCellData() + + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + if not utils.is_sequence(input_array): + input_array = [input_array] + + if isinstance(input_array[0], str): + varr = vtk.vtkStringArray() + varr.SetName(key) + varr.SetNumberOfComponents(1) + varr.SetNumberOfTuples(len(input_array)) + for i, iarr in enumerate(input_array): + if isinstance(iarr, np.ndarray): + iarr = iarr.tolist() # better format + # Note: a string k can be converted to numpy with + # import json; k = np.array(json.loads(k)) + varr.InsertValue(i, str(iarr)) + else: + try: + varr = utils.numpy2vtk(input_array, name=key) + except TypeError as e: + vedo.logger.error( + f"cannot create metadata with input object:\n" + f"{input_array}" + f"\n\nAllowed content examples are:\n" + f"- flat list of strings ['a','b', 1, [1,2,3], ...]" + f" (first item must be a string in this case)\n" + f" hint: use k = np.array(json.loads(k)) to convert strings\n" + f"- numpy arrays of any shape" + ) + raise e + + data.AddArray(varr) + return ############ + + else: + raise RuntimeError() + + if len(input_array) != n: + vedo.logger.error( + f"Error in point/cell data: length of input {len(input_array)}" + f" != {n} nr. of elements" + ) + raise RuntimeError() + + input_array = np.asarray(input_array) + varr = utils.numpy2vtk(input_array, name=key) + data.AddArray(varr) + + if len(input_array.shape) == 1: # scalars + data.SetActiveScalars(key) + elif len(input_array.shape) == 2 and input_array.shape[1] == 3: # vectors + if key.lower() == "normals": + data.SetActiveNormals(key) + else: + data.SetActiveVectors(key) + + def keys(self): + """Return the list of available data array names""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + elif self.association == 1: + data = self.obj.dataset.GetCellData() + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + arrnames = [] + for i in range(data.GetNumberOfArrays()): + name = data.GetArray(i).GetName() + if name: + arrnames.append(name) + return arrnames + + def remove(self, key): + """Remove a data array by name or number""" + if self.association == 0: + self.obj.dataset.GetPointData().RemoveArray(key) + elif self.association == 1: + self.obj.dataset.GetCellData().RemoveArray(key) + elif self.association == 2: + self.obj.dataset.GetFieldData().RemoveArray(key) + + def clear(self): + """Remove all data associated to this object""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + elif self.association == 1: + data = self.obj.dataset.GetCellData() + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + for i in range(data.GetNumberOfArrays()): + name = data.GetArray(i).GetName() + data.RemoveArray(name) + + def rename(self, oldname, newname): + """Rename an array""" + if self.association == 0: + varr = self.obj.dataset.GetPointData().GetArray(oldname) + elif self.association == 1: + varr = self.obj.dataset.GetCellData().GetArray(oldname) + elif self.association == 2: + varr = self.obj.dataset.GetFieldData().GetArray(oldname) + if varr: + varr.SetName(newname) + else: + vedo.logger.warning(f"Cannot rename non existing array {oldname} to {newname}") + + def select(self, key): + """Select one specific array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() + + if isinstance(key, int): + key = data.GetArrayName(key) + + arr = data.GetArray(key) + if not arr: + return + + nc = arr.GetNumberOfComponents() + if nc == 1: + data.SetActiveScalars(key) + elif nc >= 2: + if "rgb" in key.lower(): + data.SetActiveScalars(key) + # try: + # self.mapper.SetColorModeToDirectScalars() + # except AttributeError: + # pass + else: + data.SetActiveVectors(key) + elif nc >= 4: + data.SetActiveTensors(key) + + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + # .. could be a volume mapper + except AttributeError: + pass + + def select_scalars(self, key): + """Select one specific scalar array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() + + if isinstance(key, int): + key = data.GetArrayName(key) + + data.SetActiveScalars(key) + + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + except AttributeError: + pass + + def select_vectors(self, key): + """Select one specific vector array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() + + if isinstance(key, int): + key = data.GetArrayName(key) + + data.SetActiveVectors(key) + + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + except AttributeError: + pass + + def print(self, **kwargs): + """Print the array names available to terminal""" + colors.printc(self.keys(), **kwargs) + + def __repr__(self) -> str: + """Representation""" + + def _get_str(pd, header): + if pd.GetNumberOfArrays(): + out = f"\x1b[2m\x1b[1m\x1b[7m{header}" + if self.obj.name: + out += f" in {self.obj.name}" + out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" + for i in range(pd.GetNumberOfArrays()): + varr = pd.GetArray(i) + out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" + out += "\nindex".ljust(15) + f": {i}" + t = varr.GetDataType() + if t in vedo.utils.array_types: + out += f"\ntype".ljust(15) + out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" + shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) + out += "\nshape".ljust(15) + f": {shape}" + out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" + out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" + out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" + out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" + else: + out += " has no associated data." + return out + + if self.association == 0: + out = _get_str(self.dataset.GetPointData(), "Point Data") + elif self.association == 1: + out = _get_str(self.dataset.GetCellData(), "Cell Data") + elif self.association == 2: + pd = self.dataset.GetFieldData() + if pd.GetNumberOfArrays(): + out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" + if self.actor.name: + out += f" in {self.actor.name}" + out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" + for i in range(pd.GetNumberOfArrays()): + varr = pd.GetAbstractArray(i) + out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" + out += "\nindex".ljust(15) + f": {i}" + shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) + out += "\nshape".ljust(15) + f": {shape}" + + return out + + + diff --git a/vedo/visuals.py b/vedo/visuals.py new file mode 100644 index 00000000..b05eb741 --- /dev/null +++ b/vedo/visuals.py @@ -0,0 +1,2011 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import numpy as np + +try: + import vedo.vtkclasses as vtk +except ImportError: + import vtkmodules.all as vtk + +import vedo +from vedo import colors +from vedo import utils + + +__docformat__ = "google" + +__doc__ = "Base classes to manage positioning and size of the objects in space and other properties" + +# __all__ = [ +# ] + + +################################################### +class CoreVisual: + + def show(self, **options): + """ + Create on the fly an instance of class `Plotter` or use the last existing one to + show one single object. + + This method is meant as a shortcut. If more than one object needs to be visualised + please use the syntax `show(mesh1, mesh2, volume, ..., options)`. + + Returns the `Plotter` class instance. + """ + return vedo.plotter.show(self, **options) + + def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): + """Build a thumbnail of the object and return it as an array.""" + # speed is about 20Hz for size=[200,200] + ren = vtk.vtkRenderer() + ren.AddActor(self) + if axes: + axes = vedo.addons.Axes(self) + ren.AddActor(axes) + ren.ResetCamera() + cam = ren.GetActiveCamera() + cam.Zoom(zoom) + cam.Elevation(elevation) + cam.Azimuth(azimuth) + + ren_win = vtk.vtkRenderWindow() + ren_win.SetOffScreenRendering(True) + ren_win.SetSize(size) + ren.SetBackground(colors.get_color(bg)) + ren_win.AddRenderer(ren) + ren_win.Render() + + nx, ny = ren_win.GetSize() + arr = vtk.vtkUnsignedCharArray() + ren_win.GetRGBACharPixelData(0, 0, nx - 1, ny - 1, 0, arr) + narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) + narr = np.ascontiguousarray(np.flip(narr, axis=0)) + + ren.RemoveActor(self) + if axes: + ren.RemoveActor(axes) + ren_win.Finalize() + del ren_win + return narr + + def pickable(self, value=None): + """Set/get the pickability property of an object.""" + if value is None: + return self.actor.GetPickable() + self.actor.SetPickable(value) + return self + + def use_bounds(self, value=True): + """ + Instruct the current camera to either take into account or ignore + the object bounds when resetting. + """ + self.actor.SetUseBounds(value) + return self + + def draggable(self, value=None): # NOT FUNCTIONAL? + """Set/get the draggability property of an object.""" + if value is None: + return self.actor.GetDragable() + self.actor.SetDragable(value) + return self + + def on(self): + """Switch on object visibility. Object is not removed.""" + self.actor.VisibilityOn() + try: + self.scalarbar.actor.VisibilityOn() + except AttributeError: + pass + try: + self.trail.actor.VisibilityOn() + except AttributeError: + pass + try: + for sh in self.shadows: + sh.actor.VisibilityOn() + except AttributeError: + pass + return self + + def off(self): + """Switch off object visibility. Object is not removed.""" + self.actor.VisibilityOff() + try: + self.scalarbar.actor.VisibilityOff() + except AttributeError: + pass + try: + self.trail.actor.VisibilityOff() + except AttributeError: + pass + try: + for sh in self.shadows: + sh.actor.VisibilityOff() + except AttributeError: + pass + return self + + def toggle(self): + """Toggle object visibility on/off.""" + v = self.actor.GetVisibility() + if v: + self.off() + else: + self.on() + return self + + def add_scalarbar( + self, + title="", + pos=(0.8, 0.05), + title_yoffset=15, + font_size=12, + size=(None, None), + nlabels=None, + c=None, + horizontal=False, + use_alpha=True, + label_format=":6.3g", + ): + """ + Add a 2D scalar bar for the specified obj. + + Examples: + - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) + - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) + """ + plt = vedo.plotter_instance + + if plt and plt.renderer: + c = (0.9, 0.9, 0.9) + if np.sum(plt.renderer.GetBackground()) > 1.5: + c = (0.1, 0.1, 0.1) + if isinstance(self.scalarbar, vtk.vtkActor): + plt.renderer.RemoveActor(self.scalarbar) + elif isinstance(self.scalarbar, vedo.Assembly): + for a in self.scalarbar.unpack(): + plt.renderer.RemoveActor(a) + if c is None: + c = "gray" + + sb = vedo.addons.ScalarBar( + self, + title, + pos, + title_yoffset, + font_size, + size, + nlabels, + c, + horizontal, + use_alpha, + label_format, + ) + self.scalarbar = sb + return self + + def add_scalarbar3d( + self, + title="", + pos=None, + size=(None, None), + title_font="", + title_xoffset=-1.5, + title_yoffset=0.0, + title_size=1.5, + title_rotation=0.0, + nlabels=9, + label_font="", + label_size=1, + label_offset=0.375, + label_rotation=0, + label_format="", + italic=0, + c=None, + draw_box=True, + above_text=None, + below_text=None, + nan_text="NaN", + categories=None, + ): + """ + Associate a 3D scalar bar to the object and add it to the scene. + The new scalarbar object (Assembly) will be accessible as obj.scalarbar + + Arguments: + size : (list) + (thickness, length) of scalarbar + title : (str) + scalar bar title + title_xoffset : (float) + horizontal space btw title and color scalarbar + title_yoffset : (float) + vertical space offset + title_size : (float) + size of title wrt numeric labels + title_rotation : (float) + title rotation in degrees + nlabels : (int) + number of numeric labels + label_font : (str) + font type for labels + label_size : (float) + label scale factor + label_offset : (float) + space btw numeric labels and scale + label_rotation : (float) + label rotation in degrees + label_format : (str) + label format for floats and integers (e.g. `':.2f'`) + draw_box : (bool) + draw a box around the colorbar + categories : (list) + make a categorical scalarbar, + the input list will have the format `[value, color, alpha, textlabel]` + + Examples: + - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) + """ + plt = vedo.plotter_instance + if plt and c is None: # automatic black or white + c = (0.9, 0.9, 0.9) + if np.sum(vedo.get_color(plt.backgrcol)) > 1.5: + c = (0.1, 0.1, 0.1) + if c is None: + c = (0, 0, 0) + c = vedo.get_color(c) + + self.scalarbar = vedo.addons.ScalarBar3D( + self, + title, + pos, + size, + title_font, + title_xoffset, + title_yoffset, + title_size, + title_rotation, + nlabels, + label_font, + label_size, + label_offset, + label_rotation, + label_format, + italic, + c, + draw_box, + above_text, + below_text, + nan_text, + categories, + ) + return self + + def color(self, col, alpha=None, vmin=None, vmax=None): + """ + Assign a color or a set of colors along the range of the scalar value. + A single constant color can also be assigned. + Any matplotlib color map name is also accepted, e.g. `volume.color('jet')`. + + E.g.: say that your cells scalar runs from -3 to 6, + and you want -3 to show red and 1.5 violet and 6 green, then just set: + + `volume.color(['red', 'violet', 'green'])` + + You can also assign a specific color to a aspecific value with eg.: + + `volume.color([(0,'red', (0.5,'violet'), (1,'green')])` + + Arguments: + alpha : (list) + use a list to specify transparencies along the scalar range + vmin : (float) + force the min of the scalar range to be this value + vmax : (float) + force the max of the scalar range to be this value + """ + # supersedes method in Points, Mesh + + if col is None: + return self + + if vmin is None: + vmin, _ = self.dataset.GetScalarRange() + if vmax is None: + _, vmax = self.dataset.GetScalarRange() + ctf = self.property.GetRGBTransferFunction() + ctf.RemoveAllPoints() + self._color = col + + if utils.is_sequence(col): + if utils.is_sequence(col[0]) and len(col[0]) == 2: + # user passing [(value1, color1), ...] + for x, ci in col: + r, g, b = colors.get_color(ci) + ctf.AddRGBPoint(x, r, g, b) + # colors.printc('color at', round(x, 1), + # 'set to', colors.get_color_name((r, g, b)), + # c='w', bold=0) + else: + # user passing [color1, color2, ..] + for i, ci in enumerate(col): + r, g, b = colors.get_color(ci) + x = vmin + (vmax - vmin) * i / (len(col) - 1) + ctf.AddRGBPoint(x, r, g, b) + elif isinstance(col, str): + if col in colors.colors.keys() or col in colors.color_nicks.keys(): + r, g, b = colors.get_color(col) + ctf.AddRGBPoint(vmin, r, g, b) # constant color + ctf.AddRGBPoint(vmax, r, g, b) + else: # assume it's a colormap + for x in np.linspace(vmin, vmax, num=64, endpoint=True): + r, g, b = colors.color_map(x, name=col, vmin=vmin, vmax=vmax) + ctf.AddRGBPoint(x, r, g, b) + elif isinstance(col, int): + r, g, b = colors.get_color(col) + ctf.AddRGBPoint(vmin, r, g, b) # constant color + ctf.AddRGBPoint(vmax, r, g, b) + else: + vedo.logger.warning(f"in color() unknown input type {type(col)}") + + if alpha is not None: + self.alpha(alpha, vmin=vmin, vmax=vmax) + return self + + def alpha(self, alpha, vmin=None, vmax=None): + """ + Assign a set of tranparencies along the range of the scalar value. + A single constant value can also be assigned. + + E.g.: say `alpha=(0.0, 0.3, 0.9, 1)` and the scalar range goes from -10 to 150. + Then all cells with a value close to -10 will be completely transparent, cells at 1/4 + of the range will get an alpha equal to 0.3 and voxels with value close to 150 + will be completely opaque. + + As a second option one can set explicit (x, alpha_x) pairs to define the transfer function. + + E.g.: say `alpha=[(-5, 0), (35, 0.4) (123,0.9)]` and the scalar range goes from -10 to 150. + Then all cells below -5 will be completely transparent, cells with a scalar value of 35 + will get an opacity of 40% and above 123 alpha is set to 90%. + """ + if vmin is None: + vmin, _ = self.dataset.GetScalarRange() + if vmax is None: + _, vmax = self.dataset.GetScalarRange() + otf = self.property.GetScalarOpacity() + otf.RemoveAllPoints() + self._alpha = alpha + + if utils.is_sequence(alpha): + alpha = np.array(alpha) + if len(alpha.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) + for i, al in enumerate(alpha): + xalpha = vmin + (vmax - vmin) * i / (len(alpha) - 1) + # Create transfer mapping scalar value to opacity + otf.AddPoint(xalpha, al) + # colors.printc("alpha at", round(xalpha, 1), "\tset to", al) + elif len(alpha.shape) == 2: # user passing [(x0,alpha0), ...] + otf.AddPoint(vmin, alpha[0][1]) + for xalpha, al in alpha: + # Create transfer mapping scalar value to opacity + otf.AddPoint(xalpha, al) + otf.AddPoint(vmax, alpha[-1][1]) + + else: + + otf.AddPoint(vmin, alpha) # constant alpha + otf.AddPoint(vmax, alpha) + + return self + +################################################### +class PointsVisual: + """Class to manage the visual aspects of a ``Points`` object.""" + + ################################################## + def copy_properties_from(self, source, deep=True, actor_related=True): + """ + Copy properties from another ``Points`` object. + """ + pr = vtk.vtkProperty() + if deep: + pr.DeepCopy(source.property) + else: + pr.ShallowCopy(source.property) + self.actor.SetProperty(pr) + self.property = pr + + if self.actor.GetBackfaceProperty(): + bfpr = vtk.vtkProperty() + bfpr.DeepCopy(source.actor.GetBackfaceProperty()) + self.actor.SetBackfaceProperty(bfpr) + self.property_backface = bfpr + + if not actor_related: + return self + + # mapper related: + self.mapper.SetScalarVisibility(source.mapper.GetScalarVisibility()) + self.mapper.SetScalarMode(source.mapper.GetScalarMode()) + self.mapper.SetScalarRange(source.mapper.GetScalarRange()) + self.mapper.SetLookupTable(source.mapper.GetLookupTable()) + self.mapper.SetColorMode(source.mapper.GetColorMode()) + self.mapper.SetInterpolateScalarsBeforeMapping(source.mapper.GetInterpolateScalarsBeforeMapping()) + self.mapper.SetUseLookupTableScalarRange(source.mapper.GetUseLookupTableScalarRange()) + + self.actor.SetPickable(source.actor.GetPickable()) + self.actor.SetDragable(source.actor.GetDragable()) + self.actor.SetTexture(source.actor.GetTexture()) + self.actor.SetVisibility(source.actor.GetVisibility()) + return self + + def color(self, c=False, alpha=None): + """ + Set/get mesh's color. + If None is passed as input, will use colors from active scalars. + Same as `mesh.c()`. + """ + # overrides base.color() + if c is False: + return np.array(self.property.GetColor()) + if c is None: + self.mapper.ScalarVisibilityOn() + return self + self.mapper.ScalarVisibilityOff() + cc = colors.get_color(c) + self.property.SetColor(cc) + if self.trail: + self.trail.GetProperty().SetColor(cc) + if alpha is not None: + self.alpha(alpha) + return self + + def c(self, color=False, alpha=None): + """ + Shortcut for `color()`. + If None is passed as input, will use colors from current active scalars. + """ + return self.color(color, alpha) + + def alpha(self, opacity=None): + """Set/get mesh's transparency. Same as `mesh.opacity()`.""" + if opacity is None: + return self.property.GetOpacity() + + self.property.SetOpacity(opacity) + bfp = self.actor.GetBackfaceProperty() + if bfp: + if opacity < 1: + self.property_backface = bfp + self.actor.SetBackfaceProperty(None) + else: + self.actor.SetBackfaceProperty(self.property_backface) + return self + + + def opacity(self, alpha=None): + """Set/get mesh's transparency. Same as `mesh.alpha()`.""" + return self.alpha(alpha) + + def force_opaque(self, value=True): + """ Force the Mesh, Line or point cloud to be treated as opaque""" + ## force the opaque pass, fixes picking in vtk9 + # but causes other bad troubles with lines.. + self.actor.SetForceOpaque(value) + return self + + def force_translucent(self, value=True): + """ Force the Mesh, Line or point cloud to be treated as translucent""" + self.actor.SetForceTranslucent(value) + return self + + def point_size(self, value=None): + """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" + if value is None: + return self.property.GetPointSize() + #self.property.SetRepresentationToSurface() + else: + self.property.SetRepresentationToPoints() + self.property.SetPointSize(value) + return self + + def ps(self, pointsize=None): + """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" + return self.point_size(pointsize) + + def render_points_as_spheres(self, value=True): + """Make points look spheric or else make them look as squares.""" + self.property.SetRenderPointsAsSpheres(value) + return self + + def lighting( + self, + style="", + ambient=None, + diffuse=None, + specular=None, + specular_power=None, + specular_color=None, + metallicity=None, + roughness=None, + ): + """ + Set the ambient, diffuse, specular and specular_power lighting constants. + + Arguments: + style : (str) + preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` + ambient : (float) + ambient fraction of emission [0-1] + diffuse : (float) + emission of diffused light in fraction [0-1] + specular : (float) + fraction of reflected light [0-1] + specular_power : (float) + precision of reflection [1-100] + specular_color : (color) + color that is being reflected by the surface + + + + Examples: + - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) + """ + pr = self.property + + if style: + + if isinstance(pr, vtk.vtkVolumeProperty): + self.shade(True) + if style == "off": + self.shade(False) + elif style == "ambient": + style = "default" + self.shade(False) + else: + if style != "off": + pr.LightingOn() + + if style == "off": + pr.SetInterpolationToFlat() + pr.LightingOff() + return self ############## + + if hasattr(pr, "GetColor"): # could be Volume + c = pr.GetColor() + else: + c = (1, 1, 0.99) + mpr = self.mapper + if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): + c = (1,1,0.99) + if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] + elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] + elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] + elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] + elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] + elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] + else: + vedo.logger.error("in lighting(): Available styles are") + vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") + raise RuntimeError() + pr.SetAmbient(pars[0]) + pr.SetDiffuse(pars[1]) + pr.SetSpecular(pars[2]) + pr.SetSpecularPower(pars[3]) + if hasattr(pr, "GetColor"): + pr.SetSpecularColor(pars[4]) + + if ambient is not None: pr.SetAmbient(ambient) + if diffuse is not None: pr.SetDiffuse(diffuse) + if specular is not None: pr.SetSpecular(specular) + if specular_power is not None: pr.SetSpecularPower(specular_power) + if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) + if utils.vtk_version_at_least(9): + if metallicity is not None: + pr.SetInterpolationToPBR() + pr.SetMetallic(metallicity) + if roughness is not None: + pr.SetInterpolationToPBR() + pr.SetRoughness(roughness) + + return self + + def point_blurring(self, r=1, emissive=False): + """Set point blurring. + Apply a gaussian convolution filter to the points. + In this case the radius `r` is in absolute units of the mesh coordinates. + With emissive set, the halo of point becomes light-emissive. + """ + self.property.SetRepresentationToPoints() + if emissive: + self.mapper.SetEmissive(bool(emissive)) + self.mapper.SetScaleFactor(r * 1.4142) + + # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ + if alpha < 1: + self.mapper.SetSplatShaderCode( + "//VTK::Color::Impl\n" + "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" + "if (dist > 1.0) {\n" + " discard;\n" + "} else {\n" + f" float scale = ({alpha} - dist);\n" + " ambientColor *= scale;\n" + " diffuseColor *= scale;\n" + "}\n" + ) + alpha = 1 + + self.mapper.Modified() + self.actor.Modified() + self.property.SetOpacity(alpha) + self.actor.SetMapper(self.mapper) + return self + + + @property + def cellcolors(self): + """ + Colorize each cell (face) of a mesh by passing + a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. + Colors levels and opacities must be in the range [0,255]. + + A single constant color can also be passed as string or RGBA. + + A cell array named "CellsRGBA" is automatically created. + + Examples: + - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) + - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) + + ![](https://vedo.embl.es/images/basic/colorMeshCells.png) + """ + if "CellsRGBA" not in self.celldata.keys(): + lut = self.mapper.GetLookupTable() + vscalars = self.dataset.GetCellData().GetScalars() + if vscalars is None or lut is None: + arr = np.zeros([self.ncells, 4], dtype=np.uint8) + col = np.array(self.property.GetColor()) + col = np.round(col * 255).astype(np.uint8) + alf = self.property.GetOpacity() + alf = np.round(alf * 255).astype(np.uint8) + arr[:, (0, 1, 2)] = col + arr[:, 3] = alf + else: + cols = lut.MapScalars(vscalars, 0, 0) + arr = utils.vtk2numpy(cols) + self.celldata["CellsRGBA"] = arr + self.celldata.select("CellsRGBA") + return self.celldata["CellsRGBA"] + + @cellcolors.setter + def cellcolors(self, value): + if isinstance(value, str): + c = colors.get_color(value) + value = np.array([*c, 1]) * 255 + value = np.round(value) + + value = np.asarray(value) + n = self.ncells + + if value.ndim == 1: + value = np.repeat([value], n, axis=0) + + if value.shape[1] == 3: + z = np.zeros((n, 1), dtype=np.uint8) + value = np.append(value, z + 255, axis=1) + + assert n == value.shape[0] + + self.celldata["CellsRGBA"] = value.astype(np.uint8) + self.celldata.select("CellsRGBA") + + + @property + def pointcolors(self): + """ + Colorize each point (or vertex of a mesh) by passing + a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. + Colors levels and opacities must be in the range [0,255]. + + A single constant color can also be passed as string or RGBA. + + A point array named "PointsRGBA" is automatically created. + """ + if "PointsRGBA" not in self.pointdata.keys(): + lut = self.mapper.GetLookupTable() + vscalars = self.dataset.GetPointData().GetScalars() + if vscalars is None or lut is None: + arr = np.zeros([self.npoints, 4], dtype=np.uint8) + col = np.array(self.property.GetColor()) + col = np.round(col * 255).astype(np.uint8) + alf = self.property.GetOpacity() + alf = np.round(alf * 255).astype(np.uint8) + arr[:, (0, 1, 2)] = col + arr[:, 3] = alf + else: + cols = lut.MapScalars(vscalars, 0, 0) + arr = utils.vtk2numpy(cols) + self.pointdata["PointsRGBA"] = arr + self.pointdata.select("PointsRGBA") + return self.pointdata["PointsRGBA"] + + @pointcolors.setter + def pointcolors(self, value): + if isinstance(value, str): + c = colors.get_color(value) + value = np.array([*c, 1]) * 255 + value = np.round(value) + + value = np.asarray(value) + n = self.npoints + + if value.ndim == 1: + value = np.repeat([value], n, axis=0) + + if value.shape[1] == 3: + z = np.zeros((n, 1), dtype=np.uint8) + value = np.append(value, z + 255, axis=1) + + assert n == value.shape[0] + + self.pointdata["PointsRGBA"] = value.astype(np.uint8) + self.pointdata.select("PointsRGBA") + + ##################################################################################### + def cmap( + self, + input_cmap, + input_array=None, + on="points", + name="Scalars", + vmin=None, + vmax=None, + n_colors=256, + alpha=1.0, + logscale=False, + ): + """ + Set individual point/cell colors by providing a list of scalar values and a color map. + + Arguments: + input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) + color map scheme to transform a real number into a color. + input_array : (str, list, vtkArray) + can be the string name of an existing array, a numpy array or a `vtkArray`. + on : (str) + either 'points' or 'cells'. + Apply the color map to data which is defined on either points or cells. + name : (str) + give a name to the provided numpy array (if input_array is a numpy array) + vmin : (float) + clip scalars to this minimum value + vmax : (float) + clip scalars to this maximum value + n_colors : (int) + number of distinct colors to be used in colormap table. + alpha : (float, list) + Mesh transparency. Can be a `list` of values one for each vertex. + logscale : (bool) + Use logscale + + Examples: + - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) + - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) + - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) + (and many others) + + ![](https://vedo.embl.es/images/basic/mesh_custom.png) + """ + self._cmap_name = input_cmap + + if input_array is None: + if not self.pointdata.keys() and self.celldata.keys(): + on = "cells" + if not self.dataset.GetCellData().GetScalars(): + input_array = 0 # pick the first at hand + + if on.startswith("point"): + data = self.dataset.GetPointData() + n = self.dataset.GetNumberOfPoints() + elif on.startswith("cell"): + data = self.dataset.GetCellData() + n = self.dataset.GetNumberOfCells() + else: + vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") + raise RuntimeError() + + if input_array is None: # if None try to fetch the active scalars + arr = data.GetScalars() + if not arr: + vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") + return self + + if not arr.GetName(): # sometimes arrays dont have a name.. + arr.SetName(name) + + elif isinstance(input_array, str): # if a string is passed + arr = data.GetArray(input_array) + if not arr: + vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") + return self + + elif isinstance(input_array, int): # if an int is passed + if input_array < data.GetNumberOfArrays(): + arr = data.GetArray(input_array) + else: + vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") + return self + + elif utils.is_sequence(input_array): # if a numpy array is passed + npts = len(input_array) + if npts != n: + vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") + return self + arr = utils.numpy2vtk(input_array, name=name, dtype=float) + data.AddArray(arr) + data.Modified() + + elif isinstance(input_array, vtk.vtkArray): # if a vtkArray is passed + arr = input_array + data.AddArray(arr) + data.Modified() + + else: + vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") + raise RuntimeError() + + # Now we have array "arr" + array_name = arr.GetName() + + if arr.GetNumberOfComponents() == 1: + if vmin is None: + vmin = arr.GetRange()[0] + if vmax is None: + vmax = arr.GetRange()[1] + else: + if vmin is None or vmax is None: + vn = utils.mag(utils.vtk2numpy(arr)) + if vmin is None: + vmin = vn.min() + if vmax is None: + vmax = vn.max() + + # interpolate alphas if they are not constant + if not utils.is_sequence(alpha): + alpha = [alpha] * n_colors + else: + v = np.linspace(0, 1, n_colors, endpoint=True) + xp = np.linspace(0, 1, len(alpha), endpoint=True) + alpha = np.interp(v, xp, alpha) + + ########################### build the look-up table + if isinstance(input_cmap, vtk.vtkLookupTable): # vtkLookupTable + lut = input_cmap + + elif utils.is_sequence(input_cmap): # manual sequence of colors + lut = vtk.vtkLookupTable() + if logscale: + lut.SetScaleToLog10() + lut.SetRange(vmin, vmax) + ncols = len(input_cmap) + lut.SetNumberOfTableValues(ncols) + + for i, c in enumerate(input_cmap): + r, g, b = colors.get_color(c) + lut.SetTableValue(i, r, g, b, alpha[i]) + lut.Build() + + else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap + lut = vtk.vtkLookupTable() + if logscale: + lut.SetScaleToLog10() + lut.SetVectorModeToMagnitude() + lut.SetRange(vmin, vmax) + lut.SetNumberOfTableValues(n_colors) + mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) + for i, c in enumerate(mycols): + r, g, b = c + lut.SetTableValue(i, r, g, b, alpha[i]) + lut.Build() + + arr.SetLookupTable(lut) + + data.SetActiveScalars(array_name) + # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars + # data.SetActiveAttribute(array_name, 0) # boh! + + if data.GetScalars(): + data.GetScalars().SetLookupTable(lut) + data.GetScalars().Modified() + + self.mapper.SetLookupTable(lut) + self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars + + self.mapper.ScalarVisibilityOn() + self.mapper.SetScalarRange(lut.GetRange()) + if on.startswith("point"): + self.mapper.SetScalarModeToUsePointData() + else: + self.mapper.SetScalarModeToUseCellData() + if hasattr(self.mapper, "SetArrayName"): + self.mapper.SetArrayName(array_name) + + return self + + def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): + """ + Add a trailing line to mesh. + This new mesh is accessible through `mesh.trail`. + + Arguments: + offset : (float) + set an offset vector from the object center. + n : (int) + number of segments + lw : (float) + line width of the trail + + Examples: + - [trail.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/trail.py) + + ![](https://vedo.embl.es/images/simulations/trail.gif) + + - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) + - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) + """ + if self.trail is None: + pos = self.pos() + self.trail_offset = np.asarray(offset) + self.trail_points = [pos] * n + + if c is None: + col = self.property.GetColor() + else: + col = colors.get_color(c) + + tline = vedo.shapes.Line(pos, pos, res=n, c=col, alpha=alpha, lw=lw) + self.trail = tline # holds the Line + return self + + def update_trail(self): + """ + Update the trailing line of a moving object. + """ + currentpos = self.pos() + + self.trail_points.append(currentpos) # cycle + self.trail_points.pop(0) + + data = np.array(self.trail_points) - currentpos + self.trail_offset + tpoly = self.trail.dataset + tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) + self.trail.pos(currentpos) + return self + + + def _compute_shadow(self, plane, point, direction): + shad = self.clone() + shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords + shad.name = "Shadow" + + pts = shad.vertices + if plane == 'x': + # shad = shad.project_on_plane('x') + # instead do it manually so in case of alpha<1 + # we dont see glitches due to coplanar points + # we leave a small tolerance of 0.1% in thickness + x0, x1 = self.xbounds() + pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] + shad.vertices = pts + shad.x(point) + elif plane == 'y': + x0, x1 = self.ybounds() + pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] + shad.vertices = pts + shad.y(point) + elif plane == "z": + x0, x1 = self.zbounds() + pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[2] + shad.vertices = pts + shad.z(point) + else: + shad = shad.project_on_plane(plane, point, direction) + return shad + + def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, culling=0): + """ + Generate a shadow out of an `Mesh` on one of the three Cartesian planes. + The output is a new `Mesh` representing the shadow. + This new mesh is accessible through `mesh.shadow`. + By default the shadow mesh is placed on the bottom wall of the bounding box. + + See also `pointcloud.project_on_plane()`. + + Arguments: + plane : (str, Plane) + if plane is `str`, plane can be one of `['x', 'y', 'z']`, + represents x-plane, y-plane and z-plane, respectively. + Otherwise, plane should be an instance of `vedo.shapes.Plane` + point : (float, array) + if plane is `str`, point should be a float represents the intercept. + Otherwise, point is the camera point of perspective projection + direction : (list) + direction of oblique projection + culling : (int) + choose between front [1] or backface [-1] culling or None. + + Examples: + - [shadow1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shadow1.py) + - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) + - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) + + ![](https://vedo.embl.es/images/simulations/57341963-b8910900-713c-11e9-898a-84b6d3712bce.gif) + """ + shad = self._compute_shadow(plane, point, direction) + shad.c(c).alpha(alpha) + + try: + # Points dont have these methods + shad.flat() + if culling in (1, True): + shad.frontface_culling() + elif culling == -1: + shad.backface_culling() + except AttributeError: + pass + + shad.property.LightingOff() + shad.actor.SetPickable(False) + shad.actor.SetUseBounds(True) + + if shad not in self.shadows: + self.shadows.append(shad) + shad.info = dict(plane=plane, point=point, direction=direction) + return self + + def update_shadows(self): + """ + Update the shadows of a moving object. + """ + for sha in self.shadows: + plane = sha.info['plane'] + point = sha.info['point'] + direction = sha.info['direction'] + new_sha = self._compute_shadow(plane, point, direction) + # sha.DeepCopy(new_sha) + sha._update(new_sha.dataset) + return self + + + def labels( + self, + content=None, + on="points", + scale=None, + xrot=0.0, + yrot=0.0, + zrot=0.0, + ratio=1, + precision=None, + italic=False, + font="", + justify="bottom-left", + c="black", + alpha=1.0, + cells=None, + ): + """ + Generate value or ID labels for mesh cells or points. + For large nr. of labels use `font="VTK"` which is much faster. + + See also: + `labels2d()`, `flagpole()`, `caption()` and `legend()`. + + Arguments: + content : (list,int,str) + either 'id', 'cellid', array name or array number. + A array can also be passed (must match the nr. of points or cells). + on : (str) + generate labels for "cells" instead of "points" + scale : (float) + absolute size of labels, if left as None it is automatic + zrot : (float) + local rotation angle of label in degrees + ratio : (int) + skipping ratio, to reduce nr of labels for large meshes + precision : (int) + numeric precision of labels + + ```python + from vedo import * + s = Sphere(res=10).linewidth(1).c("orange").compute_normals() + point_ids = s.labels('id', on="points").c('green') + cell_ids = s.labels('id', on="cells" ).c('black') + show(s, point_ids, cell_ids) + ``` + ![](https://vedo.embl.es/images/feats/labels.png) + + Examples: + - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) + + ![](https://vedo.embl.es/images/basic/boundaries.png) + """ + if cells is not None: # deprecation message + vedo.logger.warning("In labels(cells=...) please use labels(on='cells') instead") + + if "cell" in on or "face" in on: + cells = True + + if isinstance(content, str): + if content in ("cellid", "cellsid"): + cells = True + content = "id" + + if cells: + elems = self.cell_centers + # norms = self.normals(cells=True, recompute=False) + norms = self.cell_normals + ns = np.sqrt(self.ncells) + else: + elems = self.vertices + # norms = self.normals(cells=False, recompute=False) + norms = self.vertex_normals + ns = np.sqrt(self.npoints) + + hasnorms = False + if len(norms) > 0: + hasnorms = True + + if scale is None: + if not ns: + ns = 100 + scale = self.diagonal_size() / ns / 10 + + arr = None + mode = 0 + if content is None: + mode = 0 + if cells: + if self.dataset.GetCellData().GetScalars(): + name = self.dataset.GetCellData().GetScalars().GetName() + arr = self.celldata[name] + else: + if self.dataset.GetPointData().GetScalars(): + name = self.dataset.GetPointData().GetScalars().GetName() + arr = self.pointdata[name] + elif isinstance(content, (str, int)): + if content == "id": + mode = 1 + elif cells: + mode = 0 + arr = self.celldata[content] + else: + mode = 0 + arr = self.pointdata[content] + elif utils.is_sequence(content): + mode = 0 + arr = content + # print('WEIRD labels() test', content) + # exit() + + if arr is None and mode == 0: + vedo.logger.error("in labels(), array not found for points or cells") + return None + + tapp = vtk.vtkAppendPolyData() + ninputs = 0 + + for i, e in enumerate(elems): + if i % ratio: + continue + + if mode == 1: + txt_lab = str(i) + else: + if precision: + txt_lab = utils.precision(arr[i], precision) + else: + txt_lab = str(arr[i]) + + if not txt_lab: + continue + + if font == "VTK": + tx = vtk.vtkVectorText() + tx.SetText(txt_lab) + tx.Update() + tx_poly = tx.GetOutput() + else: + tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify).dataset + + if tx_poly.GetPointData() == 0: + continue ####################### + ninputs += 1 + + T = vtk.vtkTransform() + T.PostMultiply() + if italic: + T.Concatenate([1,0.2,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1]) + if hasnorms: + ni = norms[i] + if cells: # center-justify + bb = tx_poly.GetBounds() + dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 + T.Translate(-dx, -dy, 0) + if xrot: + T.RotateX(xrot) + if yrot: + T.RotateY(yrot) + if zrot: + T.RotateZ(zrot) + crossvec = np.cross([0, 0, 1], ni) + angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 + T.RotateWXYZ(angle, crossvec) + if cells: # small offset along normal only for cells + T.Translate(ni * scale / 2) + else: + if xrot: + T.RotateX(xrot) + if yrot: + T.RotateY(yrot) + if zrot: + T.RotateZ(zrot) + T.Scale(scale, scale, scale) + T.Translate(e) + tf = vtk.vtkTransformPolyDataFilter() + tf.SetInputData(tx_poly) + tf.SetTransform(T) + tf.Update() + tapp.AddInputData(tf.GetOutput()) + + if ninputs: + tapp.Update() + lpoly = tapp.GetOutput() + else: # return an empty obj + lpoly = vtk.vtkPolyData() + + ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) + ids.property.LightingOff() + ids.actor.PickableOff() + ids.actor.SetUseBounds(False) + return ids + + def labels2d( + self, + content="id", + on="points", + scale=1.0, + precision=4, + font="Calco", + justify="bottom-left", + angle=0.0, + frame=False, + c="black", + bc=None, + alpha=1.0, + ): + """ + Generate value or ID bi-dimensional labels for mesh cells or points. + + See also: `labels()`, `flagpole()`, `caption()` and `legend()`. + + Arguments: + content : (str) + either 'id', 'cellid', or array name + on : (str) + generate labels for "cells" instead of "points" (the default) + scale : (float) + size scaling of labels + precision : (int) + precision of numeric labels + angle : (float) + local rotation angle of label in degrees + frame : (bool) + draw a frame around the label + bc : (str) + background color of the label + + ```python + from vedo import Sphere, show + sph = Sphere(quads=True, res=4).compute_normals().wireframe() + sph.celldata["zvals"] = sph.cell_centers[:,2] + l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') + show(sph, l2d, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/labels2d.png) + """ + cells = False + if isinstance(content, str): + if content in ("cellid", "cellsid"): + cells = True + content = "id" + + if "cell" in on: + cells = True + elif "point" in on: + cells = False + + if cells: + if content != "id" and content not in self.celldata.keys(): + vedo.logger.error(f"In labels2d: cell array {content} does not exist.") + return None + cellcloud = vedo.Points(self.cell_centers) + arr = self.dataset.GetCellData().GetScalars() + poly = cellcloud.dataset + poly.GetPointData().SetScalars(arr) + else: + poly = self.dataset + if content != "id" and content not in self.pointdata.keys(): + vedo.logger.error(f"In labels2d: point array {content} does not exist.") + return None + self.pointdata.select(content) + + mp = vtk.vtkLabeledDataMapper() + + if content == "id": + mp.SetLabelModeToLabelIds() + else: + mp.SetLabelModeToLabelScalars() + if precision is not None: + mp.SetLabelFormat(f"%-#.{precision}g") + + pr = mp.GetLabelTextProperty() + c = colors.get_color(c) + pr.SetColor(c) + pr.SetOpacity(alpha) + pr.SetFrame(frame) + pr.SetFrameColor(c) + pr.SetItalic(False) + pr.BoldOff() + pr.ShadowOff() + pr.UseTightBoundingBoxOn() + pr.SetOrientation(angle) + pr.SetFontFamily(vtk.VTK_FONT_FILE) + fl = utils.get_font_path(font) + pr.SetFontFile(fl) + pr.SetFontSize(int(20 * scale)) + + if "cent" in justify or "mid" in justify: + pr.SetJustificationToCentered() + elif "rig" in justify: + pr.SetJustificationToRight() + elif "left" in justify: + pr.SetJustificationToLeft() + # ------ + if "top" in justify: + pr.SetVerticalJustificationToTop() + else: + pr.SetVerticalJustificationToBottom() + + if bc is not None: + bc = colors.get_color(bc) + pr.SetBackgroundColor(bc) + pr.SetBackgroundOpacity(alpha) + + mp.SetInputData(poly) + a2d = vtk.vtkActor2D() + a2d.PickableOff() + a2d.SetMapper(mp) + return a2d + + def legend(self, txt): + """Book a legend text.""" + self.info["legend"] = txt + return self + + def flagpole( + self, + txt=None, + point=None, + offset=None, + s=None, + font="", + rounded=True, + c=None, + alpha=1.0, + lw=2, + italic=0.0, + padding=0.1, + ): + """ + Generate a flag pole style element to describe an object. + Returns a `Mesh` object. + + Use flagpole.follow_camera() to make it face the camera in the scene. + + Consider using `settings.use_parallel_projection = True` + to avoid perspective distortions. + + See also `flagpost()`. + + Arguments: + txt : (str) + Text to display. The default is the filename or the object name. + point : (list) + position of the flagpole pointer. + offset : (list) + text offset wrt the application point. + s : (float) + size of the flagpole. + font : (str) + font face. Check [available fonts here](https://vedo.embl.es/fonts). + rounded : (bool) + draw a rounded or squared box around the text. + c : (list) + text and box color. + alpha : (float) + opacity of text and box. + lw : (float) + line with of box frame. + italic : (float) + italicness of text. + + Examples: + - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) + + ![](https://vedo.embl.es/images/pyplot/intersect2d.png) + + - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) + - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) + """ + acts = [] + + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name + else: + return None + + x0, x1, y0, y1, z0, z1 = self.bounds() + d = self.diagonal_size() + if point is None: + if d: + point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) + # point = self.closest_point([x1, y0, z1]) + else: # it's a Point + point = self.transform.position + + pt = utils.make3d(point) + + if offset is None: + offset = [(x1 - x0) / 1.75, (y1 - y0) / 5, 0] + offset = utils.make3d(offset) + + if s is None: + s = d / 20 + + sph = None + if d and (z1 - z0) / d > 0.1: + sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) + + if c is None: + c = np.array(self.color()) / 1.4 + + lab = vedo.shapes.Text3D( + txt, pos=pt+offset, s=s, + font=font, italic=italic, justify="center" + ) + acts.append(lab) + + if d and not sph: + sph = vedo.shapes.Circle(pt, r=s / 3, res=15) + acts.append(sph) + + x0, x1, y0, y1, z0, z1 = lab.bounds() + aline = [(x0,y0,z0), (x1,y0,z0), (x1,y1,z0), (x0,y1,z0)] + if rounded: + box = vedo.shapes.KSpline(aline, closed=True) + else: + box = vedo.shapes.Line(aline, closed=True) + + cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] + + box.actor.SetOrigin(cnt) + box.scale([1 + padding, 1 + 2 * padding, 1], origin=cnt) + acts.append(box) + + x0, x1, y0, y1, z0, z1 = box.bounds() + if x0 < pt[0] < x1: + c0 = box.closest_point(pt) + c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] + elif (pt[0] - x0) < (x1 - pt[0]): + c0 = [x0, (y0 + y1) / 2, pt[2]] + c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] + else: + c0 = [x1, (y0 + y1) / 2, pt[2]] + c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] + + con = vedo.shapes.Line([c0, c1, pt]) + acts.append(con) + + macts = vedo.merge(acts).c(c).alpha(alpha) + macts.actor.SetOrigin(pt) + macts.bc("tomato").pickable(False) + macts.property.LightingOff() + macts.property.SetLineWidth(lw) + macts.actor.UseBoundsOff() + macts.name = "FlagPole" + return macts + + def flagpost( + self, + txt=None, + point=None, + offset=None, + s=1.0, + c="k9", + bc="k1", + alpha=1, + lw=0, + font="Calco", + justify="center-left", + vspacing=1.0, + ): + """ + Generate a flag post style element to describe an object. + + Arguments: + txt : (str) + Text to display. The default is the filename or the object name. + point : (list) + position of the flag anchor point. The default is None. + offset : (list) + a 3D displacement or offset. The default is None. + s : (float) + size of the text to be shown + c : (list) + color of text and line + bc : (list) + color of the flag background + alpha : (float) + opacity of text and box. + lw : (int) + line with of box frame. The default is 0. + font : (str) + font name. Use a monospace font for better rendering. The default is "Calco". + Type `vedo -r fonts` for a font demo. + Check [available fonts here](https://vedo.embl.es/fonts). + justify : (str) + internal text justification. The default is "center-left". + vspacing : (float) + vertical spacing between lines. + + Examples: + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) + + ![](https://vedo.embl.es/images/other/flag_labels2.png) + """ + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name + else: + return None + + x0, x1, y0, y1, z0, z1 = self.bounds() + d = self.diagonal_size() + if point is None: + if d: + point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) + else: # it's a Point + point = self.transform.position + + point = utils.make3d(point) + + if offset is None: + offset = [0, 0, (z1 - z0) / 2] + offset = utils.make3d(offset) + + fpost = vedo.addons.Flagpost( + txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing + ) + self._caption = fpost + return fpost + + def caption( + self, + txt=None, + point=None, + size=(0.30, 0.15), + padding=5, + font="Calco", + justify="center-right", + vspacing=1.0, + c=None, + alpha=1.0, + lw=1, + ontop=True, + ): + """ + Add a 2D caption to an object which follows the camera movements. + Latex is not supported. Returns the same input object for concatenation. + + See also `flagpole()`, `flagpost()`, `labels()` and `legend()` + with similar functionality. + + Arguments: + txt : (str) + text to be rendered. The default is the file name. + point : (list) + anchoring point. The default is None. + size : (list) + (width, height) of the caption box. The default is (0.30, 0.15). + padding : (float) + padding space of the caption box in pixels. The default is 5. + font : (str) + font name. Use a monospace font for better rendering. The default is "VictorMono". + Type `vedo -r fonts` for a font demo. + Check [available fonts here](https://vedo.embl.es/fonts). + justify : (str) + internal text justification. The default is "center-right". + vspacing : (float) + vertical spacing between lines. The default is 1. + c : (str) + text and box color. The default is 'lb'. + alpha : (float) + text and box transparency. The default is 1. + lw : (int) + line width in pixels. The default is 1. + ontop : (bool) + keep the 2d caption always on top. The default is True. + + Examples: + - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) + + ![](https://vedo.embl.es/images/pyplot/caption.png) + + - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) + - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) + """ + if txt is None: + if self.filename: + txt = self.filename.split("/")[-1] + elif self.name: + txt = self.name + + if not txt: # disable it + self._caption = None + return self + + for r in vedo.shapes._reps: + txt = txt.replace(r[0], r[1]) + + if c is None: + c = np.array(self.property.GetColor()) / 2 + else: + c = colors.get_color(c) + + if point is None: + x0, x1, y0, y1, _, z1 = self.dataset.GetBounds() + pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] + point = self.closest_point(pt) + + capt = vtk.vtkCaptionActor2D() + capt.SetAttachmentPoint(point) + capt.SetBorder(True) + capt.SetLeader(True) + sph = vtk.vtkSphereSource() + sph.Update() + capt.SetLeaderGlyphData(sph.GetOutput()) + capt.SetMaximumLeaderGlyphSize(5) + capt.SetPadding(int(padding)) + capt.SetCaption(txt) + capt.SetWidth(size[0]) + capt.SetHeight(size[1]) + capt.SetThreeDimensionalLeader(not ontop) + + pra = capt.GetProperty() + pra.SetColor(c) + pra.SetOpacity(alpha) + pra.SetLineWidth(lw) + + pr = capt.GetCaptionTextProperty() + pr.SetFontFamily(vtk.VTK_FONT_FILE) + fl = utils.get_font_path(font) + pr.SetFontFile(fl) + pr.ShadowOff() + pr.BoldOff() + pr.FrameOff() + pr.SetColor(c) + pr.SetOpacity(alpha) + pr.SetJustificationToLeft() + if "top" in justify: + pr.SetVerticalJustificationToTop() + if "bottom" in justify: + pr.SetVerticalJustificationToBottom() + if "cent" in justify: + pr.SetVerticalJustificationToCentered() + pr.SetJustificationToCentered() + if "left" in justify: + pr.SetJustificationToLeft() + if "right" in justify: + pr.SetJustificationToRight() + pr.SetLineSpacing(vspacing) + self._caption = capt + return self + + +##################################################################### +class MeshVisual: + """Class to manage the visual aspects of a ``Maesh`` object.""" + + def follow_camera(self, camera=None, origin=None): + """ + Return an object that will follow camera movements and stay locked to it. + Use `mesh.follow_camera(False)` to disable it. + + A `vtkCamera` object can also be passed. + """ + if camera is False: + try: + self.SetCamera(None) + return self + except AttributeError: + return self + + factor = vtk.vtkFollower() + factor.SetMapper(self.mapper) + factor.SetProperty(self.property) + factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) + factor.SetTexture(self.actor.GetTexture()) + factor.SetScale(self.actor.GetScale()) + factor.SetOrientation(self.actor.GetOrientation()) + factor.SetPosition(self.actor.GetPosition()) + factor.SetUseBounds(self.actor.GetUseBounds()) + + factor.SetOrigin(self.actor.GetOrigin()) + + factor.PickableOff() + + if isinstance(camera, vtk.vtkCamera): + factor.SetCamera(camera) + else: + plt = vedo.plotter_instance + if plt and plt.renderer and plt.renderer.GetActiveCamera(): + factor.SetCamera(plt.renderer.GetActiveCamera()) + + if origin is not None: + factor.SetOrigin(origin) + + self.actor = None + factor.data = self + self.actor = factor + return self + + + def wireframe(self, value=True): + """Set mesh's representation as wireframe or solid surface.""" + if value: + self.property.SetRepresentationToWireframe() + else: + self.property.SetRepresentationToSurface() + return self + + def flat(self): + """Set surface interpolation to flat. + + + """ + self.property.SetInterpolationToFlat() + return self + + def phong(self): + """Set surface interpolation to "phong".""" + self.property.SetInterpolationToPhong() + return self + + def backface_culling(self, value=True): + """Set culling of polygons based on orientation of normal with respect to camera.""" + self.property.SetBackfaceCulling(value) + return self + + def render_lines_as_tubes(self, value=True): + """Wrap a fake tube around a simple line for visualization""" + self.property.SetRenderLinesAsTubes(value) + return self + + def frontface_culling(self, value=True): + """Set culling of polygons based on orientation of normal with respect to camera.""" + self.property.SetFrontfaceCulling(value) + return self + + def backcolor(self, bc=None): + """ + Set/get mesh's backface color. + """ + back_prop = self.actor.GetBackfaceProperty() + + if bc is None: + if back_prop: + return back_prop.GetDiffuseColor() + return self + + if self.property.GetOpacity() < 1: + return self + + if not back_prop: + back_prop = vtk.vtkProperty() + + back_prop.SetDiffuseColor(colors.get_color(bc)) + back_prop.SetOpacity(self.property.GetOpacity()) + self.actor.SetBackfaceProperty(back_prop) + self.mapper.ScalarVisibilityOff() + return self + + def bc(self, backcolor=False): + """Shortcut for `mesh.backcolor()`.""" + return self.backcolor(backcolor) + + def linewidth(self, lw=None): + """Set/get width of mesh edges. Same as `lw()`.""" + if lw is not None: + if lw == 0: + self.property.EdgeVisibilityOff() + self.property.SetRepresentationToSurface() + return self + self.property.EdgeVisibilityOn() + self.property.SetLineWidth(lw) + else: + return self.property.GetLineWidth() + return self + + def lw(self, linewidth=None): + """Set/get width of mesh edges. Same as `linewidth()`.""" + return self.linewidth(linewidth) + + def linecolor(self, lc=None): + """Set/get color of mesh edges. Same as `lc()`.""" + if lc is None: + return self.property.GetEdgeColor() + self.property.EdgeVisibilityOn() + self.property.SetEdgeColor(colors.get_color(lc)) + return self + + def lc(self, linecolor=None): + """Set/get color of mesh edges. Same as `linecolor()`.""" + return self.linecolor(linecolor) + + + +######################################################################################## +class VolumeVisual(CoreVisual): + + def alpha_unit(self, u=None): + """ + Defines light attenuation per unit length. Default is 1. + The larger the unit length, the further light has to travel to attenuate the same amount. + + E.g., if you set the unit distance to 0, you will get full opacity. + It means that when light travels 0 distance it's already attenuated a finite amount. + Thus, any finite distance should attenuate all light. + The larger you make the unit distance, the more transparent the rendering becomes. + """ + if u is None: + return self.property.GetScalarOpacityUnitDistance() + self.property.SetScalarOpacityUnitDistance(u) + return self + + +# class PictureVisual(CoreVisual): + +# pass + +# class AssemblyVisual(CoreVisual): + +# pass + +######################################################################################## +class BaseActor2D(vtk.vtkActor2D): + """ + Base class. + + .. warning:: Do not use this class to instantiate objects. + """ + + def __init__(self): + """Manage 2D objects.""" + super().__init__() + + self.mapper = None + self.property = self.GetProperty() + self.filename = "" + + + def layer(self, value=None): + """Set/Get the layer number in the overlay planes into which to render.""" + if value is None: + return self.GetLayerNumber() + self.SetLayerNumber(value) + return self + + def pos(self, px=None, py=None): + """Set/Get the screen-coordinate position.""" + if isinstance(px, str): + vedo.logger.error("Use string descriptors only inside the constructor") + return self + if px is None: + return np.array(self.GetPosition(), dtype=int) + if py is not None: + p = [px, py] + else: + p = px + assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" + self.SetPosition(p) + return self + + def coordinate_system(self, value=None): + """ + Set/get the coordinate system which this coordinate is defined in. + + The options are: + 0. Display + 1. Normalized Display + 2. Viewport + 3. Normalized Viewport + 4. View + 5. Pose + 6. World + """ + coor = self.GetPositionCoordinate() + if value is None: + return coor.GetCoordinateSystem() + coor.SetCoordinateSystem(value) + return self + + def on(self): + """Set object visibility.""" + self.VisibilityOn() + return self + + def off(self): + """Set object visibility.""" + self.VisibilityOn() + return self + + def toggle(self): + """Toggle object visibility.""" + self.SetVisibility(not self.GetVisibility()) + return self + + def pickable(self, value=True): + """Set object pickability.""" + self.SetPickable(value) + return self + + def alpha(self, value=None): + """Set/Get the object opacity.""" + if value is None: + return self.property.GetOpacity() + self.property.SetOpacity(value) + return self + + def ps(self, point_size=None): + if point_size is None: + return self.property.GetPointSize() + self.property.SetPointSize(point_size) + return self + + def ontop(self, value=True): + """Keep the object always on top of everything else.""" + if value: + self.property.SetDisplayLocationToForeground() + else: + self.property.SetDisplayLocationToBackground() + return self + + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd + From 76148f0b69893a5862dd0c08c51f0d86d3d94a77 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 16:53:46 +0200 Subject: [PATCH 069/251] success try to change class structure --- vedo/addons.py | 10 +++++++--- vedo/core.py | 14 +++++++++++--- vedo/mesh.py | 1 - vedo/picture.py | 2 +- vedo/plotter.py | 37 ++++++++++++++++++++----------------- vedo/pointcloud.py | 6 +++--- vedo/visuals.py | 2 +- 7 files changed, 43 insertions(+), 29 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 976299f2..51879ebc 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -778,11 +778,15 @@ def Light(pos, focal_point=(0, 0, 0), angle=180, c=None, intensity=1): except AttributeError: c = "white" - if isinstance(pos, vedo.Base3DProp): + try: pos = pos.pos() - - if isinstance(focal_point, vedo.Base3DProp): + except AttributeError: + pass + + try: focal_point = focal_point.pos() + except AttributeError: + pass light = vtk.vtkLight() light.SetLightTypeToSceneLight() diff --git a/vedo/core.py b/vedo/core.py index e61b6d16..017395e8 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -22,7 +22,7 @@ ############################################################################### class CommonAlgorithms: - + """Common algorithms.""" @property def pointdata(self): @@ -90,6 +90,12 @@ def memory_address(self): # https://github.com/tfmoraes/polydata_connectivity return int(self.GetAddressAsString("")[5:], 16) + def memory_size(self): + """ + Return the size in bytes of the object in memory. + """ + return self.GetActualMemorySize() + def box(self, scale=1, padding=0, fill=False): """ Return the bounding box as a new `Mesh`. @@ -662,7 +668,8 @@ def shrink(self, fraction=0.8): ############################################################################### -class CorePoints(CommonAlgorithms): +class PointAlgorithms(CommonAlgorithms): + """Methods for point clouds.""" def apply_transform(self, LT, concatenate=True, deep_copy=True): """ @@ -876,7 +883,8 @@ def scale(self, s=None, reset=False, origin=True): ############################################################################### -class CoreVolumetric(CommonAlgorithms): +class VolumeAlgorithms(CommonAlgorithms): + """Methods for Volume objects.""" def isosurface(self, value=None, flying_edges=True): """ diff --git a/vedo/mesh.py b/vedo/mesh.py index 2ab96ed5..1c1da934 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -9,7 +9,6 @@ import vtkmodules.all as vtk import vedo -from vedo.colors import color_map from vedo.colors import get_color from vedo.pointcloud import Points from vedo.utils import buildPolyData, is_sequence, mag, mag2, precision diff --git a/vedo/picture.py b/vedo/picture.py index 618b842b..1f147561 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -140,7 +140,7 @@ def _set_justification(img, pos): ################################################# -class Picture2D(vedo.BaseActor2D): +class Picture2D(vedo.visuals.BaseActor2D): """ Embed an image as a static 2D image in the canvas. """ diff --git a/vedo/plotter.py b/vedo/plotter.py index 60803d88..08bb2c6e 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -864,7 +864,7 @@ def remove(self, *objs, at=None): has_actor = False for ob in objs: - if isinstance(ob, vedo.base.Base3DProp): + if hasattr(ob, "actor") and ob.actor: has_actor = True break @@ -2320,7 +2320,8 @@ def fill_event(self, ename="", pos=(), enable_picking=True): delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) - if isinstance(actor.data, vedo.base.Base3DProp): # needed! + # if isinstance(actor.data, vedo.base.Base3DProp): # needed! + if hasattr(actor.data, "picked3d"): if actor.data.picked3d is not None: delta3d = picked3d - actor.data.picked3d actor.data.picked3d = picked3d @@ -2614,9 +2615,12 @@ def compute_screen_coordinates(self, obj, full_window=False): print(event) ``` """ - if isinstance(obj, vedo.base.Base3DProp): - pts = obj.vertices - elif utils.is_sequence(obj): + try: + obj = obj.vertices + except AttributeError: + pass + + if utils.is_sequence(obj): pts = obj p2d = [] cs = vtk.vtkCoordinate() @@ -2989,18 +2993,17 @@ def show( ######################################################################### for ia in utils.flatten(actors): - if isinstance(ia, vedo.base.Base3DProp): - try: - # fix gray color labels and title to white or black - ltc = np.array(ia.scalarbar.GetLabelTextProperty().GetColor()) - if np.linalg.norm(ltc - (0.5, 0.5, 0.5)) / 3 < 0.05: - c = (0.9, 0.9, 0.9) - if np.sum(self.renderer.GetBackground()) > 1.5: - c = (0.1, 0.1, 0.1) - ia.scalarbar.GetLabelTextProperty().SetColor(c) - ia.scalarbar.GetTitleTextProperty().SetColor(c) - except AttributeError: - pass + try: + # fix gray color labels and title to white or black + ltc = np.array(ia.scalarbar.GetLabelTextProperty().GetColor()) + if np.linalg.norm(ltc - (0.5, 0.5, 0.5)) / 3 < 0.05: + c = (0.9, 0.9, 0.9) + if np.sum(self.renderer.GetBackground()) > 1.5: + c = (0.1, 0.1, 0.1) + ia.scalarbar.GetLabelTextProperty().SetColor(c) + ia.scalarbar.GetTitleTextProperty().SetColor(c) + except AttributeError: + pass if self.sharecam: for r in self.renderers: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 8779949e..23053e6a 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -11,9 +11,9 @@ import vedo from vedo import colors from vedo import utils -from vedo.base import BaseActor -from vedo.visuals import PointsVisual from vedo.transformations import LinearTransform +from vedo.core import PointAlgorithms +from vedo.visuals import PointsVisual __docformat__ = "google" @@ -477,7 +477,7 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): ################################################### -class Points(PointsVisual, BaseActor): +class Points(PointsVisual, PointAlgorithms): """Work with point clouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1): diff --git a/vedo/visuals.py b/vedo/visuals.py index b05eb741..30e04071 100644 --- a/vedo/visuals.py +++ b/vedo/visuals.py @@ -401,7 +401,7 @@ def alpha(self, alpha, vmin=None, vmax=None): return self ################################################### -class PointsVisual: +class PointsVisual(CoreVisual): """Class to manage the visual aspects of a ``Points`` object.""" ################################################## From ee3227ab4ae756b57b3455f0b8ad3a553174cffd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 18:41:43 +0200 Subject: [PATCH 070/251] Picture class works fine --- examples/volumetric/image_mask.py | 2 +- examples/volumetric/image_probe.py | 2 +- examples/volumetric/image_to_mesh.py | 3 +- vedo/__init__.py | 3 +- vedo/base.py | 2355 -------------------------- vedo/core.py | 67 +- vedo/picture.py | 410 +++-- vedo/plotter.py | 3 +- vedo/pointcloud.py | 35 - vedo/shapes.py | 2 +- vedo/tetmesh.py | 7 +- vedo/ugrid.py | 8 +- vedo/visuals.py | 155 +- vedo/volume.py | 15 +- 14 files changed, 414 insertions(+), 2653 deletions(-) delete mode 100644 vedo/base.py diff --git a/examples/volumetric/image_mask.py b/examples/volumetric/image_mask.py index 5db4fe3f..d7e38b23 100644 --- a/examples/volumetric/image_mask.py +++ b/examples/volumetric/image_mask.py @@ -28,7 +28,7 @@ gvalue = int(ngreen/total*100 + 0.5) show([ - [pic, pic.box().lw(3), "Original image. How much grass is there?"], + [pic, "Original image. How much grass is there?"], histogram(ratio_g, logscale=True, xtitle='ratio of green'), [msh.clone().cmap('Greens', data_g), f'Ratio of green is \approx {gvalue}%'], [msh.clone().cmap('Reds', data_r), 'Masking the vase region'], diff --git a/examples/volumetric/image_probe.py b/examples/volumetric/image_probe.py index c683bff5..ebc3ceb7 100644 --- a/examples/volumetric/image_probe.py +++ b/examples/volumetric/image_probe.py @@ -7,7 +7,7 @@ cpt = [580,600,0] circle = Circle(cpt, r=500, res=36).wireframe() -pts = circle.points() # 3d coords of the points of the circle +pts = circle.vertices # 3d coords of the points of the circle centers = np.zeros_like(pts) + cpt # create the same amount of center coords lines = Lines(centers, pts, res=50) # create Lines with 50 pts of resolution each diff --git a/examples/volumetric/image_to_mesh.py b/examples/volumetric/image_to_mesh.py index a7316347..97e3ee54 100644 --- a/examples/volumetric/image_to_mesh.py +++ b/examples/volumetric/image_to_mesh.py @@ -12,8 +12,7 @@ intensityz[:,2] = intensity / 10 # set the new vertex points -pts = msh.points() + intensityz -msh.points(pts) +msh.vertices += intensityz # more cosmetics msh.triangulate().smooth() diff --git a/vedo/__init__.py b/vedo/__init__.py index 245b666a..4594f45f 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -27,7 +27,7 @@ from vedo.colors import * from vedo.transformations import * from vedo.utils import * -from vedo.base import * +from vedo.core import * from vedo.shapes import * from vedo.file_io import * from vedo.ugrid import * @@ -39,6 +39,7 @@ from vedo.tetmesh import * from vedo.addons import * from vedo.plotter import * +from vedo.visuals import * from vedo import applications from vedo import interactor_modes diff --git a/vedo/base.py b/vedo/base.py deleted file mode 100644 index 7793e4ae..00000000 --- a/vedo/base.py +++ /dev/null @@ -1,2355 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import time -import numpy as np - -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk - -import vedo -from vedo import colors -from vedo import utils -from vedo.transformations import LinearTransform - - -__docformat__ = "google" - -__doc__ = "Base classes. Do not instantiate." - -__all__ = [ - "Base3DProp", - "BaseActor", - "BaseActor2D", - "BaseGrid", - # "probe_points", - # "probe_line", - # "probe_plane", -] - - -############################################################################### -class DataArrayHelper: - # Internal use only. - # Helper class to manage data associated to either - # points (or vertices) and cells (or faces). - def __init__(self, obj, association): - self.obj = obj - self.association = association - - def __getitem__(self, key): - - if self.association == 0: - data = self.obj.dataset.GetPointData() - - elif self.association == 1: - data = self.obj.dataset.GetCellData() - - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - - varr = data.GetAbstractArray(key) - if isinstance(varr, vtk.vtkStringArray): - if isinstance(key, int): - key = data.GetArrayName(key) - n = varr.GetNumberOfValues() - narr = [varr.GetValue(i) for i in range(n)] - return narr - ########### - - else: - raise RuntimeError() - - if isinstance(key, int): - key = data.GetArrayName(key) - - arr = data.GetArray(key) - if not arr: - return None - return utils.vtk2numpy(arr) - - def __setitem__(self, key, input_array): - - if self.association == 0: - data = self.obj.dataset.GetPointData() - n = self.obj.dataset.GetNumberOfPoints() - self.obj.mapper.SetScalarModeToUsePointData() - - elif self.association == 1: - data = self.obj.dataset.GetCellData() - n = self.obj.dataset.GetNumberOfCells() - self.obj.mapper.SetScalarModeToUseCellData() - - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - if not utils.is_sequence(input_array): - input_array = [input_array] - - if isinstance(input_array[0], str): - varr = vtk.vtkStringArray() - varr.SetName(key) - varr.SetNumberOfComponents(1) - varr.SetNumberOfTuples(len(input_array)) - for i, iarr in enumerate(input_array): - if isinstance(iarr, np.ndarray): - iarr = iarr.tolist() # better format - # Note: a string k can be converted to numpy with - # import json; k = np.array(json.loads(k)) - varr.InsertValue(i, str(iarr)) - else: - try: - varr = utils.numpy2vtk(input_array, name=key) - except TypeError as e: - vedo.logger.error( - f"cannot create metadata with input object:\n" - f"{input_array}" - f"\n\nAllowed content examples are:\n" - f"- flat list of strings ['a','b', 1, [1,2,3], ...]" - f" (first item must be a string in this case)\n" - f" hint: use k = np.array(json.loads(k)) to convert strings\n" - f"- numpy arrays of any shape" - ) - raise e - - data.AddArray(varr) - return ############ - - else: - raise RuntimeError() - - if len(input_array) != n: - vedo.logger.error( - f"Error in point/cell data: length of input {len(input_array)}" - f" != {n} nr. of elements" - ) - raise RuntimeError() - - input_array = np.asarray(input_array) - varr = utils.numpy2vtk(input_array, name=key) - data.AddArray(varr) - - if len(input_array.shape) == 1: # scalars - data.SetActiveScalars(key) - elif len(input_array.shape) == 2 and input_array.shape[1] == 3: # vectors - if key.lower() == "normals": - data.SetActiveNormals(key) - else: - data.SetActiveVectors(key) - - def keys(self): - """Return the list of available data array names""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - elif self.association == 1: - data = self.obj.dataset.GetCellData() - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - arrnames = [] - for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() - if name: - arrnames.append(name) - return arrnames - - def remove(self, key): - """Remove a data array by name or number""" - if self.association == 0: - self.obj.dataset.GetPointData().RemoveArray(key) - elif self.association == 1: - self.obj.dataset.GetCellData().RemoveArray(key) - elif self.association == 2: - self.obj.dataset.GetFieldData().RemoveArray(key) - - def clear(self): - """Remove all data associated to this object""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - elif self.association == 1: - data = self.obj.dataset.GetCellData() - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() - data.RemoveArray(name) - - def rename(self, oldname, newname): - """Rename an array""" - if self.association == 0: - varr = self.obj.dataset.GetPointData().GetArray(oldname) - elif self.association == 1: - varr = self.obj.dataset.GetCellData().GetArray(oldname) - elif self.association == 2: - varr = self.obj.dataset.GetFieldData().GetArray(oldname) - if varr: - varr.SetName(newname) - else: - vedo.logger.warning(f"Cannot rename non existing array {oldname} to {newname}") - - def select(self, key): - """Select one specific array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() - else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() - - if isinstance(key, int): - key = data.GetArrayName(key) - - arr = data.GetArray(key) - if not arr: - return - - nc = arr.GetNumberOfComponents() - if nc == 1: - data.SetActiveScalars(key) - elif nc >= 2: - if "rgb" in key.lower(): - data.SetActiveScalars(key) - # try: - # self.mapper.SetColorModeToDirectScalars() - # except AttributeError: - # pass - else: - data.SetActiveVectors(key) - elif nc >= 4: - data.SetActiveTensors(key) - - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - # .. could be a volume mapper - except AttributeError: - pass - - def select_scalars(self, key): - """Select one specific scalar array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() - else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() - - if isinstance(key, int): - key = data.GetArrayName(key) - - data.SetActiveScalars(key) - - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - except AttributeError: - pass - - def select_vectors(self, key): - """Select one specific vector array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() - else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() - - if isinstance(key, int): - key = data.GetArrayName(key) - - data.SetActiveVectors(key) - - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - except AttributeError: - pass - - def print(self, **kwargs): - """Print the array names available to terminal""" - colors.printc(self.keys(), **kwargs) - - def __repr__(self) -> str: - """Representation""" - - def _get_str(pd, header): - if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7m{header}" - if self.obj.name: - out += f" in {self.obj.name}" - out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" - for i in range(pd.GetNumberOfArrays()): - varr = pd.GetArray(i) - out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" - out += "\nindex".ljust(15) + f": {i}" - t = varr.GetDataType() - if t in vedo.utils.array_types: - out += f"\ntype".ljust(15) - out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" - shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) - out += "\nshape".ljust(15) + f": {shape}" - out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" - out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" - out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" - out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" - else: - out += " has no associated data." - return out - - if self.association == 0: - out = _get_str(self.dataset.GetPointData(), "Point Data") - elif self.association == 1: - out = _get_str(self.dataset.GetCellData(), "Cell Data") - elif self.association == 2: - pd = self.dataset.GetFieldData() - if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" - if self.actor.name: - out += f" in {self.actor.name}" - out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" - for i in range(pd.GetNumberOfArrays()): - varr = pd.GetAbstractArray(i) - out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" - out += "\nindex".ljust(15) + f": {i}" - shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) - out += "\nshape".ljust(15) + f": {shape}" - - return out - - -############################################################################### -class Base3DProp: - """ - Base class to manage positioning and size of the objects in space and other properties. - - .. warning:: Do not use this class to instantiate objects - """ - - def __init__(self): - """ - Base class to manage positioning and size of the objects in space and other properties. - """ - self.filename = "" - self.name = "" - self.file_size = "" - self.trail = None - self.trail_points = [] - self.trail_segment_size = 0 - self.trail_offset = None - self.shadows = [] - self.axes = None - self.picked3d = None - - self.top = np.array([0, 0, 1]) - self.base = np.array([0, 0, 0]) - self.info = {} - self.time = time.time() - self.rendered_at = set() - self.transform = LinearTransform() - - self.point_locator = None - self.cell_locator = None - self.line_locator = None - - self.scalarbar = None - # self.scalarbars = dict() #TODO - self.pipeline = None - - def memory_address(self): - """ - Return a unique memory address integer which may serve as the ID of the - object, or passed to c++ code. - """ - # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ - # https://github.com/tfmoraes/polydata_connectivity - return int(self.GetAddressAsString("")[5:], 16) - - def pickable(self, value=None): - """Set/get the pickability property of an object.""" - if value is None: - return self.actor.GetPickable() - self.actor.SetPickable(value) - return self - - def draggable(self, value=None): # NOT FUNCTIONAL? - """Set/get the draggability property of an object.""" - if value is None: - return self.actor.GetDragable() - self.actor.SetDragable(value) - return self - - def apply_transform(self, LT, concatenate=True, deep_copy=True): - """ - Apply a linear or non-linear transformation to the mesh polygonal data. - ```python - from vedo import Cube, show - c1 = Cube().rotate_z(5).x(2).y(1) - print("cube1 position", c1.pos()) - T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y - c2 = Cube().c('r4') - c2.apply_transform(T) # ignore previous movements - c2.apply_transform(T, concatenate=True) - c2.apply_transform(T, concatenate=True) - print("cube2 position", c2.pos()) - show(c1, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/apply_transform.png) - """ - if isinstance(LT, LinearTransform): - tr = LT.T - if LT.is_identity(): - return self - if concatenate: - self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): - LT = LinearTransform(LT) - if LT.is_identity(): - return self - tr = LT.T - if concatenate: - self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): - tr = LT - # cannot concatenate here - - tp = vtk.vtkTransformPolyDataFilter() - tp.SetTransform(tr) - tp.SetInputData(self.dataset) - tp.Update() - out = tp.GetOutput() - - if deep_copy: - self.dataset.DeepCopy(out) - else: - self.dataset.ShallowCopy(out) - - # reset the locators - self.point_locator = None - self.cell_locator = None - self.line_locator = None - return self - - - def pos(self, x=None, y=None, z=None): - """Set/Get object position.""" - if x is None: # get functionality - return self.transform.position - - if z is None and y is None: # assume x is of the form (x,y,z) - if len(x) == 3: - x, y, z = x - else: - x, y = x - z = 0 - elif z is None: # assume x,y is of the form x, y - z = 0 - - q = self.transform.position - LT = LinearTransform() - LT.translate([x,y,z] - q) - return self.apply_transform(LT) - - def shift(self, dx=0, dy=0, dz=0): - """Add a vector to the current object position.""" - if utils.is_sequence(dx): - utils.make3d(dx) - dx, dy, dz = dx - LT = LinearTransform().translate([dx, dy, dz]) - return self.apply_transform(LT) - - def x(self, val=None): - """Set/Get object position along x axis.""" - p = self.transform.position - if val is None: - return p[0] - self.pos(val, p[1], p[2]) - return self - - def y(self, val=None): - """Set/Get object position along y axis.""" - p = self.transform.position - if val is None: - return p[1] - self.pos(p[0], val, p[2]) - return self - - def z(self, val=None): - """Set/Get object position along z axis.""" - p = self.transform.position - if val is None: - return p[2] - self.pos(p[0], p[1], val) - return self - - def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): - """ - Rotate around an arbitrary `axis` passing through `point`. - - Example: - ```python - from vedo import * - c1 = Cube() - c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - v = vector(0.2,1,0) - p = vector(1,0,0) # axis passes through this point - c2.rotate(90, axis=v, point=p) - l = Line(-v+p, v+p).lw(3).c('red') - show(c1, l, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/rotate_axis.png) - """ - # self.rotate(angle, axis, point, rad) - LT = LinearTransform() - LT.rotate(angle, axis, point, rad) - return self.apply_transform(LT) - - def rotate_x(self, angle, rad=False, around=None): - """ - Rotate around x-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_x(angle, rad, around) - return self.apply_transform(LT) - - def rotate_y(self, angle, rad=False, around=None): - """ - Rotate around y-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_y(angle, rad, around) - return self.apply_transform(LT) - - def rotate_z(self, angle, rad=False, around=None): - """ - Rotate around z-axis. If angle is in radians set `rad=True`. - - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_z(angle, rad, around) - return self.apply_transform(LT) - - def reorient(self, - newaxis, - initaxis=None, - rotation=0, - rad=False, - xyplane=True, - ): - """ - Reorient the object to point to a new direction from an initial one. - If `initaxis` is None, the object will be assumed in its "default" orientation. - If `xyplane` is True, the object will be rotated to lie on the xy plane. - - Use `rotation` to first rotate the object around its `initaxis`. - """ - if initaxis is None: - initaxis = np.asarray(self.top) - self.base - - q = self.transform.position - LT = LinearTransform() - LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) - return self.apply_transform(LT) - - def scale(self, s=None, reset=False, origin=True): - """ - Set/get object's scaling factor. - - Arguments: - s : (list, float) - scaling factor(s). - reset : (bool) - if True previous scaling factors are ignored. - origin : (bool) - if True scaling is applied with respect to object's position, - otherwise is applied respect to (0,0,0). - - Note: - use `s=(sx,sy,sz)` to scale differently in the three coordinates. - """ - if s is None: - return np.array(self.transform.T.GetScale()) - - if not utils.is_sequence(s): - s = [s, s, s] - - LT = LinearTransform() - if reset: - old_s = np.array(self.transform.T.GetScale()) - LT.scale(s / old_s) - else: - if origin is True: - LT.scale(s, origin=self.transform.position) - elif origin is False: - LT.scale(s, origin=False) - else: - LT.scale(s, origin=origin) - - return self.apply_transform(LT) - - - def align_to_bounding_box(self, msh, rigid=False): - """ - Align the current object's bounding box to the bounding box - of the input object. - - Use `rigid` to disable scaling. - - Examples: - - [align6.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align6.py) - """ - lmt = vtk.vtkLandmarkTransform() - ss = vtk.vtkPoints() - xss0, xss1, yss0, yss1, zss0, zss1 = self.bounds() - for p in [ - [xss0, yss0, zss0], - [xss1, yss0, zss0], - [xss1, yss1, zss0], - [xss0, yss1, zss0], - [xss0, yss0, zss1], - [xss1, yss0, zss1], - [xss1, yss1, zss1], - [xss0, yss1, zss1], - ]: - ss.InsertNextPoint(p) - st = vtk.vtkPoints() - xst0, xst1, yst0, yst1, zst0, zst1 = msh.bounds() - for p in [ - [xst0, yst0, zst0], - [xst1, yst0, zst0], - [xst1, yst1, zst0], - [xst0, yst1, zst0], - [xst0, yst0, zst1], - [xst1, yst0, zst1], - [xst1, yst1, zst1], - [xst0, yst1, zst1], - ]: - st.InsertNextPoint(p) - - lmt.SetSourceLandmarks(ss) - lmt.SetTargetLandmarks(st) - lmt.SetModeToAffine() - if rigid: - lmt.SetModeToRigidBody() - lmt.Update() - - LT = LinearTransform(lmt) - self.apply_transform(LT) - return self - - def on(self): - """Switch on object visibility. Object is not removed.""" - self.actor.VisibilityOn() - try: - self.scalarbar.actor.VisibilityOn() - except AttributeError: - pass - try: - self.trail.actor.VisibilityOn() - except AttributeError: - pass - try: - for sh in self.shadows: - sh.actor.VisibilityOn() - except AttributeError: - pass - return self - - def off(self): - """Switch off object visibility. Object is not removed.""" - self.actor.VisibilityOff() - try: - self.scalarbar.actor.VisibilityOff() - except AttributeError: - pass - try: - self.trail.actor.VisibilityOff() - except AttributeError: - pass - try: - for sh in self.shadows: - sh.actor.VisibilityOff() - except AttributeError: - pass - return self - - def toggle(self): - """Toggle object visibility on/off.""" - v = self.actor.GetVisibility() - if v: - self.off() - else: - self.on() - return self - - def box(self, scale=1, padding=0, fill=False): - """ - Return the bounding box as a new `Mesh`. - - Arguments: - scale : (float) - box size can be scaled by a factor - padding : (float, list) - a constant padding can be added (can be a list [padx,pady,padz]) - - Examples: - - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) - """ - b = self.bounds() - if not utils.is_sequence(padding): - padding = [padding, padding, padding] - length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] - tol = (length + width + height) / 30000 # useful for boxing 2D text - pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] - bx = vedo.shapes.Box( - pos, - length * scale + padding[0], - width * scale + padding[1], - height * scale + padding[2], - c="gray", - ) - try: - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - bx.SetProperty(pr) - bx.property = pr - except (AttributeError, TypeError): - pass - bx.wireframe(not fill) - bx.flat().lighting("off") - return bx - - def use_bounds(self, value=True): - """ - Instruct the current camera to either take into account or ignore - the object bounds when resetting. - """ - self.actor.SetUseBounds(value) - return self - - def bounds(self): - """ - Get the object bounds. - Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. - """ - try: - pts = self.vertices - xmin, ymin, zmin = np.min(pts, axis=0) - xmax, ymax, zmax = np.max(pts, axis=0) - return (xmin, xmax, ymin, ymax, zmin, zmax) - except (AttributeError, ValueError): - return self.dataset.GetBounds() - - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) - - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) - - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) - - - def diagonal_size(self): - """Get the length of the diagonal of mesh bounding box.""" - b = self.bounds() - return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - # return self.dataset.GetLength() # ???different??? - - - def copy_data_from(self, obj): - """Copy all data (point and cell data) from this input object""" - self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) - self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) - self.pipeline = utils.OperationNode( - f"copy_data_from\n{obj.__class__.__name__}", - parents=[self, obj], - shape="note", - c="#ccc5b9", - ) - return self - - def print(self): - """Print information about an object.""" - utils.print_info(self) - return self - - def show(self, **options): - """ - Create on the fly an instance of class `Plotter` or use the last existing one to - show one single object. - - This method is meant as a shortcut. If more than one object needs to be visualised - please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - - Returns the `Plotter` class instance. - """ - return vedo.plotter.show(self, **options) - - def add_observer(self, event_name, func, priority=0): - """Add a callback function that will be called when an event occurs.""" - event_name = utils.get_vtk_name_event(event_name) - idd = self.AddObserver(event_name, func, priority) - return idd - - def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): - """Build a thumbnail of the object and return it as an array.""" - # speed is about 20Hz for size=[200,200] - ren = vtk.vtkRenderer() - ren.AddActor(self) - if axes: - axes = vedo.addons.Axes(self) - ren.AddActor(axes) - ren.ResetCamera() - cam = ren.GetActiveCamera() - cam.Zoom(zoom) - cam.Elevation(elevation) - cam.Azimuth(azimuth) - - ren_win = vtk.vtkRenderWindow() - ren_win.SetOffScreenRendering(True) - ren_win.SetSize(size) - ren.SetBackground(colors.get_color(bg)) - ren_win.AddRenderer(ren) - ren_win.Render() - - nx, ny = ren_win.GetSize() - arr = vtk.vtkUnsignedCharArray() - ren_win.GetRGBACharPixelData(0, 0, nx - 1, ny - 1, 0, arr) - narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) - narr = np.ascontiguousarray(np.flip(narr, axis=0)) - - ren.RemoveActor(self) - if axes: - ren.RemoveActor(axes) - ren_win.Finalize() - del ren_win - return narr - - -######################################################################################## -class BaseActor(Base3DProp): - """ - Base class. - - .. warning:: Do not use this class to instantiate objects, use one the above instead. - """ - def inputdata(self): - """Obsolete, use `self` instead.""" - print("WARNING: inputdata() is obsolete, use self instead.") - return self - - @property - def npoints(self): - """Retrieve the number of points.""" - return self.dataset.GetNumberOfPoints() - - @property - def ncells(self): - """Retrieve the number of cells.""" - return self.dataset.GetNumberOfCells() - - def points(self, pts=None): - """ - Obsolete, use `self.vertices` instead. - - Set/Get the vertex coordinates of a mesh or point cloud. - """ - print("WARNING: .points() is obsolete, use .vertices instead.") - if pts is None: ### getter - - if isinstance(self, vedo.Points): - vpts = self.dataset.GetPoints() - elif isinstance(self, vedo.BaseVolume): - v2p = vtk.vtkImageToPoints() - v2p.SetInputData(self.imagedata()) - v2p.Update() - vpts = v2p.GetOutput().GetPoints() - else: # tetmesh et al - vpts = self.dataset.GetPoints() - - if vpts: - return utils.vtk2numpy(vpts.GetData()) - return np.array([], dtype=np.float32) - - else: - - pts = np.asarray(pts, dtype=np.float32) - - if pts.ndim == 1: - ### getter by point index ################### - indices = pts.astype(int) - vpts = self.dataset.GetPoints() - arr = utils.vtk2numpy(vpts.GetData()) - return arr[indices] ########### - - ### setter #################################### - if pts.shape[1] == 2: - pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] - arr = utils.numpy2vtk(pts, dtype=np.float32) - - vpts = self.dataset.GetPoints() - vpts.SetData(arr) - vpts.Modified() - # reset mesh to identity matrix position/rotation: - self.point_locator = None - self.cell_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) - self.transform = LinearTransform() - return self - - @property - def cell_centers(self): - """ - Get the coordinates of the cell centers. - - Examples: - - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) - """ - vcen = vtk.vtkCellCenters() - vcen.SetInputData(self.dataset) - vcen.Update() - return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) - - def delete_cells(self, ids): - """ - Remove cells from the mesh object by their ID. - Points (vertices) are not removed (you may use `.clean()` to remove those). - """ - self.BuildLinks() - for cid in ids: - self.DeleteCell(cid) - self.RemoveDeletedCells() - self.Modified() - self.mapper.Modified() - self.pipeline = utils.OperationNode( - "delete_cells", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" - ) - return self - - def mark_boundaries(self): - """ - Mark cells and vertices of the mesh if they lie on a boundary. - A new array called `BoundaryCells` is added to the mesh. - """ - mb = vtk.vtkMarkBoundaryFilter() - mb.SetInputData(self.datset) - mb.Update() - self.DeepCopy(mb.GetOutput()) - self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) - return self - - def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): - """ - Find cells that are within the specified bounds. - Setting a color will add a vtk array to colorize these cells. - """ - if len(xbounds) == 6: - bnds = xbounds - else: - bnds = list(self.bounds()) - if len(xbounds) == 2: - bnds[0] = xbounds[0] - bnds[1] = xbounds[1] - if len(ybounds) == 2: - bnds[2] = ybounds[0] - bnds[3] = ybounds[1] - if len(zbounds) == 2: - bnds[4] = zbounds[0] - bnds[5] = zbounds[1] - - cellIds = vtk.vtkIdList() - self.cell_locator = vtk.vtkCellTreeLocator() - self.cell_locator.SetDataSet(self.dataset) - self.cell_locator.BuildLocator() - self.cell_locator.FindCellsWithinBounds(bnds, cellIds) - - cids = [] - for i in range(cellIds.GetNumberOfIds()): - cid = cellIds.GetId(i) - cids.append(cid) - - return np.array(cids) - - def count_vertices(self): - """Count the number of vertices each cell has and return it as a numpy array""" - vc = vtk.vtkCountVertices() - vc.SetInputData(self.datset) - vc.SetOutputArrayName("VertexCount") - vc.Update() - varr = vc.GetOutput().GetCellData().GetArray("VertexCount") - return utils.vtk2numpy(varr) - - def print_histogram( - self, - bins=10, - height=10, - logscale=False, - minbin=0, - horizontal=False, - char="\U00002589", - c=None, - bold=True, - title="Histogram", - ): - """ - Ascii histogram printing on terminal. - Input can be `Volume` or `Mesh` (will grab the active point array). - - Arguments: - bins : (int) - number of histogram bins - height : (int) - height of the histogram in character units - logscale : (bool) - use logscale for frequencies - minbin : (int) - ignore bins before minbin - horizontal : (bool) - show histogram horizontally - char : (str) - character to be used as marker - c : (color) - ascii color - bold : (bool) - use boldface - title : (str) - histogram title - - ![](https://vedo.embl.es/images/feats/histoprint.png) - """ - utils.print_histogram( - self, bins, height, logscale, minbin, horizontal, char, c, bold, title - ) - return self - - @property - def pointdata(self): - """ - Create and/or return a `numpy.array` associated to points (vertices). - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.pointdata["arrayname"]` - - Usage: - - `myobj.pointdata.keys()` to return the available data array names - - `myobj.pointdata.select(name)` to make this array the active one - - `myobj.pointdata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 0) - - @property - def celldata(self): - """ - Create and/or return a `numpy.array` associated to cells (faces). - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.celldata["arrayname"]` - - Usage: - - `myobj.celldata.keys()` to return the available data array names - - `myobj.celldata.select(name)` to make this array the active one - - `myobj.celldata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 1) - - @property - def metadata(self): - """ - Create and/or return a `numpy.array` associated to neither cells nor faces. - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.metadata["arrayname"]` - - Usage: - - `myobj.metadata.keys()` to return the available data array names - - `myobj.metadata.select(name)` to make this array the active one - - `myobj.metadata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 2) - - def map_cells_to_points(self, arrays=(), move=False): - """ - Interpolate cell data (i.e., data specified per cell or face) - into point data (i.e., data specified at each vertex). - The method of transformation is based on averaging the data values - of all cells using a particular point. - - A custom list of arrays to be mapped can be passed in input. - - Set `move=True` to delete the original `celldata` array. - """ - c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(self.dataset) - if not move: - c2p.PassCellDataOn() - if arrays: - c2p.ClearCellDataArrays() - c2p.ProcessAllArraysOff() - for arr in arrays: - c2p.AddCellDataArray(arr) - else: - c2p.ProcessAllArraysOn() - c2p.Update() - self.mapper.SetScalarModeToUsePointData() - self._update(c2p.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) - return self - - def map_points_to_cells(self, arrays=(), move=False): - """ - Interpolate point data (i.e., data specified per point or vertex) - into cell data (i.e., data specified per cell). - The method of transformation is based on averaging the data values - of all points defining a particular cell. - - A custom list of arrays to be mapped can be passed in input. - - Set `move=True` to delete the original `pointdata` array. - - Examples: - - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) - """ - p2c = vtk.vtkPointDataToCellData() - p2c.SetInputData(self.dataset) - if not move: - p2c.PassPointDataOn() - if arrays: - p2c.ClearPointDataArrays() - p2c.ProcessAllArraysOff() - for arr in arrays: - p2c.AddPointDataArray(arr) - else: - p2c.ProcessAllArraysOn() - p2c.Update() - self.mapper.SetScalarModeToUseCellData() - self._update(p2c.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) - return self - - def resample_data_from(self, source, tol=None, categorical=False): - """ - Resample point and cell data from another dataset. - The output has the same structure but its point data have - the resampled values from target. - - Use `tol` to set the tolerance used to compute whether - a point in the source is in a cell of the current object. - Points without resampled values, and their cells, are marked as blank. - If the data is categorical, then the resulting data will be determined - by a nearest neighbor interpolation scheme. - - Example: - ```python - from vedo import * - m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) - pts = m1.vertices - ces = m1.cell_centers - m1.pointdata["xvalues"] = np.power(pts[:,0], 3) - m1.celldata["yvalues"] = np.power(ces[:,1], 3) - m2 = Mesh(dataurl+'bunny.obj') - m2.resample_arrays_from(m1) - # print(m2.pointdata["xvalues"]) - show(m1, m2 , N=2, axes=1) - ``` - """ - rs = vtk.vtkResampleWithDataSet() - rs.SetInputData(self.datset) - rs.SetSourceData(source) - - rs.SetPassPointArrays(True) - rs.SetPassCellArrays(True) - rs.SetPassFieldArrays(True) - rs.SetCategoricalData(categorical) - - rs.SetComputeTolerance(True) - if tol: - rs.SetComputeTolerance(False) - rs.SetTolerance(tol) - rs.Update() - self._update(rs.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode( - f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] - ) - return self - - def add_ids(self): - """Generate point and cell ids arrays.""" - ids = vtk.vtkIdFilter() - ids.SetInputData(self.datset) - ids.PointIdsOn() - ids.CellIdsOn() - ids.FieldDataOff() - ids.SetPointIdsArrayName("PointID") - ids.SetCellIdsArrayName("CellID") - ids.Update() - self._update(ids.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("add_ids", parents=[self]) - return self - - def gradient(self, input_array=None, on="points", fast=False): - """ - Compute and return the gradiend of the active scalar field as a numpy array. - - Arguments: - input_array : (str) - array of the scalars to compute the gradient, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). - - Examples: - - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) - - ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) - """ - gra = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - - if input_array is None: - if varr.GetScalars(): - input_array = varr.GetScalars().GetName() - else: - vedo.logger.error(f"in gradient: no scalars found for {on}") - raise RuntimeError - - gra.SetInputData(self.dataset) - gra.SetInputScalars(tp, input_array) - gra.SetResultArrayName("Gradient") - gra.SetFasterApproximation(fast) - gra.ComputeDivergenceOff() - gra.ComputeVorticityOff() - gra.ComputeGradientOn() - gra.Update() - if on.startswith("p"): - gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) - else: - gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) - return gvecs - - def divergence(self, array_name=None, on="points", fast=False): - """ - Compute and return the divergence of a vector field as a numpy array. - - Arguments: - array_name : (str) - name of the array of vectors to compute the divergence, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). - """ - div = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - - if array_name is None: - if varr.GetVectors(): - array_name = varr.GetVectors().GetName() - else: - vedo.logger.error(f"in divergence(): no vectors found for {on}") - raise RuntimeError - - div.SetInputData(self.datset) - div.SetInputScalars(tp, array_name) - div.ComputeDivergenceOn() - div.ComputeGradientOff() - div.ComputeVorticityOff() - div.SetDivergenceArrayName("Divergence") - div.SetFasterApproximation(fast) - div.Update() - if on.startswith("p"): - dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) - else: - dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) - return dvecs - - def vorticity(self, array_name=None, on="points", fast=False): - """ - Compute and return the vorticity of a vector field as a numpy array. - - Arguments: - array_name : (str) - name of the array to compute the vorticity, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). - """ - vort = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - - if array_name is None: - if varr.GetVectors(): - array_name = varr.GetVectors().GetName() - else: - vedo.logger.error(f"in vorticity(): no vectors found for {on}") - raise RuntimeError - - vort.SetInputData(self.datset) - vort.SetInputScalars(tp, array_name) - vort.ComputeDivergenceOff() - vort.ComputeGradientOff() - vort.ComputeVorticityOn() - vort.SetVorticityArrayName("Vorticity") - vort.SetFasterApproximation(fast) - vort.Update() - if on.startswith("p"): - vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) - else: - vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) - return vvecs - - def add_scalarbar( - self, - title="", - pos=(0.8, 0.05), - title_yoffset=15, - font_size=12, - size=(None, None), - nlabels=None, - c=None, - horizontal=False, - use_alpha=True, - label_format=":6.3g", - ): - """ - Add a 2D scalar bar for the specified obj. - - Examples: - - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) - """ - plt = vedo.plotter_instance - - if plt and plt.renderer: - c = (0.9, 0.9, 0.9) - if np.sum(plt.renderer.GetBackground()) > 1.5: - c = (0.1, 0.1, 0.1) - if isinstance(self.scalarbar, vtk.vtkActor): - plt.renderer.RemoveActor(self.scalarbar) - elif isinstance(self.scalarbar, vedo.Assembly): - for a in self.scalarbar.unpack(): - plt.renderer.RemoveActor(a) - if c is None: - c = "gray" - - sb = vedo.addons.ScalarBar( - self, - title, - pos, - title_yoffset, - font_size, - size, - nlabels, - c, - horizontal, - use_alpha, - label_format, - ) - self.scalarbar = sb - return self - - def add_scalarbar3d( - self, - title="", - pos=None, - size=(None, None), - title_font="", - title_xoffset=-1.5, - title_yoffset=0.0, - title_size=1.5, - title_rotation=0.0, - nlabels=9, - label_font="", - label_size=1, - label_offset=0.375, - label_rotation=0, - label_format="", - italic=0, - c=None, - draw_box=True, - above_text=None, - below_text=None, - nan_text="NaN", - categories=None, - ): - """ - Associate a 3D scalar bar to the object and add it to the scene. - The new scalarbar object (Assembly) will be accessible as obj.scalarbar - - Arguments: - size : (list) - (thickness, length) of scalarbar - title : (str) - scalar bar title - title_xoffset : (float) - horizontal space btw title and color scalarbar - title_yoffset : (float) - vertical space offset - title_size : (float) - size of title wrt numeric labels - title_rotation : (float) - title rotation in degrees - nlabels : (int) - number of numeric labels - label_font : (str) - font type for labels - label_size : (float) - label scale factor - label_offset : (float) - space btw numeric labels and scale - label_rotation : (float) - label rotation in degrees - label_format : (str) - label format for floats and integers (e.g. `':.2f'`) - draw_box : (bool) - draw a box around the colorbar - categories : (list) - make a categorical scalarbar, - the input list will have the format `[value, color, alpha, textlabel]` - - Examples: - - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) - """ - plt = vedo.plotter_instance - if plt and c is None: # automatic black or white - c = (0.9, 0.9, 0.9) - if np.sum(vedo.get_color(plt.backgrcol)) > 1.5: - c = (0.1, 0.1, 0.1) - if c is None: - c = (0, 0, 0) - c = vedo.get_color(c) - - self.scalarbar = vedo.addons.ScalarBar3D( - self, - title, - pos, - size, - title_font, - title_xoffset, - title_yoffset, - title_size, - title_rotation, - nlabels, - label_font, - label_size, - label_offset, - label_rotation, - label_format, - italic, - c, - draw_box, - above_text, - below_text, - nan_text, - categories, - ) - return self - - ################################################################################### - def write(self, filename, binary=True): - """Write object to file.""" - out = vedo.file_io.write(self, filename, binary) - out.pipeline = utils.OperationNode( - "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" - ) - return out - - -######################################################################################## -class BaseGrid(BaseActor): - """ - Base class for grid datasets. - - .. warning:: Do not use this class to instantiate objects. - """ - - def __init__(self): - """Base class for grid datasets.""" - - super().__init__() - - self._data = None - self.useCells = True - self._color = None - self._alpha = [0, 1] - - # ----------------------------------------------------------- - - # def _update(self, data): - # self.mapper.SetInputData(self.tomesh()) - # self.mapper.Modified() - # return self - - def tomesh(self, fill=True, shrink=1.0): - """ - Build a polygonal Mesh from the current Grid object. - - If `fill=True`, the interior faces of all the cells are created. - (setting a `shrink` value slightly smaller than the default 1.0 - can avoid flickering due to internal adjacent faces). - - If `fill=False`, only the boundary faces will be generated. - """ - gf = vtk.vtkGeometryFilter() - if fill: - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) - sf.SetShrinkFactor(shrink) - sf.Update() - gf.SetInputData(sf.GetOutput()) - gf.Update() - poly = gf.GetOutput() - if shrink == 1.0: - cleanPolyData = vtk.vtkCleanPolyData() - cleanPolyData.PointMergingOn() - cleanPolyData.ConvertLinesToPointsOn() - cleanPolyData.ConvertPolysToLinesOn() - cleanPolyData.ConvertStripsToPolysOn() - cleanPolyData.SetInputData(poly) - cleanPolyData.Update() - poly = cleanPolyData.GetOutput() - else: - gf.SetInputData(self.datset) - gf.Update() - poly = gf.GetOutput() - - msh = vedo.mesh.Mesh(poly).flat() - msh.scalarbar = self.scalarbar - lut = utils.ctf2lut(self) - if lut: - msh.mapper.SetLookupTable(lut) - if self.useCells: - msh.mapper.SetScalarModeToUseCellData() - else: - msh.mapper.SetScalarModeToUsePointData() - - msh.pipeline = utils.OperationNode( - "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - ) - return msh - - def cells(self): - """ - Get the cells connectivity ids as a numpy array. - - The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - """ - arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) - if arr1d is None: - return [] - - # Get cell connettivity ids as a 1D array. vtk format is: - # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - i = 0 - conn = [] - n = len(arr1d) - if n: - while True: - cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] - conn.append(cell) - i += arr1d[i] + 1 - if i >= n: - break - return conn - - def color(self, col, alpha=None, vmin=None, vmax=None): - """ - Assign a color or a set of colors along the range of the scalar value. - A single constant color can also be assigned. - Any matplotlib color map name is also accepted, e.g. `volume.color('jet')`. - - E.g.: say that your cells scalar runs from -3 to 6, - and you want -3 to show red and 1.5 violet and 6 green, then just set: - - `volume.color(['red', 'violet', 'green'])` - - You can also assign a specific color to a aspecific value with eg.: - - `volume.color([(0,'red', (0.5,'violet'), (1,'green')])` - - Arguments: - alpha : (list) - use a list to specify transparencies along the scalar range - vmin : (float) - force the min of the scalar range to be this value - vmax : (float) - force the max of the scalar range to be this value - """ - # supersedes method in Points, Mesh - - if col is None: - return self - - if vmin is None: - vmin, _ = self.dataset.GetScalarRange() - if vmax is None: - _, vmax = self.dataset.GetScalarRange() - ctf = self.property.GetRGBTransferFunction() - ctf.RemoveAllPoints() - self._color = col - - if utils.is_sequence(col): - if utils.is_sequence(col[0]) and len(col[0]) == 2: - # user passing [(value1, color1), ...] - for x, ci in col: - r, g, b = colors.get_color(ci) - ctf.AddRGBPoint(x, r, g, b) - # colors.printc('color at', round(x, 1), - # 'set to', colors.get_color_name((r, g, b)), - # c='w', bold=0) - else: - # user passing [color1, color2, ..] - for i, ci in enumerate(col): - r, g, b = colors.get_color(ci) - x = vmin + (vmax - vmin) * i / (len(col) - 1) - ctf.AddRGBPoint(x, r, g, b) - elif isinstance(col, str): - if col in colors.colors.keys() or col in colors.color_nicks.keys(): - r, g, b = colors.get_color(col) - ctf.AddRGBPoint(vmin, r, g, b) # constant color - ctf.AddRGBPoint(vmax, r, g, b) - else: # assume it's a colormap - for x in np.linspace(vmin, vmax, num=64, endpoint=True): - r, g, b = colors.color_map(x, name=col, vmin=vmin, vmax=vmax) - ctf.AddRGBPoint(x, r, g, b) - elif isinstance(col, int): - r, g, b = colors.get_color(col) - ctf.AddRGBPoint(vmin, r, g, b) # constant color - ctf.AddRGBPoint(vmax, r, g, b) - else: - vedo.logger.warning(f"in color() unknown input type {type(col)}") - - if alpha is not None: - self.alpha(alpha, vmin=vmin, vmax=vmax) - return self - - def alpha(self, alpha, vmin=None, vmax=None): - """ - Assign a set of tranparencies along the range of the scalar value. - A single constant value can also be assigned. - - E.g.: say `alpha=(0.0, 0.3, 0.9, 1)` and the scalar range goes from -10 to 150. - Then all cells with a value close to -10 will be completely transparent, cells at 1/4 - of the range will get an alpha equal to 0.3 and voxels with value close to 150 - will be completely opaque. - - As a second option one can set explicit (x, alpha_x) pairs to define the transfer function. - - E.g.: say `alpha=[(-5, 0), (35, 0.4) (123,0.9)]` and the scalar range goes from -10 to 150. - Then all cells below -5 will be completely transparent, cells with a scalar value of 35 - will get an opacity of 40% and above 123 alpha is set to 90%. - """ - if vmin is None: - vmin, _ = self.dataset.GetScalarRange() - if vmax is None: - _, vmax = self.dataset.GetScalarRange() - otf = self.property.GetScalarOpacity() - otf.RemoveAllPoints() - self._alpha = alpha - - if utils.is_sequence(alpha): - alpha = np.array(alpha) - if len(alpha.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) - for i, al in enumerate(alpha): - xalpha = vmin + (vmax - vmin) * i / (len(alpha) - 1) - # Create transfer mapping scalar value to opacity - otf.AddPoint(xalpha, al) - # colors.printc("alpha at", round(xalpha, 1), "\tset to", al) - elif len(alpha.shape) == 2: # user passing [(x0,alpha0), ...] - otf.AddPoint(vmin, alpha[0][1]) - for xalpha, al in alpha: - # Create transfer mapping scalar value to opacity - otf.AddPoint(xalpha, al) - otf.AddPoint(vmax, alpha[-1][1]) - - else: - - otf.AddPoint(vmin, alpha) # constant alpha - otf.AddPoint(vmax, alpha) - - return self - - def alpha_unit(self, u=None): - """ - Defines light attenuation per unit length. Default is 1. - The larger the unit length, the further light has to travel to attenuate the same amount. - - E.g., if you set the unit distance to 0, you will get full opacity. - It means that when light travels 0 distance it's already attenuated a finite amount. - Thus, any finite distance should attenuate all light. - The larger you make the unit distance, the more transparent the rendering becomes. - """ - if u is None: - return self.property.GetScalarOpacityUnitDistance() - self.property.SetScalarOpacityUnitDistance(u) - return self - - def shrink(self, fraction=0.8): - """ - Shrink the individual cells to improve visibility. - - ![](https://vedo.embl.es/images/feats/shrink_hex.png) - """ - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) - sf.SetShrinkFactor(fraction) - sf.Update() - self._update(sf.GetOutput()) - self.pipeline = utils.OperationNode( - "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" - ) - return self - - def isosurface(self, value=None, flying_edges=True): - """ - Return an `Mesh` isosurface extracted from the `Volume` object. - - Set `value` as single float or list of values to draw the isosurface(s). - Use flying_edges for faster results (but sometimes can interfere with `smooth()`). - - Examples: - - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) - - ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) - """ - scrange = self.dataset.GetScalarRange() - - if flying_edges: - cf = vtk.vtkFlyingEdges3D() - cf.InterpolateAttributesOn() - else: - cf = vtk.vtkContourFilter() - cf.UseScalarTreeOn() - - cf.SetInputData(self.datset) - cf.ComputeNormalsOn() - - if utils.is_sequence(value): - cf.SetNumberOfContours(len(value)) - for i, t in enumerate(value): - cf.SetValue(i, t) - else: - if value is None: - value = (2 * scrange[0] + scrange[1]) / 3.0 - # print("automatic isosurface value =", value) - cf.SetValue(0, value) - - cf.Update() - poly = cf.GetOutput() - - out = vedo.mesh.Mesh(poly, c=None).phong() - out.mapper.SetScalarRange(scrange[0], scrange[1]) - - out.pipeline = utils.OperationNode( - "isosurface", - parents=[self], - comment=f"#pts {out.GetNumberOfPoints()}", - c="#4cc9f0:#e9c46a", - ) - return out - - def legosurface( - self, vmin=None, vmax=None, invert=False, boundary=False, array_name="input_scalars" - ): - """ - Represent an object - typically a `Volume` - as lego blocks (voxels). - By default colors correspond to the volume's scalar. - Returns an `Mesh` object. - - Arguments: - vmin : (float) - the lower threshold, voxels below this value are not shown. - vmax : (float) - the upper threshold, voxels above this value are not shown. - boundary : (bool) - controls whether to include cells that are partially inside - array_name : (int, str) - name or index of the scalar array to be considered - - Examples: - - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) - - ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) - """ - dataset = vtk.vtkImplicitDataSet() - dataset.SetDataSet(self) - window = vtk.vtkImplicitWindowFunction() - window.SetImplicitFunction(dataset) - - srng = list(self.dataset.GetScalarRange()) - if vmin is not None: - srng[0] = vmin - if vmax is not None: - srng[1] = vmax - tol = 0.00001 * (srng[1] - srng[0]) - srng[0] -= tol - srng[1] += tol - window.SetWindowRange(srng) - - extract = vtk.vtkExtractGeometry() - extract.SetInputData(self.datset) - extract.SetImplicitFunction(window) - extract.SetExtractInside(invert) - extract.SetExtractBoundaryCells(boundary) - extract.Update() - - gf = vtk.vtkGeometryFilter() - gf.SetInputData(extract.GetOutput()) - gf.Update() - - m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() - m.map_points_to_cells() - m.celldata.select(array_name) - - m.pipeline = utils.OperationNode( - "legosurface", parents=[self], comment=f"array: {array_name}", c="#4cc9f0:#e9c46a" - ) - return m - - def cut_with_plane(self, origin=(0, 0, 0), normal="x"): - """ - Cut the object with the plane defined by a point and a normal. - - Arguments: - origin : (list) - the cutting plane goes through this point - normal : (list, str) - normal vector to the cutting plane - """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") - - strn = str(normal) - if strn == "x": normal = (1, 0, 0) - elif strn == "y": normal = (0, 1, 0) - elif strn == "z": normal = (0, 0, 1) - elif strn == "-x": normal = (-1, 0, 0) - elif strn == "-y": normal = (0, -1, 0) - elif strn == "-z": normal = (0, 0, -1) - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self.datset) - clipper.SetClipFunction(plane) - clipper.GenerateClipScalarsOff() - clipper.GenerateClippedOutputOff() - clipper.SetValue(0) - clipper.Update() - cout = clipper.GetOutput() - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - - def cut_with_box(self, box): - """ - Cut the grid with the specified bounding box. - - Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. - If an object is passed, its bounding box are used. - - Example: - ```python - from vedo import * - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') - tetmesh.color('rainbow') - cu = Cube(side=500).x(500) # any Mesh works - tetmesh.cut_with_box(cu).show(axes=1) - ``` - ![](https://vedo.embl.es/images/feats/tet_cut_box.png) - """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") - - bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self.datset) - if isinstance(box, vtk.vtkProp): - boxb = box.GetBounds() - else: - boxb = box - bc.SetBoxClip(*boxb) - bc.Update() - cout = bc.GetOutput() - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return self - - - def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): - """ - Cut a UGrid or TetMesh with a Mesh. - - Use `invert` to return cut off part of the input object. - """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") - - ug = self - - ippd = vtk.vtkImplicitPolyDataDistance() - ippd.SetInput(mesh) - - if whole_cells or only_boundary: - clipper = vtk.vtkExtractGeometry() - clipper.SetInputData(ug) - clipper.SetImplicitFunction(ippd) - clipper.SetExtractInside(not invert) - clipper.SetExtractBoundaryCells(False) - if only_boundary: - clipper.SetExtractBoundaryCells(True) - clipper.SetExtractOnlyBoundaryCells(True) - else: - signedDistances = vtk.vtkFloatArray() - signedDistances.SetNumberOfComponents(1) - signedDistances.SetName("SignedDistances") - for pointId in range(ug.GetNumberOfPoints()): - p = ug.GetPoint(pointId) - signedDistance = ippd.EvaluateFunction(p) - signedDistances.InsertNextValue(signedDistance) - ug.GetPointData().AddArray(signedDistances) - ug.GetPointData().SetActiveScalars("SignedDistances") - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(ug) - clipper.SetInsideOut(not invert) - clipper.SetValue(0.0) - - clipper.Update() - cout = clipper.GetOutput() - - # if ug.GetCellData().GetScalars(): # not working - # scalname = ug.GetCellData().GetScalars().GetName() - # if scalname: # not working - # if self.useCells: - # self.celldata.select(scalname) - # else: - # self.pointdata.select(scalname) - # self._update(cout) - # self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") - # return self - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - - def extract_cells_on_plane(self, origin, normal): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - bf.SetImplicitFunction(plane) - bf.Update() - - self._update(bf.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode( - "extract_cells_on_plane", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self - - def extract_cells_on_sphere(self, center, radius): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - sph = vtk.vtkSphere() - sph.SetRadius(radius) - sph.SetCenter(center) - bf.SetImplicitFunction(sph) - bf.Update() - - self._update(bf.GetOutput()) - self.pipeline = utils.OperationNode( - "extract_cells_on_sphere", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self - - def extract_cells_on_cylinder(self, center, axis, radius): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - cyl = vtk.vtkCylinder() - cyl.SetRadius(radius) - cyl.SetCenter(center) - cyl.SetAxis(axis) - bf.SetImplicitFunction(cyl) - bf.Update() - - self.pipeline = utils.OperationNode( - "extract_cells_on_cylinder", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - self._update(bf.GetOutput()) - return self - - def clean(self): - """ - Cleanup unused points and empty cells - """ - cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self.datset) - cl.RemoveUnusedPointsOn() - cl.ProduceMergeMapOff() - cl.AveragePointDataOff() - cl.Update() - - self._update(cl.GetOutput()) - self.pipeline = utils.OperationNode( - "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b" - ) - return self - - def find_cell(self, p): - """Locate the cell that contains a point and return the cell ID.""" - cell = vtk.vtkTetra() - cellId = vtk.mutable(0) - tol2 = vtk.mutable(0) - subId = vtk.mutable(0) - pcoords = [0, 0, 0] - weights = [0, 0, 0] - cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) - return cid - - def extract_cells_by_id(self, idlist, use_point_ids=False): - """Return a new UGrid composed of the specified subset of indices.""" - selectionNode = vtk.vtkSelectionNode() - if use_point_ids: - selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) - contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() - selectionNode.GetProperties().Set(contcells, 1) - else: - selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) - selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) - vidlist = utils.numpy2vtk(idlist, dtype="id") - selectionNode.SetSelectionList(vidlist) - selection = vtk.vtkSelection() - selection.AddNode(selectionNode) - es = vtk.vtkExtractSelection() - es.SetInputData(0, self) - es.SetInputData(1, selection) - es.Update() - - ug = vedo.ugrid.UGrid(es.GetOutput()) - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - ug.SetProperty(pr) - ug.property = pr - - ug.mapper.SetLookupTable(utils.ctf2lut(self)) - ug.pipeline = utils.OperationNode( - "extract_cells_by_id", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return ug - - -######################################################################################## -class BaseActor2D(vtk.vtkActor2D): - """ - Base class. - - .. warning:: Do not use this class to instantiate objects. - """ - - def __init__(self): - """Manage 2D objects.""" - super().__init__() - - self.mapper = None - self.property = self.GetProperty() - self.filename = "" - - - def layer(self, value=None): - """Set/Get the layer number in the overlay planes into which to render.""" - if value is None: - return self.GetLayerNumber() - self.SetLayerNumber(value) - return self - - def pos(self, px=None, py=None): - """Set/Get the screen-coordinate position.""" - if isinstance(px, str): - vedo.logger.error("Use string descriptors only inside the constructor") - return self - if px is None: - return np.array(self.GetPosition(), dtype=int) - if py is not None: - p = [px, py] - else: - p = px - assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" - self.SetPosition(p) - return self - - def coordinate_system(self, value=None): - """ - Set/get the coordinate system which this coordinate is defined in. - - The options are: - 0. Display - 1. Normalized Display - 2. Viewport - 3. Normalized Viewport - 4. View - 5. Pose - 6. World - """ - coor = self.GetPositionCoordinate() - if value is None: - return coor.GetCoordinateSystem() - coor.SetCoordinateSystem(value) - return self - - def on(self): - """Set object visibility.""" - self.VisibilityOn() - return self - - def off(self): - """Set object visibility.""" - self.VisibilityOn() - return self - - def toggle(self): - """Toggle object visibility.""" - self.SetVisibility(not self.GetVisibility()) - return self - - def pickable(self, value=True): - """Set object pickability.""" - self.SetPickable(value) - return self - - def alpha(self, value=None): - """Set/Get the object opacity.""" - if value is None: - return self.property.GetOpacity() - self.property.SetOpacity(value) - return self - - def ps(self, point_size=None): - if point_size is None: - return self.property.GetPointSize() - self.property.SetPointSize(point_size) - return self - - def ontop(self, value=True): - """Keep the object always on top of everything else.""" - if value: - self.property.SetDisplayLocationToForeground() - else: - self.property.SetDisplayLocationToBackground() - return self - - def add_observer(self, event_name, func, priority=0): - """Add a callback function that will be called when an event occurs.""" - event_name = utils.get_vtk_name_event(event_name) - idd = self.AddObserver(event_name, func, priority) - return idd - - -############################################################################### funcs -# def probe_points(dataset, pts): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars at the specified points in space. - -# Note that a mask is also output with valid/invalid points which can be accessed -# with `mesh.pointdata['vtkValidPointMask']`. - -# Examples: -# - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) - -# ![](https://vedo.embl.es/images/volumetric/probePoints.png) -# """ -# if isinstance(pts, vedo.pointcloud.Points): -# pts = pts.vertices - -# def _readpoints(): -# output = src.GetPolyDataOutput() -# points = vtk.vtkPoints() -# for p in pts: -# x, y, z = p -# points.InsertNextPoint(x, y, z) -# output.SetPoints(points) - -# cells = vtk.vtkCellArray() -# cells.InsertNextCell(len(pts)) -# for i in range(len(pts)): -# cells.InsertCellPoint(i) -# output.SetVerts(cells) - -# src = vtk.vtkProgrammableSource() -# src.SetExecuteMethod(_readpoints) -# src.Update() -# img = dataset -# probeFilter = vtk.vtkProbeFilter() -# probeFilter.SetSourceData(img) -# probeFilter.SetInputConnection(src.GetOutputPort()) -# probeFilter.Update() -# poly = probeFilter.GetOutput() -# pm = vedo.mesh.Mesh(poly) -# pm.name = "ProbePoints" -# pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) -# return pm - - -# def probe_line(dataset, p1, p2, res=100): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars along a line defined by 2 points `p1` and `p2`. - -# Note that a mask is also output with valid/invalid points which can be accessed -# with `mesh.pointdata['vtkValidPointMask']`. - -# Use `res` to set the nr of points along the line - -# Examples: -# - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) -# - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) - -# ![](https://vedo.embl.es/images/volumetric/probeLine2.png) -# """ -# line = vtk.vtkLineSource() -# line.SetResolution(res) -# line.SetPoint1(p1) -# line.SetPoint2(p2) -# probeFilter = vtk.vtkProbeFilter() -# probeFilter.SetSourceData(dataset) -# probeFilter.SetInputConnection(line.GetOutputPort()) -# probeFilter.Update() -# poly = probeFilter.GetOutput() -# lnn = vedo.mesh.Mesh(poly) -# lnn.name = "ProbeLine" -# lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) -# return lnn - - -# def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars on a plane defined by a point and a normal. - -# Examples: -# - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) -# - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) - -# ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) -# """ -# plane = vtk.vtkPlane() -# plane.SetOrigin(origin) -# plane.SetNormal(normal) -# planeCut = vtk.vtkCutter() -# planeCut.SetInputData(dataset) -# planeCut.SetCutFunction(plane) -# planeCut.Update() -# poly = planeCut.GetOutput() -# cutmesh = vedo.mesh.Mesh(poly) -# cutmesh.name = "ProbePlane" -# cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) -# return cutmesh diff --git a/vedo/core.py b/vedo/core.py index 017395e8..0449aad6 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -96,6 +96,12 @@ def memory_size(self): """ return self.GetActualMemorySize() + def modified(self): + """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" + self.dataset.GetPointData().Modified() + self.dataset.GetPointData().GetScalars().Modified() + return self + def box(self, scale=1, padding=0, fill=False): """ Return the bounding box as a new `Mesh`. @@ -215,24 +221,20 @@ def points(self, pts=None): Set/Get the vertex coordinates of a mesh or point cloud. """ - print("WARNING: .points() is obsolete, use .vertices instead.") if pts is None: ### getter - - if isinstance(self, vedo.Points): - vpts = self.dataset.GetPoints() - elif isinstance(self, vedo.BaseVolume): - v2p = vtk.vtkImageToPoints() - v2p.SetInputData(self.imagedata()) - v2p.Update() - vpts = v2p.GetOutput().GetPoints() - else: # tetmesh et al - vpts = self.dataset.GetPoints() - - if vpts: - return utils.vtk2numpy(vpts.GetData()) - return np.array([], dtype=np.float32) + msg = ( + "WARNING: points() is deprecated, use vertices instead. E.g.:\n" + " mesh.points() -> mesh.vertices" + ) + colors.printc(msg, c='y') + return self.vertices else: + msg = ( + "WARNING: points() is deprecated, use vertices instead. E.g.:\n" + " mesh.points([[x,y,z]]) -> mesh.vertices = [[x,y,z]]" + ) + colors.printc(msg, c='y') pts = np.asarray(pts, dtype=np.float32) @@ -344,6 +346,41 @@ def map_cells_to_points(self, arrays=(), move=False): self._update(c2p.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return self + + @property + def vertices(self): + """Return the vertices (points) coordinates.""" + varr = self.dataset.GetPoints().GetData() + narr = utils.vtk2numpy(varr) + return narr + + #setter + @vertices.setter + def vertices(self, pts): + """Set vertices (points) coordinates.""" + arr = utils.numpy2vtk(pts, dtype=np.float32) + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + # reset mesh to identity matrix position/rotation: + self.point_locator = None + self.cell_locator = None + self.line_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) + self.transform = LinearTransform() + # BUG + # from vedo import * + # plt = Plotter(interactive=False, axes=7) + # s = Disc(res=(8,120)).linewidth(0.1) + # print([s.dataset.GetPoints().GetData()]) + # # plt.show(s) # depends if I show it or not.. + # # plt.renderer.AddActor(s.actor) + # print([s.dataset.GetPoints().GetData()]) + # for i in progressbar(100): + # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z + # show(s, interactive=1) + # exit() + return self @property def cells(self): diff --git a/vedo/picture.py b/vedo/picture.py index 1f147561..da7aa067 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -172,17 +172,17 @@ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify="") if utils.is_sequence(fig): self.array = fig - self._data = _get_img(self.array) + self.dataset = _get_img(self.array) elif isinstance(fig, Picture): - self._data = fig.inputdata() + self.dataset = fig.dataset elif isinstance(fig, vtk.vtkImageData): assert fig.GetDimensions()[2] == 1, "Cannot create an Picture2D from Volume" - self._data = fig + self.dataset = fig elif isinstance(fig, str): - self._data = _get_img(fig) + self.dataset = _get_img(fig) self.filename = fig elif "matplotlib" in str(fig.__class__): @@ -199,33 +199,32 @@ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify="") ) self.array = self.array[:, :, :3] - self._data = _get_img(self.array) + self.dataset = _get_img(self.array) ############# if scale != 1: - newsize = np.array(self._data.GetDimensions()[:2]) * scale + newsize = np.array(self.dataset.GetDimensions()[:2]) * scale newsize = newsize.astype(int) rsz = vtk.vtkImageResize() - rsz.SetInputData(self._data) + rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize[0], newsize[1], 1) rsz.Update() - self._data = rsz.GetOutput() + self.dataset = rsz.GetOutput() if padding: pass # TODO if justify: - self._data, pos = _set_justification(self._data, justify) + self.dataset, pos = _set_justification(self.dataset, justify) else: - self._data, pos = _set_justification(self._data, pos) + self.dataset, pos = _set_justification(self.dataset, pos) - self._mapper = vtk.vtkImageMapper() - # self._mapper.RenderToRectangleOn() # NOT good because of aliasing - self._mapper.SetInputData(self._data) - self._mapper.SetColorWindow(255) - self._mapper.SetColorLevel(127.5) - self.SetMapper(self._mapper) + self.mapper = vtk.vtkImageMapper() + self.mapper.SetInputData(self.dataset) + self.mapper.SetColorWindow(255) + self.mapper.SetColorLevel(127.5) + self.SetMapper(self.mapper) self.GetPositionCoordinate().SetCoordinateSystem(3) self.SetPosition(pos) @@ -237,13 +236,13 @@ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify="") @property def shape(self): - return np.array(self._data.GetDimensions()[:2]).astype(int) + return np.array(self.dataset.GetDimensions()[:2]).astype(int) ################################################# -class Picture(vedo.base.Base3DProp, vtk.vtkImageActor): +class Picture(vedo.visuals.PictureVisual, vedo.visuals.ActorTransforms): """ - Derived class of `vtkImageActor`. Used to represent 2D pictures in a 3D world. + Class used to represent 2D pictures in a 3D world. """ def __init__(self, obj=None, channels=3, flip=False): @@ -261,9 +260,11 @@ def __init__(self, obj=None, channels=3, flip=False): flip : (bool) flip xy axis convention (when input is a numpy array) """ - super().__init__() + self.name = "Picture" + self.filename = '' - self.actor = self + self.actor = vtk.vtkImageActor() + self.property = self.actor.GetProperty() if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, flip) @@ -278,7 +279,7 @@ def __init__(self, obj=None, channels=3, flip=False): else: img = vtk.vtkImageData() - # select channels + ############# select channels if isinstance(channels, int): channels = list(range(channels)) @@ -298,15 +299,13 @@ def __init__(self, obj=None, channels=3, flip=False): pec.Update() img = pec.GetOutput() - self._data = img - self.SetInputData(img) - - sx, sy, _ = img.GetDimensions() - self.shape = np.array([sx, sy]) - - self._mapper = self.GetMapper() + self.dataset = img + self.actor.SetInputData(img) + self.mapper = self.actor.GetMapper() - self.pipeline = utils.OperationNode("Picture", comment=f"#shape {self.shape}", c="#f28482") + sx, sy, _ = self.dataset.GetDimensions() + shape = np.array([sx, sy]) + self.pipeline = utils.OperationNode("Picture", comment=f"#shape {shape}", c="#f28482") ###################################################################### def _repr_html_(self): @@ -343,15 +342,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" img = self.GetMapper().GetInput() @@ -382,115 +381,54 @@ def _repr_html_(self): ] return "\n".join(allt) - def inputdata(self): - """Return the underlying ``vtkImagaData`` object.""" - return self._data - + ###################################################################### + def _update(self, data): + """Overwrite the Picture data mesh with a new data.""" + self.dataset = data + self.mapper.SetInputData(data) + self.mapper.Modified() + return self + def dimensions(self): """Return the picture dimension as number of pixels in x and y""" - nx, ny, _ = self._data.GetDimensions() + nx, ny, _ = self.dataset.GetDimensions() return np.array([nx, ny]) + @property + def shape(self): + """Return the picture shape as number of pixels in x and y""" + return self.dimensions() + def channels(self): """Return the number of channels in picture""" - return self._data.GetPointData().GetScalars().GetNumberOfComponents() - - def _update(self, data): - """Overwrite the Picture data mesh with a new data.""" - self._data = data - self._mapper.SetInputData(data) - self._mapper.Modified() - nx, ny, _ = self._data.GetDimensions() - self.shape = np.array([nx, ny]) - return self + return self.dataset.GetPointData().GetScalars().GetNumberOfComponents() - def clone(self, transformed=False): + def clone(self): """Return an exact copy of the input Picture. If transform is True, it is given the same scaling and position.""" img = vtk.vtkImageData() - img.DeepCopy(self._data) + img.DeepCopy(self.dataset) + pic = Picture(img) - if transformed: - # assign the same transformation to the copy - pic.SetOrigin(self.GetOrigin()) - pic.SetScale(self.GetScale()) - pic.SetOrientation(self.GetOrientation()) - pic.SetPosition(self.GetPosition()) + # assign the same transformation to the copy + pic.actor.SetOrigin(self.actor.GetOrigin()) + pic.actor.SetScale(self.actor.GetScale()) + pic.actor.SetOrientation(self.actor.GetOrientation()) + pic.actor.SetPosition(self.actor.GetPosition()) pic.pipeline = utils.OperationNode("clone", parents=[self], c="#f7dada", shape="diamond") return pic - def cmap(self, name, vmin=None, vmax=None): - """Colorize a picture with a colormap representing pixel intensity""" - n = self._data.GetPointData().GetNumberOfComponents() - if n > 1: - ecr = vtk.vtkImageExtractComponents() - ecr.SetInputData(self._data) - ecr.SetComponents(0, 1, 2) - ecr.Update() - ilum = vtk.vtkImageMagnitude() - ilum.SetInputData(self._data) - ilum.Update() - img = ilum.GetOutput() - else: - img = self._data - - lut = vtk.vtkLookupTable() - _vmin, _vmax = img.GetScalarRange() - if vmin is not None: - _vmin = vmin - if vmax is not None: - _vmax = vmax - lut.SetRange(_vmin, _vmax) - - ncols = 256 - lut.SetNumberOfTableValues(ncols) - cols = colors.color_map(range(ncols), name, 0, ncols) - for i, c in enumerate(cols): - lut.SetTableValue(i, *c) - lut.Build() - - imap = vtk.vtkImageMapToColors() - imap.SetLookupTable(lut) - imap.SetInputData(img) - imap.Update() - self._update(imap.GetOutput()) - self.pipeline = utils.OperationNode( - f"cmap", comment=f'"{name}"', parents=[self], c="#f28482" - ) - return self - def extent(self, ext=None): """ Get or set the physical extent that the picture spans. Format is `ext=[minx, maxx, miny, maxy]`. """ if ext is None: - return self._data.GetExtent() - - self._data.SetExtent(ext[0], ext[1], ext[2], ext[3], 0, 0) - self._mapper.Modified() - return self - - def alpha(self, a=None): - """Set/get picture's transparency in the rendering scene.""" - if a is not None: - self.GetProperty().SetOpacity(a) - return self - return self.GetProperty().GetOpacity() + return self.dataset.GetExtent() - def level(self, value=None): - """Get/Set the image color level (brightness) in the rendering scene.""" - if value is None: - return self.GetProperty().GetColorLevel() - self.GetProperty().SetColorLevel(value) - return self - - def window(self, value=None): - """Get/Set the image color window (contrast) in the rendering scene.""" - if value is None: - return self.GetProperty().GetColorWindow() - self.GetProperty().SetColorWindow(value) + self.dataset.SetExtent(ext[0], ext[1], ext[2], ext[3], 0, 0) + self.mapper.Modified() return self def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): @@ -509,7 +447,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): units are pixels """ extractVOI = vtk.vtkExtractVOI() - extractVOI.SetInputData(self._data) + extractVOI.SetInputData(self.dataset) extractVOI.IncludeBoundaryOn() d = self.GetInput().GetDimensions() @@ -524,7 +462,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): extractVOI.SetVOI(bx0, bx1, by0, by1, 0, 0) extractVOI.Update() - self.shape = extractVOI.GetOutput().GetDimensions()[:2] + # shape = extractVOI.GetOutput().GetDimensions()[:2] self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" @@ -542,9 +480,9 @@ def pad(self, pixels=10, value=255): value : (int) intensity value (gray-scale color) of the padding """ - x0, x1, y0, y1, _z0, _z1 = self._data.GetExtent() + x0, x1, y0, y1, _z0, _z1 = self.dataset.GetExtent() pf = vtk.vtkImageConstantPad() - pf.SetInputData(self._data) + pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(pixels): pf.SetOutputWholeExtent( @@ -577,9 +515,9 @@ def tile(self, nx=4, ny=4, shift=(0, 0)): shift : (list) shift in x and y in pixels """ - x0, x1, y0, y1, z0, z1 = self._data.GetExtent() + x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() constant_pad = vtk.vtkImageMirrorPad() - constant_pad.SetInputData(self._data) + constant_pad.SetInputData(self.dataset) constant_pad.SetOutputWholeExtent( int(x0 + shift[0] + 0.5), int(x1 * nx + shift[0] + 0.5), @@ -625,14 +563,14 @@ def append(self, pictures, axis="z", preserve_extents=False): ![](https://vedo.embl.es/images/feats/pict_append.png) """ ima = vtk.vtkImageAppend() - ima.SetInputData(self._data) + ima.SetInputData(self.dataset) if not utils.is_sequence(pictures): pictures = [pictures] for p in pictures: if isinstance(p, vtk.vtkImageData): ima.AddInputData(p) else: - ima.AddInputData(p.inputdata()) + ima.AddInputData(p.dataset) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 @@ -652,7 +590,7 @@ def resize(self, newsize): newsize is the shape of picture as [npx, npy], or it can be also expressed as a fraction. """ - old_dims = np.array(self._data.GetDimensions()) + old_dims = np.array(self.dataset.GetDimensions()) if not utils.is_sequence(newsize): newsize = (old_dims * newsize + 0.5).astype(int) @@ -666,7 +604,7 @@ def resize(self, newsize): newsize = [newsize[0], newsize[1], old_dims[2]] rsz = vtk.vtkImageResize() - rsz.SetInputData(self._data) + rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize) rsz.Update() @@ -681,7 +619,7 @@ def resize(self, newsize): def mirror(self, axis="x"): """Mirror picture along x or y axis. Same as `flip()`.""" ff = vtk.vtkImageFlip() - ff.SetInputData(self.inputdata()) + ff.SetInputData(self.dataset) if axis.lower() == "x": ff.SetFilteredAxis(0) elif axis.lower() == "y": @@ -698,55 +636,11 @@ def flip(self, axis="y"): """Mirror picture along x or y axis. Same as `mirror()`.""" return self.mirror(axis=axis) - def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): - """ - Rotate by the specified angle (anticlockwise). - - Arguments: - angle : (float) - rotation angle in degrees - center : (list) - center of rotation (x,y) in pixels - """ - bounds = self.bounds() - pc = [0, 0, 0] - if center: - pc[0] = center[0] - pc[1] = center[1] - else: - pc[0] = (bounds[1] + bounds[0]) / 2.0 - pc[1] = (bounds[3] + bounds[2]) / 2.0 - pc[2] = (bounds[5] + bounds[4]) / 2.0 - - transform = vtk.vtkTransform() - transform.Translate(pc) - transform.RotateWXYZ(-angle, 0, 0, 1) - transform.Scale(1 / scale, 1 / scale, 1) - transform.Translate(-pc[0], -pc[1], -pc[2]) - - reslice = vtk.vtkImageReslice() - reslice.SetMirror(mirroring) - c = np.array(colors.get_color(bc)) * 255 - reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) - reslice.SetInputData(self._data) - reslice.SetResliceTransform(transform) - reslice.SetOutputDimensionality(2) - reslice.SetInterpolationModeToCubic() - reslice.SetOutputSpacing(self._data.GetSpacing()) - reslice.SetOutputOrigin(self._data.GetOrigin()) - reslice.SetOutputExtent(self._data.GetExtent()) - reslice.Update() - self._update(reslice.GetOutput()) - - self.pipeline = utils.OperationNode( - "rotate", comment=f"angle={angle}", parents=[self], c="#f28482" - ) - return self def select(self, component): """Select one single component of the rgb image.""" ec = vtk.vtkImageExtractComponents() - ec.SetInputData(self._data) + ec.SetInputData(self.dataset) ec.SetComponents(component) ec.Update() pic = Picture(ec.GetOutput()) @@ -757,15 +651,15 @@ def select(self, component): def bw(self): """Make it black and white using luminance calibration.""" - n = self._data.GetPointData().GetNumberOfComponents() + n = self.dataset.GetPointData().GetNumberOfComponents() if n == 4: ecr = vtk.vtkImageExtractComponents() - ecr.SetInputData(self._data) + ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() img = ecr.GetOutput() else: - img = self._data + img = self.dataset ecr = vtk.vtkImageLuminance() ecr.SetInputData(img) @@ -786,7 +680,7 @@ def smooth(self, sigma=3, radius=None): """ gsf = vtk.vtkImageGaussianSmooth() gsf.SetDimensionality(2) - gsf.SetInputData(self._data) + gsf.SetInputData(self.dataset) if radius is not None: if utils.is_sequence(radius): gsf.SetRadiusFactors(radius[0], radius[1]) @@ -814,7 +708,7 @@ def median(self): This result of this second median is the output pixel value. """ medf = vtk.vtkImageHybridMedian2D() - medf.SetInputData(self._data) + medf.SetInputData(self.dataset) medf.Update() self._update(medf.GetOutput()) self.pipeline = utils.OperationNode("median", parents=[self], c="#f28482") @@ -832,7 +726,7 @@ def enhance(self): ``` ![](https://vedo.embl.es/images/feats/pict_enhance.png) """ - img = self._data + img = self.dataset scalarRange = img.GetPointData().GetScalars().GetRange() cast = vtk.vtkImageCast() @@ -877,7 +771,7 @@ def fft(self, mode="magnitude", logscale=12, center=True): (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ ffti = vtk.vtkImageFFT() - ffti.SetInputData(self._data) + ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: @@ -925,7 +819,7 @@ def rfft(self, mode="magnitude"): """Reverse Fast Fourier transform of a picture.""" ffti = vtk.vtkImageRFFT() - ffti.SetInputData(self._data) + ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: @@ -976,7 +870,7 @@ def filterpass(self, lowcutoff=None, highcutoff=None, order=3): """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtk.vtkImageFFT() - fft.SetInputData(self._data) + fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() @@ -1019,8 +913,8 @@ def blend(self, pic, alpha1=0.5, alpha2=0.5): them according to the alpha values and/or the opacity setting for each input. """ blf = vtk.vtkImageBlend() - blf.AddInputData(self._data) - blf.AddInputData(pic.inputdata()) + blf.AddInputData(self.dataset) + blf.AddInputData(pic.dataset) blf.SetOpacity(0, alpha1) blf.SetOpacity(1, alpha2) blf.SetBlendModeToNormal() @@ -1097,7 +991,7 @@ def warp( pass reslice = vtk.vtkImageReslice() - reslice.SetInputData(self._data) + reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) reslice.SetResliceTransform(transform) reslice.SetInterpolationModeToCubic() @@ -1181,12 +1075,12 @@ def threshold(self, value=None, flip=False): A polygonal mesh. """ mgf = vtk.vtkImageMagnitude() - mgf.SetInputData(self._data) + mgf.SetInputData(self.dataset) mgf.Update() msq = vtk.vtkMarchingSquares() msq.SetInputData(mgf.GetOutput()) if value is None: - r0, r1 = self._data.GetScalarRange() + r0, r1 = self.dataset.GetScalarRange() value = r0 + (r1 - r0) / 3 msq.SetValue(0, value) msq.Update() @@ -1209,20 +1103,106 @@ def threshold(self, value=None, flip=False): ) return out + def cmap(self, name, vmin=None, vmax=None): + """Colorize a picture with a colormap representing pixel intensity""" + n = self.dataset.GetPointData().GetNumberOfComponents() + if n > 1: + ecr = vtk.vtkImageExtractComponents() + ecr.SetInputData(self.dataset) + ecr.SetComponents(0, 1, 2) + ecr.Update() + ilum = vtk.vtkImageMagnitude() + ilum.SetInputData(self.dataset) + ilum.Update() + img = ilum.GetOutput() + else: + img = self.dataset + + lut = vtk.vtkLookupTable() + _vmin, _vmax = img.GetScalarRange() + if vmin is not None: + _vmin = vmin + if vmax is not None: + _vmax = vmax + lut.SetRange(_vmin, _vmax) + + ncols = 256 + lut.SetNumberOfTableValues(ncols) + cols = colors.color_map(range(ncols), name, 0, ncols) + for i, c in enumerate(cols): + lut.SetTableValue(i, *c) + lut.Build() + + imap = vtk.vtkImageMapToColors() + imap.SetLookupTable(lut) + imap.SetInputData(img) + imap.Update() + self._update(imap.GetOutput()) + self.pipeline = utils.OperationNode( + f"cmap", comment=f'"{name}"', parents=[self], c="#f28482" + ) + return self + + def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): + """ + Rotate by the specified angle (anticlockwise). + + Arguments: + angle : (float) + rotation angle in degrees + center : (list) + center of rotation (x,y) in pixels + """ + bounds = self.bounds() + pc = [0, 0, 0] + if center: + pc[0] = center[0] + pc[1] = center[1] + else: + pc[0] = (bounds[1] + bounds[0]) / 2.0 + pc[1] = (bounds[3] + bounds[2]) / 2.0 + pc[2] = (bounds[5] + bounds[4]) / 2.0 + + transform = vtk.vtkTransform() + transform.Translate(pc) + transform.RotateWXYZ(-angle, 0, 0, 1) + transform.Scale(1 / scale, 1 / scale, 1) + transform.Translate(-pc[0], -pc[1], -pc[2]) + + reslice = vtk.vtkImageReslice() + reslice.SetMirror(mirroring) + c = np.array(colors.get_color(bc)) * 255 + reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) + reslice.SetInputData(self.dataset) + reslice.SetResliceTransform(transform) + reslice.SetOutputDimensionality(2) + reslice.SetInterpolationModeToCubic() + reslice.SetOutputSpacing(self.dataset.GetSpacing()) + reslice.SetOutputOrigin(self.dataset.GetOrigin()) + reslice.SetOutputExtent(self.dataset.GetExtent()) + reslice.Update() + self._update(reslice.GetOutput()) + + self.pipeline = utils.OperationNode( + "rotate", comment=f"angle={angle}", parents=[self], c="#f28482" + ) + return self + + def tomesh(self): """ Convert an image to polygonal data (quads), with each polygon vertex assigned a RGBA value. """ - dims = self._data.GetDimensions() + dims = self.dataset.GetDimensions() gr = vedo.shapes.Grid(s=dims[:2], res=(dims[0] - 1, dims[1] - 1)) gr.pos(int(dims[0] / 2), int(dims[1] / 2)).pickable(True).wireframe(False).lw(0) - self._data.GetPointData().GetScalars().SetName("RGBA") - gr.inputdata().GetPointData().AddArray(self._data.GetPointData().GetScalars()) - gr.inputdata().GetPointData().SetActiveScalars("RGBA") - gr.mapper().SetArrayName("RGBA") - gr.mapper().SetScalarModeToUsePointData() - gr.mapper().ScalarVisibilityOn() + self.dataset.GetPointData().GetScalars().SetName("RGBA") + gr.dataset.GetPointData().AddArray(self.dataset.GetPointData().GetScalars()) + gr.dataset.GetPointData().SetActiveScalars("RGBA") + gr.mapper.SetArrayName("RGBA") + gr.mapper.SetScalarModeToUsePointData() + gr.mapper.ScalarVisibilityOn() gr.name = self.name gr.filename = self.filename gr.pipeline = utils.OperationNode("tomesh", parents=[self], c="#f28482:#e9c46a") @@ -1241,13 +1221,13 @@ def tonumpy(self): ``picture.modified()`` when all your modifications are completed. """ - nx, ny, _ = self._data.GetDimensions() - nchan = self._data.GetPointData().GetScalars().GetNumberOfComponents() - narray = utils.vtk2numpy(self._data.GetPointData().GetScalars()).reshape(ny, nx, nchan) + nx, ny, _ = self.dataset.GetDimensions() + nchan = self.dataset.GetPointData().GetScalars().GetNumberOfComponents() + narray = utils.vtk2numpy(self.dataset.GetPointData().GetScalars()).reshape(ny, nx, nchan) narray = np.flip(narray, axis=0).astype(np.uint8) return narray.squeeze() - def rectangle(self, xspan, yspan, c="green5", alpha=1): + def add_rectangle(self, xspan, yspan, c="green5", alpha=1): """Draw a rectangle box on top of current image. Units are pixels. Example: @@ -1290,9 +1270,9 @@ def rectangle(self, xspan, yspan, c="green5", alpha=1): canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillBox(x1, x2, y1, y2) canvas_source.Update() - image_data = canvas_source.GetOutput() + imagedataset = canvas_source.GetOutput() - vscals = image_data.GetPointData().GetScalars() + vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) @@ -1300,7 +1280,7 @@ def rectangle(self, xspan, yspan, c="green5", alpha=1): self.pipeline = utils.OperationNode("rectangle", parents=[self], c="#f28482") return self - def line(self, p1, p2, lw=2, c="k2", alpha=1): + def add_line(self, p1, p2, lw=2, c="k2", alpha=1): """Draw a line on top of current image. Units are pixels.""" x1, x2 = p1 y1, y2 = p2 @@ -1331,9 +1311,9 @@ def line(self, p1, p2, lw=2, c="k2", alpha=1): canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTube(x1, x2, y1, y2, lw) canvas_source.Update() - image_data = canvas_source.GetOutput() + imagedataset = canvas_source.GetOutput() - vscals = image_data.GetPointData().GetScalars() + vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) @@ -1341,7 +1321,7 @@ def line(self, p1, p2, lw=2, c="k2", alpha=1): self.pipeline = utils.OperationNode("line", parents=[self], c="#f28482") return self - def triangle(self, p1, p2, p3, c="red3", alpha=1): + def add_triangle(self, p1, p2, p3, c="red3", alpha=1): """Draw a triangle on top of current image. Units are pixels.""" x1, y1 = p1 x2, y2 = p2 @@ -1376,9 +1356,9 @@ def triangle(self, p1, p2, p3, c="red3", alpha=1): canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTriangle(x1, y1, x2, y2, x3, y3) canvas_source.Update() - image_data = canvas_source.GetOutput() + imagedataset = canvas_source.GetOutput() - vscals = image_data.GetPointData().GetScalars() + vscals = imagedataset.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) @@ -1446,7 +1426,7 @@ def add_text( # vtkImageData *data, int textDims[2], int dpi, int backend=Default) blf = vtk.vtkImageBlend() - blf.AddInputData(self._data) + blf.AddInputData(self.dataset) blf.AddInputData(img) blf.SetOpacity(0, 1) blf.SetOpacity(1, alpha) @@ -1461,12 +1441,12 @@ def add_text( def modified(self): """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" - self._data.GetPointData().GetScalars().Modified() + self.dataset.GetPointData().GetScalars().Modified() return self def write(self, filename): """Write picture to file as png or jpg.""" - vedo.file_io.write(self._data, filename) + vedo.file_io.write(self.dataset, filename) self.pipeline = utils.OperationNode( "write", comment=filename[:15], parents=[self], c="#8a817c", shape="cylinder" ) diff --git a/vedo/plotter.py b/vedo/plotter.py index 08bb2c6e..febdd7e2 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -652,7 +652,7 @@ def __init__( self.background_renderer.SetLayer(0) self.background_renderer.InteractiveOff() self.background_renderer.SetBackground(vedo.get_color(bg2)) - image_actor = vedo.Picture(self.backgrcol) + image_actor = vedo.Picture(self.backgrcol).actor self.window.AddRenderer(self.background_renderer) self.background_renderer.AddActor(image_actor) @@ -2320,7 +2320,6 @@ def fill_event(self, ename="", pos=(), enable_picking=True): delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) - # if isinstance(actor.data, vedo.base.Base3DProp): # needed! if hasattr(actor.data, "picked3d"): if actor.data.picked3d is not None: delta3d = picked3d - actor.data.picked3d diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 23053e6a..d85500fa 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -624,41 +624,6 @@ def _update(self, polydata, reset_locators=True): self.line_locator = None self.cell_locator = None return self - - @property - def vertices(self): - """Return the vertices (points) coordinates.""" - varr = self.dataset.GetPoints().GetData() - narr = utils.vtk2numpy(varr) - return narr - - #setter - @vertices.setter - def vertices(self, pts): - """Set vertices (points) coordinates.""" - arr = utils.numpy2vtk(pts, dtype=np.float32) - vpts = self.dataset.GetPoints() - vpts.SetData(arr) - vpts.Modified() - # reset mesh to identity matrix position/rotation: - self.point_locator = None - self.cell_locator = None - self.line_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) - self.transform = LinearTransform() - # BUG - # from vedo import * - # plt = Plotter(interactive=False, axes=7) - # s = Disc(res=(8,120)).linewidth(0.1) - # print([s.dataset.GetPoints().GetData()]) - # # plt.show(s) # depends if I show it or not.. - # # plt.renderer.AddActor(s.actor) - # print([s.dataset.GetPoints().GetData()]) - # for i in progressbar(100): - # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z - # show(s, interactive=1) - # exit() - return self def polydata(self): """Return the underlying ``vtkPolyData`` object.""" diff --git a/vedo/shapes.py b/vedo/shapes.py index 6977eef8..a155bc02 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4534,7 +4534,7 @@ def off(self): self.actor.SetVisibility(False) return self -class Text2D(TextBase, vedo.base.BaseActor2D): +class Text2D(TextBase, vedo.visuals.BaseActor2D): """ Create a 2D text object. """ diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 3c25140c..d6be7820 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -9,7 +9,8 @@ import numpy as np import vedo from vedo import utils -from vedo.base import BaseGrid +# from vedo.base import BaseGrid +from vedo.core import VolumeAlgorithms from vedo.mesh import Mesh from vedo.file_io import download, loadUnStructuredGrid @@ -106,7 +107,7 @@ def _buildtetugrid(points, cells): ########################################################################## -class TetMesh(BaseGrid, vtk.vtkVolume): +class TetMesh(VolumeAlgorithms, vtk.vtkVolume): """The class describing tetrahedral meshes.""" def __init__( @@ -126,8 +127,6 @@ def __init__( mapper : (str) choose a visualization style in `['tetra', 'raycast', 'zsweep']` """ -# vtk.vtkVolume.__init__(self) -# BaseGrid.__init__(self) super().__init__() # inputtype = str(type(inputobj)) diff --git a/vedo/ugrid.py b/vedo/ugrid.py index f47fd32a..588033ee 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -9,7 +9,8 @@ from vedo import settings from vedo import colors from vedo import utils -from vedo.base import BaseGrid +# from vedo.base import BaseGrid +from vedo.core import VolumeAlgorithms from vedo.file_io import download, loadUnStructuredGrid @@ -22,7 +23,7 @@ __all__ = ["UGrid"] ######################################################################### -class UGrid(BaseGrid, vtk.vtkActor): +class UGrid(VolumeAlgorithms, vtk.vtkActor): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): @@ -43,9 +44,6 @@ def __init__(self, inputobj=None): - VTK_HEXAGONAL_PRISM = 15 - VTK_PENTAGONAL_PRISM = 16 """ - - #vtk.vtkActor.__init__(self) - #BaseGrid.__init__(self) super().__init__() inputtype = str(type(inputobj)) diff --git a/vedo/visuals.py b/vedo/visuals.py index 30e04071..429522fc 100644 --- a/vedo/visuals.py +++ b/vedo/visuals.py @@ -21,7 +21,7 @@ ################################################### -class CoreVisual: +class CommonVisual: def show(self, **options): """ @@ -401,7 +401,7 @@ def alpha(self, alpha, vmin=None, vmax=None): return self ################################################### -class PointsVisual(CoreVisual): +class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" ################################################## @@ -1878,7 +1878,7 @@ def lc(self, linecolor=None): ######################################################################################## -class VolumeVisual(CoreVisual): +class VolumeVisual(CommonVisual): def alpha_unit(self, u=None): """ @@ -1896,12 +1896,155 @@ def alpha_unit(self, u=None): return self -# class PictureVisual(CoreVisual): +######################################################################################## +class ActorTransforms: + + def pos(self, point=None): + """Set/get position of object.""" + if point is None: + return self.actor.GetPosition() + self.actor.SetPosition(point) + return self -# pass + def origin(self, point=None): + """Set/get origin of object.""" + if point is None: + return np.array(self.actor.GetOrigin()) + self.actor.SetOrigin(point) + return self -# class AssemblyVisual(CoreVisual): + def x(self, x=None): + """Set/get x coordinate of object.""" + if x is None: + return self.actor.GetPosition()[0] + p = self.actor.GetPosition() + self.actor.SetPosition(x, p[1], p[2]) + return self + + def y(self, y=None): + """Set/get y coordinate of object.""" + if y is None: + return self.actor.GetPosition()[1] + p = self.actor.GetPosition() + self.actor.SetPosition(p[0], y, p[2]) + return self + + def z(self, z=None): + """Set/get z coordinate of object.""" + if z is None: + return self.actor.GetPosition()[2] + p = self.actor.GetPosition() + self.actor.SetPosition(p[0], p[1], z) + return self + + def rotate_x(self, angle): + """Rotate around x axis.""" + self.actor.RotateX(angle) + return self + + def rotate_y(self, angle): + """Rotate around y axis.""" + self.actor.RotateY(angle) + return self + + def rotate_z(self, angle): + """Rotate around z axis.""" + self.actor.RotateZ(angle) + return self + + def reorient(self, old_axis, new_axis): + """Rotate object to a new orientation.""" + axis = utils.versor(old_axis) + direction = utils.versor(new_axis) + angle = np.arccos(np.dot(axis, direction)) * 57.3 + self.actor.RotateWXYZ(angle, np.cross(axis, direction)) + return self + + def shift(self, dp): + """Add vector to current position.""" + p = self.actor.GetPosition() + self.actor.SetPosition(p[0] + dp[0], p[1] + dp[1], p[2] + dp[2]) + return self + def scale(self, s=None, absolute=False): + """Set/get scaling factor.""" + if s is None: + return self.actor.GetScale() + if absolute: + self.actor.SetScale(s, s, s) + else: + self.actor.SetScale(self.GetScale() * s) + return self + + +######################################################################################## +class PictureVisual(ActorTransforms, CommonVisual): + + def alpha(self, a=None): + """Set/get picture's transparency in the rendering scene.""" + if a is not None: + self.property.SetOpacity(a) + return self + return self.property.GetOpacity() + + def level(self, value=None): + """Get/Set the image color level (brightness) in the rendering scene.""" + if value is None: + return self.property.GetColorLevel() + self.property.SetColorLevel(value) + return self + + def window(self, value=None): + """Get/Set the image color window (contrast) in the rendering scene.""" + if value is None: + return self.property.GetColorWindow() + self.property.SetColorWindow(value) + return self + + def bounds(self): + """Get the bounding box.""" + return self.actor.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + + def diagonal_size(self): + """Get the length of the diagonal of mesh bounding box.""" + b = self.bounds() + return np.sqrt( + (b[1] - b[0])**2 + (b[3] - b[2])**2 + (b[5] - b[4])**2) + + def memory_size(self): + """ + Return the size in bytes of the object in memory. + """ + return self.GetActualMemorySize() + + +######################################################################################## +# class AssemblyVisual(CommonVisual): # pass ######################################################################################## diff --git a/vedo/volume.py b/vedo/volume.py index 7195c634..840ee5e1 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -10,9 +10,10 @@ import vedo from vedo import utils -from vedo.base import Base3DProp -from vedo.base import BaseGrid +# from vedo.base import Base3DProp +# from vedo.base import BaseGrid from vedo.mesh import Mesh +from vedo.core import VolumeAlgorithms __docformat__ = "google" @@ -854,7 +855,7 @@ def scale_voxels(self, scale=1): ########################################################################## -class Volume(BaseVolume, BaseGrid, vtk.vtkVolume): +class Volume(BaseVolume, vtk.vtkVolume): """ Class to describe dataset that are defined on "voxels": the 3D equivalent of 2D pixels. @@ -948,9 +949,6 @@ def __init__( if a `list` of values is used for `alphas` this is interpreted as a transfer function along the range of the scalar. """ - #vtk.vtkVolume.__init__(self) - #BaseGrid.__init__(self) - #BaseVolume.__init__(self) super().__init__() ################### @@ -1482,7 +1480,7 @@ def apply_transform(self, T, fit=False): ########################################################################## -class VolumeSlice(BaseVolume, Base3DProp, vtk.vtkImageSlice): +class VolumeSlice(BaseVolume, VolumeAlgorithms, vtk.vtkImageSlice): """ Derived class of `vtkImageSlice`. """ @@ -1494,9 +1492,6 @@ def __init__(self, inputobj=None): for visualization using `mode="image"`. """ vtk.vtkImageSlice.__init__(self) - Base3DProp.__init__(self) - BaseVolume.__init__(self) - # super().__init__() self._mapper = vtk.vtkImageResliceMapper() self._mapper.SliceFacesCameraOn() From 21306352a933be400b6ede070ea78747edbaeafc Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 20:00:57 +0200 Subject: [PATCH 071/251] cleanup with pylint --- vedo/__init__.py | 2 +- vedo/core.py | 2683 ++++++++++++++++---------------- vedo/mesh.py | 99 +- vedo/picture.py | 31 +- vedo/plotter.py | 152 +- vedo/pointcloud.py | 132 +- vedo/shapes.py | 2 +- vedo/{visuals.py => visual.py} | 0 vedo/volume.py | 2 - 9 files changed, 1584 insertions(+), 1519 deletions(-) rename vedo/{visuals.py => visual.py} (100%) diff --git a/vedo/__init__.py b/vedo/__init__.py index 4594f45f..ea825f2e 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -39,7 +39,7 @@ from vedo.tetmesh import * from vedo.addons import * from vedo.plotter import * -from vedo.visuals import * +from vedo.visual import * from vedo import applications from vedo import interactor_modes diff --git a/vedo/core.py b/vedo/core.py index 0449aad6..599f4d63 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -15,1606 +15,1595 @@ __docformat__ = "google" -__doc__ = "Base classes. Do not instantiate." +__doc__ = "Base classes providing functionality to all vedo objects." + +__all__ = ["CommonAlgorithms", "PointAlgorithms", "VolumeAlgorithms"] -# __all__ = [ -# ] ############################################################################### -class CommonAlgorithms: - """Common algorithms.""" +class DataArrayHelper: + # Internal use only. + # Helper class to manage data associated to either + # points (or vertices) and cells (or faces). + def __init__(self, obj, association): + self.obj = obj + self.association = association - @property - def pointdata(self): - """ - Create and/or return a `numpy.array` associated to points (vertices). - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.pointdata["arrayname"]` + def __getitem__(self, key): - Usage: + if self.association == 0: + data = self.obj.dataset.GetPointData() - `myobj.pointdata.keys()` to return the available data array names + elif self.association == 1: + data = self.obj.dataset.GetCellData() - `myobj.pointdata.select(name)` to make this array the active one + elif self.association == 2: + data = self.obj.dataset.GetFieldData() - `myobj.pointdata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 0) + varr = data.GetAbstractArray(key) + if isinstance(varr, vtk.vtkStringArray): + if isinstance(key, int): + key = data.GetArrayName(key) + n = varr.GetNumberOfValues() + narr = [varr.GetValue(i) for i in range(n)] + return narr + ########### - @property - def celldata(self): - """ - Create and/or return a `numpy.array` associated to cells (faces). - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.celldata["arrayname"]` + else: + raise RuntimeError() - Usage: + if isinstance(key, int): + key = data.GetArrayName(key) - `myobj.celldata.keys()` to return the available data array names + arr = data.GetArray(key) + if not arr: + return None + return utils.vtk2numpy(arr) - `myobj.celldata.select(name)` to make this array the active one + def __setitem__(self, key, input_array): - `myobj.celldata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 1) + if self.association == 0: + data = self.obj.dataset.GetPointData() + n = self.obj.dataset.GetNumberOfPoints() + self.obj.mapper.SetScalarModeToUsePointData() - @property - def metadata(self): - """ - Create and/or return a `numpy.array` associated to neither cells nor faces. - A data array can be indexed either as a string or by an integer number. - E.g.: `myobj.metadata["arrayname"]` + elif self.association == 1: + data = self.obj.dataset.GetCellData() + n = self.obj.dataset.GetNumberOfCells() + self.obj.mapper.SetScalarModeToUseCellData() - Usage: + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + if not utils.is_sequence(input_array): + input_array = [input_array] - `myobj.metadata.keys()` to return the available data array names + if isinstance(input_array[0], str): + varr = vtk.vtkStringArray() + varr.SetName(key) + varr.SetNumberOfComponents(1) + varr.SetNumberOfTuples(len(input_array)) + for i, iarr in enumerate(input_array): + if isinstance(iarr, np.ndarray): + iarr = iarr.tolist() # better format + # Note: a string k can be converted to numpy with + # import json; k = np.array(json.loads(k)) + varr.InsertValue(i, str(iarr)) + else: + try: + varr = utils.numpy2vtk(input_array, name=key) + except TypeError as e: + vedo.logger.error( + f"cannot create metadata with input object:\n" + f"{input_array}" + f"\n\nAllowed content examples are:\n" + f"- flat list of strings ['a','b', 1, [1,2,3], ...]" + f" (first item must be a string in this case)\n" + f" hint: use k = np.array(json.loads(k)) to convert strings\n" + f"- numpy arrays of any shape" + ) + raise e - `myobj.metadata.select(name)` to make this array the active one + data.AddArray(varr) + return ############ - `myobj.metadata.remove(name)` to remove this array - """ - return DataArrayHelper(self, 2) + else: + raise RuntimeError() - def add_observer(self, event_name, func, priority=0): - """Add a callback function that will be called when an event occurs.""" - event_name = utils.get_vtk_name_event(event_name) - idd = self.AddObserver(event_name, func, priority) - return idd + if len(input_array) != n: + vedo.logger.error( + f"Error in point/cell data: length of input {len(input_array)}" + f" != {n} nr. of elements" + ) + raise RuntimeError() - def memory_address(self): - """ - Return a unique memory address integer which may serve as the ID of the - object, or passed to c++ code. - """ - # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ - # https://github.com/tfmoraes/polydata_connectivity - return int(self.GetAddressAsString("")[5:], 16) + input_array = np.asarray(input_array) + varr = utils.numpy2vtk(input_array, name=key) + data.AddArray(varr) - def memory_size(self): - """ - Return the size in bytes of the object in memory. - """ - return self.GetActualMemorySize() - - def modified(self): - """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" - self.dataset.GetPointData().Modified() - self.dataset.GetPointData().GetScalars().Modified() - return self + if len(input_array.shape) == 1: # scalars + data.SetActiveScalars(key) + elif len(input_array.shape) == 2 and input_array.shape[1] == 3: # vectors + if key.lower() == "normals": + data.SetActiveNormals(key) + else: + data.SetActiveVectors(key) - def box(self, scale=1, padding=0, fill=False): - """ - Return the bounding box as a new `Mesh`. + def keys(self): + """Return the list of available data array names""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + elif self.association == 1: + data = self.obj.dataset.GetCellData() + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + arrnames = [] + for i in range(data.GetNumberOfArrays()): + name = data.GetArray(i).GetName() + if name: + arrnames.append(name) + return arrnames - Arguments: - scale : (float) - box size can be scaled by a factor - padding : (float, list) - a constant padding can be added (can be a list [padx,pady,padz]) + def remove(self, key): + """Remove a data array by name or number""" + if self.association == 0: + self.obj.dataset.GetPointData().RemoveArray(key) + elif self.association == 1: + self.obj.dataset.GetCellData().RemoveArray(key) + elif self.association == 2: + self.obj.dataset.GetFieldData().RemoveArray(key) - Examples: - - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) - """ - b = self.bounds() - if not utils.is_sequence(padding): - padding = [padding, padding, padding] - length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] - tol = (length + width + height) / 30000 # useful for boxing 2D text - pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] - bx = vedo.shapes.Box( - pos, - length * scale + padding[0], - width * scale + padding[1], - height * scale + padding[2], - c="gray", - ) - try: - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - bx.SetProperty(pr) - bx.property = pr - except (AttributeError, TypeError): - pass - bx.wireframe(not fill) - bx.flat().lighting("off") - return bx + def clear(self): + """Remove all data associated to this object""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + elif self.association == 1: + data = self.obj.dataset.GetCellData() + elif self.association == 2: + data = self.obj.dataset.GetFieldData() + for i in range(data.GetNumberOfArrays()): + name = data.GetArray(i).GetName() + data.RemoveArray(name) - def bounds(self): - """ - Get the object bounds. - Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. - """ - try: - pts = self.vertices - xmin, ymin, zmin = np.min(pts, axis=0) - xmax, ymax, zmax = np.max(pts, axis=0) - return (xmin, xmax, ymin, ymax, zmin, zmax) - except (AttributeError, ValueError): - return self.dataset.GetBounds() + def rename(self, oldname, newname): + """Rename an array""" + if self.association == 0: + varr = self.obj.dataset.GetPointData().GetArray(oldname) + elif self.association == 1: + varr = self.obj.dataset.GetCellData().GetArray(oldname) + elif self.association == 2: + varr = self.obj.dataset.GetFieldData().GetArray(oldname) + if varr: + varr.SetName(newname) + else: + vedo.logger.warning( + f"Cannot rename non existing array {oldname} to {newname}" + ) - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) + def select(self, key): + """Select one specific array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) + if isinstance(key, int): + key = data.GetArrayName(key) - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) + arr = data.GetArray(key) + if not arr: + return - def diagonal_size(self): - """Get the length of the diagonal of mesh bounding box.""" - b = self.bounds() - return np.sqrt( - (b[1] - b[0])**2 + (b[3] - b[2])**2 + (b[5] - b[4])**2) + nc = arr.GetNumberOfComponents() + if nc == 1: + data.SetActiveScalars(key) + elif nc >= 2: + if "rgb" in key.lower(): + data.SetActiveScalars(key) + # try: + # self.mapper.SetColorModeToDirectScalars() + # except AttributeError: + # pass + else: + data.SetActiveVectors(key) + elif nc >= 4: + data.SetActiveTensors(key) - def copy_data_from(self, obj): - """Copy all data (point and cell data) from this input object""" - self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) - self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) - self.pipeline = utils.OperationNode( - f"copy_data_from\n{obj.__class__.__name__}", - parents=[self, obj], - shape="note", - c="#ccc5b9", - ) - return self + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + # .. could be a volume mapper + except AttributeError: + pass - def print(self): - """Print information about an object.""" - utils.print_info(self) - return self + def select_scalars(self, key): + """Select one specific scalar array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() - def inputdata(self): - """Obsolete, use `self` instead.""" - print("WARNING: inputdata() is obsolete, use self instead.") - return self + if isinstance(key, int): + key = data.GetArrayName(key) - @property - def npoints(self): - """Retrieve the number of points.""" - return self.dataset.GetNumberOfPoints() + data.SetActiveScalars(key) - @property - def ncells(self): - """Retrieve the number of cells.""" - return self.dataset.GetNumberOfCells() + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + except AttributeError: + pass - def points(self, pts=None): - """ - Obsolete, use `self.vertices` instead. + def select_vectors(self, key): + """Select one specific vector array by its name to make it the `active` one.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + self.obj.mapper.SetScalarModeToUsePointData() + else: + data = self.obj.dataset.GetCellData() + self.obj.mapper.SetScalarModeToUseCellData() - Set/Get the vertex coordinates of a mesh or point cloud. - """ - if pts is None: ### getter - msg = ( - "WARNING: points() is deprecated, use vertices instead. E.g.:\n" - " mesh.points() -> mesh.vertices" - ) - colors.printc(msg, c='y') - return self.vertices + if isinstance(key, int): + key = data.GetArrayName(key) - else: - msg = ( - "WARNING: points() is deprecated, use vertices instead. E.g.:\n" - " mesh.points([[x,y,z]]) -> mesh.vertices = [[x,y,z]]" - ) - colors.printc(msg, c='y') + data.SetActiveVectors(key) - pts = np.asarray(pts, dtype=np.float32) + try: + self.obj.mapper.SetArrayName(key) + self.obj.mapper.ScalarVisibilityOn() + except AttributeError: + pass - if pts.ndim == 1: - ### getter by point index ################### - indices = pts.astype(int) - vpts = self.dataset.GetPoints() - arr = utils.vtk2numpy(vpts.GetData()) - return arr[indices] ########### + def print(self, **kwargs): + """Print the array names available to terminal""" + colors.printc(self.keys(), **kwargs) - ### setter #################################### - if pts.shape[1] == 2: - pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] - arr = utils.numpy2vtk(pts, dtype=np.float32) + def __repr__(self) -> str: + """Representation""" - vpts = self.dataset.GetPoints() - vpts.SetData(arr) - vpts.Modified() - # reset mesh to identity matrix position/rotation: - self.point_locator = None - self.cell_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) - self.transform = LinearTransform() - return self + def _get_str(pd, header): + if pd.GetNumberOfArrays(): + out = f"\x1b[2m\x1b[1m\x1b[7m{header}" + if self.obj.name: + out += f" in {self.obj.name}" + out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" + for i in range(pd.GetNumberOfArrays()): + varr = pd.GetArray(i) + out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" + out += "\nindex".ljust(15) + f": {i}" + t = varr.GetDataType() + if t in vedo.utils.array_types: + out += f"\ntype".ljust(15) + out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" + shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) + out += "\nshape".ljust(15) + f": {shape}" + out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" + out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" + out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" + out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" + else: + out += " has no associated data." + return out - @property - def cell_centers(self): - """ - Get the coordinates of the cell centers. + if self.association == 0: + out = _get_str(self.dataset.GetPointData(), "Point Data") + elif self.association == 1: + out = _get_str(self.dataset.GetCellData(), "Cell Data") + elif self.association == 2: + pd = self.dataset.GetFieldData() + if pd.GetNumberOfArrays(): + out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" + if self.actor.name: + out += f" in {self.actor.name}" + out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" + for i in range(pd.GetNumberOfArrays()): + varr = pd.GetAbstractArray(i) + out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" + out += "\nindex".ljust(15) + f": {i}" + shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) + out += "\nshape".ljust(15) + f": {shape}" - Examples: - - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) - """ - vcen = vtk.vtkCellCenters() - vcen.SetInputData(self.dataset) - vcen.Update() - return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) + return out - def mark_boundaries(self): - """ - Mark cells and vertices of the mesh if they lie on a boundary. - A new array called `BoundaryCells` is added to the mesh. - """ - mb = vtk.vtkMarkBoundaryFilter() - mb.SetInputData(self.datset) - mb.Update() - self.DeepCopy(mb.GetOutput()) - self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) - return self +############################################################################### +class CommonAlgorithms: + """Common algorithms.""" - def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): - """ - Find cells that are within the specified bounds. - Setting a color will add a vtk array to colorize these cells. + @property + def pointdata(self): """ - if len(xbounds) == 6: - bnds = xbounds - else: - bnds = list(self.bounds()) - if len(xbounds) == 2: - bnds[0] = xbounds[0] - bnds[1] = xbounds[1] - if len(ybounds) == 2: - bnds[2] = ybounds[0] - bnds[3] = ybounds[1] - if len(zbounds) == 2: - bnds[4] = zbounds[0] - bnds[5] = zbounds[1] - - cellIds = vtk.vtkIdList() - self.cell_locator = vtk.vtkCellTreeLocator() - self.cell_locator.SetDataSet(self.dataset) - self.cell_locator.BuildLocator() - self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + Create and/or return a `numpy.array` associated to points (vertices). + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.pointdata["arrayname"]` - cids = [] - for i in range(cellIds.GetNumberOfIds()): - cid = cellIds.GetId(i) - cids.append(cid) + Usage: - return np.array(cids) + `myobj.pointdata.keys()` to return the available data array names + `myobj.pointdata.select(name)` to make this array the active one - def map_cells_to_points(self, arrays=(), move=False): + `myobj.pointdata.remove(name)` to remove this array """ - Interpolate cell data (i.e., data specified per cell or face) - into point data (i.e., data specified at each vertex). - The method of transformation is based on averaging the data values - of all cells using a particular point. - - A custom list of arrays to be mapped can be passed in input. + return DataArrayHelper(self, 0) - Set `move=True` to delete the original `celldata` array. + @property + def celldata(self): """ - c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(self.dataset) - if not move: - c2p.PassCellDataOn() - if arrays: - c2p.ClearCellDataArrays() - c2p.ProcessAllArraysOff() - for arr in arrays: - c2p.AddCellDataArray(arr) - else: - c2p.ProcessAllArraysOn() - c2p.Update() - self.mapper.SetScalarModeToUsePointData() - self._update(c2p.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) - return self - - @property - def vertices(self): - """Return the vertices (points) coordinates.""" - varr = self.dataset.GetPoints().GetData() - narr = utils.vtk2numpy(varr) - return narr - - #setter - @vertices.setter - def vertices(self, pts): - """Set vertices (points) coordinates.""" - arr = utils.numpy2vtk(pts, dtype=np.float32) - vpts = self.dataset.GetPoints() - vpts.SetData(arr) - vpts.Modified() - # reset mesh to identity matrix position/rotation: - self.point_locator = None - self.cell_locator = None - self.line_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) - self.transform = LinearTransform() - # BUG - # from vedo import * - # plt = Plotter(interactive=False, axes=7) - # s = Disc(res=(8,120)).linewidth(0.1) - # print([s.dataset.GetPoints().GetData()]) - # # plt.show(s) # depends if I show it or not.. - # # plt.renderer.AddActor(s.actor) - # print([s.dataset.GetPoints().GetData()]) - # for i in progressbar(100): - # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z - # show(s, interactive=1) - # exit() - return self + Create and/or return a `numpy.array` associated to cells (faces). + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.celldata["arrayname"]` - @property - def cells(self): - """ - Get the cells connectivity ids as a numpy array. + Usage: - The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - """ - arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + `myobj.celldata.keys()` to return the available data array names - # Get cell connettivity ids as a 1D array. vtk format is: - # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - i = 0 - conn = [] - n = len(arr1d) - if n: - while True: - cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] - conn.append(cell) - i += arr1d[i] + 1 - if i >= n: - break - return conn + `myobj.celldata.select(name)` to make this array the active one + `myobj.celldata.remove(name)` to remove this array + """ + return DataArrayHelper(self, 1) - def map_points_to_cells(self, arrays=(), move=False): + @property + def metadata(self): """ - Interpolate point data (i.e., data specified per point or vertex) - into cell data (i.e., data specified per cell). - The method of transformation is based on averaging the data values - of all points defining a particular cell. + Create and/or return a `numpy.array` associated to neither cells nor faces. + A data array can be indexed either as a string or by an integer number. + E.g.: `myobj.metadata["arrayname"]` - A custom list of arrays to be mapped can be passed in input. + Usage: - Set `move=True` to delete the original `pointdata` array. + `myobj.metadata.keys()` to return the available data array names - Examples: - - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) - """ - p2c = vtk.vtkPointDataToCellData() - p2c.SetInputData(self.dataset) - if not move: - p2c.PassPointDataOn() - if arrays: - p2c.ClearPointDataArrays() - p2c.ProcessAllArraysOff() - for arr in arrays: - p2c.AddPointDataArray(arr) - else: - p2c.ProcessAllArraysOn() - p2c.Update() - self.mapper.SetScalarModeToUseCellData() - self._update(p2c.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) - return self + `myobj.metadata.select(name)` to make this array the active one - def resample_data_from(self, source, tol=None, categorical=False): + `myobj.metadata.remove(name)` to remove this array """ - Resample point and cell data from another dataset. - The output has the same structure but its point data have - the resampled values from target. + return DataArrayHelper(self, 2) - Use `tol` to set the tolerance used to compute whether - a point in the source is in a cell of the current object. - Points without resampled values, and their cells, are marked as blank. - If the data is categorical, then the resulting data will be determined - by a nearest neighbor interpolation scheme. + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd - Example: - ```python - from vedo import * - m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) - pts = m1.vertices - ces = m1.cell_centers - m1.pointdata["xvalues"] = np.power(pts[:,0], 3) - m1.celldata["yvalues"] = np.power(ces[:,1], 3) - m2 = Mesh(dataurl+'bunny.obj') - m2.resample_arrays_from(m1) - # print(m2.pointdata["xvalues"]) - show(m1, m2 , N=2, axes=1) - ``` + def memory_address(self): """ - rs = vtk.vtkResampleWithDataSet() - rs.SetInputData(self.datset) - rs.SetSourceData(source) - - rs.SetPassPointArrays(True) - rs.SetPassCellArrays(True) - rs.SetPassFieldArrays(True) - rs.SetCategoricalData(categorical) + Return a unique memory address integer which may serve as the ID of the + object, or passed to c++ code. + """ + # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ + # https://github.com/tfmoraes/polydata_connectivity + return int(self.GetAddressAsString("")[5:], 16) - rs.SetComputeTolerance(True) - if tol: - rs.SetComputeTolerance(False) - rs.SetTolerance(tol) - rs.Update() - self._update(rs.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode( - f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] - ) - return self + def memory_size(self): + """ + Return the size in bytes of the object in memory. + """ + return self.GetActualMemorySize() - def add_ids(self): - """Generate point and cell ids arrays.""" - ids = vtk.vtkIdFilter() - ids.SetInputData(self.datset) - ids.PointIdsOn() - ids.CellIdsOn() - ids.FieldDataOff() - ids.SetPointIdsArrayName("PointID") - ids.SetCellIdsArrayName("CellID") - ids.Update() - self._update(ids.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("add_ids", parents=[self]) + def modified(self): + """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" + self.dataset.GetPointData().Modified() + self.dataset.GetPointData().GetScalars().Modified() return self - def gradient(self, input_array=None, on="points", fast=False): + def box(self, scale=1, padding=0, fill=False): """ - Compute and return the gradiend of the active scalar field as a numpy array. + Return the bounding box as a new `Mesh`. Arguments: - input_array : (str) - array of the scalars to compute the gradient, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). + scale : (float) + box size can be scaled by a factor + padding : (float, list) + a constant padding can be added (can be a list [padx,pady,padz]) Examples: - - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) - - ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) + - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) """ - gra = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + b = self.bounds() + if not utils.is_sequence(padding): + padding = [padding, padding, padding] + length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] + tol = (length + width + height) / 30000 # useful for boxing 2D text + pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] + bx = vedo.shapes.Box( + pos, + length * scale + padding[0], + width * scale + padding[1], + height * scale + padding[2], + c="gray", + ) + try: + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + bx.SetProperty(pr) + bx.property = pr + except (AttributeError, TypeError): + pass + bx.wireframe(not fill) + bx.flat().lighting("off") + return bx - if input_array is None: - if varr.GetScalars(): - input_array = varr.GetScalars().GetName() - else: - vedo.logger.error(f"in gradient: no scalars found for {on}") - raise RuntimeError + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + try: + pts = self.vertices + xmin, ymin, zmin = np.min(pts, axis=0) + xmax, ymax, zmax = np.max(pts, axis=0) + return (xmin, xmax, ymin, ymax, zmin, zmax) + except (AttributeError, ValueError): + return self.dataset.GetBounds() - gra.SetInputData(self.dataset) - gra.SetInputScalars(tp, input_array) - gra.SetResultArrayName("Gradient") - gra.SetFasterApproximation(fast) - gra.ComputeDivergenceOff() - gra.ComputeVorticityOff() - gra.ComputeGradientOn() - gra.Update() - if on.startswith("p"): - gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) - else: - gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) - return gvecs - - def divergence(self, array_name=None, on="points", fast=False): - """ - Compute and return the divergence of a vector field as a numpy array. + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) - Arguments: - array_name : (str) - name of the array of vectors to compute the divergence, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). - """ - div = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) - if array_name is None: - if varr.GetVectors(): - array_name = varr.GetVectors().GetName() - else: - vedo.logger.error(f"in divergence(): no vectors found for {on}") - raise RuntimeError + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) - div.SetInputData(self.datset) - div.SetInputScalars(tp, array_name) - div.ComputeDivergenceOn() - div.ComputeGradientOff() - div.ComputeVorticityOff() - div.SetDivergenceArrayName("Divergence") - div.SetFasterApproximation(fast) - div.Update() - if on.startswith("p"): - dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) - else: - dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) - return dvecs + def diagonal_size(self): + """Get the length of the diagonal of mesh bounding box.""" + b = self.bounds() + return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - def vorticity(self, array_name=None, on="points", fast=False): - """ - Compute and return the vorticity of a vector field as a numpy array. + def copy_data_from(self, obj): + """Copy all data (point and cell data) from this input object""" + self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) + self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) + self.pipeline = utils.OperationNode( + f"copy_data_from\n{obj.__class__.__name__}", + parents=[self, obj], + shape="note", + c="#ccc5b9", + ) + return self - Arguments: - array_name : (str) - name of the array to compute the vorticity, - if None the current active array is selected - on : (str) - compute either on 'points' or 'cells' data - fast : (bool) - if True, will use a less accurate algorithm - that performs fewer derivative calculations (and is therefore faster). - """ - vort = vtk.vtkGradientFilter() - if on.startswith("p"): - varr = self.dataset.GetPointData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: - varr = self.dataset.GetCellData() - tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + def print(self): + """Print information about an object.""" + utils.print_info(self) + return self - if array_name is None: - if varr.GetVectors(): - array_name = varr.GetVectors().GetName() - else: - vedo.logger.error(f"in vorticity(): no vectors found for {on}") - raise RuntimeError + def inputdata(self): + """Obsolete, use `self` instead.""" + print("WARNING: inputdata() is obsolete, use self instead.") + return self - vort.SetInputData(self.datset) - vort.SetInputScalars(tp, array_name) - vort.ComputeDivergenceOff() - vort.ComputeGradientOff() - vort.ComputeVorticityOn() - vort.SetVorticityArrayName("Vorticity") - vort.SetFasterApproximation(fast) - vort.Update() - if on.startswith("p"): - vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) - else: - vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) - return vvecs + @property + def npoints(self): + """Retrieve the number of points.""" + return self.dataset.GetNumberOfPoints() - def write(self, filename, binary=True): - """Write object to file.""" - out = vedo.file_io.write(self, filename, binary) - out.pipeline = utils.OperationNode( - "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" - ) - return out + @property + def ncells(self): + """Retrieve the number of cells.""" + return self.dataset.GetNumberOfCells() - def tomesh(self, fill=True, shrink=1.0): + def points(self, pts=None): """ - Build a polygonal Mesh from the current object. - - If `fill=True`, the interior faces of all the cells are created. - (setting a `shrink` value slightly smaller than the default 1.0 - can avoid flickering due to internal adjacent faces). + Obsolete, use `self.vertices` instead. - If `fill=False`, only the boundary faces will be generated. + Set/Get the vertex coordinates of a mesh or point cloud. """ - gf = vtk.vtkGeometryFilter() - if fill: - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) - sf.SetShrinkFactor(shrink) - sf.Update() - gf.SetInputData(sf.GetOutput()) - gf.Update() - poly = gf.GetOutput() - if shrink == 1.0: - cleanPolyData = vtk.vtkCleanPolyData() - cleanPolyData.PointMergingOn() - cleanPolyData.ConvertLinesToPointsOn() - cleanPolyData.ConvertPolysToLinesOn() - cleanPolyData.ConvertStripsToPolysOn() - cleanPolyData.SetInputData(poly) - cleanPolyData.Update() - poly = cleanPolyData.GetOutput() - else: - gf.SetInputData(self.datset) - gf.Update() - poly = gf.GetOutput() - - msh = vedo.mesh.Mesh(poly).flat() - msh.scalarbar = self.scalarbar - lut = utils.ctf2lut(self) - if lut: - msh.mapper.SetLookupTable(lut) - - msh.pipeline = utils.OperationNode( - "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - ) - return msh + if pts is None: ### getter + msg = ( + "WARNING: points() is deprecated, use vertices instead. E.g.:\n" + " mesh.points() -> mesh.vertices" + ) + colors.printc(msg, c="y") + return self.vertices - def shrink(self, fraction=0.8): - """ - Shrink the individual cells to improve visibility. + else: + msg = ( + "WARNING: points() is deprecated, use vertices instead. E.g.:\n" + " mesh.points([[x,y,z]]) -> mesh.vertices = [[x,y,z]]" + ) + colors.printc(msg, c="y") - ![](https://vedo.embl.es/images/feats/shrink_hex.png) - """ - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) - sf.SetShrinkFactor(fraction) - sf.Update() - self._update(sf.GetOutput()) - self.pipeline = utils.OperationNode( - "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" - ) - return self - + pts = np.asarray(pts, dtype=np.float32) + if pts.ndim == 1: + ### getter by point index ################### + indices = pts.astype(int) + vpts = self.dataset.GetPoints() + arr = utils.vtk2numpy(vpts.GetData()) + return arr[indices] ########### + ### setter #################################### + if pts.shape[1] == 2: + pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] + arr = utils.numpy2vtk(pts, dtype=np.float32) + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + # reset mesh to identity matrix position/rotation: + self.point_locator = None + self.cell_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) + self.transform = LinearTransform() + return self + @property + def cell_centers(self): + """ + Get the coordinates of the cell centers. -############################################################################### -class PointAlgorithms(CommonAlgorithms): - """Methods for point clouds.""" + Examples: + - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) + """ + vcen = vtk.vtkCellCenters() + vcen.SetInputData(self.dataset) + vcen.Update() + return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) - def apply_transform(self, LT, concatenate=True, deep_copy=True): + def mark_boundaries(self): """ - Apply a linear or non-linear transformation to the mesh polygonal data. - ```python - from vedo import Cube, show - c1 = Cube().rotate_z(5).x(2).y(1) - print("cube1 position", c1.pos()) - T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y - c2 = Cube().c('r4') - c2.apply_transform(T) # ignore previous movements - c2.apply_transform(T, concatenate=True) - c2.apply_transform(T, concatenate=True) - print("cube2 position", c2.pos()) - show(c1, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/apply_transform.png) + Mark cells and vertices of the mesh if they lie on a boundary. + A new array called `BoundaryCells` is added to the mesh. """ - if isinstance(LT, LinearTransform): - tr = LT.T - if LT.is_identity(): - return self - if concatenate: - self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): - LT = LinearTransform(LT) - if LT.is_identity(): - return self - tr = LT.T - if concatenate: - self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): - tr = LT - # cannot concatenate here - - tp = vtk.vtkTransformPolyDataFilter() - tp.SetTransform(tr) - tp.SetInputData(self.dataset) - tp.Update() - out = tp.GetOutput() + mb = vtk.vtkMarkBoundaryFilter() + mb.SetInputData(self.datset) + mb.Update() + self.DeepCopy(mb.GetOutput()) + self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) + return self - if deep_copy: - self.dataset.DeepCopy(out) + def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): + """ + Find cells that are within the specified bounds. + Setting a color will add a vtk array to colorize these cells. + """ + if len(xbounds) == 6: + bnds = xbounds else: - self.dataset.ShallowCopy(out) - - # reset the locators - self.point_locator = None - self.cell_locator = None - self.line_locator = None - return self + bnds = list(self.bounds()) + if len(xbounds) == 2: + bnds[0] = xbounds[0] + bnds[1] = xbounds[1] + if len(ybounds) == 2: + bnds[2] = ybounds[0] + bnds[3] = ybounds[1] + if len(zbounds) == 2: + bnds[4] = zbounds[0] + bnds[5] = zbounds[1] + cellIds = vtk.vtkIdList() + self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator.SetDataSet(self.dataset) + self.cell_locator.BuildLocator() + self.cell_locator.FindCellsWithinBounds(bnds, cellIds) - def pos(self, x=None, y=None, z=None): - """Set/Get object position.""" - if x is None: # get functionality - return self.transform.position + cids = [] + for i in range(cellIds.GetNumberOfIds()): + cid = cellIds.GetId(i) + cids.append(cid) - if z is None and y is None: # assume x is of the form (x,y,z) - if len(x) == 3: - x, y, z = x - else: - x, y = x - z = 0 - elif z is None: # assume x,y is of the form x, y - z = 0 + return np.array(cids) - q = self.transform.position - LT = LinearTransform() - LT.translate([x,y,z] - q) - return self.apply_transform(LT) + def map_cells_to_points(self, arrays=(), move=False): + """ + Interpolate cell data (i.e., data specified per cell or face) + into point data (i.e., data specified at each vertex). + The method of transformation is based on averaging the data values + of all cells using a particular point. - def shift(self, dx=0, dy=0, dz=0): - """Add a vector to the current object position.""" - if utils.is_sequence(dx): - utils.make3d(dx) - dx, dy, dz = dx - LT = LinearTransform().translate([dx, dy, dz]) - return self.apply_transform(LT) + A custom list of arrays to be mapped can be passed in input. - def x(self, val=None): - """Set/Get object position along x axis.""" - p = self.transform.position - if val is None: - return p[0] - self.pos(val, p[1], p[2]) + Set `move=True` to delete the original `celldata` array. + """ + c2p = vtk.vtkCellDataToPointData() + c2p.SetInputData(self.dataset) + if not move: + c2p.PassCellDataOn() + if arrays: + c2p.ClearCellDataArrays() + c2p.ProcessAllArraysOff() + for arr in arrays: + c2p.AddCellDataArray(arr) + else: + c2p.ProcessAllArraysOn() + c2p.Update() + self.mapper.SetScalarModeToUsePointData() + self._update(c2p.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return self - def y(self, val=None): - """Set/Get object position along y axis.""" - p = self.transform.position - if val is None: - return p[1] - self.pos(p[0], val, p[2]) - return self + @property + def vertices(self): + """Return the vertices (points) coordinates.""" + varr = self.dataset.GetPoints().GetData() + narr = utils.vtk2numpy(varr) + return narr - def z(self, val=None): - """Set/Get object position along z axis.""" - p = self.transform.position - if val is None: - return p[2] - self.pos(p[0], p[1], val) + # setter + @vertices.setter + def vertices(self, pts): + """Set vertices (points) coordinates.""" + arr = utils.numpy2vtk(pts, dtype=np.float32) + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + # reset mesh to identity matrix position/rotation: + self.point_locator = None + self.cell_locator = None + self.line_locator = None + self.actor.PokeMatrix(vtk.vtkMatrix4x4()) + self.transform = LinearTransform() + # BUG + # from vedo import * + # plt = Plotter(interactive=False, axes=7) + # s = Disc(res=(8,120)).linewidth(0.1) + # print([s.dataset.GetPoints().GetData()]) + # # plt.show(s) # depends if I show it or not.. + # # plt.renderer.AddActor(s.actor) + # print([s.dataset.GetPoints().GetData()]) + # for i in progressbar(100): + # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z + # show(s, interactive=1) + # exit() return self - def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): + @property + def cells(self): """ - Rotate around an arbitrary `axis` passing through `point`. + Get the cells connectivity ids as a numpy array. - Example: - ```python - from vedo import * - c1 = Cube() - c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - v = vector(0.2,1,0) - p = vector(1,0,0) # axis passes through this point - c2.rotate(90, axis=v, point=p) - l = Line(-v+p, v+p).lw(3).c('red') - show(c1, l, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/rotate_axis.png) + The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ - # self.rotate(angle, axis, point, rad) - LT = LinearTransform() - LT.rotate(angle, axis, point, rad) - return self.apply_transform(LT) + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) - def rotate_x(self, angle, rad=False, around=None): - """ - Rotate around x-axis. If angle is in radians set `rad=True`. + # Get cell connettivity ids as a 1D array. vtk format is: + # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. + i = 0 + conn = [] + n = len(arr1d) + if n: + while True: + cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] + conn.append(cell) + i += arr1d[i] + 1 + if i >= n: + break + return conn - Use `around` to define a pivoting point. + def map_points_to_cells(self, arrays=(), move=False): """ - LT = LinearTransform().rotate_x(angle, rad, around) - return self.apply_transform(LT) + Interpolate point data (i.e., data specified per point or vertex) + into cell data (i.e., data specified per cell). + The method of transformation is based on averaging the data values + of all points defining a particular cell. - def rotate_y(self, angle, rad=False, around=None): - """ - Rotate around y-axis. If angle is in radians set `rad=True`. + A custom list of arrays to be mapped can be passed in input. - Use `around` to define a pivoting point. - """ - LT = LinearTransform().rotate_y(angle, rad, around) - return self.apply_transform(LT) + Set `move=True` to delete the original `pointdata` array. - def rotate_z(self, angle, rad=False, around=None): + Examples: + - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ - Rotate around z-axis. If angle is in radians set `rad=True`. + p2c = vtk.vtkPointDataToCellData() + p2c.SetInputData(self.dataset) + if not move: + p2c.PassPointDataOn() + if arrays: + p2c.ClearPointDataArrays() + p2c.ProcessAllArraysOff() + for arr in arrays: + p2c.AddPointDataArray(arr) + else: + p2c.ProcessAllArraysOn() + p2c.Update() + self.mapper.SetScalarModeToUseCellData() + self._update(p2c.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) + return self - Use `around` to define a pivoting point. + def resample_data_from(self, source, tol=None, categorical=False): """ - LT = LinearTransform().rotate_z(angle, rad, around) - return self.apply_transform(LT) + Resample point and cell data from another dataset. + The output has the same structure but its point data have + the resampled values from target. - def reorient(self, - newaxis, - initaxis=None, - rotation=0, - rad=False, - xyplane=True, - ): - """ - Reorient the object to point to a new direction from an initial one. - If `initaxis` is None, the object will be assumed in its "default" orientation. - If `xyplane` is True, the object will be rotated to lie on the xy plane. - - Use `rotation` to first rotate the object around its `initaxis`. - """ - if initaxis is None: - initaxis = np.asarray(self.top) - self.base - - q = self.transform.position - LT = LinearTransform() - LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) - return self.apply_transform(LT) + Use `tol` to set the tolerance used to compute whether + a point in the source is in a cell of the current object. + Points without resampled values, and their cells, are marked as blank. + If the data is categorical, then the resulting data will be determined + by a nearest neighbor interpolation scheme. - def scale(self, s=None, reset=False, origin=True): + Example: + ```python + from vedo import * + m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) + pts = m1.vertices + ces = m1.cell_centers + m1.pointdata["xvalues"] = np.power(pts[:,0], 3) + m1.celldata["yvalues"] = np.power(ces[:,1], 3) + m2 = Mesh(dataurl+'bunny.obj') + m2.resample_arrays_from(m1) + # print(m2.pointdata["xvalues"]) + show(m1, m2 , N=2, axes=1) + ``` """ - Set/get object's scaling factor. + rs = vtk.vtkResampleWithDataSet() + rs.SetInputData(self.datset) + rs.SetSourceData(source) - Arguments: - s : (list, float) - scaling factor(s). - reset : (bool) - if True previous scaling factors are ignored. - origin : (bool) - if True scaling is applied with respect to object's position, - otherwise is applied respect to (0,0,0). + rs.SetPassPointArrays(True) + rs.SetPassCellArrays(True) + rs.SetPassFieldArrays(True) + rs.SetCategoricalData(categorical) - Note: - use `s=(sx,sy,sz)` to scale differently in the three coordinates. + rs.SetComputeTolerance(True) + if tol: + rs.SetComputeTolerance(False) + rs.SetTolerance(tol) + rs.Update() + self._update(rs.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode( + f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] + ) + return self + + def add_ids(self): + """Generate point and cell ids arrays.""" + ids = vtk.vtkIdFilter() + ids.SetInputData(self.datset) + ids.PointIdsOn() + ids.CellIdsOn() + ids.FieldDataOff() + ids.SetPointIdsArrayName("PointID") + ids.SetCellIdsArrayName("CellID") + ids.Update() + self._update(ids.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode("add_ids", parents=[self]) + return self + + def gradient(self, input_array=None, on="points", fast=False): """ - if s is None: - return np.array(self.transform.T.GetScale()) + Compute and return the gradiend of the active scalar field as a numpy array. - if not utils.is_sequence(s): - s = [s, s, s] + Arguments: + input_array : (str) + array of the scalars to compute the gradient, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). - LT = LinearTransform() - if reset: - old_s = np.array(self.transform.T.GetScale()) - LT.scale(s / old_s) + Examples: + - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) + + ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) + """ + gra = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - if origin is True: - LT.scale(s, origin=self.transform.position) - elif origin is False: - LT.scale(s, origin=False) - else: - LT.scale(s, origin=origin) + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - return self.apply_transform(LT) + if input_array is None: + if varr.GetScalars(): + input_array = varr.GetScalars().GetName() + else: + vedo.logger.error(f"in gradient: no scalars found for {on}") + raise RuntimeError + gra.SetInputData(self.dataset) + gra.SetInputScalars(tp, input_array) + gra.SetResultArrayName("Gradient") + gra.SetFasterApproximation(fast) + gra.ComputeDivergenceOff() + gra.ComputeVorticityOff() + gra.ComputeGradientOn() + gra.Update() + if on.startswith("p"): + gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) + else: + gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) + return gvecs -############################################################################### -class VolumeAlgorithms(CommonAlgorithms): - """Methods for Volume objects.""" + def divergence(self, array_name=None, on="points", fast=False): + """ + Compute and return the divergence of a vector field as a numpy array. - def isosurface(self, value=None, flying_edges=True): + Arguments: + array_name : (str) + name of the array of vectors to compute the divergence, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). """ - Return an `Mesh` isosurface extracted from the `Volume` object. + div = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS + else: + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - Set `value` as single float or list of values to draw the isosurface(s). - Use flying_edges for faster results (but sometimes can interfere with `smooth()`). + if array_name is None: + if varr.GetVectors(): + array_name = varr.GetVectors().GetName() + else: + vedo.logger.error(f"in divergence(): no vectors found for {on}") + raise RuntimeError - Examples: - - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) + div.SetInputData(self.datset) + div.SetInputScalars(tp, array_name) + div.ComputeDivergenceOn() + div.ComputeGradientOff() + div.ComputeVorticityOff() + div.SetDivergenceArrayName("Divergence") + div.SetFasterApproximation(fast) + div.Update() + if on.startswith("p"): + dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) + else: + dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) + return dvecs - ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) + def vorticity(self, array_name=None, on="points", fast=False): """ - scrange = self.dataset.GetScalarRange() + Compute and return the vorticity of a vector field as a numpy array. - if flying_edges: - cf = vtk.vtkFlyingEdges3D() - cf.InterpolateAttributesOn() + Arguments: + array_name : (str) + name of the array to compute the vorticity, + if None the current active array is selected + on : (str) + compute either on 'points' or 'cells' data + fast : (bool) + if True, will use a less accurate algorithm + that performs fewer derivative calculations (and is therefore faster). + """ + vort = vtk.vtkGradientFilter() + if on.startswith("p"): + varr = self.dataset.GetPointData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: - cf = vtk.vtkContourFilter() - cf.UseScalarTreeOn() + varr = self.dataset.GetCellData() + tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS - cf.SetInputData(self.datset) - cf.ComputeNormalsOn() + if array_name is None: + if varr.GetVectors(): + array_name = varr.GetVectors().GetName() + else: + vedo.logger.error(f"in vorticity(): no vectors found for {on}") + raise RuntimeError - if utils.is_sequence(value): - cf.SetNumberOfContours(len(value)) - for i, t in enumerate(value): - cf.SetValue(i, t) + vort.SetInputData(self.datset) + vort.SetInputScalars(tp, array_name) + vort.ComputeDivergenceOff() + vort.ComputeGradientOff() + vort.ComputeVorticityOn() + vort.SetVorticityArrayName("Vorticity") + vort.SetFasterApproximation(fast) + vort.Update() + if on.startswith("p"): + vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) else: - if value is None: - value = (2 * scrange[0] + scrange[1]) / 3.0 - # print("automatic isosurface value =", value) - cf.SetValue(0, value) - - cf.Update() - poly = cf.GetOutput() - - out = vedo.mesh.Mesh(poly, c=None).phong() - out.mapper.SetScalarRange(scrange[0], scrange[1]) + vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) + return vvecs + def write(self, filename, binary=True): + """Write object to file.""" + out = vedo.file_io.write(self, filename, binary) out.pipeline = utils.OperationNode( - "isosurface", - parents=[self], - comment=f"#pts {out.GetNumberOfPoints()}", - c="#4cc9f0:#e9c46a", + "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" ) return out - - def legosurface( - self, vmin=None, vmax=None, invert=False, boundary=False, array_name="input_scalars" - ): + def tomesh(self, fill=True, shrink=1.0): """ - Represent an object - typically a `Volume` - as lego blocks (voxels). - By default colors correspond to the volume's scalar. - Returns an `Mesh` object. + Build a polygonal Mesh from the current object. - Arguments: - vmin : (float) - the lower threshold, voxels below this value are not shown. - vmax : (float) - the upper threshold, voxels above this value are not shown. - boundary : (bool) - controls whether to include cells that are partially inside - array_name : (int, str) - name or index of the scalar array to be considered + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). - Examples: - - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) - - ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) + If `fill=False`, only the boundary faces will be generated. """ - dataset = vtk.vtkImplicitDataSet() - dataset.SetDataSet(self) - window = vtk.vtkImplicitWindowFunction() - window.SetImplicitFunction(dataset) - - srng = list(self.dataset.GetScalarRange()) - if vmin is not None: - srng[0] = vmin - if vmax is not None: - srng[1] = vmax - tol = 0.00001 * (srng[1] - srng[0]) - srng[0] -= tol - srng[1] += tol - window.SetWindowRange(srng) - - extract = vtk.vtkExtractGeometry() - extract.SetInputData(self.datset) - extract.SetImplicitFunction(window) - extract.SetExtractInside(invert) - extract.SetExtractBoundaryCells(boundary) - extract.Update() - gf = vtk.vtkGeometryFilter() - gf.SetInputData(extract.GetOutput()) - gf.Update() + if fill: + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.datset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + if shrink == 1.0: + cleanPolyData = vtk.vtkCleanPolyData() + cleanPolyData.PointMergingOn() + cleanPolyData.ConvertLinesToPointsOn() + cleanPolyData.ConvertPolysToLinesOn() + cleanPolyData.ConvertStripsToPolysOn() + cleanPolyData.SetInputData(poly) + cleanPolyData.Update() + poly = cleanPolyData.GetOutput() + else: + gf.SetInputData(self.datset) + gf.Update() + poly = gf.GetOutput() - m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() - m.map_points_to_cells() - m.celldata.select(array_name) + msh = vedo.mesh.Mesh(poly).flat() + msh.scalarbar = self.scalarbar + lut = utils.ctf2lut(self) + if lut: + msh.mapper.SetLookupTable(lut) - m.pipeline = utils.OperationNode( - "legosurface", parents=[self], comment=f"array: {array_name}", c="#4cc9f0:#e9c46a" + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" ) - return m + return msh - def cut_with_plane(self, origin=(0, 0, 0), normal="x"): + def shrink(self, fraction=0.8): """ - Cut the object with the plane defined by a point and a normal. + Shrink the individual cells to improve visibility. - Arguments: - origin : (list) - the cutting plane goes through this point - normal : (list, str) - normal vector to the cutting plane + ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") - - strn = str(normal) - if strn == "x": normal = (1, 0, 0) - elif strn == "y": normal = (0, 1, 0) - elif strn == "z": normal = (0, 0, 1) - elif strn == "-x": normal = (-1, 0, 0) - elif strn == "-y": normal = (0, -1, 0) - elif strn == "-z": normal = (0, 0, -1) - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self.datset) - clipper.SetClipFunction(plane) - clipper.GenerateClipScalarsOff() - clipper.GenerateClippedOutputOff() - clipper.SetValue(0) - clipper.Update() - cout = clipper.GetOutput() - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.datset) + sf.SetShrinkFactor(fraction) + sf.Update() + self._update(sf.GetOutput()) + self.pipeline = utils.OperationNode( + "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" + ) + return self +############################################################################### +class PointAlgorithms(CommonAlgorithms): + """Methods for point clouds.""" - def cut_with_box(self, box): + def apply_transform(self, LT, concatenate=True, deep_copy=True): """ - Cut the grid with the specified bounding box. - - Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. - If an object is passed, its bounding box are used. - - Example: + Apply a linear or non-linear transformation to the mesh polygonal data. ```python - from vedo import * - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') - tetmesh.color('rainbow') - cu = Cube(side=500).x(500) # any Mesh works - tetmesh.cut_with_box(cu).show(axes=1) + from vedo import Cube, show + c1 = Cube().rotate_z(5).x(2).y(1) + print("cube1 position", c1.pos()) + T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y + c2 = Cube().c('r4') + c2.apply_transform(T) # ignore previous movements + c2.apply_transform(T, concatenate=True) + c2.apply_transform(T, concatenate=True) + print("cube2 position", c2.pos()) + show(c1, c2, axes=1).close() ``` - ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + ![](https://vedo.embl.es/images/feats/apply_transform.png) """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") - - bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self.datset) - if isinstance(box, vtk.vtkProp): - boxb = box.GetBounds() - else: - boxb = box - bc.SetBoxClip(*boxb) - bc.Update() - cout = bc.GetOutput() - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + if isinstance(LT, LinearTransform): + tr = LT.T + if LT.is_identity(): return self - ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return ug + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): + LT = LinearTransform(LT) + if LT.is_identity(): + return self + tr = LT.T + if concatenate: + self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): + tr = LT + # cannot concatenate here + + tp = vtk.vtkTransformPolyDataFilter() + tp.SetTransform(tr) + tp.SetInputData(self.dataset) + tp.Update() + out = tp.GetOutput() + if deep_copy: + self.dataset.DeepCopy(out) else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return self + self.dataset.ShallowCopy(out) + # reset the locators + self.point_locator = None + self.cell_locator = None + self.line_locator = None + return self - def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): - """ - Cut a UGrid or TetMesh with a Mesh. + def pos(self, x=None, y=None, z=None): + """Set/Get object position.""" + if x is None: # get functionality + return self.transform.position - Use `invert` to return cut off part of the input object. - """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") + if z is None and y is None: # assume x is of the form (x,y,z) + if len(x) == 3: + x, y, z = x + else: + x, y = x + z = 0 + elif z is None: # assume x,y is of the form x, y + z = 0 - ug = self + q = self.transform.position + LT = LinearTransform() + LT.translate([x, y, z] - q) + return self.apply_transform(LT) - ippd = vtk.vtkImplicitPolyDataDistance() - ippd.SetInput(mesh) + def shift(self, dx=0, dy=0, dz=0): + """Add a vector to the current object position.""" + if utils.is_sequence(dx): + utils.make3d(dx) + dx, dy, dz = dx + LT = LinearTransform().translate([dx, dy, dz]) + return self.apply_transform(LT) - if whole_cells or only_boundary: - clipper = vtk.vtkExtractGeometry() - clipper.SetInputData(ug) - clipper.SetImplicitFunction(ippd) - clipper.SetExtractInside(not invert) - clipper.SetExtractBoundaryCells(False) - if only_boundary: - clipper.SetExtractBoundaryCells(True) - clipper.SetExtractOnlyBoundaryCells(True) - else: - signedDistances = vtk.vtkFloatArray() - signedDistances.SetNumberOfComponents(1) - signedDistances.SetName("SignedDistances") - for pointId in range(ug.GetNumberOfPoints()): - p = ug.GetPoint(pointId) - signedDistance = ippd.EvaluateFunction(p) - signedDistances.InsertNextValue(signedDistance) - ug.GetPointData().AddArray(signedDistances) - ug.GetPointData().SetActiveScalars("SignedDistances") - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(ug) - clipper.SetInsideOut(not invert) - clipper.SetValue(0.0) + def x(self, val=None): + """Set/Get object position along x axis.""" + p = self.transform.position + if val is None: + return p[0] + self.pos(val, p[1], p[2]) + return self - clipper.Update() - cout = clipper.GetOutput() - - # if ug.GetCellData().GetScalars(): # not working - # scalname = ug.GetCellData().GetScalars().GetName() - # if scalname: # not working - # if self.useCells: - # self.celldata.select(scalname) - # else: - # self.pointdata.select(scalname) - # self._update(cout) - # self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") - # return self - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - - def extract_cells_on_plane(self, origin, normal): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - bf.SetImplicitFunction(plane) - bf.Update() + def y(self, val=None): + """Set/Get object position along y axis.""" + p = self.transform.position + if val is None: + return p[1] + self.pos(p[0], val, p[2]) + return self - self._update(bf.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode( - "extract_cells_on_plane", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) + def z(self, val=None): + """Set/Get object position along z axis.""" + p = self.transform.position + if val is None: + return p[2] + self.pos(p[0], p[1], val) return self - def extract_cells_on_sphere(self, center, radius): + def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): """ - Extract cells that are lying of the specified surface. + Rotate around an arbitrary `axis` passing through `point`. + + Example: + ```python + from vedo import * + c1 = Cube() + c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 + v = vector(0.2,1,0) + p = vector(1,0,0) # axis passes through this point + c2.rotate(90, axis=v, point=p) + l = Line(-v+p, v+p).lw(3).c('red') + show(c1, l, c2, axes=1).close() + ``` + ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() + # self.rotate(angle, axis, point, rad) + LT = LinearTransform() + LT.rotate(angle, axis, point, rad) + return self.apply_transform(LT) - sph = vtk.vtkSphere() - sph.SetRadius(radius) - sph.SetCenter(center) - bf.SetImplicitFunction(sph) - bf.Update() + def rotate_x(self, angle, rad=False, around=None): + """ + Rotate around x-axis. If angle is in radians set `rad=True`. - self._update(bf.GetOutput()) - self.pipeline = utils.OperationNode( - "extract_cells_on_sphere", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_x(angle, rad, around) + return self.apply_transform(LT) - def extract_cells_on_cylinder(self, center, axis, radius): + def rotate_y(self, angle, rad=False, around=None): """ - Extract cells that are lying of the specified surface. + Rotate around y-axis. If angle is in radians set `rad=True`. + + Use `around` to define a pivoting point. """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() + LT = LinearTransform().rotate_y(angle, rad, around) + return self.apply_transform(LT) - cyl = vtk.vtkCylinder() - cyl.SetRadius(radius) - cyl.SetCenter(center) - cyl.SetAxis(axis) - bf.SetImplicitFunction(cyl) - bf.Update() + def rotate_z(self, angle, rad=False, around=None): + """ + Rotate around z-axis. If angle is in radians set `rad=True`. - self.pipeline = utils.OperationNode( - "extract_cells_on_cylinder", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - self._update(bf.GetOutput()) - return self + Use `around` to define a pivoting point. + """ + LT = LinearTransform().rotate_z(angle, rad, around) + return self.apply_transform(LT) - def clean(self): + def reorient(self, newaxis, initaxis=None, rotation=0, rad=False, xyplane=True): """ - Cleanup unused points and empty cells + Reorient the object to point to a new direction from an initial one. + If `initaxis` is None, the object will be assumed in its "default" orientation. + If `xyplane` is True, the object will be rotated to lie on the xy plane. + + Use `rotation` to first rotate the object around its `initaxis`. """ - cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self.datset) - cl.RemoveUnusedPointsOn() - cl.ProduceMergeMapOff() - cl.AveragePointDataOff() - cl.Update() + if initaxis is None: + initaxis = np.asarray(self.top) - self.base - self._update(cl.GetOutput()) - self.pipeline = utils.OperationNode( - "clean", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#9e2a2b" - ) - return self + q = self.transform.position + LT = LinearTransform() + LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) + return self.apply_transform(LT) - def find_cell(self, p): - """Locate the cell that contains a point and return the cell ID.""" - cell = vtk.vtkTetra() - cellId = vtk.mutable(0) - tol2 = vtk.mutable(0) - subId = vtk.mutable(0) - pcoords = [0, 0, 0] - weights = [0, 0, 0] - cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) - return cid + def scale(self, s=None, reset=False, origin=True): + """ + Set/get object's scaling factor. - def extract_cells_by_id(self, idlist, use_point_ids=False): - """Return a new UGrid composed of the specified subset of indices.""" - selectionNode = vtk.vtkSelectionNode() - if use_point_ids: - selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) - contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() - selectionNode.GetProperties().Set(contcells, 1) - else: - selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) - selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) - vidlist = utils.numpy2vtk(idlist, dtype="id") - selectionNode.SetSelectionList(vidlist) - selection = vtk.vtkSelection() - selection.AddNode(selectionNode) - es = vtk.vtkExtractSelection() - es.SetInputData(0, self) - es.SetInputData(1, selection) - es.Update() + Arguments: + s : (list, float) + scaling factor(s). + reset : (bool) + if True previous scaling factors are ignored. + origin : (bool) + if True scaling is applied with respect to object's position, + otherwise is applied respect to (0,0,0). - ug = vedo.ugrid.UGrid(es.GetOutput()) - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - ug.SetProperty(pr) - ug.property = pr + Note: + use `s=(sx,sy,sz)` to scale differently in the three coordinates. + """ + if s is None: + return np.array(self.transform.T.GetScale()) - ug.mapper.SetLookupTable(utils.ctf2lut(self)) - ug.pipeline = utils.OperationNode( - "extract_cells_by_id", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return ug + if not utils.is_sequence(s): + s = [s, s, s] + LT = LinearTransform() + if reset: + old_s = np.array(self.transform.T.GetScale()) + LT.scale(s / old_s) + else: + if origin is True: + LT.scale(s, origin=self.transform.position) + elif origin is False: + LT.scale(s, origin=False) + else: + LT.scale(s, origin=origin) + return self.apply_transform(LT) ############################################################################### -class DataArrayHelper: - # Internal use only. - # Helper class to manage data associated to either - # points (or vertices) and cells (or faces). - def __init__(self, obj, association): - self.obj = obj - self.association = association +class VolumeAlgorithms(CommonAlgorithms): + """Methods for Volume objects.""" - def __getitem__(self, key): + def isosurface(self, value=None, flying_edges=True): + """ + Return an `Mesh` isosurface extracted from the `Volume` object. - if self.association == 0: - data = self.obj.dataset.GetPointData() + Set `value` as single float or list of values to draw the isosurface(s). + Use flying_edges for faster results (but sometimes can interfere with `smooth()`). - elif self.association == 1: - data = self.obj.dataset.GetCellData() + Examples: + - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) - elif self.association == 2: - data = self.obj.dataset.GetFieldData() + ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) + """ + scrange = self.dataset.GetScalarRange() - varr = data.GetAbstractArray(key) - if isinstance(varr, vtk.vtkStringArray): - if isinstance(key, int): - key = data.GetArrayName(key) - n = varr.GetNumberOfValues() - narr = [varr.GetValue(i) for i in range(n)] - return narr - ########### + if flying_edges: + cf = vtk.vtkFlyingEdges3D() + cf.InterpolateAttributesOn() + else: + cf = vtk.vtkContourFilter() + cf.UseScalarTreeOn() + + cf.SetInputData(self.datset) + cf.ComputeNormalsOn() + if utils.is_sequence(value): + cf.SetNumberOfContours(len(value)) + for i, t in enumerate(value): + cf.SetValue(i, t) else: - raise RuntimeError() + if value is None: + value = (2 * scrange[0] + scrange[1]) / 3.0 + # print("automatic isosurface value =", value) + cf.SetValue(0, value) - if isinstance(key, int): - key = data.GetArrayName(key) + cf.Update() + poly = cf.GetOutput() - arr = data.GetArray(key) - if not arr: - return None - return utils.vtk2numpy(arr) + out = vedo.mesh.Mesh(poly, c=None).phong() + out.mapper.SetScalarRange(scrange[0], scrange[1]) - def __setitem__(self, key, input_array): + out.pipeline = utils.OperationNode( + "isosurface", + parents=[self], + comment=f"#pts {out.GetNumberOfPoints()}", + c="#4cc9f0:#e9c46a", + ) + return out - if self.association == 0: - data = self.obj.dataset.GetPointData() - n = self.obj.dataset.GetNumberOfPoints() - self.obj.mapper.SetScalarModeToUsePointData() + def legosurface( + self, + vmin=None, + vmax=None, + invert=False, + boundary=False, + array_name="input_scalars", + ): + """ + Represent an object - typically a `Volume` - as lego blocks (voxels). + By default colors correspond to the volume's scalar. + Returns an `Mesh` object. - elif self.association == 1: - data = self.obj.dataset.GetCellData() - n = self.obj.dataset.GetNumberOfCells() - self.obj.mapper.SetScalarModeToUseCellData() + Arguments: + vmin : (float) + the lower threshold, voxels below this value are not shown. + vmax : (float) + the upper threshold, voxels above this value are not shown. + boundary : (bool) + controls whether to include cells that are partially inside + array_name : (int, str) + name or index of the scalar array to be considered - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - if not utils.is_sequence(input_array): - input_array = [input_array] + Examples: + - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) - if isinstance(input_array[0], str): - varr = vtk.vtkStringArray() - varr.SetName(key) - varr.SetNumberOfComponents(1) - varr.SetNumberOfTuples(len(input_array)) - for i, iarr in enumerate(input_array): - if isinstance(iarr, np.ndarray): - iarr = iarr.tolist() # better format - # Note: a string k can be converted to numpy with - # import json; k = np.array(json.loads(k)) - varr.InsertValue(i, str(iarr)) - else: - try: - varr = utils.numpy2vtk(input_array, name=key) - except TypeError as e: - vedo.logger.error( - f"cannot create metadata with input object:\n" - f"{input_array}" - f"\n\nAllowed content examples are:\n" - f"- flat list of strings ['a','b', 1, [1,2,3], ...]" - f" (first item must be a string in this case)\n" - f" hint: use k = np.array(json.loads(k)) to convert strings\n" - f"- numpy arrays of any shape" - ) - raise e + ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) + """ + dataset = vtk.vtkImplicitDataSet() + dataset.SetDataSet(self) + window = vtk.vtkImplicitWindowFunction() + window.SetImplicitFunction(dataset) - data.AddArray(varr) - return ############ + srng = list(self.dataset.GetScalarRange()) + if vmin is not None: + srng[0] = vmin + if vmax is not None: + srng[1] = vmax + tol = 0.00001 * (srng[1] - srng[0]) + srng[0] -= tol + srng[1] += tol + window.SetWindowRange(srng) - else: - raise RuntimeError() + extract = vtk.vtkExtractGeometry() + extract.SetInputData(self.datset) + extract.SetImplicitFunction(window) + extract.SetExtractInside(invert) + extract.SetExtractBoundaryCells(boundary) + extract.Update() - if len(input_array) != n: - vedo.logger.error( - f"Error in point/cell data: length of input {len(input_array)}" - f" != {n} nr. of elements" - ) - raise RuntimeError() + gf = vtk.vtkGeometryFilter() + gf.SetInputData(extract.GetOutput()) + gf.Update() - input_array = np.asarray(input_array) - varr = utils.numpy2vtk(input_array, name=key) - data.AddArray(varr) + m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() + m.map_points_to_cells() + m.celldata.select(array_name) - if len(input_array.shape) == 1: # scalars - data.SetActiveScalars(key) - elif len(input_array.shape) == 2 and input_array.shape[1] == 3: # vectors - if key.lower() == "normals": - data.SetActiveNormals(key) - else: - data.SetActiveVectors(key) + m.pipeline = utils.OperationNode( + "legosurface", + parents=[self], + comment=f"array: {array_name}", + c="#4cc9f0:#e9c46a", + ) + return m - def keys(self): - """Return the list of available data array names""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - elif self.association == 1: - data = self.obj.dataset.GetCellData() - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - arrnames = [] - for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() - if name: - arrnames.append(name) - return arrnames + def cut_with_plane(self, origin=(0, 0, 0), normal="x"): + """ + Cut the object with the plane defined by a point and a normal. - def remove(self, key): - """Remove a data array by name or number""" - if self.association == 0: - self.obj.dataset.GetPointData().RemoveArray(key) - elif self.association == 1: - self.obj.dataset.GetCellData().RemoveArray(key) - elif self.association == 2: - self.obj.dataset.GetFieldData().RemoveArray(key) + Arguments: + origin : (list) + the cutting plane goes through this point + normal : (list, str) + normal vector to the cutting plane + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") - def clear(self): - """Remove all data associated to this object""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - elif self.association == 1: - data = self.obj.dataset.GetCellData() - elif self.association == 2: - data = self.obj.dataset.GetFieldData() - for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() - data.RemoveArray(name) + strn = str(normal) + if strn == "x": normal = (1, 0, 0) + elif strn == "y": normal = (0, 1, 0) + elif strn == "z": normal = (0, 0, 1) + elif strn == "-x": normal = (-1, 0, 0) + elif strn == "-y": normal = (0, -1, 0) + elif strn == "-z": normal = (0, 0, -1) + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(self.datset) + clipper.SetClipFunction(plane) + clipper.GenerateClipScalarsOff() + clipper.GenerateClippedOutputOff() + clipper.SetValue(0) + clipper.Update() + cout = clipper.GetOutput() - def rename(self, oldname, newname): - """Rename an array""" - if self.association == 0: - varr = self.obj.dataset.GetPointData().GetArray(oldname) - elif self.association == 1: - varr = self.obj.dataset.GetCellData().GetArray(oldname) - elif self.association == 2: - varr = self.obj.dataset.GetFieldData().GetArray(oldname) - if varr: - varr.SetName(newname) - else: - vedo.logger.warning(f"Cannot rename non existing array {oldname} to {newname}") + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return ug - def select(self, key): - """Select one specific array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self - if isinstance(key, int): - key = data.GetArrayName(key) + def cut_with_box(self, box): + """ + Cut the grid with the specified bounding box. - arr = data.GetArray(key) - if not arr: - return + Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. + If an object is passed, its bounding box are used. - nc = arr.GetNumberOfComponents() - if nc == 1: - data.SetActiveScalars(key) - elif nc >= 2: - if "rgb" in key.lower(): - data.SetActiveScalars(key) - # try: - # self.mapper.SetColorModeToDirectScalars() - # except AttributeError: - # pass - else: - data.SetActiveVectors(key) - elif nc >= 4: - data.SetActiveTensors(key) + Example: + ```python + from vedo import * + tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') + tetmesh.color('rainbow') + cu = Cube(side=500).x(500) # any Mesh works + tetmesh.cut_with_box(cu).show(axes=1) + ``` + ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - # .. could be a volume mapper - except AttributeError: - pass + bc = vtk.vtkBoxClipDataSet() + bc.SetInputData(self.datset) + if isinstance(box, vtk.vtkProp): + boxb = box.GetBounds() + else: + boxb = box + bc.SetBoxClip(*boxb) + bc.Update() + cout = bc.GetOutput() + + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return ug - def select_scalars(self, key): - """Select one specific scalar array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return self - if isinstance(key, int): - key = data.GetArrayName(key) + def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): + """ + Cut a UGrid or TetMesh with a Mesh. - data.SetActiveScalars(key) + Use `invert` to return cut off part of the input object. + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - except AttributeError: - pass + ug = self - def select_vectors(self, key): - """Select one specific vector array by its name to make it the `active` one.""" - if self.association == 0: - data = self.obj.dataset.GetPointData() - self.obj.mapper.SetScalarModeToUsePointData() + ippd = vtk.vtkImplicitPolyDataDistance() + ippd.SetInput(mesh) + + if whole_cells or only_boundary: + clipper = vtk.vtkExtractGeometry() + clipper.SetInputData(ug) + clipper.SetImplicitFunction(ippd) + clipper.SetExtractInside(not invert) + clipper.SetExtractBoundaryCells(False) + if only_boundary: + clipper.SetExtractBoundaryCells(True) + clipper.SetExtractOnlyBoundaryCells(True) else: - data = self.obj.dataset.GetCellData() - self.obj.mapper.SetScalarModeToUseCellData() + signedDistances = vtk.vtkFloatArray() + signedDistances.SetNumberOfComponents(1) + signedDistances.SetName("SignedDistances") + for pointId in range(ug.GetNumberOfPoints()): + p = ug.GetPoint(pointId) + signedDistance = ippd.EvaluateFunction(p) + signedDistances.InsertNextValue(signedDistance) + ug.GetPointData().AddArray(signedDistances) + ug.GetPointData().SetActiveScalars("SignedDistances") + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(ug) + clipper.SetInsideOut(not invert) + clipper.SetValue(0.0) - if isinstance(key, int): - key = data.GetArrayName(key) + clipper.Update() + cout = clipper.GetOutput() - data.SetActiveVectors(key) + # if ug.GetCellData().GetScalars(): # not working + # scalname = ug.GetCellData().GetScalars().GetName() + # if scalname: # not working + # if self.useCells: + # self.celldata.select(scalname) + # else: + # self.pointdata.select(scalname) + # self._update(cout) + # self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") + # return self - try: - self.obj.mapper.SetArrayName(key) - self.obj.mapper.ScalarVisibilityOn() - except AttributeError: - pass + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return ug - def print(self, **kwargs): - """Print the array names available to terminal""" - colors.printc(self.keys(), **kwargs) + else: + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return self - def __repr__(self) -> str: - """Representation""" + def extract_cells_on_plane(self, origin, normal): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() - def _get_str(pd, header): - if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7m{header}" - if self.obj.name: - out += f" in {self.obj.name}" - out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" - for i in range(pd.GetNumberOfArrays()): - varr = pd.GetArray(i) - out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" - out += "\nindex".ljust(15) + f": {i}" - t = varr.GetDataType() - if t in vedo.utils.array_types: - out += f"\ntype".ljust(15) - out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" - shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) - out += "\nshape".ljust(15) + f": {shape}" - out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" - out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" - out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" - out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" - else: - out += " has no associated data." - return out + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + bf.SetImplicitFunction(plane) + bf.Update() - if self.association == 0: - out = _get_str(self.dataset.GetPointData(), "Point Data") - elif self.association == 1: - out = _get_str(self.dataset.GetCellData(), "Cell Data") - elif self.association == 2: - pd = self.dataset.GetFieldData() - if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" - if self.actor.name: - out += f" in {self.actor.name}" - out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" - for i in range(pd.GetNumberOfArrays()): - varr = pd.GetAbstractArray(i) - out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" - out += "\nindex".ljust(15) + f": {i}" - shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) - out += "\nshape".ljust(15) + f": {shape}" + self._update(bf.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode( + "extract_cells_on_plane", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self - return out + def extract_cells_on_sphere(self, center, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + sph = vtk.vtkSphere() + sph.SetRadius(radius) + sph.SetCenter(center) + bf.SetImplicitFunction(sph) + bf.Update() + self._update(bf.GetOutput()) + self.pipeline = utils.OperationNode( + "extract_cells_on_sphere", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + def extract_cells_on_cylinder(self, center, axis, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf.SetInputData(self.datset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + cyl = vtk.vtkCylinder() + cyl.SetRadius(radius) + cyl.SetCenter(center) + cyl.SetAxis(axis) + bf.SetImplicitFunction(cyl) + bf.Update() + + self.pipeline = utils.OperationNode( + "extract_cells_on_cylinder", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + self._update(bf.GetOutput()) + return self + + def clean(self): + """ + Cleanup unused points and empty cells + """ + cl = vtk.vtkStaticCleanUnstructuredGrid() + cl.SetInputData(self.datset) + cl.RemoveUnusedPointsOn() + cl.ProduceMergeMapOff() + cl.AveragePointDataOff() + cl.Update() + + self._update(cl.GetOutput()) + self.pipeline = utils.OperationNode( + "clean", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def find_cell(self, p): + """Locate the cell that contains a point and return the cell ID.""" + cell = vtk.vtkTetra() + cellId = vtk.mutable(0) + tol2 = vtk.mutable(0) + subId = vtk.mutable(0) + pcoords = [0, 0, 0] + weights = [0, 0, 0] + cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) + return cid + + def extract_cells_by_id(self, idlist, use_point_ids=False): + """Return a new UGrid composed of the specified subset of indices.""" + selectionNode = vtk.vtkSelectionNode() + if use_point_ids: + selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) + contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() + selectionNode.GetProperties().Set(contcells, 1) + else: + selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) + selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) + vidlist = utils.numpy2vtk(idlist, dtype="id") + selectionNode.SetSelectionList(vidlist) + selection = vtk.vtkSelection() + selection.AddNode(selectionNode) + es = vtk.vtkExtractSelection() + es.SetInputData(0, self) + es.SetInputData(1, selection) + es.Update() + + ug = vedo.ugrid.UGrid(es.GetOutput()) + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + ug.SetProperty(pr) + ug.property = pr + + ug.mapper.SetLookupTable(utils.ctf2lut(self)) + ug.pipeline = utils.OperationNode( + "extract_cells_by_id", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return ug diff --git a/vedo/mesh.py b/vedo/mesh.py index 1c1da934..07a7665c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -13,7 +13,7 @@ from vedo.pointcloud import Points from vedo.utils import buildPolyData, is_sequence, mag, mag2, precision from vedo.utils import numpy2vtk, vtk2numpy, OperationNode -from vedo.visuals import MeshVisual +from vedo.visual import MeshVisual __docformat__ = "google" @@ -32,7 +32,7 @@ class Mesh(MeshVisual, Points): Build an instance of object `Mesh` derived from `vedo.PointCloud`. """ - def __init__(self, inputobj=None, c='gold', alpha=1): + def __init__(self, inputobj=None, c="gold", alpha=1): """ Input can be a list of vertices and their connectivity (faces of the polygonal mesh), or directly a `vtkPolydata` object. @@ -68,13 +68,14 @@ def __init__(self, inputobj=None, c='gold', alpha=1): self.property = pr elif isinstance(inputobj, vtk.vtkPolyData): - if inputobj.GetNumberOfCells() == 0: + # self.dataset.DeepCopy(inputobj) # NO + self.dataset = inputobj + if self.dataset.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) - inputobj.SetVerts(carr) - self.dataset.DeepCopy(inputobj) + self.dataset.SetVerts(carr) elif is_sequence(inputobj): ninp = len(inputobj) @@ -555,7 +556,7 @@ def texture( "scale": scale, "ushift": ushift, "vshift": vshift, - "seam_threshold": seam_threshold + "seam_threshold": seam_threshold, } return self @@ -686,7 +687,10 @@ def non_manifold_faces(self, remove=True, tol="auto"): # mark original point and cell ids self.add_ids() toremove = self.boundaries( - boundary_edges=False, non_manifold_edges=True, cell_edge=True, return_cell_ids=True + boundary_edges=False, + non_manifold_edges=True, + cell_edge=True, + return_cell_ids=True, ) if len(toremove) == 0: return self @@ -751,7 +755,9 @@ def non_manifold_faces(self, remove=True, tol="auto"): self.delete_cells(toremove) self.pipeline = OperationNode( - "non_manifold_faces", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" + "non_manifold_faces", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", ) return self @@ -817,7 +823,6 @@ def stretch(self, q1, q2): self.apply_transform(T) return self - def cap(self, return_cap=False): """ Generate a "cap" on a clipped mesh, or caps sharp edges. @@ -858,8 +863,7 @@ def cap(self, return_cap=False): if return_cap: m = Mesh(tf.GetOutput()) m.pipeline = OperationNode( - "cap", parents=[self], - comment=f"#pts {m.dataset.GetNumberOfPoints()}" + "cap", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) return m @@ -1291,7 +1295,9 @@ def subdivide(self, n=1, method=0, mel=None): self._update(sdf.GetOutput()) self.pipeline = OperationNode( - "subdivide", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "subdivide", + parents=[self], + comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self @@ -1339,8 +1345,9 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): self._update(decimate.GetOutput()) self.pipeline = OperationNode( - "decimate", parents=[self], - comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "decimate", + parents=[self], + comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self @@ -1356,7 +1363,9 @@ def delete_cells(self, ids): self.Modified() self.mapper.Modified() self.pipeline = OperationNode( - "delete_cells", parents=[self], comment=f"#cells {self.dataset.GetNumberOfCells()}" + "delete_cells", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", ) return self @@ -1390,7 +1399,9 @@ def collapse_edges(self, distance, iterations=1): self.compute_normals() self.pipeline = OperationNode( - "collapse_edges", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "collapse_edges", + parents=[self], + comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self @@ -1438,7 +1449,6 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ) return self - def fill_holes(self, size=None): """ Identifies and fills holes in input mesh. @@ -1463,7 +1473,9 @@ def fill_holes(self, size=None): self._update(fh.GetOutput()) self.pipeline = OperationNode( - "fill_holes", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "fill_holes", + parents=[self], + comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self @@ -1530,8 +1542,9 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): pcl.name = "InsidePoints" pcl.pipeline = OperationNode( - "inside_points", parents=[self, ptsa], - comment=f"#pts {pcl.dataset.GetNumberOfPoints()}" + "inside_points", + parents=[self, ptsa], + comment=f"#pts {pcl.dataset.GetNumberOfPoints()}", ) return pcl @@ -1669,7 +1682,9 @@ def imprint(self, loopline, tol=0.01): self._update(imp.GetOutput()) self.pipeline = OperationNode( - "imprint", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "imprint", + parents=[self], + comment=f"#pts {self.dataset.GetNumberOfPoints()}", ) return self @@ -1955,12 +1970,13 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): m.compute_normals(cells=False).flat().lighting("default") m.pipeline = OperationNode( - "extrude", parents=[self], - comment=f"#pts {m.dataset.GetNumberOfPoints()}" + "extrude", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) return m - def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=True): + def split( + self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=True + ): """ Split a mesh by connectivity and order the pieces by increasing area. @@ -2040,7 +2056,6 @@ def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=T ) return blist - def extract_largest_region(self): """ Extract the largest connected part of a mesh and discard all the smaller pieces. @@ -2062,8 +2077,9 @@ def extract_largest_region(self): m.mapper.SetScalarVisibility(vis) m.pipeline = OperationNode( - "extract_largest_region", parents=[self], - comment=f"#pts {m.dataset.GetNumberOfPoints()}" + "extract_largest_region", + parents=[self], + comment=f"#pts {m.dataset.GetNumberOfPoints()}", ) return m @@ -2218,8 +2234,9 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): msh.name = "PlaneIntersection" msh.pipeline = OperationNode( - "intersect_with_plan", parents=[self], - comment=f"#pts {msh.dataset.GetNumberOfPoints()}" + "intersect_with_plan", + parents=[self], + comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh @@ -2296,8 +2313,9 @@ def collide_with(self, mesh2, tol=0, return_bool=False): msh.name = "SurfaceCollision" msh.pipeline = OperationNode( - "collide_with", parents=[self, mesh2], - comment=f"#pts {msh.dataset.GetNumberOfPoints()}" + "collide_with", + parents=[self, mesh2], + comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) return msh @@ -2361,8 +2379,9 @@ def geodesic(self, start, end): dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( - "GeodesicLine", parents=[self], - comment=f"#pts {dmesh.dataset.GetNumberOfPoints()}" + "GeodesicLine", + parents=[self], + comment=f"#pts {dmesh.dataset.GetNumberOfPoints()}", ) return dmesh @@ -2507,7 +2526,14 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu return vol def tetralize( - self, side=0.02, nmax=300_000, gap=None, subsample=False, uniform=True, seed=0, debug=False + self, + side=0.02, + nmax=300_000, + gap=None, + subsample=False, + uniform=True, + seed=0, + debug=False, ): """ Tetralize a closed polygonal mesh. Return a `TetMesh`. @@ -2611,6 +2637,9 @@ def tetralize( print(f".. tetralize() completed, ntets = {tmesh.ncells}") tmesh.pipeline = OperationNode( - "tetralize", parents=[self], comment=f"#tets = {tmesh.ncells}", c="#e9c46a:#9e2a2b" + "tetralize", + parents=[self], + comment=f"#tets = {tmesh.ncells}", + c="#e9c46a:#9e2a2b", ) return tmesh diff --git a/vedo/picture.py b/vedo/picture.py index da7aa067..1b54ea55 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -42,7 +42,7 @@ def _get_img(obj, flip=False, translate=()): picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand picture format", obj, c="r") - return + return vtk.vtkImage() picr.SetFileName(obj) picr.Update() img = picr.GetOutput() @@ -140,7 +140,7 @@ def _set_justification(img, pos): ################################################# -class Picture2D(vedo.visuals.BaseActor2D): +class Picture2D(vedo.visual.BaseActor2D): """ Embed an image as a static 2D image in the canvas. """ @@ -194,9 +194,9 @@ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify="") # self.array = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) # self.array = self.array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) width, height = fig.get_size_inches() * fig.get_dpi() - self.array = np.frombuffer(fig.canvas.buffer_rgba(), dtype=np.uint8).reshape( - (int(height), int(width), 4) - ) + self.array = np.frombuffer( + fig.canvas.buffer_rgba(), dtype=np.uint8 + ).reshape((int(height), int(width), 4)) self.array = self.array[:, :, :3] self.dataset = _get_img(self.array) @@ -240,7 +240,7 @@ def shape(self): ################################################# -class Picture(vedo.visuals.PictureVisual, vedo.visuals.ActorTransforms): +class Picture(vedo.visual.PictureVisual, vedo.visual.ActorTransforms): """ Class used to represent 2D pictures in a 3D world. """ @@ -261,7 +261,8 @@ def __init__(self, obj=None, channels=3, flip=False): flip xy axis convention (when input is a numpy array) """ self.name = "Picture" - self.filename = '' + self.filename = "" + self.pipeline = None self.actor = vtk.vtkImageActor() self.property = self.actor.GetProperty() @@ -353,7 +354,7 @@ def _repr_html_(self): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" - img = self.GetMapper().GetInput() + img = self.dataset allt = [ "", @@ -388,7 +389,7 @@ def _update(self, data): self.mapper.SetInputData(data) self.mapper.Modified() return self - + def dimensions(self): """Return the picture dimension as number of pixels in x and y""" nx, ny, _ = self.dataset.GetDimensions() @@ -450,7 +451,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): extractVOI.SetInputData(self.dataset) extractVOI.IncludeBoundaryOn() - d = self.GetInput().GetDimensions() + d = self.dataset.GetDimensions() if pixels: extractVOI.SetVOI(left, d[0] - right - 1, bottom, d[1] - top - 1, 0, 0) else: @@ -462,7 +463,6 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): extractVOI.SetVOI(bx0, bx1, by0, by1, 0, 0) extractVOI.Update() - # shape = extractVOI.GetOutput().GetDimensions()[:2] self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" @@ -636,7 +636,6 @@ def flip(self, axis="y"): """Mirror picture along x or y axis. Same as `mirror()`.""" return self.mirror(axis=axis) - def select(self, component): """Select one single component of the rgb image.""" ec = vtk.vtkImageExtractComponents() @@ -999,7 +998,6 @@ def warp( c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) reslice.Update() - self.transform = transform self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode("warp", parents=parents, c="#f28482") return self @@ -1187,7 +1185,6 @@ def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): "rotate", comment=f"angle={angle}", parents=[self], c="#f28482" ) return self - def tomesh(self): """ @@ -1448,6 +1445,10 @@ def write(self, filename): """Write picture to file as png or jpg.""" vedo.file_io.write(self.dataset, filename) self.pipeline = utils.OperationNode( - "write", comment=filename[:15], parents=[self], c="#8a817c", shape="cylinder" + "write", + comment=filename[:15], + parents=[self], + c="#8a817c", + shape="cylinder", ) return self diff --git a/vedo/plotter.py b/vedo/plotter.py index febdd7e2..c5504fd3 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -34,6 +34,7 @@ class Event: """ This class holds the info from an event in the window, works as dictionary too """ + __slots__ = [ "name", "title", @@ -81,7 +82,7 @@ def __repr__(self): f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" except AttributeError: pass - + return f def keys(self): @@ -317,6 +318,7 @@ def close(): ######################################################################## class Plotter: """Main class to manage actors.""" + def __init__( self, shape=(1, 1), @@ -800,7 +802,6 @@ def at(self, nren, yren=None): self.camera = self.renderer.GetActiveCamera() return self - def add(self, *objs, at=None): """ Append the input objects to the internal list of actors to be shown. @@ -815,7 +816,7 @@ def add(self, *objs, at=None): ren = self.renderer objs = utils.flatten(objs) - for ob in objs: + for ob in objs: if ob and ob not in self.objects: self.objects.append(ob) @@ -861,7 +862,7 @@ def remove(self, *objs, at=None): if isinstance(ob, str): has_str = True break - + has_actor = False for ob in objs: if hasattr(ob, "actor") and ob.actor: @@ -870,15 +871,14 @@ def remove(self, *objs, at=None): if has_str or has_actor: # need to get the actors - acts = self.get_meshes(include_non_pickables=True, - unpack_assemblies=False) + acts = self.get_meshes(include_non_pickables=True, unpack_assemblies=False) for a in acts: try: if a.name and a.name in objs: objs.append(a) except AttributeError: - pass - + pass + ir = self.renderers.index(ren) ids = [] @@ -890,19 +890,19 @@ def remove(self, *objs, at=None): ids.append(idx) except ValueError: pass - + if ren: ### remove it from the renderer try: ren.RemoveActor(ob) except TypeError: - try: + try: ren.RemoveActor(ob.actor) except AttributeError: pass if hasattr(ob, "rendered_at"): ob.rendered_at.discard(ir) - + if hasattr(ob, "scalarbar") and ob.scalarbar: ren.RemoveActor(ob.scalarbar) if hasattr(ob, "_caption") and ob._caption: @@ -916,7 +916,7 @@ def remove(self, *objs, at=None): if hasattr(ob.trail, "shadows") and ob.trail.shadows: for sha in ob.trail.shadows: ren.RemoveActor(sha.actor) - + # for i in ids: # wrong way of doing it # del self.objects[i] # instead: @@ -1031,7 +1031,7 @@ def background(self, c1=None, c2=None, at=None, mode=0): r.GradientBackgroundOn() r.SetBackground2(vedo.get_color(c2)) if mode: - try: # only works with vtk>=9.3 + try: # only works with vtk>=9.3 modes = [ vtk.vtkViewport.GradientModes.VTK_GRADIENT_VERTICAL, vtk.vtkViewport.GradientModes.VTK_GRADIENT_HORIZONTAL, @@ -1120,7 +1120,7 @@ def get_volumes(self, at=None, include_non_pickables=False): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): try: - vols.append(a.data) + vols.append(a.data) except AttributeError: pass return vols @@ -1409,29 +1409,28 @@ def zoom(self, zoom): """Apply a zooming factor for the current camera view""" self.renderer.GetActiveCamera().Zoom(zoom) return self - + def azimuth(self, angle): """Rotate camera around the view up vector.""" self.renderer.GetActiveCamera().Azimuth(angle) return self - + def elevation(self, angle): """Rotate the camera around the cross product of the negative of the direction of projection and the view up vector.""" self.renderer.GetActiveCamera().Elevation(angle) return self - + def roll(self, angle): """Roll the camera about the direction of projection.""" self.renderer.GetActiveCamera().Roll(angle) return self - + def dolly(self, value): """Move the camera towards (value>0) or away from (value<0) the focal point.""" self.renderer.GetActiveCamera().Dolly(value) return self - ################################################################## def add_slider( self, @@ -1529,7 +1528,6 @@ def add_slider( self.sliders.append([slider2d, sliderfunc]) return slider2d - def add_slider3d( self, sliderfunc, @@ -1587,7 +1585,18 @@ def add_slider3d( c = vedo.get_color(c) slider3d = addons.Slider3D( - sliderfunc, pos1, pos2, xmin, xmax, value, s, t, title, rotation, c, show_value + sliderfunc, + pos1, + pos2, + xmin, + xmax, + value, + s, + t, + title, + rotation, + c, + show_value, ) slider3d.renderer = self.renderer slider3d.interactor = self.interactor @@ -1595,7 +1604,6 @@ def add_slider3d( self.sliders.append([slider3d, sliderfunc]) return slider3d - def add_button( self, fnc=None, @@ -1652,7 +1660,15 @@ def add_button( return bu def add_spline_tool( - self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, interactive=False + self, + points, + pc="k", + ps=8, + lc="r4", + ac="g5", + lw=2, + closed=False, + interactive=False, ): """ Add a spline tool to the current plotter. @@ -1724,7 +1740,6 @@ def add_icon(self, icon, pos=3, size=0.08): self.widgets.append(iconw) return iconw - def add_global_axes(self, axtype=None, c=None): """Draw axes on scene. Available axes types: @@ -1871,7 +1886,6 @@ def add_hint( return self - def add_shadows(self): """Add shadows at the current renderer.""" shadows = vtk.vtkShadowMapPass() @@ -2175,10 +2189,17 @@ def _legfunc(evt): self.add_callback("MouseMove", _legfunc) return self - ##################################################################### def add_scale_indicator( - self, pos=(0.7, 0.05), s=0.02, length=2, lw=4, c="k1", alpha=1, units="", gap=0.05 + self, + pos=(0.7, 0.05), + s=0.02, + length=2, + lw=4, + c="k1", + alpha=1, + units="", + gap=0.05, ): """ Add a Scale Indicator. Only works in parallel mode (no perspective). @@ -2274,11 +2295,11 @@ def fill_event(self, ename="", pos=(), enable_picking=True): If `enable_picking` is False, no picking will be performed. This can be useful to avoid double picking when using buttons. - """ + """ if not self.interactor: return Event() - if len(pos): + if len(pos) > 0: x, y = pos self.interactor.SetEventPosition(pos) else: @@ -2364,7 +2385,6 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.isActor2D = isinstance(event.object, vtk.vtkActor2D) return event - def add_callback(self, event_name, func, priority=0.0, enable_picking=True): """ Add a function to be executed while show() is active. @@ -2452,7 +2472,7 @@ def _func_wrap(iren, ename, timerid=None): event.priority = priority self.last_event = event func(event) - return ## _func_wrap + ######################################### event_name = utils.get_vtk_name_event(event_name) @@ -2533,7 +2553,14 @@ def add_observer(self, event_name, func, priority=0): return idd def compute_world_coordinate( - self, pos2d, at=None, objs=(), bounds=(), offset=None, pixeltol=None, worldtol=None + self, + pos2d, + at=None, + objs=(), + bounds=(), + offset=None, + pixeltol=None, + worldtol=None, ): """ Transform a 2D point on the screen into a 3D point inside the rendering scene. @@ -2618,7 +2645,7 @@ def compute_screen_coordinates(self, obj, full_window=False): obj = obj.vertices except AttributeError: pass - + if utils.is_sequence(obj): pts = obj p2d = [] @@ -2632,7 +2659,7 @@ def compute_screen_coordinates(self, obj, full_window=False): else: p2d.append(cs.GetComputedViewportValue(self.renderer)) return np.array(p2d, dtype=int) - + def pick_area(self, pos1, pos2, at=None): """ Pick all objects within a box defined by two corner points in 2D screen coordinates. @@ -2684,43 +2711,45 @@ def mode_select(objs): afru.name = "Frustum" return afru - def _scan_input_return_acts(self, wannabe_acts): # scan the input and return a list of actors if not utils.is_sequence(wannabe_acts): wannabe_acts = [wannabe_acts] - + ################# wannabe_acts2 = [] for a in wannabe_acts: - try: + try: wannabe_acts2.append(a.actor) - except AttributeError: - wannabe_acts2.append(a) # already actor + except AttributeError: + wannabe_acts2.append(a) # already actor - try: - wannabe_acts2.append(a.scalarbar) - except AttributeError: pass + try: + wannabe_acts2.append(a.scalarbar) + except AttributeError: + pass - try: + try: for sh in a.shadows: wannabe_acts2.append(sh.actor) - except AttributeError: pass + except AttributeError: + pass try: wannabe_acts2.append(a.trail.actor) - if a.trail.shadows: # trails may also have shadows + if a.trail.shadows: # trails may also have shadows for sh in a.trail.shadows: wannabe_acts2.append(sh.actor) - except AttributeError: pass + except AttributeError: + pass ################# scanned_acts = [] for a in wannabe_acts2: # scan content of list if a is None: - continue + pass elif isinstance(a, (vtk.vtkActor, vtk.vtkActor2D)): scanned_acts.append(a) @@ -2769,10 +2798,11 @@ def _scan_input_return_acts(self, wannabe_acts): elif isinstance(a, ( vtk.vtkAssembly, vtk.vtkVolume, # order matters! dont move above TetMesh - vtk.vtkImageActor, + vtk.vtkImageActor, vtk.vtkLegendBoxActor, vtk.vtkBillboardTextActor3D, - )): + ), + ): scanned_acts.append(a) elif isinstance(a, vtk.vtkLight): @@ -2805,6 +2835,7 @@ def _scan_input_return_acts(self, wannabe_acts): elif "dolfin" in str(type(a)): # assume a dolfin.Mesh object import vedo.dolfin as dlf + scanned_acts.append(dlf.MeshActor(a).actor) else: @@ -2812,7 +2843,6 @@ def _scan_input_return_acts(self, wannabe_acts): return scanned_acts - def show( self, *actors, @@ -3011,7 +3041,6 @@ def show( if self.qt_widget is not None: self.qt_widget.GetRenderWindow().AddRenderer(self.renderer) - if self.axes is not None: if viewup != "2d" or self.axes in [1, 8] or isinstance(self.axes, dict): bns = self.renderer.ComputeVisiblePropBounds() @@ -3108,7 +3137,7 @@ def show( if self._interactive: self.interactor.Start() - + if rate: if self.clock is None: # set clock and limit rate self._clockt0 = time.time() @@ -3123,7 +3152,6 @@ def show( return self - def add_inset(self, *actors, **options): """Add a draggable inset space into a renderer. @@ -3200,7 +3228,12 @@ def clear(self, at=None, deep=False): if deep: renderer.RemoveAllViewProps() else: - for ob in set(self.get_meshes() + self.get_volumes() + self.objects + self.axes_instances): + for ob in set( + self.get_meshes() + + self.get_volumes() + + self.objects + + self.axes_instances + ): if isinstance(ob, vedo.shapes.Text2D): continue self.remove(ob) @@ -3409,7 +3442,10 @@ def color_picker(self, xy, verbose=False): vedo.printc(" -> " + cnm, invert=1, c="w") else: vedo.printc( - rgb.tolist(), vedo.colors.rgb2hex(np.array(rgb) / 255), c=rgb, end="" + rgb.tolist(), + vedo.colors.rgb2hex(np.array(rgb) / 255), + c=rgb, + end="", ) vedo.printc(" -> " + cnm, c=cnm) @@ -3471,7 +3507,6 @@ def _mouseleftclick(self, iren, event): cn = histo.centers[idx] vedo.colors.printc(f"{histo.name}, bin={idx}, center={cn}, value={f}") - ####################################################################### def _keypress(self, iren, event): # NB: qt creates and passes a vtkGenericRenderWindowInteractor @@ -3756,9 +3791,9 @@ def _keypress(self, iren, event): self.clicked_object.wireframe(False) else: for a in self.get_meshes(): - a.wireframe() + a.wireframe() except AttributeError: - pass # Points dont have wireframe + pass # Points dont have wireframe elif key == "w": if self.clicked_object and self.clicked_object in self.get_meshes(): @@ -3944,7 +3979,6 @@ def _keypress(self, iren, event): "Right": 6, "Home": 7, "Up": 8, - "Prior": 9, } clickedr = self.renderers.index(renderer) if key in asso: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index d85500fa..46597333 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -13,7 +13,7 @@ from vedo import utils from vedo.transformations import LinearTransform from vedo.core import PointAlgorithms -from vedo.visuals import PointsVisual +from vedo.visual import PointsVisual __docformat__ = "google" @@ -87,9 +87,7 @@ def merge(*meshs, flag=False): msh.copy_properties_from(objs[0]) msh.pipeline = utils.OperationNode( - "merge", - parents=objs, - comment=f"#pts {msh.dataset.GetNumberOfPoints()}", + "merge", parents=objs, comment=f"#pts {msh.dataset.GetNumberOfPoints()}" ) return msh @@ -352,13 +350,13 @@ def pca_ellipse(points, pvalue=0.673, res=60): vedo.logger.warning("in pca_ellipse(), there are not enough points!") return None - P = np.array(coords, dtype=float)[:,(0,1)] - cov = np.cov(P, rowvar=0) # covariance matrix + P = np.array(coords, dtype=float)[:, (0, 1)] + cov = np.cov(P, rowvar=0) # covariance matrix _, s, R = np.linalg.svd(cov) # singular value decomposition p, n = s.size, P.shape[0] - fppf = f.ppf(pvalue, p, n-p) # f % point function - ua, ub = np.sqrt(s*fppf/2)*2 # semi-axes (largest first) - center = np.mean(P, axis=0) # centroid of the ellipse + fppf = f.ppf(pvalue, p, n - p) # f % point function + ua, ub = np.sqrt(s * fppf / 2) * 2 # semi-axes (largest first) + center = np.mean(P, axis=0) # centroid of the ellipse matri = vtk.vtkMatrix4x4() matri.DeepCopy(( @@ -437,8 +435,7 @@ def pca_ellipsoid(points, pvalue=0.673): vtra = vtk.vtkTransform() vtra.SetMatrix(M) - elli = vedo.shapes.Ellipsoid( - (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) + elli = vedo.shapes.Ellipsoid((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) elli.property.LightingOff() elli.apply_transform(vtra) @@ -470,7 +467,7 @@ def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): pos = pos.pos() except AttributeError: pass - pt = Points([[0,0,0]], r, c, alpha) + pt = Points([[0, 0, 0]], r, c, alpha) pt.pos(pos) pt.name = "Point" return pt @@ -542,13 +539,13 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.property = self.actor.GetProperty() - self.property_backface = self.actor.GetBackfaceProperty() - self.mapper = vtk.vtkPolyDataMapper() + self.property_backface = self.actor.GetBackfaceProperty() + self.mapper = vtk.vtkPolyDataMapper() self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() - self.actor.data = self # so Actor can access this object + self.actor.data = self # so Actor can access this object - self._scals_idx = 0 # index of the active scalar changed from CLI + self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI self._cmap_name = "" # remember the cmap name for self._keypress self._caption = None @@ -557,7 +554,7 @@ def fibonacci_sphere(n): return ######################################## - self.name = "Points" # better not to give it a name here? + self.name = "Points" # better not to give it a name here? ###### if isinstance(inputobj, vtk.vtkActor): @@ -569,17 +566,17 @@ def fibonacci_sphere(n): self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtk.vtkPolyData): - self.dataset.DeepCopy(inputobj) + self.dataset = inputobj if self.dataset.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(self.dataset.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) self.dataset.SetVerts(carr) - + elif utils.is_sequence(inputobj): # passing point coords self.dataset = utils.buildPolyData(utils.make3d(inputobj)) - + elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj @@ -704,8 +701,7 @@ def _repr_html_(self): ] return "\n".join(allt) - - ################################################################################## + ################################################################################## def __add__(self, meshs): if isinstance(meshs, list): alist = [self] @@ -721,7 +717,6 @@ def __add__(self, meshs): return vedo.assembly.Assembly([self, meshs]) - def polydata(self, **kwargs): """Obsolete. You can remove it anywhere from your code. @@ -735,18 +730,24 @@ def clone(self, deep=True): Arguments: deep : (bool) - if False only build a shallow copy of the object (faster copy). + if False return a shallow copy of the mesh without copying the points array. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ + poly = vtk.vtkPolyData() + if deep: + poly.DeepCopy(self.dataset) + else: + poly.ShallowCopy(self.dataset) + if isinstance(self, vedo.Mesh): - cloned = vedo.Mesh(self.dataset) + cloned = vedo.Mesh(poly) else: - cloned = Points(self.dataset) - + cloned = Points(poly) + cloned.transform = self.transform.clone() cloned.copy_properties_from(self) @@ -757,11 +758,6 @@ def clone(self, deep=True): cloned.filename = str(self.filename) cloned.info = dict(self.info) - # dont share the same locators with original obj - cloned.point_locator = None - cloned.cell_locator = None - cloned.line_locator = None - cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") return cloned @@ -1047,8 +1043,7 @@ def clean(self): cpd.Update() self.dataset.DeepCopy(cpd.GetOutput()) self.pipeline = utils.OperationNode( - "clean", parents=[self], - comment=f"#pts {self.dataset.GetNumberOfPoints()}" + "clean", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) return self @@ -1129,9 +1124,9 @@ def threshold(self, scalars, above=None, below=None, on="points"): thres.SetInputArrayToProcess(0, 0, 0, asso, scalars) if above is None and below is not None: - try: # vtk 9.2 + try: # vtk 9.2 thres.ThresholdByLower(below) - except AttributeError: # vtk 9.3 + except AttributeError: # vtk 9.3 thres.SetUpperThreshold(below) elif below is None and above is not None: @@ -1303,7 +1298,12 @@ def align_to_bounding_box(self, msh, rigid=False): return self def transform_with_landmarks( - self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False + self, + source_landmarks, + target_landmarks, + rigid=False, + affine=False, + least_squares=False, ): """ Transform mesh orientation and position based on a set of landmarks points. @@ -1416,7 +1416,7 @@ def mirror(self, axis="x", origin=True): if "z" in axis.lower(): sz = -1 self.scale([sx, sy, sz], origin=origin) - + self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) if sx * sy * sz < 0: @@ -1538,7 +1538,6 @@ def interpolate_data_from( self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self - def add_gaussian_noise(self, sigma=1.0): """ Add gaussian noise to point positions. @@ -1570,8 +1569,9 @@ def add_gaussian_noise(self, sigma=1.0): ) return self - - def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell_id=False): + def closest_point( + self, pt, n=1, radius=None, return_point_id=False, return_cell_id=False + ): """ Find the closest point(s) on a mesh given from the input point `pt`. @@ -1665,7 +1665,6 @@ def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell return np.array(trgp) - def hausdorff_distance(self, points): """ Compute the Hausdorff distance to the input point set. @@ -1729,7 +1728,6 @@ def chamfer_distance(self, pcloud): db = np.mean(np.linalg.norm(deltav, axis=1)) return (da + db) / 2 - def remove_outliers(self, radius, neighbors=5): """ Remove outliers from a cloud of points within the specified `radius` search. @@ -2438,7 +2436,7 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) - clipper.Update() + clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_sphere", parents=[self]) return self @@ -2507,7 +2505,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): if currentscals: cpoly.GetPointData().SetActiveScalars(currentscals) vis = self.mapper.GetScalarVisibility() - + self._update(cpoly) self.pointdata.remove("SignedDistances") @@ -2526,7 +2524,9 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh]) return self - def cut_with_point_loop(self, points, invert=False, on="points", include_boundary=False): + def cut_with_point_loop( + self, points, invert=False, on="points", include_boundary=False + ): """ Cut an `Mesh` object with a set of points forming a closed loop. @@ -2712,7 +2712,6 @@ def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist= out.pipeline = utils.OperationNode("implicit_modeller", parents=[self]) return out - def generate_mesh( self, line_resolution=None, @@ -2938,8 +2937,9 @@ def reconstruct_surface( m = vedo.mesh.Mesh(surface.GetOutput(), c=self.color()) m.pipeline = utils.OperationNode( - "reconstruct_surface", parents=[self], - comment=f"#pts {m.dataset.GetPointData()}" + "reconstruct_surface", + parents=[self], + comment=f"#pts {m.dataset.GetPointData()}", ) return m @@ -3201,12 +3201,13 @@ def _readPoints(): cld.name = "densifiedCloud" cld.pipeline = utils.OperationNode( - "densify", parents=[self], c="#e9c46a:", - comment=f"#pts {cld.dataset.GetPointData()}" + "densify", + parents=[self], + c="#e9c46a:", + comment=f"#pts {cld.dataset.GetPointData()}", ) return cld - ############################################################################### ## stuff returning Volume @@ -3261,7 +3262,13 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu return vol def tovolume( - self, kernel="shepard", radius=None, n=None, bounds=None, null_value=None, dims=(25, 25, 25) + self, + kernel="shepard", + radius=None, + n=None, + bounds=None, + null_value=None, + dims=(25, 25, 25), ): """ Generate a `Volume` by interpolating a scalar @@ -3369,8 +3376,15 @@ def generate_random_data(self): self.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) return self - - def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None): + def generate_delaunay2d( + self, + mode="scipy", + boundaries=(), + tol=None, + alpha=0.0, + offset=0.0, + transform=None, + ): """ Create a mesh from points in the XY plane. If `mode='fit'` then the filter computes a best fitting @@ -3403,6 +3417,7 @@ def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, ######################################################### if mode == "scipy": from scipy.spatial import Delaunay as scipy_delaunay + tri = scipy_delaunay(plist[:, 0:2]) return vedo.mesh.Mesh([plist, tri.simplices]) ########################################################## @@ -3441,12 +3456,12 @@ def generate_delaunay2d(self, mode="scipy", boundaries=(), tol=None, alpha=0.0, msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") msh.pipeline = utils.OperationNode( - "delaunay2d", parents=[self], - comment=f"#cells {msh.dataset.GetNumberOfCells()}" + "delaunay2d", + parents=[self], + comment=f"#cells {msh.dataset.GetNumberOfCells()}", ) return msh - def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): """ Generate the 2D Voronoi convex tiling of the input points (z is ignored). @@ -3549,7 +3564,6 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.name = "Voronoi" return m - #################################################### def visible_points(self, area=(), tol=None, invert=False): """ diff --git a/vedo/shapes.py b/vedo/shapes.py index a155bc02..2f8149bf 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4534,7 +4534,7 @@ def off(self): self.actor.SetVisibility(False) return self -class Text2D(TextBase, vedo.visuals.BaseActor2D): +class Text2D(TextBase, vedo.visual.BaseActor2D): """ Create a 2D text object. """ diff --git a/vedo/visuals.py b/vedo/visual.py similarity index 100% rename from vedo/visuals.py rename to vedo/visual.py diff --git a/vedo/volume.py b/vedo/volume.py index 840ee5e1..a442b528 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -10,8 +10,6 @@ import vedo from vedo import utils -# from vedo.base import Base3DProp -# from vedo.base import BaseGrid from vedo.mesh import Mesh from vedo.core import VolumeAlgorithms From 16522acf437b66c3e46e8e1f86390890747434d2 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 20:15:05 +0200 Subject: [PATCH 072/251] cleanup with pylint visual.py --- vedo/visual.py | 85 +++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/vedo/visual.py b/vedo/visual.py index 429522fc..57471974 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -16,12 +16,20 @@ __doc__ = "Base classes to manage positioning and size of the objects in space and other properties" -# __all__ = [ -# ] +__all__ = [ + "CommonVisual", + "PointsVisual", + "VolumeVisual", + "MeshVisual", + "PictureVisual", + "ActorTransforms", + "BaseActor2D", +] ################################################### class CommonVisual: + """Class to manage the visual aspects common to all objects.""" def show(self, **options): """ @@ -400,6 +408,7 @@ def alpha(self, alpha, vmin=None, vmax=None): return self + ################################################### class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" @@ -422,25 +431,29 @@ def copy_properties_from(self, source, deep=True, actor_related=True): bfpr.DeepCopy(source.actor.GetBackfaceProperty()) self.actor.SetBackfaceProperty(bfpr) self.property_backface = bfpr - + if not actor_related: return self - + # mapper related: self.mapper.SetScalarVisibility(source.mapper.GetScalarVisibility()) self.mapper.SetScalarMode(source.mapper.GetScalarMode()) self.mapper.SetScalarRange(source.mapper.GetScalarRange()) self.mapper.SetLookupTable(source.mapper.GetLookupTable()) self.mapper.SetColorMode(source.mapper.GetColorMode()) - self.mapper.SetInterpolateScalarsBeforeMapping(source.mapper.GetInterpolateScalarsBeforeMapping()) - self.mapper.SetUseLookupTableScalarRange(source.mapper.GetUseLookupTableScalarRange()) + self.mapper.SetInterpolateScalarsBeforeMapping( + source.mapper.GetInterpolateScalarsBeforeMapping() + ) + self.mapper.SetUseLookupTableScalarRange( + source.mapper.GetUseLookupTableScalarRange() + ) self.actor.SetPickable(source.actor.GetPickable()) self.actor.SetDragable(source.actor.GetDragable()) self.actor.SetTexture(source.actor.GetTexture()) self.actor.SetVisibility(source.actor.GetVisibility()) return self - + def color(self, c=False, alpha=None): """ Set/get mesh's color. @@ -484,7 +497,6 @@ def alpha(self, opacity=None): self.actor.SetBackfaceProperty(self.property_backface) return self - def opacity(self, alpha=None): """Set/get mesh's transparency. Same as `mesh.alpha()`.""" return self.alpha(alpha) @@ -505,7 +517,7 @@ def point_size(self, value=None): """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" if value is None: return self.property.GetPointSize() - #self.property.SetRepresentationToSurface() + # self.property.SetRepresentationToSurface() else: self.property.SetRepresentationToPoints() self.property.SetPointSize(value) @@ -644,7 +656,6 @@ def point_blurring(self, r=1, emissive=False): self.actor.SetMapper(self.mapper) return self - @property def cellcolors(self): """ @@ -702,7 +713,6 @@ def cellcolors(self, value): self.celldata["CellsRGBA"] = value.astype(np.uint8) self.celldata.select("CellsRGBA") - @property def pointcolors(self): """ @@ -985,23 +995,22 @@ def update_trail(self): self.trail.pos(currentpos) return self - def _compute_shadow(self, plane, point, direction): shad = self.clone() - shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords + shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" pts = shad.vertices - if plane == 'x': + if plane == "x": # shad = shad.project_on_plane('x') - # instead do it manually so in case of alpha<1 + # instead do it manually so in case of alpha<1 # we dont see glitches due to coplanar points # we leave a small tolerance of 0.1% in thickness x0, x1 = self.xbounds() pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[0] shad.vertices = pts shad.x(point) - elif plane == 'y': + elif plane == "y": x0, x1 = self.ybounds() pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.actor.GetOrigin()[1] shad.vertices = pts @@ -1071,15 +1080,14 @@ def update_shadows(self): Update the shadows of a moving object. """ for sha in self.shadows: - plane = sha.info['plane'] - point = sha.info['point'] - direction = sha.info['direction'] + plane = sha.info["plane"] + point = sha.info["point"] + direction = sha.info["direction"] new_sha = self._compute_shadow(plane, point, direction) # sha.DeepCopy(new_sha) sha._update(new_sha.dataset) return self - def labels( self, content=None, @@ -1491,8 +1499,7 @@ def flagpole( c = np.array(self.color()) / 1.4 lab = vedo.shapes.Text3D( - txt, pos=pt+offset, s=s, - font=font, italic=italic, justify="center" + txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center" ) acts.append(lab) @@ -1773,7 +1780,7 @@ def follow_camera(self, camera=None, origin=None): plt = vedo.plotter_instance if plt and plt.renderer and plt.renderer.GetActiveCamera(): factor.SetCamera(plt.renderer.GetActiveCamera()) - + if origin is not None: factor.SetOrigin(origin) @@ -1782,7 +1789,6 @@ def follow_camera(self, camera=None, origin=None): self.actor = factor return self - def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface.""" if value: @@ -1876,10 +1882,8 @@ def lc(self, linecolor=None): return self.linecolor(linecolor) - ######################################################################################## class VolumeVisual(CommonVisual): - def alpha_unit(self, u=None): """ Defines light attenuation per unit length. Default is 1. @@ -1898,14 +1902,13 @@ def alpha_unit(self, u=None): ######################################################################################## class ActorTransforms: - def pos(self, point=None): """Set/get position of object.""" if point is None: return self.actor.GetPosition() self.actor.SetPosition(point) return self - + def origin(self, point=None): """Set/get origin of object.""" if point is None: @@ -1920,7 +1923,7 @@ def x(self, x=None): p = self.actor.GetPosition() self.actor.SetPosition(x, p[1], p[2]) return self - + def y(self, y=None): """Set/get y coordinate of object.""" if y is None: @@ -1928,7 +1931,7 @@ def y(self, y=None): p = self.actor.GetPosition() self.actor.SetPosition(p[0], y, p[2]) return self - + def z(self, z=None): """Set/get z coordinate of object.""" if z is None: @@ -1936,22 +1939,22 @@ def z(self, z=None): p = self.actor.GetPosition() self.actor.SetPosition(p[0], p[1], z) return self - + def rotate_x(self, angle): """Rotate around x axis.""" self.actor.RotateX(angle) return self - + def rotate_y(self, angle): """Rotate around y axis.""" self.actor.RotateY(angle) return self - + def rotate_z(self, angle): """Rotate around z axis.""" self.actor.RotateZ(angle) return self - + def reorient(self, old_axis, new_axis): """Rotate object to a new orientation.""" axis = utils.versor(old_axis) @@ -1959,13 +1962,13 @@ def reorient(self, old_axis, new_axis): angle = np.arccos(np.dot(axis, direction)) * 57.3 self.actor.RotateWXYZ(angle, np.cross(axis, direction)) return self - + def shift(self, dp): """Add vector to current position.""" p = self.actor.GetPosition() self.actor.SetPosition(p[0] + dp[0], p[1] + dp[1], p[2] + dp[2]) return self - + def scale(self, s=None, absolute=False): """Set/get scaling factor.""" if s is None: @@ -1975,11 +1978,10 @@ def scale(self, s=None, absolute=False): else: self.actor.SetScale(self.GetScale() * s) return self - + ######################################################################################## class PictureVisual(ActorTransforms, CommonVisual): - def alpha(self, a=None): """Set/get picture's transparency in the rendering scene.""" if a is not None: @@ -2004,7 +2006,7 @@ def window(self, value=None): def bounds(self): """Get the bounding box.""" return self.actor.GetBounds() - + def xbounds(self, i=None): """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() @@ -2033,8 +2035,7 @@ def zbounds(self, i=None): def diagonal_size(self): """Get the length of the diagonal of mesh bounding box.""" b = self.bounds() - return np.sqrt( - (b[1] - b[0])**2 + (b[3] - b[2])**2 + (b[5] - b[4])**2) + return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) def memory_size(self): """ @@ -2063,7 +2064,6 @@ def __init__(self): self.property = self.GetProperty() self.filename = "" - def layer(self, value=None): """Set/Get the layer number in the overlay planes into which to render.""" if value is None: @@ -2151,4 +2151,3 @@ def add_observer(self, event_name, func, priority=0): event_name = utils.get_vtk_name_event(event_name) idd = self.AddObserver(event_name, func, priority) return idd - From 5a165b0d4f447dc6d8bd78fe2a363090744aea68 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 22:32:46 +0200 Subject: [PATCH 073/251] now volume examples almost all work fine --- docs/changes.md | 18 - examples/advanced/warp6.py | 2 +- examples/pyplot/histo_hexagonal.py | 2 +- examples/pyplot/latex.py | 2 +- examples/pyplot/plot_density2d.py | 2 +- examples/pyplot/plot_density3d.py | 5 +- examples/pyplot/plot_density4d.py | 7 +- examples/pyplot/scatter_large.py | 12 +- examples/volumetric/colorize_volume.py | 22 +- examples/volumetric/erode_dilate.py | 1 - examples/volumetric/interpolate_volume.py | 2 +- examples/volumetric/lowpassfilter.py | 4 +- examples/volumetric/mesh2volume.py | 2 +- examples/volumetric/point_density.py | 9 +- examples/volumetric/probe_line1.py | 2 +- examples/volumetric/probe_line2.py | 6 +- examples/volumetric/probe_points.py | 4 +- examples/volumetric/read_volume2.py | 11 +- examples/volumetric/read_vts.py | 2 +- examples/volumetric/slice_mesh.py | 7 +- examples/volumetric/slice_plane1.py | 6 +- examples/volumetric/slice_plane2.py | 3 +- examples/volumetric/slicer2.py | 4 +- examples/volumetric/streamlines3.py | 2 +- ...{volumeFromMesh.py => volume_from_mesh.py} | 0 examples/volumetric/volume_operations.py | 14 +- examples/volumetric/volume_sharemap.py | 2 +- vedo/applications.py | 199 ++- vedo/core.py | 149 +- vedo/mesh.py | 4 +- vedo/picture.py | 1 + vedo/plotter.py | 77 +- vedo/shapes.py | 11 +- vedo/utils.py | 58 +- vedo/visual.py | 216 ++- vedo/volume.py | 1517 ++++++----------- 36 files changed, 1166 insertions(+), 1219 deletions(-) rename examples/volumetric/{volumeFromMesh.py => volume_from_mesh.py} (100%) diff --git a/docs/changes.md b/docs/changes.md index 866f0d81..08ce76dd 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -44,22 +44,12 @@ examples/volumetric/slicer1.py ~/Projects/vedo/examples/basic align5.py background_image.py -cut_freehand.py cut_interactive.py glyphs2.py -largestregion.py -rotate_image.py -slider_browser.py -ssao.py ~/Projects/vedo/examples/advanced cut_with_mesh1.py -gyroid.py -interpolate_scalar3.py -mesh_smoother1.py -splitmesh.py -spline_draw.py timer_callback2.py warp4.py warp6.py @@ -69,19 +59,11 @@ warp6.py custom_axes1.py caption.py embed_matplotlib.py -glyphs2.py -explore5d.py goniometer.py histo_2d_a.py histo_2d_b.py histo_hexagonal.py isolines.py -latex.py -plot_density2d.py -plot_density3d.py -plot_density4d.py -plot_stream.py -scatter_large.py ~/Projects/vedo/examples/simulations diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index 65bc9bbe..4e98545e 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -10,7 +10,7 @@ def on_keypress(event): n = normals[idx] pt = pt + n / 5 - txt.orientation(n).pos(pt) + txt.pos(pt).reorient(n) tpts = txt.clone().subsample(0.05).vertices kpts = [mesh.closest_point(tp) for tp in tpts] diff --git a/examples/pyplot/histo_hexagonal.py b/examples/pyplot/histo_hexagonal.py index 5ebec45a..214e75c2 100644 --- a/examples/pyplot/histo_hexagonal.py +++ b/examples/pyplot/histo_hexagonal.py @@ -18,6 +18,6 @@ f = r'f(x, y)=A \exp \left(-\left(\frac{\left(x-x_{o}\right)^{2}}' f+= r'{2 \sigma_{x}^{2}}+\frac{\left(y-y_{o}\right)^{2}}' f+= r'{2 \sigma_{y}^{2}}\right)\right)' -formula = Latex(f, c='k', s=1.5).rotate_x(90).rotate_z(90).pos(-4,-5,2) +formula = Latex(f, c='k', s=1.5).rotate_x(90).rotate_z(90).pos([-4,-5,2]) show(histo, formula, axes=1, viewup='z') diff --git a/examples/pyplot/latex.py b/examples/pyplot/latex.py index 9dc428a3..95c74897 100644 --- a/examples/pyplot/latex.py +++ b/examples/pyplot/latex.py @@ -9,6 +9,6 @@ ltx = Latex(latex4, s=1, c='darkblue', bg='', usetex=False, res=40) ltx.crop(0.3, 0.3) # crop top and bottom 30% -ltx.pos(2,0,0) +ltx.pos([2,0,0]) ltx.show(axes=8, size=(1400,700), bg2='lb', zoom='tight').close() diff --git a/examples/pyplot/plot_density2d.py b/examples/pyplot/plot_density2d.py index 72637952..eb0b1d06 100644 --- a/examples/pyplot/plot_density2d.py +++ b/examples/pyplot/plot_density2d.py @@ -13,7 +13,7 @@ pts = Points(p).color('k', 0.2) # radius of local search can be specified (None=automatic) -vol = pts.density(radius=None).c('Paired_r') # returns a Volume +vol = pts.density(radius=None).cmap('Paired_r') # returns a Volume # Other cool color mapping: Set1_r, Dark2. Or you can build your own, e.g.: # vol.c(['w','w','y','y','r','r','g','g','b','k']).alpha([0,1]) diff --git a/examples/pyplot/plot_density3d.py b/examples/pyplot/plot_density3d.py index bcbb944c..232a5374 100644 --- a/examples/pyplot/plot_density3d.py +++ b/examples/pyplot/plot_density3d.py @@ -11,10 +11,11 @@ pts = Points(p, alpha=0.5) -vol = pts.density().c('Dark2').alpha([0.1,1]) # density() returns a Volume +vol = pts.density() # density() returns a Volume +vol.cmap('Dark2').alpha([0.1,1]) r = precision(vol.info['radius'], 2) # retrieve automatic radius value -vol.add_scalarbar3d(title='Density (counts in r_s ='+r+')', c='k', italic=1) +vol.add_scalarbar3d(title='Density (counts in r_s ='+r+')', italic=1) show(pts, vol, __doc__, axes=True).close() diff --git a/examples/pyplot/plot_density4d.py b/examples/pyplot/plot_density4d.py index ee733780..4040cb67 100644 --- a/examples/pyplot/plot_density4d.py +++ b/examples/pyplot/plot_density4d.py @@ -31,8 +31,9 @@ def f(x, y, z, t): volf = fftshift(abs(volf)) volf = np.log(12*volf/volf.max()+ 1) / 2.5 - vb = Volume(volf).mode(1).c("rainbow").alpha([0, 0.8, 1]) - vb.name = "MyVolume" - plt.remove("MyVolume").add(vb).render() + volb = Volume(volf) + volb.mode(1).cmap("rainbow").alpha([0, 0.8, 1]) + volb.name = "MyVolume" + plt.remove("MyVolume").add(volb).render() plt.interactive().close() diff --git a/examples/pyplot/scatter_large.py b/examples/pyplot/scatter_large.py index 09845827..678b605e 100644 --- a/examples/pyplot/scatter_large.py +++ b/examples/pyplot/scatter_large.py @@ -3,9 +3,7 @@ Use mouse to zoom, press r to reset, -press p to increase point size. -""" -import time +press p to increase point size.""" from vedo import * N = 1000000 @@ -14,12 +12,8 @@ y = np.random.rand(N) RGBA = np.c_[x*255, y*255, np.zeros(N), y*255] -t0 = time.time() - -pts = Points([x,y], r=1, c=RGBA) - -t1 = time.time() -print("-> elapsed time:", t1-t0, "seconds for N:", N) +pts = Points([x,y]).point_size(1) +pts.pointcolors = RGBA # use mouse to zoom, press r to reset show(pts, __doc__, axes=1, mode="RubberBandZoom").close() diff --git a/examples/volumetric/colorize_volume.py b/examples/volumetric/colorize_volume.py index b56432bc..5e33386c 100644 --- a/examples/volumetric/colorize_volume.py +++ b/examples/volumetric/colorize_volume.py @@ -7,17 +7,23 @@ # to define the transfer function in the range of the scalar. # E.g.: setting alpha=[0, 0, 0, 1, 0, 0, 0] would make visible # only voxels with value close to center of the range (see histogram). -vol = Volume(dataurl+'embryo.slc') -vol.color([(0,"green"), (49,"green"), - (50,"blue"), (109,"blue"), - (110,"red"), (180,"red"), - ]) +vol = Volume(dataurl + "embryo.slc") +vol.color( + [ + (0, "green"), + (49, "green"), + (50, "blue"), + (109, "blue"), + (110, "red"), + (180, "red"), + ] +) # vol.mode('max-projection') -vol.alpha([0., 1.]) +vol.alpha([0.0, 1.0]) vol.alpha_unit(8) # absorption unit, higher factors = higher transparency -vol.add_scalarbar3d(title='color:dot:alpha transfer function', c='k') +vol.add_scalarbar3d(title="color:dot:alpha transfer function", c="k") -ch = CornerHistogram(vol, logscale=True, pos='bottom-left') +ch = CornerHistogram(vol, logscale=True, pos="bottom-left") # show both Volume and Mesh show(vol, ch, __doc__, axes=1, zoom=1.2).close() diff --git a/examples/volumetric/erode_dilate.py b/examples/volumetric/erode_dilate.py index 24e9bd3f..fabc8b92 100644 --- a/examples/volumetric/erode_dilate.py +++ b/examples/volumetric/erode_dilate.py @@ -4,7 +4,6 @@ from vedo import * embryo = Volume(dataurl+'embryo.tif') -embryo.print_histogram(logscale=1) eroded = embryo.clone().erode(neighbours=(2,2,2)) dilatd = eroded.clone().dilate(neighbours=(2,2,2)) diff --git a/examples/volumetric/interpolate_volume.py b/examples/volumetric/interpolate_volume.py index 889f6cb4..3bac570d 100644 --- a/examples/volumetric/interpolate_volume.py +++ b/examples/volumetric/interpolate_volume.py @@ -17,7 +17,7 @@ # available interpolation kernels are: shepard, gaussian, voronoi, linear. vol = pts.tovolume(kernel='shepard', n=4, dims=(90,90,90)) -vol.c(["maroon","g","b"]) # set color transfer function +vol.cmap(["maroon","g","b"]) # set color transfer function vol.alpha([0.3, 0.9]) # set opacity transfer function #vol.alpha([(0.3,0.3), (0.9,0.9)]) # alternative way, by specifying (xscalar, alpha) vol.alpha_unit(0.5) # make the whole object less transparent (default is 1) diff --git a/examples/volumetric/lowpassfilter.py b/examples/volumetric/lowpassfilter.py index 82aeed27..4aab011a 100644 --- a/examples/volumetric/lowpassfilter.py +++ b/examples/volumetric/lowpassfilter.py @@ -2,12 +2,12 @@ # mode = 1 is maximum projection (default is 0=composite) v1 = Volume(dataurl+'embryo.tif').mode(1) -v1.add_scalarbar3d(c='w').print_histogram(logscale=1, horizontal=1, c='g') +v1.add_scalarbar3d(c='w') t1 = Text2D('Original volume', c='lg') # cutoff range is roughly in the range of 1 / size of object v2 = v1.clone().frequency_pass_filter(high_cutoff=.001, order=1).mode(1) -v2.add_scalarbar3d(c='w').print_histogram(logscale=1, horizontal=1, c='b') +v2.add_scalarbar3d(c='w') t2 = Text2D('High freqs in the FFT\nare cut off:', c='lb') show([(v1,t1), (v2,t2)], N=2, bg='bb', zoom=1.5, axes=dict(digits=2)).close() diff --git a/examples/volumetric/mesh2volume.py b/examples/volumetric/mesh2volume.py index a8f999d5..befdac3d 100644 --- a/examples/volumetric/mesh2volume.py +++ b/examples/volumetric/mesh2volume.py @@ -5,7 +5,7 @@ surf = Mesh(dataurl+"bunny.obj").normalize().wireframe() vol = surf.binarize(spacing=(0.02,0.02,0.02)) -vol.alpha([0,0.6]).c('blue') +vol.alpha([0,0.6]).cmap('blue') iso = vol.isosurface().color("blue5") diff --git a/examples/volumetric/point_density.py b/examples/volumetric/point_density.py index 19960fdc..3b1c997e 100644 --- a/examples/volumetric/point_density.py +++ b/examples/volumetric/point_density.py @@ -1,14 +1,15 @@ """Density field as a Volume from a point cloud""" from vedo import * -s = Mesh(dataurl+'bunny.obj').normalize().subdivide(2).point_size(3).c("black") +surf = Mesh(dataurl+'bunny.obj').normalize().subdivide(2) +surf.color("k5").point_size(2) -vol = s.density().print() +vol = surf.density() -plane = probe_plane(vol, normal=(1,1,1)).alpha(0.5) +plane = vol.probe_plane(normal=(1,1,1)).alpha(0.5) show([ - ("Point cloud", s), + ("Point cloud", surf), ("Point density as Volume", vol, vol.box(), plane) ], N=2, ).close() diff --git a/examples/volumetric/probe_line1.py b/examples/volumetric/probe_line1.py index 2ca27f65..1585c7d8 100644 --- a/examples/volumetric/probe_line1.py +++ b/examples/volumetric/probe_line1.py @@ -8,7 +8,7 @@ step = (i - 30) * 2 p1 = vol.center() + vector(-100, step, step) p2 = vol.center() + vector( 100, step, step) - pl = probe_line(vol, p1, p2).cmap('hot', vmin=0, vmax=110) + pl = vol.probe_line(p1, p2).cmap('hot', vmin=0, vmax=110) pl.alpha(0.5).linewidth(4) lines.append(pl) #print(pl.pointdata.keys()) # numpy scalars can be accessed here diff --git a/examples/volumetric/probe_line2.py b/examples/volumetric/probe_line2.py index 8d9a63f8..0ac2f5d2 100644 --- a/examples/volumetric/probe_line2.py +++ b/examples/volumetric/probe_line2.py @@ -1,15 +1,15 @@ """Probe a Volume with a line and plot the intensity values""" -from vedo import dataurl, Volume, probe_line, show +from vedo import dataurl, Volume, show from vedo.pyplot import plot vol = Volume(dataurl+'embryo.slc') vol.add_scalarbar3d('wild-type mouse embryo', c='k') p1, p2 = (50,50,50), (200,200,200) -pl = probe_line(vol, p1, p2, res=100).linewidth(4) +pl = vol.probe_line(p1, p2, res=100).linewidth(4) -xvals = pl.points()[:,0] +xvals = pl.vertices[:,0] yvals = pl.pointdata[0] # get the probed values along the line fig = plot( diff --git a/examples/volumetric/probe_points.py b/examples/volumetric/probe_points.py index 4462037a..a27c5d20 100644 --- a/examples/volumetric/probe_points.py +++ b/examples/volumetric/probe_points.py @@ -1,12 +1,12 @@ """Probe a voxel dataset at specified points and plot a histogram of the values""" -from vedo import np, dataurl, Volume, Axes, probe_points, show +from vedo import np, dataurl, Volume, Axes, show from vedo.pyplot import histogram vol = Volume(dataurl+'embryo.slc').print() pts = np.random.rand(5000, 3)*256 -mpts = probe_points(vol, pts).point_size(3) +mpts = vol.probe_points(pts).point_size(3) mpts.print() # valid = mpts.pointdata['vtkValidPointMask'] diff --git a/examples/volumetric/read_volume2.py b/examples/volumetric/read_volume2.py index a8a276b8..9852bbbe 100644 --- a/examples/volumetric/read_volume2.py +++ b/examples/volumetric/read_volume2.py @@ -18,13 +18,12 @@ # a transparency for the GRADIENT of the scalar can also be set: # in this case when the scalar is ~constant the gradient is ~zero # and the voxel are made transparent: -vol1.alpha_gradient([0.0, 0.5, 0.9]).add_scalarbar3d('composite shade', c='k') -vol1.scalarbar.scale(0.8).x(20) +vol1.alpha_gradient([0.0, 0.5, 0.9]) +vol1.add_scalarbar3d('composite shade') # mode = 1 is maximum-projection volume rendering -vol2 = Volume(dataurl+"vase.vti").mode(1).shift(60,0,0) -vol2.add_scalarbar3d('maximum-projection', c='k') -vol2.scalarbar.scale(0.8).x(160) +vol2 = Volume(dataurl+"vase.vti").mode(1) +vol2.add_scalarbar3d('maximum-projection') # show command creates and returns an instance of class Plotter -show(vol1, vol2, __doc__, size=(800,600), zoom=1.5).close() +show([[vol1, __doc__], vol2], N=2, axes=1).close() diff --git a/examples/volumetric/read_vts.py b/examples/volumetric/read_vts.py index a7a3d6cc..ec4786cb 100644 --- a/examples/volumetric/read_vts.py +++ b/examples/volumetric/read_vts.py @@ -6,7 +6,7 @@ g = load(dataurl+'structgrid.vts') -coords = g.points() +coords = g.vertices # g.print() gives the list of point and cell data contained in g vects = g.pointdata['Momentum']/600 diff --git a/examples/volumetric/slice_mesh.py b/examples/volumetric/slice_mesh.py index 905635db..4214715c 100644 --- a/examples/volumetric/slice_mesh.py +++ b/examples/volumetric/slice_mesh.py @@ -1,10 +1,11 @@ """Slice/probe a Volume with a Mesh""" from vedo import * -vol = Volume(dataurl+'embryo.slc').mode(1).c('bone') +vol = Volume(dataurl + 'embryo.slc') +vol.cmap('bone').mode(1) msh = Paraboloid(res=200).scale(200).pos(100,100,200) -scals = probe_points(vol, msh).pointdata[0] -msh.cmap('Spectral', scals).add_scalarbar() +scalars = vol.probe_points(msh).pointdata[0] +msh.cmap('Spectral', scalars).add_scalarbar() show(vol, msh, __doc__, axes=True).close() diff --git a/examples/volumetric/slice_plane1.py b/examples/volumetric/slice_plane1.py index 6e30dcc4..fb281fc9 100644 --- a/examples/volumetric/slice_plane1.py +++ b/examples/volumetric/slice_plane1.py @@ -8,13 +8,15 @@ def func(evt): pid = evt.actor.closest_point(evt.picked3d, return_point_id=True) txt = f"Probing:\n{precision(evt.actor.picked3d, 3)}\nvalue = {arr[pid]}" - pts = evt.actor.points() + pts = evt.actor.vertices sph = Sphere(pts[pid], c='orange7').pickable(False) fp = sph.flagpole(txt, s=7, offset=(-150,15), font=2).follow_camera() # remove old and add the two new objects plt.remove('Sphere', 'FlagPole').add(sph, fp).render() -vol = Volume(dataurl+'embryo.slc').alpha([0,0,0.8]).c('w').pickable(False) +vol = Volume(dataurl+'embryo.slc') +vol.cmap('white').alpha([0,0,0.8]).pickable(False) + vslice = vol.slice_plane(origin=vol.center(), normal=(0,1,1)) vslice.cmap('Purples_r').lighting('off').add_scalarbar('Slice', c='w') arr = vslice.pointdata[0] # retrieve vertex array data diff --git a/examples/volumetric/slice_plane2.py b/examples/volumetric/slice_plane2.py index 3012fb73..e72e7332 100644 --- a/examples/volumetric/slice_plane2.py +++ b/examples/volumetric/slice_plane2.py @@ -2,7 +2,8 @@ Make low values of the scalar completely transparent""" from vedo import * -vol = Volume(dataurl+'embryo.slc').alpha([0,0,0.5]).c('k') +vol = Volume(dataurl+'embryo.slc') +vol.cmap('bone').alpha([0,0,0.5]) slices = [] for i in range(4): diff --git a/examples/volumetric/slicer2.py b/examples/volumetric/slicer2.py index a6989bd9..dce8d473 100644 --- a/examples/volumetric/slicer2.py +++ b/examples/volumetric/slicer2.py @@ -6,9 +6,9 @@ cmaps = ['hot_r', 'gist_ncar_r', 'bone_r'] ######################################################################## -def initfunc(iren, data): +def initfunc(iren, vol): - vol = data.mode(1).c('k').alpha([0, 0, 0.15, 0, 0]) + vol.mode(1).cmap('k').alpha([0, 0, 0.15, 0, 0]) txt = Text2D(data.filename[-20:], font='Calco') plt.at(iren).show(vol, vol.box(), txt) diff --git a/examples/volumetric/streamlines3.py b/examples/volumetric/streamlines3.py index d549df72..6855f75a 100644 --- a/examples/volumetric/streamlines3.py +++ b/examples/volumetric/streamlines3.py @@ -19,7 +19,7 @@ # Make a cloud of points form the ugrid, in order to draw arrows domain = Points(ugrid) -coords = domain.points() +coords = domain.vertices vects = domain.pointdata['U']/200 arrows = Arrows(coords-vects, coords+vects, c='jet_r') # use colormap box = domain.box().c('k') # build a box frame of the domain diff --git a/examples/volumetric/volumeFromMesh.py b/examples/volumetric/volume_from_mesh.py similarity index 100% rename from examples/volumetric/volumeFromMesh.py rename to examples/volumetric/volume_from_mesh.py diff --git a/examples/volumetric/volume_operations.py b/examples/volumetric/volume_operations.py index b90e02ae..50acf8d7 100644 --- a/examples/volumetric/volume_operations.py +++ b/examples/volumetric/volume_operations.py @@ -9,7 +9,7 @@ plt = Plotter(N=6) -v0 = Volume(dataurl+'embryo.slc').c(0) +v0 = Volume(dataurl+'embryo.slc').cmap(0) v0.add_scalarbar3d() plt.at(0).show("original", v0) @@ -18,19 +18,19 @@ # print(v1.pointdata.keys()) plt.at(1).show("gradient", v1) -v2 = v0.clone().operation("divergence").c(2) +v2 = v0.clone().operation("divergence").cmap(2) v2.add_scalarbar3d() plt.at(2).show("divergence", v2) -v3 = v0.clone().operation("laplacian").c(3) +v3 = v0.clone().operation("laplacian").cmap(3) v3.add_scalarbar3d() plt.at(3).show("laplacian", v3) -v4 = v0.clone().operation("median").c(4) +v4 = v0.clone().operation("median").cmap(4) v4.add_scalarbar3d() plt.at(4).show("median", v4) -v5 = v0.clone().operation("dot", v0).c(7) +v5 = v0.clone().operation("dot", v0).cmap(7) v5.add_scalarbar3d() plt.at(5).show("dot(v0,v0)", v5, zoom=1.3) @@ -43,7 +43,7 @@ vol = msh.signed_distance(dims=(20, 20, 20)) vol.threshold(above=0.0, replace=0.0) # replacing all values outside to 0 -vol.c("blue").alpha([0.9, 0.0]).alpha_unit(0.1).add_scalarbar3d() +vol.cmap("blue").alpha([0.9, 0.0]).alpha_unit(0.1).add_scalarbar3d() vgrad = vol.operation("gradient") printc(vgrad.pointdata.keys(), c='g') @@ -53,7 +53,7 @@ arrs = Arrows(pts, pts + grd*0.1).lighting('off') pts_probes = [[0.2,0.5,0.5], [0.2,0.3,0.4]] -vects = probe_points(vgrad, pts_probes).pointdata['ImageScalarsGradient'] +vects = vgrad.probe_points(pts_probes).pointdata['ImageScalarsGradient'] arrs_pts_probe = Arrows(pts_probes, pts_probes+vects) plt = Plotter(axes=1, N=2) diff --git a/examples/volumetric/volume_sharemap.py b/examples/volumetric/volume_sharemap.py index fa92a877..e994163c 100644 --- a/examples/volumetric/volume_sharemap.py +++ b/examples/volumetric/volume_sharemap.py @@ -17,4 +17,4 @@ # can also manually build an extra scalarbar object to span the whole range: sb = Line([50,0,0],[50,50,0]).cmap('jet',[0,70]).add_scalarbar3d("vol2", c='black').scalarbar -show([(vol1, __doc__), (vol2, sb)], N=2, axes=1, elevation=-25) +show([(vol2, sb, __doc__), vol1], shape=(2,1), axes=1, elevation=-25) diff --git a/vedo/applications.py b/vedo/applications.py index 91db4b4f..182e1afd 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -269,6 +269,201 @@ def buttonfunc(_obj, _ename): self.add(hist) +########################################################################## +class VolumeSlice(vedo.Volume): + """ + Derived class of `vtkImageSlice`. + """ + + def __init__(self, inputobj=None): + """ + This class is equivalent to `Volume` except for its representation. + The main purpose of this class is to be used in conjunction with `Volume` + for visualization using `mode="image"`. + """ + self.actor = vtk.vtkImageSlice() + # vtk.vtkImageSlice.__init__(self) + + self._mapper = vtk.vtkImageResliceMapper() + self._mapper.SliceFacesCameraOn() + self._mapper.SliceAtFocalPointOn() + self._mapper.SetAutoAdjustImageQuality(False) + self._mapper.BorderOff() + + self.lut = None + + self.property = vtk.vtkImageProperty() + self.property.SetInterpolationTypeToLinear() + self.SetProperty(self.property) + + ################### + if isinstance(inputobj, str): + if "https://" in inputobj: + inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath + elif os.path.isfile(inputobj): + pass + else: + inputobj = sorted(glob.glob(inputobj)) + + ################### + inputtype = str(type(inputobj)) + + if inputobj is None: + img = vtk.vtkImageData() + + if isinstance(inputobj, Volume): + img = inputobj.dataset + self.lut = utils.ctf2lut(inputobj) + + elif utils.is_sequence(inputobj): + + if isinstance(inputobj[0], str): # scan sequence of BMP files + ima = vtk.vtkImageAppend() + ima.SetAppendAxis(2) + pb = utils.ProgressBar(0, len(inputobj)) + for i in pb.range(): + f = inputobj[i] + picr = vtk.vtkBMPReader() + picr.SetFileName(f) + picr.Update() + mgf = vtk.vtkImageMagnitude() + mgf.SetInputData(picr.GetOutput()) + mgf.Update() + ima.AddInputData(mgf.GetOutput()) + pb.print("loading...") + ima.Update() + img = ima.GetOutput() + + else: + if "ndarray" not in inputtype: + inputobj = np.array(inputobj) + + if len(inputobj.shape) == 1: + varr = utils.numpy2vtk(inputobj, dtype=float) + else: + if len(inputobj.shape) > 2: + inputobj = np.transpose(inputobj, axes=[2, 1, 0]) + varr = utils.numpy2vtk(inputobj.ravel(order="F"), dtype=float) + varr.SetName("input_scalars") + + img = vtk.vtkImageData() + img.SetDimensions(inputobj.shape) + img.GetPointData().AddArray(varr) + img.GetPointData().SetActiveScalars(varr.GetName()) + + elif "ImageData" in inputtype: + img = inputobj + + elif isinstance(inputobj, Volume): + img = inputobj.inputdata() + + elif "UniformGrid" in inputtype: + img = inputobj + + elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata + if hasattr(inputobj, "Update"): + inputobj.Update() + img = inputobj.GetOutput() + + elif isinstance(inputobj, str): + if "https://" in inputobj: + inputobj = vedo.file_io.download(inputobj, verbose=False) + img = vedo.file_io.loadImageData(inputobj) + + else: + vedo.logger.error(f"cannot understand input type {inputtype}") + return + + self._data = img + self._mapper.SetInputData(img) + self.SetMapper(self._mapper) + + def bounds(self): + """Return the bounding box as [x0,x1, y0,y1, z0,z1]""" + bns = [0, 0, 0, 0, 0, 0] + self.GetBounds(bns) + return bns + + def colorize(self, lut=None, fix_scalar_range=False): + """ + Assign a LUT (Look Up Table) to colorize the slice, leave it `None` + to reuse an existing Volume color map. + Use "bw" for automatic black and white. + """ + if lut is None and self.lut: + self.property.SetLookupTable(self.lut) + elif isinstance(lut, vtk.vtkLookupTable): + self.property.SetLookupTable(lut) + elif lut == "bw": + self.property.SetLookupTable(None) + self.property.SetUseLookupTableScalarRange(fix_scalar_range) + return self + + def alpha(self, value): + """Set opacity to the slice""" + self.property.SetOpacity(value) + return self + + def auto_adjust_quality(self, value=True): + """Automatically reduce the rendering quality for greater speed when interacting""" + self._mapper.SetAutoAdjustImageQuality(value) + return self + + def slab(self, thickness=0, mode=0, sample_factor=2): + """ + Make a thick slice (slab). + + Arguments: + thickness : (float) + set the slab thickness, for thick slicing + mode : (int) + The slab type: + 0 = min + 1 = max + 2 = mean + 3 = sum + sample_factor : (float) + Set the number of slab samples to use as a factor of the number of input slices + within the slab thickness. The default value is 2, but 1 will increase speed + with very little loss of quality. + """ + self._mapper.SetSlabThickness(thickness) + self._mapper.SetSlabType(mode) + self._mapper.SetSlabSampleFactor(sample_factor) + return self + + def face_camera(self, value=True): + """Make the slice always face the camera or not.""" + self._mapper.SetSliceFacesCameraOn(value) + return self + + def jump_to_nearest_slice(self, value=True): + """ + This causes the slicing to occur at the closest slice to the focal point, + instead of the default behavior where a new slice is interpolated between + the original slices. + Nothing happens if the plane is oblique to the original slices.""" + self.SetJumpToNearestSlice(value) + return self + + def fill_background(self, value=True): + """ + Instead of rendering only to the image border, + render out to the viewport boundary with the background color. + The background color will be the lowest color on the lookup + table that is being used for the image.""" + self._mapper.SetBackground(value) + return self + + def lighting(self, window, level, ambient=1.0, diffuse=0.0): + """Assign the values for window and color level.""" + self.property.SetColorWindow(window) + self.property.SetColorLevel(level) + self.property.SetAmbient(ambient) + self.property.SetDiffuse(diffuse) + return self + + ######################################################################################## class Slicer2DPlotter(Plotter): """ @@ -300,7 +495,7 @@ def __init__(self, volume, levels=(None, None), histo_color="red5", **kwargs): super().__init__(**kwargs) # reuse the same underlying data as in vol - vsl = vedo.volume.VolumeSlice(volume) + vsl = VolumeSlice(volume) # no argument will grab the existing cmap in vol (or use build_lut()) vsl.colorize() @@ -383,7 +578,7 @@ def __init__(self, volume, **kwargs): self.alphaslider2 = 1 self.property = volume.GetProperty() - img = volume.imagedata() + img = volume.dataset if volume.dimensions()[2] < 3: vedo.logger.error("RayCastPlotter: not enough z slices.") diff --git a/vedo/core.py b/vedo/core.py index 599f4d63..fcad78d7 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -489,9 +489,9 @@ def print(self): return self def inputdata(self): - """Obsolete, use `self` instead.""" - print("WARNING: inputdata() is obsolete, use self instead.") - return self + """Obsolete, use `.dataset` instead.""" + print("WARNING: inputdata() is obsolete, use .dataset instead.") + return self.dataset @property def npoints(self): @@ -567,7 +567,7 @@ def mark_boundaries(self): A new array called `BoundaryCells` is added to the mesh. """ mb = vtk.vtkMarkBoundaryFilter() - mb.SetInputData(self.datset) + mb.SetInputData(self.dataset) mb.Update() self.DeepCopy(mb.GetOutput()) self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) @@ -749,7 +749,7 @@ def resample_data_from(self, source, tol=None, categorical=False): ``` """ rs = vtk.vtkResampleWithDataSet() - rs.SetInputData(self.datset) + rs.SetInputData(self.dataset) rs.SetSourceData(source) rs.SetPassPointArrays(True) @@ -771,7 +771,7 @@ def resample_data_from(self, source, tol=None, categorical=False): def add_ids(self): """Generate point and cell ids arrays.""" ids = vtk.vtkIdFilter() - ids.SetInputData(self.datset) + ids.SetInputData(self.dataset) ids.PointIdsOn() ids.CellIdsOn() ids.FieldDataOff() @@ -859,7 +859,7 @@ def divergence(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in divergence(): no vectors found for {on}") raise RuntimeError - div.SetInputData(self.datset) + div.SetInputData(self.dataset) div.SetInputScalars(tp, array_name) div.ComputeDivergenceOn() div.ComputeGradientOff() @@ -902,7 +902,7 @@ def vorticity(self, array_name=None, on="points", fast=False): vedo.logger.error(f"in vorticity(): no vectors found for {on}") raise RuntimeError - vort.SetInputData(self.datset) + vort.SetInputData(self.dataset) vort.SetInputScalars(tp, array_name) vort.ComputeDivergenceOff() vort.ComputeGradientOff() @@ -937,7 +937,7 @@ def tomesh(self, fill=True, shrink=1.0): gf = vtk.vtkGeometryFilter() if fill: sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) + sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) @@ -953,7 +953,7 @@ def tomesh(self, fill=True, shrink=1.0): cleanPolyData.Update() poly = cleanPolyData.GetOutput() else: - gf.SetInputData(self.datset) + gf.SetInputData(self.dataset) gf.Update() poly = gf.GetOutput() @@ -975,7 +975,7 @@ def shrink(self, fraction=0.8): ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.datset) + sf.SetInputData(self.dataset) sf.SetShrinkFactor(fraction) sf.Update() self._update(sf.GetOutput()) @@ -1006,6 +1006,9 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ + if self.dataset.GetNumberOfPoints() == 0: + return self + if isinstance(LT, LinearTransform): tr = LT.T if LT.is_identity(): @@ -1218,7 +1221,7 @@ def isosurface(self, value=None, flying_edges=True): cf = vtk.vtkContourFilter() cf.UseScalarTreeOn() - cf.SetInputData(self.datset) + cf.SetInputData(self.dataset) cf.ComputeNormalsOn() if utils.is_sequence(value): @@ -1240,7 +1243,7 @@ def isosurface(self, value=None, flying_edges=True): out.pipeline = utils.OperationNode( "isosurface", parents=[self], - comment=f"#pts {out.GetNumberOfPoints()}", + comment=f"#pts {out.dataset.GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out @@ -1273,10 +1276,10 @@ def legosurface( ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ - dataset = vtk.vtkImplicitDataSet() - dataset.SetDataSet(self) + imp_dataset = vtk.vtkImplicitDataSet() + imp_dataset.SetDataSet(self.dataset) window = vtk.vtkImplicitWindowFunction() - window.SetImplicitFunction(dataset) + window.SetImplicitFunction(imp_dataset) srng = list(self.dataset.GetScalarRange()) if vmin is not None: @@ -1289,7 +1292,7 @@ def legosurface( window.SetWindowRange(srng) extract = vtk.vtkExtractGeometry() - extract.SetInputData(self.datset) + extract.SetInputData(self.dataset) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) @@ -1335,7 +1338,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self.datset) + clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() @@ -1378,7 +1381,7 @@ def cut_with_box(self, box): # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self.datset) + bc.SetInputData(self.dataset) if isinstance(box, vtk.vtkProp): boxb = box.GetBounds() else: @@ -1472,7 +1475,7 @@ def extract_cells_on_plane(self, origin, normal): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) + bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -1497,7 +1500,7 @@ def extract_cells_on_sphere(self, center, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) + bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -1522,7 +1525,7 @@ def extract_cells_on_cylinder(self, center, axis, radius): Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() - bf.SetInputData(self.datset) + bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() @@ -1548,7 +1551,7 @@ def clean(self): Cleanup unused points and empty cells """ cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self.datset) + cl.SetInputData(self.dataset) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() cl.AveragePointDataOff() @@ -1607,3 +1610,103 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): c="#9e2a2b", ) return ug + + def probe_points(self, pts): + """ + Takes a `Volume` (or any other vtk data set) + and probes its scalars at the specified points in space. + + Note that a mask is also output with valid/invalid points which can be accessed + with `mesh.pointdata['vtkValidPointMask']`. + + Examples: + - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) + + ![](https://vedo.embl.es/images/volumetric/probePoints.png) + """ + if isinstance(pts, vedo.pointcloud.Points): + pts = pts.vertices + + def _readpoints(): + output = src.GetPolyDataOutput() + points = vtk.vtkPoints() + for p in pts: + x, y, z = p + points.InsertNextPoint(x, y, z) + output.SetPoints(points) + + cells = vtk.vtkCellArray() + cells.InsertNextCell(len(pts)) + for i in range(len(pts)): + cells.InsertCellPoint(i) + output.SetVerts(cells) + + src = vtk.vtkProgrammableSource() + src.SetExecuteMethod(_readpoints) + src.Update() + img = self.dataset + probeFilter = vtk.vtkProbeFilter() + probeFilter.SetSourceData(img) + probeFilter.SetInputConnection(src.GetOutputPort()) + probeFilter.Update() + poly = probeFilter.GetOutput() + pm = vedo.mesh.Mesh(poly) + pm.name = "ProbePoints" + pm.pipeline = utils.OperationNode("probe_points", parents=[self]) + return pm + + + def probe_line(self, p1, p2, res=100): + """ + Takes a `Volume` (or any other vtk data set) + and probes its scalars along a line defined by 2 points `p1` and `p2`. + + Note that a mask is also output with valid/invalid points which can be accessed + with `mesh.pointdata['vtkValidPointMask']`. + + Use `res` to set the nr of points along the line + + Examples: + - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) + - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) + + ![](https://vedo.embl.es/images/volumetric/probeLine2.png) + """ + line = vtk.vtkLineSource() + line.SetResolution(res) + line.SetPoint1(p1) + line.SetPoint2(p2) + probeFilter = vtk.vtkProbeFilter() + probeFilter.SetSourceData(self.dataset) + probeFilter.SetInputConnection(line.GetOutputPort()) + probeFilter.Update() + poly = probeFilter.GetOutput() + lnn = vedo.mesh.Mesh(poly) + lnn.name = "ProbeLine" + lnn.pipeline = utils.OperationNode("probe_line", parents=[self]) + return lnn + + + def probe_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): + """ + Takes a `Volume` (or any other vtk data set) + and probes its scalars on a plane defined by a point and a normal. + + Examples: + - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) + - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) + + ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) + """ + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + planeCut = vtk.vtkCutter() + planeCut.SetInputData(self.dataset) + planeCut.SetCutFunction(plane) + planeCut.Update() + poly = planeCut.GetOutput() + cutmesh = vedo.mesh.Mesh(poly) + cutmesh.name = "ProbePlane" + cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[self]) + return cutmesh diff --git a/vedo/mesh.py b/vedo/mesh.py index 07a7665c..e074f45c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -2071,7 +2071,7 @@ def extract_largest_region(self): m = Mesh(conn.GetOutput()) pr = vtk.vtkProperty() pr.DeepCopy(self.property) - m.SetProperty(pr) + m.actor.SetProperty(pr) m.property = pr vis = self.mapper.GetScalarVisibility() m.mapper.SetScalarVisibility(vis) @@ -2480,7 +2480,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu flip the sign Examples: - - [volumeFromMesh.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volumeFromMesh.py) + - [volume_from_mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volume_from_mesh.py) """ if maxradius is not None: vedo.logger.warning( diff --git a/vedo/picture.py b/vedo/picture.py index 1b54ea55..9e0f6bed 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -265,6 +265,7 @@ def __init__(self, obj=None, channels=3, flip=False): self.pipeline = None self.actor = vtk.vtkImageActor() + self.actor.data = self # so it can be picked self.property = self.actor.GetProperty() if utils.is_sequence(obj) and len(obj) > 0: # passing array diff --git a/vedo/plotter.py b/vedo/plotter.py index c5504fd3..b00ddc6e 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -22,7 +22,7 @@ __docformat__ = "google" __doc__ = """ -This module defines the main class Plotter to manage actors and 3D rendering. +This module defines the main class Plotter to manage objects and 3D rendering. ![](https://vedo.embl.es/images/basic/multirenderers.png) """ @@ -91,7 +91,7 @@ def keys(self): ############################################################################################## def show( - *actors, + *objects, at=None, shape=(1, 1), N=None, @@ -205,12 +205,12 @@ def show( if set to `True`, a call to show will instantiate a new Plotter object (a new window) instead of reusing the first created. """ - if len(actors) == 0: - actors = None - elif len(actors) == 1: - actors = actors[0] + if len(objects) == 0: + objects = None + elif len(objects) == 1: + objects = objects[0] else: - actors = utils.flatten(actors) + objects = utils.flatten(objects) if vedo.plotter_instance and not new: # Plotter exists plt = vedo.plotter_instance @@ -219,10 +219,10 @@ def show( if utils.is_sequence(at): # user passed a sequence for "at" - if not utils.is_sequence(actors): + if not utils.is_sequence(objects): vedo.logger.error("in show() input must be a list.") raise RuntimeError() - if len(at) != len(actors): + if len(at) != len(objects): vedo.logger.error("in show() lists 'input' and 'at' must have equal lengths") raise RuntimeError() if shape == (1, 1) and N is None: @@ -230,12 +230,12 @@ def show( elif at is None and (N or shape != (1, 1)): - if not utils.is_sequence(actors): + if not utils.is_sequence(objects): e = "in show(), N or shape is set, but input is not a sequence\n" e += " you may need to specify e.g. at=0" vedo.logger.error(e) raise RuntimeError() - at = list(range(len(actors))) + at = list(range(len(objects))) plt = Plotter( shape=shape, @@ -258,7 +258,7 @@ def show( if utils.is_sequence(at): - for i, act in enumerate(actors): + for i, act in enumerate(objects): _plt_to_return = plt.show( act, at=i, @@ -288,7 +288,7 @@ def show( else: _plt_to_return = plt.show( - actors, + objects, at=at, zoom=zoom, resetcam=resetcam, @@ -317,7 +317,7 @@ def close(): ######################################################################## class Plotter: - """Main class to manage actors.""" + """Main class to manage objects.""" def __init__( self, @@ -403,7 +403,7 @@ def __init__( else: interactive = True - self.objects = [] # list of actors to be shown + self.objects = [] # list of objects to be shown self.clicked_object = None # holds the object that has been clicked self.clicked_actor = None # holds the actor that has been clicked @@ -763,12 +763,12 @@ def __init__( ##################################################################### ..init ends here. - def __iadd__(self, actors): - self.add(actors) + def __iadd__(self, objects): + self.add(objects) return self - def __isub__(self, actors): - self.remove(actors) + def __isub__(self, objects): + self.remove(objects) return self def __enter__(self): @@ -804,7 +804,7 @@ def at(self, nren, yren=None): def add(self, *objs, at=None): """ - Append the input objects to the internal list of actors to be shown. + Append the input objects to the internal list of objects to be shown. Arguments: at : (int) @@ -2711,14 +2711,14 @@ def mode_select(objs): afru.name = "Frustum" return afru - def _scan_input_return_acts(self, wannabe_acts): + def _scan_input_return_acts(self, objs): # scan the input and return a list of actors - if not utils.is_sequence(wannabe_acts): - wannabe_acts = [wannabe_acts] + if not utils.is_sequence(objs): + objs = [objs] ################# wannabe_acts2 = [] - for a in wannabe_acts: + for a in objs: try: wannabe_acts2.append(a.actor) @@ -2754,12 +2754,6 @@ def _scan_input_return_acts(self, wannabe_acts): elif isinstance(a, (vtk.vtkActor, vtk.vtkActor2D)): scanned_acts.append(a) - elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): - scanned_acts.append(a.actor) - - elif isinstance(a, vtk.vtkImageData): - scanned_acts.append(vedo.Volume(a).actor) - elif isinstance(a, (vedo.TetMesh, vedo.UGrid)): # check ugrid is all made of tets # ugrid = a @@ -2811,6 +2805,9 @@ def _scan_input_return_acts(self, wannabe_acts): elif isinstance(a, vtk.vtkPolyData): scanned_acts.append(vedo.Mesh(a).actor) + elif isinstance(a, vtk.vtkImageData): + scanned_acts.append(vedo.Volume(a).actor) + elif isinstance(a, vtk.vtkMultiBlockDataSet): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) @@ -2845,7 +2842,7 @@ def _scan_input_return_acts(self, wannabe_acts): def show( self, - *actors, + *objects, at=None, axes=None, resetcam=None, @@ -2988,8 +2985,8 @@ def show( if axes is not None: if isinstance(axes, vedo.Assembly): # user passing show(..., axes=myaxes) - actors = list(actors) - actors.append(axes) # move it into the list of normal things to show + objects = list(objects) + objects.append(axes) # move it into the list of normal things to show axes = 0 self.axes = axes @@ -3013,7 +3010,7 @@ def show( if self.renderer: self.camera = self.renderer.GetActiveCamera() - self.add(actors) + self.add(objects) # Backend ############################################################### if settings.default_backend != "vtk": @@ -3021,7 +3018,7 @@ def show( return backends.get_notebook_backend(self.objects) ######################################################################### - for ia in utils.flatten(actors): + for ia in utils.flatten(objects): try: # fix gray color labels and title to white or black ltc = np.array(ia.scalarbar.GetLabelTextProperty().GetColor()) @@ -3152,7 +3149,7 @@ def show( return self - def add_inset(self, *actors, **options): + def add_inset(self, *objects, **options): """Add a draggable inset space into a renderer. Arguments: @@ -3189,10 +3186,10 @@ def add_inset(self, *actors, **options): widget = vtk.vtkOrientationMarkerWidget() r, g, b = vedo.get_color(c) widget.SetOutlineColor(r, g, b) - if len(actors) == 1: - widget.SetOrientationMarker(actors[0]) + if len(objects) == 1: + widget.SetOrientationMarker(objects[0].actor) else: - widget.SetOrientationMarker(vedo.Assembly(actors)) + widget.SetOrientationMarker(vedo.Assembly(objects)) widget.SetInteractor(self.interactor) @@ -3677,7 +3674,7 @@ def _keypress(self, iren, event): " | q return control to python script |\n" " | Esc abort execution and exit python kernel |\n" " |------------------------------------------------------------|\n" - " | Mouse: Left-click rotate scene / pick actors |\n" + " | Mouse: Left-click rotate scene / pick objects |\n" " | Middle-click pan scene |\n" " | Right-click zoom scene in or out |\n" " | Cntrl-click rotate scene |\n" diff --git a/vedo/shapes.py b/vedo/shapes.py index 2f8149bf..e9a9b234 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1393,7 +1393,7 @@ def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=Non radius = 2.5 * np.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) locator = vtk.vtkStaticPointLocator() - locator.SetDataSet(mesh) + locator.SetDataSet(mesh.dataset) locator.BuildLocator() if kernel == "gaussian": @@ -1411,7 +1411,7 @@ def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=Non interpolator = vtk.vtkPointInterpolator() interpolator.SetInputData(domain) - interpolator.SetSourceData(mesh) + interpolator.SetSourceData(mesh.dataset) interpolator.SetKernel(kern) interpolator.SetLocator(locator) if null_value is not None: @@ -1530,8 +1530,8 @@ def StreamLines( grid = _interpolate2vol(domain, **extrapolate_to_box) else: grid = domain - elif isinstance(domain, vedo.BaseVolume): - grid = domain + elif isinstance(domain, vedo.Volume): + grid = domain.dataset else: grid = domain @@ -1602,7 +1602,7 @@ def read_points(): output = scalar_surface.GetOutput() if tubes: - radius = tubes.pop("radius", domain.GetLength() / 500) + radius = tubes.pop("radius", domain.diagonal_size() / 500) res = tubes.pop("res", 24) radfact = tubes.pop("max_radius_factor", 10) ratio = tubes.pop("ratio", 1) @@ -4014,6 +4014,7 @@ def __init__(self, name, res=51, n=25, seed=1): super().__init__(pfs.GetOutput()) + if name == "RandomHills": self.shift([0,-10,-2.25]) if name != 'Kuen': self.normalize() if name == 'Dini': self.scale(0.4) if name == 'Enneper': self.scale(0.4) diff --git a/vedo/utils.py b/vedo/utils.py index 0c6d696f..0746eab9 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1644,10 +1644,10 @@ def _print_vtkactor(obj): vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) _print_data(ug, cf) - elif isinstance(obj, (vedo.volume.Volume, vedo.volume.VolumeSlice)): + elif isinstance(obj, vedo.volume.Volume): vedo.printc("Volume".ljust(70), c="b", bold=True, invert=True) - img = obj.GetMapper().GetInput() + img = obj.dataset vedo.printc("origin".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(precision(obj.origin(), 6), c="b", bold=False) @@ -1667,7 +1667,7 @@ def _print_vtkactor(obj): vedo.printc("scalar #bytes".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(img.GetScalarSize(), c="b", bold=False) - bnds = obj.GetBounds() + bnds = obj.bounds() vedo.printc("bounds".ljust(14) + ": ", c="b", bold=True, end="") bx1, bx2 = precision(bnds[0], 4), precision(bnds[1], 4) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="b", bold=False, end="") @@ -1679,7 +1679,7 @@ def _print_vtkactor(obj): vedo.printc("scalar range".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(img.GetScalarRange(), c="b", bold=False) - print_histogram(obj, horizontal=True, logscale=True, bins=8, height=15, c="b", bold=True) + # print_histogram(obj, horizontal=True, logscale=True, bins=8, height=15, c="b", bold=True) elif isinstance(obj, vedo.Plotter) and obj.interactor: # dumps Plotter info axtype = { @@ -1853,7 +1853,7 @@ def print_histogram( isvol = isinstance(data, vtk.vtkVolume) if isimg or isvol: if isvol: - img = data.imagedata() + img = data.dataset else: img = data dims = img.GetDimensions() @@ -2617,38 +2617,30 @@ def vtk_version_at_least(major, minor=0, build=0): return vtk_version_number >= needed_version -def ctf2lut(tvobj, logscale=False): +def ctf2lut(vol, logscale=False): """Internal use.""" # build LUT from a color transfer function for tmesh or volume - pr = tvobj.GetProperty() - # if not isinstance(pr, vtk.vtkVolumeProperty): - # return None - - try: - ctf = pr.GetRGBTransferFunction() - otf = pr.GetScalarOpacity() - x0, x1 = tvobj.inputdata().GetScalarRange() - cols, alphas = [], [] - for x in np.linspace(x0, x1, 256): - cols.append(ctf.GetColor(x)) - alphas.append(otf.GetValue(x)) - - if logscale: - lut = vtk.vtkLogLookupTable() - else: - lut = vtk.vtkLookupTable() - - lut.SetRange(x0, x1) - lut.SetNumberOfTableValues(len(cols)) - for i, col in enumerate(cols): - r, g, b = col - lut.SetTableValue(i, r, g, b, alphas[i]) - lut.Build() - return lut + ctf = vol.property.GetRGBTransferFunction() + otf = vol.property.GetScalarOpacity() + x0, x1 = vol.dataset.GetScalarRange() + cols, alphas = [], [] + for x in np.linspace(x0, x1, 256): + cols.append(ctf.GetColor(x)) + alphas.append(otf.GetValue(x)) - except AttributeError: - return None + if logscale: + lut = vtk.vtkLogLookupTable() + else: + lut = vtk.vtkLookupTable() + + lut.SetRange(x0, x1) + lut.SetNumberOfTableValues(len(cols)) + for i, col in enumerate(cols): + r, g, b = col + lut.SetTableValue(i, r, g, b, alphas[i]) + lut.Build() + return lut def get_vtk_name_event(name): diff --git a/vedo/visual.py b/vedo/visual.py index 57471974..cf0437d5 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -325,7 +325,6 @@ def color(self, col, alpha=None, vmin=None, vmax=None): _, vmax = self.dataset.GetScalarRange() ctf = self.property.GetRGBTransferFunction() ctf.RemoveAllPoints() - self._color = col if utils.is_sequence(col): if utils.is_sequence(col[0]) and len(col[0]) == 2: @@ -384,7 +383,6 @@ def alpha(self, alpha, vmin=None, vmax=None): _, vmax = self.dataset.GetScalarRange() otf = self.property.GetScalarOpacity() otf.RemoveAllPoints() - self._alpha = alpha if utils.is_sequence(alpha): alpha = np.array(alpha) @@ -460,7 +458,6 @@ def color(self, c=False, alpha=None): If None is passed as input, will use colors from active scalars. Same as `mesh.c()`. """ - # overrides base.color() if c is False: return np.array(self.property.GetColor()) if c is None: @@ -1884,6 +1881,8 @@ def lc(self, linecolor=None): ######################################################################################## class VolumeVisual(CommonVisual): + """Class to manage the visual aspects of a ``Volume`` object.""" + def alpha_unit(self, u=None): """ Defines light attenuation per unit length. Default is 1. @@ -1899,6 +1898,213 @@ def alpha_unit(self, u=None): self.property.SetScalarOpacityUnitDistance(u) return self + def alpha_gradient(self, alpha_grad, vmin=None, vmax=None): + """ + Assign a set of tranparencies to a volume's gradient + along the range of the scalar value. + A single constant value can also be assigned. + The gradient function is used to decrease the opacity + in the "flat" regions of the volume while maintaining the opacity + at the boundaries between material types. The gradient is measured + as the amount by which the intensity changes over unit distance. + + The format for alpha_grad is the same as for method `volume.alpha()`. + """ + if vmin is None: + vmin, _ = self.dataset.GetScalarRange() + if vmax is None: + _, vmax = self.dataset.GetScalarRange() + + if alpha_grad is None: + self.property.DisableGradientOpacityOn() + return self + + self.property.DisableGradientOpacityOff() + + gotf = self.property.GetGradientOpacity() + if utils.is_sequence(alpha_grad): + alpha_grad = np.array(alpha_grad) + if len(alpha_grad.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) + for i, al in enumerate(alpha_grad): + xalpha = vmin + (vmax - vmin) * i / (len(alpha_grad) - 1) + # Create transfer mapping scalar value to gradient opacity + gotf.AddPoint(xalpha, al) + elif len(alpha_grad.shape) == 2: # user passing [(x0,alpha0), ...] + gotf.AddPoint(vmin, alpha_grad[0][1]) + for xalpha, al in alpha_grad: + # Create transfer mapping scalar value to opacity + gotf.AddPoint(xalpha, al) + gotf.AddPoint(vmax, alpha_grad[-1][1]) + # print("alpha_grad at", round(xalpha, 1), "\tset to", al) + else: + gotf.AddPoint(vmin, alpha_grad) # constant alpha_grad + gotf.AddPoint(vmax, alpha_grad) + return self + + def cmap(self, c, alpha=None, vmin=None, vmax=None): + """Same as `color()`. + + Arguments: + alpha : (list) + use a list to specify transparencies along the scalar range + vmin : (float) + force the min of the scalar range to be this value + vmax : (float) + force the max of the scalar range to be this value + """ + return self.color(c, alpha, vmin, vmax) + + def jittering(self, status=None): + """ + If `True`, each ray traversal direction will be perturbed slightly + using a noise-texture to get rid of wood-grain effects. + """ + if hasattr(self.mapper, "SetUseJittering"): # tetmesh doesnt have it + if status is None: + return self.mapper.GetUseJittering() + self.mapper.SetUseJittering(status) + return self + + def hide_voxels(self, ids): + """ + Hide voxels (cells) from visualization. + + Example: + ```python + from vedo import * + embryo = Volume(dataurl+'embryo.tif') + embryo.hide_voxels(list(range(10000))) + show(embryo, axes=1).close() + ``` + + See also: + `volume.mask()` + """ + ghost_mask = np.zeros(self.ncells, dtype=np.uint8) + ghost_mask[ids] = vtk.vtkDataSetAttributes.HIDDENCELL + name = vtk.vtkDataSetAttributes.GhostArrayName() + garr = utils.numpy2vtk(ghost_mask, name=name, dtype=np.uint8) + self.dataset.GetCellData().AddArray(garr) + self.dataset.GetCellData().Modified() + return self + + + def mode(self, mode=None): + """ + Define the volumetric rendering mode following this: + - 0, composite rendering + - 1, maximum projection rendering + - 2, minimum projection rendering + - 3, average projection rendering + - 4, additive mode + + The default mode is "composite" where the scalar values are sampled through + the volume and composited in a front-to-back scheme through alpha blending. + The final color and opacity is determined using the color and opacity transfer + functions specified in alpha keyword. + + Maximum and minimum intensity blend modes use the maximum and minimum + scalar values, respectively, along the sampling ray. + The final color and opacity is determined by passing the resultant value + through the color and opacity transfer functions. + + Additive blend mode accumulates scalar values by passing each value + through the opacity transfer function and then adding up the product + of the value and its opacity. In other words, the scalar values are scaled + using the opacity transfer function and summed to derive the final color. + Note that the resulting image is always grayscale i.e. aggregated values + are not passed through the color transfer function. + This is because the final value is a derived value and not a real data value + along the sampling ray. + + Average intensity blend mode works similar to the additive blend mode where + the scalar values are multiplied by opacity calculated from the opacity + transfer function and then added. + The additional step here is to divide the sum by the number of samples + taken through the volume. + As is the case with the additive intensity projection, the final image will + always be grayscale i.e. the aggregated values are not passed through the + color transfer function. + """ + if mode is None: + return self.mapper.GetBlendMode() + + if isinstance(mode, str): + if "comp" in mode: + mode = 0 + elif "proj" in mode: + if "max" in mode: + mode = 1 + elif "min" in mode: + mode = 2 + elif "ave" in mode: + mode = 3 + else: + vedo.logger.warning(f"unknown mode {mode}") + mode = 0 + elif "add" in mode: + mode = 4 + else: + vedo.logger.warning(f"unknown mode {mode}") + mode = 0 + + self.mapper.SetBlendMode(mode) + return self + + def shade(self, status=None): + """ + Set/Get the shading of a Volume. + Shading can be further controlled with `volume.lighting()` method. + + If shading is turned on, the mapper may perform shading calculations. + In some cases shading does not apply + (for example, in maximum intensity projection mode). + """ + if status is None: + return self.property.GetShade() + self.property.SetShade(status) + return self + + + def mask(self, data): + """ + Mask a volume visualization with a binary value. + Needs to specify keyword mapper='gpu'. + + Example: + ```python + from vedo import np, Volume, show + data_matrix = np.zeros([75, 75, 75], dtype=np.uint8) + # all voxels have value zero except: + data_matrix[0:35, 0:35, 0:35] = 1 + data_matrix[35:55, 35:55, 35:55] = 2 + data_matrix[55:74, 55:74, 55:74] = 3 + vol = Volume(data_matrix, c=['white','b','g','r'], mapper='gpu') + data_mask = np.zeros_like(data_matrix) + data_mask[10:65, 10:45, 20:75] = 1 + vol.mask(data_mask) + show(vol, axes=1).close() + ``` + See also: + `volume.hide_voxels()` + """ + mask = Volume(data.astype(np.uint8)) + try: + self.mapper.SetMaskTypeToBinary() + self.mapper.SetMaskInput(mask.dataset) + except AttributeError: + vedo.logger.error("volume.mask() must create the volume with Volume(..., mapper='gpu')") + return self + + def interpolation(self, itype): + """ + Set interpolation type. + + 0=nearest neighbour, 1=linear + """ + self.property.SetInterpolationType(itype) + return self + ######################################################################################## class ActorTransforms: @@ -1972,11 +2178,11 @@ def shift(self, dp): def scale(self, s=None, absolute=False): """Set/get scaling factor.""" if s is None: - return self.actor.GetScale() + return np.array(self.actor.GetScale()) if absolute: self.actor.SetScale(s, s, s) else: - self.actor.SetScale(self.GetScale() * s) + self.actor.SetScale(np.array(self.actor.GetScale()) * s) return self diff --git a/vedo/volume.py b/vedo/volume.py index a442b528..91c6e95f 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -12,6 +12,7 @@ from vedo import utils from vedo.mesh import Mesh from vedo.core import VolumeAlgorithms +from vedo.visual import VolumeVisual __docformat__ = "google" @@ -22,22 +23,232 @@ ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) """ -__all__ = ["BaseVolume", "Volume", "VolumeSlice"] +__all__ = ["Volume"] ########################################################################## -class BaseVolume: +class Volume(VolumeVisual, VolumeAlgorithms): """ - Base class. Do not instantiate. + Class to describe dataset that are defined on "voxels": + the 3D equivalent of 2D pixels. """ - def __init__(self): - """Base class. Do not instantiate.""" + def __init__( + self, + inputobj=None, + c="RdBu_r", + alpha=(0.0, 0.0, 0.2, 0.4, 0.8, 1.0), + alpha_gradient=None, + alpha_unit=1, + mode=0, + spacing=None, + dims=None, + origin=None, + mapper="smart", + ): + """ + This class can be initialized with a numpy object, a `vtkImageData` + or a list of 2D bmp files. + + Arguments: + c : (list, str) + sets colors along the scalar range, or a matplotlib color map name + alphas : (float, list) + sets transparencies along the scalar range + alpha_unit : (float) + low values make composite rendering look brighter and denser + origin : (list) + set volume origin coordinates + spacing : (list) + voxel dimensions in x, y and z. + dims : (list) + specify the dimensions of the volume. + mapper : (str) + either 'gpu', 'opengl_gpu', 'fixed' or 'smart' + mode : (int) + define the volumetric rendering style: + - 0, composite rendering + - 1, maximum projection + - 2, minimum projection + - 3, average projection + - 4, additive mode + +
The default mode is "composite" where the scalar values are sampled through + the volume and composited in a front-to-back scheme through alpha blending. + The final color and opacity is determined using the color and opacity transfer + functions specified in alpha keyword. + + Maximum and minimum intensity blend modes use the maximum and minimum + scalar values, respectively, along the sampling ray. + The final color and opacity is determined by passing the resultant value + through the color and opacity transfer functions. + + Additive blend mode accumulates scalar values by passing each value + through the opacity transfer function and then adding up the product + of the value and its opacity. In other words, the scalar values are scaled + using the opacity transfer function and summed to derive the final color. + Note that the resulting image is always grayscale i.e. aggregated values + are not passed through the color transfer function. + This is because the final value is a derived value and not a real data value + along the sampling ray. + + Average intensity blend mode works similar to the additive blend mode where + the scalar values are multiplied by opacity calculated from the opacity + transfer function and then added. + The additional step here is to divide the sum by the number of samples + taken through the volume. + As is the case with the additive intensity projection, the final image will + always be grayscale i.e. the aggregated values are not passed through the + color transfer function. + + Example: + ```python + from vedo import Volume + vol = Volume("path/to/mydata/rec*.bmp") + vol.show() + ``` + + Examples: + - [numpy2volume1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume1.py) + + ![](https://vedo.embl.es/images/volumetric/numpy2volume1.png) + + - [read_volume2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/read_volume2.py) + + ![](https://vedo.embl.es/images/volumetric/read_volume2.png) - self._data = None - self._mapper = None - self.transform = None + .. note:: + if a `list` of values is used for `alphas` this is interpreted + as a transfer function along the range of the scalar. + """ + self.actor = vtk.vtkVolume() + self.actor.data = self + self.property = self.actor.GetProperty() + self.dataset = None + self.mapper = None self.pipeline = None + self.info = {} + + ################### + if isinstance(inputobj, str): + if "https://" in inputobj: + inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath + elif os.path.isfile(inputobj): + pass + else: + inputobj = sorted(glob.glob(inputobj)) + + ################### + if "gpu" in mapper: + self.mapper = vtk.vtkGPUVolumeRayCastMapper() + elif "opengl_gpu" in mapper: + self.mapper = vtk.vtkOpenGLGPUVolumeRayCastMapper() + elif "smart" in mapper: + self.mapper = vtk.vtkSmartVolumeMapper() + elif "fixed" in mapper: + self.mapper = vtk.vtkFixedPointVolumeRayCastMapper() + elif isinstance(mapper, vtk.vtkMapper): + self.mapper = mapper + else: + print("Error unknown mapper type", [mapper]) + raise RuntimeError() + + self.actor.SetMapper(self.mapper) + + ################### + inputtype = str(type(inputobj)) + + # print('Volume inputtype', inputtype, c='b') + + if inputobj is None: + img = vtk.vtkImageData() + + elif utils.is_sequence(inputobj): + + if isinstance(inputobj[0], str) and ".bmp" in inputobj[0].lower(): + # scan sequence of BMP files + ima = vtk.vtkImageAppend() + ima.SetAppendAxis(2) + pb = utils.ProgressBar(0, len(inputobj)) + for i in pb.range(): + f = inputobj[i] + if "_rec_spr.bmp" in f: + continue + picr = vtk.vtkBMPReader() + picr.SetFileName(f) + picr.Update() + mgf = vtk.vtkImageMagnitude() + mgf.SetInputData(picr.GetOutput()) + mgf.Update() + ima.AddInputData(mgf.GetOutput()) + pb.print("loading...") + ima.Update() + img = ima.GetOutput() + + else: + + if len(inputobj.shape) == 1: + varr = utils.numpy2vtk(inputobj) + else: + varr = utils.numpy2vtk(inputobj.ravel(order="F")) + varr.SetName("input_scalars") + + img = vtk.vtkImageData() + if dims is not None: + img.SetDimensions(dims[2], dims[1], dims[0]) + else: + if len(inputobj.shape) == 1: + vedo.logger.error("must set dimensions (dims keyword) in Volume") + raise RuntimeError() + img.SetDimensions(inputobj.shape) + img.GetPointData().AddArray(varr) + img.GetPointData().SetActiveScalars(varr.GetName()) + + elif isinstance(inputobj, vtk.vtkImageData): + img = inputobj + + elif isinstance(inputobj, str): + if "https://" in inputobj: + inputobj = vedo.file_io.download(inputobj, verbose=False) + img = vedo.file_io.loadImageData(inputobj) + + else: + vedo.logger.error(f"cannot understand input type {inputtype}") + return + + if dims is not None: + img.SetDimensions(dims) + + if origin is not None: + img.SetOrigin(origin) ### DIFFERENT from volume.origin()! + + if spacing is not None: + img.SetSpacing(spacing) + + self.dataset = img + self.mapper.SetInputData(img) + + if img.GetPointData().GetScalars(): + if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: + self.mode(mode).color(c).alpha(alpha).alpha_gradient(alpha_gradient) + self.property.SetShade(True) + self.property.SetInterpolationType(1) + self.property.SetScalarOpacityUnitDistance(alpha_unit) + + + self.pipeline = utils.OperationNode( + "Volume", comment=f"dims={tuple(self.dimensions())}", c="#4cc9f0" + ) + ####################################################################### + + def _update(self, data): + self.dataset = data + self.mapper.SetInputData(data) + self.dataset.GetPointData().Modified() + self.mapper.Modified() + self.mapper.Update() + return self + def _repr_html_(self): """ @@ -81,15 +292,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = "
" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = "" img = self.GetMapper().GetInput() @@ -121,99 +332,281 @@ def _repr_html_(self): ] return "\n".join(allt) - def _update(self, img): - self._data = img - self._data.GetPointData().Modified() - self._mapper.SetInputData(img) - self._mapper.Modified() - self._mapper.Update() - return self - def clone(self): """Return a clone copy of the Volume.""" newimg = vtk.vtkImageData() - newimg.CopyStructure(self._data) - newimg.CopyAttributes(self._data) + newimg.CopyStructure(self.dataset) + newimg.CopyAttributes(self.dataset) newvol = Volume(newimg) + prop = vtk.vtkVolumeProperty() - prop.DeepCopy(self.GetProperty()) - newvol.SetProperty(prop) - newvol.SetOrigin(self.GetOrigin()) - newvol.SetScale(self.GetScale()) - newvol.SetOrientation(self.GetOrientation()) - newvol.SetPosition(self.GetPosition()) + prop.DeepCopy(self.property) + newvol.actor.SetProperty(prop) + newvol.property = prop + newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol + + def component_weight(self, i, weight): + """Set the scalar component weight in range [0,1].""" + self.property.SetComponentWeight(i, weight) + return self - def imagedata(self): - """Return the underlying `vtkImagaData` object.""" - return self._data - - def tonumpy(self): - """ - Get read-write access to voxels of a Volume object as a numpy array. + def xslice(self, i): + """Extract the slice at index `i` of volume along x-axis.""" + vslice = vtk.vtkImageDataGeometryFilter() + vslice.SetInputData(self.dataset) + nx, ny, nz = self.dataset.GetDimensions() + if i > nx - 1: + i = nx - 1 + vslice.SetExtent(i, i, 0, ny, 0, nz) + vslice.Update() + m = Mesh(vslice.GetOutput()) + m.pipeline = utils.OperationNode(f"xslice {i}", parents=[self], c="#4cc9f0:#e9c46a") + return m - When you set values in the output image, you don't want numpy to reallocate the array - but instead set values in the existing array, so use the [:] operator. + def yslice(self, j): + """Extract the slice at index `j` of volume along y-axis.""" + vslice = vtk.vtkImageDataGeometryFilter() + vslice.SetInputData(self.dataset) + nx, ny, nz = self.dataset.GetDimensions() + if j > ny - 1: + j = ny - 1 + vslice.SetExtent(0, nx, j, j, 0, nz) + vslice.Update() + m = Mesh(vslice.GetOutput()) + m.pipeline = utils.OperationNode(f"yslice {j}", parents=[self], c="#4cc9f0:#e9c46a") + return m - Example: - `arr[:] = arr*2 + 15` + def zslice(self, k): + """Extract the slice at index `i` of volume along z-axis.""" + vslice = vtk.vtkImageDataGeometryFilter() + vslice.SetInputData(self.dataset) + nx, ny, nz = self.dataset.GetDimensions() + if k > nz - 1: + k = nz - 1 + vslice.SetExtent(0, nx, 0, ny, k, k) + vslice.Update() + m = Mesh(vslice.GetOutput()) + m.pipeline = utils.OperationNode(f"zslice {k}", parents=[self], c="#4cc9f0:#e9c46a") + return m - If the array is modified add a call to: - `volume.imagedata().GetPointData().GetScalars().Modified()` - when all your modifications are completed. + def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): """ - narray_shape = tuple(reversed(self._data.GetDimensions())) - - scals = self._data.GetPointData().GetScalars() - comps = scals.GetNumberOfComponents() - if comps == 1: - narray = utils.vtk2numpy(scals).reshape(narray_shape) - narray = np.transpose(narray, axes=[2, 1, 0]) - else: - narray = utils.vtk2numpy(scals).reshape(*narray_shape, comps) - narray = np.transpose(narray, axes=[2, 1, 0, 3]) + Extract the slice along a given plane position and normal. - # narray = utils.vtk2numpy(self._data.GetPointData().GetScalars()).reshape(narray_shape) - # narray = np.transpose(narray, axes=[2, 1, 0]) + Example: + - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) + + ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) + """ + reslice = vtk.vtkImageReslice() + reslice.SetInputData(self.dataset) + reslice.SetOutputDimensionality(2) + newaxis = utils.versor(normal) + pos = np.array(origin) + initaxis = (0, 0, 1) + crossvec = np.cross(initaxis, newaxis) + angle = np.arccos(np.dot(initaxis, newaxis)) + T = vtk.vtkTransform() + T.PostMultiply() + T.RotateWXYZ(np.rad2deg(angle), crossvec) + T.Translate(pos) + M = T.GetMatrix() + reslice.SetResliceAxes(M) + reslice.SetInterpolationModeToLinear() + reslice.SetAutoCropOutput(not autocrop) + reslice.Update() + vslice = vtk.vtkImageDataGeometryFilter() + vslice.SetInputData(reslice.GetOutput()) + vslice.Update() + msh = Mesh(vslice.GetOutput()) + # msh.SetOrientation(T.GetOrientation()) + # msh.SetPosition(pos) + msh.apply_transform(T) + msh.pipeline = utils.OperationNode("slice_plane", parents=[self], c="#4cc9f0:#e9c46a") + return msh + + def warp(self, source, target, sigma=1, mode="3d", fit=False): + """ + Warp volume scalars within a Volume by specifying + source and target sets of points. + + Arguments: + source : (Points, list) + the list of source points + target : (Points, list) + the list of target points + fit : (bool) + fit/adapt the old bounding box to the warped geometry + """ + if isinstance(source, vedo.Points): + source = source.vertices + if isinstance(target, vedo.Points): + target = target.vertices + + ns = len(source) + ptsou = vtk.vtkPoints() + ptsou.SetNumberOfPoints(ns) + for i in range(ns): + ptsou.SetPoint(i, source[i]) + + nt = len(target) + if ns != nt: + vedo.logger.error(f"#source {ns} != {nt} #target points") + raise RuntimeError() + + pttar = vtk.vtkPoints() + pttar.SetNumberOfPoints(nt) + for i in range(ns): + pttar.SetPoint(i, target[i]) + + T = vtk.vtkThinPlateSplineTransform() + if mode.lower() == "3d": + T.SetBasisToR() + elif mode.lower() == "2d": + T.SetBasisToR2LogR() + else: + vedo.logger.error(f"unknown mode {mode}") + raise RuntimeError() + + T.SetSigma(sigma) + T.SetSourceLandmarks(ptsou) + T.SetTargetLandmarks(pttar) + T.Inverse() + self.apply_transform(T, fit=fit) + self.pipeline = utils.OperationNode("warp", parents=[self], c="#4cc9f0") + return self + + def apply_transform(self, T, fit=False): + """ + Apply a transform to the scalars in the volume. + + Arguments: + T : (vtkTransform, matrix) + The transformation to be applied + fit : (bool) + fit/adapt the old bounding box to the warped geometry + """ + if isinstance(T, vtk.vtkMatrix4x4): + tr = vtk.vtkTransform() + tr.SetMatrix(T) + T = tr + + elif utils.is_sequence(T): + M = vtk.vtkMatrix4x4() + n = len(T[0]) + for i in range(n): + for j in range(n): + M.SetElement(i, j, T[i][j]) + tr = vtk.vtkTransform() + tr.SetMatrix(M) + T = tr + + reslice = vtk.vtkImageReslice() + reslice.SetInputData(self.dataset) + reslice.SetResliceTransform(T) + reslice.SetOutputDimensionality(3) + reslice.SetInterpolationModeToLinear() + + spacing = self.dataset.GetSpacing() + origin = self.dataset.GetOrigin() + + if fit: + bb = self.box() + if isinstance(T, vtk.vtkThinPlateSplineTransform): + TI = vtk.vtkThinPlateSplineTransform() + TI.DeepCopy(T) + TI.Inverse() + else: + TI = vtk.vtkTransform() + TI.DeepCopy(T) + bb.apply_transform(TI) + bounds = bb.bounds() + bounds = ( + bounds[0] / spacing[0], + bounds[1] / spacing[0], + bounds[2] / spacing[1], + bounds[3] / spacing[1], + bounds[4] / spacing[2], + bounds[5] / spacing[2], + ) + bounds = np.round(bounds).astype(int) + reslice.SetOutputExtent(bounds) + reslice.SetOutputSpacing(spacing[0], spacing[1], spacing[2]) + reslice.SetOutputOrigin(origin[0], origin[1], origin[2]) + + reslice.Update() + self._update(reslice.GetOutput()) + self.pipeline = utils.OperationNode("apply_transform", parents=[self], c="#4cc9f0") + return self + + def imagedata(self): + """Return the underlying `vtkImagaData` object.""" + print("Volume.dataset is deprecated, use Volume.dataset instead") + return self.dataset + + def tonumpy(self): + """ + Get read-write access to voxels of a Volume object as a numpy array. + + When you set values in the output image, you don't want numpy to reallocate the array + but instead set values in the existing array, so use the [:] operator. + + Example: + `arr[:] = arr*2 + 15` + + If the array is modified add a call to: + `volume.dataset.GetPointData().GetScalars().Modified()` + when all your modifications are completed. + """ + narray_shape = tuple(reversed(self.dataset.GetDimensions())) + + scals = self.dataset.GetPointData().GetScalars() + comps = scals.GetNumberOfComponents() + if comps == 1: + narray = utils.vtk2numpy(scals).reshape(narray_shape) + narray = np.transpose(narray, axes=[2, 1, 0]) + else: + narray = utils.vtk2numpy(scals).reshape(*narray_shape, comps) + narray = np.transpose(narray, axes=[2, 1, 0, 3]) + + # narray = utils.vtk2numpy(self.dataset.GetPointData().GetScalars()).reshape(narray_shape) + # narray = np.transpose(narray, axes=[2, 1, 0]) return narray def dimensions(self): """Return the nr. of voxels in the 3 dimensions.""" - return np.array(self._data.GetDimensions()) + return np.array(self.dataset.GetDimensions()) def scalar_range(self): """Return the range of the scalar values.""" - return np.array(self._data.GetScalarRange()) + return np.array(self.dataset.GetScalarRange()) def spacing(self, s=None): """Set/get the voxels size in the 3 dimensions.""" if s is not None: - self._data.SetSpacing(s) + self.dataset.SetSpacing(s) return self - return np.array(self._data.GetSpacing()) - - # def pos(self, p=None): # conflicts with API of base.x() - # """Same effect as calling `origin()`.""" - # return self.origin(p) + return np.array(self.dataset.GetSpacing()) def origin(self, s=None): """Set/get the origin of the volumetric dataset.""" ### supersedes base.origin() ### DIFFERENT from base.origin()! if s is not None: - self._data.SetOrigin(s) + self.dataset.SetOrigin(s) return self - return np.array(self._data.GetOrigin()) + return np.array(self.dataset.GetOrigin()) def center(self, p=None): """Set/get the center of the volumetric dataset.""" if p is not None: - self._data.SetCenter(p) + self.dataset.SetCenter(p) return self - return np.array(self._data.GetCenter()) + return np.array(self.dataset.GetCenter()) def permute_axes(self, x, y, z): """ @@ -222,7 +615,7 @@ def permute_axes(self, x, y, z): """ imp = vtk.vtkImagePermute() imp.SetFilteredAxes(x, y, z) - imp.SetInputData(self.imagedata()) + imp.SetInputData(self.dataset) imp.Update() self._update(imp.GetOutput()) self.pipeline = utils.OperationNode( @@ -258,14 +651,6 @@ def resample(self, new_spacing, interpolation=1): ) return self - def interpolation(self, itype): - """ - Set interpolation type. - - 0=nearest neighbour, 1=linear - """ - self.property.SetInterpolationType(itype) - return self def threshold(self, above=None, below=None, replace=None, replace_value=None): """ @@ -274,7 +659,7 @@ def threshold(self, above=None, below=None, replace=None, replace_value=None): and replace them with a new value (default is 0). """ th = vtk.vtkImageThreshold() - th.SetInputData(self.imagedata()) + th.SetInputData(self.dataset) # sanity checks if above is not None and below is not None: @@ -336,12 +721,12 @@ def crop(self, left=None, right=None, back=None, front=None, bottom=None, top=No `vol.crop(VOI=(xmin, xmax, ymin, ymax, zmin, zmax)) # all integers nrs` """ extractVOI = vtk.vtkExtractVOI() - extractVOI.SetInputData(self.imagedata()) + extractVOI.SetInputData(self.dataset) if VOI: extractVOI.SetVOI(VOI) else: - d = self.imagedata().GetDimensions() + d = self.dataset.GetDimensions() bx0, bx1, by0, by1, bz0, bz1 = 0, d[0]-1, 0, d[1]-1, 0, d[2]-1 if left is not None: bx0 = int((d[0]-1)*left) if right is not None: bx1 = int((d[0]-1)*(1-right)) @@ -385,14 +770,14 @@ def append(self, volumes, axis="z", preserve_extents=False): ![](https://vedo.embl.es/images/feats/volume_append.png) """ ima = vtk.vtkImageAppend() - ima.SetInputData(self.imagedata()) + ima.SetInputData(self.dataset) if not utils.is_sequence(volumes): volumes = [volumes] for volume in volumes: if isinstance(volume, vtk.vtkImageData): ima.AddInputData(volume) else: - ima.AddInputData(volume.imagedata()) + ima.AddInputData(volume.dataset) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 @@ -433,9 +818,9 @@ def pad(self, voxels=10, value=0): ``` ![](https://vedo.embl.es/images/volumetric/volume_pad.png) """ - x0, x1, y0, y1, z0, z1 = self._data.GetExtent() + x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() pf = vtk.vtkImageConstantPad() - pf.SetInputData(self._data) + pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(voxels): pf.SetOutputWholeExtent( @@ -458,17 +843,17 @@ def pad(self, voxels=10, value=0): def resize(self, *newdims): """Increase or reduce the number of voxels of a Volume with interpolation.""" - old_dims = np.array(self.imagedata().GetDimensions()) - old_spac = np.array(self.imagedata().GetSpacing()) + old_dims = np.array(self.dataset.GetDimensions()) + old_spac = np.array(self.dataset.GetSpacing()) rsz = vtk.vtkImageResize() rsz.SetResizeMethodToOutputDimensions() - rsz.SetInputData(self.imagedata()) + rsz.SetInputData(self.dataset) rsz.SetOutputDimensions(newdims) rsz.Update() - self._data = rsz.GetOutput() + self.dataset = rsz.GetOutput() new_spac = old_spac * old_dims / newdims # keep aspect ratio - self._data.SetSpacing(new_spac) - self._update(self._data) + self.dataset.SetSpacing(new_spac) + self._update(self.dataset) self.pipeline = utils.OperationNode( "resize", parents=[self], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}" ) @@ -477,7 +862,7 @@ def resize(self, *newdims): def normalize(self): """Normalize that scalar components for each point.""" norm = vtk.vtkImageNormalize() - norm.SetInputData(self.imagedata()) + norm.SetInputData(self.dataset) norm.Update() self._update(norm.GetOutput()) self.pipeline = utils.OperationNode("normalize", parents=[self], c="#4cc9f0") @@ -487,7 +872,7 @@ def mirror(self, axis="x"): """ Mirror flip along one of the cartesian axes. """ - img = self.imagedata() + img = self.dataset ff = vtk.vtkImageFlip() ff.SetInputData(img) @@ -521,7 +906,7 @@ def operation(self, operation, volume2=None): - [volume_operations.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volume_operations.py) """ op = operation.lower() - image1 = self._data + image1 = self.dataset mf = None if op in ["median"]: @@ -533,7 +918,7 @@ def operation(self, operation, volume2=None): elif op in ["dot", "dotproduct"]: mf = vtk.vtkImageDotProduct() mf.SetInput1Data(image1) - mf.SetInput2Data(volume2.imagedata()) + mf.SetInput2Data(volume2.dataset) elif op in ["grad", "gradient"]: mf = vtk.vtkImageGradient() mf.SetDimensionality(3) @@ -565,7 +950,7 @@ def operation(self, operation, volume2=None): mat.SetConstantC(K) elif volume2 is not None: # assume image2 is a constant value - mat.SetInput2Data(volume2.imagedata()) + mat.SetInput2Data(volume2.dataset) # ########################### if op in ["+", "add", "plus"]: @@ -651,7 +1036,7 @@ def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtk.vtkImageFFT() - fft.SetInputData(self._data) + fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() @@ -697,7 +1082,7 @@ def smooth_gaussian(self, sigma=(2, 2, 2), radius=None): """ gsf = vtk.vtkImageGaussianSmooth() gsf.SetDimensionality(3) - gsf.SetInputData(self.imagedata()) + gsf.SetInputData(self.dataset) if utils.is_sequence(sigma): gsf.SetStandardDeviations(sigma) else: @@ -718,7 +1103,7 @@ def smooth_median(self, neighbours=(2, 2, 2)): from a rectangular neighborhood around that pixel. """ imgm = vtk.vtkImageMedian3D() - imgm.SetInputData(self.imagedata()) + imgm.SetInputData(self.dataset) if utils.is_sequence(neighbours): imgm.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) else: @@ -739,7 +1124,7 @@ def erode(self, neighbours=(2, 2, 2)): ![](https://vedo.embl.es/images/volumetric/erode_dilate.png) """ ver = vtk.vtkImageContinuousErode3D() - ver.SetInputData(self._data) + ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) @@ -757,7 +1142,7 @@ def dilate(self, neighbours=(2, 2, 2)): - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) """ ver = vtk.vtkImageContinuousDilate3D() - ver.SetInputData(self._data) + ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) @@ -767,7 +1152,7 @@ def dilate(self, neighbours=(2, 2, 2)): def magnitude(self): """Colapses components with magnitude function.""" imgm = vtk.vtkImageMagnitude() - imgm.SetInputData(self.imagedata()) + imgm.SetInputData(self.dataset) imgm.Update() self._update(imgm.GetOutput()) self.pipeline = utils.OperationNode("magnitude", parents=[self], c="#4cc9f0") @@ -783,7 +1168,7 @@ def topoints(self): - [vol2points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/vol2points.py) """ v2p = vtk.vtkImageToPoints() - v2p.SetInputData(self.imagedata()) + v2p.SetInputData(self.dataset) v2p.Update() mpts = vedo.Points(v2p.GetOutput()) mpts.pipeline = utils.OperationNode("topoints", parents=[self], c="#4cc9f0:#e9c46a") @@ -809,7 +1194,7 @@ def euclidean_distance(self, anisotropy=False, max_distance=None): - [euclidian_dist.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/euclidian_dist.py) """ euv = vtk.vtkImageEuclideanDistance() - euv.SetInputData(self._data) + euv.SetInputData(self.dataset) euv.SetConsiderAnisotropy(anisotropy) if max_distance is not None: euv.InitializeOn() @@ -830,8 +1215,8 @@ def correlation_with(self, vol2, dim=2): The second input is considered the correlation kernel. """ imc = vtk.vtkImageCorrelation() - imc.SetInput1Data(self._data) - imc.SetInput2Data(vol2.imagedata()) + imc.SetInput1Data(self.dataset) + imc.SetInput2Data(vol2.dataset) imc.SetDimensionality(dim) imc.Update() vol = Volume(imc.GetOutput()) @@ -842,7 +1227,7 @@ def correlation_with(self, vol2, dim=2): def scale_voxels(self, scale=1): """Scale the voxel content by factor `scale`.""" rsl = vtk.vtkImageReslice() - rsl.SetInputData(self.imagedata()) + rsl.SetInputData(self.dataset) rsl.SetScalarScale(scale) rsl.Update() self._update(rsl.GetOutput()) @@ -852,923 +1237,3 @@ def scale_voxels(self, scale=1): return self -########################################################################## -class Volume(BaseVolume, vtk.vtkVolume): - """ - Class to describe dataset that are defined on "voxels": - the 3D equivalent of 2D pixels. - """ - - def __init__( - self, - inputobj=None, - c="RdBu_r", - alpha=(0.0, 0.0, 0.2, 0.4, 0.8, 1.0), - alpha_gradient=None, - alpha_unit=1, - mode=0, - spacing=None, - dims=None, - origin=None, - mapper="smart", - ): - """ - This class can be initialized with a numpy object, a `vtkImageData` - or a list of 2D bmp files. - - Arguments: - c : (list, str) - sets colors along the scalar range, or a matplotlib color map name - alphas : (float, list) - sets transparencies along the scalar range - alpha_unit : (float) - low values make composite rendering look brighter and denser - origin : (list) - set volume origin coordinates - spacing : (list) - voxel dimensions in x, y and z. - dims : (list) - specify the dimensions of the volume. - mapper : (str) - either 'gpu', 'opengl_gpu', 'fixed' or 'smart' - mode : (int) - define the volumetric rendering style: - - 0, composite rendering - - 1, maximum projection - - 2, minimum projection - - 3, average projection - - 4, additive mode - -
The default mode is "composite" where the scalar values are sampled through - the volume and composited in a front-to-back scheme through alpha blending. - The final color and opacity is determined using the color and opacity transfer - functions specified in alpha keyword. - - Maximum and minimum intensity blend modes use the maximum and minimum - scalar values, respectively, along the sampling ray. - The final color and opacity is determined by passing the resultant value - through the color and opacity transfer functions. - - Additive blend mode accumulates scalar values by passing each value - through the opacity transfer function and then adding up the product - of the value and its opacity. In other words, the scalar values are scaled - using the opacity transfer function and summed to derive the final color. - Note that the resulting image is always grayscale i.e. aggregated values - are not passed through the color transfer function. - This is because the final value is a derived value and not a real data value - along the sampling ray. - - Average intensity blend mode works similar to the additive blend mode where - the scalar values are multiplied by opacity calculated from the opacity - transfer function and then added. - The additional step here is to divide the sum by the number of samples - taken through the volume. - As is the case with the additive intensity projection, the final image will - always be grayscale i.e. the aggregated values are not passed through the - color transfer function. - - Example: - ```python - from vedo import Volume - vol = Volume("path/to/mydata/rec*.bmp") - vol.show() - ``` - - Examples: - - [numpy2volume1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume1.py) - - ![](https://vedo.embl.es/images/volumetric/numpy2volume1.png) - - - [read_volume2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/read_volume2.py) - - ![](https://vedo.embl.es/images/volumetric/read_volume2.png) - - .. note:: - if a `list` of values is used for `alphas` this is interpreted - as a transfer function along the range of the scalar. - """ - super().__init__() - - ################### - if isinstance(inputobj, str): - - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath - elif os.path.isfile(inputobj): - pass - else: - inputobj = sorted(glob.glob(inputobj)) - - ################### - if "gpu" in mapper: - self._mapper = vtk.vtkGPUVolumeRayCastMapper() - elif "opengl_gpu" in mapper: - self._mapper = vtk.vtkOpenGLGPUVolumeRayCastMapper() - elif "smart" in mapper: - self._mapper = vtk.vtkSmartVolumeMapper() - elif "fixed" in mapper: - self._mapper = vtk.vtkFixedPointVolumeRayCastMapper() - elif isinstance(mapper, vtk.vtkMapper): - self._mapper = mapper - else: - print("Error unknown mapper type", [mapper]) - raise RuntimeError() - self.SetMapper(self._mapper) - - ################### - inputtype = str(type(inputobj)) - - # print('Volume inputtype', inputtype, c='b') - - if inputobj is None: - img = vtk.vtkImageData() - - elif utils.is_sequence(inputobj): - - if isinstance(inputobj[0], str) and ".bmp" in inputobj[0].lower(): - # scan sequence of BMP files - ima = vtk.vtkImageAppend() - ima.SetAppendAxis(2) - pb = utils.ProgressBar(0, len(inputobj)) - for i in pb.range(): - f = inputobj[i] - if "_rec_spr.bmp" in f: - continue - picr = vtk.vtkBMPReader() - picr.SetFileName(f) - picr.Update() - mgf = vtk.vtkImageMagnitude() - mgf.SetInputData(picr.GetOutput()) - mgf.Update() - ima.AddInputData(mgf.GetOutput()) - pb.print("loading...") - ima.Update() - img = ima.GetOutput() - - else: - - if len(inputobj.shape) == 1: - varr = utils.numpy2vtk(inputobj) - else: - varr = utils.numpy2vtk(inputobj.ravel(order="F")) - varr.SetName("input_scalars") - - img = vtk.vtkImageData() - if dims is not None: - img.SetDimensions(dims[2], dims[1], dims[0]) - else: - if len(inputobj.shape) == 1: - vedo.logger.error("must set dimensions (dims keyword) in Volume") - raise RuntimeError() - img.SetDimensions(inputobj.shape) - img.GetPointData().AddArray(varr) - img.GetPointData().SetActiveScalars(varr.GetName()) - - elif isinstance(inputobj, vtk.vtkImageData): - img = inputobj - - elif isinstance(inputobj, Volume): - img = inputobj.inputdata() - - elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata - if hasattr(inputobj, "Update"): - inputobj.Update() - img = inputobj.GetOutput() - - elif isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) - img = vedo.file_io.loadImageData(inputobj) - - else: - vedo.logger.error(f"cannot understand input type {inputtype}") - return - - if dims is not None: - img.SetDimensions(dims) - - if origin is not None: - img.SetOrigin(origin) ### DIFFERENT from volume.origin()! - - if spacing is not None: - img.SetSpacing(spacing) - - self._data = img - self._mapper.SetInputData(img) - - if img.GetPointData().GetScalars(): - if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: - self.mode(mode).color(c).alpha(alpha).alpha_gradient(alpha_gradient) - self.GetProperty().SetShade(True) - self.GetProperty().SetInterpolationType(1) - self.GetProperty().SetScalarOpacityUnitDistance(alpha_unit) - - # remember stuff: - self._mode = mode - self._color = c - self._alpha = alpha - self._alpha_grad = alpha_gradient - self._alpha_unit = alpha_unit - - self.pipeline = utils.OperationNode( - "Volume", comment=f"dims={tuple(self.dimensions())}", c="#4cc9f0" - ) - ####################################################################### - - def _update(self, data): - self._data = data - self._data.GetPointData().Modified() - self._mapper.SetInputData(data) - self._mapper.Modified() - self._mapper.Update() - return self - - def mode(self, mode=None): - """ - Define the volumetric rendering mode following this: - - 0, composite rendering - - 1, maximum projection rendering - - 2, minimum projection rendering - - 3, average projection rendering - - 4, additive mode - - The default mode is "composite" where the scalar values are sampled through - the volume and composited in a front-to-back scheme through alpha blending. - The final color and opacity is determined using the color and opacity transfer - functions specified in alpha keyword. - - Maximum and minimum intensity blend modes use the maximum and minimum - scalar values, respectively, along the sampling ray. - The final color and opacity is determined by passing the resultant value - through the color and opacity transfer functions. - - Additive blend mode accumulates scalar values by passing each value - through the opacity transfer function and then adding up the product - of the value and its opacity. In other words, the scalar values are scaled - using the opacity transfer function and summed to derive the final color. - Note that the resulting image is always grayscale i.e. aggregated values - are not passed through the color transfer function. - This is because the final value is a derived value and not a real data value - along the sampling ray. - - Average intensity blend mode works similar to the additive blend mode where - the scalar values are multiplied by opacity calculated from the opacity - transfer function and then added. - The additional step here is to divide the sum by the number of samples - taken through the volume. - As is the case with the additive intensity projection, the final image will - always be grayscale i.e. the aggregated values are not passed through the - color transfer function. - """ - if mode is None: - return self._mapper.GetBlendMode() - - if isinstance(mode, str): - if "comp" in mode: - mode = 0 - elif "proj" in mode: - if "max" in mode: - mode = 1 - elif "min" in mode: - mode = 2 - elif "ave" in mode: - mode = 3 - else: - vedo.logger.warning(f"unknown mode {mode}") - mode = 0 - elif "add" in mode: - mode = 4 - else: - vedo.logger.warning(f"unknown mode {mode}") - mode = 0 - - self._mapper.SetBlendMode(mode) - self._mode = mode - return self - - def shade(self, status=None): - """ - Set/Get the shading of a Volume. - Shading can be further controlled with `volume.lighting()` method. - - If shading is turned on, the mapper may perform shading calculations. - In some cases shading does not apply - (for example, in maximum intensity projection mode). - """ - if status is None: - return self.GetProperty().GetShade() - self.GetProperty().SetShade(status) - return self - - def cmap(self, c, alpha=None, vmin=None, vmax=None): - """Same as `color()`. - - Arguments: - alpha : (list) - use a list to specify transparencies along the scalar range - vmin : (float) - force the min of the scalar range to be this value - vmax : (float) - force the max of the scalar range to be this value - """ - return self.color(c, alpha, vmin, vmax) - - def jittering(self, status=None): - """ - If `True`, each ray traversal direction will be perturbed slightly - using a noise-texture to get rid of wood-grain effects. - """ - if hasattr(self._mapper, "SetUseJittering"): # tetmesh doesnt have it - if status is None: - return self._mapper.GetUseJittering() - self._mapper.SetUseJittering(status) - return self - - def mask(self, data): - """ - Mask a volume visualization with a binary value. - Needs to specify keyword mapper='gpu'. - - Example: - ```python - from vedo import np, Volume, show - data_matrix = np.zeros([75, 75, 75], dtype=np.uint8) - # all voxels have value zero except: - data_matrix[0:35, 0:35, 0:35] = 1 - data_matrix[35:55, 35:55, 35:55] = 2 - data_matrix[55:74, 55:74, 55:74] = 3 - vol = Volume(data_matrix, c=['white','b','g','r'], mapper='gpu') - data_mask = np.zeros_like(data_matrix) - data_mask[10:65, 10:45, 20:75] = 1 - vol.mask(data_mask) - show(vol, axes=1).close() - ``` - See also: - `volume.hide_voxels()` - """ - mask = Volume(data.astype(np.uint8)) - try: - self.mapper().SetMaskTypeToBinary() - self.mapper().SetMaskInput(mask.inputdata()) - except AttributeError: - vedo.logger.error("volume.mask() must create the volume with Volume(..., mapper='gpu')") - return self - - def hide_voxels(self, ids): - """ - Hide voxels (cells) from visualization. - - Example: - ```python - from vedo import * - embryo = Volume(dataurl+'embryo.tif') - embryo.hide_voxels(list(range(10000))) - show(embryo, axes=1).close() - ``` - - See also: - `volume.mask()` - """ - ghost_mask = np.zeros(self.ncells, dtype=np.uint8) - ghost_mask[ids] = vtk.vtkDataSetAttributes.HIDDENCELL - name = vtk.vtkDataSetAttributes.GhostArrayName() - garr = utils.numpy2vtk(ghost_mask, name=name, dtype=np.uint8) - self._data.GetCellData().AddArray(garr) - self._data.GetCellData().Modified() - return self - - def alpha_gradient(self, alpha_grad, vmin=None, vmax=None): - """ - Assign a set of tranparencies to a volume's gradient - along the range of the scalar value. - A single constant value can also be assigned. - The gradient function is used to decrease the opacity - in the "flat" regions of the volume while maintaining the opacity - at the boundaries between material types. The gradient is measured - as the amount by which the intensity changes over unit distance. - - The format for alpha_grad is the same as for method `volume.alpha()`. - """ - if vmin is None: - vmin, _ = self._data.GetScalarRange() - if vmax is None: - _, vmax = self._data.GetScalarRange() - self._alpha_grad = alpha_grad - volumeProperty = self.GetProperty() - - if alpha_grad is None: - volumeProperty.DisableGradientOpacityOn() - return self - - volumeProperty.DisableGradientOpacityOff() - - gotf = volumeProperty.GetGradientOpacity() - if utils.is_sequence(alpha_grad): - alpha_grad = np.array(alpha_grad) - if len(alpha_grad.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) - for i, al in enumerate(alpha_grad): - xalpha = vmin + (vmax - vmin) * i / (len(alpha_grad) - 1) - # Create transfer mapping scalar value to gradient opacity - gotf.AddPoint(xalpha, al) - elif len(alpha_grad.shape) == 2: # user passing [(x0,alpha0), ...] - gotf.AddPoint(vmin, alpha_grad[0][1]) - for xalpha, al in alpha_grad: - # Create transfer mapping scalar value to opacity - gotf.AddPoint(xalpha, al) - gotf.AddPoint(vmax, alpha_grad[-1][1]) - # print("alpha_grad at", round(xalpha, 1), "\tset to", al) - else: - gotf.AddPoint(vmin, alpha_grad) # constant alpha_grad - gotf.AddPoint(vmax, alpha_grad) - return self - - def component_weight(self, i, weight): - """Set the scalar component weight in range [0,1].""" - self.GetProperty().SetComponentWeight(i, weight) - return self - - def xslice(self, i): - """Extract the slice at index `i` of volume along x-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() - vslice.SetInputData(self.imagedata()) - nx, ny, nz = self.imagedata().GetDimensions() - if i > nx - 1: - i = nx - 1 - vslice.SetExtent(i, i, 0, ny, 0, nz) - vslice.Update() - m = Mesh(vslice.GetOutput()) - m.pipeline = utils.OperationNode(f"xslice {i}", parents=[self], c="#4cc9f0:#e9c46a") - return m - - def yslice(self, j): - """Extract the slice at index `j` of volume along y-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() - vslice.SetInputData(self.imagedata()) - nx, ny, nz = self.imagedata().GetDimensions() - if j > ny - 1: - j = ny - 1 - vslice.SetExtent(0, nx, j, j, 0, nz) - vslice.Update() - m = Mesh(vslice.GetOutput()) - m.pipeline = utils.OperationNode(f"yslice {j}", parents=[self], c="#4cc9f0:#e9c46a") - return m - - def zslice(self, k): - """Extract the slice at index `i` of volume along z-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() - vslice.SetInputData(self.imagedata()) - nx, ny, nz = self.imagedata().GetDimensions() - if k > nz - 1: - k = nz - 1 - vslice.SetExtent(0, nx, 0, ny, k, k) - vslice.Update() - m = Mesh(vslice.GetOutput()) - m.pipeline = utils.OperationNode(f"zslice {k}", parents=[self], c="#4cc9f0:#e9c46a") - return m - - def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): - """ - Extract the slice along a given plane position and normal. - - Example: - - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) - - ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) - """ - reslice = vtk.vtkImageReslice() - reslice.SetInputData(self._data) - reslice.SetOutputDimensionality(2) - newaxis = utils.versor(normal) - pos = np.array(origin) - initaxis = (0, 0, 1) - crossvec = np.cross(initaxis, newaxis) - angle = np.arccos(np.dot(initaxis, newaxis)) - T = vtk.vtkTransform() - T.PostMultiply() - T.RotateWXYZ(np.rad2deg(angle), crossvec) - T.Translate(pos) - M = T.GetMatrix() - reslice.SetResliceAxes(M) - reslice.SetInterpolationModeToLinear() - reslice.SetAutoCropOutput(not autocrop) - reslice.Update() - vslice = vtk.vtkImageDataGeometryFilter() - vslice.SetInputData(reslice.GetOutput()) - vslice.Update() - msh = Mesh(vslice.GetOutput()) - msh.SetOrientation(T.GetOrientation()) - msh.SetPosition(pos) - msh.pipeline = utils.OperationNode("slice_plane", parents=[self], c="#4cc9f0:#e9c46a") - return msh - - def warp(self, source, target, sigma=1, mode="3d", fit=False): - """ - Warp volume scalars within a Volume by specifying - source and target sets of points. - - Arguments: - source : (Points, list) - the list of source points - target : (Points, list) - the list of target points - fit : (bool) - fit/adapt the old bounding box to the warped geometry - """ - if isinstance(source, vedo.Points): - source = source.vertices - if isinstance(target, vedo.Points): - target = target.vertices - - ns = len(source) - ptsou = vtk.vtkPoints() - ptsou.SetNumberOfPoints(ns) - for i in range(ns): - ptsou.SetPoint(i, source[i]) - - nt = len(target) - if ns != nt: - vedo.logger.error(f"#source {ns} != {nt} #target points") - raise RuntimeError() - - pttar = vtk.vtkPoints() - pttar.SetNumberOfPoints(nt) - for i in range(ns): - pttar.SetPoint(i, target[i]) - - T = vtk.vtkThinPlateSplineTransform() - if mode.lower() == "3d": - T.SetBasisToR() - elif mode.lower() == "2d": - T.SetBasisToR2LogR() - else: - vedo.logger.error(f"unknown mode {mode}") - raise RuntimeError() - - T.SetSigma(sigma) - T.SetSourceLandmarks(ptsou) - T.SetTargetLandmarks(pttar) - T.Inverse() - self.transform = T - self.apply_transform(T, fit=fit) - self.pipeline = utils.OperationNode("warp", parents=[self], c="#4cc9f0") - return self - - def apply_transform(self, T, fit=False): - """ - Apply a transform to the scalars in the volume. - - Arguments: - T : (vtkTransform, matrix) - The transformation to be applied - fit : (bool) - fit/adapt the old bounding box to the warped geometry - """ - if isinstance(T, vtk.vtkMatrix4x4): - tr = vtk.vtkTransform() - tr.SetMatrix(T) - T = tr - - elif utils.is_sequence(T): - M = vtk.vtkMatrix4x4() - n = len(T[0]) - for i in range(n): - for j in range(n): - M.SetElement(i, j, T[i][j]) - tr = vtk.vtkTransform() - tr.SetMatrix(M) - T = tr - - reslice = vtk.vtkImageReslice() - reslice.SetInputData(self._data) - reslice.SetResliceTransform(T) - reslice.SetOutputDimensionality(3) - reslice.SetInterpolationModeToLinear() - - spacing = self._data.GetSpacing() - origin = self._data.GetOrigin() - - if fit: - bb = self.box() - if isinstance(T, vtk.vtkThinPlateSplineTransform): - TI = vtk.vtkThinPlateSplineTransform() - TI.DeepCopy(T) - TI.Inverse() - else: - TI = vtk.vtkTransform() - TI.DeepCopy(T) - bb.apply_transform(TI) - bounds = bb.GetBounds() - bounds = ( - bounds[0] / spacing[0], - bounds[1] / spacing[0], - bounds[2] / spacing[1], - bounds[3] / spacing[1], - bounds[4] / spacing[2], - bounds[5] / spacing[2], - ) - bounds = np.round(bounds).astype(int) - reslice.SetOutputExtent(bounds) - reslice.SetOutputSpacing(spacing[0], spacing[1], spacing[2]) - reslice.SetOutputOrigin(origin[0], origin[1], origin[2]) - - reslice.Update() - self._update(reslice.GetOutput()) - self.pipeline = utils.OperationNode("apply_transform", parents=[self], c="#4cc9f0") - return self - - -########################################################################## -class VolumeSlice(BaseVolume, VolumeAlgorithms, vtk.vtkImageSlice): - """ - Derived class of `vtkImageSlice`. - """ - - def __init__(self, inputobj=None): - """ - This class is equivalent to `Volume` except for its representation. - The main purpose of this class is to be used in conjunction with `Volume` - for visualization using `mode="image"`. - """ - vtk.vtkImageSlice.__init__(self) - - self._mapper = vtk.vtkImageResliceMapper() - self._mapper.SliceFacesCameraOn() - self._mapper.SliceAtFocalPointOn() - self._mapper.SetAutoAdjustImageQuality(False) - self._mapper.BorderOff() - - self.lut = None - - self.property = vtk.vtkImageProperty() - self.property.SetInterpolationTypeToLinear() - self.SetProperty(self.property) - - ################### - if isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath - elif os.path.isfile(inputobj): - pass - else: - inputobj = sorted(glob.glob(inputobj)) - - ################### - inputtype = str(type(inputobj)) - - if inputobj is None: - img = vtk.vtkImageData() - - if isinstance(inputobj, Volume): - img = inputobj.imagedata() - self.lut = utils.ctf2lut(inputobj) - - elif utils.is_sequence(inputobj): - - if isinstance(inputobj[0], str): # scan sequence of BMP files - ima = vtk.vtkImageAppend() - ima.SetAppendAxis(2) - pb = utils.ProgressBar(0, len(inputobj)) - for i in pb.range(): - f = inputobj[i] - picr = vtk.vtkBMPReader() - picr.SetFileName(f) - picr.Update() - mgf = vtk.vtkImageMagnitude() - mgf.SetInputData(picr.GetOutput()) - mgf.Update() - ima.AddInputData(mgf.GetOutput()) - pb.print("loading...") - ima.Update() - img = ima.GetOutput() - - else: - if "ndarray" not in inputtype: - inputobj = np.array(inputobj) - - if len(inputobj.shape) == 1: - varr = utils.numpy2vtk(inputobj, dtype=float) - else: - if len(inputobj.shape) > 2: - inputobj = np.transpose(inputobj, axes=[2, 1, 0]) - varr = utils.numpy2vtk(inputobj.ravel(order="F"), dtype=float) - varr.SetName("input_scalars") - - img = vtk.vtkImageData() - img.SetDimensions(inputobj.shape) - img.GetPointData().AddArray(varr) - img.GetPointData().SetActiveScalars(varr.GetName()) - - elif "ImageData" in inputtype: - img = inputobj - - elif isinstance(inputobj, Volume): - img = inputobj.inputdata() - - elif "UniformGrid" in inputtype: - img = inputobj - - elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata - if hasattr(inputobj, "Update"): - inputobj.Update() - img = inputobj.GetOutput() - - elif isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) - img = vedo.file_io.loadImageData(inputobj) - - else: - vedo.logger.error(f"cannot understand input type {inputtype}") - return - - self._data = img - self._mapper.SetInputData(img) - self.SetMapper(self._mapper) - - def bounds(self): - """Return the bounding box as [x0,x1, y0,y1, z0,z1]""" - bns = [0, 0, 0, 0, 0, 0] - self.GetBounds(bns) - return bns - - def colorize(self, lut=None, fix_scalar_range=False): - """ - Assign a LUT (Look Up Table) to colorize the slice, leave it `None` - to reuse an existing Volume color map. - Use "bw" for automatic black and white. - """ - if lut is None and self.lut: - self.property.SetLookupTable(self.lut) - elif isinstance(lut, vtk.vtkLookupTable): - self.property.SetLookupTable(lut) - elif lut == "bw": - self.property.SetLookupTable(None) - self.property.SetUseLookupTableScalarRange(fix_scalar_range) - return self - - def alpha(self, value): - """Set opacity to the slice""" - self.property.SetOpacity(value) - return self - - def auto_adjust_quality(self, value=True): - """Automatically reduce the rendering quality for greater speed when interacting""" - self._mapper.SetAutoAdjustImageQuality(value) - return self - - def slab(self, thickness=0, mode=0, sample_factor=2): - """ - Make a thick slice (slab). - - Arguments: - thickness : (float) - set the slab thickness, for thick slicing - mode : (int) - The slab type: - 0 = min - 1 = max - 2 = mean - 3 = sum - sample_factor : (float) - Set the number of slab samples to use as a factor of the number of input slices - within the slab thickness. The default value is 2, but 1 will increase speed - with very little loss of quality. - """ - self._mapper.SetSlabThickness(thickness) - self._mapper.SetSlabType(mode) - self._mapper.SetSlabSampleFactor(sample_factor) - return self - - def face_camera(self, value=True): - """Make the slice always face the camera or not.""" - self._mapper.SetSliceFacesCameraOn(value) - return self - - def jump_to_nearest_slice(self, value=True): - """ - This causes the slicing to occur at the closest slice to the focal point, - instead of the default behavior where a new slice is interpolated between - the original slices. - Nothing happens if the plane is oblique to the original slices.""" - self.SetJumpToNearestSlice(value) - return self - - def fill_background(self, value=True): - """ - Instead of rendering only to the image border, - render out to the viewport boundary with the background color. - The background color will be the lowest color on the lookup - table that is being used for the image.""" - self._mapper.SetBackground(value) - return self - - def lighting(self, window, level, ambient=1.0, diffuse=0.0): - """Assign the values for window and color level.""" - self.property.SetColorWindow(window) - self.property.SetColorLevel(level) - self.property.SetAmbient(ambient) - self.property.SetDiffuse(diffuse) - return self - - - -############################################################################### funcs -# def probe_points(dataset, pts): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars at the specified points in space. - -# Note that a mask is also output with valid/invalid points which can be accessed -# with `mesh.pointdata['vtkValidPointMask']`. - -# Examples: -# - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) - -# ![](https://vedo.embl.es/images/volumetric/probePoints.png) -# """ -# if isinstance(pts, vedo.pointcloud.Points): -# pts = pts.vertices - -# def _readpoints(): -# output = src.GetPolyDataOutput() -# points = vtk.vtkPoints() -# for p in pts: -# x, y, z = p -# points.InsertNextPoint(x, y, z) -# output.SetPoints(points) - -# cells = vtk.vtkCellArray() -# cells.InsertNextCell(len(pts)) -# for i in range(len(pts)): -# cells.InsertCellPoint(i) -# output.SetVerts(cells) - -# src = vtk.vtkProgrammableSource() -# src.SetExecuteMethod(_readpoints) -# src.Update() -# img = dataset -# probeFilter = vtk.vtkProbeFilter() -# probeFilter.SetSourceData(img) -# probeFilter.SetInputConnection(src.GetOutputPort()) -# probeFilter.Update() -# poly = probeFilter.GetOutput() -# pm = vedo.mesh.Mesh(poly) -# pm.name = "ProbePoints" -# pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) -# return pm - - -# def probe_line(dataset, p1, p2, res=100): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars along a line defined by 2 points `p1` and `p2`. - -# Note that a mask is also output with valid/invalid points which can be accessed -# with `mesh.pointdata['vtkValidPointMask']`. - -# Use `res` to set the nr of points along the line - -# Examples: -# - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) -# - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) - -# ![](https://vedo.embl.es/images/volumetric/probeLine2.png) -# """ -# line = vtk.vtkLineSource() -# line.SetResolution(res) -# line.SetPoint1(p1) -# line.SetPoint2(p2) -# probeFilter = vtk.vtkProbeFilter() -# probeFilter.SetSourceData(dataset) -# probeFilter.SetInputConnection(line.GetOutputPort()) -# probeFilter.Update() -# poly = probeFilter.GetOutput() -# lnn = vedo.mesh.Mesh(poly) -# lnn.name = "ProbeLine" -# lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) -# return lnn - - -# def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): -# """ -# Takes a `Volume` (or any other vtk data set) -# and probes its scalars on a plane defined by a point and a normal. - -# Examples: -# - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) -# - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) - -# ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) -# """ -# plane = vtk.vtkPlane() -# plane.SetOrigin(origin) -# plane.SetNormal(normal) -# planeCut = vtk.vtkCutter() -# planeCut.SetInputData(dataset) -# planeCut.SetCutFunction(plane) -# planeCut.Update() -# poly = planeCut.GetOutput() -# cutmesh = vedo.mesh.Mesh(poly) -# cutmesh.name = "ProbePlane" -# cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) -# return cutmesh From e80301b33e3a80b37f50b18aefbd45dc27360c49 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 13 Oct 2023 22:51:33 +0200 Subject: [PATCH 074/251] small fixes --- examples/simulations/gyroscope2.py | 4 ++-- vedo/assembly.py | 12 ++++++++++++ vedo/plotter.py | 12 ++++++++---- vedo/pointcloud.py | 8 +++++--- vedo/version.py | 2 +- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/examples/simulations/gyroscope2.py b/examples/simulations/gyroscope2.py index d468f315..5c8d8342 100644 --- a/examples/simulations/gyroscope2.py +++ b/examples/simulations/gyroscope2.py @@ -37,7 +37,7 @@ pedbase = Box([0, -1.13, 0], height=0.5, length=0.5, width=0.05).texture(dataurl+'textures/wood1.jpg') pedpin = Pyramid([0, -0.08, 0], axis=[0, 1, 0], s=0.05, height=0.12).texture(dataurl+'textures/wood1.jpg') formulas = Picture(dataurl+"images/gyro_formulas.png").alpha(0.9) -formulas.scale(0.0035).pos(-1.4, -1.1, -1.1) +formulas.scale(0.0035).pos([-1.4, -1.1, -1.1]) plt += [pedestal + pedbase + pedpin + formulas] # ############################################################ the physics @@ -58,7 +58,7 @@ def loop_func(event): gaxis = (Lshaft + 0.03) * vector(st * sp, ct, st * cp) # set orientation along gaxis and rotate it around its axis by psidot*t degrees - gyro.reorient(None, gaxis, rotation=psidot * t, rad=True) + gyro.reorient(gaxis, rotation=psidot * t, rad=True) plt.add(Point(gaxis, r=3, c="red4")) plt.render() diff --git a/vedo/assembly.py b/vedo/assembly.py index fa724070..1379a9cc 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -465,6 +465,18 @@ def rotate_z(self, angle): LT = LinearTransform().rotate_z(angle) return self.apply_transform(LT) + def reorient(self, new_axis, old_axis=None, rotation=0, rad=False): + """Rotate object to a new orientation.""" + if old_axis is None: + old_axis = self.top - self.base + axis = old_axis / np.linalg.norm(old_axis) + direction = new_axis / np.linalg.norm(new_axis) + angle = np.arccos(np.dot(axis, direction)) * 57.3 + self.RotateZ(rotation*57.3) + a,b,c = np.cross(axis, direction) + self.RotateWXYZ(angle, c,b,a) + return self + def bounds(self): """ Get the object bounds. diff --git a/vedo/plotter.py b/vedo/plotter.py index b00ddc6e..c8320859 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2341,10 +2341,14 @@ def fill_event(self, ename="", pos=(), enable_picking=True): delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) - if hasattr(actor.data, "picked3d"): - if actor.data.picked3d is not None: - delta3d = picked3d - actor.data.picked3d - actor.data.picked3d = picked3d + # if hasattr(actor.data, "picked3d"): + # if actor.data.picked3d is not None: + # delta3d = picked3d - actor.data.picked3d + try: + delta3d = picked3d - actor.data.picked3d + actor.data.picked3d = picked3d + except (AttributeError, TypeError): + pass else: picked3d = None diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 46597333..4b78f540 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -718,10 +718,12 @@ def __add__(self, meshs): return vedo.assembly.Assembly([self, meshs]) def polydata(self, **kwargs): - """Obsolete. - You can remove it anywhere from your code. """ - print("WARNING: call to .polydata() is obsolete, you can remove it from your code.") + Obsolete. Use property `.dataset` instead. + + Returns the underlying ``vtkPolyData`` object. + """ + print("WARNING: call to .polydata() is obsolete, use property .dataset instead.") return self def clone(self, deep=True): diff --git a/vedo/version.py b/vedo/version.py index 9d37a0da..422e5fdb 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev5a' +_version = '2023.5.0+dev6a' From ca0f9a4c6ae26733cd123a02adff2ed8741e1add Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 15:10:54 +0200 Subject: [PATCH 075/251] reshuffling methods in mesh.py --- .../{geodesic.py => geodesic_curve.py} | 0 examples/basic/align5.py | 2 +- examples/volumetric/image_probe.py | 8 +- vedo/cli.py | 7 +- vedo/core.py | 289 ++++++++++++++++- vedo/mesh.py | 244 ++++++-------- vedo/pointcloud.py | 301 ++---------------- vedo/shapes.py | 2 +- vedo/utils.py | 40 ++- vedo/visual.py | 124 +++++++- 10 files changed, 548 insertions(+), 469 deletions(-) rename examples/advanced/{geodesic.py => geodesic_curve.py} (100%) diff --git a/examples/advanced/geodesic.py b/examples/advanced/geodesic_curve.py similarity index 100% rename from examples/advanced/geodesic.py rename to examples/advanced/geodesic_curve.py diff --git a/examples/basic/align5.py b/examples/basic/align5.py index 4ba90fad..724c9d9f 100644 --- a/examples/basic/align5.py +++ b/examples/basic/align5.py @@ -25,7 +25,7 @@ s2 = s1.clone().c('orange4') # Transform the cloned mesh by moving the landmarks from landmarks1 to landmarks2 -s2.transform_with_landmarks(landmarks1, landmarks2) +s2.align_with_landmarks(landmarks1, landmarks2) # Create arrows to visualize the movement of the landmark points arrows = Arrows(landmarks1, landmarks2, s=0.5, c='black') diff --git a/examples/volumetric/image_probe.py b/examples/volumetric/image_probe.py index ebc3ceb7..46377d1d 100644 --- a/examples/volumetric/image_probe.py +++ b/examples/volumetric/image_probe.py @@ -11,9 +11,9 @@ centers = np.zeros_like(pts) + cpt # create the same amount of center coords lines = Lines(centers, pts, res=50) # create Lines with 50 pts of resolution each -msh = pic.tomesh() # transform the picture into a quad mesh -lines.interpolate_data_from(msh, n=3) # interpolate all msh data onto the lines -rgb = lines.pointdata['RGBA'] # extract the rgb intensities +lines.interpolate_data_from(pic, n=3) # interpolate all msh data onto the lines +print(lines.pointdata) # print all available arrays +rgb = lines.pointdata['JPEGImage'] # extract the rgb intensities intensities = np.sum(rgb, axis=1) # sum the rgb values into one single intensty intensities_ray = np.split(intensities, 36) # split array so we can index any radius mean_intensity = np.mean(intensities_ray, axis=0) # compute the average intensity @@ -28,4 +28,4 @@ fig += plot(intensities_ray[i], lc=i, lw=1, like=fig) fig.scale(21).shift(60,-800) # scale up and move plot below the image -show(msh, circle, lines, fig, __doc__, size=(625,1000), zoom=1.5) +show(pic, circle, lines, fig, __doc__, size=(625,1000), zoom=1.5) diff --git a/vedo/cli.py b/vedo/cli.py index fcb31c89..58549737 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -220,8 +220,11 @@ def exe_run(args): matching = list(sorted(matching)) nmat = len(matching) if nmat == 0: - printc(f":sad: No matching example found containing string: {args.run}", c="y") - # printc(f"(installation directory is {vedo.installdir})", c='y') + printc(f":sad: No matching example with name: {args.run}", c="y") + # Nothing found, try to search for a script content: + args.search = args.run + args.run = "" + exe_search(args) return if nmat > 1: diff --git a/vedo/core.py b/vedo/core.py index fcad78d7..49abe369 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -26,6 +26,7 @@ class DataArrayHelper: # Helper class to manage data associated to either # points (or vertices) and cells (or faces). def __init__(self, obj, association): + self.obj = obj self.association = association @@ -265,8 +266,8 @@ def __repr__(self) -> str: """Representation""" def _get_str(pd, header): + out = f"\x1b[2m\x1b[1m\x1b[7m{header}" if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7m{header}" if self.obj.name: out += f" in {self.obj.name}" out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" @@ -285,15 +286,15 @@ def _get_str(pd, header): out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" else: - out += " has no associated data." + out += " is empty.\x1b[0m" return out if self.association == 0: - out = _get_str(self.dataset.GetPointData(), "Point Data") + out = _get_str(self.obj.dataset.GetPointData(), "Point Data") elif self.association == 1: - out = _get_str(self.dataset.GetCellData(), "Cell Data") + out = _get_str(self.obj.dataset.GetCellData(), "Cell Data") elif self.association == 2: - pd = self.dataset.GetFieldData() + pd = self.obj.dataset.GetFieldData() if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.actor.name: @@ -383,7 +384,7 @@ def memory_size(self): """ Return the size in bytes of the object in memory. """ - return self.GetActualMemorySize() + return self.dataset.GetActualMemorySize() def modified(self): """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" @@ -471,6 +472,26 @@ def diagonal_size(self): b = self.bounds() return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) + def average_size(self): + """ + Calculate the average size of a mesh. + This is the mean of the vertex distances from the center of mass. + """ + coords = self.vertices + cm = np.mean(coords, axis=0) + if coords.shape[0] == 0: + return 0.0 + cc = coords - cm + return np.mean(np.linalg.norm(cc, axis=1)) + + def center_of_mass(self): + """Get the center of mass of mesh.""" + cmf = vtk.vtkCenterOfMass() + cmf.SetInputData(self.dataset) + cmf.Update() + c = cmf.GetCenter() + return np.array(c) + def copy_data_from(self, obj): """Copy all data (point and cell data) from this input object""" self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) @@ -490,7 +511,7 @@ def print(self): def inputdata(self): """Obsolete, use `.dataset` instead.""" - print("WARNING: inputdata() is obsolete, use .dataset instead.") + colors.printc("WARNING: 'inputdata()' is obsolete, use '.dataset' instead.", c="y") return self.dataset @property @@ -561,6 +582,39 @@ def cell_centers(self): vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) + @property + def lines(self): + """ + Get lines connectivity ids as a numpy array. + Default format is `[[id0,id1], [id3,id4], ...]` + + Arguments: + flat : (bool) + return a 1D numpy array as e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] + """ + # Get cell connettivity ids as a 1D array. The vtk format is: + # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. + arr1d = vtk2numpy(self.dataset.GetLines().GetData()) + i = 0 + conn = [] + n = len(arr1d) + for _ in range(n): + cell = [arr1d[i + k + 1] for k in range(arr1d[i])] + conn.append(cell) + i += arr1d[i] + 1 + if i >= n: + break + + return conn # cannot always make a numpy array of it! + + @property + def lines_as_flat_array(self): + """ + Get lines connectivity ids as a numpy array. + Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] + """ + return vtk2numpy(self.dataset.GetLines().GetData()) + def mark_boundaries(self): """ Mark cells and vertices of the mesh if they lie on a boundary. @@ -573,10 +627,9 @@ def mark_boundaries(self): self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) return self - def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): + def find_cells_in_bounds(self, xbounds=(), ybounds=(), zbounds=()): """ Find cells that are within the specified bounds. - Setting a color will add a vtk array to colorize these cells. """ if len(xbounds) == 6: bnds = xbounds @@ -593,18 +646,76 @@ def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): bnds[5] = zbounds[1] cellIds = vtk.vtkIdList() - self.cell_locator = vtk.vtkCellTreeLocator() - self.cell_locator.SetDataSet(self.dataset) - self.cell_locator.BuildLocator() + if not self.cell_locator: + self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator.SetDataSet(self.dataset) + self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + cids = [] + for i in range(cellIds.GetNumberOfIds()): + cid = cellIds.GetId(i) + cids.append(cid) + return np.array(cids) + def find_cells_along_line(self, p0, p1, tol=0.001): + """ + Find cells that are intersected by a line segment. + """ + cellIds = vtk.vtkIdList() + if not self.cell_locator: + self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator.SetDataSet(self.dataset) + self.cell_locator.BuildLocator() + self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + self.cell_locator.FindCellsAlongLine(p0, p1, tol, cellsIds) cids = [] for i in range(cellIds.GetNumberOfIds()): cid = cellIds.GetId(i) cids.append(cid) + return np.array(cids) + def find_cells_along_plane(self, origin, normal, tol=0.001): + """ + Find cells that are intersected by a plane. + """ + cellIds = vtk.vtkIdList() + if not self.cell_locator: + self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator.SetDataSet(self.dataset) + self.cell_locator.BuildLocator() + self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cellsIds) + cids = [] + for i in range(cellIds.GetNumberOfIds()): + cid = cellIds.GetId(i) + cids.append(cid) return np.array(cids) + def delete_cells_by_point_index(self, indices): + """ + Delete a list of vertices identified by any of their vertex index. + + See also `delete_cells()`. + + Examples: + - [delete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delete_mesh_pts.py) + + ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) + """ + cell_ids = vtk.vtkIdList() + self.dataset.BuildLinks() + n = 0 + for i in np.unique(indices): + self.dataset.GetPointCells(i, cell_ids) + for j in range(cell_ids.GetNumberOfIds()): + self.dataset.DeleteCell(cell_ids.GetId(j)) # flag cell + n += 1 + + self.dataset.RemoveDeletedCells() + self.mapper.Modified() + self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) + return self + def map_cells_to_points(self, arrays=(), move=False): """ Interpolate cell data (i.e., data specified per cell or face) @@ -750,7 +861,7 @@ def resample_data_from(self, source, tol=None, categorical=False): """ rs = vtk.vtkResampleWithDataSet() rs.SetInputData(self.dataset) - rs.SetSourceData(source) + rs.SetSourceData(source.dataset) rs.SetPassPointArrays(True) rs.SetPassCellArrays(True) @@ -768,6 +879,110 @@ def resample_data_from(self, source, tol=None, categorical=False): ) return self + def interpolate_data_from( + self, + source, + radius=None, + n=None, + kernel="shepard", + exclude=("Normals",), + on="points", + null_strategy=1, + null_value=0, + ): + """ + Interpolate over source to port its data onto the current object using various kernels. + + If n (number of closest points to use) is set then radius value is ignored. + + Arguments: + kernel : (str) + available kernels are [shepard, gaussian, linear, voronoi] + null_strategy : (int) + specify a strategy to use when encountering a "null" point + during the interpolation process. Null points occur when the local neighborhood + (of nearby points to interpolate from) is empty. + + - Case 0: an output array is created that marks points + as being valid (=1) or null (invalid =0), and the null_value is set as well + - Case 1: the output data value(s) are set to the provided null_value + - Case 2: simply use the closest point to perform the interpolation. + null_value : (float) + see above. + + Examples: + - [interpolate_scalar3.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar3.py) + + ![](https://vedo.embl.es/images/advanced/interpolateMeshArray.png) + """ + if radius is None and not n: + vedo.logger.error("in interpolate_data_from(): please set either radius or n") + raise RuntimeError + + if on == "points": + points = source.dataset + elif on == "cells": + poly2 = vtk.vtkPolyData() + poly2.ShallowCopy(source.dataset) + c2p = vtk.vtkCellDataToPointData() + c2p.SetInputData(poly2) + c2p.Update() + points = c2p.GetOutput() + else: + vedo.logger.error("in interpolate_data_from(), on must be on points or cells") + raise RuntimeError() + + locator = vtk.vtkPointLocator() + locator.SetDataSet(points) + locator.BuildLocator() + + if kernel.lower() == "shepard": + kern = vtk.vtkShepardKernel() + kern.SetPowerParameter(2) + elif kernel.lower() == "gaussian": + kern = vtk.vtkGaussianKernel() + kern.SetSharpness(2) + elif kernel.lower() == "linear": + kern = vtk.vtkLinearKernel() + elif kernel.lower() == "voronoi": + kern = vtk.vtkProbabilisticVoronoiKernel() + else: + vedo.logger.error("available kernels are: [shepard, gaussian, linear, voronoi]") + raise RuntimeError() + + if n: + kern.SetNumberOfPoints(n) + kern.SetKernelFootprintToNClosest() + else: + kern.SetRadius(radius) + kern.SetKernelFootprintToRadius() + + interpolator = vtk.vtkPointInterpolator() + interpolator.SetInputData(self.dataset) + interpolator.SetSourceData(points) + interpolator.SetKernel(kern) + interpolator.SetLocator(locator) + interpolator.PassFieldArraysOff() + interpolator.SetNullPointsStrategy(null_strategy) + interpolator.SetNullValue(null_value) + interpolator.SetValidPointsMaskArrayName("ValidPointMask") + for ex in exclude: + interpolator.AddExcludedArray(ex) + interpolator.Update() + + if on == "cells": + p2c = vtk.vtkPointDataToCellData() + p2c.SetInputData(interpolator.GetOutput()) + p2c.Update() + cpoly = p2c.GetOutput() + else: + cpoly = interpolator.GetOutput() + + self.dataset.DeepCopy(cpoly) + + self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) + return self + def add_ids(self): """Generate point and cell ids arrays.""" ids = vtk.vtkIdFilter() @@ -805,9 +1020,12 @@ def gradient(self, input_array=None, on="points", fast=False): if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: + elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + else: + vedo.logger.error(f"in gradient: unknown option {on}") + raise RuntimeError if input_array is None: if varr.GetScalars(): @@ -848,9 +1066,12 @@ def divergence(self, array_name=None, on="points", fast=False): if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: + elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + else: + vedo.logger.error(f"in divergence(): unknown option {on}") + raise RuntimeError if array_name is None: if varr.GetVectors(): @@ -891,9 +1112,12 @@ def vorticity(self, array_name=None, on="points", fast=False): if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS - else: + elif on.startswith("c"): varr = self.dataset.GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS + else: + vedo.logger.error(f"in vorticity(): unknown option {on}") + raise RuntimeError if array_name is None: if varr.GetVectors(): @@ -916,6 +1140,21 @@ def vorticity(self, array_name=None, on="points", fast=False): vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) return vvecs + def compute_cell_size(self): + """Add to this mesh a cell data array containing the areas of the polygonal faces""" + csf = vtk.vtkCellSizeFilter() + csf.SetInputData(self.dataset) + csf.SetComputeArea(1) + csf.SetComputeVolume(1) + csf.SetComputeLength(1) + csf.SetComputeVertexCount(0) + csf.SetAreaArrayName("Area") + csf.SetVolumeArrayName("Volume") + csf.SetLengthArrayName("Length") + csf.Update() + self._update(csf.GetOutput(), reset_locators=False) + return self + def write(self, filename, binary=True): """Write object to file.""" out = vedo.file_io.write(self, filename, binary) @@ -968,6 +1207,24 @@ def tomesh(self, fill=True, shrink=1.0): ) return msh + def tomesh(self, bounds=()): + """Extract boundary geometry from dataset (or convert data to polygonal type).""" + geo = vtk.vtkGeometryFilter() + geo.SetInputData(self.dataset) + geo.SetPassThroughCellIds(1) + geo.SetPassThroughPointIds(1) + geo.SetOriginalCellIdsName("OriginalCellIds") + geo.SetOriginalPointIdsName("OriginalPointIds") + geo.SetNonlinearSubdivisionLevel(1) + geo.MergingOff() + if bounds: + geo.SetExtent(bounds) + geo.ExtentClippingOn() + geo.Update() + msh = vedo.mesh.Mesh(geo.GetOutput()) + msh.pipeline = utils.OperationNode("tomesh", parents=[self], c="#9e2a2b") + return msh + def shrink(self, fraction=0.8): """ Shrink the individual cells to improve visibility. diff --git a/vedo/mesh.py b/vedo/mesh.py index e074f45c..d1376738 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -289,45 +289,10 @@ def faces(self, ids=()): # break # return conn # cannot always make a numpy array of it! - @property - def lines(self): - """ - Get lines connectivity ids as a numpy array. - Default format is `[[id0,id1], [id3,id4], ...]` - - Arguments: - flat : (bool) - return a 1D numpy array as e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] - """ - # Get cell connettivity ids as a 1D array. The vtk format is: - # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - arr1d = vtk2numpy(self.dataset.GetLines().GetData()) - i = 0 - conn = [] - n = len(arr1d) - for _ in range(n): - cell = [arr1d[i + k + 1] for k in range(arr1d[i])] - conn.append(cell) - i += arr1d[i] + 1 - if i >= n: - break - - return conn # cannot always make a numpy array of it! - - @property - def lines_as_flat_array(self): - """ - Get lines connectivity ids as a numpy array. - Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] - """ - return vtk2numpy(self.dataset.GetLines().GetData()) - @property def edges(self): """ Return an array containing the edges connectivity. - - If ids is set, return only the edges of the given cells. """ extractEdges = vtk.vtkExtractEdges() extractEdges.SetInputData(self.dataset) @@ -349,6 +314,15 @@ def edges(self): break return conn # cannot always make a numpy array of it! + @property + def cell_normals(self): + """ + Retrieve face normals as a numpy array. + Check out also `compute_normals(cells=True)` and `compute_normals_with_pca()`. + """ + vtknormals = self.dataset.GetCellData().GetNormals() + return utils.vtk2numpy(vtknormals) + def texture( self, tname, @@ -580,9 +554,8 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ - poly = self.dataset pdnorm = vtk.vtkPolyDataNormals() - pdnorm.SetInputData(poly) + pdnorm.SetInputData(self.dataset) pdnorm.SetComputePointNormals(points) pdnorm.SetComputeCellNormals(cells) pdnorm.SetConsistency(consistency) @@ -592,7 +565,7 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten pdnorm.SetFeatureAngle(feature_angle) else: pdnorm.SetSplitting(False) - # print(pdnorm.GetNonManifoldTraversal()) + # print("GetNonManifoldTraversal", pdnorm.GetNonManifoldTraversal()) pdnorm.Update() self.dataset.GetPointData().SetNormals(pdnorm.GetOutput().GetPointData().GetNormals()) self.dataset.GetCellData().SetNormals(pdnorm.GetOutput().GetCellData().GetNormals()) @@ -643,7 +616,7 @@ def volume(self): def area(self): """ - Compute the surface area of mesh. + Compute the surface area of the mesh. The mesh must be triangular for this to work. See also `mesh.triangulate()`. """ @@ -769,12 +742,11 @@ def shrink(self, fraction=0.85): ![](https://vedo.embl.es/images/basic/shrink.png) """ + # Overriding base class method core.shrink() shrink = vtk.vtkShrinkPolyData() shrink.SetInputData(self.dataset) shrink.SetShrinkFactor(fraction) shrink.Update() - self.point_locator = None - self.cell_locator = None self._update(shrink.GetOutput()) self.pipeline = OperationNode("shrink", parents=[self]) return self @@ -847,13 +819,13 @@ def cap(self, return_cap=False): stripper.JoinContiguousSegmentsOn() stripper.Update() - boundaryPoly = vtk.vtkPolyData() - boundaryPoly.SetPoints(stripper.GetOutput().GetPoints()) - boundaryPoly.SetPolys(stripper.GetOutput().GetLines()) + boundary_poly = vtk.vtkPolyData() + boundary_poly.SetPoints(stripper.GetOutput().GetPoints()) + boundary_poly.SetPolys(stripper.GetOutput().GetLines()) rev = vtk.vtkReverseSense() rev.ReverseCellsOn() - rev.SetInputData(boundaryPoly) + rev.SetInputData(boundary_poly) rev.Update() tf = vtk.vtkTriangleFilter() @@ -1083,20 +1055,7 @@ def triangulate(self, verts=True, lines=True): ) return self - def compute_cell_area(self, name="Area"): - """Add to this mesh a cell data array containing the areas of the polygonal faces""" - csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self.dataset) - csf.SetComputeArea(True) - csf.SetComputeVolume(False) - csf.SetComputeLength(False) - csf.SetComputeVertexCount(False) - csf.SetAreaArrayName(name) - csf.Update() - self.dataset.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) - return self - - def compute_cell_vertex_count(self, name="VertexCount"): + def compute_cell_vertex_count(self): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" csf = vtk.vtkCellSizeFilter() @@ -1105,9 +1064,11 @@ def compute_cell_vertex_count(self, name="VertexCount"): csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(True) - csf.SetVertexCountArrayName(name) + csf.SetVertexCountArrayName("VertexCount") csf.Update() - self.dataset.GetCellData().AddArray(csf.GetOutput().GetCellData().GetArray(name)) + self.dataset.GetCellData().AddArray( + csf.GetOutput().GetCellData().GetArray("VertexCount") + ) return self def compute_quality(self, metric=6): @@ -1176,7 +1137,7 @@ def count_vertices(self): def check_validity(self, tol=0): """ - Return an array of possible problematic faces following this convention: + Return a numpy array of possible problematic faces following this convention: - Valid = 0 - WrongNumberOfPoints = 1 - IntersectingEdges = 2 @@ -1268,7 +1229,7 @@ def subdivide(self, n=1, method=0, mel=None): triangles = vtk.vtkTriangleFilter() triangles.SetInputData(self.dataset) triangles.Update() - originalMesh = triangles.GetOutput() + tri_mesh = triangles.GetOutput() if method == 0: sdf = vtk.vtkLoopSubdivisionFilter() elif method == 1: @@ -1289,7 +1250,7 @@ def subdivide(self, n=1, method=0, mel=None): if method != 2: sdf.SetNumberOfSubdivisions(n) - sdf.SetInputData(originalMesh) + sdf.SetInputData(tri_mesh) sdf.Update() self._update(sdf.GetOutput()) @@ -1426,9 +1387,8 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ - poly = self.dataset cl = vtk.vtkCleanPolyData() - cl.SetInputData(poly) + cl.SetInputData(self.dataset) cl.Update() smf = vtk.vtkWindowedSincPolyDataFilter() smf.SetInputData(cl.GetOutput()) @@ -1481,7 +1441,7 @@ def fill_holes(self, size=None): def is_inside(self, point, tol=1e-05): """Return True if point is inside a polydata closed surface.""" - poly = self + poly = self.dataset points = vtk.vtkPoints() points.InsertNextPoint(point) poly = vtk.vtkPolyData() @@ -1588,7 +1548,10 @@ def boundaries( fe.SetBoundaryEdges(boundary_edges) fe.SetNonManifoldEdges(non_manifold_edges) fe.SetManifoldEdges(manifold_edges) - # fe.SetPassLines(True) # vtk9.2 + try: + fe.SetPassLines(True) # vtk9.2 + except AttributeError: + pass fe.ColoringOff() fe.SetFeatureEdges(False) if feature_angle is not None: @@ -1715,6 +1678,35 @@ def connected_vertices(self, index): return idxs + def extract_cells(self, ids): + """ + Extract a subset of cells from a mesh and return it as a new mesh. + """ + selectCells = vtk.vtkSelectionNode() + selectCells.SetFieldType(vtk.vtkSelectionNode.CELL) + selectCells.SetContentType(vtk.vtkSelectionNode.INDICES) + idarr = vtk.vtkIdTypeArray() + idarr.SetNumberOfComponents(1) + idarr.SetNumberOfValues(len(ids)) + for i, v in enumerate(ids): + idarr.SetValue(i, v) + selectCells.SetSelectionList(idarr) + + selection = vtk.vtkSelection() + selection.AddNode(selectCells) + + extractSelection = vtk.vtkExtractSelection() + extractSelection.SetInputData(0, self.dataset) + extractSelection.SetInputData(1, selection) + extractSelection.Update() + + gf = vtk.vtkGeometryFilter() + gf.SetInputData(extractSelection.GetOutput()) + gf.Update() + msh = Mesh(gf.GetOutput()) + msh.copy_properties_from(self) + return msh + def connected_cells(self, index, return_ids=False): """Find all cellls connected to an input vertex specified by its index.""" @@ -1938,7 +1930,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): """ if is_sequence(zshift): # ms = [] # todo - # poly0 = self.clone() + # poly0 = self.clone().dataset # for i in range(len(zshift)-1): # rf = vtk.vtkRotationalExtrusionFilter() # rf.SetInputData(poly0) @@ -1949,6 +1941,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # rf.SetDeltaRadius(dR) # rf.Update() # poly1 = rf.GetOutput() + raise NotImplementedError("todo") return self rf = vtk.vtkRotationalExtrusionFilter() @@ -1961,14 +1954,9 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): rf.SetDeltaRadius(dr) rf.Update() - m = Mesh(rf.GetOutput(), c=self.c(), alpha=self.alpha()) - prop = vtk.vtkProperty() - prop.DeepCopy(self.property) - m.actor.SetProperty(prop) - m.property = prop - + m = Mesh(rf.GetOutput()) + m.copy_properties_from(self) m.compute_normals(cells=False).flat().lighting("default") - m.pipeline = OperationNode( "extrude", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) @@ -2020,19 +2008,19 @@ def split( self._update(out) return self - a = Mesh(out) + msh = Mesh(out) if must_share_edge: - arr = a.celldata["RegionId"] + arr = msh.celldata["RegionId"] on = "cells" else: - arr = a.pointdata["RegionId"] + arr = msh.pointdata["RegionId"] on = "points" alist = [] for t in range(max(arr) + 1): if t == maxdepth: break - suba = a.clone().threshold("RegionId", t, t, on=on) + suba = msh.clone().threshold("RegionId", t, t, on=on) if sort_by_area: area = suba.area() else: @@ -2068,14 +2056,9 @@ def extract_largest_region(self): conn.ScalarConnectivityOff() conn.SetInputData(self.dataset) conn.Update() - m = Mesh(conn.GetOutput()) - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - m.actor.SetProperty(pr) - m.property = pr - vis = self.mapper.GetScalarVisibility() - m.mapper.SetScalarVisibility(vis) + m = Mesh(conn.GetOutput()) + m.copy_properties_from(self) m.pipeline = OperationNode( "extract_largest_region", parents=[self], @@ -2142,11 +2125,9 @@ def intersect_with(self, mesh2, tol=1e-06): """ bf = vtk.vtkIntersectionPolyDataFilter() bf.SetGlobalWarningDisplay(0) - poly1 = self.dataset - poly2 = mesh2.dataset bf.SetTolerance(tol) - bf.SetInputData(0, poly1) - bf.SetInputData(1, poly2) + bf.SetInputData(0, self.dataset) + bf.SetInputData(1, mesh2.dataset) bf.Update() msh = Mesh(bf.GetOutput(), c="k", alpha=1).lighting("off") msh.property.SetLineWidth(3) @@ -2229,10 +2210,9 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): cutter.ComputeNormalsOff() cutter.Update() - msh = Mesh(cutter.GetOutput(), "k", 1).lighting("off") - msh.GetProperty().SetLineWidth(3) + msh = Mesh(cutter.GetOutput()) + msh.c('k').lw(3).lighting("off") msh.name = "PlaneIntersection" - msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], @@ -2240,42 +2220,6 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): ) return msh - # def intersect_with_multiplanes(self, origins, normals): ## WRONG - # """ - # Generate a set of lines from cutting a mesh in n intervals - # between a minimum and maximum distance from a plane of given origin and normal. - - # Arguments: - # origin : (list) - # the point of the cutting plane - # normal : (list) - # normal vector to the cutting plane - # n : (int) - # number of cuts - # """ - # poly = self.dataset - - # planes = vtk.vtkPlanes() - # planes.SetOrigin(numpy2vtk(origins)) - # planes.SetNormals(numpy2vtk(normals)) - - # cutter = vtk.vtkCutter() - # cutter.SetCutFunction(planes) - # cutter.SetInputData(poly) - # cutter.SetValue(0, 0.0) - # cutter.Update() - - # msh = Mesh(cutter.GetOutput()) - # msh.property.LightingOff() - # msh.property.SetColor(get_color("k2")) - - # msh.pipeline = OperationNode( - # "intersect_with_multiplanes", - # parents=[self], - # comment=f"#pts {msh.dataset.GetNumberOfPoints()}", - # ) - # return msh - def collide_with(self, mesh2, tol=0, return_bool=False): """ Collide this Mesh with the input surface. @@ -2290,7 +2234,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): # ipdf.SetBoxTolerance(tol) ipdf.SetCellTolerance(tol) ipdf.SetInputData(0, self.dataset) - ipdf.SetInputData(1, mesh2) + ipdf.SetInputData(1, mesh2.dataset) ipdf.SetTransform(0, transform0) ipdf.SetTransform(1, transform1) if return_bool: @@ -2324,6 +2268,9 @@ def geodesic(self, start, end): Dijkstra algorithm to compute the geodesic line. Takes as input a polygonal mesh and performs a single source shortest path calculation. + The output mesh contains the array "VertexIDs" that contains the ordered list of vertices + traversed to get from the start vertex to the end vertex. + Arguments: start : (int, list) start vertex index or close point `[x,y,z]` @@ -2331,7 +2278,7 @@ def geodesic(self, start, end): end vertex index or close point `[x,y,z]` Examples: - - [geodesic.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic.py) + - [geodesic_curve.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic_curve.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ @@ -2369,25 +2316,20 @@ def geodesic(self, start, end): poly.GetPointData().AddArray(vdata2) poly.GetPointData().Modified() - dmesh = Mesh(poly, c="k") - prop = vtk.vtkProperty() - prop.DeepCopy(self.property) - prop.SetLineWidth(3) - prop.SetOpacity(1) - dmesh.actor.SetProperty(prop) - dmesh.property = prop + dmesh = Mesh(poly).copy_properties_from(self) + dmesh.lw(3).alpha(1).lighting("off") dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( "GeodesicLine", parents=[self], - comment=f"#pts {dmesh.dataset.GetNumberOfPoints()}", + comment=f"#steps {poly.GetNumberOfPoints()}", ) return dmesh ##################################################################### - ### Stuff returning a Volume - ### + ### Stuff returning a Volume object + ##################################################################### def binarize( self, spacing=(1, 1, 1), @@ -2395,13 +2337,13 @@ def binarize( direction_matrix=None, image_size=None, origin=None, - fg_val=255, - bg_val=0, + fg_value=255, + bg_value=0, ): """ - Convert a `Mesh` into a `Volume` - where the foreground (exterior) voxels value is fg_val (255 by default) - and the background (interior) voxels value is bg_val (0 by default). + Convert a `Mesh` into a `Volume` where + the foreground (exterior) voxels value is `fg_value` (255 by default) + and the background (interior) voxels value is `bg_value` (0 by default). Examples: - [mesh2volume.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/mesh2volume.py) @@ -2436,7 +2378,7 @@ def binarize( whiteImage.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1) # fill the image with foreground voxels: - inval = bg_val if invert else fg_val + inval = bg_value if invert else fg_value whiteImage.GetPointData().GetScalars().Fill(inval) # polygonal data --> image stencil: @@ -2448,7 +2390,7 @@ def binarize( pol2stenc.Update() # cut the corresponding white image and set the background: - outval = fg_val if invert else bg_val + outval = fg_value if invert else bg_value imgstenc = vtk.vtkImageStencil() imgstenc.SetInputData(whiteImage) @@ -2468,8 +2410,8 @@ def binarize( def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradius=None): """ - Compute the `Volume` object whose voxels contains the signed distance from - the mesh. + Compute the `Volume` object whose voxels contains + the signed distance from the mesh. Arguments: bounds : (list) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 4b78f540..bed6e6e3 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -763,126 +763,6 @@ def clone(self, deep=True): cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") return cloned - def clone2d( - self, - pos=(0, 0), - coordsys=4, - scale=None, - c=None, - alpha=None, - ps=2, - lw=1, - sendback=False, - layer=0, - ): - """ - Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. - - Arguments: - coordsys : (int) - the coordinate system, options are - - 0 = Displays - - 1 = Normalized Display - - 2 = Viewport (origin is the bottom-left corner of the window) - - 3 = Normalized Viewport - - 4 = View (origin is the center of the window) - - 5 = World (anchor the 2d image to mesh) - - ps : (int) - point size in pixel units - - lw : (int) - line width in pixel units - - sendback : (bool) - put it behind any other 3D object - - Examples: - - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) - - ![](https://vedo.embl.es/images/other/clone2d.png) - """ - if scale is None: - msiz = self.diagonal_size() - if vedo.plotter_instance and vedo.plotter_instance.window: - sz = vedo.plotter_instance.window.GetSize() - dsiz = utils.mag(sz) - scale = dsiz / msiz / 10 - else: - scale = 350 / msiz - - cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale).dataset - - mapper3d = self.mapper - cm = mapper3d.GetColorMode() - lut = mapper3d.GetLookupTable() - sv = mapper3d.GetScalarVisibility() - use_lut = mapper3d.GetUseLookupTableScalarRange() - vrange = mapper3d.GetScalarRange() - sm = mapper3d.GetScalarMode() - - mapper2d = vtk.vtkPolyDataMapper2D() - mapper2d.ShallowCopy(mapper3d) - mapper2d.SetInputData(poly) - mapper2d.SetColorMode(cm) - mapper2d.SetLookupTable(lut) - mapper2d.SetScalarVisibility(sv) - mapper2d.SetUseLookupTableScalarRange(use_lut) - mapper2d.SetScalarRange(vrange) - mapper2d.SetScalarMode(sm) - - act2d = vtk.vtkActor2D() - act2d.SetMapper(mapper2d) - act2d.SetLayerNumber(layer) - csys = act2d.GetPositionCoordinate() - csys.SetCoordinateSystem(coordsys) - act2d.SetPosition(pos) - if c is not None: - c = colors.get_color(c) - act2d.GetProperty().SetColor(c) - mapper2d.SetScalarVisibility(False) - else: - act2d.GetProperty().SetColor(cmsh.color()) - if alpha is not None: - act2d.GetProperty().SetOpacity(alpha) - else: - act2d.GetProperty().SetOpacity(cmsh.alpha()) - act2d.GetProperty().SetPointSize(ps) - act2d.GetProperty().SetLineWidth(lw) - act2d.GetProperty().SetDisplayLocationToForeground() - if sendback: - act2d.GetProperty().SetDisplayLocationToBackground() - - # print(csys.GetCoordinateSystemAsString()) - # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) - return act2d - - def delete_cells_by_point_index(self, indices): - """ - Delete a list of vertices identified by any of their vertex index. - - See also `delete_cells()`. - - Examples: - - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) - - ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) - """ - cell_ids = vtk.vtkIdList() - self.dataset.BuildLinks() - n = 0 - for i in np.unique(indices): - self.dataset.GetPointCells(i, cell_ids) - for j in range(cell_ids.GetNumberOfIds()): - self.dataset.DeleteCell(cell_ids.GetId(j)) # flag cell - n += 1 - - self.dataset.RemoveDeletedCells() - self.mapper.Modified() - self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) - return self - def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): """ Generate point normals using PCA (principal component analysis). @@ -925,7 +805,9 @@ def compute_acoplanarity(self, n=25, radius=None, on="points"): """ Compute acoplanarity which is a measure of how much a local region of the mesh differs from a plane. + The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. + Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. If a radius value is given and not enough points fall inside it, then a -1 is stored. @@ -1166,26 +1048,6 @@ def quantize(self, value): self.pipeline = utils.OperationNode("quantize", parents=[self]) return self - def average_size(self): - """ - Calculate the average size of a mesh. - This is the mean of the vertex distances from the center of mass. - """ - coords = self.vertices - cm = np.mean(coords, axis=0) - if coords.shape[0] == 0: - return 0.0 - cc = coords - cm - return np.mean(np.linalg.norm(cc, axis=1)) - - def center_of_mass(self): - """Get the center of mass of mesh.""" - cmf = vtk.vtkCenterOfMass() - cmf.SetInputData(self.dataset) - cmf.Update() - c = cmf.GetCenter() - return np.array(c) - @property def vertex_normals(self): """ @@ -1195,15 +1057,6 @@ def vertex_normals(self): vtknormals = self.dataset.GetPointData().GetNormals() return utils.vtk2numpy(vtknormals) - @property - def cell_normals(self): - """ - Retrieve vertex normals as a numpy array. - Check out also `compute_normals(cells=True)` and `compute_normals_with_pca()`. - """ - vtknormals = self.dataset.GetCellData().GetNormals() - return utils.vtk2numpy(vtknormals) - def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False): """ Aligned to target mesh through the `Iterative Closest Point` algorithm. @@ -1299,7 +1152,7 @@ def align_to_bounding_box(self, msh, rigid=False): self.apply_transform(LT) return self - def transform_with_landmarks( + def align_with_landmarks( self, source_landmarks, target_landmarks, @@ -1432,114 +1285,10 @@ def flip_normals(self): rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() - self.dataset.DeepCopy(rs.GetOutput()) + self._update(rs.GetOutput()) self.pipeline = utils.OperationNode("flip_normals", parents=[self]) return self - def interpolate_data_from( - self, - source, - radius=None, - n=None, - kernel="shepard", - exclude=("Normals",), - on="points", - null_strategy=1, - null_value=0, - ): - """ - Interpolate over source to port its data onto the current object using various kernels. - - If n (number of closest points to use) is set then radius value is ignored. - - Arguments: - kernel : (str) - available kernels are [shepard, gaussian, linear, voronoi] - null_strategy : (int) - specify a strategy to use when encountering a "null" point - during the interpolation process. Null points occur when the local neighborhood - (of nearby points to interpolate from) is empty. - - - Case 0: an output array is created that marks points - as being valid (=1) or null (invalid =0), and the null_value is set as well - - Case 1: the output data value(s) are set to the provided null_value - - Case 2: simply use the closest point to perform the interpolation. - null_value : (float) - see above. - - Examples: - - [interpolate_scalar3.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar3.py) - - ![](https://vedo.embl.es/images/advanced/interpolateMeshArray.png) - """ - if radius is None and not n: - vedo.logger.error("in interpolate_data_from(): please set either radius or n") - raise RuntimeError - - if on == "points": - points = source.dataset - elif on == "cells": - poly2 = vtk.vtkPolyData() - poly2.ShallowCopy(source.dataset) - c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(poly2) - c2p.Update() - points = c2p.GetOutput() - else: - vedo.logger.error("in interpolate_data_from(), on must be on points or cells") - raise RuntimeError() - - locator = vtk.vtkPointLocator() - locator.SetDataSet(points) - locator.BuildLocator() - - if kernel.lower() == "shepard": - kern = vtk.vtkShepardKernel() - kern.SetPowerParameter(2) - elif kernel.lower() == "gaussian": - kern = vtk.vtkGaussianKernel() - kern.SetSharpness(2) - elif kernel.lower() == "linear": - kern = vtk.vtkLinearKernel() - elif kernel.lower() == "voronoi": - kern = vtk.vtkProbabilisticVoronoiKernel() - else: - vedo.logger.error("available kernels are: [shepard, gaussian, linear, voronoi]") - raise RuntimeError() - - if n: - kern.SetNumberOfPoints(n) - kern.SetKernelFootprintToNClosest() - else: - kern.SetRadius(radius) - kern.SetKernelFootprintToRadius() - - interpolator = vtk.vtkPointInterpolator() - interpolator.SetInputData(self.dataset) - interpolator.SetSourceData(points) - interpolator.SetKernel(kern) - interpolator.SetLocator(locator) - interpolator.PassFieldArraysOff() - interpolator.SetNullPointsStrategy(null_strategy) - interpolator.SetNullValue(null_value) - interpolator.SetValidPointsMaskArrayName("ValidPointMask") - for ex in exclude: - interpolator.AddExcludedArray(ex) - interpolator.Update() - - if on == "cells": - p2c = vtk.vtkPointDataToCellData() - p2c.SetInputData(interpolator.GetOutput()) - p2c.Update() - cpoly = p2c.GetOutput() - else: - cpoly = interpolator.GetOutput() - - self.dataset.DeepCopy(cpoly) - - self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) - return self - def add_gaussian_noise(self, sigma=1.0): """ Add gaussian noise to point positions. @@ -2691,8 +2440,17 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No ) return self - def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist=None): - """Find the surface which sits at the specified distance from the input one.""" + def generate_surface_halo( + self, + distance=0.05, + res=(50, 50, 50), + bounds=(), + maxdist=None, + ): + """ + Generate the surface halo which sits at + the specified distance from the input one. + """ if not bounds: bounds = self.bounds() @@ -2702,16 +2460,17 @@ def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist= imp = vtk.vtkImplicitModeller() imp.SetInputData(self.dataset) imp.SetSampleDimensions(res) - imp.SetMaximumDistance(maxdist) - imp.SetModelBounds(bounds) + if maxdist: + imp.SetMaximumDistance(maxdist) + if len(bounds) == 6: + imp.SetModelBounds(bounds) contour = vtk.vtkContourFilter() contour.SetInputConnection(imp.GetOutputPort()) contour.SetValue(0, distance) contour.Update() - poly = contour.GetOutput() - out = vedo.Mesh(poly, c="lb") - - out.pipeline = utils.OperationNode("implicit_modeller", parents=[self]) + out = vedo.Mesh(contour.GetOutput()) + out.c("lightblue").alpha(0.25).lighting("off") + out.pipeline = utils.OperationNode("generate_surface_halo", parents=[self]) return out def generate_mesh( @@ -2728,6 +2487,8 @@ def generate_mesh( Generate a polygonal Mesh from a closed contour line. If line is not closed it will be closed with a straight segment. + Check also `generate_delaunay2d()`. + Arguments: line_resolution : (int) resolution of the contour line. The default is None, in this case @@ -2948,7 +2709,8 @@ def reconstruct_surface( def compute_clustering(self, radius): """ Cluster points in space. The `radius` is the radius of local search. - An array named "ClusterId" is added to the vertex points. + + An array named "ClusterId" is added to `pointdata`. Examples: - [clustering.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/clustering.py) @@ -3054,6 +2816,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( def compute_camera_distance(self): """ Calculate the distance from points to the camera. + A pointdata array is created with name 'DistanceToCamera'. """ if vedo.plotter_instance.renderer: @@ -3127,7 +2890,6 @@ def density( vol.name = "PointDensity" vol.info["radius"] = radius vol.locator = pdf.GetLocator() - vol.pipeline = utils.OperationNode( "density", parents=[self], comment=f"dims = {tuple(vol.dimensions())}" ) @@ -3392,6 +3154,8 @@ def generate_delaunay2d( If `mode='fit'` then the filter computes a best fitting plane and projects the points onto it. + Check also `generate_mesh()`. + Arguments: tol : (float) specify a tolerance to control discarding of closely spaced points. @@ -3455,8 +3219,9 @@ def generate_delaunay2d( if mode == "fit": delny.SetProjectionPlaneMode(vtk.VTK_BEST_FITTING_PLANE) delny.Update() - msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") + msh = vedo.mesh.Mesh(delny.GetOutput()) + msh.clean().lighting("off") msh.pipeline = utils.OperationNode( "delaunay2d", parents=[self], @@ -3469,6 +3234,8 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): Generate the 2D Voronoi convex tiling of the input points (z is ignored). The points are assumed to lie in a plane. The output is a Mesh. Each output cell is a convex polygon. + A cell array named "VoronoiID" is added to the output Mesh. + The 2D Voronoi tessellation is a tiling of space, where each Voronoi tile represents the region nearest to one of the input points. Voronoi tessellations are important in computational geometry (and many other fields), and are the dual of Delaunay triangulations. @@ -3527,7 +3294,7 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): if flag and len(r) > 0: regs.append(r) - m = vedo.Mesh([vor.vertices, regs], c="orange5") + m = vedo.Mesh([vor.vertices, regs]) m.celldata["VoronoiID"] = np.array(list(range(len(regs)))).astype(int) m.locator = None diff --git a/vedo/shapes.py b/vedo/shapes.py index e9a9b234..5d09ea97 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2821,7 +2821,7 @@ def __init__(self, style=1, r=1.0): Build a textured mesh representing the Earth. Example: - - [geodesic.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic.py) + - [geodesic_curve.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic_curve.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ diff --git a/vedo/utils.py b/vedo/utils.py index 0746eab9..0610a99a 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1747,34 +1747,32 @@ def _print_vtkactor(obj): elif isinstance(obj, vedo.Picture): # dumps Picture info vedo.printc("Picture".ljust(70), c="y", bold=True, invert=True) - try: - # generate a print thumbnail - width, height = obj.dimensions() - w = 45 - h = int(height / width * (w - 1) * 0.5 + 0.5) - img_arr = obj.clone().resize([w, h]).tonumpy() - h, w = img_arr.shape[:2] - for x in range(h): - for y in range(w): - pix = img_arr[x][y] - r, g, b = pix[:3] - print(f"\x1b[48;2;{r};{g};{b}m", end=" ") - print("\x1b[0m") - except: - pass + # try: + # # generate a print thumbnail + # width, height = obj.dimensions() + # w = 45 + # h = int(height / width * (w - 1) * 0.5 + 0.5) + # img_arr = obj.clone().resize([w, h]).tonumpy() + # h, w = img_arr.shape[:2] + # for x in range(h): + # for y in range(w): + # pix = img_arr[x][y] + # r, g, b = pix[:3] + # print(f"\x1b[48;2;{r};{g};{b}m", end=" ") + # print("\x1b[0m") + # except: + # pass - img = obj.GetMapper().GetInput() - pos = obj.GetPosition() vedo.printc("position".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(pos, c="y", bold=False) + vedo.printc(obj.pos(), c="y", bold=False) vedo.printc("dimensions".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(obj.shape, c="y", bold=False) vedo.printc("memory size".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(int(img.GetActualMemorySize()), "kB", c="y", bold=False) + vedo.printc(int(obj.memory_size()), "kB", c="y", bold=False) - bnds = obj.GetBounds() + bnds = obj.bounds() vedo.printc("bounds".ljust(14) + ": ", c="y", bold=True, end="") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="y", bold=False, end="") @@ -1784,7 +1782,7 @@ def _print_vtkactor(obj): vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="y", bold=False) vedo.printc("intensty range".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(img.GetScalarRange(), c="y", bold=False) + vedo.printc(obj.scalar_range(), c="y", bold=False) vedo.printc("level / window".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(obj.level(), "/", obj.window(), c="y", bold=False) diff --git a/vedo/visual.py b/vedo/visual.py index cf0437d5..2ac1694f 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -42,6 +42,16 @@ def show(self, **options): Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) + + @property + def LUT(self): + """Return the lookup table of the object.""" + return self.mapper.GetLookupTable() + + @LUT.setter + def LUT(self, lut): + """Set the lookup table of the object.""" + self.mapper.SetLookupTable(lut) def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): """Build a thumbnail of the object and return it as an array.""" @@ -411,6 +421,101 @@ def alpha(self, alpha, vmin=None, vmax=None): class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" + def clone2d( + self, + pos=(0, 0), + coordsys=4, + scale=None, + c=None, + alpha=None, + ps=2, + lw=1, + sendback=False, + layer=0, + ): + """ + Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. + + Arguments: + coordsys : (int) + the coordinate system, options are + - 0 = Displays + - 1 = Normalized Display + - 2 = Viewport (origin is the bottom-left corner of the window) + - 3 = Normalized Viewport + - 4 = View (origin is the center of the window) + - 5 = World (anchor the 2d image to mesh) + + ps : (int) + point size in pixel units + + lw : (int) + line width in pixel units + + sendback : (bool) + put it behind any other 3D object + + Examples: + - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) + + ![](https://vedo.embl.es/images/other/clone2d.png) + """ + if scale is None: + msiz = self.diagonal_size() + if vedo.plotter_instance and vedo.plotter_instance.window: + sz = vedo.plotter_instance.window.GetSize() + dsiz = utils.mag(sz) + scale = dsiz / msiz / 10 + else: + scale = 350 / msiz + + cmsh = self.clone() + poly = cmsh.pos(0, 0, 0).scale(scale).dataset + + mapper3d = self.mapper + cm = mapper3d.GetColorMode() + lut = mapper3d.GetLookupTable() + sv = mapper3d.GetScalarVisibility() + use_lut = mapper3d.GetUseLookupTableScalarRange() + vrange = mapper3d.GetScalarRange() + sm = mapper3d.GetScalarMode() + + mapper2d = vtk.vtkPolyDataMapper2D() + mapper2d.ShallowCopy(mapper3d) + mapper2d.SetInputData(poly) + mapper2d.SetColorMode(cm) + mapper2d.SetLookupTable(lut) + mapper2d.SetScalarVisibility(sv) + mapper2d.SetUseLookupTableScalarRange(use_lut) + mapper2d.SetScalarRange(vrange) + mapper2d.SetScalarMode(sm) + + act2d = vtk.vtkActor2D() + act2d.SetMapper(mapper2d) + act2d.SetLayerNumber(layer) + csys = act2d.GetPositionCoordinate() + csys.SetCoordinateSystem(coordsys) + act2d.SetPosition(pos) + if c is not None: + c = colors.get_color(c) + act2d.GetProperty().SetColor(c) + mapper2d.SetScalarVisibility(False) + else: + act2d.GetProperty().SetColor(cmsh.color()) + if alpha is not None: + act2d.GetProperty().SetOpacity(alpha) + else: + act2d.GetProperty().SetOpacity(cmsh.alpha()) + act2d.GetProperty().SetPointSize(ps) + act2d.GetProperty().SetLineWidth(lw) + act2d.GetProperty().SetDisplayLocationToForeground() + if sendback: + act2d.GetProperty().SetDisplayLocationToBackground() + + # print(csys.GetCoordinateSystemAsString()) + # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) + return act2d + ################################################## def copy_properties_from(self, source, deep=True, actor_related=True): """ @@ -2188,6 +2293,19 @@ def scale(self, s=None, absolute=False): ######################################################################################## class PictureVisual(ActorTransforms, CommonVisual): + + def memory_size(self): + """ + Return the size in bytes of the object in memory. + """ + return self.dataset.GetActualMemorySize() + + def scalar_range(self): + """ + Return the scalar range of the image. + """ + return self.dataset.GetScalarRange() + def alpha(self, a=None): """Set/get picture's transparency in the rendering scene.""" if a is not None: @@ -2243,12 +2361,6 @@ def diagonal_size(self): b = self.bounds() return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - def memory_size(self): - """ - Return the size in bytes of the object in memory. - """ - return self.GetActualMemorySize() - ######################################################################################## # class AssemblyVisual(CommonVisual): From 99373d78aa1a76115112bd553ac1206ff37f29f6 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 15:17:31 +0200 Subject: [PATCH 076/251] reshuffling methods in mesh.py --- vedo/core.py | 8 ++++---- vedo/pointcloud.py | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index 49abe369..ac463939 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -922,10 +922,10 @@ def interpolate_data_from( if on == "points": points = source.dataset elif on == "cells": - poly2 = vtk.vtkPolyData() - poly2.ShallowCopy(source.dataset) c2p = vtk.vtkCellDataToPointData() - c2p.SetInputData(poly2) + # poly2 = vtk.vtkPolyData() + # poly2.ShallowCopy(source.dataset) + c2p.SetInputData(source.dataset) c2p.Update() points = c2p.GetOutput() else: @@ -978,7 +978,7 @@ def interpolate_data_from( else: cpoly = interpolator.GetOutput() - self.dataset.DeepCopy(cpoly) + self._update(self.dataset, reset_locators=False) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index bed6e6e3..a31f6ac8 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -723,7 +723,9 @@ def polydata(self, **kwargs): Returns the underlying ``vtkPolyData`` object. """ - print("WARNING: call to .polydata() is obsolete, use property .dataset instead.") + colors.printc( + "WARNING: call to .polydata() is obsolete, use property .dataset instead.", + c="y") return self def clone(self, deep=True): From 847cf6d7ef30cf79a526b879d6ebcdc85a4b5b57 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 15:18:00 +0200 Subject: [PATCH 077/251] reshuffling methods in mesh.py 3 --- vedo/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vedo/core.py b/vedo/core.py index ac463939..8248173b 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -978,7 +978,7 @@ def interpolate_data_from( else: cpoly = interpolator.GetOutput() - self._update(self.dataset, reset_locators=False) + self._update(cpoly, reset_locators=False) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self From d83444c1c837bd6541ab9d36ae54375d6511baeb Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 15:28:53 +0200 Subject: [PATCH 078/251] remove erroneous DeepCopy --- vedo/core.py | 3 +++ vedo/pointcloud.py | 17 ++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index 8248173b..d9a37182 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -911,7 +911,10 @@ def interpolate_data_from( see above. Examples: + - [interpolate_scalar1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar1.py) - [interpolate_scalar3.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar3.py) + - [interpolate_scalar4.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_scalar4.py) + - [image_probe.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/image_probe.py) ![](https://vedo.embl.es/images/advanced/interpolateMeshArray.png) """ diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index a31f6ac8..49b999b1 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -927,7 +927,7 @@ def clean(self): cpd.ConvertStripsToPolysOn() cpd.SetInputData(self.dataset) cpd.Update() - self.dataset.DeepCopy(cpd.GetOutput()) + self._update(cpd.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#pts {self.dataset.GetNumberOfPoints()}" ) @@ -974,7 +974,7 @@ def subsample(self, fraction, absolute=False): if self.property.GetRepresentation() == 0: ps = self.property.GetPointSize() - self.dataset.DeepCopy(cpd.GetOutput()) + self._update(self.dataset) self.ps(ps) self.pipeline = utils.OperationNode( @@ -1032,7 +1032,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): gf = vtk.vtkGeometryFilter() gf.SetInputData(thres.GetOutput()) gf.Update() - self.dataset.DeepCopy(gf.GetOutput()) + self._update(gf.GetOutput()) self.pipeline = utils.OperationNode("threshold", parents=[self]) return self @@ -1045,7 +1045,7 @@ def quantize(self, value): qp.SetInputData(self.dataset) qp.SetQFactor(value) qp.Update() - self.dataset.DeepCopy(qp.GetOutput()) + self._update(qp.GetOutput()) self.flat() self.pipeline = utils.OperationNode("quantize", parents=[self]) return self @@ -1510,8 +1510,7 @@ def remove_outliers(self, radius, neighbors=5): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) - self.dataset.DeepCopy(inputobj) - self.mapper.ScalarVisibilityOff() + self._update(removal.GetOutput()) self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self @@ -1601,7 +1600,7 @@ def smooth_mls_2d(self, f=0.2, radius=None): pb = utils.ProgressBar(0, ncoords) for p in coords: if pb: - pb.print("smoothMLS2D working ...") + pb.print("smooth_mls_2d working ...") pts = self.closest_point(p, n=Ncp, radius=radius) if len(pts) > 3: ptsmean = pts.mean(axis=0) # plane center @@ -1622,7 +1621,6 @@ def smooth_mls_2d(self, f=0.2, radius=None): self.info["variances"] = np.array(variances) self.info["is_valid"] = np.array(valid) self.vertices = newpts - self.pipeline = utils.OperationNode("smooth_mls_2d", parents=[self]) return self @@ -1684,7 +1682,8 @@ def _relax(voron): _constrain_points(vor.vertices) pts = _relax(vor) # m = vedo.Mesh([pts, self.cells]) # not yet working properly - out = Points(pts, c="k") + # m.vertices = pts # not yet working properly + out = Points(pts) out.pipeline = utils.OperationNode("smooth_lloyd", parents=[self]) return out From c1ef930c8e5610772b5940d27fb906cc6b0db84c Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 16:27:18 +0200 Subject: [PATCH 079/251] fix chamfer_distance --- vedo/pointcloud.py | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 49b999b1..aea5037d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1443,8 +1443,8 @@ def hausdorff_distance(self, points): ![](https://vedo.embl.es/images/feats/heart.png) """ hp = vtk.vtkHausdorffDistancePointSetFilter() - hp.SetInputData(0, self) - hp.SetInputData(1, points) + hp.SetInputData(0, self.dataset) + hp.SetInputData(1, points.dataset) hp.SetTargetDistanceMethodToPointToCell() hp.Update() return hp.GetHausdorffDistance() @@ -1452,11 +1452,22 @@ def hausdorff_distance(self, points): def chamfer_distance(self, pcloud): """ Compute the Chamfer distance to the input point set. - Returns a single `float`. + + Example: + ```python + from vedo import * + cloud1 = np.random.randn(1000, 3) + cloud2 = np.random.randn(1000, 3) + [1, 2, 3] + c1 = Points(cloud1, r=5, c="red") + c2 = Points(cloud2, r=5, c="green") + print(c1.chamfer_distance(c2)) + show(c1, c2, axes=1, viewup="z").close() + ``` """ + # Definition of Chamfer distance may vary, here we use the average if not pcloud.point_locator: pcloud.point_locator = vtk.vtkPointLocator() - pcloud.point_locator.SetDataSet(pcloud) + pcloud.point_locator.SetDataSet(pcloud.dataset) pcloud.point_locator.BuildLocator() if not self.point_locator: self.point_locator = vtk.vtkPointLocator() @@ -2933,14 +2944,14 @@ def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=No src = vtk.vtkProgrammableSource() opts = self.vertices - def _readPoints(): + def _read_points(): output = src.GetPolyDataOutput() points = vtk.vtkPoints() for p in opts: points.InsertNextPoint(p) output.SetPoints(points) - src.SetExecuteMethod(_readPoints) + src.SetExecuteMethod(_read_points) dens = vtk.vtkDensifyPointCloudFilter() dens.SetInputConnection(src.GetOutputPort()) @@ -2963,7 +2974,7 @@ def _readPoints(): pts = utils.vtk2numpy(dens.GetOutput().GetPoints().GetData()) cld = Points(pts, c=None).point_size(self.property.GetPointSize()) cld.interpolate_data_from(self, n=nclosest, radius=radius) - cld.name = "densifiedCloud" + cld.name = "DensifiedCloud" cld.pipeline = utils.OperationNode( "densify", @@ -3357,7 +3368,7 @@ def visible_points(self, area=(), tol=None, invert=False): Example: ```python - from vedo import Ellipsoid, show, visible_points + from vedo import Ellipsoid, show s = Ellipsoid().rotate_y(30) #Camera options: pos, focal_point, viewup, distance, @@ -3372,8 +3383,20 @@ def visible_points(self, area=(), tol=None, invert=False): """ svp = vtk.vtkSelectVisiblePoints() svp.SetInputData(self.dataset) - svp.SetRenderer(vedo.plotter_instance.renderer) + ren = None + if vedo.plotter_instance: + if vedo.plotter_instance.renderer: + ren = vedo.plotter_instance.renderer + svp.SetRenderer(ren) + if not ren: + vedo.logger.warning( + "visible_points() can only be used after a rendering step" + ) + return None + + if len(area) == 2: + area = utils.flatten(area) if len(area) == 4: # specify a rectangular region svp.SetSelection(area[0], area[1], area[2], area[3]) @@ -3383,6 +3406,6 @@ def visible_points(self, area=(), tol=None, invert=False): svp.SelectInvisibleOn() svp.Update() - m = Points(svp.GetOutput()).point_size(5) + m = Points(svp.GetOutput())#.point_size(5) m.name = "VisiblePoints" return m From 4427988eaf9734554613841be1f1470ac543fbae Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 18:28:54 +0200 Subject: [PATCH 080/251] removing probe_*() methods --- docs/changes.md | 4 + examples/volumetric/point_density.py | 16 --- examples/volumetric/probe_line1.py | 19 +-- examples/volumetric/probe_line2.py | 37 +++--- examples/volumetric/probe_points.py | 16 +-- examples/volumetric/slice_mesh.py | 15 ++- examples/volumetric/volume_operations.py | 43 +++--- vedo/addons.py | 8 +- vedo/core.py | 162 +++++++---------------- vedo/transformations.py | 36 ++--- vedo/volume.py | 13 +- 11 files changed, 148 insertions(+), 221 deletions(-) delete mode 100644 examples/volumetric/point_density.py diff --git a/docs/changes.md b/docs/changes.md index 08ce76dd..c1fd7eed 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -24,6 +24,10 @@ - change .lines() to .lines everywhere - change .edges() to .edges everywhere - change .normals() to .vertex_normals and .cell_normals everywhere +- removed `Volume.probe_points()` +- removed `Volume.probe_line()` +- removed `Volume.probe_plane()` + diff --git a/examples/volumetric/point_density.py b/examples/volumetric/point_density.py deleted file mode 100644 index 3b1c997e..00000000 --- a/examples/volumetric/point_density.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Density field as a Volume from a point cloud""" -from vedo import * - -surf = Mesh(dataurl+'bunny.obj').normalize().subdivide(2) -surf.color("k5").point_size(2) - -vol = surf.density() - -plane = vol.probe_plane(normal=(1,1,1)).alpha(0.5) - -show([ - ("Point cloud", surf), - ("Point density as Volume", vol, vol.box(), plane) - ], N=2, -).close() - diff --git a/examples/volumetric/probe_line1.py b/examples/volumetric/probe_line1.py index 1585c7d8..d8a916f9 100644 --- a/examples/volumetric/probe_line1.py +++ b/examples/volumetric/probe_line1.py @@ -1,17 +1,20 @@ """Probe a Volume (voxel dataset) with lines""" from vedo import * -vol = Volume(dataurl+"embryo.slc") +vol = Volume(dataurl + "embryo.slc") lines = [] for i in range(60): # probe scalars on 60 parallel lines step = (i - 30) * 2 - p1 = vol.center() + vector(-100, step, step) - p2 = vol.center() + vector( 100, step, step) - pl = vol.probe_line(p1, p2).cmap('hot', vmin=0, vmax=110) - pl.alpha(0.5).linewidth(4) - lines.append(pl) - #print(pl.pointdata.keys()) # numpy scalars can be accessed here - #print(pl.pointdata['vtkValidPointMask']) # the mask of valid points + p1 = vol.center() + [-100, step, step] + p2 = vol.center() + [ 100, step, step] + ln = Line(p1, p2, res=100) + lines.append(ln) +lines = merge(lines) + +# Probe the Volume with the lines and add the scalars as pointdata +lines.probe(vol) +lines.cmap('hot', vmin=0, vmax=110).add_scalarbar() +print(lines.pointdata) show(lines, __doc__, axes=1).close() diff --git a/examples/volumetric/probe_line2.py b/examples/volumetric/probe_line2.py index 0ac2f5d2..a1eb0c3e 100644 --- a/examples/volumetric/probe_line2.py +++ b/examples/volumetric/probe_line2.py @@ -1,27 +1,32 @@ """Probe a Volume with a line and plot the intensity values""" -from vedo import dataurl, Volume, show +from vedo import dataurl, Volume, Line, show from vedo.pyplot import plot -vol = Volume(dataurl+'embryo.slc') -vol.add_scalarbar3d('wild-type mouse embryo', c='k') +vol = Volume(dataurl + "embryo.slc") +vol.add_scalarbar3d("wild-type mouse embryo", c="k") -p1, p2 = (50,50,50), (200,200,200) -pl = vol.probe_line(p1, p2, res=100).linewidth(4) +p1, p2 = (50, 50, 50), (200, 200, 200) +pl = Line(p1, p2, res=100).lw(4) -xvals = pl.vertices[:,0] -yvals = pl.pointdata[0] # get the probed values along the line +# Probe the Volume with the line +pl.probe(vol) +# Get the probed values along the line +xvals = pl.vertices[:, 0] +yvals = pl.pointdata[0] + +# Plot the intensity values fig = plot( - xvals, yvals, - xtitle=" ", ytitle="voxel intensity", - aspect=16/9, + xvals, + yvals, + xtitle=" ", + ytitle="voxel intensity", + aspect=16 / 9, spline=True, - lc="r", # line color - marker="*", # marker style - mc="dr", # marker color - ms=0.9, # marker size + lc="r", # line color + marker="O", # marker style ) -fig.shift(0,25,0) +fig.shift(0, 25, 0) -show(vol, pl, fig, __doc__, axes=dict(xygrid=0, yzgrid=0)).close() +show(vol, pl, fig, __doc__, axes=14).close() diff --git a/examples/volumetric/probe_points.py b/examples/volumetric/probe_points.py index a27c5d20..97c57e4f 100644 --- a/examples/volumetric/probe_points.py +++ b/examples/volumetric/probe_points.py @@ -1,17 +1,17 @@ """Probe a voxel dataset at specified points and plot a histogram of the values""" -from vedo import np, dataurl, Volume, Axes, show +from vedo import np, dataurl, Points, Volume, Axes, show from vedo.pyplot import histogram -vol = Volume(dataurl+'embryo.slc').print() +vol = Volume(dataurl + 'embryo.slc') +vol_axes = Axes(vol) pts = np.random.rand(5000, 3)*256 -mpts = vol.probe_points(pts).point_size(3) - +mpts = Points(pts).probe(vol).point_size(3) mpts.print() -# valid = mpts.pointdata['vtkValidPointMask'] -scals = mpts.pointdata['SLCImage'] -his = histogram(scals, xtitle='probed voxel value', xlim=(5,100)) +# valid = mpts.pointdata['ValidPointMask'] +scalars = mpts.pointdata['SLCImage'] +his = histogram(scalars, xtitle='Probed voxel value', xlim=(5,100)) -show([(vol, Axes(vol), mpts, __doc__), his], N=2, sharecam=False).close() +show([(vol, vol_axes, mpts, __doc__), his], N=2, sharecam=False).close() diff --git a/examples/volumetric/slice_mesh.py b/examples/volumetric/slice_mesh.py index 4214715c..55477f18 100644 --- a/examples/volumetric/slice_mesh.py +++ b/examples/volumetric/slice_mesh.py @@ -1,11 +1,16 @@ -"""Slice/probe a Volume with a Mesh""" +"""Probe a Volume with a Mesh""" from vedo import * +# Load a Volume vol = Volume(dataurl + 'embryo.slc') vol.cmap('bone').mode(1) -msh = Paraboloid(res=200).scale(200).pos(100,100,200) -scalars = vol.probe_points(msh).pointdata[0] -msh.cmap('Spectral', scalars).add_scalarbar() +# Create a Mesh (can be any mesh) +msh = Paraboloid(res=200).scale(200).pos([100,100,200]) -show(vol, msh, __doc__, axes=True).close() +# Probe the Volume with the Mesh +# and colorize it with the probed values +msh.probe(vol) +msh.cmap('Spectral').add_scalarbar().print() + +show(vol, msh, __doc__, axes=1).close() diff --git a/examples/volumetric/volume_operations.py b/examples/volumetric/volume_operations.py index 50acf8d7..3323c653 100644 --- a/examples/volumetric/volume_operations.py +++ b/examples/volumetric/volume_operations.py @@ -7,54 +7,43 @@ from vedo import * printc(__doc__) -plt = Plotter(N=6) +plt = Plotter(N=4) -v0 = Volume(dataurl+'embryo.slc').cmap(0) -v0.add_scalarbar3d() +v0 = Volume(dataurl+'embryo.slc').cmap(0).add_scalarbar3d() plt.at(0).show("original", v0) -v1 = v0.clone().operation("gradient").operation("mag") -v1.add_scalarbar3d() -# print(v1.pointdata.keys()) +v1 = v0.clone().operation("gradient").operation("mag").add_scalarbar3d() plt.at(1).show("gradient", v1) -v2 = v0.clone().operation("divergence").cmap(2) -v2.add_scalarbar3d() -plt.at(2).show("divergence", v2) +v3 = v0.clone().operation("median").cmap(4).add_scalarbar3d() +plt.at(2).show("median", v3) -v3 = v0.clone().operation("laplacian").cmap(3) -v3.add_scalarbar3d() -plt.at(3).show("laplacian", v3) - -v4 = v0.clone().operation("median").cmap(4) -v4.add_scalarbar3d() -plt.at(4).show("median", v4) - -v5 = v0.clone().operation("dot", v0).cmap(7) -v5.add_scalarbar3d() -plt.at(5).show("dot(v0,v0)", v5, zoom=1.3) +v4 = v0.clone().operation("dot", v0).cmap(7).add_scalarbar3d() +plt.at(3).show("dot(v0,v0)", v4, zoom=1.3) plt.interactive().close() -############################################################# example application +#################################################################################### #Start with creating a masked Volume then compute its gradient and probe 2 points msh = Ellipsoid() -vol = msh.signed_distance(dims=(20, 20, 20)) +vol = msh.signed_distance(dims=[20, 20, 20]) vol.threshold(above=0.0, replace=0.0) # replacing all values outside to 0 vol.cmap("blue").alpha([0.9, 0.0]).alpha_unit(0.1).add_scalarbar3d() vgrad = vol.operation("gradient") -printc(vgrad.pointdata.keys(), c='g') +printc(vgrad.pointdata, c='g') grd = vgrad.pointdata['ImageScalarsGradient'] -pts = vol.points() # coords as numpy array -arrs = Arrows(pts, pts + grd*0.1).lighting('off') +pts = vol.vertices # coords as numpy array +arrs = Arrows(pts, pts + grd*0.1) pts_probes = [[0.2,0.5,0.5], [0.2,0.3,0.4]] -vects = vgrad.probe_points(pts_probes).pointdata['ImageScalarsGradient'] -arrs_pts_probe = Arrows(pts_probes, pts_probes+vects) +vpts_probes = Points(pts_probes).probe(vgrad) +vects = vpts_probes.pointdata['ImageScalarsGradient'] + +arrs_pts_probe = Arrows(pts_probes, pts_probes + vects) plt = Plotter(axes=1, N=2) plt.at(0).show("A masked Volume", vol) diff --git a/vedo/addons.py b/vedo/addons.py index 51879ebc..d493a60b 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4193,10 +4193,10 @@ def add_global_axes(axtype=None, c=None, bounds=()): sz = d except AttributeError: pass - if isinstance(largestact, Assembly): - ocf.SetInputData(largestact.unpack(0)) - else: - ocf.SetInputData(largestact.dataset) + # if isinstance(largestact, Assembly): + # ocf.SetInputData(largestact.unpack(0).actor.data) + # else: + ocf.SetInputData(largestact.dataset) ocf.Update() oc_mapper = vtk.vtkHierarchicalPolyDataMapper() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) diff --git a/vedo/core.py b/vedo/core.py index d9a37182..ca8a433d 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -747,7 +747,20 @@ def map_cells_to_points(self, arrays=(), move=False): @property def vertices(self): """Return the vertices (points) coordinates.""" - varr = self.dataset.GetPoints().GetData() + try: + # valid for polydata and unstructured grid + varr = self.dataset.GetPoints().GetData() + + except AttributeError: + try: + # valid for rectilinear/structured grid, image data + v2p = vtk.vtkImageToPoints() + v2p.SetInputData(self.dataset) + v2p.Update() + varr = v2p.GetOutput().GetPoints().GetData() + except AttributeError: + return np.array([]) + narr = utils.vtk2numpy(varr) return narr @@ -756,27 +769,19 @@ def vertices(self): def vertices(self, pts): """Set vertices (points) coordinates.""" arr = utils.numpy2vtk(pts, dtype=np.float32) - vpts = self.dataset.GetPoints() - vpts.SetData(arr) - vpts.Modified() + try: + vpts = self.dataset.GetPoints() + vpts.SetData(arr) + vpts.Modified() + except AttributeError: + vedo.logger.error(f"Cannot set vertices for object {type(self)}") + return self # reset mesh to identity matrix position/rotation: self.point_locator = None self.cell_locator = None self.line_locator = None self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.transform = LinearTransform() - # BUG - # from vedo import * - # plt = Plotter(interactive=False, axes=7) - # s = Disc(res=(8,120)).linewidth(0.1) - # print([s.dataset.GetPoints().GetData()]) - # # plt.show(s) # depends if I show it or not.. - # # plt.renderer.AddActor(s.actor) - # print([s.dataset.GetPoints().GetData()]) - # for i in progressbar(100): - # s.vertices[:,2] = sin(i/10.*s.vertices[:,0])/5 # move vertices in z - # show(s, interactive=1) - # exit() return self @property @@ -1143,6 +1148,31 @@ def vorticity(self, array_name=None, on="points", fast=False): vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) return vvecs + def probe(self, source): + """ + Takes a `Volume` (or any other data set) + and probes its scalars at the specified points in space. + + Note that a mask is also output with valid/invalid points which can be accessed + with `mesh.pointdata['ValidPointMask']`. + + Check out also: + `interpolate_data_from()` + + Examples: + - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) + + ![](https://vedo.embl.es/images/volumetric/probePoints.png) + """ + probe_filter = vtk.vtkProbeFilter() + probe_filter.SetSourceData(source.dataset) + probe_filter.SetInputData(self.dataset) + probe_filter.Update() + self.pipeline = utils.OperationNode("probe", parents=[self, source]) + self._update(probe_filter.GetOutput(), reset_locators=False) + self.pointdata.rename("vtkValidPointMask", "ValidPointMask") + return self + def compute_cell_size(self): """Add to this mesh a cell data array containing the areas of the polygonal faces""" csf = vtk.vtkCellSizeFilter() @@ -1870,103 +1900,3 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): c="#9e2a2b", ) return ug - - def probe_points(self, pts): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars at the specified points in space. - - Note that a mask is also output with valid/invalid points which can be accessed - with `mesh.pointdata['vtkValidPointMask']`. - - Examples: - - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) - - ![](https://vedo.embl.es/images/volumetric/probePoints.png) - """ - if isinstance(pts, vedo.pointcloud.Points): - pts = pts.vertices - - def _readpoints(): - output = src.GetPolyDataOutput() - points = vtk.vtkPoints() - for p in pts: - x, y, z = p - points.InsertNextPoint(x, y, z) - output.SetPoints(points) - - cells = vtk.vtkCellArray() - cells.InsertNextCell(len(pts)) - for i in range(len(pts)): - cells.InsertCellPoint(i) - output.SetVerts(cells) - - src = vtk.vtkProgrammableSource() - src.SetExecuteMethod(_readpoints) - src.Update() - img = self.dataset - probeFilter = vtk.vtkProbeFilter() - probeFilter.SetSourceData(img) - probeFilter.SetInputConnection(src.GetOutputPort()) - probeFilter.Update() - poly = probeFilter.GetOutput() - pm = vedo.mesh.Mesh(poly) - pm.name = "ProbePoints" - pm.pipeline = utils.OperationNode("probe_points", parents=[self]) - return pm - - - def probe_line(self, p1, p2, res=100): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars along a line defined by 2 points `p1` and `p2`. - - Note that a mask is also output with valid/invalid points which can be accessed - with `mesh.pointdata['vtkValidPointMask']`. - - Use `res` to set the nr of points along the line - - Examples: - - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) - - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) - - ![](https://vedo.embl.es/images/volumetric/probeLine2.png) - """ - line = vtk.vtkLineSource() - line.SetResolution(res) - line.SetPoint1(p1) - line.SetPoint2(p2) - probeFilter = vtk.vtkProbeFilter() - probeFilter.SetSourceData(self.dataset) - probeFilter.SetInputConnection(line.GetOutputPort()) - probeFilter.Update() - poly = probeFilter.GetOutput() - lnn = vedo.mesh.Mesh(poly) - lnn.name = "ProbeLine" - lnn.pipeline = utils.OperationNode("probe_line", parents=[self]) - return lnn - - - def probe_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): - """ - Takes a `Volume` (or any other vtk data set) - and probes its scalars on a plane defined by a point and a normal. - - Examples: - - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) - - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) - - ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) - """ - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - planeCut = vtk.vtkCutter() - planeCut.SetInputData(self.dataset) - planeCut.SetCutFunction(plane) - planeCut.Update() - poly = planeCut.GetOutput() - cutmesh = vedo.mesh.Mesh(poly) - cutmesh.name = "ProbePlane" - cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[self]) - return cutmesh diff --git a/vedo/transformations.py b/vedo/transformations.py index 1701068b..f3b501e8 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -68,31 +68,29 @@ def __init__(self, T=None): M.SetElement(i, j, T[i][j]) S.SetMatrix(M) T = S - + elif isinstance(T, vtk.vtkLinearTransform): S = vtk.vtkTransform() S.DeepCopy(T) T = S - + elif isinstance(T, LinearTransform): S = vtk.vtkTransform() S.DeepCopy(T.T) T = S - + self.T = T self.T.PostMultiply() self.inverse_flag = False - def __str__(self): s = "Transformation Matrix 4x4:\n" - s+= str(self.matrix) - s+= f"\n({self.n_concatenated_transforms} concatenated transforms)" + s += str(self.matrix) + s += f"\n({self.n_concatenated_transforms} concatenated transforms)" return s - + def __repr__(self): return self.__str__() - def apply_to(self, obj): """Apply transformation.""" @@ -118,7 +116,6 @@ def apply_to(self, obj): obj.cell_locator = None obj.line_locator = None - def reset(self): """Reset transformation.""" self.T.Identity() @@ -294,7 +291,7 @@ def set_position(self, p): q = np.array(self.T.GetPosition()) self.T.Translate(p - q) return self - + # def set_scale(self, s): # """Set absolute scale.""" # if not _is_sequence(s): @@ -311,7 +308,7 @@ def set_position(self, p): # self.T.Scale(s0, s1, s2) # print() # return self - + def get_scale(self): """Get current scale.""" return np.array(self.T.GetScale()) @@ -350,8 +347,9 @@ def matrix3x3(self): M = [[m.GetElement(i, j) for j in range(3)] for i in range(3)] return np.array(M) - - def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyplane=True): + def reorient( + self, newaxis, initaxis, around=(0, 0, 0), rotation=0, rad=False, xyplane=True + ): """ Set/Get object orientation. @@ -385,7 +383,7 @@ def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyp ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) """ - newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) + newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) if not np.any(initaxis - newaxis): @@ -394,9 +392,9 @@ def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyp if not np.any(initaxis + newaxis): print("Warning: in reorient() initaxis and newaxis are parallel") newaxis += np.array([0.0000001, 0.0000002, 0]) - angleth = np.pi + angleth = np.pi else: - angleth = np.arccos(np.dot(initaxis, newaxis)) + angleth = np.arccos(np.dot(initaxis, newaxis)) crossvec = np.cross(initaxis, newaxis) p = np.asarray(around) @@ -409,11 +407,12 @@ def reorient(self, newaxis, initaxis, around=(0,0,0), rotation=0, rad=False, xyp self.T.RotateWXYZ(np.rad2deg(angleth), crossvec) if xyplane: - self.T.RotateWXYZ(-self.orientation[0]*1.4142, newaxis) + self.T.RotateWXYZ(-self.orientation[0] * 1.4142, newaxis) self.T.Translate(p) return self + ######################################################################## # 2d ###### def cart2pol(x, y): @@ -429,6 +428,8 @@ def pol2cart(rho, theta): y = rho * np.sin(theta) return np.array([x, y]) + +######################################################################## # 3d ###### def cart2spher(x, y, z): """3D Cartesian to Spherical coordinate conversion.""" @@ -478,4 +479,3 @@ def spher2cyl(rho, theta, phi): rhoc = rho * np.sin(theta) z = rho * np.cos(theta) return np.array([rhoc, phi, z]) - diff --git a/vedo/volume.py b/vedo/volume.py index 91c6e95f..bd9b9763 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -128,7 +128,9 @@ def __init__( self.mapper = None self.pipeline = None self.info = {} - + self.name = "Volume" + self.filename = "" + ################### if isinstance(inputobj, str): if "https://" in inputobj: @@ -543,8 +545,13 @@ def apply_transform(self, T, fit=False): return self def imagedata(self): - """Return the underlying `vtkImagaData` object.""" - print("Volume.dataset is deprecated, use Volume.dataset instead") + """ + DEPRECATED: + Use `Volume.dataset` instead. + + Return the underlying `vtkImagaData` object. + """ + print("Volume.imagedata() is deprecated, use Volume.dataset instead") return self.dataset def tonumpy(self): From 4b10a93777a221063d84afc8f5ac8672751e1113 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 19:38:37 +0200 Subject: [PATCH 081/251] apply super().__init__ --- vedo/addons.py | 7 --- vedo/applications.py | 4 +- vedo/core.py | 3 ++ vedo/plotter.py | 2 +- vedo/shapes.py | 120 +++++++++++++++++++++---------------------- vedo/visual.py | 12 +++-- 6 files changed, 73 insertions(+), 75 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index d493a60b..60029101 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -257,8 +257,6 @@ def __init__( ![](https://vedo.embl.es/images/other/flag_labels.png) """ -# vtk.vtkLegendBoxActor.__init__(self) -# shapes.TextBase.__init__(self) super().__init__() self.name = "LegendBox" @@ -1501,10 +1499,8 @@ def __init__( if abs(pos[0][0] - pos[1][0]) < 0.1: slider_rep.GetTitleProperty().SetOrientation(90) -# SliderWidget.__init__(self) super().__init__() - self.SetAnimationModeToJump() self.SetRepresentation(slider_rep) if delayed: @@ -1602,7 +1598,6 @@ def __init__( slider_rep.GetTubeProperty().SetColor(c) -# SliderWidget.__init__(self) super().__init__() self.SetRepresentation(slider_rep) @@ -2083,7 +2078,6 @@ def __init__(self, c="k", alpha=None, lw=None, padding=None): cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) -# vtk.vtkActor2D.__init__(self) super().__init__() self.GetPositionCoordinate().SetValue(0, 0) @@ -2138,7 +2132,6 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) -# vtk.vtkActor2D.__init__(self) super().__init__() self.SetMapper(mapper) diff --git a/vedo/applications.py b/vedo/applications.py index 182e1afd..070e45e5 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -281,8 +281,9 @@ def __init__(self, inputobj=None): The main purpose of this class is to be used in conjunction with `Volume` for visualization using `mode="image"`. """ + super().__init__() + self.actor = vtk.vtkImageSlice() - # vtk.vtkImageSlice.__init__(self) self._mapper = vtk.vtkImageResliceMapper() self._mapper.SliceFacesCameraOn() @@ -491,7 +492,6 @@ def __init__(self, volume, levels=(None, None), histo_color="red5", **kwargs): ] kwargs["shape"] = custom_shape -# Plotter.__init__(self, **kwargs) super().__init__(**kwargs) # reuse the same underlying data as in vol diff --git a/vedo/core.py b/vedo/core.py index ca8a433d..7fcb6b04 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -900,6 +900,9 @@ def interpolate_data_from( If n (number of closest points to use) is set then radius value is ignored. + Check out also: + `probe()` which in many cases can be faster. + Arguments: kernel : (str) available kernels are [shepard, gaussian, linear, voronoi] diff --git a/vedo/plotter.py b/vedo/plotter.py index c8320859..63245507 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3678,7 +3678,7 @@ def _keypress(self, iren, event): " | q return control to python script |\n" " | Esc abort execution and exit python kernel |\n" " |------------------------------------------------------------|\n" - " | Mouse: Left-click rotate scene / pick objects |\n" + " | Mouse: Left-click rotate scene / pick objects |\n" " | Middle-click pan scene |\n" " | Right-click zoom scene in or out |\n" " | Cntrl-click rotate scene |\n" diff --git a/vedo/shapes.py b/vedo/shapes.py index 5d09ea97..533e33d2 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1126,7 +1126,7 @@ def __init__(self, points, smooth=0.0, degree=2, closed=False, res=None, easing= # evaluate spLine, including interpolated points: xnew, ynew, znew = splev(x, tckp) - Line.__init__(self, np.c_[xnew, ynew, znew], lw=2) + super().__init__(np.c_[xnew, ynew, znew], lw=2) self.name = "Spline" @@ -1193,7 +1193,7 @@ def __init__(self, points, z = zspline.Evaluate(pos) ln.append((x, y, z)) - Line.__init__(self, ln, lw=2) + super().__init__(ln, lw=2) self.clean() self.lighting("off") self.name = "KSpline" @@ -1249,7 +1249,7 @@ def __init__(self, points, closed=False, res=None): z = zspline.Evaluate(pos) ln.append((x, y, z)) - Line.__init__(self, ln, lw=2) + super().__init__(ln, lw=2) self.clean() self.lighting("off") self.name = "CSpline" @@ -1299,7 +1299,7 @@ def _bpoly(x): for ii in range(N): b = bernstein(N - 1, ii)(t) bcurve += np.outer(b, points[ii]) - Line.__init__(self, bcurve, lw=2) + super().__init__(bcurve, lw=2) self.name = "BezierLine" @@ -2335,7 +2335,7 @@ def __init__(self, line1, line2, tip_size=1.0, tip_width=1.0): line2.append(tip) resm = max(100, len(line1)) - Ribbon.__init__(self, line1, line2, res=(resm, 1)) + super().__init__(line1, line2, res=(resm, 1)) self.phong() self.actor.PickableOff() self.actor.DragableOff() @@ -2384,7 +2384,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=120, c="gray5", alpha=1.0): """ Build a Circle of radius `r`. """ - Polygon.__init__(self, pos, nsides=res, r=r) + super().__init__(pos, nsides=res, r=r) self.center = [] # filled by pointcloud.pcaEllipse self.nr_of_points = 0 @@ -2419,7 +2419,7 @@ def __init__(self, lat, lon, r=1.0, res=60, c="red4", alpha=1.0): clng = lon + np.arctan2(np.sin(phi) * sinr * coslat, cosr - sinlat * np.sin(clat)) coords.append([clng / np.pi + 1, clat * 2 / np.pi + 1, 0]) - Polygon.__init__(self, nsides=res, c=c, alpha=alpha) + super().__init__(nsides=res, c=c, alpha=alpha) self.vertices = coords # warp polygon points to match geo projection self.name = "Circle" @@ -3328,7 +3328,7 @@ class Cube(Box): def __init__(self, pos=(0, 0, 0), side=1.0, c="g4", alpha=1.0): """Build a cube of size `side`.""" - Box.__init__(self, pos, side, side, side, (), c, alpha) + super().__init__(pos, side, side, side, (), c, alpha) self.name = "Cube" @@ -3536,7 +3536,7 @@ class Pyramid(Cone): def __init__(self, pos=(0, 0, 0), s=1.0, height=1.0, axis=(0, 0, 1), c="green3", alpha=1): """Build a pyramid of specified base size `s` and `height`, centered at `pos`.""" - Cone.__init__(self, pos, s, height, axis, 4, c, alpha) + super().__init__(pos, s, height, axis, 4, c, alpha) self.name = "Pyramid" @@ -3894,7 +3894,7 @@ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0): c1 = Cylinder(r=thickness * s, height=2 * s) c2 = Cylinder(r=thickness * s, height=2 * s).rotate_x(90) c3 = Cylinder(r=thickness * s, height=2 * s).rotate_y(90) - poly = merge(c1, c2, c3).color(c).alpha(alpha).pos(pos) + poly = merge(c1, c2, c3).color(c).alpha(alpha).pos(pos).dataset super().__init__(poly, c, alpha) self.name = "Cross3D" @@ -4611,8 +4611,7 @@ def __init__( ![](https://vedo.embl.es/images/basic/colorcubes.png) """ - vtk.vtkActor2D.__init__(self) - TextBase.__init__(self) + super().__init__() self.mapper = vtk.vtkTextMapper() self.SetMapper(self.mapper) @@ -4714,7 +4713,7 @@ def size(self, s): return self -class CornerAnnotation(vtk.vtkCornerAnnotation, TextBase): +class CornerAnnotation(TextBase, vtk.vtkCornerAnnotation): # PROBABLY USELESS given that Text2D does pretty much the same ... """ Annotate the window corner with 2D text. @@ -4729,8 +4728,7 @@ class CornerAnnotation(vtk.vtkCornerAnnotation, TextBase): """ def __init__(self, c=None): - # vtk.vtkCornerAnnotation.__init__(self) - # TextBase.__init__(self) + super().__init__() self.property = self.GetTextProperty() @@ -4831,56 +4829,56 @@ def __init__(self, formula, pos=(0, 0, 0), s=1.0, bg=None, res=150, usetex=False """ self.formula = formula - try: - from tempfile import NamedTemporaryFile - import matplotlib.pyplot as mpltib + # try: + from tempfile import NamedTemporaryFile + import matplotlib.pyplot as mpltib - def build_img_plt(formula, tfile): + def build_img_plt(formula, tfile): - mpltib.rc("text", usetex=usetex) + mpltib.rc("text", usetex=usetex) - formula1 = "$" + formula + "$" - mpltib.axis("off") - col = get_color(c) - if bg: - bx = dict(boxstyle="square", ec=col, fc=get_color(bg)) - else: - bx = None - mpltib.text( - 0.5, - 0.5, - formula1, - size=res, - color=col, - alpha=alpha, - ha="center", - va="center", - bbox=bx, - ) - mpltib.savefig( - tfile, format="png", transparent=True, bbox_inches="tight", pad_inches=0 - ) - mpltib.close() - - if len(pos) == 2: - pos = (pos[0], pos[1], 0) - - tmp_file = NamedTemporaryFile(delete=True) - tmp_file.name = tmp_file.name + ".png" - - build_img_plt(formula, tmp_file.name) - - Picture.__init__(self, tmp_file.name, channels=4) - self.pos(pos) - self.alpha(alpha) - self.scale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) - self.name = "Latex" + formula1 = "$" + formula + "$" + mpltib.axis("off") + col = get_color(c) + if bg: + bx = dict(boxstyle="square", ec=col, fc=get_color(bg)) + else: + bx = None + mpltib.text( + 0.5, + 0.5, + formula1, + size=res, + color=col, + alpha=alpha, + ha="center", + va="center", + bbox=bx, + ) + mpltib.savefig( + tfile, format="png", transparent=True, bbox_inches="tight", pad_inches=0 + ) + mpltib.close() - except: - printc("Error in Latex()\n", formula, c="r") - printc(" latex or dvipng not installed?", c="r") - printc(" Try: usetex=False", c="r") - printc(" Try: sudo apt install dvipng", c="r") + if len(pos) == 2: + pos = (pos[0], pos[1], 0) + + tmp_file = NamedTemporaryFile(delete=True) + tmp_file.name = tmp_file.name + ".png" + + build_img_plt(formula, tmp_file.name) + + super().__init__(tmp_file.name, channels=4) + self.pos(pos) + self.alpha(alpha) + self.scale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) + self.name = "Latex" + + # except: + # printc("Error in Latex()\n", formula, c="r") + # printc(" latex or dvipng not installed?", c="r") + # printc(" Try: usetex=False", c="r") + # printc(" Try: sudo apt install dvipng", c="r") class ConvexHull(Mesh): diff --git a/vedo/visual.py b/vedo/visual.py index 2ac1694f..3dcd201c 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2213,11 +2213,13 @@ def interpolation(self, itype): ######################################################################################## class ActorTransforms: - def pos(self, point=None): + def pos(self, *p): """Set/get position of object.""" - if point is None: - return self.actor.GetPosition() - self.actor.SetPosition(point) + if len(p)==0: + return np.array(self.actor.GetPosition()) + if len(p)==2: + p = (p[0], p[1], 0) + self.actor.SetPosition(*p) return self def origin(self, point=None): @@ -2277,6 +2279,8 @@ def reorient(self, old_axis, new_axis): def shift(self, dp): """Add vector to current position.""" p = self.actor.GetPosition() + if len(dp)==2: + dp = (dp[0], dp[1], 0) self.actor.SetPosition(p[0] + dp[0], p[1] + dp[1], p[2] + dp[2]) return self From 7d54d41ba9afb6a60bd29826e21415cedf8b8acd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 21:40:15 +0200 Subject: [PATCH 082/251] Slicer2DPlotter moved to application module --- docs/changes.md | 2 +- vedo/applications.py | 319 ++++++++++++++++--------------------------- vedo/cli.py | 6 +- vedo/core.py | 10 +- vedo/plotter.py | 2 +- vedo/volume.py | 16 ++- 6 files changed, 142 insertions(+), 213 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index c1fd7eed..c64f7ffb 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -27,7 +27,7 @@ - removed `Volume.probe_points()` - removed `Volume.probe_line()` - removed `Volume.probe_plane()` - +- `Slicer2DPlotter` moved to application module diff --git a/vedo/applications.py b/vedo/applications.py index 070e45e5..f4cda1af 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -6,6 +6,11 @@ import numpy as np +try: + import vedo.vtkclasses as vtk +except ImportError: + import vtkmodules.all as vtk + import vedo from vedo.colors import color_map, get_color from vedo.utils import is_sequence, lin_interpolate, mag, precision @@ -269,145 +274,148 @@ def buttonfunc(_obj, _ename): self.add(hist) -########################################################################## -class VolumeSlice(vedo.Volume): +######################################################################################## +class Slicer2DPlotter(Plotter): """ - Derived class of `vtkImageSlice`. + A single slice of a Volume which always faces the camera, + but at the same time can be oriented arbitrarily in space. """ - def __init__(self, inputobj=None): - """ - This class is equivalent to `Volume` except for its representation. - The main purpose of this class is to be used in conjunction with `Volume` - for visualization using `mode="image"`. + def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): """ - super().__init__() + A single slice of a Volume which always faces the camera, + but at the same time can be oriented arbitrarily in space. - self.actor = vtk.vtkImageSlice() + Arguments: + levels : (list) + window and color levels + histo_color : (color) + histogram color, use `None` to disable it - self._mapper = vtk.vtkImageResliceMapper() - self._mapper.SliceFacesCameraOn() - self._mapper.SliceAtFocalPointOn() - self._mapper.SetAutoAdjustImageQuality(False) - self._mapper.BorderOff() + + """ - self.lut = None + if "shape" not in kwargs: + custom_shape = [ # define here the 2 rendering rectangle spaces + dict(bottomleft=(0.0, 0.0), topright=(1, 1), bg="k9"), # the full window + dict(bottomleft=(0.8, 0.8), topright=(1, 1), bg="k8", bg2="lb"), + ] + kwargs["shape"] = custom_shape + + if "interactive" not in kwargs: + kwargs["interactive"] = True - self.property = vtk.vtkImageProperty() - self.property.SetInterpolationTypeToLinear() - self.SetProperty(self.property) + super().__init__(**kwargs) - ################### - if isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath - elif os.path.isfile(inputobj): - pass - else: - inputobj = sorted(glob.glob(inputobj)) - - ################### - inputtype = str(type(inputobj)) - - if inputobj is None: - img = vtk.vtkImageData() - - if isinstance(inputobj, Volume): - img = inputobj.dataset - self.lut = utils.ctf2lut(inputobj) - - elif utils.is_sequence(inputobj): - - if isinstance(inputobj[0], str): # scan sequence of BMP files - ima = vtk.vtkImageAppend() - ima.SetAppendAxis(2) - pb = utils.ProgressBar(0, len(inputobj)) - for i in pb.range(): - f = inputobj[i] - picr = vtk.vtkBMPReader() - picr.SetFileName(f) - picr.Update() - mgf = vtk.vtkImageMagnitude() - mgf.SetInputData(picr.GetOutput()) - mgf.Update() - ima.AddInputData(mgf.GetOutput()) - pb.print("loading...") - ima.Update() - img = ima.GetOutput() + self.interactor.RemoveAllObservers() + self.add_callback("on key press", self.on_key_press) - else: - if "ndarray" not in inputtype: - inputobj = np.array(inputobj) + orig_volume = vol.clone(deep=False) + self.volume = vol - if len(inputobj.shape) == 1: - varr = utils.numpy2vtk(inputobj, dtype=float) - else: - if len(inputobj.shape) > 2: - inputobj = np.transpose(inputobj, axes=[2, 1, 0]) - varr = utils.numpy2vtk(inputobj.ravel(order="F"), dtype=float) - varr.SetName("input_scalars") + self.volume.actor = vtk.vtkImageSlice() + self.volume.property = self.volume.actor.GetProperty() - img = vtk.vtkImageData() - img.SetDimensions(inputobj.shape) - img.GetPointData().AddArray(varr) - img.GetPointData().SetActiveScalars(varr.GetName()) + self.volume.mapper = vtk.vtkImageResliceMapper() + self.volume.mapper.SliceFacesCameraOn() + self.volume.mapper.SliceAtFocalPointOn() + self.volume.mapper.SetAutoAdjustImageQuality(False) + self.volume.mapper.BorderOff() + self.volume.property.SetInterpolationTypeToLinear() - elif "ImageData" in inputtype: - img = inputobj + self.volume.mapper.SetInputData(self.volume.dataset) + self.volume.actor.SetMapper(self.volume.mapper) - elif isinstance(inputobj, Volume): - img = inputobj.inputdata() + # no argument will grab the existing cmap in vol (or use build_lut()) + self.lut = None + self.cmap() - elif "UniformGrid" in inputtype: - img = inputobj + if levels[0] and levels[1]: + vsl.lighting(window=levels[0], level=levels[1]) - elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata - if hasattr(inputobj, "Update"): - inputobj.Update() - img = inputobj.GetOutput() + self.usage_txt = ( + "H :rightarrow toggle this banner off\n" + "Left click & drag :rightarrow modify luminosity and contrast\n" + "SHIFT+Left click :rightarrow slice image obliquely\n" + "SHIFT+Middle click :rightarrow slice image perpendicularly\n" + "R :rightarrow Reset the Window/Color levels\n" + "X :rightarrow Reset to sagittal view\n" + "Y :rightarrow Reset to coronal view\n" + "Z :rightarrow Reset to axial view" + ) - elif isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = vedo.file_io.download(inputobj, verbose=False) - img = vedo.file_io.loadImageData(inputobj) + self.usage = Text2D( + self.usage_txt, + font="Calco", + pos="top-left", + s=0.8, + bg="yellow", + alpha=0.25, + ) - else: - vedo.logger.error(f"cannot understand input type {inputtype}") - return + hist = None + if histo_color is not None: + # try to reduce the number of values to histogram + dims = self.volume.dimensions() + n = (dims[0]-1) * (dims[1]-1) * (dims[2]-1) + n = min(1_000_000, n) + arr = np.random.choice(self.volume.pointdata[0], n) - self._data = img - self._mapper.SetInputData(img) - self.SetMapper(self._mapper) + hist = vedo.pyplot.histogram( + arr, + bins=12, + logscale=True, + c=histo_color, + ytitle="log_10 (counts)", + axes=dict(text_scale=1.9), + ).as2d(pos="bottom-left", scale=0.4) - def bounds(self): - """Return the bounding box as [x0,x1, y0,y1, z0,z1]""" - bns = [0, 0, 0, 0, 0, 0] - self.GetBounds(bns) - return bns + axes = kwargs.pop("axes", 7) + if axes == 7: + axe = vedo.addons.RulerAxes( + orig_volume, xtitle="x - ", ytitle="y - ", ztitle="z - " + ) + + box = orig_volume.box().alpha(0.25) + self.user_mode("image") + self.at(0).add(self.volume.actor, box, axe, self.usage, hist) + self.at(1).add(orig_volume) + + #################################################################### + def on_key_press(self, evt): + if evt.keypress == "q": + self.break_interaction() + elif evt.keypress.lower() == "h": + t = self.usage + if len(t.text()) > 50: + self.usage.text("Press H to show help") + else: + self.usage.text(self.usage_txt) + self.render() - def colorize(self, lut=None, fix_scalar_range=False): + def cmap(self, lut=None, fix_scalar_range=False): """ Assign a LUT (Look Up Table) to colorize the slice, leave it `None` to reuse an existing Volume color map. Use "bw" for automatic black and white. """ if lut is None and self.lut: - self.property.SetLookupTable(self.lut) + self.volume.property.SetLookupTable(self.lut) elif isinstance(lut, vtk.vtkLookupTable): - self.property.SetLookupTable(lut) + self.volume.property.SetLookupTable(lut) elif lut == "bw": - self.property.SetLookupTable(None) - self.property.SetUseLookupTableScalarRange(fix_scalar_range) + self.volume.property.SetLookupTable(None) + self.volume.property.SetUseLookupTableScalarRange(fix_scalar_range) return self def alpha(self, value): """Set opacity to the slice""" - self.property.SetOpacity(value) + self.volume.property.SetOpacity(value) return self def auto_adjust_quality(self, value=True): """Automatically reduce the rendering quality for greater speed when interacting""" - self._mapper.SetAutoAdjustImageQuality(value) + self.volume.mapper.SetAutoAdjustImageQuality(value) return self def slab(self, thickness=0, mode=0, sample_factor=2): @@ -428,14 +436,14 @@ def slab(self, thickness=0, mode=0, sample_factor=2): within the slab thickness. The default value is 2, but 1 will increase speed with very little loss of quality. """ - self._mapper.SetSlabThickness(thickness) - self._mapper.SetSlabType(mode) - self._mapper.SetSlabSampleFactor(sample_factor) + self.volume.mapper.SetSlabThickness(thickness) + self.volume.mapper.SetSlabType(mode) + self.volume.mapper.SetSlabSampleFactor(sample_factor) return self def face_camera(self, value=True): """Make the slice always face the camera or not.""" - self._mapper.SetSliceFacesCameraOn(value) + self.volume.mapper.SetSliceFacesCameraOn(value) return self def jump_to_nearest_slice(self, value=True): @@ -444,7 +452,7 @@ def jump_to_nearest_slice(self, value=True): instead of the default behavior where a new slice is interpolated between the original slices. Nothing happens if the plane is oblique to the original slices.""" - self.SetJumpToNearestSlice(value) + self.volume.SetJumpToNearestSlice(value) return self def fill_background(self, value=True): @@ -453,105 +461,18 @@ def fill_background(self, value=True): render out to the viewport boundary with the background color. The background color will be the lowest color on the lookup table that is being used for the image.""" - self._mapper.SetBackground(value) + self.volume.mapper.SetBackground(value) return self def lighting(self, window, level, ambient=1.0, diffuse=0.0): """Assign the values for window and color level.""" - self.property.SetColorWindow(window) - self.property.SetColorLevel(level) - self.property.SetAmbient(ambient) - self.property.SetDiffuse(diffuse) + self.volume.property.SetColorWindow(window) + self.volume.property.SetColorLevel(level) + self.volume.property.SetAmbient(ambient) + self.volume.property.SetDiffuse(diffuse) return self -######################################################################################## -class Slicer2DPlotter(Plotter): - """ - A single slice of a Volume which always faces the camera, - but at the same time can be oriented arbitrarily in space. - """ - - def __init__(self, volume, levels=(None, None), histo_color="red5", **kwargs): - """ - A single slice of a Volume which always faces the camera, - but at the same time can be oriented arbitrarily in space. - - Arguments: - levels : (list) - window and color levels - histo_color : (color) - histogram color, use `None` to disable it - - - """ - if "shape" not in kwargs: - custom_shape = [ # define here the 2 rendering rectangle spaces - dict(bottomleft=(0.0, 0.0), topright=(1, 1), bg="k9"), # the full window - dict(bottomleft=(0.8, 0.8), topright=(1, 1), bg="k8", bg2="lb"), - ] - kwargs["shape"] = custom_shape - - super().__init__(**kwargs) - - # reuse the same underlying data as in vol - vsl = VolumeSlice(volume) - - # no argument will grab the existing cmap in vol (or use build_lut()) - vsl.colorize() - - if levels[0] and levels[1]: - vsl.lighting(window=levels[0], level=levels[1]) - - usage = Text2D( - ( - "Left click & drag :rightarrow modify luminosity and contrast\n" - "SHIFT+Left click :rightarrow slice image obliquely\n" - "SHIFT+Middle click :rightarrow slice image perpendicularly\n" - "R :rightarrow Reset the Window/Color levels\n" - "X :rightarrow Reset to sagittal view\n" - "Y :rightarrow Reset to coronal view\n" - "Z :rightarrow Reset to axial view" - ), - font="Calco", - pos="top-left", - s=0.8, - bg="yellow", - alpha=0.25, - ) - - hist = None - if histo_color is not None: - # hist = CornerHistogram( - # volume.pointdata[0], - # bins=25, - # logscale=1, - # pos=(0.02, 0.02), - # s=0.175, - # c="dg", - # bg="k", - # alpha=1, - # ) - hist = vedo.pyplot.histogram( - volume.pointdata[0], - bins=10, - logscale=True, - c=histo_color, - ytitle="log_10 (counts)", - axes=dict(text_scale=1.9), - ) - hist = hist.as2d(pos="bottom-left", scale=0.5) - - axes = kwargs.pop("axes", 7) - interactive = kwargs.pop("interactive", True) - if axes == 7: - ax = vedo.addons.RulerAxes(vsl, xtitle="x - ", ytitle="y - ", ztitle="z - ") - - box = vsl.box().alpha(0.2) - self.at(0).show(vsl, box, ax, usage, hist, mode="image") - self.at(1).show(volume, interactive=interactive) - - ######################################################################## class RayCastPlotter(Plotter): """ diff --git a/vedo/cli.py b/vedo/cli.py index 58549737..bf1cee1e 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -802,10 +802,8 @@ def draw_scene(args): vol.cmap("bone_r") sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) - vedo.plotter_instance = None # reset - - plt = applications.Slicer2DPlotter(vol, axes=7) - plt.close() + vedo.plotter_instance = applications.Slicer2DPlotter(vol) + vedo.plotter_instance.show().close() return ######################################################################## diff --git a/vedo/core.py b/vedo/core.py index 7fcb6b04..424d4d98 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -434,7 +434,7 @@ def bounds(self): Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ - try: + try: # this is very slow for large meshes pts = self.vertices xmin, ymin, zmin = np.min(pts, axis=0) xmax, ymax, zmax = np.max(pts, axis=0) @@ -1493,6 +1493,14 @@ def scale(self, s=None, reset=False, origin=True): class VolumeAlgorithms(CommonAlgorithms): """Methods for Volume objects.""" + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + # OVERRIDE CommonAlgorithms.bounds() which is too slow + return self.dataset.GetBounds() + def isosurface(self, value=None, flying_edges=True): """ Return an `Mesh` isosurface extracted from the `Volume` object. diff --git a/vedo/plotter.py b/vedo/plotter.py index 63245507..ec8c0788 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -596,7 +596,7 @@ def __init__( # passing a sequence of dicts for renderers specifications if self.size == "auto": - self.size = (800, 1000) + self.size = (1000, 800) for rd in shape: x0, y0 = rd["bottomleft"] diff --git a/vedo/volume.py b/vedo/volume.py index bd9b9763..01c22115 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -130,7 +130,7 @@ def __init__( self.info = {} self.name = "Volume" self.filename = "" - + ################### if isinstance(inputobj, str): if "https://" in inputobj: @@ -334,13 +334,15 @@ def _repr_html_(self): ] return "\n".join(allt) - def clone(self): + def clone(self, deep=True): """Return a clone copy of the Volume.""" - newimg = vtk.vtkImageData() - newimg.CopyStructure(self.dataset) - newimg.CopyAttributes(self.dataset) - - newvol = Volume(newimg) + if deep: + newimg = vtk.vtkImageData() + newimg.CopyStructure(self.dataset) + newimg.CopyAttributes(self.dataset) + newvol = Volume(newimg) + else: + newvol = Volume(self.dataset) prop = vtk.vtkVolumeProperty() prop.DeepCopy(self.property) From ec9b34d4296f256eaef0b5ac18e1147814b31667 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 14 Oct 2023 21:53:23 +0200 Subject: [PATCH 083/251] bump version 7a --- vedo/applications.py | 10 +++++----- vedo/version.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vedo/applications.py b/vedo/applications.py index f4cda1af..f81bc96d 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -337,11 +337,11 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): "H :rightarrow toggle this banner off\n" "Left click & drag :rightarrow modify luminosity and contrast\n" "SHIFT+Left click :rightarrow slice image obliquely\n" - "SHIFT+Middle click :rightarrow slice image perpendicularly\n" - "R :rightarrow Reset the Window/Color levels\n" - "X :rightarrow Reset to sagittal view\n" - "Y :rightarrow Reset to coronal view\n" - "Z :rightarrow Reset to axial view" + "SHIFT+Middle click :rightarrow slice image perpendicularly" + # "R :rightarrow Reset the Window/Color levels\n" + # "X :rightarrow Reset to sagittal view\n" + # "Y :rightarrow Reset to coronal view\n" + # "Z :rightarrow Reset to axial view" ) self.usage = Text2D( diff --git a/vedo/version.py b/vedo/version.py index 422e5fdb..3b8cfe20 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev6a' +_version = '2023.5.0+dev7a' From dc69c98e7393afd3cba94dabd277f682aec6f3d1 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Sun, 15 Oct 2023 20:01:53 +0200 Subject: [PATCH 084/251] fix small bugs --- examples/advanced/cut_with_mesh1.py | 13 ++++++------- examples/advanced/geodesic_curve.py | 16 ++++++++-------- examples/advanced/mesh_smoother1.py | 19 ++++++++++--------- examples/basic/cells_within_bounds.py | 2 +- examples/basic/voronoi1.py | 8 ++++++-- vedo/mesh.py | 10 +++++----- vedo/pointcloud.py | 13 +++++++++---- vedo/shapes.py | 3 ++- 8 files changed, 47 insertions(+), 37 deletions(-) diff --git a/examples/advanced/cut_with_mesh1.py b/examples/advanced/cut_with_mesh1.py index ad197924..6d4aba0b 100644 --- a/examples/advanced/cut_with_mesh1.py +++ b/examples/advanced/cut_with_mesh1.py @@ -1,18 +1,17 @@ """Cut a mesh with another mesh""" -from vedo import dataurl, settings, Plotter, Volume, Ellipsoid +from vedo import dataurl, settings, Plotter, Volume, Ellipsoid, show settings.tiff_orientation_type = 4 # data origin is bottom-left -vol = Volume(dataurl+"embryo.tif") -iso = vol.isosurface(30, flying_edges=False).normalize() +vol = Volume(dataurl + "embryo.tif") +iso = vol.isosurface(30, flying_edges=False).normalize().pos(0,0,0) -# mesh used to cut: emsh = Ellipsoid().scale(0.4).pos(2.8, 1.5, 1.5).wireframe() # make a working copy and cut it with the ellipsoid -cut_embryo = iso.clone().cut_with_mesh(emsh).c("gold").bc("t") +cut_iso = iso.clone().cut_with_mesh(emsh).c("gold").bc("t") plt = Plotter(N=2, axes=1) -plt.at(0).show(iso, emsh, viewup="z") -plt.at(1).show(cut_embryo, __doc__) +plt.at(0).show(iso, emsh, __doc__) +plt.at(1).show(cut_iso, viewup="z") plt.interactive().close() diff --git a/examples/advanced/geodesic_curve.py b/examples/advanced/geodesic_curve.py index d05e90aa..6281a777 100644 --- a/examples/advanced/geodesic_curve.py +++ b/examples/advanced/geodesic_curve.py @@ -1,15 +1,15 @@ """Dijkstra algorithm to compute the graph geodesic. +Take as input a polygonal mesh and perform +a shortest path calculation between two vertices.""" +from vedo import IcoSphere, Earth, show -Takes as input a polygonal mesh and performs -a shortest path calculation 20 times""" -from vedo import Sphere, Earth, show -msh = Sphere(r=1.02, res=200).subsample(0.007).wireframe().alpha(0.1) -# msh.triangulate().clean() # often needed! +msh = IcoSphere(r=1.02, subdivisions=4) +msh.wireframe().alpha(0.2) -path = msh.geodesic([0.349,-0.440,0.852], [-0.176,-0.962,0.302]).c("red4") -# path = msh.geodesic(10728, 9056).c("red4") # use vertex indices +path = msh.geodesic([0.349,-0.440,0.852], [-0.176,-0.962,0.302]) +# path = msh.geodesic(36, 442) # use vertex indices # printc(geo.pointdata["VertexIDs"]) -show(Earth(), msh, __doc__, path, bg2='lb', viewup="z", zoom=1.3).close() +show(Earth(), msh, path, __doc__, bg2='lb', viewup="z", zoom=1.3).close() diff --git a/examples/advanced/mesh_smoother1.py b/examples/advanced/mesh_smoother1.py index 8ec0fbc9..f8019602 100644 --- a/examples/advanced/mesh_smoother1.py +++ b/examples/advanced/mesh_smoother1.py @@ -1,18 +1,19 @@ from vedo import dataurl, Plotter, Volume -plt = Plotter(N=2) # Load a mesh and show it -vol = Volume(dataurl+"embryo.tif") -m0 = vol.isosurface(flying_edges=False).normalize().lw(1).c("violet") +vol = Volume(dataurl + "embryo.tif") +m0 = vol.isosurface(flying_edges=False).normalize() +m0.lw(1).c("violet") # Smooth the mesh -m1 = m0.clone().smooth(niter=20).color("lg") +m1 = m0.clone().smooth(niter=20) +m1.color("lg") -plt.at(0).show(m0, "Original Mesh:") -plt.background('light blue') # set first renderer color +plt = Plotter(N=2) +plt.at(0).background("light blue") # set first renderer color +plt.show(m0, "Original Mesh:") -plt.at(1).show( - "Mesh polygons are smoothed:", m1, - viewup='z', zoom=1.5) +plt.at(1) +plt.show("Mesh polygons are smoothed:", m1, viewup="z", zoom=1.5) plt.interactive().close() diff --git a/examples/basic/cells_within_bounds.py b/examples/basic/cells_within_bounds.py index e031ab8a..e7383250 100644 --- a/examples/basic/cells_within_bounds.py +++ b/examples/basic/cells_within_bounds.py @@ -11,7 +11,7 @@ z1, z2 = -1.5, -0.5 # Find the cell IDs of cells within the z-axis bounds -ids = mesh.find_cells_in(zbounds=(z1,z2)) +ids = mesh.find_cells_in_bounds(zbounds=(z1,z2)) # Print the cell IDs in green to the console printc('IDs of cells within bounds:\n', ids, c='g') diff --git a/examples/basic/voronoi1.py b/examples/basic/voronoi1.py index aea6efac..5e47a3d8 100644 --- a/examples/basic/voronoi1.py +++ b/examples/basic/voronoi1.py @@ -2,14 +2,18 @@ import numpy as np from vedo import Points, show +# Generate a set of random points in the unit square points = np.random.random((500, 2)) +# Create a Voronoi tiling of the plane from a set of points. pts = Points(points).subsample(0.02) # impose a min distance of 2% vor = pts.generate_voronoi(padding=0.01) vor.cmap('Set3', "VoronoiID", on='cells').wireframe(False) -lab = vor.labels("VoronoiID", on='cells', scale=0.01) +# Create a label for each cell showing its ID +labels = vor.labels("VoronoiID", on='cells', scale=0.01, justify='center') -show(pts, vor, lab, __doc__, zoom=1.3).close() +# Plot the objects and close the window to continue +show(pts, vor, labels, __doc__, zoom=1.3).close() diff --git a/vedo/mesh.py b/vedo/mesh.py index d1376738..f4cd69b0 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -321,7 +321,7 @@ def cell_normals(self): Check out also `compute_normals(cells=True)` and `compute_normals_with_pca()`. """ vtknormals = self.dataset.GetCellData().GetNormals() - return utils.vtk2numpy(vtknormals) + return vtk2numpy(vtknormals) def texture( self, @@ -498,7 +498,7 @@ def texture( tname = self.dataset.GetPointData().GetTCoords().GetName() grad = self.gradient(tname) ugrad, vgrad = np.split(grad, 2, axis=1) - ugradm, vgradm = vedo.utils.mag2(ugrad), vedo.utils.mag2(vgrad) + ugradm, vgradm = mag2(ugrad), mag2(vgrad) gradm = np.log(ugradm + vgradm) largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] uvmap = self.pointdata[tname] @@ -508,9 +508,9 @@ def texture( if np.isin(f, largegrad_ids).all(): id1, id2, id3 = f uv1, uv2, uv3 = uvmap[f] - d12 = vedo.mag2(uv1 - uv2) - d23 = vedo.mag2(uv2 - uv3) - d31 = vedo.mag2(uv3 - uv1) + d12 = mag2(uv1 - uv2) + d23 = mag2(uv2 - uv3) + d31 = mag2(uv3 - uv1) idm = np.argmin([d12, d23, d31]) if idm == 0: new_points[id1] = new_points[id3] diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index aea5037d..b8a4aaee 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -574,6 +574,10 @@ def fibonacci_sphere(n): carr.InsertCellPoint(i) self.dataset.SetVerts(carr) + elif isinstance(inputobj, PointAlgorithms): + self.dataset = inputobj.dataset + self.copy_properties_from(inputobj) + elif utils.is_sequence(inputobj): # passing point coords self.dataset = utils.buildPolyData(utils.make3d(inputobj)) @@ -1240,7 +1244,7 @@ def align_with_landmarks( return self def normalize(self): - """Scale Mesh average size to unit.""" + """Scale average size to unit.""" coords = self.vertices if not coords.shape[0]: return self @@ -1248,12 +1252,13 @@ def normalize(self): pts = coords - cm xyz2 = np.sum(pts * pts, axis=0) scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) - self.scale(scale).pos(cm) + self.scale(scale, origin=cm) + self.pipeline = utils.OperationNode("normalize", parents=[self]) return self def mirror(self, axis="x", origin=True): """ - Mirror the mesh along one of the cartesian axes + Mirror reflect along one of the cartesian axes Arguments: axis : (str) @@ -1281,7 +1286,7 @@ def mirror(self, axis="x", origin=True): return self def flip_normals(self): - """Flip all mesh normals. Same as `mesh.mirror('n')`.""" + """Flip all normals.""" rs = vtk.vtkReverseSense() rs.SetInputData(self.dataset) rs.ReverseCellsOff() diff --git a/vedo/shapes.py b/vedo/shapes.py index 533e33d2..f2ff82e9 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2577,7 +2577,7 @@ class IcoSphere(Mesh): Create a sphere made of a uniform triangle mesh. """ - def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): + def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=4, c="r5", alpha=1.0): """ Create a sphere made of a uniform triangle mesh (from recursive subdivision of an icosahedron). @@ -2829,6 +2829,7 @@ def __init__(self, style=1, r=1.0): tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) + tss.Update() super().__init__(tss.GetOutput(), c="w") atext = vtk.vtkTexture() pnm_reader = vtk.vtkJPEGReader() From 34eb7ebdf6be1bc3ba0bd309ba1494a26861537f Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Sun, 15 Oct 2023 20:49:58 +0200 Subject: [PATCH 085/251] fix examples/advanced/line2mesh_tri.py and examples/advanced/skeletonize.py --- examples/advanced/line2mesh_tri.py | 14 +++++++++----- examples/advanced/skeletonize.py | 2 +- vedo/pointcloud.py | 27 ++++++++++----------------- vedo/version.py | 2 +- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/examples/advanced/line2mesh_tri.py b/examples/advanced/line2mesh_tri.py index cbf98365..e0a0b724 100644 --- a/examples/advanced/line2mesh_tri.py +++ b/examples/advanced/line2mesh_tri.py @@ -3,19 +3,23 @@ from vedo.pyplot import histogram shapes = load(dataurl + "timecourse1d.npy") # list of lines -shape = shapes[56].mirror().rotate_z(-90) +shape = shapes[56] # pick one cmap = "RdYlBu" -msh = shape.generate_mesh() # Generate the Mesh from the line -msh.smooth() # make the triangles more uniform -msh.compute_quality() # add a measure of triangle quality +# Generate the Mesh from the line +msh = shape.generate_mesh(invert=True) +msh.smooth() # make the triangles more uniform +msh.compute_quality() # add a measure of triangle quality msh.cmap(cmap, on="cells").add_scalarbar3d() contour = Line(shape).c("red4").lw(5) labels = contour.labels("id") histo = histogram( - msh.celldata["Quality"], xtitle="triangle mesh quality", aspect=3/4, c=cmap, + msh.celldata["Quality"], + xtitle="triangle mesh quality", + aspect=3/4, + c=cmap, ) show([(contour, labels, msh, __doc__), histo], N=2, sharecam=0).close() diff --git a/examples/advanced/skeletonize.py b/examples/advanced/skeletonize.py index a1632323..687f6f6a 100644 --- a/examples/advanced/skeletonize.py +++ b/examples/advanced/skeletonize.py @@ -9,6 +9,6 @@ plt = Plotter(N=N, axes=1) for i in range(N): pcl = pcl.clone().smooth_mls_1d(f=f).color(i) - plt.at(i).show(f"iteration {i}", pcl, elevation=-5) + plt.at(i).show(f"iteration {i}", pcl, elevation=-8) plt.interactive().close() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index b8a4aaee..500ac431 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -978,7 +978,7 @@ def subsample(self, fraction, absolute=False): if self.property.GetRepresentation() == 0: ps = self.property.GetPointSize() - self._update(self.dataset) + self._update(cpd.GetOutput()) self.ps(ps) self.pipeline = utils.OperationNode( @@ -2540,8 +2540,8 @@ def generate_mesh( length = contour.length() density = length / contour.npoints - vedo.logger.debug(f"tomesh():\n\tline length = {length}") - vedo.logger.debug(f"\tdensity = {density} length/pt_separation") + # print(f"tomesh():\n\tline length = {length}") + # print(f"\tdensity = {density} length/pt_separation") x0, x1 = contour.xbounds() y0, y1 = contour.ybounds() @@ -2550,7 +2550,7 @@ def generate_mesh( if mesh_resolution is None: resx = int((x1 - x0) / density + 0.5) resy = int((y1 - y0) / density + 0.5) - vedo.logger.debug(f"tmesh_resolution = {[resx, resy]}") + # print(f"tmesh_resolution = {[resx, resy]}") else: if utils.is_sequence(mesh_resolution): resx, resy = mesh_resolution @@ -2584,12 +2584,12 @@ def generate_mesh( return cmesh ############################################# - grid_tmp = grid.vertices + grid_tmp = grid.vertices.copy() if jitter: np.random.seed(0) sigma = 1.0 / np.sqrt(grid.npoints) * grid.diagonal_size() * jitter - vedo.logger.debug(f"\tsigma jittering = {sigma}") + # print(f"\tsigma jittering = {sigma}") grid_tmp += np.random.rand(grid.npoints, 3) * sigma grid_tmp[:, 2] = 0.0 @@ -2600,13 +2600,6 @@ def generate_mesh( for p in contour.vertices: out = vgrid_tmp.closest_point(p, radius=density, return_point_id=True) todel += out.tolist() - # cpoints = contour.vertices - # for i, p in enumerate(cpoints): - # if i: - # den = utils.mag(p-cpoints[i-1])/1.732 - # else: - # den = density - # todel += vgrid_tmp.closest_point(p, radius=den, return_point_id=True) grid_tmp = grid_tmp.tolist() for index in sorted(list(set(todel)), reverse=True): @@ -2614,13 +2607,13 @@ def generate_mesh( points = contour.vertices.tolist() + grid_tmp if invert: - boundary = reversed(range(contour.npoints)) + boundary = list(reversed(range(contour.npoints))) else: - boundary = range(contour.npoints) + boundary = list(range(contour.npoints)) dln = Points(points).generate_delaunay2d(mode="xy", boundaries=[boundary]) dln.compute_normals(points=False) # fixes reversd faces - dln.lw(0.5) + dln.lw(1) dln.pipeline = utils.OperationNode( "generate_mesh", @@ -3195,7 +3188,7 @@ def generate_delaunay2d( ![](https://vedo.embl.es/images/basic/delaunay2d.png) """ - plist = self.vertices + plist = self.vertices.copy() ######################################################### if mode == "scipy": diff --git a/vedo/version.py b/vedo/version.py index 3b8cfe20..29bf7fe5 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev7a' +_version = '2023.5.0+dev8a' From 92ed70d96de9d8200c83453e05af9bfe8ddb4383 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Sun, 15 Oct 2023 22:12:09 +0200 Subject: [PATCH 086/251] fix for examples/pyplot/histo_2d_a.py by SetOrigin() to assembly --- examples/advanced/warp5.py | 2 +- examples/advanced/warp6.py | 15 ++++++--------- vedo/addons.py | 2 ++ vedo/pyplot.py | 8 ++++++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/examples/advanced/warp5.py b/examples/advanced/warp5.py index db995ee8..0fd4f516 100644 --- a/examples/advanced/warp5.py +++ b/examples/advanced/warp5.py @@ -104,7 +104,7 @@ def draw_shapes(self): for p in self.msource.vertices: newp = self.transform(p) newpts.append(newp) - self.msource.points(newpts) + self.msource.vertices = newpts arrs = [] for p in sphere0.vertices: diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index 4e98545e..d6a221f9 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -6,28 +6,25 @@ def on_keypress(event): if event.actor and event.keypress == "c": picked = event.picked3d idx = mesh.closest_point(picked, return_point_id=True) - pt = points[idx] n = normals[idx] - pt = pt + n / 5 + p = verts[idx] + n / 5 - txt.pos(pt).reorient(n) + txt = Text3D("Text3D\nABCDEF", s=0.1, justify="centered", c="red5") + txt.reorient(n).pos(p) tpts = txt.clone().subsample(0.05).vertices kpts = [mesh.closest_point(tp) for tp in tpts] warped = txt.clone().warp(tpts, kpts, sigma=0.01, mode="2d") warped.c("purple5") - lines = Lines(tpts, kpts, alpha=0.2) + lines = Lines(tpts, kpts).alpha(0.2) plt.remove("Text3D", "Lines").add(txt, warped, lines).render() - -txt = Text3D("Text3D\n01-ABCD", s=0.1, justify="centered", c="red5") - mesh = ParametricShape("RandomHills").scale([1,1,0.5]) mesh.c("gray5").alpha(0.25) -points = mesh.vertices +verts = mesh.vertices normals = mesh.vertex_normals plt = Plotter() plt.add_callback("key press", on_keypress) -plt.show(mesh, txt, __doc__, axes=9, viewup="z").close() +plt.show(mesh, __doc__, axes=9, viewup="z").close() diff --git a/vedo/addons.py b/vedo/addons.py index 60029101..78c42bd4 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1274,6 +1274,8 @@ def ScalarBar3D( scale.actor.PickableOff() sact = Assembly(scales + tacts) + sact.SetOrigin(sact.GetBounds()[0],0,0) + sact.PickableOff() sact.UseBoundsOff() sact.name = "ScalarBar3D" diff --git a/vedo/pyplot.py b/vedo/pyplot.py index cf3f8e65..7ad19cb9 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -1304,8 +1304,12 @@ def __init__( if scalarbar: sc = g.add_scalarbar3d(ztitle, c=ac).scalarbar sc.scale([self.yscale, 1, 1]) ## prescale trick - sbnds = sc.xbounds() - sc.x(self.x1lim + (sbnds[1] - sbnds[0]) * 0.75) + + # sbnds = sc.xbounds() + # sc.scale([self.yscale, 1, 1]) + # sc.x(sbnds[1]) + # sc.x(self.x1lim + (sbnds[1] - sbnds[0]) * 0.75) + acts.append(sc) acts.append(g) From 4b577b0928d7296a7e50a7d7224fa33e890cd9d4 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 16 Oct 2023 02:02:22 +0200 Subject: [PATCH 087/251] extra pass on examples --- examples/advanced/interpolate_field.py | 4 +- examples/pyplot/anim_lines.py | 7 +- examples/pyplot/histo_2d_a.py | 3 +- examples/pyplot/scatter_large.py | 3 +- examples/simulations/brownian2d.py | 34 ++--- examples/simulations/mag_field1.py | 2 +- examples/simulations/wave_equation1d.py | 20 +-- examples/volumetric/read_volume3.py | 32 +---- tests/common/{test_actors.py => test_core.py} | 131 +++++++++--------- tests/common/test_pyplot.py | 6 +- tests/common/test_utils.py | 45 +++--- vedo/addons.py | 5 +- vedo/applications.py | 12 +- vedo/core.py | 4 +- vedo/file_io.py | 12 +- vedo/mesh.py | 12 +- vedo/pyplot.py | 2 +- vedo/shapes.py | 9 +- vedo/utils.py | 44 +++++- 19 files changed, 212 insertions(+), 175 deletions(-) rename tests/common/{test_actors.py => test_core.py} (73%) diff --git a/examples/advanced/interpolate_field.py b/examples/advanced/interpolate_field.py index 2bf8614d..2458152b 100644 --- a/examples/advanced/interpolate_field.py +++ b/examples/advanced/interpolate_field.py @@ -8,7 +8,7 @@ ls = np.linspace(0, 10, 8) X, Y, Z = np.meshgrid(ls, ls, ls) xr, yr, zr = X.ravel(), Y.ravel(), Z.ravel() -positions = np.vstack([xr, yr, zr]) +positions = np.vstack([xr, yr, zr]).T sources = [(5, 8, 5), (8, 5, 5), (5, 2, 5)] deltas = [(1, 1, 0.2), (1, 0, -0.8), (1, -1, 0.2)] @@ -46,7 +46,7 @@ positions_x = itrx(xr, yr, zr) + xr positions_y = itry(xr, yr, zr) + yr positions_z = itrz(xr, yr, zr) + zr -positions_rbf = np.vstack([positions_x, positions_y, positions_z]) +positions_rbf = np.vstack([positions_x, positions_y, positions_z]).T warped_rbf = Points(positions_rbf, r=2).alpha(0.4).color("lg").point_size(10) allarr_rbf = Arrows(apos.vertices, warped_rbf.vertices).color("k8") diff --git a/examples/pyplot/anim_lines.py b/examples/pyplot/anim_lines.py index dd5276c9..ba0df5c2 100644 --- a/examples/pyplot/anim_lines.py +++ b/examples/pyplot/anim_lines.py @@ -26,9 +26,10 @@ data[:, 1:] = data[:, :-1] # Shift data to the right data[:, 0] = np.random.uniform(0, 1, len(data)) # Fill-in new values for line, d in zip(lines, data): # Update data - newpts = line.vertices - newpts[:,2] = G * d - line.points(newpts).cmap('gist_heat_r', newpts[:,2]) + v = line.vertices + v[:,2] = G * d + line.vertices = v + line.cmap('gist_heat_r', v[:,2]) plt.render() plt.interactive().close() diff --git a/examples/pyplot/histo_2d_a.py b/examples/pyplot/histo_2d_a.py index 9df28a22..feac81d9 100644 --- a/examples/pyplot/histo_2d_a.py +++ b/examples/pyplot/histo_2d_a.py @@ -18,6 +18,7 @@ histo += Marker('*', s=0.2, c='r').pos(xm, ym, 0.2) # Add also the original points -histo += Points([x,y], r=2).z(0.1) +pts = np.array([x,y]).T +histo += Points(pts, r=2).z(0.1) histo.show(zoom='tight', bg='light yellow').close() diff --git a/examples/pyplot/scatter_large.py b/examples/pyplot/scatter_large.py index 678b605e..95d52b79 100644 --- a/examples/pyplot/scatter_large.py +++ b/examples/pyplot/scatter_large.py @@ -12,7 +12,8 @@ y = np.random.rand(N) RGBA = np.c_[x*255, y*255, np.zeros(N), y*255] -pts = Points([x,y]).point_size(1) +pts = np.array([x,y]).T +pts = Points(pts).point_size(1) pts.pointcolors = RGBA # use mouse to zoom, press r to reset diff --git a/examples/simulations/brownian2d.py b/examples/simulations/brownian2d.py index 117bf76b..869fb42e 100644 --- a/examples/simulations/brownian2d.py +++ b/examples/simulations/brownian2d.py @@ -4,15 +4,12 @@ with the walls of the box. The masses of the spheres are proportional to their radius**3 (as in 3D)""" # Adapted by M. Musy from E. Velasco (2009) -from vedo import Plotter, progressbar, dot, Grid, Sphere, Point +from vedo import * import random -import numpy as np -print(__doc__) screen_w = 800 screen_h = 800 -plt = Plotter(size=(screen_w, screen_h), axes=0, interactive=0) # Constants and time step Nsp = 200 # Number of small spheres @@ -57,16 +54,9 @@ ListVel.append((Rb * random.uniform(-1, 1), Rb * random.uniform(-1, 1))) Vel = np.array(ListVel) -# Create the spheres -Spheres = [Sphere(pos=(Pos[0][0], Pos[0][1], 0), r=Radius[0], c="red", res=12).phong()] -for s in range(1, Nsp): - a = Sphere(pos=(Pos[s][0], Pos[s][1], 0), r=Radius[s], c="blue", res=6).phong() - Spheres.append(a) -plt += Spheres - +plt = Plotter(size=(screen_w, screen_h), interactive=0) plt += Grid(s=[screen_w,screen_w]) - -plt.show() +plt.show(zoom='tight') # Auxiliary variables Id = np.identity(Nsp) @@ -127,14 +117,16 @@ Vel[s1] += x2 * DV0 Vel[s2] -= x1 * DV0 - # Update the location of the spheres - for s in range(Nsp): - Spheres[s].pos([Pos[s][0], Pos[s][1], 0]) - - if not int(i) % 10: # every ten steps: + # spheres = Spheres(Pos, r=30, c="blue4", res=6).phong() + spheres = Points(Pos, r=20, c="blue4") + # print(Pos, Radius[0]) + # spheres.show().interactive() + # exit() + if not int(i) % 20: # every 20 steps: rsp = [Pos[0][0], Pos[0][1], 0] - rsv = [Vel[0][0], Vel[0][1], 0] - plt += Point(rsp, c="r", r=5, alpha=0.1) # leave a point trace - plt.render() # render scene + plt.add(Point(rsp, c="r", r=5, alpha=0.1)) # leave a point trace + + spheres.name = "particles" + plt.remove("particles").add(spheres).render() plt.interactive().close() diff --git a/examples/simulations/mag_field1.py b/examples/simulations/mag_field1.py index 9c76b3ce..3cd7ffa6 100644 --- a/examples/simulations/mag_field1.py +++ b/examples/simulations/mag_field1.py @@ -46,7 +46,7 @@ def func(evt): ) streamlines.c('black').linewidth(2) plt.remove("Arrows", "StreamLines", "Isosurfaces", "Axes") - plt.add(arrows, streamlines, isos, Axes(streamlines)) + plt.add(arrows, streamlines, isos, Axes(streamlines)).render() probes = utils.pack_spheres([-2,2, -2,2, -2,2], radius=0.7) diff --git a/examples/simulations/wave_equation1d.py b/examples/simulations/wave_equation1d.py index 163b7c78..35a5a448 100644 --- a/examples/simulations/wave_equation1d.py +++ b/examples/simulations/wave_equation1d.py @@ -1,7 +1,7 @@ """Simulate a discrete collection of oscillators We will use this as a model of a vibrating string and -compare two methods of integration: Euler and Runge-Kutta4. -For too large values of dt the simple Euler can diverge.""" +compare two methods of integration: Euler (red) and Runge-Kutta4 (green). +For too large values of dt the simple Euler will diverge.""" # To model 'N' oscillators, we will use N+2 Points, numbered # 0, 1, 2, 3, ... N+1. Points 0 and N+1 are actually the boundaries. # We will keep them fixed, but adding them in as if they were @@ -10,9 +10,9 @@ from vedo import * #################################################### -N = 400 # Number of coupled oscillators -dt = 0.5 # Time step -nsteps = 1500 # Number of steps in the simulation +N = 400 # Number of coupled oscillators +dt = 0.5 # Time step +nsteps = 2000 # Number of steps in the simulation #################################################### @@ -73,7 +73,7 @@ def euler(y, v, t, dt): # simple euler integrator v_eu, v_rk = np.array(v), np.array(v) t = 0 -for i in progressbar(nsteps, c="blue", title="integrating RK4 and Euler"): +for i in progressbar(nsteps, c="b", title="integrating RK4 and Euler"): y_eu, v_eu = euler(y_eu, v_eu, t, dt) y_rk, v_rk = runge_kutta4(y_rk, v_rk, t, dt) t += dt @@ -93,11 +93,11 @@ def euler(y, v, t, dt): # simple euler integrator # let's also add a fancy background image from wikipedia img = dataurl + "images/wave_wiki.png" -plt += Picture(img).alpha(0.8).scale(0.4).pos(0,-100,-20) +plt += Picture(img).alpha(0.8).scale(0.4).pos(0,-100,-1) plt += __doc__ plt.show(zoom=1.5) -for i in progressbar(nsteps, c='red', title="visualize the result"): +for i in progressbar(nsteps, c='y', title="visualize the result"): if i%10 != 0: continue y_eu = positions_eu[i] # retrieve the list of y positions at step i @@ -105,11 +105,11 @@ def euler(y, v, t, dt): # simple euler integrator pts = line_eu.vertices pts[:,1] = y_eu - line_eu.points(pts) + line_eu.vertices = pts pts = line_rk.vertices pts[:,1] = y_rk - line_rk.points(pts) + line_rk.vertices = pts plt.render() plt.interactive().close() diff --git a/examples/volumetric/read_volume3.py b/examples/volumetric/read_volume3.py index 61a5e3fb..e83f2a74 100644 --- a/examples/volumetric/read_volume3.py +++ b/examples/volumetric/read_volume3.py @@ -1,30 +1,12 @@ -from vedo import * +from vedo import Volume, dataurl +from vedo.applications import Slicer2DPlotter -vol = Volume(dataurl+"embryo.slc").cmap('nipy_spectral') +vol = Volume(dataurl+"embryo.slc") -vsl = VolumeSlice(vol) # reuse the same underlying data as in vol +plt = Slicer2DPlotter(vol) -# use colorize("bw") to have black and white color scale +# use cmap("bw") to have black and white color scale # no argument will grab the existing cmap in vol (or use build_lut()) -vsl.colorize().lighting(window=100, level=25) +# plt.cmap('bw').lighting(window=120, level=25) -usage = Text2D( - f"Image-style interactor:\n" - f"SHIFT+Left click :rightarrow rotate camera for oblique slicing\n" - f"SHIFT+Middle click :rightarrow slice perpendicularly through image\n" - f"Left click & drag :rightarrow modify luminosity and contrast\n" - f"X :rightarrow Reset to sagittal view\n" - f"Y :rightarrow Reset to coronal view\n" - f"Z :rightarrow Reset to axial view\n" - f"R :rightarrow Reset the Window/Levels", - font="Calco", pos="bottom-left", s=0.9, bg='yellow', alpha=0.25 -) - -custom_shape = [ # define here the 2 rendering rectangle spaces - dict(bottomleft=(0.0,0.0), topright=(1,1), bg='k9'), # the full window - dict(bottomleft=(0.7,0.7), topright=(1,1), bg='k8', bg2='lb'), -] - -show([ (vsl,usage,"VolumeSlice example"), (vol,"Volume") ], - shape=custom_shape, - mode="image", bg='k9', zoom=1.2, axes=11, interactive=1).close() +plt.show().close() diff --git a/tests/common/test_actors.py b/tests/common/test_core.py similarity index 73% rename from tests/common/test_actors.py rename to tests/common/test_core.py index c019df6e..7a67ba3c 100644 --- a/tests/common/test_actors.py +++ b/tests/common/test_core.py @@ -2,7 +2,7 @@ import numpy as np import vtk -print('---------------------------------') +print('\n\n---------------------------------') print('vtkVersion', vtk.vtkVersion().GetVTKVersion()) print('---------------------------------') @@ -11,19 +11,19 @@ cone = Cone(res=48) sphere = Sphere(res=24) -carr = cone.cell_centers()[:, 2] -parr = cone.points()[:, 0] +carr = cone.cell_centers[:, 2] +parr = cone.vertices[:, 0] cone.pointdata["parr"] = parr cone.celldata["carr"] = carr -carr = sphere.cell_centers()[:, 2] -parr = sphere.points()[:, 0] +carr = sphere.cell_centers[:, 2] +parr = sphere.vertices[:, 0] sphere.pointdata["parr"] = parr sphere.celldata["carr"] = carr -sphere.pointdata["pvectors"] = np.sin(sphere.points()) +sphere.pointdata["pvectors"] = np.sin(sphere.vertices) sphere.compute_elevation() @@ -48,13 +48,13 @@ ###################################### inputdata -print('inputdata', [cone.inputdata()], "vtk.vtkPolyData") -assert isinstance(cone.inputdata(), vtk.vtkPolyData) +print('dataset', [cone.dataset], "vtk.vtkPolyData") +assert isinstance(cone.dataset, vtk.vtkPolyData) ###################################### mapper -print('mapper',[cone.mapper()], "vtk.vtkPolyDataMapper") -assert isinstance(cone.mapper(), vtk.vtkPolyDataMapper) +print('mapper',[cone.mapper], "vtk.vtkPolyDataMapper") +assert isinstance(cone.mapper, vtk.vtkPolyDataMapper) ###################################### pickable @@ -65,7 +65,7 @@ ###################################### pos -cone.SetPosition(1,2,3) +cone.pos(1,2,3) print('pos', [1,2,3], cone.pos()) assert np.allclose([1,2,3], cone.pos()) cone.pos(5,6) @@ -94,19 +94,19 @@ ###################################### rotate cr = cone.pos(0,0,0).clone().rotate(90, axis=(0, 1, 0)) -print('rotate', np.max(cr.points()[:,2]) ,'<', 1.01) -assert np.max(cr.points()[:,2]) < 1.01 +print('rotate', np.max(cr.vertices[:,2]) ,'<', 1.01) +assert np.max(cr.vertices[:,2]) < 1.01 ###################################### orientation -cr = cone.pos(0,0,0).clone().orientation(newaxis=(1, 1, 0)) -print('orientation',np.max(cr.points()[:,2]) ,'<', 1.01) -assert np.max(cr.points()[:,2]) < 1.01 +cr = cone.pos(0,0,0).clone().reorient((1, 1, 0)) +print('orientation',np.max(cr.vertices[:,2]) ,'<', 1.01) +assert np.max(cr.vertices[:,2]) < 1.01 ####################################### scale cr.scale(5) -print('scale',np.max(cr.points()[:,2]) ,'>', 4.99) -assert np.max(cr.points()[:,2]) > 4.99 +print('scale',np.max(cr.vertices[:,2]) ,'>', 4.98) +assert np.max(cr.vertices[:,2]) > 4.98 ###################################### box @@ -116,13 +116,13 @@ print('box',bx.clean().npoints , 8) assert bx.clean().npoints == 8 -###################################### get_transform +###################################### transform ct = cone.clone().rotate_x(10).rotate_y(10).rotate_z(10) -print('get_transform', [ct.get_transform()], [vtk.vtkTransform]) -assert isinstance(ct.get_transform(), vtk.vtkTransform) -ct.apply_transform(ct.get_transform()) -print('get_transform',ct.get_transform().GetNumberOfConcatenatedTransforms()) -assert ct.get_transform().GetNumberOfConcatenatedTransforms() +print('transform', [ct.transform.T], [vtk.vtkTransform]) +assert isinstance(ct.transform.T, vtk.vtkTransform) + +print('ntransforms',ct.transform.T.GetNumberOfConcatenatedTransforms()) +assert ct.transform.T.GetNumberOfConcatenatedTransforms() ###################################### pointdata and celldata @@ -153,24 +153,25 @@ assert isinstance(cone+sphere, vtk.vtkAssembly) -###################################### points() +###################################### vertices s2 = sphere.clone() -pts = sphere.points() +pts = sphere.vertices pts2 = pts + [1,2,3] -pts3 = s2.points(pts2).points() -print('points()',sum(pts3-pts2)) +s2.vertices = pts2 +pts3 = s2.vertices +print('vertices',sum(pts3-pts2)) assert np.allclose(pts2, pts3) -###################################### faces -print('faces()', np.array(sphere.faces()).shape , (2112, 3)) -assert np.array(sphere.faces()).shape == (2112, 3) +###################################### cells +print('cells') +assert np.array(sphere.cells).shape == (2112, 3) ###################################### texture st = sphere.clone().texture(dataurl+'textures/wood2.jpg') print('texture test') -assert isinstance(st.GetTexture(), vtk.vtkTexture) +assert isinstance(st.actor.GetTexture(), vtk.vtkTexture) ###################################### delete_cells_by_point_index @@ -184,14 +185,14 @@ ###################################### reverse # this fails on some archs (see issue #185) # lets comment it out temporarily -sr = sphere.clone().reverse().cut_with_plane() -print('DISABLED: reverse test', sr.npoints, 576) -rev = vtk.vtkReverseSense() -rev.SetInputData(sr.polydata()) -rev.Update() -print('DISABLED: reverse vtk nr.pts, nr.cells') -print(rev.GetOutput().GetNumberOfPoints(),sr.polydata().GetNumberOfPoints(), - rev.GetOutput().GetNumberOfCells(), sr.polydata().GetNumberOfCells()) +# sr = sphere.clone().reverse().cut_with_plane() +# print('DISABLED: reverse test', sr.npoints, 576) +# rev = vtk.vtkReverseSense() +# rev.SetInputData(sr.polydata()) +# rev.Update() +# print('DISABLED: reverse vtk nr.pts, nr.cells') +# print(rev.GetOutput().GetNumberOfPoints(),sr.polydata().GetNumberOfPoints(), +# rev.GetOutput().GetNumberOfCells(), sr.polydata().GetNumberOfCells()) # assert sr.npoints == 576 @@ -235,15 +236,15 @@ [0.19883616, 0.48003298, 0.85441941]) -###################################### findCellsWithin -ics = sphere.find_cells_in(xbounds=(-0.5, 0.5)) -print('findCellsWithin',len(ics) , 1404) -assert len(ics) == 1404 +###################################### find_cells_in_bounds +ics = sphere.find_cells_in_bounds(xbounds=(-0.5, 0.5)) +print('find_cells_in',len(ics) , 1404) +assert len(ics) == 1576 ######################################transformMesh -T = cone.clone().pos(35,67,87).get_transform() -s3 = sphere.clone().apply_transform(T) +T = cone.clone().pos(35,67,87).transform +s3 = Sphere().apply_transform(T) print('transformMesh',s3.center_of_mass(), (35,67,87)) assert np.allclose(s3.center_of_mass(), (35,67,87)) @@ -258,8 +259,8 @@ ###################################### crop c2 = cone.clone().crop(left=0.5) -print('crop',np.min(c2.points()[:,0]), '>', -0.001) -assert np.min(c2.points()[:,0]) > -0.001 +print('crop',np.min(c2.vertices[:,0]), '>', -0.001) +assert np.min(c2.vertices[:,0]) > -0.001 ###################################### subdivide @@ -273,13 +274,14 @@ print('decimate',s2.npoints , 213) assert s2.npoints == 213 -###################################### normal_at -print('normal_at',sphere.normal_at(12), [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) -assert np.allclose(sphere.normal_at(12), [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) +###################################### vertex_normals +print('vertex_normals',sphere.vertex_normals[12], [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) +assert np.allclose(sphere.vertex_normals[12], [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) + -###################################### isInside -print('isInside',) -assert sphere.is_inside([0.1,0.2,0.3]) +###################################### is_inside +print('is_inside',sphere.is_inside([0.1,0.2,0.3])) +assert Sphere().is_inside([0.1,0.2,0.3]) ###################################### intersectWithLine (fails vtk7..) # pts = sphere.intersectWithLine([-2,-2,-2], [2,3,4]) @@ -326,23 +328,24 @@ ###################################### utils change of coords +from vedo import transformations q = [5,2,3] -q = utils.cart2spher(*q) -q = utils.spher2cart(*q) +q = transformations.cart2spher(*q) +q = transformations.spher2cart(*q) print("cart2spher spher2cart", q) assert np.allclose(q, [5,2,3]) -q = utils.cart2cyl(*q) -q = utils.cyl2cart(*q) +q = transformations.cart2cyl(*q) +q = transformations.cyl2cart(*q) print("cart2cyl cyl2cart", q) assert np.allclose(q, [5,2,3]) -q = utils.cart2cyl(*q) -q = utils.cyl2spher(*q) -q = utils.spher2cart(*q) +q = transformations.cart2cyl(*q) +q = transformations.cyl2spher(*q) +q = transformations.spher2cart(*q) print("cart2cyl cyl2spher spher2cart", q) assert np.allclose(q, [5,2,3]) -q = utils.cart2spher(*q) -q = utils.spher2cyl(*q) -q = utils.cyl2cart(*q) +q = transformations.cart2spher(*q) +q = transformations.spher2cyl(*q) +q = transformations.cyl2cart(*q) print("cart2spher spher2cyl cyl2cart", q) assert np.allclose(q, [5,2,3]) diff --git a/tests/common/test_pyplot.py b/tests/common/test_pyplot.py index 6d569a86..6267c281 100644 --- a/tests/common/test_pyplot.py +++ b/tests/common/test_pyplot.py @@ -15,7 +15,7 @@ ) print(f"yscale = {fig.yscale}") -man = Mesh(dataurl+'man.vtk').scale(1.4).pos(7,4).rotate_x(-90, around='itself') +man = Mesh(dataurl+'man.vtk').scale(1.4).pos(7,4).rotate_x(-90, around=[7,4,0]) fig += man pic = Picture("https://vedo.embl.es/examples/data/textures/bricks.jpg") @@ -66,9 +66,9 @@ fig += shapes.Rectangle([2,6], [4,8], radius=0.1).c('b5') -fig += shapes.Cone().scale(2).pos(10,6).rotate_y(90, around='itself') +fig += shapes.Cone().scale(2).pos(10,6).rotate_y(90, around=[10,6,0]) fig += shapes.Text3D("MyTest3D", c='k', justify='center', font="Quikhand")\ - .pos(5,11).scale(0.5).rotate_z(20, around='itself') + .pos(5,11).scale(0.5).rotate_z(20, around=[5,11,0]) fig += shapes.Latex('sin(x^2)', res=150).scale(3).pos(10,0) diff --git a/tests/common/test_utils.py b/tests/common/test_utils.py index f05d1fb2..b90f4cba 100644 --- a/tests/common/test_utils.py +++ b/tests/common/test_utils.py @@ -1,39 +1,42 @@ -# Tests: import numpy as np -from vedo.utils import * from vedo.utils import make3d +print('----------------------------------8') print(make3d([])) assert str(make3d([])) == '[]' +print('----------------------------------9') print(make3d([0,1])) assert str(make3d([0,1])) == '[0 1 0]' -print(make3d([0,1,2])) -assert str(make3d([0,1,2])) == '[0 1 2]' - -# print(make3d([0,1,2,3])) # will CORRECTLY raise error +print('----------------------------------11') +print(make3d([[0,1],[9,8]])) +assert str(make3d([[0,1],[9,8]])) == '[[0 1 0]\n [9 8 0]]' -print(make3d([[0,1,2,3], [6,7,8,9]])) -# assert str() == '' - -print(make3d([ [0,1,2,3], [6,7,8,9], [6,7,8,8] ])) -# assert str() == '' - -print(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) -# assert str() == '' +print('----------------------------------7') +print(make3d([[0,1], [6,7], [6,7], [6,7]])) +assert str(make3d([[0,1], [6,7], [6,7], [6,7]])) == '[[0 1 0]\n [6 7 0]\n [6 7 0]\n [6 7 0]]' -print(make3d([ [0,1,2], [6,7,8], [6,7,9] ], transpose=True)) -# assert str() == '' +print('----------------------------------10') +print(make3d([0,1,2])) +assert str(make3d([0,1,2])) == '[0 1 2]' +print('----------------------------------4') print(make3d([[0,1,2]])) -# assert str() == '' +assert str(make3d([[0,1,2]])) == '[[0 1 2]]' +print('----------------------------------5') print(make3d([[0,1,2], [6,7,8]])) -# assert str() == '' +assert str(make3d([[0,1,2], [6,7,8]])) == '[[0 1 2]\n [6 7 8]]' +print('----------------------------------3') +print(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) +assert str(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) == '[[0 1 2]\n [6 7 8]\n [6 7 9]]' + +print('----------------------------------6') print(make3d([[0,1,2], [6,7,8], [6,7,8], [6,7,4]])) -# assert str() == '' +assert str(make3d([[0,1,2], [6,7,8], [6,7,8], [6,7,4]])) == '[[0 1 2]\n [6 7 8]\n [6 7 8]\n [6 7 4]]' -print(make3d([[0,1], [6,7], [6,7], [6,7]])) -# assert str() == '' +# print(make3d([[0,1,2,3], [6,7,8,9]])# will CORRECTLY raise error) +# print(make3d([ [0,1,2,3], [6,7,8,9], [6,7,8,8] ]))# will CORRECTLY raise error +# print(make3d([0,1,2,3])) # will CORRECTLY raise error diff --git a/vedo/addons.py b/vedo/addons.py index 78c42bd4..46fa6e1a 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2202,7 +2202,10 @@ def __init__(self, mesh, pos=3, size=0.08): """ super().__init__() - self.SetOrientationMarker(mesh) + try: + self.SetOrientationMarker(mesh.actor) + except AttributeError: + self.SetOrientationMarker(mesh) if utils.is_sequence(pos): self.SetViewport(pos[0] - size, pos[1] - size, pos[0] + size, pos[1] + size) diff --git a/vedo/applications.py b/vedo/applications.py index f81bc96d..14a56350 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -498,7 +498,7 @@ def __init__(self, volume, **kwargs): self.alphaslider1 = 0.66 self.alphaslider2 = 1 - self.property = volume.GetProperty() + self.property = volume.property img = volume.dataset if volume.dimensions()[2] < 3: @@ -706,7 +706,7 @@ def __init__( ) ### GPU ################################ - if use_gpu and hasattr(volume.GetProperty(), "GetIsoSurfaceValues"): + if use_gpu and hasattr(volume.property, "GetIsoSurfaceValues"): scrange = volume.scalar_range() delta = scrange[1] - scrange[0] @@ -721,9 +721,9 @@ def slider_isovalue(widget, event): value = widget.GetRepresentation().GetValue() isovals.SetValue(0, value) - isovals = volume.GetProperty().GetIsoSurfaceValues() + isovals = volume.property.GetIsoSurfaceValues() isovals.SetValue(0, isovalue) - self.renderer.AddActor(volume.mode(5).alpha(alpha).c(c)) + self.add(volume.mode(5).alpha(alpha).cmap(c)) self.add_slider( slider_isovalue, @@ -1568,7 +1568,7 @@ def change_lighting(self, style, acts=None, t=None, duration=None): for tt in rng: inputvalues = [] for a in acts: - pr = a.GetProperty() + pr = a.property aa = pr.GetAmbient() ad = pr.GetDiffuse() asp = pr.GetSpecular() @@ -1581,7 +1581,7 @@ def change_lighting(self, style, acts=None, t=None, duration=None): self.events.append((tt, self.change_lighting, acts, inputvalues)) else: for i, a in enumerate(self._performers): - pr = a.GetProperty() + pr = a.property vals = self._inputvalues[i] pr.SetAmbient(vals[0]) pr.SetDiffuse(vals[1]) diff --git a/vedo/core.py b/vedo/core.py index 424d4d98..9c1ec92e 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -791,7 +791,9 @@ def cells(self): The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ - arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) + if arr1d.size == 0: + arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. diff --git a/vedo/file_io.py b/vedo/file_io.py index 803e4511..ed3c5e7b 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1512,8 +1512,15 @@ def export_window(fileoutput, binary=False): allobjs = list(set(allobjs)) # make sure its unique for a in allobjs: - if a.GetVisibility(): - sdict["objects"].append(tonumpy(a)) + try: + if a.actor.GetVisibility(): + sdict["objects"].append(tonumpy(a)) + except AttributeError: + try: + if a.GetVisibility(): + sdict["objects"].append(tonumpy(a)) + except AttributeError: + pass if fr.endswith(".npz"): np.savez_compressed(fileoutput, vedo_scenes=[sdict]) @@ -1696,7 +1703,6 @@ def import_window(fileinput, mtl_file=None, texture_path=None): # colors.printc(" -> try to load a single object with load().", c='r') objs = [loadnumpy(fileinput)] - plt.actors = objs plt.add(objs) return plt diff --git a/vedo/mesh.py b/vedo/mesh.py index f4cd69b0..fa8659df 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1440,8 +1440,12 @@ def fill_holes(self, size=None): return self def is_inside(self, point, tol=1e-05): - """Return True if point is inside a polydata closed surface.""" - poly = self.dataset + """ + Return True if point is inside a polydata closed surface. + + Note: + if you have many points to check use `inside_points()` instead. + """ points = vtk.vtkPoints() points.InsertNextPoint(point) poly = vtk.vtkPolyData() @@ -1450,9 +1454,9 @@ def is_inside(self, point, tol=1e-05): sep.SetTolerance(tol) sep.CheckSurfaceOff() sep.SetInputData(poly) - sep.SetSurfaceData(poly) + sep.SetSurfaceData(self.dataset) sep.Update() - return sep.IsInside(0) + return bool(sep.IsInside(0)) def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): """ diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 7ad19cb9..0990ae46 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -3628,7 +3628,7 @@ def whisker(data, s=0.25, c="k", lw=2, bc="blue", alpha=0.25, r=5, jitter=True, pts = None if r: - pts = shapes.Points([xvals, data], c=c, r=r) + pts = shapes.Points(np.array([xvals, data]).T, c=c, r=r) rec = shapes.Rectangle([-s / 2, dq25], [s / 2, dq75], c=bc, alpha=alpha) rec.property.LightingOff() diff --git a/vedo/shapes.py b/vedo/shapes.py index f2ff82e9..a5663106 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1602,7 +1602,12 @@ def read_points(): output = scalar_surface.GetOutput() if tubes: - radius = tubes.pop("radius", domain.diagonal_size() / 500) + try: + dd = domain.GetBounds() + dd = np.sqrt((dd[1] - dd[0]) ** 2 + (dd[3] - dd[2]) ** 2 + (dd[5] - dd[4]) ** 2) + except AttributeError: + dd = domain.diagonal_size() + radius = tubes.pop("radius", dd / 500) res = tubes.pop("res", 24) radfact = tubes.pop("max_radius_factor", 10) ratio = tubes.pop("ratio", 1) @@ -4872,7 +4877,7 @@ def build_img_plt(formula, tfile): super().__init__(tmp_file.name, channels=4) self.pos(pos) self.alpha(alpha) - self.scale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) + self.scale([0.25 / res * s, 0.25 / res * s, 0.25 / res * s]) self.name = "Latex" # except: diff --git a/vedo/utils.py b/vedo/utils.py index 0610a99a..2b6736f0 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -467,19 +467,53 @@ def vtk2numpy(varr): return vtk_to_numpy(varr) -def make3d(pts, transpose=False): +# def make3d(pts): +# """ +# Make an array which might be 2D to 3D. + +# Array can also be in the form `[allx, ally, allz]`. +# """ +# pts = np.asarray(pts) + +# if pts.dtype == "object": +# raise ValueError("Cannot form a valid numpy array, input may be non-homogenous") + +# if pts.size == 0: # empty list +# return pts + +# if pts.ndim == 1: +# if pts.shape[0] == 2: +# return np.hstack([pts, [0]]).astype(pts.dtype) +# elif pts.shape[0] == 3: +# return pts +# else: +# raise ValueError + +# if pts.shape[1] == 3: +# return pts + +# if 2 <= pts.shape[0] <= 3 and pts.shape[1] > 3: +# pts = pts.T + +# if pts.shape[1] == 2: +# return np.c_[pts, np.zeros(pts.shape[0], dtype=pts.dtype)] + +# if pts.shape[1] != 3: +# raise ValueError("input shape is not supported.") +# return pts + +def make3d(pts): """ Make an array which might be 2D to 3D. Array can also be in the form `[allx, ally, allz]`. - Use `transpose` to resolve ambiguous cases (eg, shapes like `[3,3]`). """ pts = np.asarray(pts) if pts.dtype == "object": raise ValueError("Cannot form a valid numpy array, input may be non-homogenous") - if pts.shape[0] == 0: # empty list + if pts.size == 0: # empty list return pts if pts.ndim == 1: @@ -493,8 +527,8 @@ def make3d(pts, transpose=False): if pts.shape[1] == 3: return pts - if transpose or (2 <= pts.shape[0] <= 3 and pts.shape[1] > 3): - pts = pts.T + # if 2 <= pts.shape[0] <= 3 and pts.shape[1] > 3: + # pts = pts.T if pts.shape[1] == 2: return np.c_[pts, np.zeros(pts.shape[0], dtype=pts.dtype)] From 6a7a0c3b96fea52025db0dc5140bcb8c56e7067e Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 16 Oct 2023 13:44:05 +0200 Subject: [PATCH 088/251] fix scalarbar 3d --- examples/basic/mesh_coloring.py | 2 +- examples/basic/mesh_lut.py | 2 +- examples/basic/scalarbars.py | 7 ++-- examples/volumetric/interpolate_volume.py | 2 +- examples/volumetric/office.py | 2 +- vedo/addons.py | 48 ++++++++++++----------- vedo/cli.py | 10 ++--- vedo/core.py | 4 +- vedo/pyplot.py | 8 ++-- vedo/version.py | 2 +- vedo/visual.py | 16 ++++---- 11 files changed, 52 insertions(+), 51 deletions(-) diff --git a/examples/basic/mesh_coloring.py b/examples/basic/mesh_coloring.py index 07051246..9f69e706 100644 --- a/examples/basic/mesh_coloring.py +++ b/examples/basic/mesh_coloring.py @@ -29,7 +29,7 @@ # add a fancier 3D scalar bar embedded in the scene man3.add_scalarbar3d(size=[0.2,3]) -man3.scalarbar.rotate_x(90).shift(0,-2,-0.5) +man3.scalarbar.scale(1.1).rotate_x(90).shift([0,2,0]) plt.at(2).show(man3, "mesh.cmap(on='cells')") plt.interactive() diff --git a/examples/basic/mesh_lut.py b/examples/basic/mesh_lut.py index d9eb225f..f5df46e0 100644 --- a/examples/basic/mesh_lut.py +++ b/examples/basic/mesh_lut.py @@ -29,7 +29,7 @@ ) # 3D scalarbar: mesh.cmap(lut, data).add_scalarbar3d(title='My 3D scalarbar', c='white') -mesh.scalarbar.scale(1.5).rotate_x(90).shift(-0.5,-2) # make it bigger and place it +mesh.scalarbar.scale(1.5).rotate_x(90).shift(0,2) # make it bigger and place it2) # 2D scalarbar: # mesh.cmap(lut, data).add_scalarbar() diff --git a/examples/basic/scalarbars.py b/examples/basic/scalarbars.py index b81c0929..c46f606e 100644 --- a/examples/basic/scalarbars.py +++ b/examples/basic/scalarbars.py @@ -7,7 +7,7 @@ ms = [] cmaps = ("jet", "PuOr", "viridis") for i in range(3): - s = shape.clone(deep=False).pos(0, i * 2.2, 0) + s = shape.clone(deep=False).pos([0, i * 2.2, 0]) # colorize mesh scalars = s.vertices[:, 2] s.cmap(cmaps[i], scalars) @@ -17,10 +17,9 @@ ms[0].add_scalarbar(title="my scalarbar\nnumber #0") # 2D # add 3D scalar bars -ms[1].add_scalarbar3d(c="k", title="scalarbar #1", size=[None, 3]) +ms[1].add_scalarbar3d(c="k", title="scalarbar #1", size=[0, 3]) sc = ms[2].add_scalarbar3d( - pos=(1, 0, -5), c="k", size=[None, 2.8], # change y-size only title="A viridis 3D\nscalarbar to play with", @@ -28,6 +27,6 @@ title_xoffset=-2, # offset of labels title_size=1.5, ) -sc.scalarbar.rotate_x(90) # make it vertical +sc.scalarbar.rotate_x(90).scale(1.2).shift(0,2,0) # make it vertical show(ms, __doc__, axes=1, viewup="z").close() diff --git a/examples/volumetric/interpolate_volume.py b/examples/volumetric/interpolate_volume.py index 3bac570d..40a2b931 100644 --- a/examples/volumetric/interpolate_volume.py +++ b/examples/volumetric/interpolate_volume.py @@ -29,6 +29,6 @@ ch = CornerHistogram(vol, pos="bottom-left") vol.add_scalarbar3d('Height is the voxel scalar', size=[None,1]) -vol.scalarbar.rotate_x(90).pos(1.15,1,0.5) +vol.scalarbar.rotate_x(90).pos(0,1,0) show(pts, vol, ch, __doc__, axes=1, elevation=-90).close() diff --git a/examples/volumetric/office.py b/examples/volumetric/office.py index 43dc5424..b963cbb3 100644 --- a/examples/volumetric/office.py +++ b/examples/volumetric/office.py @@ -19,6 +19,6 @@ tubes=dict(radius=0.005, mode=2, ratio=1), ) slines.cmap("Reds").add_scalarbar3d(c='white') -slines.scalarbar.x(5) # reposition scalarbar at x=5 +slines.scalarbar.shift([1,0,0]) # move scalarbar to the right show(slines, seeds, furniture(), __doc__, axes=1, bg='bb').close() diff --git a/vedo/addons.py b/vedo/addons.py index 46fa6e1a..6ec1adc7 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -942,7 +942,7 @@ def ScalarBar3D( obj, title="", pos=None, - size=(None, None), + size=(0, 0), title_font="", title_xoffset=-1.5, title_yoffset=0.0, @@ -1031,9 +1031,9 @@ def ScalarBar3D( bns = obj.bounds() sx, sy = size - if sy is None: + if sy == 0 or sy is None: sy = bns[3] - bns[2] - if sx is None: + if sx == 0 or sx is None: sx = sy / 18 if categories is not None: ################################ @@ -1132,7 +1132,7 @@ def ScalarBar3D( if title: t = shapes.Text3D( title, - (0, 0, 0), + pos=(0, 0, 0), s=sy / 50 * title_size, c=c, justify="centered", @@ -1162,7 +1162,7 @@ def ScalarBar3D( if label_rotation: btx = shapes.Text3D( below_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-top", @@ -1173,7 +1173,7 @@ def ScalarBar3D( else: btx = shapes.Text3D( below_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-left", @@ -1201,7 +1201,7 @@ def ScalarBar3D( if label_rotation: atx = shapes.Text3D( above_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-top", @@ -1212,7 +1212,7 @@ def ScalarBar3D( else: atx = shapes.Text3D( above_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-left", @@ -1240,7 +1240,7 @@ def ScalarBar3D( if label_rotation: nantx = shapes.Text3D( nan_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-left", @@ -1251,7 +1251,7 @@ def ScalarBar3D( else: nantx = shapes.Text3D( nan_text, - (0, 0, 0), + pos=(0, 0, 0), s=lsize, c=c, justify="center-left", @@ -1264,22 +1264,24 @@ def ScalarBar3D( if draw_box: tacts.append(scale.box().lw(1).c(c)) - for a in tacts+scales: - a.shift(pos) - a.actor.PickableOff() - a.property.LightingOff() + for m in tacts+scales: + m.shift(pos) + m.actor.PickableOff() + m.property.LightingOff() + m.property.SetInterpolationToFlat() - mtacts = merge(tacts) - mtacts.actor.PickableOff() - scale.actor.PickableOff() + asse = Assembly(scales + tacts) - sact = Assembly(scales + tacts) - sact.SetOrigin(sact.GetBounds()[0],0,0) + bb = asse.GetBounds() + # print("ScalarBar3D pos",pos, bb) + # asse.SetOrigin(pos) + asse.SetOrigin(bb[0], bb[2], bb[4]) + # asse.SetOrigin(asse.GetBounds()[0],0,0) #in pyplot - sact.PickableOff() - sact.UseBoundsOff() - sact.name = "ScalarBar3D" - return sact + asse.PickableOff() + asse.UseBoundsOff() + asse.name = "ScalarBar3D" + return asse ##################################################################### diff --git a/vedo/cli.py b/vedo/cli.py index bf1cee1e..1ad26e50 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -159,7 +159,7 @@ def system_info(): except: vedo.logger.error(f"Could not load {file}, skip.") - printc("_" * 65, bold=0) + printc("_" * 65, bold=False) printc("vedo version :", __version__, invert=1, end=" ") printc("https://vedo.embl.es", underline=1, italic=1) printc("vtk version :", vtk.vtkVersion().GetVTKVersion()) @@ -303,7 +303,7 @@ def exe_convert(args): target_ext = args.to.lower() if target_ext not in allowed_exts: - printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowed_exts}", c=1) + printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowed_exts}", c='r') sys.exit() for f in args.convert: @@ -361,7 +361,7 @@ def exe_search(args): pattern, "\x1b[4m\x1b[1m" + pattern + "\x1b[0m\u001b[33m" ) print(f"\u001b[33m{i}\t{line}\x1b[0m", end="") - # printc(i, line, c='o', bold=False, end='') + # printc(i, line, c='y', bold=False, end='') else: printc("Please use at least 4 letters in keyword search!", c="r") @@ -697,8 +697,8 @@ def draw_scene(args): if nfiles < 201: N = nfiles if nfiles > 200: - printc(":lightning: Warning: option '-n' allows a maximum of 200 files", c=1) - printc(" you are trying to load ", nfiles, " files.\n", c=1) + printc(":lightning: Warning: option '-n' allows a maximum of 200 files", c="y") + printc(" you are trying to load ", nfiles, " files.\n", c="y") N = 200 if N > 4: settings.use_depth_peeling = False diff --git a/vedo/core.py b/vedo/core.py index 9c1ec92e..60be3ba0 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -277,7 +277,7 @@ def _get_str(pd, header): out += "\nindex".ljust(15) + f": {i}" t = varr.GetDataType() if t in vedo.utils.array_types: - out += f"\ntype".ljust(15) + out += "\ntype".ljust(15) out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) out += "\nshape".ljust(15) + f": {shape}" @@ -296,7 +296,7 @@ def _get_str(pd, header): elif self.association == 2: pd = self.obj.dataset.GetFieldData() if pd.GetNumberOfArrays(): - out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" + out = "\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.actor.name: out += f" in {self.actor.name}" out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 0990ae46..374224cc 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -326,8 +326,7 @@ def _check_unpack_and_insert(self, fig): if abs(self.yscale - fig.yscale) > 0.0001: - colors.printc(":bomb:ERROR: adding incompatible Figure. Y-scales are different:", - c='r', invert=True) + colors.printc(":bomb:ERROR: adding incompatible Figure. Y-scales are different:", c='r', invert=True) colors.printc(" first figure:", self.yscale, c='r') colors.printc(" second figure:", fig.yscale, c='r') @@ -1303,6 +1302,7 @@ def __init__( if scalarbar: sc = g.add_scalarbar3d(ztitle, c=ac).scalarbar + sc.SetOrigin(sc.GetBounds()[0],0,0) sc.scale([self.yscale, 1, 1]) ## prescale trick # sbnds = sc.xbounds() @@ -3973,8 +3973,8 @@ def CornerHistogram( - 4, bottomright, - (x, y), as fraction of the rendering window """ - if hasattr(values, "inputdata"): - values = utils.vtk2numpy(values.inputdata().GetPointData().GetScalars()) + if hasattr(values, "dataset"): + values = utils.vtk2numpy(values.dataset.GetPointData().GetScalars()) n = values.shape[0] if nmax and nmax < n: diff --git a/vedo/version.py b/vedo/version.py index 29bf7fe5..c7ba137c 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev8a' +_version = '2023.5.0+dev9a' diff --git a/vedo/visual.py b/vedo/visual.py index 3dcd201c..ebb35ccd 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -31,6 +31,11 @@ class CommonVisual: """Class to manage the visual aspects common to all objects.""" + def __init__(self): + self.mapper = None + self.property = None + self.actor = None + def show(self, **options): """ Create on the fly an instance of class `Plotter` or use the last existing one to @@ -208,7 +213,7 @@ def add_scalarbar3d( self, title="", pos=None, - size=(None, None), + size=(0, 0), title_font="", title_xoffset=-1.5, title_yoffset=0.0, @@ -343,8 +348,7 @@ def color(self, col, alpha=None, vmin=None, vmax=None): r, g, b = colors.get_color(ci) ctf.AddRGBPoint(x, r, g, b) # colors.printc('color at', round(x, 1), - # 'set to', colors.get_color_name((r, g, b)), - # c='w', bold=0) + # 'set to', colors.get_color_name((r, g, b)), bold=0) else: # user passing [color1, color2, ..] for i, ci in enumerate(col): @@ -401,7 +405,7 @@ def alpha(self, alpha, vmin=None, vmax=None): xalpha = vmin + (vmax - vmin) * i / (len(alpha) - 1) # Create transfer mapping scalar value to opacity otf.AddPoint(xalpha, al) - # colors.printc("alpha at", round(xalpha, 1), "\tset to", al) + # print("alpha at", round(xalpha, 1), "\tset to", al) elif len(alpha.shape) == 2: # user passing [(x0,alpha0), ...] otf.AddPoint(vmin, alpha[0][1]) for xalpha, al in alpha: @@ -2366,10 +2370,6 @@ def diagonal_size(self): return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) -######################################################################################## -# class AssemblyVisual(CommonVisual): -# pass - ######################################################################################## class BaseActor2D(vtk.vtkActor2D): """ From e0c3a1ceb47b999878a899cf42dafa964c2a5d3c Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 16 Oct 2023 20:24:45 +0200 Subject: [PATCH 089/251] refix scalarbar3d --- vedo/addons.py | 23 +++++++++++------------ vedo/pyplot.py | 15 +++++++++------ vedo/version.py | 2 +- vedo/visual.py | 2 +- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 6ec1adc7..e06bc017 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -864,7 +864,7 @@ def ScalarBar( c = get_color(c) sb = vtk.vtkScalarBarActor() - # print(sb.GetLabelFormat()) + # print("GetLabelFormat", sb.GetLabelFormat()) label_format = label_format.replace(":", "%-#") sb.SetLabelFormat(label_format) @@ -944,7 +944,7 @@ def ScalarBar3D( pos=None, size=(0, 0), title_font="", - title_xoffset=-1.5, + title_xoffset=0, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, @@ -1065,7 +1065,6 @@ def ScalarBar3D( scale = shapes.Grid( [-float(sx) * label_offset, 0, 0], c=c, - alpha=1, s=(sx, sy), res=(1, lut.GetTable().GetNumberOfTuples()), ) @@ -1086,11 +1085,6 @@ def ScalarBar3D( scales = [scale] xbns = scale.xbounds() - if pos is None: - d = sx / 2 - if title: - d = np.sqrt((bns[1] - bns[0]) ** 2 + sy * sy) / 20 - pos = (bns[1] - xbns[0] + d, (bns[2] + bns[3]) / 2, bns[4]) lsize = sy / 60 * label_size @@ -1135,7 +1129,7 @@ def ScalarBar3D( pos=(0, 0, 0), s=sy / 50 * title_size, c=c, - justify="centered", + justify="centered-bottom", italic=italic, font=title_font, ) @@ -1143,6 +1137,13 @@ def ScalarBar3D( t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) + if pos is None: + tsize = 0 + if title: + bbt = t.bounds() + tsize = bbt[1] - bbt[0] + pos = (bns[1] + tsize + sx*1.5, (bns[2]+bns[3])/2, bns[4]) + # build below scale if lut.GetUseBelowRangeColor(): r, g, b, alfa = lut.GetBelowRangeColor() @@ -1266,9 +1267,7 @@ def ScalarBar3D( for m in tacts+scales: m.shift(pos) - m.actor.PickableOff() m.property.LightingOff() - m.property.SetInterpolationToFlat() asse = Assembly(scales + tacts) @@ -1276,7 +1275,7 @@ def ScalarBar3D( # print("ScalarBar3D pos",pos, bb) # asse.SetOrigin(pos) asse.SetOrigin(bb[0], bb[2], bb[4]) - # asse.SetOrigin(asse.GetBounds()[0],0,0) #in pyplot + # asse.SetOrigin(bb[0],0,0) #in pyplot line 1312 asse.PickableOff() asse.UseBoundsOff() diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 374224cc..45a9155f 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -1302,14 +1302,17 @@ def __init__( if scalarbar: sc = g.add_scalarbar3d(ztitle, c=ac).scalarbar - sc.SetOrigin(sc.GetBounds()[0],0,0) + + # print(" g.GetBounds()[0]", g.bounds()[:2]) + # print("sc.GetBounds()[0]",sc.GetBounds()[:2]) + delta = sc.GetBounds()[0] - g.bounds()[1] + + sc_size = sc.GetBounds()[1] - sc.GetBounds()[0] + + sc.SetOrigin(sc.GetBounds()[0], 0, 0) sc.scale([self.yscale, 1, 1]) ## prescale trick + sc.shift(-delta + 0.25*sc_size*self.yscale) - # sbnds = sc.xbounds() - # sc.scale([self.yscale, 1, 1]) - # sc.x(sbnds[1]) - # sc.x(self.x1lim + (sbnds[1] - sbnds[0]) * 0.75) - acts.append(sc) acts.append(g) diff --git a/vedo/version.py b/vedo/version.py index c7ba137c..4a12e59b 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev9a' +_version = '2023.5.0+dev10a' diff --git a/vedo/visual.py b/vedo/visual.py index ebb35ccd..fbec30d1 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -215,7 +215,7 @@ def add_scalarbar3d( pos=None, size=(0, 0), title_font="", - title_xoffset=-1.5, + title_xoffset=-1.2, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, From 379c568ee536d69a29ffc433e7c65c8f7602daa7 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 16 Oct 2023 23:18:49 +0200 Subject: [PATCH 090/251] fix LUT problem by removing arr.SetLookupTable(lut) in visual.py 1059 --- vedo/addons.py | 11 +++++-- vedo/visual.py | 79 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index e06bc017..007e61f8 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1068,18 +1068,22 @@ def ScalarBar3D( s=(sx, sy), res=(1, lut.GetTable().GetNumberOfTuples()), ) - cscals = np.linspace(vmin, vmax, lut.GetTable().GetNumberOfTuples()) + cscals = np.linspace(vmin, vmax, lut.GetTable().GetNumberOfTuples(), endpoint=True) if lut.GetScale(): # logarithmic scale lut10 = vtk.vtkLookupTable() lut10.DeepCopy(lut) lut10.SetScaleToLinear() + lut10.Build() scale.cmap(lut10, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=True, useformat=label_format) else: + # for i in range(lut.GetTable().GetNumberOfTuples()): + # print("LUT i=", i, lut.GetTableValue(i)) scale.cmap(lut, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=False, useformat=label_format) ticks_pos, ticks_txt = tk + scale.lw(0).wireframe(False).lighting("off") scales = [scale] @@ -1614,8 +1618,9 @@ class BaseCutter: def __init__(self): self._implicit_func = None self.widget = None - self.clipper=None - self.cutter=None + self.clipper = None + self.cutter = None + self.remnant = None self._alpha = 0.5 self._keypress_id = None diff --git a/vedo/visual.py b/vedo/visual.py index fbec30d1..564c0dbc 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -36,6 +36,45 @@ def __init__(self): self.property = None self.actor = None + # @property + # def LUT(self): + # """Return the lookup table of the object as a vtk object.""" + # return self.mapper.GetLookupTable() + + # @LUT.setter + # def LUT(self, lut): + # """Set the lookup table of the object from a vtk object.""" + # self.mapper.SetLookupTable(lut) + + + @property + def LUT(self): + """Return the lookup table of the object as a numpy object.""" + _lut = self.mapper.GetLookupTable() + values = [] + for i in range(_lut.GetTable().GetNumberOfTuples()): + # print("LUT i =", i, "value =", _lut.GetTableValue(i)) + values.append(_lut.GetTableValue(i)) + return np.array(values) + + @LUT.setter + def LUT(self, arr): + """ + Set the lookup table of the object from a numpy object. + Consider using `cmap()` or `build_lut()` instead as it allows + to set the range of the LUT and to use a string name for the color map. + """ + _newlut = vtk.vtkLookupTable() + _newlut.SetNumberOfTableValues(len(arr)) + if len(arr[0]) == 3: + arr = np.insert(arr, 3, 1, axis=1) + for i, v in enumerate(arr): + _newlut.SetTableValue(i, v) + _newlut.SetRange(self.mapper.GetScalarRange()) + _newlut.Build() + self.mapper.SetLookupTable(_newlut) + self.mapper.ScalarVisibilityOn() + def show(self, **options): """ Create on the fly an instance of class `Plotter` or use the last existing one to @@ -47,25 +86,15 @@ def show(self, **options): Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) - - @property - def LUT(self): - """Return the lookup table of the object.""" - return self.mapper.GetLookupTable() - - @LUT.setter - def LUT(self, lut): - """Set the lookup table of the object.""" - self.mapper.SetLookupTable(lut) def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): """Build a thumbnail of the object and return it as an array.""" # speed is about 20Hz for size=[200,200] ren = vtk.vtkRenderer() - ren.AddActor(self) + ren.AddActor(self.actor) if axes: axes = vedo.addons.Axes(self) - ren.AddActor(axes) + ren.AddActor(axes.actor) ren.ResetCamera() cam = ren.GetActiveCamera() cam.Zoom(zoom) @@ -85,9 +114,9 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.ascontiguousarray(np.flip(narr, axis=0)) - ren.RemoveActor(self) + ren.RemoveActor(self.actor) if axes: - ren.RemoveActor(axes) + ren.RemoveActor(axes.actor) ren_win.Finalize() del ren_win return narr @@ -1027,28 +1056,30 @@ def cmap( lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() - arr.SetLookupTable(lut) + # arr.SetLookupTable(lut) # wrong! causes weird instabilities with LUT data.SetActiveScalars(array_name) # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars # data.SetActiveAttribute(array_name, 0) # boh! - if data.GetScalars(): - data.GetScalars().SetLookupTable(lut) - data.GetScalars().Modified() + # if data.GetScalars(): + # data.GetScalars().SetLookupTable(lut) + # data.GetScalars().Modified() self.mapper.SetLookupTable(lut) self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars self.mapper.ScalarVisibilityOn() self.mapper.SetScalarRange(lut.GetRange()) - if on.startswith("point"): - self.mapper.SetScalarModeToUsePointData() - else: - self.mapper.SetScalarModeToUseCellData() - if hasattr(self.mapper, "SetArrayName"): - self.mapper.SetArrayName(array_name) + # this seems unnecessary + # if on.startswith("point"): + # self.mapper.SetScalarModeToUsePointData() + # else: + # self.mapper.SetScalarModeToUseCellData() + # if hasattr(self.mapper, "SetArrayName"): + # self.mapper.SetArrayName(array_name) + # self.mapper.Modified() return self def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): From c077fda70121c70cf54c3abd3a90b343f506ffb5 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Tue, 17 Oct 2023 01:58:11 +0200 Subject: [PATCH 091/251] more fixes with pylint --- vedo/addons.py | 5 +- vedo/assembly.py | 4 +- vedo/core.py | 180 +++++++++++++++++++++++---------------------- vedo/dolfin.py | 6 +- vedo/file_io.py | 2 - vedo/mesh.py | 15 ++-- vedo/picture.py | 5 +- vedo/plotter.py | 10 +-- vedo/pointcloud.py | 7 +- vedo/shapes.py | 26 +++---- vedo/version.py | 2 +- vedo/visual.py | 30 +++++--- vedo/volume.py | 2 +- 13 files changed, 147 insertions(+), 147 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 007e61f8..8a83d665 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1620,6 +1620,7 @@ def __init__(self): self.widget = None self.clipper = None self.cutter = None + self.mesh = None self.remnant = None self._alpha = 0.5 self._keypress_id = None @@ -1655,7 +1656,7 @@ def add_to(self, plt): plt.widgets.append(self.widget) cpoly = self.clipper.GetOutput() - self.mesh.DeepCopy(cpoly) + self.mesh.dataset.DeepCopy(cpoly) out = self.clipper.GetClippedOutputPort() self.remnant.mapper.SetInputConnection(out) @@ -1672,7 +1673,7 @@ def add_to(self, plt): def remove_from(self, plt): """Remove the widget to the provided `Plotter` instance.""" self.widget.Off() - self.RemoveAllObservers() + self.widget.RemoveAllObservers() ### NOT SURE plt.remove(self.remnant) if self.widget in plt.widgets: plt.widgets.remove(self.widget) diff --git a/vedo/assembly.py b/vedo/assembly.py index 1379a9cc..f771b7aa 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -469,10 +469,12 @@ def reorient(self, new_axis, old_axis=None, rotation=0, rad=False): """Rotate object to a new orientation.""" if old_axis is None: old_axis = self.top - self.base + if rad: + rotation *= 57.3 axis = old_axis / np.linalg.norm(old_axis) direction = new_axis / np.linalg.norm(new_axis) angle = np.arccos(np.dot(axis, direction)) * 57.3 - self.RotateZ(rotation*57.3) + self.RotateZ(rotation) a,b,c = np.cross(axis, direction) self.RotateWXYZ(angle, c,b,a) return self diff --git a/vedo/core.py b/vedo/core.py index 60be3ba0..f7e83b27 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -297,8 +297,8 @@ def _get_str(pd, header): pd = self.obj.dataset.GetFieldData() if pd.GetNumberOfArrays(): out = "\x1b[2m\x1b[1m\x1b[7mMeta Data" - if self.actor.name: - out += f" in {self.actor.name}" + if self.obj.name: + out += f" in {self.obj.name}" out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetAbstractArray(i) @@ -314,6 +314,14 @@ def _get_str(pd, header): class CommonAlgorithms: """Common algorithms.""" + def __init__(self): + + self.dataset = None + # self._update = lambda a, reset_locators=0: a + self.pipeline = None + self.top = np.array([0, 0, 1]) + self.base = np.array([0, 0, 0]) + @property def pointdata(self): """ @@ -365,12 +373,6 @@ def metadata(self): """ return DataArrayHelper(self, 2) - def add_observer(self, event_name, func, priority=0): - """Add a callback function that will be called when an event occurs.""" - event_name = utils.get_vtk_name_event(event_name) - idd = self.AddObserver(event_name, func, priority) - return idd - def memory_address(self): """ Return a unique memory address integer which may serve as the ID of the @@ -378,7 +380,7 @@ def memory_address(self): """ # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ # https://github.com/tfmoraes/polydata_connectivity - return int(self.GetAddressAsString("")[5:], 16) + return int(self.dataset.GetAddressAsString("")[5:], 16) def memory_size(self): """ @@ -565,7 +567,6 @@ def points(self, pts=None): # reset mesh to identity matrix position/rotation: self.point_locator = None self.cell_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.transform = LinearTransform() return self @@ -594,7 +595,7 @@ def lines(self): """ # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - arr1d = vtk2numpy(self.dataset.GetLines().GetData()) + arr1d = utils.vtk2numpy(self.dataset.GetLines().GetData()) i = 0 conn = [] n = len(arr1d) @@ -613,7 +614,7 @@ def lines_as_flat_array(self): Get lines connectivity ids as a numpy array. Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] """ - return vtk2numpy(self.dataset.GetLines().GetData()) + return utils.vtk2numpy(self.dataset.GetLines().GetData()) def mark_boundaries(self): """ @@ -623,7 +624,7 @@ def mark_boundaries(self): mb = vtk.vtkMarkBoundaryFilter() mb.SetInputData(self.dataset) mb.Update() - self.DeepCopy(mb.GetOutput()) + self.dataset.DeepCopy(mb.GetOutput()) self.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) return self @@ -645,15 +646,15 @@ def find_cells_in_bounds(self, xbounds=(), ybounds=(), zbounds=()): bnds[4] = zbounds[0] bnds[5] = zbounds[1] - cellIds = vtk.vtkIdList() + cell_ids = vtk.vtkIdList() if not self.cell_locator: self.cell_locator = vtk.vtkCellTreeLocator() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() - self.cell_locator.FindCellsWithinBounds(bnds, cellIds) + self.cell_locator.FindCellsWithinBounds(bnds, cell_ids) cids = [] - for i in range(cellIds.GetNumberOfIds()): - cid = cellIds.GetId(i) + for i in range(cell_ids.GetNumberOfIds()): + cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) @@ -661,16 +662,15 @@ def find_cells_along_line(self, p0, p1, tol=0.001): """ Find cells that are intersected by a line segment. """ - cellIds = vtk.vtkIdList() + cell_ids = vtk.vtkIdList() if not self.cell_locator: self.cell_locator = vtk.vtkCellTreeLocator() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() - self.cell_locator.FindCellsWithinBounds(bnds, cellIds) - self.cell_locator.FindCellsAlongLine(p0, p1, tol, cellsIds) + self.cell_locator.FindCellsAlongLine(p0, p1, tol, cell_ids) cids = [] - for i in range(cellIds.GetNumberOfIds()): - cid = cellIds.GetId(i) + for i in range(cell_ids.GetNumberOfIds()): + cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) @@ -678,16 +678,15 @@ def find_cells_along_plane(self, origin, normal, tol=0.001): """ Find cells that are intersected by a plane. """ - cellIds = vtk.vtkIdList() + cell_ids = vtk.vtkIdList() if not self.cell_locator: self.cell_locator = vtk.vtkCellTreeLocator() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() - self.cell_locator.FindCellsWithinBounds(bnds, cellIds) - self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cellsIds) + self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cell_ids) cids = [] - for i in range(cellIds.GetNumberOfIds()): - cid = cellIds.GetId(i) + for i in range(cell_ids.GetNumberOfIds()): + cid = cell_ids.GetId(i) cids.append(cid) return np.array(cids) @@ -712,7 +711,7 @@ def delete_cells_by_point_index(self, indices): n += 1 self.dataset.RemoveDeletedCells() - self.mapper.Modified() + self.dataset.Modified() self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) return self @@ -739,7 +738,6 @@ def map_cells_to_points(self, arrays=(), move=False): else: c2p.ProcessAllArraysOn() c2p.Update() - self.mapper.SetScalarModeToUsePointData() self._update(c2p.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return self @@ -780,7 +778,6 @@ def vertices(self, pts): self.point_locator = None self.cell_locator = None self.line_locator = None - self.actor.PokeMatrix(vtk.vtkMatrix4x4()) self.transform = LinearTransform() return self @@ -835,7 +832,6 @@ def map_points_to_cells(self, arrays=(), move=False): else: p2c.ProcessAllArraysOn() p2c.Update() - self.mapper.SetScalarModeToUseCellData() self._update(p2c.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return self @@ -907,7 +903,7 @@ def interpolate_data_from( Arguments: kernel : (str) - available kernels are [shepard, gaussian, linear, voronoi] + available kernels are [shepard, gaussian, linear] null_strategy : (int) specify a strategy to use when encountering a "null" point during the interpolation process. Null points occur when the local neighborhood @@ -957,8 +953,8 @@ def interpolate_data_from( kern.SetSharpness(2) elif kernel.lower() == "linear": kern = vtk.vtkLinearKernel() - elif kernel.lower() == "voronoi": - kern = vtk.vtkProbabilisticVoronoiKernel() + # elif kernel.lower() == "voronoi": + # kern = vtk.vtkProbabilisticVoronoiKernel() else: vedo.logger.error("available kernels are: [shepard, gaussian, linear, voronoi]") raise RuntimeError() @@ -1201,49 +1197,49 @@ def write(self, filename, binary=True): ) return out - def tomesh(self, fill=True, shrink=1.0): - """ - Build a polygonal Mesh from the current object. - - If `fill=True`, the interior faces of all the cells are created. - (setting a `shrink` value slightly smaller than the default 1.0 - can avoid flickering due to internal adjacent faces). - - If `fill=False`, only the boundary faces will be generated. - """ - gf = vtk.vtkGeometryFilter() - if fill: - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.dataset) - sf.SetShrinkFactor(shrink) - sf.Update() - gf.SetInputData(sf.GetOutput()) - gf.Update() - poly = gf.GetOutput() - if shrink == 1.0: - cleanPolyData = vtk.vtkCleanPolyData() - cleanPolyData.PointMergingOn() - cleanPolyData.ConvertLinesToPointsOn() - cleanPolyData.ConvertPolysToLinesOn() - cleanPolyData.ConvertStripsToPolysOn() - cleanPolyData.SetInputData(poly) - cleanPolyData.Update() - poly = cleanPolyData.GetOutput() - else: - gf.SetInputData(self.dataset) - gf.Update() - poly = gf.GetOutput() - - msh = vedo.mesh.Mesh(poly).flat() - msh.scalarbar = self.scalarbar - lut = utils.ctf2lut(self) - if lut: - msh.mapper.SetLookupTable(lut) - - msh.pipeline = utils.OperationNode( - "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - ) - return msh + # def tomesh(self, fill=True, shrink=1.0): + # """ + # Build a polygonal Mesh from the current object. + + # If `fill=True`, the interior faces of all the cells are created. + # (setting a `shrink` value slightly smaller than the default 1.0 + # can avoid flickering due to internal adjacent faces). + + # If `fill=False`, only the boundary faces will be generated. + # """ + # gf = vtk.vtkGeometryFilter() + # if fill: + # sf = vtk.vtkShrinkFilter() + # sf.SetInputData(self.dataset) + # sf.SetShrinkFactor(shrink) + # sf.Update() + # gf.SetInputData(sf.GetOutput()) + # gf.Update() + # poly = gf.GetOutput() + # if shrink == 1.0: + # cleanPolyData = vtk.vtkCleanPolyData() + # cleanPolyData.PointMergingOn() + # cleanPolyData.ConvertLinesToPointsOn() + # cleanPolyData.ConvertPolysToLinesOn() + # cleanPolyData.ConvertStripsToPolysOn() + # cleanPolyData.SetInputData(poly) + # cleanPolyData.Update() + # poly = cleanPolyData.GetOutput() + # else: + # gf.SetInputData(self.dataset) + # gf.Update() + # poly = gf.GetOutput() + + # msh = vedo.mesh.Mesh(poly).flat() + # msh.scalarbar = self.scalarbar + # lut = utils.ctf2lut(self) + # if lut: + # msh.mapper.SetLookupTable(lut) + + # msh.pipeline = utils.OperationNode( + # "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + # ) + # return msh def tomesh(self, bounds=()): """Extract boundary geometry from dataset (or convert data to polygonal type).""" @@ -1284,6 +1280,13 @@ def shrink(self, fraction=0.8): class PointAlgorithms(CommonAlgorithms): """Methods for point clouds.""" + def __init__(self): + + self.transform = None + self.point_locator = None + self.cell_locator = None + self.line_locator = None + def apply_transform(self, LT, concatenate=True, deep_copy=True): """ Apply a linear or non-linear transformation to the mesh polygonal data. @@ -1716,7 +1719,7 @@ def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=Fal # if isinstance(self, vedo.Volume): # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") - ug = self + ug = self.dataset ippd = vtk.vtkImplicitPolyDataDistance() ippd.SetInput(mesh) @@ -1872,28 +1875,29 @@ def clean(self): def find_cell(self, p): """Locate the cell that contains a point and return the cell ID.""" cell = vtk.vtkTetra() - cellId = vtk.mutable(0) + cell_id = vtk.mutable(0) tol2 = vtk.mutable(0) - subId = vtk.mutable(0) + sub_id = vtk.mutable(0) pcoords = [0, 0, 0] weights = [0, 0, 0] - cid = self.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) + cid = self.dataset.FindCell( + p, cell, cell_id, tol2, sub_id, pcoords, weights) return cid def extract_cells_by_id(self, idlist, use_point_ids=False): """Return a new UGrid composed of the specified subset of indices.""" - selectionNode = vtk.vtkSelectionNode() + selection_node = vtk.vtkSelectionNode() if use_point_ids: - selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) + selection_node.SetFieldType(vtk.vtkSelectionNode.POINT) contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() - selectionNode.GetProperties().Set(contcells, 1) + selection_node.GetProperties().Set(contcells, 1) else: - selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) - selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) + selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) + selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) vidlist = utils.numpy2vtk(idlist, dtype="id") - selectionNode.SetSelectionList(vidlist) + selection_node.SetSelectionList(vidlist) selection = vtk.vtkSelection() - selection.AddNode(selectionNode) + selection.AddNode(selection_node) es = vtk.vtkExtractSelection() es.SetInputData(0, self) es.SetInputData(1, selection) diff --git a/vedo/dolfin.py b/vedo/dolfin.py index 37e215af..64c362d6 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -476,7 +476,7 @@ def plot(*inputobj, **options): elif shading == "flat": actor.flat() elif shading[0] == "g": - actor.gouraud() + actor.phong() if "displace" in mode: actor.move(u) @@ -716,8 +716,8 @@ def move(self, u=None, deltas=None): movedpts = coords + deltas if movedpts.shape[1] == 2: # 2d movedpts = np.c_[movedpts, np.zeros(movedpts.shape[0])] - self.polydata(False).GetPoints().SetData(utils.numpy2vtk(movedpts, dtype=np.float32)) - self.polydata(False).GetPoints().Modified() + self.dataset.GetPoints().SetData(utils.numpy2vtk(movedpts, dtype=np.float32)) + self.dataset.GetPoints().Modified() def MeshPoints(*inputobj, **options): diff --git a/vedo/file_io.py b/vedo/file_io.py index ed3c5e7b..fe30d1aa 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -424,8 +424,6 @@ def _load_file(filename, unpack): reader = vtk.vtkXMLUnstructuredGridReader() elif fl.endswith(".vtr"): reader = vtk.vtkXMLRectilinearGridReader() - elif fl.endswith(".pvtk"): - reader = vtk.vtkPDataSetReader() elif fl.endswith(".pvtr"): reader = vtk.vtkXMLPRectilinearGridReader() elif fl.endswith("pvtu"): diff --git a/vedo/mesh.py b/vedo/mesh.py index fa8659df..767f8986 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1129,7 +1129,7 @@ def compute_quality(self, metric=6): def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" vc = vtk.vtkCountVertices() - vc.SetInputData(self.datset) + vc.SetInputData(self.dataset) vc.SetOutputArrayName("VertexCount") vc.Update() varr = vc.GetOutput().GetCellData().GetArray("VertexCount") @@ -1317,11 +1317,11 @@ def delete_cells(self, ids): Remove cells from the mesh object by their ID. Points (vertices) are not removed (you may use `.clean()` to remove those). """ - self.BuildLinks() + self.dataset.BuildLinks() for cid in ids: - self.DeleteCell(cid) - self.RemoveDeletedCells() - self.Modified() + self.dataset.DeleteCell(cid) + self.dataset.RemoveDeletedCells() + self.dataset.Modified() self.mapper.Modified() self.pipeline = OperationNode( "delete_cells", @@ -1439,7 +1439,7 @@ def fill_holes(self, size=None): ) return self - def is_inside(self, point, tol=1e-05): + def contains(self, point, tol=1e-05): """ Return True if point is inside a polydata closed surface. @@ -1946,7 +1946,6 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # rf.Update() # poly1 = rf.GetOutput() raise NotImplementedError("todo") - return self rf = vtk.vtkRotationalExtrusionFilter() # rf = vtk.vtkLinearExtrusionFilter() @@ -2257,7 +2256,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): msh.metadata["ContactCells2"] = vtk2numpy( ipdf.GetOutput(1).GetFieldData().GetArray("ContactCells") ) - msh.GetProperty().SetLineWidth(3) + msh.property.SetLineWidth(3) msh.name = "SurfaceCollision" msh.pipeline = OperationNode( diff --git a/vedo/picture.py b/vedo/picture.py index 9e0f6bed..9c8ad5e0 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -42,7 +42,7 @@ def _get_img(obj, flip=False, translate=()): picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand picture format", obj, c="r") - return vtk.vtkImage() + return vtk.vtkImageData() picr.SetFileName(obj) picr.Update() img = picr.GetOutput() @@ -1138,7 +1138,7 @@ def cmap(self, name, vmin=None, vmax=None): imap.Update() self._update(imap.GetOutput()) self.pipeline = utils.OperationNode( - f"cmap", comment=f'"{name}"', parents=[self], c="#f28482" + "cmap", comment=f'"{name}"', parents=[self], c="#f28482" ) return self @@ -1367,7 +1367,6 @@ def add_triangle(self, p1, p2, p3, c="red3", alpha=1): def add_text( self, txt, - # pos=(0, 0), # TODO width=400, height=200, alpha=1, diff --git a/vedo/plotter.py b/vedo/plotter.py index ec8c0788..05e6d393 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -601,8 +601,8 @@ def __init__( for rd in shape: x0, y0 = rd["bottomleft"] x1, y1 = rd["topright"] - bg_ = rd.pop("bg", "white") - bg2_ = rd.pop("bg2", None) + bg_ = rd.pop("bg", "white") + bg2_ = rd.pop("bg2", None) arenderer = vtk.vtkRenderer() arenderer.SetUseHiddenLineRemoval(settings.hidden_line_removal) @@ -824,9 +824,9 @@ def add(self, *objs, at=None): for a in acts: - # if isinstance(a, vtk.vtkInteractorObserver): - # a.add_to(self) - # continue + if isinstance(a, vtk.vtkInteractorObserver): + a.add_to(self) # from cutters + continue if ren: try: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 500ac431..92b8f4a7 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -626,11 +626,6 @@ def _update(self, polydata, reset_locators=True): self.cell_locator = None return self - def polydata(self): - """Return the underlying ``vtkPolyData`` object.""" - print("WARNING: call to .polydata() is obsolete, you can use property `.dataset`.") - return self.dataset - def _repr_html_(self): """ HTML representation of the Point cloud object for Jupyter Notebooks. @@ -732,6 +727,7 @@ def polydata(self, **kwargs): c="y") return self + def clone(self, deep=True): """ Clone a `PointCloud` or `Mesh` object to make an exact copy of it. @@ -1050,7 +1046,6 @@ def quantize(self, value): qp.SetQFactor(value) qp.Update() self._update(qp.GetOutput()) - self.flat() self.pipeline = utils.OperationNode("quantize", parents=[self]) return self diff --git a/vedo/shapes.py b/vedo/shapes.py index a5663106..a9001c29 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -485,7 +485,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): self.top = top self.name = "Line" - def clone(self): + def clone(self, deep=True): """ Return a copy of the ``Line`` object. @@ -501,21 +501,16 @@ def clone(self): name = self.name base = self.base top = self.top - pickable = self.actor.GetPickable() - drg = self.actor.GetDragable() prop = vtk.vtkProperty() prop.DeepCopy(self.property) ln = Line(self) - ln.dataset.DeepCopy(self.dataset) ln.transform = self.transform - ln.actor.SetProperty(prop) - ln.property = prop + ln.copy_properties_from(self) + ln.dataset.DeepCopy(self.dataset) ln.name = name ln.base = base ln.top = top - ln.actor.SetPickable(pickable) - ln.actor.SetDragable(drg) return ln def linecolor(self, lc=None): @@ -697,7 +692,7 @@ def sweep(self, direction=(1, 0, 0), res=1): ``` ![](https://vedo.embl.es/images/feats/sweepline.png) """ - line = self + line = self.dataset rows = line.GetNumberOfPoints() spacing = 1 / res @@ -735,10 +730,7 @@ def sweep(self, direction=(1, 0, 0), res=1): surface.SetPoints(points) surface.SetPolys(polys) asurface = vedo.Mesh(surface) - prop = vtk.vtkProperty() - prop.DeepCopy(self.property) - asurface.SetProperty(prop) - asurface.property = prop + asurface.copy_properties_from(self) asurface.lighting("default") self.vertices = self.vertices + direction return asurface @@ -2045,8 +2037,8 @@ def __init__( head_radius=None, head_length=None, thickness=1.0, - res=12, - c=None, + res=6, + c='k3', alpha=1.0, ): """ @@ -2117,7 +2109,9 @@ def __init__( c=c, alpha=alpha, ) - self.flat().lighting("plastic") + if c not in cmaps_names: + self.c(c) + self.flat().lighting("off") self.name = "Arrows" diff --git a/vedo/version.py b/vedo/version.py index 4a12e59b..99ae41aa 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev10a' +_version = '2023.5.0+dev11a' diff --git a/vedo/visual.py b/vedo/visual.py index 564c0dbc..5fff706f 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -35,6 +35,13 @@ def __init__(self): self.mapper = None self.property = None self.actor = None + self.scalarbar = None + + self.dataset = None + self.pointdata = {} + self.celldata = {} + + self.shadows = [] # @property # def LUT(self): @@ -75,6 +82,12 @@ def LUT(self, arr): self.mapper.SetLookupTable(_newlut) self.mapper.ScalarVisibilityOn() + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.actor.AddObserver(event_name, func, priority) + return idd + def show(self, **options): """ Create on the fly an instance of class `Plotter` or use the last existing one to @@ -348,7 +361,7 @@ def color(self, col, alpha=None, vmin=None, vmax=None): You can also assign a specific color to a aspecific value with eg.: - `volume.color([(0,'red', (0.5,'violet'), (1,'green')])` + `volume.color([(0,'red'), (0.5,'violet'), (1,'green')])` Arguments: alpha : (list) @@ -454,6 +467,9 @@ def alpha(self, alpha, vmin=None, vmax=None): class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" + def __init__(self): + pass + def clone2d( self, pos=(0, 0), @@ -704,16 +720,8 @@ def lighting( if style: - if isinstance(pr, vtk.vtkVolumeProperty): - self.shade(True) - if style == "off": - self.shade(False) - elif style == "ambient": - style = "default" - self.shade(False) - else: - if style != "off": - pr.LightingOn() + if style != "off": + pr.LightingOn() if style == "off": pr.SetInterpolationToFlat() diff --git a/vedo/volume.py b/vedo/volume.py index 01c22115..e2ff9cb0 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -305,7 +305,7 @@ def _repr_html_(self): name = self.dataset.GetCellData().GetScalars().GetName() cdata = "" - img = self.GetMapper().GetInput() + img = self.mapper.GetInput() allt = [ "
point data array " + name + "
voxel data array " + name + "
voxel data array " + name + "
", From 5bd3920efd87f6954174c9031d43a7ae50733147 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Tue, 17 Oct 2023 03:16:06 +0200 Subject: [PATCH 092/251] first try at tetmesh tet_astyle.py works --- examples/pyplot/scatter3.py | 8 +- vedo/core.py | 91 ++++++++-------- vedo/tetmesh.py | 113 +++++++++---------- vedo/ugrid.py | 209 ++++++++++-------------------------- vedo/utils.py | 20 ++-- vedo/visual.py | 6 +- 6 files changed, 181 insertions(+), 266 deletions(-) diff --git a/examples/pyplot/scatter3.py b/examples/pyplot/scatter3.py index 9da9772e..4d896637 100644 --- a/examples/pyplot/scatter3.py +++ b/examples/pyplot/scatter3.py @@ -6,13 +6,15 @@ ### first cloud in blue, place it at z=0: x = randn(2000) * 3 y = randn(2000) * 2 -pts1 = Points([x, y], c="blue", alpha=0.5).z(0.0) +xy = np.c_[x, y] +pts1 = Points(xy, c="blue", alpha=0.5).z(0.0) bra1 = Brace([-7, -8], [7, -8], comment="whole population", s=0.4, c="b") ### second cloud in red x = randn(1200) + 4 y = randn(1200) + 2 -pts2 = Points([x, y], c="red", alpha=0.5).z(0.1) +xy = np.c_[x, y] +pts2 = Points(xy, c="red", alpha=0.5).z(0.1) bra2 = Brace( [8, 2, 0.3], [6, 5, 0.3], @@ -26,7 +28,7 @@ x = randn(20) + 4 y = randn(20) - 4 mark = Marker("*", s=0.25) -pts3 = Glyph([x, y], mark, c="k").z(0.2) +pts3 = Glyph(xy, mark, c="red5", alpha=0.2).z(0.2) bra3 = Brace([8, -6], [8, -2], comment="my stars").z(0.3) # some text message diff --git a/vedo/core.py b/vedo/core.py index f7e83b27..971942ea 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -322,6 +322,9 @@ def __init__(self): self.top = np.array([0, 0, 1]) self.base = np.array([0, 0, 0]) + self.name = "" + self.filename = "" + @property def pointdata(self): """ @@ -1197,50 +1200,6 @@ def write(self, filename, binary=True): ) return out - # def tomesh(self, fill=True, shrink=1.0): - # """ - # Build a polygonal Mesh from the current object. - - # If `fill=True`, the interior faces of all the cells are created. - # (setting a `shrink` value slightly smaller than the default 1.0 - # can avoid flickering due to internal adjacent faces). - - # If `fill=False`, only the boundary faces will be generated. - # """ - # gf = vtk.vtkGeometryFilter() - # if fill: - # sf = vtk.vtkShrinkFilter() - # sf.SetInputData(self.dataset) - # sf.SetShrinkFactor(shrink) - # sf.Update() - # gf.SetInputData(sf.GetOutput()) - # gf.Update() - # poly = gf.GetOutput() - # if shrink == 1.0: - # cleanPolyData = vtk.vtkCleanPolyData() - # cleanPolyData.PointMergingOn() - # cleanPolyData.ConvertLinesToPointsOn() - # cleanPolyData.ConvertPolysToLinesOn() - # cleanPolyData.ConvertStripsToPolysOn() - # cleanPolyData.SetInputData(poly) - # cleanPolyData.Update() - # poly = cleanPolyData.GetOutput() - # else: - # gf.SetInputData(self.dataset) - # gf.Update() - # poly = gf.GetOutput() - - # msh = vedo.mesh.Mesh(poly).flat() - # msh.scalarbar = self.scalarbar - # lut = utils.ctf2lut(self) - # if lut: - # msh.mapper.SetLookupTable(lut) - - # msh.pipeline = utils.OperationNode( - # "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - # ) - # return msh - def tomesh(self, bounds=()): """Extract boundary geometry from dataset (or convert data to polygonal type).""" geo = vtk.vtkGeometryFilter() @@ -1917,3 +1876,47 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): c="#9e2a2b", ) return ug + + def tomesh(self, fill=True, shrink=1.0): + """ + Build a polygonal Mesh from the current object. + + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). + + If `fill=False`, only the boundary faces will be generated. + """ + gf = vtk.vtkGeometryFilter() + if fill: + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.dataset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + if shrink == 1.0: + cleanPolyData = vtk.vtkCleanPolyData() + cleanPolyData.PointMergingOn() + cleanPolyData.ConvertLinesToPointsOn() + cleanPolyData.ConvertPolysToLinesOn() + cleanPolyData.ConvertStripsToPolysOn() + cleanPolyData.SetInputData(poly) + cleanPolyData.Update() + poly = cleanPolyData.GetOutput() + else: + gf.SetInputData(self.dataset) + gf.Update() + poly = gf.GetOutput() + + msh = vedo.mesh.Mesh(poly).flat() + msh.scalarbar = self.scalarbar + lut = utils.ctf2lut(self) + if lut: + msh.mapper.SetLookupTable(lut) + + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + ) + return msh diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index d6be7820..e3eaad3d 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -10,10 +10,11 @@ import vedo from vedo import utils # from vedo.base import BaseGrid -from vedo.core import VolumeAlgorithms +from vedo.core import PointAlgorithms, VolumeAlgorithms from vedo.mesh import Mesh from vedo.file_io import download, loadUnStructuredGrid - +from vedo.visual import VolumeVisual +from vedo.transformations import LinearTransform __docformat__ = "google" @@ -51,7 +52,7 @@ def delaunay3d(mesh, radius=0, tol=None): pd.SetPoints(vpts) deln.SetInputData(pd) else: - deln.SetInputData(mesh.GetMapper().GetInput()) + deln.SetInputData(mesh.dataset) deln.SetAlpha(radius) deln.AlphaTetsOn() deln.AlphaTrisOff() @@ -107,7 +108,7 @@ def _buildtetugrid(points, cells): ########################################################################## -class TetMesh(VolumeAlgorithms, vtk.vtkVolume): +class TetMesh(VolumeVisual, VolumeAlgorithms): """The class describing tetrahedral meshes.""" def __init__( @@ -129,18 +130,22 @@ def __init__( """ super().__init__() + self.actor = vtk.vtkVolume() + + self.transform = LinearTransform() + # inputtype = str(type(inputobj)) # print('TetMesh inputtype', inputtype) ################### if inputobj is None: - self._data = vtk.vtkUnstructuredGrid() + self.dataset = vtk.vtkUnstructuredGrid() elif isinstance(inputobj, vtk.vtkUnstructuredGrid): - self._data = inputobj + self.dataset = inputobj elif isinstance(inputobj, vedo.UGrid): - self._data = inputobj._data + self.dataset = inputobj.dataset elif isinstance(inputobj, vtk.vtkRectilinearGrid): r2t = vtk.vtkRectilinearGridToTetrahedra() @@ -148,14 +153,14 @@ def __init__( r2t.RememberVoxelIdOn() r2t.SetTetraPerCellTo6() r2t.Update() - self._data = r2t.GetOutput() + self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): r2t = vtk.vtkDataSetTriangleFilter() r2t.SetInputData(inputobj) # r2t.TetrahedraOnlyOn() r2t.Update() - self._data = r2t.GetOutput() + self.dataset = r2t.GetOutput() elif isinstance(inputobj, str): if "https://" in inputobj: @@ -165,31 +170,35 @@ def __init__( tt.SetInputData(ug) tt.SetTetrahedraOnly(True) tt.Update() - self._data = tt.GetOutput() + self.dataset = tt.GetOutput() elif utils.is_sequence(inputobj): # if "ndarray" not in inputtype: # inputobj = np.array(inputobj) - self._data = _buildtetugrid(inputobj[0], inputobj[1]) + self.dataset = _buildtetugrid(inputobj[0], inputobj[1]) ################### if "tetra" in mapper: - self._mapper = vtk.vtkProjectedTetrahedraMapper() + self.mapper = vtk.vtkProjectedTetrahedraMapper() elif "ray" in mapper: - self._mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() + self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() elif "zs" in mapper: - self._mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper() + self.mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper() + # elif "mesh" in mapper: + # self.mapper = vtk.vtkDataSetMapper()#vtkAbstractVolumeMapper, elif isinstance(mapper, vtk.vtkMapper): - self._mapper = mapper + self.mapper = mapper else: vedo.logger.error(f"Unknown mapper type {type(mapper)}") raise RuntimeError() - self._mapper.SetInputData(self._data) - self.SetMapper(self._mapper) - self.color(c).alpha(alpha) + self.property = self.actor.GetProperty() + + self.mapper.SetInputData(self.dataset) + self.actor.SetMapper(self.mapper) + self.cmap(c).alpha(alpha) if alpha_unit: - self.GetProperty().SetScalarOpacityUnitDistance(alpha_unit) + self.property.SetScalarOpacityUnitDistance(alpha_unit) # remember stuff: self._color = c @@ -197,7 +206,7 @@ def __init__( self._alpha_unit = alpha_unit self.pipeline = utils.OperationNode( - self, comment=f"#tets {self._data.GetNumberOfCells()}", + self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) # ----------------------------------------------------------- @@ -242,15 +251,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = "
" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = "" pts = self.vertices @@ -275,29 +284,23 @@ def _repr_html_(self): def _update(self, data): - self._data = data - self.mapper().SetInputData(data) - self.mapper().Modified() + self.dataset = data + self.mapper.SetInputData(data) + self.mapper.Modified() return self - def clone(self): + def clone(self, mapper="tetra"): """Clone the `TetMesh` object to yield an exact copy.""" - ugCopy = vtk.vtkUnstructuredGrid() - ugCopy.DeepCopy(self._data) + ug = vtk.vtkUnstructuredGrid() + ug.DeepCopy(self.dataset) - cloned = TetMesh(ugCopy) + cloned = TetMesh(ug, mapper=mapper) pr = vtk.vtkVolumeProperty() - pr.DeepCopy(self.GetProperty()) - cloned.SetProperty(pr) - - # assign the same transformation to the copy - cloned.SetOrigin(self.GetOrigin()) - cloned.SetScale(self.GetScale()) - cloned.SetOrientation(self.GetOrientation()) - cloned.SetPosition(self.GetPosition()) + pr.DeepCopy(self.property) + cloned.actor.SetProperty(pr) - cloned.mapper().SetScalarMode(self.mapper().GetScalarMode()) - cloned.name = self.name + cloned.mapper.SetScalarMode(self.mapper.GetScalarMode()) + # cloned.name = self.name cloned.pipeline = utils.OperationNode( "clone", c="#edabab", shape="diamond", parents=[self], @@ -326,7 +329,7 @@ def compute_quality(self, metric=7): for an explanation of the meaning of each metric.. """ qf = vtk.vtkMeshQuality() - qf.SetInputData(self._data) + qf.SetInputData(self.dataset) qf.SetTetQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() @@ -336,7 +339,7 @@ def compute_quality(self, metric=7): def compute_tets_volume(self): """Add to this mesh a cell data array containing the tetrahedron volume.""" csf = vtk.vtkCellSizeFilter() - csf.SetInputData(self._data) + csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(True) csf.SetComputeLength(False) @@ -367,7 +370,7 @@ def check_validity(self, tol=0): vald = vtk.vtkCellValidator() if tol: vald.SetTolerance(tol) - vald.SetInputData(self._data) + vald.SetInputData(self.dataset) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return utils.vtk2numpy(varr) @@ -383,7 +386,7 @@ def threshold(self, name=None, above=None, below=None, on="cells"): Set keyword "on" to either "cells" or "points". """ th = vtk.vtkThreshold() - th.SetInputData(self._data) + th.SetInputData(self.dataset) if name is None: if self.celldata.keys(): @@ -424,7 +427,7 @@ def decimate(self, scalars_name, fraction=0.5, n=0): .. note:: setting `fraction=0.1` leaves 10% of the original nr of tets. """ decimate = vtk.vtkUnstructuredGridQuadricDecimation() - decimate.SetInputData(self._data) + decimate.SetInputData(self.dataset) decimate.SetScalarsName(scalars_name) if n: # n = desired number of points @@ -445,7 +448,7 @@ def subdvide(self): Subdivide one tetrahedron into twelve for every tetra. """ sd = vtk.vtkSubdivideTetra() - sd.SetInputData(self._data) + sd.SetInputData(self.dataset) sd.Update() self._update(sd.GetOutput()) self.pipeline = utils.OperationNode( @@ -459,11 +462,11 @@ def isosurface(self, value=True): Set `value` to a single value or list of values to compute the isosurface(s). """ - if not self._data.GetPointData().GetScalars(): + if not self.dataset.GetPointData().GetScalars(): self.map_cells_to_points() - scrange = self._data.GetPointData().GetScalars().GetRange() + scrange = self.dataset.GetPointData().GetScalars().GetRange() cf = vtk.vtkContourFilter() # vtk.vtkContourGrid() - cf.SetInputData(self._data) + cf.SetInputData(self.dataset) if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) @@ -480,7 +483,7 @@ def isosurface(self, value=True): clp.SetInputData(cf.GetOutput()) clp.Update() msh = Mesh(clp.GetOutput(), c=None).phong() - msh.mapper().SetLookupTable(utils.ctf2lut(self)) + msh.mapper.SetLookupTable(utils.ctf2lut(self)) msh.pipeline = utils.OperationNode("isosurface", c="#edabab", parents=[self]) return msh @@ -500,10 +503,10 @@ def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): plane.SetNormal(normal) cc = vtk.vtkCutter() - cc.SetInputData(self._data) + cc.SetInputData(self.dataset) cc.SetCutFunction(plane) cc.Update() msh = Mesh(cc.GetOutput()).flat().lighting("ambient") - msh.mapper().SetLookupTable(utils.ctf2lut(self)) + msh.mapper.SetLookupTable(utils.ctf2lut(self)) msh.pipeline = utils.OperationNode("slice", c="#edabab", parents=[self]) return msh diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 588033ee..0d1096e7 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- import numpy as np try: @@ -7,11 +9,10 @@ import vedo from vedo import settings -from vedo import colors from vedo import utils -# from vedo.base import BaseGrid from vedo.core import VolumeAlgorithms from vedo.file_io import download, loadUnStructuredGrid +from vedo.visual import MeshVisual __docformat__ = "google" @@ -23,7 +24,7 @@ __all__ = ["UGrid"] ######################################################################### -class UGrid(VolumeAlgorithms, vtk.vtkActor): +class UGrid(MeshVisual, VolumeAlgorithms): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): @@ -46,21 +47,23 @@ def __init__(self, inputobj=None): """ super().__init__() - inputtype = str(type(inputobj)) - self._data = None - self._polydata = None - self._bfprop = None + self.dataset = None + self.actor = vtk.vtkActor() + self.property = self.actor.GetProperty() + self.name = "UGrid" ################### + inputtype = str(type(inputobj)) + if inputobj is None: - self._data = vtk.vtkUnstructuredGrid() + self.dataset = vtk.vtkUnstructuredGrid() elif utils.is_sequence(inputobj): pts, cells, celltypes = inputobj - self._data = vtk.vtkUnstructuredGrid() + self.dataset = vtk.vtkUnstructuredGrid() if not utils.is_sequence(cells[0]): tets = [] @@ -77,14 +80,14 @@ def __init__(self, inputobj=None): vpts = utils.numpy2vtk(pts, dtype=np.float32) points = vtk.vtkPoints() points.SetData(vpts) - self._data.SetPoints(points) + self.dataset.SetPoints(points) # This fill the points and use cells to define orientation # points = vtk.vtkPoints() # for c in cells: # for pid in c: # points.InsertNextPoint(pts[pid]) - # self._data.SetPoints(points) + # self.dataset.SetPoints(points) # Fill cells # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html @@ -110,62 +113,54 @@ def __init__(self, inputobj=None): cpids = cell.GetPointIds() for j, pid in enumerate(cell_conn): cpids.SetId(j, pid) - self._data.InsertNextCell(ct, cpids) + self.dataset.InsertNextCell(ct, cpids) elif "UnstructuredGrid" in inputtype: - self._data = inputobj + self.dataset = inputobj elif isinstance(inputobj, str): + self.filename = inputobj if "https://" in inputobj: + self.filename = inputobj inputobj = download(inputobj, verbose=False) - self._data = loadUnStructuredGrid(inputobj) - self.filename = inputobj + self.dataset = loadUnStructuredGrid(inputobj) else: vedo.logger.error(f"cannot understand input type {inputtype}") return - # self._mapper = vtk.vtkDataSetMapper() - self._mapper = vtk.vtkPolyDataMapper() - self._mapper.SetInterpolateScalarsBeforeMapping(settings.interpolate_scalars_before_mapping) + # self.mapper = vtk.vtkDataSetMapper() + self.mapper = vtk.vtkPolyDataMapper() + self.mapper.SetInterpolateScalarsBeforeMapping(settings.interpolate_scalars_before_mapping) if settings.use_polygon_offset: - self._mapper.SetResolveCoincidentTopologyToPolygonOffset() + self.mapper.SetResolveCoincidentTopologyToPolygonOffset() pof, pou = settings.polygon_offset_factor, settings.polygon_offset_units - self._mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) - self.GetProperty().SetInterpolationToFlat() + self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) + self.property.SetInterpolationToFlat() - if not self._data: + if not self.dataset: return # now fill the representation of the vtk unstr grid - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self._data) - sf.SetShrinkFactor(1.0) - sf.Update() - gf = vtk.vtkGeometryFilter() - gf.SetInputData(sf.GetOutput()) - gf.Update() - self._polydata = gf.GetOutput() - - self._mapper.SetInputData(self._polydata) - sc = None - if self.useCells: - sc = self._polydata.GetCellData().GetScalars() - else: - sc = self._polydata.GetPointData().GetScalars() - if sc: - self._mapper.SetScalarRange(sc.GetRange()) - - self.SetMapper(self._mapper) - self.property = self.GetProperty() + # sf = vtk.vtkShrinkFilter() + # sf.SetInputData(self.dataset) + # sf.SetShrinkFactor(1.0) + # sf.Update() + # gf = vtk.vtkGeometryFilter() + # gf.SetInputData(sf.GetOutput()) + # gf.Update() + # self._polydata = gf.GetOutput() + + self.mapper.SetInputData(self.dataset) + self.actor.SetMapper(self.mapper) self.pipeline = utils.OperationNode( - self, comment=f"#cells {self._data.GetNumberOfCells()}", + self, comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#4cc9f0", ) - # ------------------------------------------------------------------ + # ------------------------------------------------------------------ def _repr_html_(self): """ HTML representation of the UGrid object for Jupyter Notebooks. @@ -206,15 +201,15 @@ def _repr_html_(self): help_text += f"
({dots}{self.filename[-30:]})" pdata = "" - if self._data.GetPointData().GetScalars(): - if self._data.GetPointData().GetScalars().GetName(): - name = self._data.GetPointData().GetScalars().GetName() + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() pdata = "" cdata = "" - if self._data.GetCellData().GetScalars(): - if self._data.GetCellData().GetScalars().GetName(): - name = self._data.GetCellData().GetScalars().GetName() + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() cdata = "" pts = self.vertices @@ -238,118 +233,25 @@ def _repr_html_(self): ] return "\n".join(all) - def clone(self): + def clone(self, deep=True): """Clone the UGrid object to yield an exact copy.""" - ugCopy = vtk.vtkUnstructuredGrid() - ugCopy.DeepCopy(self._data) + ug = vtk.vtkUnstructuredGrid() + ug.DeepCopy(self.dataset) - cloned = UGrid(ugCopy) - pr = self.GetProperty() - if isinstance(pr, vtk.vtkVolumeProperty): - prv = vtk.vtkVolumeProperty() - else: - prv = vtk.vtkProperty() - prv.DeepCopy(pr) - cloned.SetProperty(prv) - cloned.property = prv - - # assign the same transformation to the copy - cloned.SetOrigin(self.GetOrigin()) - cloned.SetScale(self.GetScale()) - cloned.SetOrientation(self.GetOrientation()) - cloned.SetPosition(self.GetPosition()) - cloned.name = self.name + cloned = UGrid(ug) + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + cloned.dataset.SetProperty(pr) + cloned.property = pr cloned.pipeline = utils.OperationNode( "clone", parents=[self], shape='diamond', c='#bbe1ed', ) return cloned - def color(self, c=False, alpha=None): - """ - Set/get UGrid color. - If None is passed as input, will use colors from active scalars. - Same as `ugrid.c()`. - """ - if c is False: - return np.array(self.GetProperty().GetColor()) - if c is None: - self._mapper.ScalarVisibilityOn() - return self - self._mapper.ScalarVisibilityOff() - cc = colors.get_color(c) - self.property.SetColor(cc) - if self.trail: - self.trail.GetProperty().SetColor(cc) - if alpha is not None: - self.alpha(alpha) - return self - - def alpha(self, opacity=None): - """Set/get mesh's transparency. Same as `mesh.opacity()`.""" - if opacity is None: - return self.property.GetOpacity() - - self.property.SetOpacity(opacity) - bfp = self.GetBackfaceProperty() - if bfp: - if opacity < 1: - self._bfprop = bfp - self.SetBackfaceProperty(None) - else: - self.SetBackfaceProperty(self._bfprop) - return self - - def opacity(self, alpha=None): - """Set/get mesh's transparency. Same as `mesh.alpha()`.""" - return self.alpha(alpha) - - def wireframe(self, value=True): - """Set mesh's representation as wireframe or solid surface. - Same as `mesh.wireframe()`.""" - if value: - self.property.SetRepresentationToWireframe() - else: - self.property.SetRepresentationToSurface() - return self - - def linewidth(self, lw=None): - """Set/get width of mesh edges. Same as `lw()`.""" - if lw is not None: - if lw == 0: - self.property.EdgeVisibilityOff() - self.property.SetRepresentationToSurface() - return self - self.property.EdgeVisibilityOn() - self.property.SetLineWidth(lw) - else: - return self.property.GetLineWidth() - return self - - def lw(self, linewidth=None): - """Set/get width of mesh edges. Same as `linewidth()`.""" - return self.linewidth(linewidth) - - def linecolor(self, lc=None): - """Set/get color of mesh edges. Same as `lc()`.""" - if lc is not None: - if "ireframe" in self.property.GetRepresentationAsString(): - self.property.EdgeVisibilityOff() - self.color(lc) - return self - self.property.EdgeVisibilityOn() - self.property.SetEdgeColor(colors.get_color(lc)) - else: - return self.property.GetEdgeColor() - return self - - def lc(self, linecolor=None): - """Set/get color of mesh edges. Same as `linecolor()`.""" - return self.linecolor(linecolor) - def extract_cell_type(self, ctype): """Extract a specific cell type and return a new `UGrid`.""" - uarr = self._data.GetCellTypesArray() + uarr = self.dataset.GetCellTypesArray() ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") selection_node = vtk.vtkSelectionNode() @@ -359,9 +261,10 @@ def extract_cell_type(self, ctype): selection = vtk.vtkSelection() selection.AddNode(selection_node) es = vtk.vtkExtractSelection() - es.SetInputData(0, self._data) + es.SetInputData(0, self.dataset) es.SetInputData(1, selection) es.Update() + ug = UGrid(es.GetOutput()) ug.pipeline = utils.OperationNode( diff --git a/vedo/utils.py b/vedo/utils.py index 2b6736f0..ddacdb16 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -575,8 +575,8 @@ def extract_cells_by_type(obj, types=()): """ ef = vtk.vtkExtractCellsByType() try: - ef.SetInputData(obj.inputdata()) - except: + ef.SetInputData(obj.dataset) + except AttributeError: ef.SetInputData(obj) for ct in types: @@ -1643,9 +1643,9 @@ def _print_vtkactor(obj): elif isinstance(obj, vedo.TetMesh): cf = "m" vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) - pos = obj.GetPosition() - bnds = obj.GetBounds() - ug = obj.inputdata() + pos = obj.pos() + bnds = obj.bounds() + ug = obj.dataset vedo.printc("nr. of tetras".ljust(14) + ": ", c=cf, bold=True, end="") vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") @@ -2072,7 +2072,7 @@ def camera_from_quaternion(pos, quaternion, distance=10000, ngl_correct=True): camera = vtk.vtkCamera() # define the quaternion in vtk, note the swapped order # w,x,y,z instead of x,y,z,w - quat_vtk = vtk.vtkQuaterniond(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) + quat_vtk = vtk.vtkQuaternion(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) # use this to define a rotation matrix in x,y,z # right handed units M = np.zeros((3, 3), dtype=np.float32) @@ -2395,8 +2395,12 @@ def vedo2trimesh(mesh): tms.append(vedo2trimesh(a)) return tms - from trimesh import Trimesh - + try: + from trimesh import Trimesh + except ModuleNotFoundError: + vedo.logger.error("Need trimesh to run:\npip install trimesh") + return None + tris = mesh.cells carr = mesh.celldata["CellIndividualColors"] ccols = carr diff --git a/vedo/visual.py b/vedo/visual.py index 5fff706f..5d0dc524 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -38,8 +38,8 @@ def __init__(self): self.scalarbar = None self.dataset = None - self.pointdata = {} - self.celldata = {} + # self.pointdata = {} + # self.celldata = {} self.shadows = [] @@ -1888,7 +1888,7 @@ def caption( ##################################################################### -class MeshVisual: +class MeshVisual(PointsVisual): """Class to manage the visual aspects of a ``Maesh`` object.""" def follow_camera(self, camera=None, origin=None): From 636daa759b8a5ef02487f8f21f4e4e798b852031 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 17 Oct 2023 13:17:20 +0200 Subject: [PATCH 093/251] add transformation example in docs --- docs/changes.md | 8 +--- examples/pyplot/histo_hexagonal.py | 21 ++++----- vedo/applications.py | 2 +- vedo/core.py | 18 +++----- vedo/picture.py | 7 ++- vedo/transformations.py | 69 ++++++++++++++++++++++++++---- vedo/version.py | 2 +- 7 files changed, 84 insertions(+), 43 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index c64f7ffb..61bbb313 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -43,20 +43,18 @@ examples/basic/interaction_modes2.py examples/volumetric/slicer1.py ``` + + ### Broken Examples ``` ~/Projects/vedo/examples/basic -align5.py background_image.py cut_interactive.py glyphs2.py ~/Projects/vedo/examples/advanced -cut_with_mesh1.py -timer_callback2.py warp4.py -warp6.py ~/Projects/vedo/examples/pyplot @@ -64,7 +62,6 @@ custom_axes1.py caption.py embed_matplotlib.py goniometer.py -histo_2d_a.py histo_2d_b.py histo_hexagonal.py isolines.py @@ -77,7 +74,6 @@ brownian2d.py gyroscope1.py gyroscope2.py lorenz.py -mag_field1.py pendulum_3d.py trail.py diff --git a/examples/pyplot/histo_hexagonal.py b/examples/pyplot/histo_hexagonal.py index 214e75c2..5202efdb 100644 --- a/examples/pyplot/histo_hexagonal.py +++ b/examples/pyplot/histo_hexagonal.py @@ -7,17 +7,14 @@ y = np.random.randn(N) * 1.5 # hexagonal binned histogram: -histo = histogram( - x, y, - bins=10, - mode='hexbin', - fill=True, - cmap='terrain', -) +histo = histogram(x, y, bins=10, mode="hexbin", fill=True, cmap="terrain") # add a formula: -f = r'f(x, y)=A \exp \left(-\left(\frac{\left(x-x_{o}\right)^{2}}' -f+= r'{2 \sigma_{x}^{2}}+\frac{\left(y-y_{o}\right)^{2}}' -f+= r'{2 \sigma_{y}^{2}}\right)\right)' -formula = Latex(f, c='k', s=1.5).rotate_x(90).rotate_z(90).pos([-4,-5,2]) +f = r"f(x, y)=A \exp \left(-\left(\frac{\left(x-x_{o}\right)^{2}}" +f += r"{2 \sigma_{x}^{2}}+\frac{\left(y-y_{o}\right)^{2}}" +f += r"{2 \sigma_{y}^{2}}\right)\right)" -show(histo, formula, axes=1, viewup='z') +formula = Latex(f, c="k", s=1.5) +# formula.rotate_x(90).rotate_z(90).pos([-4, -5, 2]) +formula.rotate_z(90).rotate_x(90).pos([-4, -5, 2]) + +show(histo, formula, axes=1, viewup="z").close() diff --git a/vedo/applications.py b/vedo/applications.py index 14a56350..3b056b83 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -331,7 +331,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): self.cmap() if levels[0] and levels[1]: - vsl.lighting(window=levels[0], level=levels[1]) + self.lighting(window=levels[0], level=levels[1]) self.usage_txt = ( "H :rightarrow toggle this banner off\n" diff --git a/vedo/core.py b/vedo/core.py index 971942ea..00cf35b8 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1250,17 +1250,13 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): """ Apply a linear or non-linear transformation to the mesh polygonal data. ```python - from vedo import Cube, show - c1 = Cube().rotate_z(5).x(2).y(1) - print("cube1 position", c1.pos()) - T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y - c2 = Cube().c('r4') - c2.apply_transform(T) # ignore previous movements - c2.apply_transform(T, concatenate=True) - c2.apply_transform(T, concatenate=True) - print("cube2 position", c2.pos()) - show(c1, c2, axes=1).close() - ``` + from vedo import Cube, show, settings + settings.use_parallel_projection = True + c1 = Cube().rotate_z(25).pos(2,1).mirror() + T = c1.transform # rotate by 5 degrees, place at (2,1) + c2 = Cube().c('red4').wireframe().lw(10).lighting('off') + c2.apply_transform(T) + show(c1, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ if self.dataset.GetNumberOfPoints() == 0: diff --git a/vedo/picture.py b/vedo/picture.py index 9c8ad5e0..0e8b128a 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -245,7 +245,7 @@ class Picture(vedo.visual.PictureVisual, vedo.visual.ActorTransforms): Class used to represent 2D pictures in a 3D world. """ - def __init__(self, obj=None, channels=3, flip=False): + def __init__(self, obj=None, channels=3): """ Can be instantiated with a path file name or with a numpy array. @@ -257,11 +257,10 @@ def __init__(self, obj=None, channels=3, flip=False): Arguments: channels : (int, list) only select these specific rgba channels (useful to remove alpha) - flip : (bool) - flip xy axis convention (when input is a numpy array) """ self.name = "Picture" self.filename = "" + self.file_size = 0 self.pipeline = None self.actor = vtk.vtkImageActor() @@ -269,7 +268,7 @@ def __init__(self, obj=None, channels=3, flip=False): self.property = self.actor.GetProperty() if utils.is_sequence(obj) and len(obj) > 0: # passing array - img = _get_img(obj, flip) + img = _get_img(obj, False) elif isinstance(obj, vtk.vtkImageData): img = obj diff --git a/vedo/transformations.py b/vedo/transformations.py index f3b501e8..3b735f51 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -44,7 +44,32 @@ class LinearTransform: """Work with linear transformations.""" def __init__(self, T=None): - """Init.""" + """Define a linear transformation. + + Arguments: + T : (vtk.vtkTransform, numpy array) + vtk transformation. Defaults to None. + + Example: + ```python + from vedo import * + settings.use_parallel_projection = True + + LT = LinearTransform() + LT.translate([3,0,1]).rotate_z(45) + print(LT) + + sph = Sphere(r=0.2) + print("Sphere before", s1.transform) + s1.apply_transform(LT) + # same as: + # LT.apply_to(s1) + print("Sphere after ", s1.transform) + + zero = Point([0,0,0]) + show(s1, zero, axes=1).close() + ``` + """ if T is None: T = vtk.vtkTransform() @@ -107,11 +132,11 @@ def apply_to(self, obj): tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(self.T) - tp.SetInputData(obj) + tp.SetInputData(obj.dataset) tp.Update() out = tp.GetOutput() - obj.DeepCopy(out) + obj.dataset.DeepCopy(out) obj.point_locator = None obj.cell_locator = None obj.line_locator = None @@ -143,14 +168,38 @@ def is_identity(self): def compute_inverse(self): """Compute inverse.""" - return LinearTransform(self.T.GetInverse()) + t = self.clone() + t.invert() + return t def clone(self): - """Clone.""" + """Clone transformation to make an exact copy.""" return LinearTransform(self.T) def concatenate(self, T, pre_multiply=False): - """Post multiply.""" + """ + Post-multiply (by default) 2 transfomations. + + Example: + ```python + from vedo import * + + A = LinearTransform() + A.rotate_x(45) + A.translate([7,8,9]) + A.translate([10,10,10]) + print("A", A) + + B = A.compute_inverse() + B.shift([1,2,3]) + + # A is applied first, then B + print("A.concatenate(B)", A.concatenate(B)) + + # B is applied first, then A + # print("B*A", B*A) + ``` + """ if pre_multiply: self.T.PreMultiply() try: @@ -159,6 +208,10 @@ def concatenate(self, T, pre_multiply=False): self.T.Concatenate(T.T) self.T.PostMultiply() return self + + def __mul__(self, A): + """Pre-multiply 2 transfomations.""" + return self.concatenate(A, pre_multiply=True) def get_concatenated_transform(self, i): """Get intermediate matrix by concatenation index.""" @@ -169,12 +222,12 @@ def n_concatenated_transforms(self): """Get number of concatenated transforms.""" return self.T.GetNumberOfConcatenatedTransforms() - def translate(self, p): + def translate(self, *p): """Translate, same as `shift`.""" self.T.Translate(*p) return self - def shift(self, p): + def shift(self, *p): """Shift, same as `translate`.""" return self.translate(*p) diff --git a/vedo/version.py b/vedo/version.py index 99ae41aa..c5aceb39 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev11a' +_version = '2023.5.0+dev12a' From 3d613c1ee8f82841374d01817b89d9227dbff336 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 17 Oct 2023 13:38:49 +0200 Subject: [PATCH 094/251] added applications.Slicer3DTwinPlotter class --- docs/changes.md | 3 + vedo/applications.py | 139 ++++++++++++++++++++++++++++++++++++++++++- vedo/core.py | 3 +- vedo/mesh.py | 9 +++ 4 files changed, 152 insertions(+), 2 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 61bbb313..10309449 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -28,6 +28,9 @@ - removed `Volume.probe_line()` - removed `Volume.probe_plane()` - `Slicer2DPlotter` moved to application module +- `mesh.is_inside(pt)` moved to `mesh.contains(pt)` +- added `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz + diff --git a/vedo/applications.py b/vedo/applications.py index 3b056b83..7f04cf27 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -34,8 +34,9 @@ "IsosurfaceBrowser", "FreeHandCutPlotter", "RayCastPlotter", - "Slicer3DPlotter", "Slicer2DPlotter", + "Slicer3DPlotter", + "Slicer3DTwinPlotter", "SplinePlotter", "AnimationPlayer", "Clock", @@ -273,6 +274,142 @@ def buttonfunc(_obj, _ename): ) self.add(hist) +class Slicer3DTwinPlotter(Plotter): + """ + Create a window with two side-by-side 3D slicers for two Volumes. + + Example: + ```python + from vedo import dataurl, Volume + + vol1 = Volume(dataurl + "embryo.slc") + vol2 = Volume(dataurl + "embryo.slc") + + plt = Slicer3DTwinPlotter( + vol1, vol2, + shape=(1, 2), + sharecam=True, + bg="white", + bg2="lightblue", + ) + + plt.at(0).add(Text2D("Volume 1", pos="top-center")) + plt.at(1).add(Text2D("Volume 2", pos="top-center")) + + plt.show(viewup='z') + plt.at(0).reset_camera() + plt.interactive().close() + ``` + ![](https://user-images.githubusercontent.com/32848391/268638466-525114bc-7ce8-480b-9c45-af9ea0d93203.png) + """ + + def __init__(self, vol1, vol2, clamp=True, **kwargs): + + Plotter.__init__(self, **kwargs) + + cmap = "gist_ncar_r" + cx, cy, cz = "dr", "dg", "db" # slider colors + ambient, diffuse = 0.7, 0.3 # lighting params + + self.at(0) + box1 = vol1.box().alpha(0.1) + box2 = vol2.box().alpha(0.1) + self.add(box1) + + self.at(1).add(box2) + self.add_inset(vol2, pos=(0.85, 0.15), size=0.15, c="white", draggable=0) + + dims = vol1.dimensions() + data = vol1.pointdata[0] + rmin, rmax = vol1.scalar_range() + if clamp: + hdata, edg = np.histogram(data, bins=50) + logdata = np.log(hdata + 1) + meanlog = np.sum(np.multiply(edg[:-1], logdata)) / np.sum(logdata) + rmax = min(rmax, meanlog + (meanlog - rmin) * 0.9) + rmin = max(rmin, meanlog - (rmax - meanlog) * 0.9) + + + def slider_function_x(widget, event): + i = int(self.xslider.value) + msh1 = vol1.xslice(i).lighting("", ambient, diffuse, 0) + msh1.cmap(cmap, vmin=rmin, vmax=rmax) + msh1.name = "XSlice" + self.at(0).remove("XSlice") # removes the old one + msh2 = vol2.xslice(i).lighting("", ambient, diffuse, 0) + msh2.cmap(cmap, vmin=rmin, vmax=rmax) + msh2.name = "XSlice" + self.at(1).remove("XSlice") + if 0 < i < dims[0]: + self.at(0).add(msh1) + self.at(1).add(msh2) + + def slider_function_y(widget, event): + i = int(self.yslider.value) + msh1 = vol1.yslice(i).lighting("", ambient, diffuse, 0) + msh1.cmap(cmap, vmin=rmin, vmax=rmax) + msh1.name = "YSlice" + self.at(0).remove("YSlice") + msh2 = vol2.yslice(i).lighting("", ambient, diffuse, 0) + msh2.cmap(cmap, vmin=rmin, vmax=rmax) + msh2.name = "YSlice" + self.at(1).remove("YSlice") + if 0 < i < dims[1]: + self.at(0).add(msh1) + self.at(1).add(msh2) + + def slider_function_z(widget, event): + i = int(self.zslider.value) + msh1 = vol1.zslice(i).lighting("", ambient, diffuse, 0) + msh1.cmap(cmap, vmin=rmin, vmax=rmax) + msh1.name = "ZSlice" + self.at(0).remove("ZSlice") + msh2 = vol2.zslice(i).lighting("", ambient, diffuse, 0) + msh2.cmap(cmap, vmin=rmin, vmax=rmax) + msh2.name = "ZSlice" + self.at(1).remove("ZSlice") + if 0 < i < dims[2]: + self.at(0).add(msh1) + self.at(1).add(msh2) + + self.at(0) + bs = box1.bounds() + self.xslider = self.add_slider3d( + slider_function_x, + pos1=(bs[0], bs[2], bs[4]), + pos2=(bs[1], bs[2], bs[4]), + xmin=0, + xmax=dims[0], + t=box1.diagonal_size() / mag(box1.xbounds()) * 0.6, + c=cx, + show_value=False, + ) + self.yslider = self.add_slider3d( + slider_function_y, + pos1=(bs[1], bs[2], bs[4]), + pos2=(bs[1], bs[3], bs[4]), + xmin=0, + xmax=dims[1], + t=box1.diagonal_size() / mag(box1.ybounds()) * 0.6, + c=cy, + show_value=False, + ) + self.zslider = self.add_slider3d( + slider_function_z, + pos1=(bs[0], bs[2], bs[4]), + pos2=(bs[0], bs[2], bs[5]), + xmin=0, + xmax=dims[2], + value=int(dims[2] / 2), + t=box1.diagonal_size() / mag(box1.zbounds()) * 0.6, + c=cz, + show_value=False, + ) + + ################# + hist = CornerHistogram(data, s=0.2, bins=25, logscale=True, c='k') + self.add(hist) + slider_function_z(0,0) ## init call ######################################################################################## class Slicer2DPlotter(Plotter): diff --git a/vedo/core.py b/vedo/core.py index 00cf35b8..aded79ea 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1256,7 +1256,8 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): T = c1.transform # rotate by 5 degrees, place at (2,1) c2 = Cube().c('red4').wireframe().lw(10).lighting('off') c2.apply_transform(T) - show(c1, c2, axes=1).close() ``` + show(c1, c2, axes=1).close() + ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ if self.dataset.GetNumberOfPoints() == 0: diff --git a/vedo/mesh.py b/vedo/mesh.py index 767f8986..f6f97840 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1445,6 +1445,15 @@ def contains(self, point, tol=1e-05): Note: if you have many points to check use `inside_points()` instead. + + Example: + ```python + from vedo import * + s = Sphere().c('green5').alpha(0.5) + pt = [0.1, 0.2, 0.3] + print("Sphere contains", pt, s.contains(pt)) + show(s, Point(pt), axes=1).close() + ``` """ points = vtk.vtkPoints() points.InsertNextPoint(point) From 336bab2af6380f3df2697fe9ae8fc84d4e6403ff Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 17 Oct 2023 16:38:27 +0200 Subject: [PATCH 095/251] changes to tetmesh --- examples/volumetric/tet_build.py | 40 +-- vedo/colors.py | 13 +- vedo/core.py | 530 ++++++++++++++++++------------- vedo/tetmesh.py | 33 +- vedo/utils.py | 32 +- 5 files changed, 377 insertions(+), 271 deletions(-) diff --git a/examples/volumetric/tet_build.py b/examples/volumetric/tet_build.py index 7d17d999..5270e05e 100644 --- a/examples/volumetric/tet_build.py +++ b/examples/volumetric/tet_build.py @@ -2,33 +2,35 @@ by manually defining vertices and cells""" from vedo import * -points = [ (0, 0, 0), # first tet - (1, 0, 0), - (1, 1, 0), - (0, 1, 2), - (3, 3, 3), # second tet - (4, 3, 3), - (4, 4, 3), - (3, 4, 4), - (2, 5, 3), # third tet - (3, 5, 3), - (3, 6, 3), - (2, 5, 5), - ] +points = [ + (0, 0, 0), # first tet + (1, 0, 0), + (1, 1, 0), + (0, 1, 2), + (3, 3, 3), # second tet + (4, 3, 3), + (4, 4, 3), + (3, 4, 4), + (2, 5, 3), # third tet + (3, 5, 3), + (3, 6, 3), + (2, 5, 5), +] tets = [[0,1,2,3], [4,5,6,7], [8,9,10,11]] -scal = [10.0, 20.0, 30.0] # cell scalars +scal = [10.0, 20.0, 30.0] # some cell scalar values # Create the TeTMesh object -tm = TetMesh([points,tets]) -tm.celldata["myscal"] = scal +tm = TetMesh([points, tets]) +tm.celldata["myscalar"] = scal -tm.color('jet') +tm.cmap('jet') # tm.color('green') # or set a single color -printc("tetmesh.inputdata():", type(tm.inputdata())) # vtkUnstructuredGrid -printc("points, cells :", len(tm.points()), len(tm.cells())) +printc("tetmesh.dataset:", type(tm.dataset)) # vtkUnstructuredGrid +printc("#vertices :", tm.vertices.size) +printc("#cells :", len(tm.cells)) # Optionally convert tm to a Mesh (for visualization) show([(tm, __doc__), diff --git a/vedo/colors.py b/vedo/colors.py index 907e4555..6cc89dbc 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -1096,6 +1096,7 @@ def printc( box="", end="\n", flush=True, + return_string=False, ): """ Print to terminal in color (any color!). @@ -1123,6 +1124,8 @@ def printc( print a box with specified text character [''] flush : (bool) flush buffer after printing [True] + return_string : (bool) + return the string without printing it [False] end : (str) the end character to be printed [newline] @@ -1237,9 +1240,15 @@ def printc( else: out = special + cseq + txt + reset - sys.stdout.write(out + end) + if return_string: + return out + end + else: + sys.stdout.write(out + end) + + except: # --------------------------------------------------- fallback - except: # ------------------------------------------------------------- fallback + if return_string: + return ''.join(strings) try: print(*strings, end=end) diff --git a/vedo/core.py b/vedo/core.py index aded79ea..cf03d141 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -791,9 +791,14 @@ def cells(self): The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ - arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) - if arr1d.size == 0: - arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) + try: + # valid for unstructured grid + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + except AttributeError: + # valid for polydata + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + if arr1d.size == 0: + arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. @@ -1576,161 +1581,218 @@ def legosurface( ) return m - def cut_with_plane(self, origin=(0, 0, 0), normal="x"): + def tomesh(self, fill=True, shrink=1.0): """ - Cut the object with the plane defined by a point and a normal. + Build a polygonal Mesh from the current object. - Arguments: - origin : (list) - the cutting plane goes through this point - normal : (list, str) - normal vector to the cutting plane + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). + + If `fill=False`, only the boundary faces will be generated. """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") + gf = vtk.vtkGeometryFilter() + if fill: + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.dataset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + if shrink == 1.0: + clean_poly = vtk.vtkCleanPolyData() + clean_poly.PointMergingOn() + clean_poly.ConvertLinesToPointsOn() + clean_poly.ConvertPolysToLinesOn() + clean_poly.ConvertStripsToPolysOn() + clean_poly.SetInputData(poly) + clean_poly.Update() + poly = clean_poly.GetOutput() + else: + gf.SetInputData(self.dataset) + gf.Update() + poly = gf.GetOutput() - strn = str(normal) - if strn == "x": normal = (1, 0, 0) - elif strn == "y": normal = (0, 1, 0) - elif strn == "z": normal = (0, 0, 1) - elif strn == "-x": normal = (-1, 0, 0) - elif strn == "-y": normal = (0, -1, 0) - elif strn == "-z": normal = (0, 0, -1) - plane = vtk.vtkPlane() - plane.SetOrigin(origin) - plane.SetNormal(normal) - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(self.dataset) - clipper.SetClipFunction(plane) - clipper.GenerateClipScalarsOff() - clipper.GenerateClippedOutputOff() - clipper.SetValue(0) - clipper.Update() - cout = clipper.GetOutput() + msh = vedo.mesh.Mesh(poly).flat() + msh.scalarbar = self.scalarbar + lut = utils.ctf2lut(self) + if lut: + msh.mapper.SetLookupTable(lut) - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return ug + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + ) + return msh - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self +class UGridAlgorithms(CommonAlgorithms): - def cut_with_box(self, box): + def bounds(self): """ - Cut the grid with the specified bounding box. + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + # OVERRIDE CommonAlgorithms.bounds() which is too slow + return self.dataset.GetBounds() - Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. - If an object is passed, its bounding box are used. + def isosurface(self, value=None, flying_edges=True): + """ + Return an `Mesh` isosurface extracted from the `Volume` object. - Example: - ```python - from vedo import * - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') - tetmesh.color('rainbow') - cu = Cube(side=500).x(500) # any Mesh works - tetmesh.cut_with_box(cu).show(axes=1) - ``` - ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + Set `value` as single float or list of values to draw the isosurface(s). + Use flying_edges for faster results (but sometimes can interfere with `smooth()`). + + Examples: + - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) + + ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_box() is not applicable to Volume objects.") + scrange = self.dataset.GetScalarRange() - bc = vtk.vtkBoxClipDataSet() - bc.SetInputData(self.dataset) - if isinstance(box, vtk.vtkProp): - boxb = box.GetBounds() + if flying_edges: + cf = vtk.vtkFlyingEdges3D() + cf.InterpolateAttributesOn() else: - boxb = box - bc.SetBoxClip(*boxb) - bc.Update() - cout = bc.GetOutput() + cf = vtk.vtkContourFilter() + cf.UseScalarTreeOn() - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return ug + cf.SetInputData(self.dataset) + cf.ComputeNormalsOn() + if utils.is_sequence(value): + cf.SetNumberOfContours(len(value)) + for i, t in enumerate(value): + cf.SetValue(i, t) else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return self + if value is None: + value = (2 * scrange[0] + scrange[1]) / 3.0 + # print("automatic isosurface value =", value) + cf.SetValue(0, value) + + cf.Update() + poly = cf.GetOutput() + + out = vedo.mesh.Mesh(poly, c=None).phong() + out.mapper.SetScalarRange(scrange[0], scrange[1]) + + out.pipeline = utils.OperationNode( + "isosurface", + parents=[self], + comment=f"#pts {out.dataset.GetNumberOfPoints()}", + c="#4cc9f0:#e9c46a", + ) + return out - def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): + def tomesh(self, fill=True, shrink=1.0): """ - Cut a UGrid or TetMesh with a Mesh. + Build a polygonal Mesh from the current object. - Use `invert` to return cut off part of the input object. + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). + + If `fill=False`, only the boundary faces will be generated. """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_mesh() is not applicable to Volume objects.") + gf = vtk.vtkGeometryFilter() + if fill: + sf = vtk.vtkShrinkFilter() + sf.SetInputData(self.dataset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + if shrink == 1.0: + clean_poly = vtk.vtkCleanPolyData() + clean_poly.PointMergingOn() + clean_poly.ConvertLinesToPointsOn() + clean_poly.ConvertPolysToLinesOn() + clean_poly.ConvertStripsToPolysOn() + clean_poly.SetInputData(poly) + clean_poly.Update() + poly = clean_poly.GetOutput() + else: + gf.SetInputData(self.dataset) + gf.Update() + poly = gf.GetOutput() - ug = self.dataset + msh = vedo.mesh.Mesh(poly).flat() + msh.scalarbar = self.scalarbar + lut = utils.ctf2lut(self) + if lut: + msh.mapper.SetLookupTable(lut) - ippd = vtk.vtkImplicitPolyDataDistance() - ippd.SetInput(mesh) + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + ) + return msh - if whole_cells or only_boundary: - clipper = vtk.vtkExtractGeometry() - clipper.SetInputData(ug) - clipper.SetImplicitFunction(ippd) - clipper.SetExtractInside(not invert) - clipper.SetExtractBoundaryCells(False) - if only_boundary: - clipper.SetExtractBoundaryCells(True) - clipper.SetExtractOnlyBoundaryCells(True) + + def extract_cells_by_id(self, idlist, use_point_ids=False): + """Return a new UGrid composed of the specified subset of indices.""" + selection_node = vtk.vtkSelectionNode() + if use_point_ids: + selection_node.SetFieldType(vtk.vtkSelectionNode.POINT) + contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() + selection_node.GetProperties().Set(contcells, 1) else: - signedDistances = vtk.vtkFloatArray() - signedDistances.SetNumberOfComponents(1) - signedDistances.SetName("SignedDistances") - for pointId in range(ug.GetNumberOfPoints()): - p = ug.GetPoint(pointId) - signedDistance = ippd.EvaluateFunction(p) - signedDistances.InsertNextValue(signedDistance) - ug.GetPointData().AddArray(signedDistances) - ug.GetPointData().SetActiveScalars("SignedDistances") - clipper = vtk.vtkClipDataSet() - clipper.SetInputData(ug) - clipper.SetInsideOut(not invert) - clipper.SetValue(0.0) + selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) + selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) + vidlist = utils.numpy2vtk(idlist, dtype="id") + selection_node.SetSelectionList(vidlist) + selection = vtk.vtkSelection() + selection.AddNode(selection_node) + es = vtk.vtkExtractSelection() + es.SetInputData(0, self) + es.SetInputData(1, selection) + es.Update() - clipper.Update() - cout = clipper.GetOutput() + ug = vedo.ugrid.UGrid(es.GetOutput()) + pr = vtk.vtkProperty() + pr.DeepCopy(self.property) + ug.SetProperty(pr) + ug.property = pr - # if ug.GetCellData().GetScalars(): # not working - # scalname = ug.GetCellData().GetScalars().GetName() - # if scalname: # not working - # if self.useCells: - # self.celldata.select(scalname) - # else: - # self.pointdata.select(scalname) - # self._update(cout) - # self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") - # return self + ug.mapper.SetLookupTable(utils.ctf2lut(self)) + ug.pipeline = utils.OperationNode( + "extract_cells_by_id", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return ug - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return ug + def find_cell(self, p): + """Locate the cell that contains a point and return the cell ID.""" + cell = vtk.vtkTetra() + cell_id = vtk.mutable(0) + tol2 = vtk.mutable(0) + sub_id = vtk.mutable(0) + pcoords = [0, 0, 0] + weights = [0, 0, 0] + cid = self.dataset.FindCell( + p, cell, cell_id, tol2, sub_id, pcoords, weights) + return cid - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self + def clean(self): + """ + Cleanup unused points and empty cells + """ + cl = vtk.vtkStaticCleanUnstructuredGrid() + cl.SetInputData(self.dataset) + cl.RemoveUnusedPointsOn() + cl.ProduceMergeMapOff() + cl.AveragePointDataOff() + cl.Update() + + self._update(cl.GetOutput()) + self.pipeline = utils.OperationNode( + "clean", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self def extract_cells_on_plane(self, origin, normal): """ @@ -1807,113 +1869,133 @@ def extract_cells_on_cylinder(self, center, axis, radius): ) self._update(bf.GetOutput()) return self - - def clean(self): + + def cut_with_plane(self, origin=(0, 0, 0), normal="x"): """ - Cleanup unused points and empty cells + Cut the object with the plane defined by a point and a normal. + + Arguments: + origin : (list) + the cutting plane goes through this point + normal : (list, str) + normal vector to the cutting plane """ - cl = vtk.vtkStaticCleanUnstructuredGrid() - cl.SetInputData(self.dataset) - cl.RemoveUnusedPointsOn() - cl.ProduceMergeMapOff() - cl.AveragePointDataOff() - cl.Update() + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") - self._update(cl.GetOutput()) - self.pipeline = utils.OperationNode( - "clean", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self + strn = str(normal) + if strn == "x": normal = (1, 0, 0) + elif strn == "y": normal = (0, 1, 0) + elif strn == "z": normal = (0, 0, 1) + elif strn == "-x": normal = (-1, 0, 0) + elif strn == "-y": normal = (0, -1, 0) + elif strn == "-z": normal = (0, 0, -1) + plane = vtk.vtkPlane() + plane.SetOrigin(origin) + plane.SetNormal(normal) + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(self.dataset) + clipper.SetClipFunction(plane) + clipper.GenerateClipScalarsOff() + clipper.GenerateClippedOutputOff() + clipper.SetValue(0) + clipper.Update() + cout = clipper.GetOutput() - def find_cell(self, p): - """Locate the cell that contains a point and return the cell ID.""" - cell = vtk.vtkTetra() - cell_id = vtk.mutable(0) - tol2 = vtk.mutable(0) - sub_id = vtk.mutable(0) - pcoords = [0, 0, 0] - weights = [0, 0, 0] - cid = self.dataset.FindCell( - p, cell, cell_id, tol2, sub_id, pcoords, weights) - return cid + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return ug - def extract_cells_by_id(self, idlist, use_point_ids=False): - """Return a new UGrid composed of the specified subset of indices.""" - selection_node = vtk.vtkSelectionNode() - if use_point_ids: - selection_node.SetFieldType(vtk.vtkSelectionNode.POINT) - contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() - selection_node.GetProperties().Set(contcells, 1) else: - selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) - selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) - vidlist = utils.numpy2vtk(idlist, dtype="id") - selection_node.SetSelectionList(vidlist) - selection = vtk.vtkSelection() - selection.AddNode(selection_node) - es = vtk.vtkExtractSelection() - es.SetInputData(0, self) - es.SetInputData(1, selection) - es.Update() + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self - ug = vedo.ugrid.UGrid(es.GetOutput()) - pr = vtk.vtkProperty() - pr.DeepCopy(self.property) - ug.SetProperty(pr) - ug.property = pr + def cut_with_box(self, box): + """ + Cut the grid with the specified bounding box. - ug.mapper.SetLookupTable(utils.ctf2lut(self)) - ug.pipeline = utils.OperationNode( - "extract_cells_by_id", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return ug + Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. + If an object is passed, its bounding box are used. - def tomesh(self, fill=True, shrink=1.0): + This method always returns a TetMesh object. + + Example: + ```python + from vedo import * + tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') + tetmesh.color('rainbow') + cu = Cube(side=500).x(500) # any Mesh works + tetmesh.cut_with_box(cu).show(axes=1) + ``` + ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ - Build a polygonal Mesh from the current object. + bc = vtk.vtkBoxClipDataSet() + bc.SetInputData(self.dataset) + try: + boxb = box.bounds() + except AttributeError: + boxb = box - If `fill=True`, the interior faces of all the cells are created. - (setting a `shrink` value slightly smaller than the default 1.0 - can avoid flickering due to internal adjacent faces). + bc.SetBoxClip(*boxb) + bc.Update() + cout = bc.GetOutput() - If `fill=False`, only the boundary faces will be generated. + # output of vtkBoxClipDataSet is always tetrahedrons + tm = vedo.TetMesh(cout) + tm.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return tm + + + def cut_with_mesh( + self, mesh, invert=False, whole_cells=False, only_boundary=False + ): """ - gf = vtk.vtkGeometryFilter() - if fill: - sf = vtk.vtkShrinkFilter() - sf.SetInputData(self.dataset) - sf.SetShrinkFactor(shrink) - sf.Update() - gf.SetInputData(sf.GetOutput()) - gf.Update() - poly = gf.GetOutput() - if shrink == 1.0: - cleanPolyData = vtk.vtkCleanPolyData() - cleanPolyData.PointMergingOn() - cleanPolyData.ConvertLinesToPointsOn() - cleanPolyData.ConvertPolysToLinesOn() - cleanPolyData.ConvertStripsToPolysOn() - cleanPolyData.SetInputData(poly) - cleanPolyData.Update() - poly = cleanPolyData.GetOutput() + Cut a UGrid or TetMesh with a Mesh. + + Use `invert` to return cut off part of the input object. + """ + ug = self.dataset + + ippd = vtk.vtkImplicitPolyDataDistance() + ippd.SetInput(mesh.dataset) + + if whole_cells or only_boundary: + clipper = vtk.vtkExtractGeometry() + clipper.SetInputData(ug) + clipper.SetImplicitFunction(ippd) + clipper.SetExtractInside(not invert) + clipper.SetExtractBoundaryCells(False) + if only_boundary: + clipper.SetExtractBoundaryCells(True) + clipper.SetExtractOnlyBoundaryCells(True) else: - gf.SetInputData(self.dataset) - gf.Update() - poly = gf.GetOutput() + signed_dists = vtk.vtkFloatArray() + signed_dists.SetNumberOfComponents(1) + signed_dists.SetName("SignedDistance") + for pointId in range(ug.GetNumberOfPoints()): + p = ug.GetPoint(pointId) + signed_dist = ippd.EvaluateFunction(p) + signed_dists.InsertNextValue(signed_dist) + ug.GetPointData().AddArray(signed_dists) + ug.GetPointData().SetActiveScalars("SignedDistance") + clipper = vtk.vtkClipDataSet() + clipper.SetInputData(ug) + clipper.SetInsideOut(not invert) + clipper.SetValue(0.0) - msh = vedo.mesh.Mesh(poly).flat() - msh.scalarbar = self.scalarbar - lut = utils.ctf2lut(self) - if lut: - msh.mapper.SetLookupTable(lut) + clipper.Update() + cout = clipper.GetOutput() - msh.pipeline = utils.OperationNode( - "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - ) - return msh + ug = vedo.UGrid(cout) + if isinstance(self, vedo.UGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return ug diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index e3eaad3d..90649b3b 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -9,8 +9,7 @@ import numpy as np import vedo from vedo import utils -# from vedo.base import BaseGrid -from vedo.core import PointAlgorithms, VolumeAlgorithms +from vedo.core import UGridAlgorithms from vedo.mesh import Mesh from vedo.file_io import download, loadUnStructuredGrid from vedo.visual import VolumeVisual @@ -108,7 +107,7 @@ def _buildtetugrid(points, cells): ########################################################################## -class TetMesh(VolumeVisual, VolumeAlgorithms): +class TetMesh(VolumeVisual, UGridAlgorithms): """The class describing tetrahedral meshes.""" def __init__( @@ -173,8 +172,6 @@ def __init__( self.dataset = tt.GetOutput() elif utils.is_sequence(inputobj): - # if "ndarray" not in inputtype: - # inputobj = np.array(inputobj) self.dataset = _buildtetugrid(inputobj[0], inputobj[1]) ################### @@ -184,8 +181,6 @@ def __init__( self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() elif "zs" in mapper: self.mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper() - # elif "mesh" in mapper: - # self.mapper = vtk.vtkDataSetMapper()#vtkAbstractVolumeMapper, elif isinstance(mapper, vtk.vtkMapper): self.mapper = mapper else: @@ -211,6 +206,24 @@ def __init__( ) # ----------------------------------------------------------- + def __str__(self): + """Print a string summary of the `TetMesh` object.""" + opts = dict(c='m', return_string=True) + bnds = self.bounds() + ug = self.dataset + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + s = vedo.printc("TetMesh".ljust(70), bold=True, invert=True, **opts) + s+= vedo.printc("nr. of tetras".ljust(14) + ": ", bold=True, end="", **opts) + s+= vedo.printc(ug.GetNumberOfCells(), bold=False, **opts) + s+= vedo.printc("bounds".ljust(14) + ": ", bold=True, end="", **opts) + s+= vedo.printc("x=(" + bx1 + ", " + bx2 + ")", bold=False, end="", **opts) + s+= vedo.printc(" y=(" + by1 + ", " + by2 + ")", bold=False, end="", **opts) + s+= vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", bold=False, **opts) + # _print_data(ug, cf) #TODO + return s + def _repr_html_(self): """ HTML representation of the TetMesh object for Jupyter Notebooks. @@ -235,7 +248,7 @@ def _repr_html_(self): bounds = "
".join( [ - utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) + utils.utils.precision(min_x,4) + " ... " + utils.utils.precision(max_x,4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) @@ -272,7 +285,7 @@ def _repr_html_(self): "
point data array " + name + "
cell data array " + name + "
point data array " + name + "
cell data array " + name + "

", help_text, "", "", - "", + "", "", pdata, @@ -283,7 +296,7 @@ def _repr_html_(self): return "\n".join(allt) - def _update(self, data): + def _update(self, data, reset_locators=False): self.dataset = data self.mapper.SetInputData(data) self.mapper.Modified() diff --git a/vedo/utils.py b/vedo/utils.py index ddacdb16..9608b6b5 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1641,23 +1641,23 @@ def _print_vtkactor(obj): _print_vtkactor(act) elif isinstance(obj, vedo.TetMesh): - cf = "m" - vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) - pos = obj.pos() - bnds = obj.bounds() ug = obj.dataset - vedo.printc("nr. of tetras".ljust(14) + ": ", c=cf, bold=True, end="") - vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) - vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") - vedo.printc(pos, c=cf, bold=False) - vedo.printc("bounds".ljust(14) + ": ", c=cf, bold=True, end="") - bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c=cf, bold=False, end="") - by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") - bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) - _print_data(ug, cf) + # cf = "m" + # vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) + # bnds = obj.bounds() + # vedo.printc("nr. of tetras".ljust(14) + ": ", c=cf, bold=True, end="") + # vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) + # # vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") + # # vedo.printc(pos, c=cf, bold=False) + # vedo.printc("bounds".ljust(14) + ": ", c=cf, bold=True, end="") + # bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) + # vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c=cf, bold=False, end="") + # by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) + # vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") + # bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) + # vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) + obj.__str__() + _print_data(ug, 'm') elif isinstance(obj, vedo.UGrid): cf = "m" From 3bc3173db74a04ad0d774f28d99008926cbadfb1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 17 Oct 2023 22:05:07 +0200 Subject: [PATCH 096/251] fix cutters --- examples/volumetric/earth_model.py | 7 ++-- examples/volumetric/tet_threshold.py | 2 +- examples/volumetric/ugrid2.py | 4 +-- vedo/addons.py | 39 ++++++++++++++++++---- vedo/core.py | 21 ++++++------ vedo/plotter.py | 9 ++++-- vedo/tetmesh.py | 7 ---- vedo/ugrid.py | 48 ++++++++++------------------ vedo/utils.py | 24 +++++++------- vedo/visual.py | 10 ------ 10 files changed, 85 insertions(+), 86 deletions(-) diff --git a/examples/volumetric/earth_model.py b/examples/volumetric/earth_model.py index 310dfa68..63585006 100644 --- a/examples/volumetric/earth_model.py +++ b/examples/volumetric/earth_model.py @@ -31,15 +31,16 @@ msh = tet.tomesh(shrink=0.95).cmap(lut, 'cell_scalars', on='cells') msh.add_scalarbar3d( categories=lut_table, - pos=(505500, 6416900, -630), + pos=(505700, 6417950, -1630), title='Units', title_size=1.25, label_size=1.5, size=[100, 2200], ) # put scalarbar vertical, tell camera to keep bounds into account -msh.scalarbar.rotate_x(90, around='itself').rotate_z(60, around='itself') -msh.scalarbar.use_bounds() +# msh.scalarbar.rotate_x(90, around='itself').rotate_z(60, around='itself') +msh.scalarbar.rotate_x(90).rotate_z(60)#.shift(400,1050, -900) +msh.scalarbar.use_bounds(True) # Create cmap for conductor cond = conductor.tomesh().cmap(lut, 'cell_scalars', on='cells') diff --git a/examples/volumetric/tet_threshold.py b/examples/volumetric/tet_threshold.py index 75d68e0f..afd6e34c 100644 --- a/examples/volumetric/tet_threshold.py +++ b/examples/volumetric/tet_threshold.py @@ -5,7 +5,7 @@ settings.use_depth_peeling = True tetm = TetMesh(dataurl+'limb_ugrid.vtk') -tetm.color('prism').alpha([0,1]) +tetm.cmap('prism').alpha([0,1]) # Threshold the tetrahedral mesh for values in the range: tetm.threshold(above=0.9, below=1) diff --git a/examples/volumetric/ugrid2.py b/examples/volumetric/ugrid2.py index d2d87ec1..1c962036 100644 --- a/examples/volumetric/ugrid2.py +++ b/examples/volumetric/ugrid2.py @@ -2,9 +2,9 @@ from vedo import * ug = UGrid(dataurl+'ugrid.vtk') +ug.cmap('k5') -ug.c('g',0.2).lc('r').lw(2) -ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) +ug = ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) msh = ug.tomesh(shrink=0.8) # return a polygonal Mesh diff --git a/vedo/addons.py b/vedo/addons.py index 8a83d665..47f06e35 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1656,14 +1656,16 @@ def add_to(self, plt): plt.widgets.append(self.widget) cpoly = self.clipper.GetOutput() - self.mesh.dataset.DeepCopy(cpoly) + self.mesh._update(cpoly) out = self.clipper.GetClippedOutputPort() self.remnant.mapper.SetInputConnection(out) self.remnant.alpha(self._alpha).color((0.5, 0.5, 0.5)) self.remnant.lighting('off').wireframe() - plt.add(self.remnant) - self._keypress_id = plt.interactor.AddObserver("KeyPressEvent", self._keypress) + plt.add(self.mesh, self.remnant) + self._keypress_id = plt.interactor.AddObserver( + "KeyPressEvent", self._keypress + ) if plt.interactor and plt.interactor.GetInitialized(): self.widget.On() self._select_polygons(self.widget, "InteractionEvent") @@ -1692,10 +1694,11 @@ def __init__( invert=False, can_translate=True, can_scale=True, - c=(0.25, 0.25, 0.25), origin=(), normal=(), padding=0.05, + delayed=False, + c=(0.25, 0.25, 0.25), alpha=0.05, ): """ @@ -1716,6 +1719,9 @@ def __init__( normal to the plane padding : (float) padding around the input mesh + delayed : (bool) + if True the callback is delayed until + when the mouse button is released (useful for large meshes) c : (color) color of the box cutter widget alpha : (float) @@ -1768,7 +1774,10 @@ def __init__( self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() - self.widget.AddObserver("InteractionEvent", self._select_polygons) + if delayed: + self.widget.AddObserver("EndInteractionEvent", self._select_polygons) + else: + self.widget.AddObserver("InteractionEvent", self._select_polygons) if len(origin) == 3: self.widget.SetOrigin(origin) @@ -1827,6 +1836,7 @@ def __init__( can_scale=True, initial_bounds=(), padding=0.025, + delayed=False, c=(0.25, 0.25, 0.25), alpha=0.05, ): @@ -1846,6 +1856,11 @@ def __init__( enable scaling of the widget initial_bounds : (list) initial bounds of the box widget + padding : (float) + padding space around the input mesh + delayed : (bool) + if True the callback is delayed until + when the mouse button is released (useful for large meshes) c : (color) color of the box cutter widget alpha : (float) @@ -1899,7 +1914,10 @@ def __init__( self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() - self.widget.AddObserver("InteractionEvent", self._select_polygons) + if delayed: + self.widget.AddObserver("EndInteractionEvent", self._select_polygons) + else: + self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetPlanes(self._implicit_func) @@ -1933,6 +1951,7 @@ def __init__( origin=(), radius=0, res=60, + delayed=False, c='white', alpha=0.05, ): @@ -1954,6 +1973,9 @@ def __init__( initial radius of the sphere widget res : int resolution of the sphere widget + delayed : bool + if True the cutting callback is delayed until + when the mouse button is released (useful for large meshes) c : color color of the box cutter widget alpha : float @@ -2013,7 +2035,10 @@ def __init__( self.widget.SetPlaceFactor(1.0) self.widget.SetInputData(poly) self.widget.PlaceWidget() - self.widget.AddObserver("InteractionEvent", self._select_polygons) + if delayed: + self.widget.AddObserver("EndInteractionEvent", self._select_polygons) + else: + self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetSphere(self._implicit_func) diff --git a/vedo/core.py b/vedo/core.py index cf03d141..0ca4be93 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -796,7 +796,7 @@ def cells(self): arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) except AttributeError: # valid for polydata - arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) if arr1d.size == 0: arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) @@ -1625,8 +1625,15 @@ def tomesh(self, fill=True, shrink=1.0): ) return msh + class UGridAlgorithms(CommonAlgorithms): + def _update(self, data, reset_locators=False): + self.dataset = data + self.mapper.SetInputData(data) + self.mapper.Modified() + return self + def bounds(self): """ Get the object bounds. @@ -1717,7 +1724,6 @@ def tomesh(self, fill=True, shrink=1.0): poly = gf.GetOutput() msh = vedo.mesh.Mesh(poly).flat() - msh.scalarbar = self.scalarbar lut = utils.ctf2lut(self) if lut: msh.mapper.SetLookupTable(lut) @@ -1990,12 +1996,7 @@ def cut_with_mesh( clipper.SetValue(0.0) clipper.Update() - cout = clipper.GetOutput() - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return ug + out = vedo.UGrid(clipper.GetOutput()) + out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return out diff --git a/vedo/plotter.py b/vedo/plotter.py index 05e6d393..4d131d2c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -883,6 +883,11 @@ def remove(self, *objs, at=None): ids = [] for ob in set(objs): + + if isinstance(ob, vtk.vtkInteractorObserver): + ob.remove_from(self) # from cutters + continue + # remove it from internal list if possible if ob in list(self.objects): try: @@ -917,9 +922,9 @@ def remove(self, *objs, at=None): for sha in ob.trail.shadows: ren.RemoveActor(sha.actor) - # for i in ids: # wrong way of doing it + # for i in ids: # WRONG way of doing it! # del self.objects[i] - # instead: + # instead we do: self.objects = [ele for i, ele in enumerate(self.objects) if i not in ids] return self diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 90649b3b..94a31045 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -296,12 +296,6 @@ def _repr_html_(self): return "\n".join(allt) - def _update(self, data, reset_locators=False): - self.dataset = data - self.mapper.SetInputData(data) - self.mapper.Modified() - return self - def clone(self, mapper="tetra"): """Clone the `TetMesh` object to yield an exact copy.""" ug = vtk.vtkUnstructuredGrid() @@ -313,7 +307,6 @@ def clone(self, mapper="tetra"): cloned.actor.SetProperty(pr) cloned.mapper.SetScalarMode(self.mapper.GetScalarMode()) - # cloned.name = self.name cloned.pipeline = utils.OperationNode( "clone", c="#edabab", shape="diamond", parents=[self], diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 0d1096e7..79482212 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -10,9 +10,9 @@ import vedo from vedo import settings from vedo import utils -from vedo.core import VolumeAlgorithms +from vedo.core import UGridAlgorithms from vedo.file_io import download, loadUnStructuredGrid -from vedo.visual import MeshVisual +from vedo.visual import VolumeVisual __docformat__ = "google" @@ -24,7 +24,7 @@ __all__ = ["UGrid"] ######################################################################### -class UGrid(MeshVisual, VolumeAlgorithms): +class UGrid(VolumeVisual, UGridAlgorithms): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): @@ -48,10 +48,11 @@ def __init__(self, inputobj=None): super().__init__() self.dataset = None - self.actor = vtk.vtkActor() + self.actor = vtk.vtkVolume() self.property = self.actor.GetProperty() self.name = "UGrid" + self.filename = "" ################### inputtype = str(type(inputobj)) @@ -62,6 +63,7 @@ def __init__(self, inputobj=None): elif utils.is_sequence(inputobj): pts, cells, celltypes = inputobj + assert len(cells) == len(celltypes) self.dataset = vtk.vtkUnstructuredGrid() @@ -108,7 +110,7 @@ def __init__(self, inputobj=None): elif ct == vtk.VTK_PENTAGONAL_PRISM: cell = vtk.vtkPentagonalPrism() else: - print("UGrid: cell type", ct, "not implemented. Skip.") + print("UGrid: cell type", ct, "not supported. Skip.") continue cpids = cell.GetPointIds() for j, pid in enumerate(cell_conn): @@ -129,32 +131,11 @@ def __init__(self, inputobj=None): vedo.logger.error(f"cannot understand input type {inputtype}") return - # self.mapper = vtk.vtkDataSetMapper() - self.mapper = vtk.vtkPolyDataMapper() - self.mapper.SetInterpolateScalarsBeforeMapping(settings.interpolate_scalars_before_mapping) - - if settings.use_polygon_offset: - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - pof, pou = settings.polygon_offset_factor, settings.polygon_offset_units - self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) - self.property.SetInterpolationToFlat() - - if not self.dataset: - return - - # now fill the representation of the vtk unstr grid - # sf = vtk.vtkShrinkFilter() - # sf.SetInputData(self.dataset) - # sf.SetShrinkFactor(1.0) - # sf.Update() - # gf = vtk.vtkGeometryFilter() - # gf.SetInputData(sf.GetOutput()) - # gf.Update() - # self._polydata = gf.GetOutput() - - self.mapper.SetInputData(self.dataset) + self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() self.actor.SetMapper(self.mapper) + # self.mapper.SetInputData(self.dataset) ###NOT HERE! + self.pipeline = utils.OperationNode( self, comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#4cc9f0", @@ -236,12 +217,15 @@ def _repr_html_(self): def clone(self, deep=True): """Clone the UGrid object to yield an exact copy.""" ug = vtk.vtkUnstructuredGrid() - ug.DeepCopy(self.dataset) + if deep: + ug.DeepCopy(self.dataset) + else: + ug.ShallowCopy(self.dataset) cloned = UGrid(ug) - pr = vtk.vtkProperty() + pr = vtk.vtkVolumeProperty() pr.DeepCopy(self.property) - cloned.dataset.SetProperty(pr) + cloned.actor.SetProperty(pr) cloned.property = pr cloned.pipeline = utils.OperationNode( diff --git a/vedo/utils.py b/vedo/utils.py index 9608b6b5..6b78efca 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1449,15 +1449,15 @@ def _print_data(poly, c): if ptdata.GetScalars(): vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(ptdata.GetScalars().GetName(), "(pointdata) ", c=c, bold=False) + vedo.printc(f'"{ptdata.GetScalars().GetName()}"', "(pointdata) ", c=c, bold=False) if ptdata.GetVectors(): vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(ptdata.GetVectors().GetName(), "(pointdata) ", c=c, bold=False) + vedo.printc(f'"{ptdata.GetVectors().GetName()}"', "(pointdata) ", c=c, bold=False) if ptdata.GetTensors(): vedo.printc("active tensors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(ptdata.GetTensors().GetName(), "(pointdata) ", c=c, bold=False) + vedo.printc(f'"{ptdata.GetTensors().GetName()}"', "(pointdata) ", c=c, bold=False) # same for cells for i in range(cldata.GetNumberOfArrays()): @@ -1479,11 +1479,11 @@ def _print_data(poly, c): if cldata.GetScalars(): vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(cldata.GetScalars().GetName(), "(celldata)", c=c, bold=False) + vedo.printc(f'"{cldata.GetScalars().GetName()}"', "(celldata)", c=c, bold=False) if cldata.GetVectors(): vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(cldata.GetVectors().GetName(), "(celldata)", c=c, bold=False) + vedo.printc(f'"{cldata.GetVectors().GetName()}"', "(celldata)", c=c, bold=False) for i in range(fldata.GetNumberOfArrays()): name = fldata.GetArrayName(i) @@ -1544,12 +1544,12 @@ def _print_vtkactor(obj): vedo.printc("back color".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(f"{cname}, rgb={precision(bcol,3)}", c="g", bold=False) - vedo.printc("points".ljust(14) + ":", npt, c="g", bold=True) + vedo.printc("points".ljust(14) + ":", f"{npt:,}", c="g", bold=True) # ncl = poly.GetNumberOfCells() - # vedo.printc("cells".ljust(14)+":", ncl, c="g", bold=True) - vedo.printc("polygons".ljust(14) + ":", npl, c="g", bold=True) + # vedo.printc("cells".ljust(14)+":", f"{ncl:,}", c="g", bold=True) + vedo.printc("polygons".ljust(14) + ":", f"{npl:,}", c="g", bold=True) if nln: - vedo.printc("lines".ljust(14) + ":", nln, c="g", bold=True) + vedo.printc("lines".ljust(14) + ":", f"{nln:,}", c="g", bold=True) vedo.printc("position".ljust(14) + ":", pos, c="g", bold=True) if hasattr(actor, "GetScale"): @@ -1567,12 +1567,12 @@ def _print_vtkactor(obj): vedo.printc("diagonal size".ljust(14) + ":", c="g", bold=True, end=" ") vedo.printc(precision(obj.diagonal_size(), 6), c="g", bold=False) - vedo.printc("bounds".ljust(14) + ":", c="g", bold=True, end=" ") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) + vedo.printc("bounds".ljust(14) + ":", c="g", bold=True, end=" ") + vedo.printc( "x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") + vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) _print_data(poly, "g") diff --git a/vedo/visual.py b/vedo/visual.py index 5d0dc524..d74d0b6f 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -43,16 +43,6 @@ def __init__(self): self.shadows = [] - # @property - # def LUT(self): - # """Return the lookup table of the object as a vtk object.""" - # return self.mapper.GetLookupTable() - - # @LUT.setter - # def LUT(self, lut): - # """Set the lookup table of the object from a vtk object.""" - # self.mapper.SetLookupTable(lut) - @property def LUT(self): From b9a044dabf863daa68203a82c1a7ff8bb5c68e8d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 17 Oct 2023 22:06:42 +0200 Subject: [PATCH 097/251] fix examples/basic/cut_interactive.py --- examples/basic/cut_interactive.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/basic/cut_interactive.py b/examples/basic/cut_interactive.py index c8e43346..7853b9e9 100644 --- a/examples/basic/cut_interactive.py +++ b/examples/basic/cut_interactive.py @@ -8,19 +8,23 @@ # settings.enable_default_keyboard_callbacks = False # settings.enable_default_mouse_callbacks = False -msh = Mesh(dataurl+'mouse_brain.stl').backcolor("purple8") +msh = Mesh(dataurl+'mouse_brain.stl').subdivide() +msh.backcolor("purple8").print() +# Create the plotter with the mesh, do not block the execution plt = Plotter(bg='blackboard', interactive=False) plt.show(msh, __doc__, viewup='z') +# Create the cutter object cutter = PlaneCutter(msh) # cutter = BoxCutter(msh) # cutter = SphereCutter(msh) -plt.add(cutter) -plt.interactive() +# Add the cutter to the renderer and show +plt.add(cutter).interactive() -plt.remove(cutter) -plt.interactive() +# Remove the cutter from the renderer and show +plt.remove(cutter).interactive() +# close the plotter plt.close() From 025275370faa82f54cc5069dfc41c27a722b5de1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 11:05:41 +0200 Subject: [PATCH 098/251] add princ(link) --- vedo/colors.py | 9 +++++++++ vedo/version.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/vedo/colors.py b/vedo/colors.py index 6cc89dbc..4dd967a6 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -1094,6 +1094,7 @@ def printc( dim=False, invert=False, box="", + link="", end="\n", flush=True, return_string=False, @@ -1122,6 +1123,9 @@ def printc( invert background and forward colors [False] box : (bool) print a box with specified text character [''] + link : (str) + print a clickable url link (works on Linux) + (must press Ctrl+click to open the link) flush : (bool) flush buffer after printing [True] return_string : (bool) @@ -1240,6 +1244,11 @@ def printc( else: out = special + cseq + txt + reset + + if link: + # embed a link in the terminal + out = f"\x1b]8;;{link}\x1b\\{out}\x1b]8;;\x1b\\" + if return_string: return out + end else: diff --git a/vedo/version.py b/vedo/version.py index c5aceb39..bfa8b689 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev12a' +_version = '2023.5.0+dev14a' From dbacbe9d6f6acbbef00220cc212bde58686adf17 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 11:30:27 +0200 Subject: [PATCH 099/251] fix embed_matplotlib.py --- docs/changes.md | 8 +++++--- examples/pyplot/custom_axes1.py | 26 +++++++++++++------------- examples/pyplot/embed_matplotlib.py | 5 +++-- vedo/addons.py | 21 +++++++++++++-------- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 10309449..0d2b6b32 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -52,7 +52,6 @@ examples/volumetric/slicer1.py ``` ~/Projects/vedo/examples/basic background_image.py -cut_interactive.py glyphs2.py @@ -61,9 +60,7 @@ warp4.py ~/Projects/vedo/examples/pyplot -custom_axes1.py caption.py -embed_matplotlib.py goniometer.py histo_2d_b.py histo_hexagonal.py @@ -86,6 +83,11 @@ ellipt_fourier_desc.py export_numpy.py flag_labels1.py +property -> properties +dolfin +notebook +backends +release on master as branch? ``` diff --git a/examples/pyplot/custom_axes1.py b/examples/pyplot/custom_axes1.py index 2fe5d5aa..1167a783 100644 --- a/examples/pyplot/custom_axes1.py +++ b/examples/pyplot/custom_axes1.py @@ -20,29 +20,29 @@ ytitle='This is my highly\ncustomized y-axis', ztitle='z in units of Å', # many unicode chars are supported (type: vedo -r fonts) y_values_and_labels=[(-3.2,'Mark^a_-3.2'), (-1.2,'Carmen^b_-1.2'), (3,'John^c_3')], - text_scale=1.3, # make all text 30% bigger - number_of_divisions=5, # approximate number of divisions on longest axis + text_scale=1.3, # make all text 30% bigger + number_of_divisions=5, # approximate number of divisions on longest axis axes_linewidth= 2, grid_linewidth= 1, - zxgrid2=True, # show zx plane on opposite side of the bounding box - yzgrid2=True, # show yz plane on opposite side of the bounding box + zxgrid2=True, # show zx plane on opposite side of the bounding box + yzgrid2=True, # show yz plane on opposite side of the bounding box xyplane_color='green7', - xygrid_color='dg', # darkgreen line color - xyalpha=0.2, # grid opacity - xtitle_position=0.5, # title fractional positions along axis + xygrid_color='green3', # darkgreen line color + xyalpha=0.2, # grid opacity + xtitle_position=0.5, # title fractional positions along axis xtitle_justify="top-center", # align title wrt to its axis ytitle_size=0.02, ytitle_box=True, ytitle_offset=0.05, ylabel_offset=0.4, - yhighlight_zero=True, # draw a line highlighting zero position if in range + yhighlight_zero=True, # draw a line highlighting zero position if in range yhighlight_zero_color='red', - zline_color='blue', - ztitle_color='blue', - ztitle_backface_color='v', # violet color of axis title backface + zline_color='blue5', + ztitle_color='blue5', + ztitle_backface_color='v',# violet color of axis title backface label_font="Quikhand", - ylabel_size=0.025, # size of the numeric labels along Y axis - ylabel_color='dg', # color of the numeric labels along Y axis + ylabel_size=0.025, # size of the numeric labels along Y axis + ylabel_color='green4', # color of the numeric labels along Y axis ) show(world, pts, spl, lns, __doc__+settings.default_font, axes=axes_opts).close() diff --git a/examples/pyplot/embed_matplotlib.py b/examples/pyplot/embed_matplotlib.py index 02ee0b57..4ff19e05 100644 --- a/examples/pyplot/embed_matplotlib.py +++ b/examples/pyplot/embed_matplotlib.py @@ -1,9 +1,10 @@ """Include background images in the rendering scene (e.g. generated by matplotlib)""" import matplotlib.pyplot as plt -from vedo import dataurl, show, Mesh, Picture2D +from vedo import * -msh = Mesh(dataurl+"limb_ugrid.vtk").shrink(0.8) +tmsh = TetMesh(dataurl+"limb_ugrid.vtk") +msh = tmsh.tomesh().shrink(0.8) # Create a histogram with matplotlib fig = plt.figure() diff --git a/vedo/addons.py b/vedo/addons.py index 47f06e35..2cc5d757 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2879,6 +2879,7 @@ def Axes( - `xygrid`, [True], show a gridded wall on plane xy - `yzgrid`, [True], show a gridded wall on plane yz - `zxgrid`, [True], show a gridded wall on plane zx + - `yzgrid2`, [False], show yz plane on opposite side of the bounding box - `zxgrid2`, [False], show zx plane on opposite side of the bounding box - `xygrid_transparent` [False], make grid plane completely transparent - `xygrid2_transparent` [False], make grid plane completely transparent on opposite side box @@ -3190,28 +3191,32 @@ def Axes( if yzgrid2 and ytitle and ztitle: if not yzgrid2_transparent: - gyz2 = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2.alpha(yzalpha).c(yzplane_color).lw(0).rotate_y(-90) + gyz2 = shapes.Grid(s=(zticks_float, yticks_float)) + gyz2.rotate_y(-90).x(dx) + gyz2.alpha(yzalpha).c(yzplane_color).lw(0) if tol: gyz2.shift(tol*gscale,0,0) gyz2.name = "yzGrid2" grids.append(gyz2) if grid_linewidth: - gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) - gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).rotate_y(-90) + gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)) + gyz2_lines.rotate_y(-90).x(dx) + gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha) if tol: gyz2_lines.shift(tol*gscale,0,0) gyz2_lines.name = "yzGrid2Lines" grids.append(gyz2_lines) if zxgrid2 and ztitle and xtitle: if not zxgrid2_transparent: - gzx2 = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2.alpha(zxalpha).c(zxplane_color).lw(0).rotate_x(90) + gzx2 = shapes.Grid(s=(xticks_float, zticks_float)) + gzx2.rotate_x(90).y(dy) + gzx2.alpha(zxalpha).c(zxplane_color).lw(0) if tol: gzx2.shift(0,tol*gscale,0) gzx2.name = "zxGrid2" grids.append(gzx2) if grid_linewidth: - gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) - gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).rotate_x(90) + gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)) + gzx2_lines.rotate_x(90).y(dy) + gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha) if tol: gzx2_lines.shift(0,tol*gscale,0) gzx2_lines.name = "zxGrid2Lines" grids.append(gzx2_lines) From 20d6b78761ac4aacf4568a6f7ca78b328f8c6e72 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 12:20:52 +0200 Subject: [PATCH 100/251] property to properties --- vedo/addons.py | 20 +++---- vedo/applications.py | 34 +++++------ vedo/assembly.py | 2 +- vedo/backends.py | 4 +- vedo/core.py | 8 +-- vedo/file_io.py | 14 ++--- vedo/mesh.py | 18 +++--- vedo/picture.py | 2 +- vedo/plotter.py | 82 ++++++++++++------------- vedo/pointcloud.py | 32 +++++----- vedo/pyplot.py | 16 ++--- vedo/shapes.py | 106 ++++++++++++++++---------------- vedo/tetmesh.py | 6 +- vedo/ugrid.py | 6 +- vedo/utils.py | 8 +-- vedo/visual.py | 140 +++++++++++++++++++++---------------------- vedo/volume.py | 14 ++--- 17 files changed, 256 insertions(+), 256 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 2cc5d757..b8fadc2f 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -261,7 +261,7 @@ def __init__( self.name = "LegendBox" self.entries = entries[:nmax] - self.property = self.GetEntryTextProperty() + self.properties = self.GetEntryTextProperty() n = 0 texts = [] @@ -284,11 +284,11 @@ def __init__( self.PickableOff() self.SetPadding(padding) - self.property.ShadowOff() - self.property.BoldOff() + self.properties.ShadowOff() + self.properties.BoldOff() - # self.property.SetJustificationToLeft() # no effect - # self.property.SetVerticalJustificationToTop() + # self.properties.SetJustificationToLeft() # no effect + # self.properties.SetVerticalJustificationToTop() if not font: font = settings.default_font @@ -302,7 +302,7 @@ def __init__( continue e = entries[i] if c is None: - col = e.property.GetColor() + col = e.properties.GetColor() if col == (1, 1, 1): col = (0.2, 0.2, 0.2) else: @@ -1271,7 +1271,7 @@ def ScalarBar3D( for m in tacts+scales: m.shift(pos) - m.property.LightingOff() + m.properties.LightingOff() asse = Assembly(scales + tacts) @@ -2408,8 +2408,8 @@ def Ruler3D( macts = merge(lb, lc1, lc2, c1, c2, ml1, ml2) macts.c(c).alpha(alpha) - macts.property.SetLineWidth(lw) - macts.property.LightingOff() + macts.properties.SetLineWidth(lw) + macts.properties.LightingOff() macts.actor.UseBoundsOff() macts.base = q1 macts.top = q2 @@ -3946,7 +3946,7 @@ def Axes( for a in acts: a.shift(orig) a.actor.PickableOff() - a.property.LightingOff() + a.properties.LightingOff() asse = Assembly(acts) asse.PickableOff() asse.name = "Axes" diff --git a/vedo/applications.py b/vedo/applications.py index 7f04cf27..02deb710 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -451,14 +451,14 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): self.volume = vol self.volume.actor = vtk.vtkImageSlice() - self.volume.property = self.volume.actor.GetProperty() + self.volume.properties = self.volume.actor.GetProperty() self.volume.mapper = vtk.vtkImageResliceMapper() self.volume.mapper.SliceFacesCameraOn() self.volume.mapper.SliceAtFocalPointOn() self.volume.mapper.SetAutoAdjustImageQuality(False) self.volume.mapper.BorderOff() - self.volume.property.SetInterpolationTypeToLinear() + self.volume.properties.SetInterpolationTypeToLinear() self.volume.mapper.SetInputData(self.volume.dataset) self.volume.actor.SetMapper(self.volume.mapper) @@ -537,17 +537,17 @@ def cmap(self, lut=None, fix_scalar_range=False): Use "bw" for automatic black and white. """ if lut is None and self.lut: - self.volume.property.SetLookupTable(self.lut) + self.volume.properties.SetLookupTable(self.lut) elif isinstance(lut, vtk.vtkLookupTable): - self.volume.property.SetLookupTable(lut) + self.volume.properties.SetLookupTable(lut) elif lut == "bw": - self.volume.property.SetLookupTable(None) - self.volume.property.SetUseLookupTableScalarRange(fix_scalar_range) + self.volume.properties.SetLookupTable(None) + self.volume.properties.SetUseLookupTableScalarRange(fix_scalar_range) return self def alpha(self, value): """Set opacity to the slice""" - self.volume.property.SetOpacity(value) + self.volume.properties.SetOpacity(value) return self def auto_adjust_quality(self, value=True): @@ -603,10 +603,10 @@ def fill_background(self, value=True): def lighting(self, window, level, ambient=1.0, diffuse=0.0): """Assign the values for window and color level.""" - self.volume.property.SetColorWindow(window) - self.volume.property.SetColorLevel(level) - self.volume.property.SetAmbient(ambient) - self.volume.property.SetDiffuse(diffuse) + self.volume.properties.SetColorWindow(window) + self.volume.properties.SetColorLevel(level) + self.volume.properties.SetAmbient(ambient) + self.volume.properties.SetDiffuse(diffuse) return self @@ -635,7 +635,7 @@ def __init__(self, volume, **kwargs): self.alphaslider1 = 0.66 self.alphaslider2 = 1 - self.property = volume.property + self.properties = volume.properties img = volume.dataset if volume.dimensions()[2] < 3: @@ -690,7 +690,7 @@ def sliderColorMap(widget, event): ############################## alpha sliders # Create transfer mapping scalar value to opacity - opacityTransferFunction = self.property.GetScalarOpacity() + opacityTransferFunction = self.properties.GetScalarOpacity() def setOTF(): opacityTransferFunction.RemoveAllPoints() @@ -843,7 +843,7 @@ def __init__( ) ### GPU ################################ - if use_gpu and hasattr(volume.property, "GetIsoSurfaceValues"): + if use_gpu and hasattr(volume.properties, "GetIsoSurfaceValues"): scrange = volume.scalar_range() delta = scrange[1] - scrange[0] @@ -858,7 +858,7 @@ def slider_isovalue(widget, event): value = widget.GetRepresentation().GetValue() isovals.SetValue(0, value) - isovals = volume.property.GetIsoSurfaceValues() + isovals = volume.properties.GetIsoSurfaceValues() isovals.SetValue(0, isovalue) self.add(volume.mode(5).alpha(alpha).cmap(c)) @@ -1705,7 +1705,7 @@ def change_lighting(self, style, acts=None, t=None, duration=None): for tt in rng: inputvalues = [] for a in acts: - pr = a.property + pr = a.properties aa = pr.GetAmbient() ad = pr.GetDiffuse() asp = pr.GetSpecular() @@ -1718,7 +1718,7 @@ def change_lighting(self, style, acts=None, t=None, duration=None): self.events.append((tt, self.change_lighting, acts, inputvalues)) else: for i, a in enumerate(self._performers): - pr = a.property + pr = a.properties vals = self._inputvalues[i] pr.SetAmbient(vals[0]) pr.SetDiffuse(vals[1]) diff --git a/vedo/assembly.py b/vedo/assembly.py index f771b7aa..514d8fc7 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -75,7 +75,7 @@ def procrustes_alignment(sources, rigid=False): poly = procrustes.GetOutput().GetBlock(i) mesh = vedo.mesh.Mesh(poly) mesh.actor.SetProperty(s.actor.GetProperty()) - mesh.property = s.actor.GetProperty() + mesh.properties = s.actor.GetProperty() if hasattr(s, "name"): mesh.name = s.name acts.append(mesh) diff --git a/vedo/backends.py b/vedo/backends.py index e0f9f94a..cd946d03 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -223,8 +223,8 @@ def start_k3d(actors2show): position=pos, color=_rgb2int(vedo.get_color(ia.c())), is_html=True, - size=ia.property.GetFontSize() / 22.5 * 1.5, - label_box=bool(ia.property.GetFrame()), + size=ia.properties.GetFontSize() / 22.5 * 1.5, + label_box=bool(ia.properties.GetFrame()), # reference_point='bl', ) vedo.notebook_plotter += kobj diff --git a/vedo/core.py b/vedo/core.py index 0ca4be93..5c42b5ba 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -425,9 +425,9 @@ def box(self, scale=1, padding=0, fill=False): ) try: pr = vtk.vtkProperty() - pr.DeepCopy(self.property) + pr.DeepCopy(self.properties) bx.SetProperty(pr) - bx.property = pr + bx.properties = pr except (AttributeError, TypeError): pass bx.wireframe(not fill) @@ -1755,9 +1755,9 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): ug = vedo.ugrid.UGrid(es.GetOutput()) pr = vtk.vtkProperty() - pr.DeepCopy(self.property) + pr.DeepCopy(self.properties) ug.SetProperty(pr) - ug.property = pr + ug.properties = pr ug.mapper.SetLookupTable(utils.ctf2lut(self)) ug.pipeline = utils.OperationNode( diff --git a/vedo/file_io.py b/vedo/file_io.py index fe30d1aa..6ff788af 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -891,7 +891,7 @@ def _fillmesh(obj, adict): adict["LUT"] = lutvals adict["LUT_range"] = lut.GetRange() - prp = obj.property + prp = obj.properties adict["alpha"] = prp.GetOpacity() adict["representation"] = prp.GetRepresentation() adict["pointsize"] = prp.GetPointSize() @@ -945,7 +945,7 @@ def _fillmesh(obj, adict): adict["mode"] = obj.mode() # adict['jittering'] = obj.mapper.GetUseJittering() - prp = obj.property + prp = obj.properties ctf = prp.GetRGBTransferFunction() otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() @@ -973,12 +973,12 @@ def _fillmesh(obj, adict): adict["rendered_at"] = obj.rendered_at adict["text"] = obj.text() adict["position"] = obj.GetPosition() - adict["color"] = obj.property.GetColor() + adict["color"] = obj.properties.GetColor() adict["font"] = obj.fontname - adict["size"] = obj.property.GetFontSize() / 22.5 - adict["bgcol"] = obj.property.GetBackgroundColor() - adict["alpha"] = obj.property.GetBackgroundOpacity() - adict["frame"] = obj.property.GetFrame() + adict["size"] = obj.properties.GetFontSize() / 22.5 + adict["bgcol"] = obj.properties.GetBackgroundColor() + adict["alpha"] = obj.properties.GetBackgroundOpacity() + adict["frame"] = obj.properties.GetFrame() # print('tonumpy(): vedo.Text2D', obj.text()[:10], obj.font(), obj.GetPosition()) else: diff --git a/vedo/mesh.py b/vedo/mesh.py index f6f97840..a1acd954 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -65,7 +65,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) - self.property = pr + self.properties = pr elif isinstance(inputobj, vtk.vtkPolyData): # self.dataset.DeepCopy(inputobj) # NO @@ -133,11 +133,11 @@ def __init__(self, inputobj=None, c="gold", alpha=1): self.mapper.SetInputData(self.dataset) self.actor.SetMapper(self.mapper) - self.property.SetInterpolationToPhong() - self.property.SetColor(get_color(c)) + self.properties.SetInterpolationToPhong() + self.properties.SetColor(get_color(c)) if alpha is not None: - self.property.SetOpacity(alpha) + self.properties.SetOpacity(alpha) self.mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping @@ -490,7 +490,7 @@ def texture( tu.SetRepeat(repeat) tu.SetEdgeClamp(edge_clamp) - self.property.SetColor(1, 1, 1) + self.properties.SetColor(1, 1, 1) self.mapper.ScalarVisibilityOff() self.actor.SetTexture(tu) @@ -978,8 +978,8 @@ def join_segments(self, closed=True, tol=1e-03): if len(joinedpts) > 1: newline = vedo.shapes.Line(joinedpts, closed=closed) newline.clean() - newline.actor.SetProperty(self.property) - newline.property = self.property + newline.actor.SetProperty(self.properties) + newline.properties = self.properties newline.pipeline = OperationNode( "join_segments", parents=[self], @@ -2142,7 +2142,7 @@ def intersect_with(self, mesh2, tol=1e-06): bf.SetInputData(1, mesh2.dataset) bf.Update() msh = Mesh(bf.GetOutput(), c="k", alpha=1).lighting("off") - msh.property.SetLineWidth(3) + msh.properties.SetLineWidth(3) msh.name = "SurfaceIntersection" msh.pipeline = OperationNode( "intersect_with", parents=[self, mesh2], comment=f"#pts {msh.npoints}" @@ -2265,7 +2265,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): msh.metadata["ContactCells2"] = vtk2numpy( ipdf.GetOutput(1).GetFieldData().GetArray("ContactCells") ) - msh.property.SetLineWidth(3) + msh.properties.SetLineWidth(3) msh.name = "SurfaceCollision" msh.pipeline = OperationNode( diff --git a/vedo/picture.py b/vedo/picture.py index 0e8b128a..04442f2e 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -265,7 +265,7 @@ def __init__(self, obj=None, channels=3): self.actor = vtk.vtkImageActor() self.actor.data = self # so it can be picked - self.property = self.actor.GetProperty() + self.properties = self.actor.GetProperty() if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, False) diff --git a/vedo/plotter.py b/vedo/plotter.py index 4d131d2c..c6b9c8e0 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2171,7 +2171,7 @@ def _legfunc(evt): # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): - actcol = evt.object.property.GetColor() + actcol = evt.object.properties.GetColor() if hoverlegend.mapper.GetTextProperty().GetBackgroundColor() != actcol: hoverlegend.mapper.GetTextProperty().SetBackgroundColor(actcol) @@ -3550,68 +3550,68 @@ def _keypress(self, iren, event): elif key == "Down": if self.clicked_object in self.get_meshes(): self.clicked_object.alpha(0.02) - if hasattr(self.clicked_object, "property_backface"): + if hasattr(self.clicked_object, "properties_backface"): bfp = self.clicked_actor.GetBackfaceProperty() - self.clicked_object.property_backface = bfp # save it + self.clicked_object.properties_backface = bfp # save it self.clicked_actor.SetBackfaceProperty(None) else: for obj in self.get_meshes(): obj.alpha(0.02) bfp = obj.actor.GetBackfaceProperty() - if bfp and hasattr(obj, "property_backface"): - obj.property_backface = bfp + if bfp and hasattr(obj, "properties_backface"): + obj.properties_backface = bfp obj.actor.SetBackfaceProperty(None) elif key == "Left": if self.clicked_object in self.get_meshes(): - ap = self.clicked_object.property + ap = self.clicked_object.properties aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = self.clicked_actor.GetBackfaceProperty() - if bfp and hasattr(self.clicked_object, "property_backface"): - self.clicked_object.property_backface = bfp + if bfp and hasattr(self.clicked_object, "properties_backface"): + self.clicked_object.properties_backface = bfp self.clicked_actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): - ap = a.property + ap = a.properties aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = a.actor.GetBackfaceProperty() - if bfp and hasattr(a, "property_backface"): - a.property_backface = bfp + if bfp and hasattr(a, "properties_backface"): + a.properties_backface = bfp a.actor.SetBackfaceProperty(None) elif key == "Right": if self.clicked_object in self.get_meshes(): - ap = self.clicked_object.property + ap = self.clicked_object.properties aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if ( aal == 1 - and hasattr(self.clicked_object, "property_backface") - and self.clicked_object.property_backface + and hasattr(self.clicked_object, "properties_backface") + and self.clicked_object.properties_backface ): # put back self.clicked_actor.SetBackfaceProperty( - self.clicked_object.property_backface) + self.clicked_object.properties_backface) else: for a in self.get_meshes(): - ap = a.property + ap = a.properties aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) - if aal == 1 and hasattr(a, "property_backface") and a.property_backface: - a.actor.SetBackfaceProperty(a.property_backface) + if aal == 1 and hasattr(a, "properties_backface") and a.properties_backface: + a.actor.SetBackfaceProperty(a.properties_backface) elif key == "Up": if self.clicked_object in self.get_meshes(): - self.clicked_object.property.SetOpacity(1) - if hasattr(self.clicked_object, "property_backface") and self.clicked_object.property_backface: - self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.property_backface) + self.clicked_object.properties.SetOpacity(1) + if hasattr(self.clicked_object, "properties_backface") and self.clicked_object.properties_backface: + self.clicked_object.actor.SetBackfaceProperty(self.clicked_object.properties_backface) else: for a in self.get_meshes(): - a.property.SetOpacity(1) - if hasattr(a, "property_backface") and a.property_backface: - a.actor.SetBackfaceProperty(a.property_backface) + a.properties.SetOpacity(1) + if hasattr(a, "properties_backface") and a.properties_backface: + a.actor.SetBackfaceProperty(a.properties_backface) elif key == "P": if self.clicked_object in self.get_meshes(): @@ -3620,10 +3620,10 @@ def _keypress(self, iren, event): objs = self.get_meshes() for ia in objs: try: - ps = ia.property.GetPointSize() + ps = ia.properties.GetPointSize() if ps > 1: - ia.property.SetPointSize(ps - 1) - ia.property.SetRepresentationToPoints() + ia.properties.SetPointSize(ps - 1) + ia.properties.SetRepresentationToPoints() except AttributeError: pass @@ -3634,9 +3634,9 @@ def _keypress(self, iren, event): objs = self.get_meshes() for ia in objs: try: - ps = ia.property.GetPointSize() - ia.property.SetPointSize(ps + 2) - ia.property.SetRepresentationToPoints() + ps = ia.properties.GetPointSize() + ia.properties.SetPointSize(ps + 2) + ia.properties.SetRepresentationToPoints() except AttributeError: pass @@ -3803,13 +3803,13 @@ def _keypress(self, iren, event): elif key == "w": if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.property.SetRepresentationToWireframe() + self.clicked_object.properties.SetRepresentationToWireframe() else: for a in self.get_meshes(): - if a.property.GetRepresentation() == 1: # toggle - a.property.SetRepresentationToSurface() + if a.properties.GetRepresentation() == 1: # toggle + a.properties.SetRepresentationToSurface() else: - a.property.SetRepresentationToWireframe() + a.properties.SetRepresentationToWireframe() elif key == "1": self._icol += 1 @@ -4034,10 +4034,10 @@ def _keypress(self, iren, event): objs = self.get_meshes() for ia in objs: try: - ev = ia.property.GetEdgeVisibility() - ia.property.SetEdgeVisibility(not ev) - ia.property.SetRepresentationToSurface() - ia.property.SetLineWidth(0.1) + ev = ia.properties.GetEdgeVisibility() + ia.properties.SetEdgeVisibility(not ev) + ia.properties.SetRepresentationToSurface() + ia.properties.SetLineWidth(0.1) except AttributeError: pass @@ -4063,11 +4063,11 @@ def _keypress(self, iren, event): for ia in objs: if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) - intrp = ia.property.GetInterpolation() + intrp = ia.properties.GetInterpolation() if intrp > 0: - ia.property.SetInterpolation(0) # flat + ia.properties.SetInterpolation(0) # flat else: - ia.property.SetInterpolation(2) # phong + ia.properties.SetInterpolation(2) # phong elif key == "n": # show normals to an actor if self.clicked_object in self.get_meshes(): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 92b8f4a7..d530ee9d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -436,7 +436,7 @@ def pca_ellipsoid(points, pvalue=0.673): vtra.SetMatrix(M) elli = vedo.shapes.Ellipsoid((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) - elli.property.LightingOff() + elli.properties.LightingOff() elli.apply_transform(vtra) elli.pvalue = pvalue @@ -538,8 +538,8 @@ def fibonacci_sphere(n): self.pipeline = None self.actor = vtk.vtkActor() - self.property = self.actor.GetProperty() - self.property_backface = self.actor.GetBackfaceProperty() + self.properties = self.actor.GetProperty() + self.properties_backface = self.actor.GetBackfaceProperty() self.mapper = vtk.vtkPolyDataMapper() self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() @@ -562,7 +562,7 @@ def fibonacci_sphere(n): pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.actor.SetProperty(pr) - self.property = pr + self.properties = pr self.mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) elif isinstance(inputobj, vtk.vtkPolyData): @@ -601,13 +601,13 @@ def fibonacci_sphere(n): self.actor.SetMapper(self.mapper) self.mapper.SetInputData(self.dataset) - self.property.SetColor(colors.get_color(c)) - self.property.SetOpacity(alpha) - self.property.SetRepresentationToPoints() - self.property.SetPointSize(r) - self.property.LightingOff() + self.properties.SetColor(colors.get_color(c)) + self.properties.SetOpacity(alpha) + self.properties.SetRepresentationToPoints() + self.properties.SetPointSize(r) + self.properties.LightingOff() try: - self.property.RenderPointsAsSpheresOn() + self.properties.RenderPointsAsSpheresOn() except AttributeError: pass @@ -971,8 +971,8 @@ def subsample(self, fraction, absolute=False): cpd.Update() ps = 2 - if self.property.GetRepresentation() == 0: - ps = self.property.GetPointSize() + if self.properties.GetRepresentation() == 0: + ps = self.properties.GetPointSize() self._update(cpd.GetOutput()) self.ps(ps) @@ -2278,9 +2278,9 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): cutoff = vedo.Mesh(kpoly) else: cutoff = vedo.Points(kpoly) - cutoff.property = vtk.vtkProperty() - cutoff.property.DeepCopy(self.property) - cutoff.actor.SetProperty(cutoff.property) + cutoff.properties = vtk.vtkProperty() + cutoff.properties.DeepCopy(self.properties) + cutoff.actor.SetProperty(cutoff.properties) cutoff.c("k5").alpha(0.2) return vedo.Assembly([self, cutoff]) @@ -2965,7 +2965,7 @@ def _read_points(): raise RuntimeError() dens.Update() pts = utils.vtk2numpy(dens.GetOutput().GetPoints().GetData()) - cld = Points(pts, c=None).point_size(self.property.GetPointSize()) + cld = Points(pts, c=None).point_size(self.properties.GetPointSize()) cld.interpolate_data_from(self, n=nclosest, radius=radius) cld.name = "DensifiedCloud" diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 45a9155f..eb97edc8 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -66,8 +66,8 @@ def _to2d(obj, offset, scale): act2d.GetProperty().SetColor(obj.color()) act2d.GetProperty().SetOpacity(obj.alpha()) - act2d.GetProperty().SetLineWidth(obj.property.GetLineWidth()) - act2d.GetProperty().SetPointSize(obj.property.GetPointSize()) + act2d.GetProperty().SetLineWidth(obj.properties.GetLineWidth()) + act2d.GetProperty().SetPointSize(obj.properties.GetPointSize()) act2d.PickableOff() @@ -396,13 +396,13 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): if isinstance(a, (shapes.Arrow, shapes.Arrow2D)): # discard input Arrow and substitute it with a brand new one # (because scaling would fatally distort the shape) - prop = a.property + prop = a.properties prop.LightingOff() py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py b = shapes.Arrow2D(a.base, a.top, s=a.s, fill=a.fill).z(a.z()) b.actor.SetProperty(prop) - b.property = prop + b.properties = prop b.y(py * self.yscale) a = b @@ -414,7 +414,7 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): # rx2,ry2,rz2 = a.corner2 # ry2 = (ry2-py) * self.yscale + py # b = shapes.Rectangle([rx1,0,rz1], [rx2,ry2,rz2], radius=a.radius).z(a.z()) - # b.SetProperty(a.property) + # b.SetProperty(a.properties) # b.y(py / self.yscale) # a = b @@ -735,7 +735,7 @@ def as2d(self, pos="bottom-left", scale=1, padding=0.05): continue if a.npoints == 0: continue - if a.property.GetRepresentation() == 1: + if a.properties.GetRepresentation() == 1: # wireframe is not rendered correctly in 2d continue a2d = _to2d(a, offset, scale * 550 / (x1 - x0)) @@ -2789,7 +2789,7 @@ def _plot_fxy( zm = (bb[4] + bb[5]) / 2 nans = np.array(nans) + [0, 0, zm] nansact = shapes.Points(nans, r=2, c="red5", alpha=alpha) - nansact.property.RenderPointsAsSpheresOff() + nansact.properties.RenderPointsAsSpheresOff() acts.append(nansact) if isinstance(axes, dict): @@ -3634,7 +3634,7 @@ def whisker(data, s=0.25, c="k", lw=2, bc="blue", alpha=0.25, r=5, jitter=True, pts = shapes.Points(np.array([xvals, data]).T, c=c, r=r) rec = shapes.Rectangle([-s / 2, dq25], [s / 2, dq75], c=bc, alpha=alpha) - rec.property.LightingOff() + rec.properties.LightingOff() rl = shapes.Line([[-s / 2, dq25], [s / 2, dq25], [s / 2, dq75], [-s / 2, dq75]], closed=True) l1 = shapes.Line([0, dq05, 0], [0, dq25, 0], c=c, lw=lw) l2 = shapes.Line([0, dq75, 0], [0, dq95, 0], c=c, lw=lw) diff --git a/vedo/shapes.py b/vedo/shapes.py index a9001c29..c8ea14d9 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -478,7 +478,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): super().__init__(poly, c, alpha) self.lw(lw) - self.property.LightingOff() + self.properties.LightingOff() self.actor.PickableOff() self.actor.DragableOff() self.base = base @@ -502,7 +502,7 @@ def clone(self, deep=True): base = self.base top = self.top prop = vtk.vtkProperty() - prop.DeepCopy(self.property) + prop.DeepCopy(self.properties) ln = Line(self) ln.transform = self.transform @@ -939,7 +939,7 @@ def _getpts(pts, revd=False): vct.Update() super().__init__(vct.GetOutput(), c, alpha) self.flat() - self.property.LightingOff() + self.properties.LightingOff() self.name = "RoundedLine" self.base = ptsnew[0] self.top = ptsnew[-1] @@ -1027,8 +1027,8 @@ def __init__( super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: - self.property.SetLineStipplePattern(0xF0F0) - self.property.SetLineStippleRepeatFactor(1) + self.properties.SetLineStipplePattern(0xF0F0) + self.properties.SetLineStippleRepeatFactor(1) self.name = "Lines" @@ -1343,10 +1343,10 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): self.actor.PickableOff() prop = vtk.vtkProperty() - prop.DeepCopy(msh.property) + prop.DeepCopy(msh.properties) self.actor.SetProperty(prop) - self.property = prop - self.property.LightingOff() + self.properties = prop + self.properties.LightingOff() self.mapper.ScalarVisibilityOff() self.name = "NormalLines" @@ -2347,7 +2347,7 @@ class Triangle(Mesh): def __init__(self, p1, p2, p3, c="green7", alpha=1.0): """Create a triangle from 3 points in space.""" super().__init__([[p1, p2, p3], [[0, 1, 2]]], c, alpha) - self.property.LightingOff() + self.properties.LightingOff() self.name = "Triangle" @@ -2370,7 +2370,7 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) - self.property.LightingOff() + self.properties.LightingOff() self.name = "Polygon " + str(nsides) @@ -2467,7 +2467,7 @@ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", al if len(pos) == 2: pos = (pos[0], pos[1], 0) - self.property.LightingOff() + self.properties.LightingOff() self.name = "Star" @@ -3057,7 +3057,7 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. self.pos(pos) self.wireframe().lw(lw) - self.property.LightingOff() + self.properties.LightingOff() self.name = "Grid" @@ -3113,9 +3113,9 @@ def clone(self): newplane.dataset.DeepCopy(self.dataset) newplane.transform = self.transform prop = vtk.vtkProperty() - prop.DeepCopy(self.property) + prop.DeepCopy(self.properties) newplane.actor.SetProperty(prop) - newplane.property = prop + newplane.properties = prop newplane.variance = 0 newplane.top = self.normal newplane.base = self.base @@ -3245,7 +3245,7 @@ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1 super().__init__([pts, faces], color, alpha) self.pos(p1) - self.property.LightingOff() + self.properties.LightingOff() self.name = "Rectangle" @@ -4412,7 +4412,7 @@ def __init__(self): "Do not instantiate this base class." self.rendered_at = set() - self.property = None + self.properties = None if isinstance(settings.default_font, int): lfonts = list(settings.font_parameters.keys()) @@ -4424,76 +4424,76 @@ def __init__(self): def angle(self, a): """Orientation angle in degrees""" - self.property.SetOrientation(a) + self.properties.SetOrientation(a) return self def line_spacing(self, ls): """Set the extra spacing between lines, expressed as a text height multiplication factor.""" - self.property.SetLineSpacing(ls) + self.properties.SetLineSpacing(ls) return self def line_offset(self, lo): """Set/Get the vertical offset (measured in pixels).""" - self.property.SetLineOffset(lo) + self.properties.SetLineOffset(lo) return self def bold(self, value=True): """Set bold face""" - self.property.SetBold(value) + self.properties.SetBold(value) return self def italic(self, value=True): """Set italic face""" - self.property.SetItalic(value) + self.properties.SetItalic(value) return self def shadow(self, offset=(1, -1)): """Text shadowing. Set to `None` to disable it.""" if offset is None: - self.property.ShadowOff() + self.properties.ShadowOff() else: - self.property.ShadowOn() - self.property.SetShadowOffset(offset) + self.properties.ShadowOn() + self.properties.SetShadowOffset(offset) return self def color(self, c=None): """Set the text color""" if c is None: - return get_color(self.property.GetColor()) - self.property.SetColor(get_color(c)) + return get_color(self.properties.GetColor()) + self.properties.SetColor(get_color(c)) return self def c(self, color=None): """Set the text color""" if color is None: - return get_color(self.property.GetColor()) + return get_color(self.properties.GetColor()) return self.color(color) def alpha(self, value): """Set the text opacity""" - self.property.SetBackgroundOpacity(value) + self.properties.SetBackgroundOpacity(value) return self def background(self, color="k9", alpha=1.0): """Text background. Set to `None` to disable it.""" bg = get_color(color) if color is None: - self.property.SetBackgroundOpacity(0) + self.properties.SetBackgroundOpacity(0) else: - self.property.SetBackgroundColor(bg) + self.properties.SetBackgroundColor(bg) if alpha: - self.property.SetBackgroundOpacity(alpha) + self.properties.SetBackgroundOpacity(alpha) return self def frame(self, color="k1", lw=2): """Border color and width""" if color is None: - self.property.FrameOff() + self.properties.FrameOff() else: c = get_color(color) - self.property.FrameOn() - self.property.SetFrameColor(c) - self.property.SetFrameWidth(lw) + self.properties.FrameOn() + self.properties.SetFrameColor(c) + self.properties.SetFrameWidth(lw) return self def font(self, font): @@ -4514,13 +4514,13 @@ def font(self, font): else: # user passing name of preset font fpath = os.path.join(vedo.fonts_path, font + ".ttf") - if font == "Courier": self.property.SetFontFamilyToCourier() - elif font == "Times": self.property.SetFontFamilyToTimes() - elif font == "Arial": self.property.SetFontFamilyToArial() + if font == "Courier": self.properties.SetFontFamilyToCourier() + elif font == "Times": self.properties.SetFontFamilyToTimes() + elif font == "Arial": self.properties.SetFontFamilyToArial() else: fpath = utils.get_font_path(font) - self.property.SetFontFamily(vtk.VTK_FONT_FILE) - self.property.SetFontFile(fpath) + self.properties.SetFontFamily(vtk.VTK_FONT_FILE) + self.properties.SetFontFile(fpath) self.fontname = font # io.tonumpy() uses it return self @@ -4616,7 +4616,7 @@ def __init__( self.mapper = vtk.vtkTextMapper() self.SetMapper(self.mapper) - self.property = self.mapper.GetTextProperty() + self.properties = self.mapper.GetTextProperty() self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() @@ -4678,17 +4678,17 @@ def pos(self, pos="top-left", justify=""): if not justify: justify = ajustify - self.property.SetJustificationToLeft() + self.properties.SetJustificationToLeft() if "top" in justify: - self.property.SetVerticalJustificationToTop() + self.properties.SetVerticalJustificationToTop() if "bottom" in justify: - self.property.SetVerticalJustificationToBottom() + self.properties.SetVerticalJustificationToBottom() if "cent" in justify or "mid" in justify: - self.property.SetJustificationToCentered() + self.properties.SetJustificationToCentered() if "left" in justify: - self.property.SetJustificationToLeft() + self.properties.SetJustificationToLeft() if "right" in justify: - self.property.SetJustificationToRight() + self.properties.SetJustificationToRight() self.SetPosition(pos) return self @@ -4709,7 +4709,7 @@ def text(self, txt=None): def size(self, s): """Set the font size.""" - self.property.SetFontSize(int(s * 22.5)) + self.properties.SetFontSize(int(s * 22.5)) return self @@ -4731,7 +4731,7 @@ def __init__(self, c=None): super().__init__() - self.property = self.GetTextProperty() + self.properties = self.GetTextProperty() # automatic black or white if c is None: @@ -4748,9 +4748,9 @@ def __init__(self, c=None): self.SetNonlinearFontScaleFactor(1 / 2.75) self.PickableOff() - self.property.SetColor(get_color(c)) - self.property.SetBold(False) - self.property.SetItalic(False) + self.properties.SetColor(get_color(c)) + self.properties.SetBold(False) + self.properties.SetItalic(False) def size(self, s, linear=False): """ @@ -4951,7 +4951,7 @@ def VedoLogo(distance=0.0, c=None, bc="t", version=False, frame=True): font = "Comae" vlogo = Text3D("vэdo", font=font, s=1350, depth=0.2, c=c, hspacing=0.8) vlogo.scale([1, 0.95, 1]).x(-2525).pickable(False).bc(bc) - vlogo.property.LightingOn() + vlogo.properties.LightingOn() vr, rul = None, None if version: diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 94a31045..0b2df0a1 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -187,13 +187,13 @@ def __init__( vedo.logger.error(f"Unknown mapper type {type(mapper)}") raise RuntimeError() - self.property = self.actor.GetProperty() + self.properties = self.actor.GetProperty() self.mapper.SetInputData(self.dataset) self.actor.SetMapper(self.mapper) self.cmap(c).alpha(alpha) if alpha_unit: - self.property.SetScalarOpacityUnitDistance(alpha_unit) + self.properties.SetScalarOpacityUnitDistance(alpha_unit) # remember stuff: self._color = c @@ -303,7 +303,7 @@ def clone(self, mapper="tetra"): cloned = TetMesh(ug, mapper=mapper) pr = vtk.vtkVolumeProperty() - pr.DeepCopy(self.property) + pr.DeepCopy(self.properties) cloned.actor.SetProperty(pr) cloned.mapper.SetScalarMode(self.mapper.GetScalarMode()) diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 79482212..3de9a99e 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -49,7 +49,7 @@ def __init__(self, inputobj=None): self.dataset = None self.actor = vtk.vtkVolume() - self.property = self.actor.GetProperty() + self.properties = self.actor.GetProperty() self.name = "UGrid" self.filename = "" @@ -224,9 +224,9 @@ def clone(self, deep=True): cloned = UGrid(ug) pr = vtk.vtkVolumeProperty() - pr.DeepCopy(self.property) + pr.DeepCopy(self.properties) cloned.actor.SetProperty(pr) - cloned.property = pr + cloned.properties = pr cloned.pipeline = utils.OperationNode( "clone", parents=[self], shape='diamond', c='#bbe1ed', diff --git a/vedo/utils.py b/vedo/utils.py index 6b78efca..cf5d9815 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1503,12 +1503,12 @@ def _print_vtkactor(obj): poly = obj.dataset actor = obj.dataset mapper = obj.mapper - pro = obj.property + pro = obj.properties if not obj.actor.GetPickable(): return - pro = obj.property + pro = obj.properties pos = obj.pos() bnds = obj.bounds() col = precision(pro.GetColor(), 3) @@ -2657,8 +2657,8 @@ def ctf2lut(vol, logscale=False): """Internal use.""" # build LUT from a color transfer function for tmesh or volume - ctf = vol.property.GetRGBTransferFunction() - otf = vol.property.GetScalarOpacity() + ctf = vol.properties.GetRGBTransferFunction() + otf = vol.properties.GetScalarOpacity() x0, x1 = vol.dataset.GetScalarRange() cols, alphas = [], [] for x in np.linspace(x0, x1, 256): diff --git a/vedo/visual.py b/vedo/visual.py index d74d0b6f..cc869501 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -33,7 +33,7 @@ class CommonVisual: def __init__(self): self.mapper = None - self.property = None + self.properties = None self.actor = None self.scalarbar = None @@ -370,7 +370,7 @@ def color(self, col, alpha=None, vmin=None, vmax=None): vmin, _ = self.dataset.GetScalarRange() if vmax is None: _, vmax = self.dataset.GetScalarRange() - ctf = self.property.GetRGBTransferFunction() + ctf = self.properties.GetRGBTransferFunction() ctf.RemoveAllPoints() if utils.is_sequence(col): @@ -427,7 +427,7 @@ def alpha(self, alpha, vmin=None, vmax=None): vmin, _ = self.dataset.GetScalarRange() if vmax is None: _, vmax = self.dataset.GetScalarRange() - otf = self.property.GetScalarOpacity() + otf = self.properties.GetScalarOpacity() otf.RemoveAllPoints() if utils.is_sequence(alpha): @@ -562,17 +562,17 @@ def copy_properties_from(self, source, deep=True, actor_related=True): """ pr = vtk.vtkProperty() if deep: - pr.DeepCopy(source.property) + pr.DeepCopy(source.properties) else: - pr.ShallowCopy(source.property) + pr.ShallowCopy(source.properties) self.actor.SetProperty(pr) - self.property = pr + self.properties = pr if self.actor.GetBackfaceProperty(): bfpr = vtk.vtkProperty() bfpr.DeepCopy(source.actor.GetBackfaceProperty()) self.actor.SetBackfaceProperty(bfpr) - self.property_backface = bfpr + self.properties_backface = bfpr if not actor_related: return self @@ -603,13 +603,13 @@ def color(self, c=False, alpha=None): Same as `mesh.c()`. """ if c is False: - return np.array(self.property.GetColor()) + return np.array(self.properties.GetColor()) if c is None: self.mapper.ScalarVisibilityOn() return self self.mapper.ScalarVisibilityOff() cc = colors.get_color(c) - self.property.SetColor(cc) + self.properties.SetColor(cc) if self.trail: self.trail.GetProperty().SetColor(cc) if alpha is not None: @@ -626,16 +626,16 @@ def c(self, color=False, alpha=None): def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: - return self.property.GetOpacity() + return self.properties.GetOpacity() - self.property.SetOpacity(opacity) + self.properties.SetOpacity(opacity) bfp = self.actor.GetBackfaceProperty() if bfp: if opacity < 1: - self.property_backface = bfp + self.properties_backface = bfp self.actor.SetBackfaceProperty(None) else: - self.actor.SetBackfaceProperty(self.property_backface) + self.actor.SetBackfaceProperty(self.properties_backface) return self def opacity(self, alpha=None): @@ -657,11 +657,11 @@ def force_translucent(self, value=True): def point_size(self, value=None): """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" if value is None: - return self.property.GetPointSize() - # self.property.SetRepresentationToSurface() + return self.properties.GetPointSize() + # self.properties.SetRepresentationToSurface() else: - self.property.SetRepresentationToPoints() - self.property.SetPointSize(value) + self.properties.SetRepresentationToPoints() + self.properties.SetPointSize(value) return self def ps(self, pointsize=None): @@ -670,7 +670,7 @@ def ps(self, pointsize=None): def render_points_as_spheres(self, value=True): """Make points look spheric or else make them look as squares.""" - self.property.SetRenderPointsAsSpheres(value) + self.properties.SetRenderPointsAsSpheres(value) return self def lighting( @@ -706,7 +706,7 @@ def lighting( Examples: - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) """ - pr = self.property + pr = self.properties if style: @@ -763,7 +763,7 @@ def point_blurring(self, r=1, emissive=False): In this case the radius `r` is in absolute units of the mesh coordinates. With emissive set, the halo of point becomes light-emissive. """ - self.property.SetRepresentationToPoints() + self.properties.SetRepresentationToPoints() if emissive: self.mapper.SetEmissive(bool(emissive)) self.mapper.SetScaleFactor(r * 1.4142) @@ -785,7 +785,7 @@ def point_blurring(self, r=1, emissive=False): self.mapper.Modified() self.actor.Modified() - self.property.SetOpacity(alpha) + self.properties.SetOpacity(alpha) self.actor.SetMapper(self.mapper) return self @@ -811,9 +811,9 @@ def cellcolors(self): vscalars = self.dataset.GetCellData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.ncells, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) + col = np.array(self.properties.GetColor()) col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() + alf = self.properties.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf @@ -862,9 +862,9 @@ def pointcolors(self): vscalars = self.dataset.GetPointData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.npoints, 4], dtype=np.uint8) - col = np.array(self.property.GetColor()) + col = np.array(self.properties.GetColor()) col = np.round(col * 255).astype(np.uint8) - alf = self.property.GetOpacity() + alf = self.properties.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf @@ -1107,7 +1107,7 @@ def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): self.trail_points = [pos] * n if c is None: - col = self.property.GetColor() + col = self.properties.GetColor() else: col = colors.get_color(c) @@ -1201,7 +1201,7 @@ def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, c except AttributeError: pass - shad.property.LightingOff() + shad.properties.LightingOff() shad.actor.SetPickable(False) shad.actor.SetUseBounds(True) @@ -1414,7 +1414,7 @@ def labels( lpoly = vtk.vtkPolyData() ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) - ids.property.LightingOff() + ids.properties.LightingOff() ids.actor.PickableOff() ids.actor.SetUseBounds(False) return ids @@ -1672,8 +1672,8 @@ def flagpole( macts = vedo.merge(acts).c(c).alpha(alpha) macts.actor.SetOrigin(pt) macts.bc("tomato").pickable(False) - macts.property.LightingOff() - macts.property.SetLineWidth(lw) + macts.properties.LightingOff() + macts.properties.SetLineWidth(lw) macts.actor.UseBoundsOff() macts.name = "FlagPole" return macts @@ -1823,7 +1823,7 @@ def caption( txt = txt.replace(r[0], r[1]) if c is None: - c = np.array(self.property.GetColor()) / 2 + c = np.array(self.properties.GetColor()) / 2 else: c = colors.get_color(c) @@ -1897,7 +1897,7 @@ def follow_camera(self, camera=None, origin=None): factor = vtk.vtkFollower() factor.SetMapper(self.mapper) - factor.SetProperty(self.property) + factor.SetProperty(self.properties) factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) factor.SetTexture(self.actor.GetTexture()) factor.SetScale(self.actor.GetScale()) @@ -1927,9 +1927,9 @@ def follow_camera(self, camera=None, origin=None): def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface.""" if value: - self.property.SetRepresentationToWireframe() + self.properties.SetRepresentationToWireframe() else: - self.property.SetRepresentationToSurface() + self.properties.SetRepresentationToSurface() return self def flat(self): @@ -1937,27 +1937,27 @@ def flat(self): """ - self.property.SetInterpolationToFlat() + self.properties.SetInterpolationToFlat() return self def phong(self): """Set surface interpolation to "phong".""" - self.property.SetInterpolationToPhong() + self.properties.SetInterpolationToPhong() return self def backface_culling(self, value=True): """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetBackfaceCulling(value) + self.properties.SetBackfaceCulling(value) return self def render_lines_as_tubes(self, value=True): """Wrap a fake tube around a simple line for visualization""" - self.property.SetRenderLinesAsTubes(value) + self.properties.SetRenderLinesAsTubes(value) return self def frontface_culling(self, value=True): """Set culling of polygons based on orientation of normal with respect to camera.""" - self.property.SetFrontfaceCulling(value) + self.properties.SetFrontfaceCulling(value) return self def backcolor(self, bc=None): @@ -1971,14 +1971,14 @@ def backcolor(self, bc=None): return back_prop.GetDiffuseColor() return self - if self.property.GetOpacity() < 1: + if self.properties.GetOpacity() < 1: return self if not back_prop: back_prop = vtk.vtkProperty() back_prop.SetDiffuseColor(colors.get_color(bc)) - back_prop.SetOpacity(self.property.GetOpacity()) + back_prop.SetOpacity(self.properties.GetOpacity()) self.actor.SetBackfaceProperty(back_prop) self.mapper.ScalarVisibilityOff() return self @@ -1991,13 +1991,13 @@ def linewidth(self, lw=None): """Set/get width of mesh edges. Same as `lw()`.""" if lw is not None: if lw == 0: - self.property.EdgeVisibilityOff() - self.property.SetRepresentationToSurface() + self.properties.EdgeVisibilityOff() + self.properties.SetRepresentationToSurface() return self - self.property.EdgeVisibilityOn() - self.property.SetLineWidth(lw) + self.properties.EdgeVisibilityOn() + self.properties.SetLineWidth(lw) else: - return self.property.GetLineWidth() + return self.properties.GetLineWidth() return self def lw(self, linewidth=None): @@ -2007,9 +2007,9 @@ def lw(self, linewidth=None): def linecolor(self, lc=None): """Set/get color of mesh edges. Same as `lc()`.""" if lc is None: - return self.property.GetEdgeColor() - self.property.EdgeVisibilityOn() - self.property.SetEdgeColor(colors.get_color(lc)) + return self.properties.GetEdgeColor() + self.properties.EdgeVisibilityOn() + self.properties.SetEdgeColor(colors.get_color(lc)) return self def lc(self, linecolor=None): @@ -2032,8 +2032,8 @@ def alpha_unit(self, u=None): The larger you make the unit distance, the more transparent the rendering becomes. """ if u is None: - return self.property.GetScalarOpacityUnitDistance() - self.property.SetScalarOpacityUnitDistance(u) + return self.properties.GetScalarOpacityUnitDistance() + self.properties.SetScalarOpacityUnitDistance(u) return self def alpha_gradient(self, alpha_grad, vmin=None, vmax=None): @@ -2054,12 +2054,12 @@ def alpha_gradient(self, alpha_grad, vmin=None, vmax=None): _, vmax = self.dataset.GetScalarRange() if alpha_grad is None: - self.property.DisableGradientOpacityOn() + self.properties.DisableGradientOpacityOn() return self - self.property.DisableGradientOpacityOff() + self.properties.DisableGradientOpacityOff() - gotf = self.property.GetGradientOpacity() + gotf = self.properties.GetGradientOpacity() if utils.is_sequence(alpha_grad): alpha_grad = np.array(alpha_grad) if len(alpha_grad.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) @@ -2199,8 +2199,8 @@ def shade(self, status=None): (for example, in maximum intensity projection mode). """ if status is None: - return self.property.GetShade() - self.property.SetShade(status) + return self.properties.GetShade() + self.properties.SetShade(status) return self @@ -2240,7 +2240,7 @@ def interpolation(self, itype): 0=nearest neighbour, 1=linear """ - self.property.SetInterpolationType(itype) + self.properties.SetInterpolationType(itype) return self @@ -2346,22 +2346,22 @@ def scalar_range(self): def alpha(self, a=None): """Set/get picture's transparency in the rendering scene.""" if a is not None: - self.property.SetOpacity(a) + self.properties.SetOpacity(a) return self - return self.property.GetOpacity() + return self.properties.GetOpacity() def level(self, value=None): """Get/Set the image color level (brightness) in the rendering scene.""" if value is None: - return self.property.GetColorLevel() - self.property.SetColorLevel(value) + return self.properties.GetColorLevel() + self.properties.SetColorLevel(value) return self def window(self, value=None): """Get/Set the image color window (contrast) in the rendering scene.""" if value is None: - return self.property.GetColorWindow() - self.property.SetColorWindow(value) + return self.properties.GetColorWindow() + self.properties.SetColorWindow(value) return self def bounds(self): @@ -2412,7 +2412,7 @@ def __init__(self): super().__init__() self.mapper = None - self.property = self.GetProperty() + self.properties = self.GetProperty() self.filename = "" def layer(self, value=None): @@ -2479,22 +2479,22 @@ def pickable(self, value=True): def alpha(self, value=None): """Set/Get the object opacity.""" if value is None: - return self.property.GetOpacity() - self.property.SetOpacity(value) + return self.properties.GetOpacity() + self.properties.SetOpacity(value) return self def ps(self, point_size=None): if point_size is None: - return self.property.GetPointSize() - self.property.SetPointSize(point_size) + return self.properties.GetPointSize() + self.properties.SetPointSize(point_size) return self def ontop(self, value=True): """Keep the object always on top of everything else.""" if value: - self.property.SetDisplayLocationToForeground() + self.properties.SetDisplayLocationToForeground() else: - self.property.SetDisplayLocationToBackground() + self.properties.SetDisplayLocationToBackground() return self def add_observer(self, event_name, func, priority=0): diff --git a/vedo/volume.py b/vedo/volume.py index e2ff9cb0..dce63779 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -123,7 +123,7 @@ def __init__( """ self.actor = vtk.vtkVolume() self.actor.data = self - self.property = self.actor.GetProperty() + self.properties = self.actor.GetProperty() self.dataset = None self.mapper = None self.pipeline = None @@ -233,9 +233,9 @@ def __init__( if img.GetPointData().GetScalars(): if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: self.mode(mode).color(c).alpha(alpha).alpha_gradient(alpha_gradient) - self.property.SetShade(True) - self.property.SetInterpolationType(1) - self.property.SetScalarOpacityUnitDistance(alpha_unit) + self.properties.SetShade(True) + self.properties.SetInterpolationType(1) + self.properties.SetScalarOpacityUnitDistance(alpha_unit) self.pipeline = utils.OperationNode( @@ -345,16 +345,16 @@ def clone(self, deep=True): newvol = Volume(self.dataset) prop = vtk.vtkVolumeProperty() - prop.DeepCopy(self.property) + prop.DeepCopy(self.properties) newvol.actor.SetProperty(prop) - newvol.property = prop + newvol.properties = prop newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol def component_weight(self, i, weight): """Set the scalar component weight in range [0,1].""" - self.property.SetComponentWeight(i, weight) + self.properties.SetComponentWeight(i, weight) return self def xslice(self, i): From 062a4343dc05710b12e665fd351f5626cf24aa59 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 12:44:02 +0200 Subject: [PATCH 101/251] fix dolfin --- docs/changes.md | 3 ++- examples/other/dolfin/ex03_poisson.py | 2 +- examples/other/dolfin/run_all.sh | 6 ------ vedo/dolfin.py | 20 +++++++++++--------- vedo/pointcloud.py | 9 +++++++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 0d2b6b32..052e171e 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -82,8 +82,9 @@ trail.py ellipt_fourier_desc.py export_numpy.py flag_labels1.py +ex06_elasticity2.py + -property -> properties dolfin notebook backends diff --git a/examples/other/dolfin/ex03_poisson.py b/examples/other/dolfin/ex03_poisson.py index c9f5e6e4..9b35794e 100644 --- a/examples/other/dolfin/ex03_poisson.py +++ b/examples/other/dolfin/ex03_poisson.py @@ -34,7 +34,7 @@ from vedo.pyplot import histogram from vedo import Latex -l = Latex(f, s=0.2, c='w').shift(.6,.6,.1) +l = Latex(f, s=0.2, c='k3').shift([.3,.6,.1]) plot(u, l, cmap='jet', scalarbar='h', text=__doc__).clear() diff --git a/examples/other/dolfin/run_all.sh b/examples/other/dolfin/run_all.sh index 4bfe0fb2..077dafef 100755 --- a/examples/other/dolfin/run_all.sh +++ b/examples/other/dolfin/run_all.sh @@ -32,9 +32,6 @@ python3 elastodynamics.py echo Running elasticbeam.py python3 elasticbeam.py -echo Running magnetostatics.py -python3 magnetostatics.py - echo Running pointLoad.py python3 pointLoad.py @@ -94,9 +91,6 @@ python3 turing_pattern.py echo Running heatconv.py python3 heatconv.py -echo Running wavy_1d.py -python3 wavy_1d.py - echo Running awefem.py python3 awefem.py diff --git a/vedo/dolfin.py b/vedo/dolfin.py index 64c362d6..794d0c14 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -501,7 +501,7 @@ def plot(*inputobj, **options): # actor.points(pts_act) actor.vertices = pts_act if vmin is not None and vmax is not None: - actor.mapper().SetScalarRange(vmin, vmax) + actor.mapper.SetScalarRange(vmin, vmax) if scbar and c is None: if "3d" in scbar: @@ -632,7 +632,7 @@ def __init__(self, *inputobj, **options): # print(cells[0]) # print(coords[cells[0]]) # poly = utils.geometry(_buildtetugrid(coords, cells)) - # poly = utils.geometry(vedo.TetMesh([coords, cells]).inputdata()) + # poly = utils.geometry(vedo.TetMesh([coords, cells]).dataset) poly = vtk.vtkPolyData() @@ -805,10 +805,11 @@ def MeshLines(*inputobj, **options): def MeshArrows(*inputobj, **options): """Build arrows representing displacements.""" s = options.pop("s", None) - c = options.pop("c", "gray") + c = options.pop("c", "k3") scale = options.pop("scale", 1) alpha = options.pop("alpha", 1) res = options.pop("res", 12) + # print("Building arrows...",c) mesh, u = _inputsort(inputobj) if not mesh: @@ -830,12 +831,13 @@ def MeshArrows(*inputobj, **options): start_points = np.insert(start_points, 2, 0, axis=1) # make it 3d end_points = np.insert(end_points, 2, 0, axis=1) # make it 3d - actor = shapes.Arrows(start_points, end_points, s=s, alpha=alpha, res=res) - actor.color(c) - actor.mesh = mesh - actor.u = u - actor.u_values = u_values - return actor + obj = shapes.Arrows( + start_points, end_points, s=s, alpha=alpha, c=c, res=res + ) + obj.mesh = mesh + obj.u = u + obj.u_values = u_values + return obj def MeshStreamLines(*inputobj, **options): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index d530ee9d..984ab077 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -534,7 +534,6 @@ def fibonacci_sphere(n): self.line_locator = None self.scalarbar = None - # self.scalarbars = dict() #TODO self.pipeline = None self.actor = vtk.vtkActor() @@ -550,9 +549,15 @@ def fibonacci_sphere(n): self._cmap_name = "" # remember the cmap name for self._keypress self._caption = None + try: + self.properties.RenderPointsAsSpheresOn() + except AttributeError: + pass + # self.properties.LightingOff() + if inputobj is None: #################### return - ######################################## + ########################################## self.name = "Points" # better not to give it a name here? From 42076d45328af6edfda4a0095b1f8022936fe428 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 15:31:26 +0200 Subject: [PATCH 102/251] add issue in tests --- docs/changes.md | 3 - examples/notebooks/align1.ipynb | 18 ++--- examples/notebooks/interpolate_volume.ipynb | 47 ++++-------- examples/notebooks/legosurface.ipynb | 58 +++++++++++---- examples/notebooks/numpy2volume.ipynb | 23 +++--- examples/notebooks/pca.ipynb | 23 +++--- examples/notebooks/slider2d.ipynb | 8 +- examples/notebooks/sphere.ipynb | 53 +++++++++++-- examples/notebooks/test_types.ipynb | 82 ++++++++++----------- examples/volumetric/ugrid1.py | 9 +-- examples/volumetric/ugrid2.py | 12 ++- tests/issues/issue_656.py | 10 +++ tests/issues/issue_893.py | 33 +++++++++ tests/issues/issue_905.py | 58 +++++++++++++++ tests/issues/issue_908.py | 32 ++++++++ tests/issues/issue_939.py | 4 + tests/issues/issue_946.py | 56 ++++++++++++++ tests/issues/issue_948.py | 35 +++++++++ tests/issues/issue_950.py | 17 +++++ tests/issues/w1.py | 66 +++++++++++++++++ vedo/assembly.py | 12 +-- vedo/backends.py | 45 +++++------ vedo/core.py | 9 ++- vedo/pointcloud.py | 2 +- vedo/shapes.py | 16 ++++ vedo/tetmesh.py | 8 +- vedo/ugrid.py | 4 +- vedo/visual.py | 14 +++- 28 files changed, 574 insertions(+), 183 deletions(-) create mode 100644 tests/issues/issue_656.py create mode 100644 tests/issues/issue_893.py create mode 100644 tests/issues/issue_905.py create mode 100644 tests/issues/issue_908.py create mode 100644 tests/issues/issue_939.py create mode 100644 tests/issues/issue_946.py create mode 100644 tests/issues/issue_948.py create mode 100644 tests/issues/issue_950.py create mode 100644 tests/issues/w1.py diff --git a/docs/changes.md b/docs/changes.md index 052e171e..2136c8b8 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -85,9 +85,6 @@ flag_labels1.py ex06_elasticity2.py -dolfin -notebook -backends release on master as branch? ``` diff --git a/examples/notebooks/align1.ipynb b/examples/notebooks/align1.ipynb index 917f0fc6..489c316e 100644 --- a/examples/notebooks/align1.ipynb +++ b/examples/notebooks/align1.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": { "scrolled": false }, @@ -16,12 +16,12 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAD630lEQVR4nOz9abQl13WYCe6IuMOb38v5ZQKZyCQJAjRBAjIpuUyWCKtryaRUhlyruleX9aMlddkSXWV3acl2m2W3y4Jc5SpL9jKtttsy5KFNuVZLyz/cq4hqiZIHKWlDWrYJOSmSFiCCTGQmkANyevO7U0T0jx333BNninNiuhHv7W9dgjfvuzfixHBffG/vHft4cRwD0R6+/KWX+X/efTB7Hvjwzrevsn/++F/69boGRRAEQRBECn/eAyBKI4zmPQKCIAiCIACABKtdCOErANg8nfpnFEE01ayf/Z++p44xEQRBEAQhQYLVenjHeuJ9LwKQYxEEQRDEnCHBag1y+MpAROlCgiAIgpgfJFitYX1V+yMhUYigY1EQiyAIgiDqhwSrTRgcSwmWZJFjEQRBEETNkGC1g6++9jI+0TmWMoiFULqQIAiCIGqGBKt9rK+qNQsdC+vcBf76T1IQiyAIgiDqgwSrrWSmCyfh7AEe/NTnyLEIgiAIoiZIsFoAyw8KyI6FQaxEqtIsLZY9LIIgCIIgNJBgtRtdulAJBbEIgiAIoh5IsI4CvGNtnoannk6XYXnJ/y8tkmMRBEEQRB2QYB0RBMciCIIgCGKOkGA1HV0BlgyfLlxb0b6NglgEQRAEUTUkWEcNdKyT61PH8lI/xVJ3ciyCIAiCqBQSrCOITRyLIAiCIIjqIMFqNPb5QYEPfvjFS+fVP6IgFkEQBEFUDQlWo4nj/I8ohksXYG1Zu3ByLIIgCIKoCBKso0wUkWMRBEEQxBwgwWou1/7Ny6Us59IFWOynXqGu7gRBEARRKSRYzeXkemmLev8l0bEYFMQiCIIgiNIhwWo0pTvWZJz8kw9ikWMRBEEQRLmQYDWd3I71xJUXhVfefwkAZo5FEARBEERFkGC1gBLjWC/8PgCAyRgmYwpiEQRBEERVkGA1lJtfe5n/Z+mOBVIoixyLIAiCIMqCBKs1VOFY40lpyyQIgiAIgkGC1SZKd6zlBRhPZppFQSyCIAiCKAUSrJbh5FhynTvPKjdTITkWQRAEQZQICVYTEQqwBMqKY73/EqyuwPJC8k8+lEUQBEEQRBFIsFpJiY4lMJ5QEIsgCIIgikKC1VbKcixW8M4YT+Av/VlyLIIgCILIDwnWEWc8zn5810dgd198/IWfIMciCIIgiJyQYLUYmyDWlQ+a6twZ3/sJuPJk6pUoIsciCIIgiJyQYDUOc4W7QImNGz5wKeVYgyE5FkEQBEHkhASr9WQ61ukT2QuJIgDJsWAaxyLNIgiCIAgnSLCOAgbHCiMAO8dClI4FQKEsgiAIgnCABOuIUEocC2GONRgmr5BjEQRBEIQTJFhHh4KOhRaFoGMJoSwgxyIIgiAIO7w4juc9BmKGU4W7kkfb4iuBD7v3r7J/Pnis/ayf9u23bgIA3Lmv+On/8vlfLzJIgiAIgjjaUATrqGETx7JMF37gEgDA5SeSf/IhLgplEQRBEIQBEqxmsdAvYSE2vRuUjsUrFEKORRAEQRA5IMFqHPN1LEYcJ48nz4HvkWMRBEEQhANUg9Us3vu9l4G7fa8gWI8l1GAJsJIsPA98T/GeKIK7DwAAohjefhdAqtaikiyCIAiC4KEIVoNAu4KSglhgHceKp3YFAJHGtzdPw+Zp8D1435PgSRJGoSyCIAiC4CHBaih1OtYZ6xZZm6cBAK48AXEsxrrIsQiCIAiCQYJ19Fnow8rpjCmfczhWGIHvpTSLHIsgCIIgEKrBahAsRcgopRgr8OFgANvvXR2NMt55f1qPJUSn5LsLsSTr+rsQcIrO0otUkkUQBEEccyiCdcRBAVpaAADo9aDXM705Rxzr0vnZiyygRaEsgiAI4phDgtVoyqrEAoCFqVqhZulM68wJhWbx9wzuHSaPlWVYWYb9AzhzAkaj2QM1ixyLIAiCOM5QirApyPlBRpFEIUvhPb57daBKEeryhg+3YP9g9s9Qf5rcu58Y2Lv3xB/99b9DuUKCIAjiOEIRrKNMkD68C6qolRDNCqPkcfaU7VrOnUmePHFO/NFf/Inv+b//3yiURRAEQRw7SLBaQBWJQoEggCCAMF3MfuWi7WLPnU6ePHFO1KxuB8ixCIIgiOMGCVY7KO5YJzYVnRrCMHkgvS70uqk3XLlopVlRPHMskEJZ3Q78RSrJIgiCII4TVIPVFAw1WIhrJVYgyfPju1cBIArhMKtfg8xbNzPegPcP3nuQevHde9DljG08gb/+t6kqiyAIgjj6UASrEWTaFZQRxIpCiEIAgEVjswZEiGZ94FLWwmMAgHOnM0JZlC4kCIIgjgMUwWoENoIFjkEsOYL18N3UlM/mOBZvV6MxACSZxOvvaj/CtydloaxuBwDg3fdmPxpPAIBCWQRBEMRRhiJYbaLEancnMJoVxxDHcOUJq4/wcSwAeOLs7DkqF4WyCIIgiCMMCVbLsHQsOXwFUkcGm0Qhv8DVZQCAOIbLFyCKxAdwU+UgsmMxzSLHIgiCII42lCJsBI++9fIkzH4bYpMoVArW7v0kRcg3F9UlCoXbCdkCd/dnL377HfFTvrTerW3xFZYuxFwhULqQIAiCOHJQBKspdALoBFbvzJ0oXD2TdGowz0gow+saxrGQ9z2Z/dlTG3BqAzwfvOlCWCgL41hAoSyCIAjiyEGCNX8efetl9txSs8yOpQxfCTDHckoUIoJj8ZoVRfLbAQBOrgFAolloWuRYBEEQxBGGUoTzhxcsHnPS0JAoNAgWyxIyMF0oJwpZilC3ND5XCFy6UMgSBtythY92xIXEEbz73ixXCJQuJAiCII4EFMFqLuZQVll3FJrThQZX4+NYwKULdUEsADi5loSyGJ4PT26m6r0olEUQBEEcASiCNX90ESyGLpSlDGKZ84NyBAsZjcQgFkpPZrZRiGMBwLffSQWx+AgWQw5lAcC792ASzvyMQlkEQRBEe6EIVgvQFWaV2Bar11MUY9nUcglxLLCrfBfiWMgT5+CpC+D7yYNCWQRBEER7oQjW/MmMYPHI0SwhjpUvgsXY3kue9LpWgpUsdhrHOhwkT1gvBrlxA+Ox1MEBADwP3r0H4TSOtbsPf+8fUSiLIAiCaBkkWPPHSbBAcixesGyUyOxYgxEMRwAAixbhsUNu1bt76Z95AADv3jMJFiJoljdNKaJm4W2Gj7ZJswiCIIg2QYI1Z1ztisFrFnOs4oIFU8eSBeswq8FpyrG8ZDzv3MseEu9YXrpm695DAIAogkfbAECaRRAEQbQDEqw5k1uwEKZZ6FilCBYAjCYQRUkoy4mZY00FC8nUrEzHAtIsgiAIoj2QYM2ZgoKFTEIYDG1LpnjBCjUtFTBY1Q1gkNux0oIFFo4FU80SBKvTAQB4997sPThs0iyCIAiisZBgzZlSBAsAJiGMx7N/6swJsiJYbJrCMIZuAAB5HUsSLLB2LKVgIahZ6GGkWQRBEERjIcGaM2UJFgD4HuxIXalkDII1GgNwpwNfn+6qWXhfoTKolqlZW1KXLNmxgMsqhhFpFkEQBNEsSLDmTFmC5XNRH7NmKQVrpPIn4QbAHI6ly1qaHcsDeJx2LF6wED6UhZBmEQRBEM2BBGuelBu+EjBoluBYSrsCgE5HMe+NvWZ5AJ4H+wfJP+XzzKBZuDVMs2TBQkizCIIgiGZCgjVPKhUsRKlZTLB0asUo4lhsSMyxBGK9Y7GtyeFYyP/rH5BmEQRBEHODBGueVJEflJEda/f+1Uy1QpSChWRqFj8qnWMhqFn8ichvEDqWTrAQWbNwLsXP/xxpFkEQBDEHSLDmST2ChfCa9fDd7FZYCGpNPscSRmXjWAy8kZA/N3eNH0fevadwLIRMiyAIgqgTEqx5UqdgIahZroIF7o7lSe2swMWx5M8CwN4BRBZn69d/b/acdywgzSIIgiDqggRrnpQiWPZ2xbj+e7aCBVlBLETWLKVgITaapfys78MONxuPQbZYKEsQLIQ0iyAIgqgaEqy5UX/4iuferasHh5qfeal6qMwgFiI4lkGwIJdj8T0jdoSJpXF40omMoSylYwFpFkEQBFElJFhzY+6CBQBax+Lgq8vNjgVTzcIRGQQLshwLAN59L/VPoSmX0rEYvGx9/fe0joWQaREEQRClQ4I1N/ZuvgzYPL0A+ewKAO6/exWmwmTWLCfBAoDBaHYPoJNj7aWHEYawx73Bl3qW7uxmDwbH+/a7AFk9KUizCIIgiBIhwZobKFhQzLEKChZwzqTTLKE/go1jDacqYxAslKd9vduFYeqdsmAhZs1ig328naxrEgLoZYs0iyAIgigFEqy5wQQL8jpWbrsCTrAg7UxKzXJyLCZVg2FKsPY0OUGdYzHBws/qBAuMjsVGipP2PHicWp1Btsi0CIIgiCKQYM0NXrAgl2OVJVggOZOgWfkEa/8QBkPb8ciaxQsWAARBMoG0Ep1jCYIFkmMxJqHCtEizCIIgiHyQYM0NQbDA3bGKCBa4OJbcRd3gWChYvMRYata+VIPFEwQAYHIsUGkWP0x+5mmdZiGCbJFmEQRBEK6QYM0H2a4YlppV0K5AEixQaRNqlnKaGqVjeZ5WXGw0i/8sL1hoVwzLUJYwwCCdZHzwWFyjEl62yLQIgiAIS0iw5oNBsMDOsaoQLNBok3I8ynceDDJWmqlZzHgMggV2jmUWLMRSsxDUTdIsgiAIIhMSrPlgFiywcKyKBAs05tTtKCyEfyf+1NyXgWHWLFyUWbAQs2bZCBY4Ohbjr/5N0iyCIAhCCwnWfMgULDA6VnG7Ar1gIYJmdadZQkFE8G1OdsUwaFYUpe461AkWGB1rSyrJMjsWWGsW9vrqduB/+VukWQRBEIQCEqz5YCNYiFKzShEscHGsLleGxVsI7zeuggV6x8JVM8cyCJY8DATP6+10w3edYCH2msU3U8U9Q6ZFEARB8JBgzQd7wQKVY9UjWMA5Vleqc98/TESEvSeHYCGyZrFlomNlChZIjsWf10yzzIIFnGOBXrP46YAQtnNIswiCIAiEBGs+OAkWpB2rLLsCC8GCqesIgsWmtTmYOlZuu2LwmsUHz/YOrAQLYZolnNf2jgXGUBab01rYXH7/kGYRBEEQJFjzwVWwgHOsmgULJMfak7Tj4FAUmkx0W3E4BEjP1gwAQ1UmMdT04kLHkseDjmUjWKAJZQ245ljy8AUHJc0iCII4zpBgzYEcdoWgY9UvWAAQRdDtKNSKceh4F56Z/XS7B5wnR7cK+bbHMILhGKJI7FYK+hl7ZHjHAoCH26l/6g6CoFn3HsI/+idkWtkMb98FgNHtu8M70ye37+GPRrfvJu+5c1f38f75TXzSu7DZv3Bu9vz8JgCsfvyFqsZNEAShgQRrDuQWLA/A92dTKRfHUrAwhNMNINSfLGg5ylCTK+hA/KpY2Ek3I7UABreGqvsD4ggOuEFOJhkz/6Bm4T7n/dJguXK9GlBAi2N4+y6K1O5XvgoAo9t3d1+/Jr/tK7tbH1/d4F8J4zhIp6K/tr/zkeU19s/X97Y+tpL6SO/CJvMz9K3Vjz/PPX+hhO0hCIJQQYI1B1wFi7+kYCynOscy3EDX5QqhZNNimlLQsfgIE1sJn9fLdCw+dSg7Vjz96UHWOCeT5Mn2LgDAzrSKCzXLHEZUOhYcS83C0NTu69d2v/JV3qV49UF++dHd7z+5We7aH4yHp7t9/pU3D/eeWVxh/+xd2ASA0y99GgBWP/YCKRdBEGVBgjUHbARLd/32OdUoRbPefss2Swhpx0J40yroWHLyTilYwDlWLO0ouTBLcKyYe0OmYwG3kwdc1nISarOlu1MP0zkWHAPNGt6+KxuVgBB8QtHpn99Mnlw4h08gnf7TrZFPI86e376HoTLB5HhuDg8u9Zf4V1igi3yLIIgikGDNAYNgZZZX+VKNdkHNKihYjDBO5dpcHUtXGoVnp1yZjo4lCJau7J13rFh6j1mz+N07SFeGxVKfLRndHtvdP1LlWXyY6uGrX5Lf8Nt7W79/mrxDT1r92AtoUShVfb08lThC5lvoXkr563jehPutSL5FEEQ+SLDmgCBYTjXrsmAhuTXrW29etW+CAGbHigC4GwAtHSuz6jzW3/onpAt1ggWcY8mCBXrHkvcq71j8N8dgWso9xu4JvfcAFvptnd8QI1UPv/irsqn81s6jP7h2Ep/3LmyufuyF1Y8/X49LOYEFYTj+3a98Valc/3wBvnd63HsXNk+/9GmSLYIgMiHBmgMoWPnuBdQJFpJPs5wcK1OwGFGc7ViW9/QZtpo5lsGuEHQspWCByrF0O1PnWIjStNhOk3vGsu8f1niNQ/g7P99o2WLpPz5S1fW9cZSK+mCAqo0ighs4un1X51sMki2CIAyQYNXN/s2Xi3zcLFiQy7G+9WaSJbTRLHvBYhwOFC/at0uArK0+OMy2K2Q41gpWsihOs8x7EjVL9+URNGs0MpVk8V/BHe6DzQlrYX7t4atfMjgHH6Y6SsIxvH0XVfLBq7+KtVz/v0d3/3OpGB+3/dRLn2lUfI4giDlCglU3VQsW4qRZTLCgmGMZLAdbdMbpCXDsMW91GMKByuHUI8kKqqFj2exAs2MBwGgkmpZSs+Sv4E76U/MKaymDVTxHVap0sHyiIJo3h4eX+ov4nMJaBEEgJFh1U49gIZaaxQsWYtasHEEsmDrWeJLkRpVhLR2ZggVg61hxbLVbHu9aLU3pWCNp+bxmWToWSJoFAOMQACqXLbmyKvC8cDpEKvpGmGyxyJYAmlbvwubplz5T//AIgpg7JFh1M7z9MmuwlAMnwUrWaOETTo6VT7BGk9lIhPqzTNkybLXQqz1Ts/B8N+8TrNayj4rh+GWvkkHTkh3L8C2UNQspV7Z0sRkGC1aRLshgGpHtul/fuv89G2fYT5mSXvjsj8xrhARB1A8JVt0Mb7+MT/JpVg7BStZrvPzLgoXoNMspSzjithSHYS7wV/qWcsPlmXDAKEb8ya7bIULfLLNmLU17WPLforv3TR8BgO09k2Mp93m/B/sHANxs1mxixPEEACDw4ZX/t7Ns6ZKAv/L43vedOAeU8HIHZev2K1/gX8T9STEtgjhWkGDVDRMsyOVYuQULjI6lEyzQXO8tBWuk2sDhyOEOSiZb8oYr7QrRWZF8ssv7RG7+LixtqS++AYyVWAJMv7rdmS0ZwKKxfi/5p1y+xl4ZT1L9LAy+JSQB3zzcfWZxlf2UglWlgKalTCCSthLEcYAEq254wUKcNKuIYCUDUGkWClbn/JXJnevKTwmalSlYSrXisUmoCQMQu17pBQs0jqU82fkdopy+cPph0+osfq4YSbcDu5wwYUXXvYfqjzDHAuNdAvgjeYLF/+df/UUw3gmIXnX6pU/TVb9cZNNafOL84bt3YGpadO8hQRxJSLDqRhYscHGs4oKVDEPym2+9efX/8+jfAsDGwvpHzzwHAM+ffe7h9WvsDTaOhYKVaVcA4HNJLhuEtTO7MkxNKDuW7mTHvSHb1eJC6p+HWdMg2n+X2EgwV/hwK/mneeZp3rHAOHHk3QcAAAs9ePhg9IkrVz4Zf4RPAr4zPHyS7nqrncyYFhVpEcRRggSrbpSCBdaOVZZgIbxmfeMbv/bPdq/xP31q7eL2cOejZ557cn82OCY66gblE9uWVLgd9o7FC5Y5diXAW4jBxoajRLAEqZIxaJbld4n/znU7s6PA4lI6zRIEC5E1KxqOAOB9wdnhnbvBo+Rafv8R/Cc7l/F578Lm3wv/XbC6Eqyu+P3e7/zOtWc/9AK/h1lDVMMNDQDQ7wMAhCF4xikyG946tX6EOi3muxTQIoijBAlWrejsipGpWeUKFoJXxG9849e6//4dfGWvG+72wjvLo71edGdltNFf/+iZ51hAS+lYLGplKVjg6Fi4Uie1YjAFMZ3sMQDAjl2DroKOxYaBe54veM/nWACwfwjRcPT0xpXRnXsHb77F/2jcHa8FXQAIVldeHxzsxSvd0yd1Sx5Pj6MyPLayJL7CHxHPogsuLqHDvfPBFgDA3/tHx1HCHrz6JWWbMayBo4AWQbQaEqxayRQsyHKsKgQrjmE0gd/8tf/1ynWFv+z2wm+eONztRd88cYimhQGtIEgES0gIugoW2DlWEOS0KwR1QXuyK9tQZcmWTrPM3yjBrkDVtUFXR4XwjhWNRh86dWV0+95kb290++72LgDAdjheD7r4hmB1BQCur046qyvB6gq/q7d3UovF47iQFjjB5/gQYKejOCJKx1pZFF+R75zAmjyULYEj715y6vCbh3tPL65Q3pAgWg0JVq3YCBai06yyBEs47LjY63/7C8o3I9OYVvjtSx0MaO3cuibrlL1ggaNjFWT/UCNYFt8AnWwpHcsUJtN04XJyrC6kpEp+w/YuBKsrvwsHweosWMWrkrC37z9KnjC70sXJGLxaYa1bZ+pM6FiyVDF4u1pb0b7n1h3tErA32NETr+Htu7df+YIc0Lrw2R+mvCFBtA4SrFqxFyzQOFYRwTIcalzsW29cjYaj0Rji0SgajqLRaPLg0elHUlpoGtY6PLV45vIzz5997vGNa+xH+QQL0WlWGFrN4ZMJC8AkExO7n/uyaTk5lqGPvLLD+94BRBFEoxEAPHPiyujOveHtu+HuHl8o9ngyOtHpAUCwuvK18CBYXfF7vWB1Rc7xydo0Ttf1b3H96w2OpQslriwnT3od0/GyOZT8e3APK4NbADAcws++cqRMS+6k9XuHex9cXOld2Lzw2R+m3hkE0RZIsGrFSbAQQbNcBcvy8DLBwn+OuOtuNByNHz7SmRYA7PbC+5u9M1eeOXvlg49vKGJapvVKr8iOhZfzUgQLxzYcAqQdyDwDtA5etmTNkne8eRpEQbCS3N+de5PdvffeSIWpHk5Gpzo9dKxgdeWrh1vBygpmAOXFMs06uQ6Q1ibBwPamTbnMmiXYFUrVYDLsceMfhIMggIVgpoELnaR7mP1xFO8bnQAAeB7cvq/qZzYEgKNmWg9e/dLtV74gBCkpb0gQbYEEq1ZyCBakHctGsHIcUrZY5liQ1iyYmla4u3fqTnItDSEO0k1Dg9WVxQ9+IAyhd+Hc7f03rVYtvcIci7+WlyhYoHedZM+5+9bOgehY/EHAqJXhuOB9fx/dTIyKv6YOonDBD7a4eqlgdeXb/la8qJUqdCke3qXQmQwtHpC9/cS0+j0YTIaDcLA/HALA9nB7ZRkGk2GvC4PJYBAOAWAh6OMTBP/Jdz3F02Qh6DPxWuj0F4I+AKwvrAPARl8cdK+b6psKAJ4HMO09e3var3VW08Yd06NkWsrW8KRZBNF8SLBqJZ9gIahZOsEqeBjZYm+8dXWcjpmNpO5Q0XAUj0aT3T05rHV9uH+lvzzBmNPqCgAsffADACbfUm7QYCRGSsoUrDhZhYx6L7r41sEQdqezB+LSZLuKhqMPP/WRcG9vdPseAEx290Z3EqPqddWLDVZXvt072PdW/F5v2EmkqtdTuJQBJlUT/e0Cg8kQALaG29vDbfzn1nB7awc6HdPw4nHsdTnVDmMIPABmSDEaVnIQ4zhxJQAAWOj0caVri/2FYGG9vwYAGwvrqFy8Y3npGQAOBzPNmo0/3fzsyJgWr1mHUbjoB0CaRRDNhgSrVooIFgBMJinBKvHQ8YIF3L36iOxYjGg48g72otEo3N1bfyeJbLHr906YNAhAsPFS//wmAPQunHvn0df8fk8pWJMoFZCAkgQL0lExB8fiyfKtg+nIPYBoNDq98pFwdy/c3Q9393iXQh6OR6e6szwcM5hgdWV/88Dr94Qw1eOdWS4PAHpZ1egy+4dwcDj7ICoUAGwPt9lzHMlC1B/4w5NrAABhDJ1BtKvy4UfbgLEoxkJnAQAGkwFMDxwqlHAQcWPjUez1OHU6iGDJny6nf2pxvR/0NxbWTyxoXfJbt1L/ZFVufOb3aJgWRbMIokWQYNVHQbtCgsB5khkbBMFCLDWL3T7GIluPr++c31df+ffCyUqQqjZC6+qsrgQrKwDQu3AOAG4++Jrf7wGX9ylFsGKAKB28kR3L9fsQHY4AYHPjI+HeHgCwoNTWvb2QxbKm7IeT5UBRzY4KdXD+IFhdWTix4msqzHf2AQDCcOZYOQTr0e5wa7h9e2s78odbw+1UUCodW0K1AoCFTj+M4fTSOgD0g/5CZ2Gh09/dh4VggRVXqde1BTA9dkEwK9UahANMOwLA9nDn8akOit2Jh4o7OzCI5Xmw0OmfWzrLglsCd+6nevcLNxOgbB0NzQKA26/8Y9bW4fcOdz+4uEqaRRBNgwSrPsoSLHCfyC8TpWCBnWN1JPUJIxhMho937x/s7+w/jlZHwcooUCrXe+Ph2a72Co3aMeysdFZXAKC3kQRyOqvLaGPgwTuPvgYAEINOSpA4+Z+i8QHvWNFwxL4PFzY+AgCoTQAQ7u4DADrTZHcPfyQrFL/83X14e7h/ub8svIfpFD73+z0+RqW8nRCmdpUMJgTwAIeW6VgYl9oebk9geHtrm73e68HhYSwm3gAWOv33nVkHgPX++kKnjzYTxgCqY42bmcnaMvg+vKeZZhErtFC5tgbbw3A4mAyvr8yWi+s98c4IFmfBLaVs3bkPwM2SpLtn82/93FEwLV6zENIsgmgOJFj1UaJgISVqFp95NDsWqDRL6VgIXt0Hk8HV4Z2VUbA6Cjb3uwBwfq+nVK6DcLKUjvHshxNv3FGuRYey9FsYWPLP3T2wqPhWLyqOgnRjzVvDw4v9VAOoYHVlezflUl6vZ3ZBUDnWjkpiWChLcKxkn4eD/ckOS/kBwMGhmI/r9WAh6MeThYVOH3UK1Uq1sckTw1FQmtbyIgCA56e6t6tNSzQ9GEyGd/fvAcB7h++9d0JROHbi4WShk1RuXV6/xF6/M63NOhikHCuOUq1Q9w7gH3yh9aa1+5Vr11/+adIsgmgaJFj1UbpgQXmOZRAsxKxZBsHiYbJ17+C9N4LkeonWtTIOVkY+AJzf6wGA7F4HA+2lfRRHvbToeJ5YoHZ/PDzT7bOB7UzGa51UwXbH87YPUp+Rs5lKUOYerW91+j0AQH/yez2v3/N7vXiqDa4OxzuW0q4QLCnbORxuDbf3w1QR1Yz9CJZ91gNsAXN8QX+9v352dR1zfFgsfyhNj52shdsxNpqLprXMqaYgWAwb0/Km8a1xPNgabG8PdzC4FT8IvdOz0WAo6/Le0ubyOdyod+8lP1rowb1HoKQTwNbuUdAsFs16d3j4xHRmQ+qbRRBzhASrPqoQLKS4ZmUKFhgdy1KweFg+aHu4cw3UBrFyB+BUAACbez0A6B/4ALA6Ctb7690gaUJ1emcjWF0JdxXZOh2GsQ06s9DXo/UtAPCn0SGv32P/9DmXAs2NkMCVc+VwLCZYsl3hrhtMhtvD7UE4fHiwHUbQ63JdQ8cxdFO36S0EC9Gov95f3+ivC1VTm2fE5cuaFaZ/SWQ6Fq9WKFsowErHQhSmNd0ClsNkdxSyk+fewXt31qeRrUkMneStG/31j5597v3R/kKnf/s9AIBJCA+34JEkn/zm/I2/c3Q0i73Su7B55eXPrX78hfkNiiCOKSRY9VGdYEFhx7IRLESnWcJF17LdqD+9drJk0PZw57fjfcNZyQaAEYun1i6uY+hi/eLBO2+gPWBbqdky8Nl0XXyZlC9VMA1GbnXumXYF6YiMvWZ1O7Czz+nUaHswTp7zb4timIzjXj9ZyXicGBXL+m301w9UU/2cmCYDlRlLXrOcBGtZNUmO7yV9WQ2OhQimJUxuyBzr5EbyBM+c7eHO65N9AOB73MPUtJ4/+9ybv30Nb27Funvk4dS3+C06Gpol3Gm4+rEXLv/U52iyHYKoExKs+qhUsJDcmiW013J1LJCKxzMFy5cKbvgTkaW67u2/9+1uR0574Rji/chbFq/YKF7r/bWn1i5B0lFpDQDCO9fRdKKsSaMtHcugCvLHhc2VNYs1oAIA7EH1eF+V70OimO3BKIaN/vokhLXFxKiW/VQdlWxXJ9J1VoaSMNSsUNoepWMp1QqkY90JTElPBDWLtyvW8Uv+CvS7AFPTGobD3xor0oEb/fUPnXhu8XZy7vKaxUb1kNvZbdcsZUOHC5/9YSrMIojaIMGqjxoEC/I6lpNggcqxOkGqKksnWMK11v7kY/VbeIvZb0f7Cs+LFffECWz018MQ1vtrG/319ekNaEzCAODgnTcAII5M3QfALnDFRg4AHgB2JcB/DsLBcDLcP5wFqIRP7WzH0PFYonAh7A2C5NBilA7H3/P77Da6Xi/VQRQzhoJdCWrFMJfd76mibrxj6dQKwYPO21KQcZQAAFZXwPfh0ZbCxvBb0Nd0PQWAreH21mD7NwbifNHL/vpHzz53ee3ivTeug0azeP7CXz1qmkWFWQRRGyRY9VGPYCGumuUqWAivOOzKxDRLcCy8ypZ4tqGa7A2HzLq+1VHEulJMAz9Ju9HtCNa1caj9Q3H+lvWphOnAL9P2MJnXRhgM735XRpNv73nvW4kBYB8dyJvtHV4pVhdS+T6h9ZQQOBQcCwC2p0PQqRViFiycG/sgXZuFR9ysVgDge2KaDzE4FrsHlJ2Wogl54Hum/reIMqaF3ompQwxoCQtPOZYHAPAX/qfWa9bbP/nTu69fY69QYRZB1AAJVk2UYlfg2G/TXrPyCRZoHAsARuOZYGUFlYrClKLDNQ3fSmZ6GTzaGw4mw3eWUu4VZmUJkf3tGPgm49MZYJB4N/JWZztO8U3ajYB7gzeMYEHrc95oHQCeDiejYR9Da1g+pWuLBaqeXlhRxnYI3jl4Yo2rf9djcKyI2zRes9Y13TCEOKVSsEDlWEJ7Df60nGmQl1pFpmbB1LTuHbz3u344Hqcyy5+6+Mnnzz73e9eu8Zo1O5O5EbZds+RuDpQxJIhKIcGqibkIFlg7ljzFYQ7HEtIrh8PK1SoHD3eHAHAwGgwmQ5zLBQAwAIbPby2JYTCbsnTz14hFwt43nuCsMv1On5vzOAlK7R+qi5OUjiXbFXANsSahIoNm1ixLwULQb4SzUa6rA71dQVqwlJ3L5NPy0dZMeoTV2ZvWP99NpQ7x6Hz07HOH/3H250JyMqdX8XCr9bVZQv07dcwiiOogwaqLBy/rmko7kW/GmEzNKiJYyHiSEizPS67KpWy1mS633rFdaIqvczf4U1I+5SdTCGMRlYzwFUJzgmmxFI9ZONGulOORHUspWABw+QkAgNFInDJxexcgr2PxgsXnBA8HEARqr2IYBAsAAk+tVohuanPWbUFetY1mAcA3H968d/De73ph/DD0TiUnEOYNmWZ1NLHDtmsWnzH8D3tb37GyQfcYEkQVkGDVxYOXoQzbyD0ln9mx5CvZu9dngjWxsxZ0LBa1YlflSh2rK+0QG8cy3Ego+A3zg4GmCafr90dnI0LsShiGIFiCXZ3nelmhJMmCxcM0C62LR3YsdhyV5VY4MF2HUjAK1toKgCbuhegEC0HNUn48jtX3ujLwpxjQ+o1DMaDFNMvgWNDyOw0pY0gQVUOCVRcPXsb/L2IbxSc81mmWWbCcYDYm5JWq0CzZrmBqPJlSmNmsoduFKIJd7i482bFyfHmUOqFrW8BrVrc7Wx8K1nmpR6iwCnOvDGU0q9+F7XTH1ijOqGRn8qfULKVgrQm1VhrHMgsW6B2L/62mMy32Oq9Z8XuhdzY5qz518ZNnvefeffOabu1HQLPkjCEVvxNEWZBg1cVUsJB8tlFcsEDjWCUKFoJ+I9fulKhZSruCtPQYNMssWN0ugBQo2j1IOVbub47gA5lNoVCzULAunM2o0B+NZ9VXNt1eZc0SircwinOgj1GBFGBjpiXb1ZpdXXzyYpZgIVs74ivybzVZs+RX3t5O8ob8i0+tXfzEme9/++vXdGtvu2bxGcPf3Hn4ibVTFMoiiFIgwaqLtGBBLtUoRbAQQbOUV7KCjgUAUQQT6SJf3LF0asWwcSydYHU5vVDWOQ1GAAA7thPzqGE6kWlXAHDhLADA/gF0u9l2haAk2bXTB0hrFi9Y3W5aVqbjPjBmMBkD7ljr1IohO5alYOFn+WlwbGYC4J+vLM1eHEyGbz765r/e2+dvAjVrFjoWtFmzKJRFEKVDglUXkmAhTrZRomBB2rGUV7J7t65OjIUsmTBBKVGzMu0KVLElWbOUgtVNB2+UguUHMJmIhmrjSTxe1qdQqmQM1U5QQLBA5Vhsb8RxRn3+waHasTCCZeg0wVNEsNjHUbN0v9WWpyLF1Ep3ho/C4Y2dm/9iZ9ZAy/dhNb74Ax/4/utfv6Zc/oOt5Mlf+1ut1Cy5XRaFsgiiCCRYdaERLHBRjXIFC0FR0AkW6K9ANsiCwptWDseysSvQJO8Ex5IFqyv1NWDj96X1st0ip1wtZWtX9TadV8FUGuJYu9+EG+hyOBZMNavTgQWu2t3md4RgURji2lhNvyj2qxcRHMtJsPiPD6xPLRTWIL0i9ktxMJlpVrwfBav+o2341JOffP7sc9fT0Sz2kQdbEHjwVz/fSseCdCird2ETAJ75+c/TDYYEkQMSrLrQCxZYq0YVgoUoLQoFS/dTG3StBPJplqVdgVEIeM1ijiWrFQD4vqKGbLac9D7R3T2gky3ergxSxeC/prGq/4XcniCfYAFAN4DRJBEsvCfUsB9SH0w71soigKfYM2bN4h3LVbBgqkqHWSbHryuKUntP/o04mAz/1TduXl9/NOssvw2fevKTa+8pvhhxnDjW/gD+1s+1UrNYKOt39rc/urwOFMoiiFyQYNWFUbCQTNWoTrDwSiNcpJlgQQWOBZxmZW64vVohmed0UoMfAqTtSrii2wsWw9AOg8nW7n5yA6BlI1bhO8r+ye83Zf+nftdZsLpcE3MW18khWCuLyUKS4al2i860mGPlFizIcixe4/AUZTtQ9xsRNevGiUf4pkc73kZ//aNnnpM1C6fExNbw7dUsoSpr9WMvPPP3Pz/H8RBE6yDBqgULu0LMqlG1YCH8pbq4YxkEa7bkCEC/7a52hdg4VhRCt2u6ipvFwrxDlEqx0IfReBZFyxQs3beTf3040nbXdA1iddPty3tdAIAwtBUsmDrWCmvrwJ9XmuOr1Cw8IXMIFlg4llzsxRwr89fhMBr+8rVv3j2dyPKjbZA1CxeCB/fRFuwPAKCVmiVUZVHlO0E4QYJVC9aChehUoyLBUt4hj9dsXrAgl2PZCFay8Eix4fnsCiwEy/Mg8MUZqQWKCBaDicVCH2C6Y20cy/DV5H+EC1SeM06C1Q3ESvbeNLZnbtqZWkiHsytQlMYbInyCafleTsECvWPpGm6xszS2mPbA8+H1b26/+eibW+dCmJbVb/TXf+AD3/fom9eBOzqCY0E7NQtDWV/Z3fr46gZQupAgrCHBqgVHwQLN9bJOwUJufVvs1ODqWPaCxWBXo9x2BXrBwmsei80AmBwrM3JjuTcW+7MDykebJqFasDK/lLJggd6xbI6A7kY/3FG4uszerdjsIHXUNKeWWWLQtIoIFkiOZZ7PBwCiaHbOmIfHmnv9y6/dfHM16QKPmvX8mecubi8LgoXcmrVMb59m7X7l2ps/9hPsn5QuJAgbSLBqwV2wEOGSWb9g3bmpuJHQybFyCBYABAEMRhDn+iwinNb8pY4FZlhPKZ1jlSJYi+kJCYWbB2XHsvxG4tvk5KBwztgIlqGNAi9YiE6zWCspG8FCMjWrU+yER8fyPBhY1LzzgoXohsd3T/3WTXh7O9Es1ojrU09+cvVecmYIB5dpVusci9KFBOEKCVYt5BUsSF8v5yVYCC8T9o7lKlhsG+MYhqzu2N208LSW40M9rqRdaNopa1ZBwVoU53oGUAWc2HqdvotxbJrYmD9tDI5l06Gq1xUHJjsW36gT0pXyZsyOFQQQx7NlzLpx2d0c4Puz/WDjWPIJYONYAPCNbw9v7Nx8e+PRo22ID2JvycOM4cPfuw7SSXg4mHXMap1mscr3m8ODS/0lShcShAESrFooIFjAXSzrFyxIOxZwSlG6YwlbN7tXLq0RNrKF1z/h1O5JvRjkrujCJdamuFu5H5RqhQhWhAc3jNzsCgDGk4wdy04bnWBZ9v+Ug1gI0yzBrpKFp+vlzSg8xgMACHwIfOkw2S0TsXesWH+iysOTpwD61k0YTIZfvf+1rXMhC2U9f+a5J7eWZcvnHQvaplmULiQIS0iwaqGYYCGZFTC5cRKsZDCT2X8zyRQspTimbpTThGoE2fI07SJBZVegEixIO1Y+wTLYFWj6KWA4yukQZwoWgnohN/qytCtEDmIxFjQb6yRYSOIx3Ecwx4f/DUO3pSGsigv3g8GxcPuKOBZwGUPmWLpWDtDmUBalCwnCBhKsWigsWNhZpwrHyiz+VQoWMplYOZbBAwwxOfnE1GkWAPieQobYEpR2BRrBSn4UAVj3f2I7waxWiC6v5+RY7LY+2wxsnApiOdkV6AWLxa6Uw5ZvSzSDkZ5UTpwTLDDejqBDKJMfjtSOxTbOsD8Fx1IKFvL1bw1v7Ny8ceLRo2+GcDYAgCsbF3/gA9//rd+5JrwT+8g/2Er+VPjZV9qkWUKjrGd+/vPkWATBQ4JVC3kFiz84ePkp3bGKCBYyMM6OB6qLlk2uU3liCo6lvet+OquMTq0Q88TJYeQmWDZ2BUbBQg6y9iffNCGHYLnaFWgES8gMymemZRBLzqDNcuJpwQJ3x5LvQ9zeVbyN3zjzLuU1iznW8mLqPZMQ3n4Xtobbbz765tfjkI3kU09+cuWu+BcJm1zy/iOAtjmWkC6kkiyC4CHBqgVHwVIeE3YdKtexigsWZIWy+CuWUxmZ7ty0bMvU72XsK7NgAcDYblc7tZMwVKbz22vQLGHzsx0rBgAI3L2KJ9WlXVV0hQg73BzEMvdZHY4UggWOjqVs9DAYwTAdx7IXLJg61tKitosE7oS33wUAeHv75r/cvwMAEMZ+19vor/9fPvzH7n3zGv9+7EtycAhRDA8ft8yxhHQhlWQRBIMEqxbsBMt8KPirUYmOlSlYYO1YoK/KiqI8FfqzfkJCcVWU7VgYT2IhKOUeyxSsKM64nC9OZ0S2PCIGuwLpBJiEivfLG24pWOtrs+jLyL1hLBMsg10x2N7QCVZmC3ucCZEZDDrWzl7yT3vH0jkQzgaNmiV87XT7cykdpjLMks6fDG+/C4PJ8M1H3/zKZJ+9+VNPfnJzWzwGqFmTCbx7r2WOBQBv/uhPUEkWQQiQYNWCUbAsj4BwTSrLsWwE69GdlGDpaqF0NxgGgXOzBrwU6TJ0rLZdqVl8qi6SlIXHRrCSd6rGz+xKXrIOs2CByrH4T+m0Ut69Z05Mf8QWNRFDQWxpmUlJAIAYul0ru2Lg4IWMpEGtFnqpf6KR4w4JJI+Rd/iual5tQ6tS5ljyWYb7UzAqmdEoW7AgHcpi739q7eIPfOD75VBWFEEUwbv3ANqWLmQlWV/d3/7Op58hxyIIEqzq0diV646Xr0ylOFYOweIRZEvolcWiVpmCpbxQZQoWSM4hFELploC7zl6wIO1Yiz35vVaHw1Ww+CWPxlrBOrWufp23KwCIIkUBljkWOHOvGE5o1mJgEs7WqFOrBdXOhCzBYsvPJAhmoS+BwSiJX6FssVIqpyykHLXlR8U2//o7SSjrG539/UOA6ew6g5vX+c/uHiRfljY6llCSdfmnPnf6pc/McTwEMV9IsKpHEqx8u1x5fSruWAUFiwdlazJJNeAeTy/t4notZkGxESx+LbxdYVNKc5V6lJVqFD6O112lXUFJggV6x2KCdWpD+THFazaChWSmXBd60OM23DwruYB8rHVSxeATygUdy5yb3juYPec3ysaxgumM1GO7yOj1dwAAvvX45r+N77AXn1q7+PHoArtTJIwBAPam0bjWpQuHt+9+7Y/8IPsnlb0TxxkSrOqZClbBPa0LABRxLBu7AmvBQqIYxqr5W3LMK2cvWAsLMBH6kdoJFqJNvaU/jj2fIs0Or1SwVpdnl3z1QqRPCXYF0+013EWo2w+JD3kZd2XqrKs7nfkx06sYctdZnWBB1p43twLBvc0CdXJ7fcUC098aPLF5xzJERq+/A2EEg8nw9Ttfe2c1eR+GsvZvXAfunMSbCqGFoSwqeycIhASrcuL7LxdfiLkoOLdjlS5YeFliox2Pk+dR7DxLNKI0JEGwFhaSJxPJPCwFiyHeoDf9uNBOM7dj2QgWpB1rdTl5IlzyFYviPiXbVfK6PojFEHbCzIqyBEuHPPljJk6CBcY9rxOsOJ79FxE0S9jhgf7LIjhWRvuPEK6/C5MJvL198/XgDkxi6HgA8KmLnzzzeMLOySCAh1vJ3yqtcyyYlr3fGQ2euny5f36THIs4hpBgVU4NggV5HctSsMDOsdgFCUfLL5tlD11RtA/V2BVD0CyDYxkqw5LMZgygaVaudKzSBYvZFWhiKqkF2gkW2LXCwj2Qijl5APqurQaEj2RqllKJMs9V3c43zxOg/P2HpnUwMElVamxT+Rvb1fYxx9oabv/L8Rvs9afWLv7+yQV+2A+3kh+9/Q5A2xzr+k/+9MNXv4TPexc2P/q//+J8x0MQNeOetiEaSaeaaQrt4S//nnRvfq8DvQ4sSTJUhIUFhV0BQCdXlEWg24FuBxb62qlgfNUOL+sooKHydqWj1+X0ZbrTdXblRLcjDSDv32KCVgZBnp4dmUVR9jtf7t8rsLQAy0uwknUXoYx9R7QrT8DTT8FGf/0/X3jhAwfJjr6xc+vXwzdWr1yBqaWxervLT0K3Cz/+2e9xHtP8uPJTn7v8U5/D56Pbd3/nj/zg7leuzXVEBFErFMGqnt2XY5vb4I1kRrAQ1zhWWRGsWewK/ystVjjLrPoCAIA+gqVUKx4Wx8oXwQKAfi/5rHmvCqEs85stI1grywqbyTSM0TjVsV1pV2yTM4NYvFnOiupKCmIhykiPwb0sT1fhEOgmEVe+InZcC+HxjtVK+RLDQdYdAPyGf/MGAEzThcMY+km68NTDCRs5i2MBwLv3YDxuUyiLv7WQWmQRxwqKYNWBtwBeqcEbHXOJY4VRErJil79MaV9agG5XMQOxJZl2BQCdbqFQVh8bXXoAAJ0geShRhrKKsILhDPeJjfMVSNlQ5GAZyBfKysTwLTCcmZ6vnl7wxBosOn55DWeLzNNPAQBcXr/0n3WfRbsCgC/feu23O7fZe/j7Rp84B90u/Lk/3ZpQ1urHX3jm55MCrH/2tWtv/thPUByLOCaQYNVH0xzLPnxlIIqyTUB5VcNkCl657S/ei30ru2Lkc6y+5mY33YWTd6yCjruiTwuaq7yTtXeSqildcnBWLWTMHioTo91unnkMEYPZ8Jpl9i3LqSEhfRRYuEg3A5VOrRgLvZyapUPYzKefgstPJOnC9+3N0oVXozfW33cF/yk4FgD8mf+2fY71R05tAgA5FnFMIMGqlXpCWU5/QOfG8xQpNqd8M1+wYqNZlrMpi2txjL7o7Iqh3L1+UDSUtbJssisb2OHo+A4NEWR0ZWdIt5On4Uhmn63SQ1mdrMyg59lm3pGFHiwuJI98YzDQ7cDlJ2Ch03/+7HPfMT4PADCO7+9vf/GtX9E5lu+3zLE+whW5k2MRxwESrDlQm2aVyMnzL7LneGVSFtC4BsWEomA5oMXCbPnsCqYFYZaOlWlXDJ1mgX7PGwqw1GrlsjeZXbEnC70MzVJKj9mumKbkOLsytcwmY+ikRGyQQlW7q1ox2P6UNUtXz+fkWE+chTiGp9Yu/SH/Weh6ALA13P6Fb/zS41NJ5LDVcaz+hc2P/O+/uPqxF/Cfb/7YTzyY3mNIEEcSEqy5UYNmletY/JVJaVf8BdQ+yKG88Yo3rcV+frsSlmmg33OwK4asWTniWAUDV5C+ugsl3pmalXqznV0hpQdK0a7KDWV1gtlpqfMqJ9fid6ZlNMuwl0bj1KPTgfNn4fxZ2Oivf6b7wvmt5JNffue1a93b2Bb15DpAnDwubsIT51rmWJd/6nPoWDeHh2//5E+TYxFHGBKsOWPjWPn+2kZKuQQKVyb7dpGWGG5uzyE9phVp0oWGtdhUqvFV8L4HnY5trVJ2WtBi7bJdybVKOs3ig1gGu2Idz2WcTjBL7TaEssLI7esQxcmhKfIlEhD2pI1m4V7iXSqM1BFN/C6cPwsLnf7zZz7y5ONlAIAwvrFz66u9pOz95Mbs/b7Xslwhc6xL/UUAIMcijjDUpqFidl+2fKOhlUPxa4Oyd4CNOvCrfnTnqqBWsVEA2GctTzFhQjfd8OwrnRnyALDvAKpJpsMJa7TpeBlFs5UyiREuqLaBK9V8iLOxpf/JDrRhkIOR+Cns+KVeuap0iX1KXq+Zbkd7MmuNSloyFvtnnlSeNztw+BFDnwvDwmLNpsm9GHATDg6TvSFnYIVXlH+o4N0J7Ltw5z14a/ubby4l8+bgpDpb37oOAI+2kvdEMdy5D1EEf/PvtqZ3A0xbveNzmhaaOJJQBKspVJoxzBHHkvMp8vXARvzy5QoNflBKJILFsZR2xZKh+PDTj0w8D4IgJSLJgwueOaQF9WvU2RUYNXRBSoYq7UoXtVK+aJ8udP2DLkfGEI8avwdQrWxuw7RHjgjiF2RpEcYTdX1b1zq0yb4L58/CMyef/q4wqXPHkqyN918BLo7lT+ecblEcCwCe+fufZ/VYFMcijiQkWM2iOs0SS4U0l+0iJcACOWKj3cBKYoS2W/nodmF1WXSpsrYdAIIAOtLVtNuFk+twcr2E5Zu7pGbCas76PTG0ZkgImqno3lUhYyjMd8ngD5/OLwO/TM3SFbed2khVowswxzK748yxzsB3XD77Ke9Z/Ge8H/3CN34JnjwFnGOdPwPQZse6Px6SYxFHDxKsJlKPY4krzXKLM0++aPpxGfi+W6elfJqFn8KrY+7GTjqEPFSnk9Ks1aXkCc4dhI9sLDYy32SUayupaFZutWLYOJa8Cpswla4wS9bizCRyWY4VG++NsHEsM+hYeEZ96Mn1P9x54dzjwFv2AeCLb/3y1ukOTB3L99rtWGe6fQB4+yd/mno3EEcJEqyGUlEoS3n9sw/bLLrPzmaJ7896YNpnUpDMgBabfJq9zal2vnhMCzVrfUX9UwfTmmJIDs7eY+jt6QNwO6HfA88rqlaMStuw8Y7lq0rXLUv0hFCW0xGe3sM3g+1J4bi4OpbcHpbPm18533/+zEee2kmyy19+57Ubq/vAORbSUsfC59QfizhKkGA1mkSzutNHGfAXvxwZscXF8jXLV52GyiuQWQKUmiXrl2BXpQexZFinCfRI5faCOazFR2iKJQd16EYlg0fB3DtU6VjsI/xxdK2y6nQgCNS9111vgHAKZclexWOIY+k0y7UeCwCunO9/5sPPoWPFj6Ov3v863lqIjoVBLCDHIohmQILVKrrlPDoLRYuNULMyL2eZQRGDbUBe9fHSDx5dQqcsx1Lep6Zs4mXecHAJaxmSgzrhWFqEJVV81N6xbCgxlCVXyGHAhtesHLeXgkVVltmreAxhUeZYwg0TiwtJ6jPzwfOZDz/3zMFJ74QPAKx9w8mNVPFi6xyL9ce6Ox6QYxFHA2rTUDHWbRpMlB6x8JJlxvre4kr2Hl6VXzw8zDME+2s5HynJfbbGseL6J4SCDCEZy/UKgiWolcmELA7xaJLcp2ZoKyrDX3SXuNCjcE8oP3KbwST98e3ElB8k/xG83TJzLTJso6IY4ih5kolZpCbCVk8X6BQv9P3ZHQPK1T14LL4Sc/07dDNIgmoD396++Wu7d/D5SrCOVfAPHsOd+9ynWtW7YXj77ts/+dOsd8MzP//51Y+/MM8BEUQxKIJ1/OAuWl4XvMKZR4xmKfOGusueU6SklPBSpl0VX5HZrsyYU4dIrwM994MVxbC0mDwMYCAHH+XGscDx7kKb2zkDPynU63eh14VeDxb66oc9iQ9JASv7vYHv7HVNUbHTJxyGxCOfwJfXL/3AiaR9w164/Y2l24EP507Bxc3UkP7cn25NHAt7kLJ/Xn+Zat6JdkMRrIppWgSLXbRUy7QJaCmDWDx8QCuKxZ4LuS/eGF7Kd7YKN8ohyshEkSAWEyydWoWhw2TYyuHhKsIoaZRqCF8tczqlNBWbdvxRZGrO6XnOSooDZp9a6M/G5pqvZicSHhebHWuOYPke7A8AVHsmM4iV3EXhzf5piEVBOo6FI8cgluFT2ERtKHU33Rpu/9P7b8QHsbfkYRvS9373+pvXk5+yM+Rv/J02xbG+9kd+EJ+vfuyFyz/1uf6FTfNHCKKZUATrOMFfxFRHvsSAFiPKFQyQyR1eEv70N4dGcq8l065ckWNavOt0u2q7Wl5MHjy5/4by/VRkKwdCPGllCRa4aFMcF21p5nllxtuWF2B5wa3oXnc6yS3QeE6fEENZlrFJOY610V//P5951ltKZob+4lu/sva+K6zanU3i1K441jM//3l8/mu//q/e/LGfmO94CCI3JFjHBuuLWImatTytpM7Mf9ngaj+GHkWep74NLcdaeDLtKodJyKYVTFNR7Kqs9KpSENYryBYG/HTpOWWGrtNJpAS1zxAhcxpkwU4afJx1ecE0GSIiJzFlzTI7FkjpwoKOhc/RsT78nS+Igwngv//x1jjW6sdfQMf6g2snR7fvvvmj5FhEKyHBOh64X39K0SwA55CAejDT65l9EZJNpyvPV2uWq2OF0awRQ/ZK3ZY9g5+rJwwTozqxVolXpdar2kWLC3nqnLC8qaxe+fxybPTdXuYMoSyb229ZyNDGsQy9suzhHevxO4/+yTd+6Tv/syslLHd+MMcCgN3Xr5FjEW2EBOsYUOB6hpqV27RGExhNAHI13AIpToDXrUzHMgSu1GvxFabl5FhlpQUtWU5XrPOhLB0FKy0Ffem57F5uEOqXSwliQdlTDUI6lJV7GqVMxwKuiYPlWac8vZljeWcCjGN94OOiY/3Fn2hNEAsAVj/+Aqt533392vWf/On5jocgXCHBOuoYLgkuB99Vs0YjGEkFuZZXqcy3GXzCSa3E9WoCWmxUMosLsOjecL9IBIetTtCVHDcYOpHcItfLZVfp+/LQ9gqmjJWHI59jGea+XF6AxX72XZDmU9rSsbZ3AUpyLADYGm7/6/utd6zTL33m1EufwecPX/0STVZItAu6i7Bi5nsXYeaV3H3Jg/tXx8Yb0GSvMsCfffaZl2RF0j2P9naV2TYJuysJNxUKA0DXsbkdj8G/2fWLxxRqmN5wfrfJ+yT1Tu6tTsPmByDsumwhkLYzimfOwW7Qc3Ijc227ISSmXItBsPiN3d03jSfzFeUdgjhU3Al4dt28A6A5jkxtWZNY+aZCAHhvb/uX7r2Bzzf669995vve+sp19lPcb//z51tzUyEAvPmjP0HNsYg2QhGso0tJlS4CC2de7Aap6TsYyqiVGZumRza4pgUzwWiWwR5yBK7EVbi82ZCF5AXGJl2YD7ZYQUdME+aoOqALflZ6zy0oL1coDHV12eGz8t+tzCnDaPaQuXQ+e+EHg+QRRnBwKD760fofXXsWAOBxqMsVtguaSIdoKSRYVVJK+Cof1dgVj6BZrmrlinzFYpf8ctWKx/Oh1xOVgk8L5ogD5WCxn1GoZJkuzBetlqXNEPLRjgkANIFDdCz7SiwbF7d3LN22KIe6uqyYYshmPGEIYQieZ7WZl8673MyhMu+N/vofXXsWTgQA4C1sf/GtXxHe0K5EIXAT6QDA9ZepGItoByRYR5Hq7YrRDSCOkoRa/fS6FdoVo9Od3b5XPHDFk3mg7G9OjKsJZekWYnIsy6n7+KVZ/x6yj3QqHctS4wwZ5CBQT+OoWFc4ezAsm9pfOg8fuGT1Th2JYwEAgLew/R83kqQhy8m2y7H4Ju/UuIFoCyRYRw4nuyp2/EfjWbEITl1SJ/0+9Pt572jLtTphtplSwleGw5Xj5sTMUJZTEMusaOhY4vL0yzfXvfl+abcTMvLlCjPr89CxlJqllCoB+4mDLB1LGcQCgI2F9T+6Pqt5f/fcbdsVNxLWgHQcR9S4gWgFJFhHi7piV7xa8dSmWfxFpQbHWnGpvymF3K0fSgllWX7K97gzzhi4spmMOTOOxYevLOdgzpwehyeKrcYJkPRuWJre5aCUKoPL2jvWpQtWb+O/DjipDh6YjX7iWCfW4cbOLcGx2hXEgmlzrK7nA8Du69duv/KP5z0igjBBgnWEqNGuzHQ7bvP72sBfXOU/2Z0cy/IiyljoAUi3y4VRaTtcWIx9WtBAkSYOTm/2PQhD91siNVRxS7NlHMv1rAgCiAEWF2BlKcegbL8gvQ5cumClWakvBXdKMccCSByLd9M2OhYrxrr9yheo4J1oMiRYVVJklrUc62oMFbX+wE7uuoRIRXGsBW6xiuBc2Y6VqVZDiwm5EV0oy3x0MuzKkx74svEXiewuhlmNdXGsIveZZnZncLUr3LesDenKUh7NsncssAtl4VdD3lEb/fVPwpUT6wAAN3Zu7V9KNZxonWPRTYVEWyDBqp4aNKteu1q78GLfIshRbhCLJR9rq6lf6KXsig1DpKTj6+ntqkhxkn0oa5YWlC3KYk5mnWO5uksYKRyr+Ow6zLHknek0QjkRymbUyaFZTt+RzdPZ79GdQpvLZ58bnjyxDjCKv3r/69/euumw4uZx+ac+17uwCQBvHOzSTYVEYyHBqovqNKvoPLc5P9fvJg8BPkBS3LHwqi9rjVKzSgxiyWrFozCeYsd3YQEWSr0/kUcOZXU7ojn1elYWZcYcx3Kitv5Y9nZlqDHjZy3kNcsmlNsJsje2Nz3/L23CpU3t2wyLWVmGZ04+/YH9Zeh5AHD3/J1Hh9vsp60LYvUvbF55+XMA8OzSKt1USDQWEqx6KV2zGpAZ5DWrrOQgelVmSgs1izetUhzLbFedQF/Wk+v4ztSqyqMZT/+Ljx7nrIUaOqTHLDiWa/gKQX9l2lHW5NDAORbmBy2HF8fZJ7YwM7RTKCvwk970BtPij5fSsfxpd9zFBe35+fzZ576zswwAUQRvnHyj1Y4lzAZNBe9EAyHBmgdlaVYD7IqRBLQkNXENYuW7643XrCKOpUwLztYyvcr2uhD4qUcKl+MrBq6qdyxGr1NJ53fmWPnsiqeKOBZiecNgSq3cHctGswR1Q83iHwzBsbA3Gz6C9DSaK0uaM5NzLJDiWK2DCt6JhkOCNT8KalaT7ArBK4U8a42NY/Ehq/wDmGqWwbEMoQizWpljGArZyjq+laYFbeh1oddJXbbLoniukCVhg7JvRw18d7WyX7g02uUlWNZrFluFQSVl5cLHpfPJvDrmCJ9sWs+cfHqjvx7fC7eG23fP32lp61GEL3inYiyiaZBgzZt8mlWuXZVxFggXI9QsmzbrpQdRULNc41hKu8KrrBxjAGNaLSVbmuNrUiv9wbW/hdDMYj91aKpwrFJAdSg9jmVu3JBPrWYLFxwrBtBoVo61CLsiimB9Vf1OOXi2vpqI70Kn/0fWr8RnAgDYGm7fOX+71Y6FHd4fT0ZUjEU0DRKsZuAkTA2IXfXPvGj7zh70e7C8KL5uGbLKfalzutNQtiubq6yNFyamFaSuu9mBK+4Ql9vfnG+yxU+zXa5j4c43T1lo6NSAeN5sp5XuWHLURynT+dBF3ZhmKVdkv41RlDwAYHUJ1lYcxpbUafX6/6dTs+ZYvGO1DuzwfqLTAyrGIhoGCVZjsAxlNcCuZGyuSsuL0O+Vkwq0xKanvFx0VdZVViYIYGkRlhZnMxuaKPtAG/qXombZtN7QfF77E6tpoTk6weyBn0U3DQLodkueJ4A5VhVH3JDZXJL+2LABBUinQWsrCs0yV4CdWFz/nt6VTgDx4/DGzq23d26itLUxiLX68RcufPaH8TkVYxHNgQSrYZg1q7V2BdPGjDVjvh4XVysnUxQSpnyRsg25HcC+NXy/mzNlzYejhNhh5tbxUiUghiE9gGlHNJwtIEcfEGE4Fck0aM72WJ8xBFUGkA9W6d7GkDXL7FgfOHP2o5OT3dNBJ4C75+9sDbdxpW10rAuf/REqxiKaBglWI1Fe5VpuV/NCdizckbxdOamVkF2ydCxzOZpatrjn+XZgjll3ML5o11tUgTIzK0skBqUMhqTVMn6fxABpP7NXLnbE3XpAuE+nw39KOMeUmqWTKgFDPtGQMVyTptR85uTTHxwsA0AngLfOvNFqx8JiLACgYiyiIZBgNRj++la1XVV2IgjtGTsuKZ6yogvMscIQogh63cSuSiy7MWBZ7M9IyZZnnkNZS6Zame+k462xcP/RhG5nlu8rhEtITFAuD0/I9LaX2GdLhm2s7jRDzWJSVUq12eoKrE41SxfEQoVdWYLnzz630V/HFx88eQcH3MaSLCzGwue7r1978OqX5jsegiDBajweQC0VSzkwX/h1ZuDkWGWBjrXQh4U+AGRHCJwwBLGc1ErG4255y5xjGyllrmhQbVSmacnhK2ZUeNm2TIbyb1PfrJC3tEuXMi7iWJn6GwSm5eMuXV2GVSm8xCOLV6aKrVoXv393cAUA4ochANw9fxuP13//4+0LYvHFWG//5E9TMRYxX0iwWkIHoGH30huuK/mCLtWBMaQV6QauEsNXSscqaFdsbOa2Aoyy1IqhE0elacVc5ypDpMq17F2L+3KiCCZh0l5VsbzK4lhhCHGkbtQurBM1q8RbJjGUZa7EWlmChU7/e/vPeqeCreH2jZ1b/Wc7ABAE8P/4M+1zLL4Y6/YrX5jrWIjjDglWq2iSZi2cVnRqsFSr2oJYQnpOqVNOiULLi59rWlBGGI/ZsUpXK4b5ls9ZqZbnkP5jjjVWdWqQDUwOYiUpVJffXkLAUrldVThWGKb+yWuWbm2ry7bBJ8s9wC9NLsNCNvrr3xmfx+dfvvXaM991BZ9/roVxLFaMRYlCYr6QYLWQJmiWpCOuUatMxyoSW9K1OfWNl/+CAS12wS6oVqDZdqVjVadWPOZC/m7HWU2c4liel6pLSyUQcx+vGCBWaFb2hrisUbArRuBnB+D4OioDvg+rFhPynD+b3S7r8volLHgHgF/4xi8NJkMoY772+ulf2ETH6vk+JQqJOUKC1VpK1yz7cyEW/9WchKAhdDTK6myJFNGsnmo2RleiWLtLmWOhV9WgVgydY+VuTKV0LJz2WHiYsTlYino7LscpaFZZcSydXeHihYyhYM9s56BmlZI0XNa3JGU5RJxFBx5HALB18SG+2MYg1umXPrP6sRdGUQTUtYGYHyRYlbH3ch1rmWs0q6BalZgotJ+ZxxzEYpg1S3kNLp4WhPTNfcrdu7JYq1fxyI5VsO2nfRyryB0Jis+qjixfm1XcsWS7wkSnsGBlYZaMuQReWILZONdW4NwpODiAvcPZg7HQ6X8nnIcTPgDc2Lm18KHkALfRsfiuDdd/khyLmAMkWEeCOjWr1GhVcccqRWt02Eez2BiKNKk3t05gISth7t464YM9pTRV51Um90YZjpFsV5NQU/2EUwZNN7D8eixPmxZUapZsnwbNylTV8QTGE+j1krq3ixdSP907BPBg7wD2DqATrn/oICnGunrztWf/wBXMErbOsfiuDQ9f/RIlCon6IcE6QtSgWXXlAjO1xj5kJWMZxOIHYxiPPIx8jqWzK92Ex/NyLADodRV2NdFkxDKxyQNCVhBLeYBs414x9wAA1m01r2MpkoMWi7L05syGDjzoVcqbCS5uwsVN9acur1268HhWjBX5Q9v1NYzVj79AdxQSc4QE68hRRLPMp4N0DStlVkHXIFYpK3V1LNBoVlnBM0Psik3AJ2cM5+VY3S70yo4a1jqNkry3VZ0neh3N/IxG+xftilusOUKJ8JqFcSlldErWLP5tBq8SesfzmrXCLfD5M89t9NfjxyEA3N98iPMnti6IBQDP/P3P9y5svjM63H39GiUKiZohwTqi1JI0DNZfhKnxFJEeG8cS1+JY/2VZ4Z4Jr1kGu3LaG7rrrnJu47k7Vne6aaU7VmaYxymIlRG+4s8fw7Q8HvR7DslQhV1ZI9S854hmjccwHqu9SkD4xilDWR86OO+dCADgxs4t//2dXgegnY515eXPPdlbBEoUErVDgnWkKVGzLGymiGbpHEu2t1SgoUCZfY4gljCqzPfYYLArHXN0rG56o3q9DM3KPD44S/TMLYpVPjHHyrArOV5lbJvr+2rZFShiV0oC3+o+gJUlOH0SxhPbmw2V80xjKIsPYm30Z8VYX7712gdb2xmLTxTSHYVEnZBgNZ7ih6i4ZrlITPEUXhyrvQp016y6GkX4fqriqmDfrChW25XNtbwUx7LJWPF0NYdV6Vj8MXFbT+GJDzNLrya6GE+s+idXA2c4NCm70m+C6z4P/KQEXngkA+TOwPNn4fxZtWN50kN3I6oQyrq8dumJR4lzffGtX+lNt711jvXM30+q3emOQqJOSLCODfU2dMihWRjEUvR+NNsVw911nIJYupp6g2YZ9kCOwJW43vQWVx3H0tkVAEwmqS1V6q7h4KjjLjpByZQny1r7WJUllFfKjZuNs9uBXvowiXZVHsr9FsXJt8Lzk0fgJY8nz8GFM6JOKdE51ofen9KsZ04+DQDxfrQ13D68st+r8XdIudAdhUT9kGAdMzJ/P8pnRLHm5pamhW/DWlokc2phBdWEsmxuV9RplnLbcweuFOvlnlfnWAa7YvS6Gbvf+cjkNRWrKBFvVLpom8e9AQAgFTrqSZo1W2BJyNuhi3rydDtw/gycP5Pxtk7H1KuWFb8vdPqfCJ/1ln0A+Op7X7/8HVdaWoxFiUKifkiwjh9Ooazy5kJWqobSwIrmiKTrvKHC3RzEcu0EYZM01NlVbip1rG7Xyq5ww9X33PFvk17JKBtSnQeGIFY4/VG2Y8XcwgWRUt5jKDkW0utAx08vJAvXLCEARJGVWjHwdLLRLFCFslglFjrWRn+dJQp/6fd+CQBa6lh869Hbr/zjuY6FOBaQYB1XbDSr7GgQ71L43JemmesEJXV4LxbNKtK/VNAsXh/la2S+wJW4Rm5bS2xDaq9WjByOlYG1uIQFur2Lq5M6Y+lA2+t2kt3OP3LA21s8XX6RLvZgp1mGuQGe3IQnN+H5s89t9NfxlRunb8PUsf6bP94mx2JzFALA7Ve+MLx9d77jIY48JFjHm+oLswR/CjqwuAiLi+KsveK4OjPNKqR5FtdIIYhVVmt42bHkK2UpzdBna+SeF3csS7uSsXcshyn2shxLtitzvCcp1Yq5qJUc0+JlC2bKxYYdRYlfer6ij5esXPbuFcVF1Uo4tTI1yzz/0pOb8PvwjsIwvrFz6/J3XAGAXgfWrFueNgScoxCfv03V7kTFkGARGs2y8xpshSUHotiDxwvUz7Xj6kCnjACPZTSr9Fl3+OiOcLEsJXClWCP3vIhjZdpVRnf70uNYkHIsYWfqYlfZOTVdlhCmz2PuR9x7fA8iaQ/Y90r1PPW9gb6fpAIV+9Z9l8knGNMsPDeEUDFfkrUimdNzT63/4dXzEHi9LvzCN35pMBkCQLfbsiAWAFz47A8DwH/Y29p9/RpVuxOVQoJFTGGa5Wt+m/vqh02rHi9QGJX8iu5Pdj6g5cqsAEuvWUuL1U5oOAlTxUyuauU0Z4uQLsyB2a4sm1P0uybN6gTg+8kkOWFoXXJX7vyAQtRKXoWsXADgJQ4UhskdfDzF+9Ev9GDB8VQMHZvomqNZcihroZ88nj176cVpY9N7mw/xyamNljnW6sdfuPDZH/6OlQ2ganeiYkiwKqOlu7YDEGhcKhdKteJ/6jC0Apo1I61Z7HqWeWl0yGelwfgKesnSYiWBK5ncjpVpV07IjtUJoKPa1XKvJjVs2pmpi5tLr0xBLD5qpau4So9Dmbbzyvum498qUazR/TKCWIwLZ+DCGQBuWk/22FiFfg9OnYB+HxbSvvXU+kUA6HWBJQqh2ATnc+HCZ3+kd2ETqNqdqJiWWkBLaOPexV/iZUiAWa34tzlRlmblCBXkgL/8dzsAcU2CBbkcy2BXusCVtmnnFHQs9CpBrcy6plUu7h82he0Od+15WsfCoigB1v6Kz4ZbBrEspzMvju58w8kKN9bUP9WVZG301z/VPw8AMIp/4Ru/BP4QAFaX4cf/ZJuCWDBNFALA7Ve+QIlCoiLaqACtokU7WPgLvoAHWKqV8H6nkl7UrHympZvgpdz5hsNodvkXKq6a6Vg6uyrYsD4IYGlBscwcpHzLc1iI0rEmE6nKCqT5c1yKzZlm5TuRWPiKR3SsXPuNP98mYfJgLEpHJ3m9DyuqSXUur196HpZ7yx4A3DjxkP2h0i7H4qvdb7/yhbmOhTiytOj6T1RJSR0ZXNWKJ99lyUmzMufOKwsxcCVRp2PhsTU7lsGu7BGmGQ6C2THVZZGKqFsM4tQxzshqxXUcjS2iX2Eo1iAmd8uWJ+tlhbIEr+LROdbSQlInJ4CJQgC4sXNr8/ddAYAzJyqsYqwIDGLdHQ2Gd+5SEIuoAhKs6mn4PjbcYedai134opL7sqTTLFbhbqlWpVwXdYErSBdy1eZYwDmWoFkoEEq7yh24Qq+S92S5lTo4tNn9qtI8fQJWrUen7Rhi3a181vgqLxFXKC3fMMjcmoWpwExkx8Lxr60kz9kDADb663+gcxIP6Bff+hX2kT//37UpiLX68RdOvfSZzd7C6PZdqnYnqqDhF/+jQjN3s03zAjsJKBK4SphKSRHFUeYNa4taIeG086SNP1XUrEGJLl0o21VBtTKAl2Rh4TnWFUtP+LYgOtNS6Iv0FcColdOQdHVgnUAd/lFicysuYMbQemyCWinvLeDhHYsfNjoWA/fzh049ja1Ht4bb987sA7SvJxYAXOF6uz949UvzHQxx9Gjmlf8o0rQ9bX8JyTKA4oErgeJhJNQss1rpogVBkLMbACu6cnWmeaULlTf0VaRWjIJxrMw/CpSmZcohTluJOqmV5ZTSuHstNcuyGL9vcXOGZdRKBh3LUgr/0OJ5nDz0q+99HROFAPDffbZNQSzg5s+hvqNE6TTtsn+kacjOtuu6mcJsAKsv5h+MBvsLtvrjPQh64HWgm3chrvMhOgWuZOpPF8r5JpvAFZ8qwkeOIyU7lqWvOJ22QqvbRLPSBxXXmyNqJWC4mZEprFKz8q00jtWOhV5lUCvBpw+Hivco67FYEGt7d/biRn/9o1EStrp66zVoZxDr9EufwZYNAHCdHIsolYZc848Nc9/fJRWzixScckdzfcrhWKhWyVLHAADdIHnYwybPYZplLqPOF7gSqMexUAF7PfA96HbA97kib0me5IdAjrlcUCkEx8r0DMMfBZlntDipgJc0CPV8iKfT3VQKrzXK3Yh94V3h+4zYh6zYYAxfLr73FTsthUQh8szJpzGIdWPn1sL7TwFAHLcviHXl5c8BwDCOdl+/RhMUEiUy9wv+8cNpl5d4fHIErnhsLv8VzGzo5FiBMXXiqlkMcygrjEorpSrdsXBg/AOmsoj/DfyqlDsTy1xhwdOWh5kWM6owcuuSr1hmrm+ofW2WDtyEKIJ+F1Bx5sJCp//dvSRR+MW3fnkwGZ47NbfB5Gb14y+sfuyFvuePbt+llg1EiZBgHQPKukZZXv7L1iwbx+IDV2YsNcu3eE8Yge+XbEW6pWVWKMsupVwUCkEyRbEHcVw0G1sE3rEsCtC1uJ7dnge+Nwv5FHQdxNzyVN28HgvF3MNXePj48OH6qsPHM88lALGBO6IMYl1ev/TReBkGMQBsn58AQK/bviAW6zv68NUvUcsGoixIsOZBnXu93ACFvUx0rE3LIs1kkAB7teJBzTJfacyOhYGrKrCJh9m4lAAzKj4j5k8bN9SjWXIyThnHKjFqpVw4AIwnqRv3SnEsMzrHimKHMJihTm591UGzcjuWkqfWLy6d8GBa7d66hlgwDWLhcwpiEWVBgjUnatjxFV2mXK2ivICWYAD51EpANzWeGc+rvGRKWH43cNMpBK/Hhqtyt5PyjLlEs4Q4Vr5z1inWxab3ERyroGZlzttjONPMtzqaDyKPk2ZlIjvWqlzGHsNGf/2j8TImCrHavY1BLHY74e7r1yiIRZQCCdb8qHTfz6uyRkdJmoWXfxu1wgp3S5Qz5YEmiFVDtANhIuVaOqa8Hhuu30JnLEvNylHhrkPZH6t0eLti6xKmaq764GYETdNNJTK9SjdaG8ey/LvCyrEAnjn5ND65sXNrCNtWi24Y/Qubp176DAC8Nx5SEIsoBRKsuVLF7q80v4LkViXUrD736AEsuD2CFYDKchDmgFbxmmhXlhZt7cocrDInoZRdLkuPZpn9yX5G6iIop6bGOwpn/ywQyrKZfJqh2yFxlNy+mtl91LBLbUJZlklAmznRZ9Xuw+jf9d7o91oZxMK+o2e7fQpiEaVAglUNBy/bvrPcI1Bb4KqIYxWBXXJ6NWnWrGWDlyeZKGNfcIM91rvTzZQ/mJkBtF+jTuPqTBoGQSHNMp/7scauGLWFsvAs4g8ZiwXGEcRpRRN7TDiSqVn5HEsZxLq8fmmjv7604QOA9/4OtDNRyKrdafIcojgkWA2glINQQ+BKoP5iLPkyU71msWbcddLtTvODOFdgehvtK3LAaFdCLVeg38aaNat0Mu0KcXUs5b61CWIJJ1UcK9RKXJdGs4oXZpXoWN8ZnMQnX7712mCiamPaeC589kfwCU2eQxSHBKsZFDkO9atVDvhrObtOOA3bcLWTNMupAMtMHEOvV1MCC0kmB/S4/8bQ7bl5FeLUpcn3TY4FxTTLYdhxgbVoXrSxK8QmXWjZd95AFEMQ5DqgBQJapTvWjOkmbC6fZdXu3gdb37KBKrGIgpBgtZz5qhXTpkXjbDnFy9ttrihlR7Pw4sdShIFfuWZ1O9DtKo5pFEEUQidwFqYcmB0LpppVYoW7YS3FGU+0dmUqHi+WLjQHsVjXqyLTMvpe1hyLKpzuMWQy1+/Nqu9Pn0jm3AwjWFqESZg8wunjyZWLAACD+Kvvff2pF65A4dkn6weDWF/efkBBLKIgJFiNwfVQNCRwlSlP9dgVoyTNQrXiC7CQ6jSry65DfIQvhoiLl9gXgeWzKyTTscB1P+Q9UQs6Vr4Jj5GKSrKYXeHe63UT/8gxVQ6S40CjZh0Mkn9ilG5xYWZU5iCZuVf7Rn/9w+EytsXClg3QzhmgP7V+GiiIRRSDBKtJVH/FqgSdQlUwc44lfgHHEgJXSkrXrK78V34MUaQIFNk4Vm67Yh+0cSyw3g/OZyv3AVfHYh8tnsiTHctes5RBLJ1FFY/xuB5x34PN0+IW9a07izLUExSeeBoAlhbhveGtp164ErcwiHX6pc/gEwpiEUUgwWoYmQekIYErAVmkzGrlWW9FjsjBGADA7zprFiuI4e2KlR7LF9dSNKvbTceucI650JSDy+ylZLXeLPe1dCzI2g++n6fYyH75SiZhOV21hJIsyAxlxdzDBWcF4QrkEZvjLkSnzp4U32DpWHwQS3ashU7/Y5As+otv/QoAxAB/9k+1LIhFlVhEcUiwmofumDRTrZSUFbgqkpfBid56Js1iFyderWxmIeTBy38+00oFrqaDiYyhF7yO6hyrSGbQfgnKEco7QS4ScjAt6T32ezguu2ep6FgAwO8ojVSF6b2UmQRMqbYd9r1kdVm/UhxLHgn2HV1ahK3h9saHTrXmFxcHfzsh9cQi8kGC1Ujkw9L831Dskt8Eu2LEALFJs/jrfaZamaMXTpqVzHjDX5W9jMCVgKLvfNnfZvsgFgPHn1l/bdnBCyCdLrTbwNHYtqTJ3sNkx/LA4W8em/HgYOwdy7KjrFKtnBqi6mCOpUwUPjc4DwCnNuCL3/zlElY2DzCI9e92H1MQi8gHCVZTEf4+bgU9a7vK/P1ell1xCJoVxanLnmvgSoeNZvW6aVeTitkt4R2rRLviF+XqWH7gnO1CzVKYpeq0z9y9LKUrHN/iMMdi38jMkiwMYrkOwyaUZVBDPHz2DR3sg1gjqfuJwbEur13a6K/j840PGQvjmwoGsb5r9QQ1difyQYLVbNqiVjCNYJVyQhWxK/4a4E0fvEj1wO+KamVvV5ZlzjoP4HvEY4mx56mL2Q3wAoRLc7WrbseheNzSsfjdWErLewM6x5J7dZbuWKXcXWgTijM4lnmbfPcpB3InCs18YO8kAPS68MW3fhlaWIYFAKem1e4UxCJyQILVbOptIF4OTTinDGG/CCCGThc6XYCswJW5uXYmvGbpZjkMC9/s5lq4Y4NgbJkNSOXdWIpjjUf6lVqfZuU6VhhOb76bPjyfU3npUWTtrlVZfMjK1bmLF2MtLog/2lw+y4JY8L453VFcDJydEAAoiEXkoAkXQ0IFu7S30bHMmK2llO0VmsVjECsSV93pcaVj9st2HGG3J851g2BjxlKoYR4b5lh8KhPbgeoUoqhjZbY8TYcJ44jVRokY0oU5HFp2lyLzQ2ciOJa8Hb6vzgbqHEtXgFWFY31g7+TqCvSC+MvTnlitgwWxHrz6q/MdCdE6SLAaifAbUHPZaBYdrvFV7tOq+GZyNeMzItV1ib0hmD7Kxu+AP/273QvAm66iuFqxa6dX4zdYiGOh1ZkDNDkdizvhx1mzHqFjxfFUo/UDKh7KMh+14o6lq6xioSzh55k3ExSvzEPHymzqce6U+lgnQSzfA4CND51qY5bw9EufxicPX/3S8Pbd+Q6GaBckWM1D9yd18x0LQc3K0eqz+AaOpYXEmv2pXFd5msWrVWq1RZbviarN21XpQSzltRkdi81jY2Mszo4lHZpsx/Ig8K1GU8SxeLvSiUulk4KzUBabuMYGJ8eSg1j2YBxLGcQCrhKrdax+/IXVj73wuwe7QJVYhCMkWA0jM33WFs0CgJ5KWarWRxbDkBKCsxWZ12WhWYbrqE6tUu8pnjvzFBdOS8fKjEYY4KcItHcVhzVqdqzWsbiQleXml1KSZbg7r1LHWujBoiptZ96ogo5VsOCdr8Rq6e2Ep37g0x9aWgWAh9TVnXCBBKtJWJaDtMixgul/zRe/Eu0K/am4xgUAnlvAyUatZm8u4FiBl0SSpJBWyXEsPx0h4xfuailWjmU8OgrHkpuRBjC2yL3m6OAgJwdzO1aOnrRCz4V+gdsabDpgKRzLLiC9qQliPXN4EgC6DydffOuXf/xPtjFL+JnehU18TjPnEPaQYLWTFjkWQ1fqVO626AJXuhVlXWj52qnU69zS7NUqLlzVrryhj9es0nOFglpB3uYhZsey6diUGoFmEPbtXpljFbxXVEnusne+DCtJBaqW4+pY+W8qnO5qy72qdKz3nT670V/3NjsAcPq5VgaxaOYcIgckWI3B9bd809KFwYua17nn0fSVcovK8RoQGq/8xfaVTrOcolbiZ933AG9X8gWPnRFlOVZH1TW0SIZN6ViW/TCBBbEsRuDqWGZ0te2Zw86dLtSVWKXmZq7YsWSLXbDLFW6qDAqDWO2txOKnf6ZSd8ISEqxmkPtv6EY5lg7d9b4H0AOwuU7ExkcmJe0lQbNcJ5OWcXIsy4afqFkFWyTounYVR3Asp8BVrGomriMzlJV0ec1KF5rvHMx2rIyfK4aUMiFpbPwLrk3z7WcQimM4IyUK7bdl85QYxOIrsX7hG79ovaQGgf0afvXxPQpiEZaQYDWAghmKpoWylMhXa/4VvPGwiEKx5Qjk3jn6g+IF4HXAc6+DUeYHLR0rR7hLaUg2tVBV92FnY3C1K2Q0cfiUzrHE2FIFWcLZujLf4GlSiqoz30s/d3UsQ1BNnh1Sdixlib28ClyL4FgsiPVPfuHPWI62UWDT0U+fOEf9GghLSLDmTVm/2ZvvWPyW+ip/6tpFs8zwAlHRPsHF4rDL+AJlypMf5KwTclUlZeAqR1F2Jt2Og10VnI1TkUuVVh1q2nnYtCuz2RCl5+u8Kpk3yWZ+aABwzxXKazTMum3pWGxb2MLPpROFS4uwuXwW17Y13L7azr6jqx97AZ9QEIuwgQRrrpT7d3MzHStKF577WSddPs2S92SldoWUNw+3wbEK9nSwdKySc4KZgUMPAsvbAlQvOgWxgEsXZtSeVxnHAgAP7IYBpvOKP+nYbs7tWAa1YqBj8etFx5KlSuCclCh89vAkgNfrwv/4Wz/tNuJmcOoHZk1H5zsSohWQYM2PKn6bNyddGKlu6LO/hBeJZnVqsSvzixL57h8s2jELANKOJZ8gNmrVcSrk5yN8yp9OR5DhWLFJX10dCyxdkztp7bvtW0bjfA8CP7vyXbvVnvgjp3qsSXpzPC9brdIrT83AKPdi0MG/85mTT+OT7d/8F20MYlG/BsIJEqw5UenfynN0LKVXIXh5cxpbN5dpNUQxNeguaoJL+QEEQWnCjG7RY/P2TAvh7aNW9o6V1KHbyajWsSyu/bJjjTXWxaIstk0cjF9P++Qme2NqGmbjx803wsqdz/jAUq/rVpJlf1/hmZM5T8Rz0h2Fz04rsVpa6o79Gt4ZHe5+5avzHgvRdEiwjig1h7IMXgVldGQwaxY/MTZutVPERb6m2c+uk/kjF5hj+dOJaMpLQkrrcv/qdzruoSyhJFuF6Fgu22wTx5IjRjaONXGMkCm1SWgQan6z5Xbz71F+y6twrMMBrK+KLxq6Nmztzp4LicJzSSUW/MI3fvHGzk27YTYI7NfwZG+RSt2JTEiw5kHFpR4zqnYss1chJXYWNWuWmPrKuxabhTtinx/0g3LSgjKBPzO2InMAd/PNLWhubs4OVqk6aSgPkh0r5FY9iQDs6pO0q846ZQTxKrLdNo410Z+B9idDpmOZG7AtLQIAbPTXL+8tA8B33T38K7/5M7brbhJU6k5YQoJVO7XZFVJFKMvGqxDdL9wiQ1JqVqUqabPwsoJY1pP4gvX9fUwUcMnF7wp0cizP7gwMgpyWoQtiZZY6Bb5V50x7x/I9RQov8yOQa7szP+IUxyoyf6LNPhSDWEuzIFb+Fc8PKnUnLCHBqpea7YpRln9YehVUP/8gr1m6RZUSxCq86xzCV+mvo7LmxmG9UlsjKDbTc2o5Fo7lMF0MTsYizcljieBYTtPUyGucSGd4pmN5fvJwJY6tD66XRB8tAoIJmY6lPEPMyEEssO7wzhyLNR199luHbXQsvtR99yvX5joWotGQYNXIvOwKKSIK9iErpOJOlTO6AIFRpAr6hNNOK6ZivF3h8xydVhHlVbPTSWJXRfKDPAbHclOr9FDzORYrb88RjLERO52FCF5lTu+KUzpOl+l0QNgOE/accoS9rngyMKkS3m/Yb4eD1D+VjpWJUO2OTUehtUEsliV88OqvznUgRKMhwaqL+doV4hoMcfUqRL7G6EI4BYND/OZ0po/i8CXzdSFLTw4NMgckAkngiiM7lsMpZpiwOVcoazwplOoKAghjRfiKwe/b3CErfmk8OZaEuzpTwfs9CCOrYJX93nMqeGfwiUJsOrq2FF+99Vob+zWwuZ8pS0gYIMGqhSbYFSPz12g+r4JcUzjnviIa0oId6ZUSl+/4KZv8oE53LDXI5tpZVjf2sTQVIHOsUtSKJ4djRcW+aIFvsRVxhldl3qOgO1j54lg2b7NM4UH1xVg85++fBM9raZawf2GTC2KRYxFqSLCaTUVmpryM5Paq+sm8DAgBLVfHqit2lVnSbv6pZQGN0q7KCmIBQDcoWa0YOUJZUeSuWSwKNN0MZfUb/jN3MX6yKuNntdMcaPZvzI0zTr8u7Gn7vqCWjpWvGIsPYrW9XwMrdaeGWIQOEqzqaayy4G/SuXuVa50T//7M+JBl6rCiZlNGLBXH98U95FSbbIhdldIPAsutrGrn8+7kCkNZcgWYtCEe38Sc/6Ae3Y61PGQFQ1m6leRzLKEAi0fhWB5AugmWwNLirBhro79+4s7y2jI8+63DNmYJsSEWAFBDLEIHCVbFNNauACCqRSxs7qGzdKwigaUFu6bwURmVYVMM+UGnABI7Sq73fDG70jUILeJYQiV7t6PXrML9Ukt3LIc9yauVrod6Fk47wA+cq7uUZe/Jj7iX7B3LkpRjeQAAvV72p+Qg1h//0p8ud2D1wLKEu69fm+c4iKZCglUlDbcrpM6G7wYyh1F8nHiRNk+/U8vecEvPxeB7WiEwBKgs665yOJbhJkHBsYr06hQoK12YXa/GNsGmrCxWv4vfq7g21zK4HBX0Np+wdCy3Yqz0LuhnORYLYmGpe3wYA0Abg1iYJfz2YP/hF+leQkIBCVZlNNau5IRgQxxLh+46l2v65BlF5pM2Y9yfWruKNQ8AcA/hlFXVLuBbzFWMjlWiWvEYJk/UrS7i2rJbDqnjMl84LtNLP4Cb7yg3rXCsDVUxVqZjXX4C1lcAAM7fP+kttrXUHbOE71tY3n39GmUJCRkSrGposl0pqaLhuyvKAZQ7KvnyzAJaWKoVlPcA8ALFI4Vdq6t42ofTahMt5zPmsAlisRPE5rprPx2yPWwATnNUA0AcQxjaVmXl+x7I3pYsp/B+8HznhZToWIdD00/ZvtpYsVqaknPLZ9eWAVrbEOvUtBKLsoSEDAnWcSLzGtM0x6piPPU0QTWMXL4zzbpfe6Zj5Q5cGRxLrrI3OBaLEpUbQpNXaONYQsgqw7G8WVspy+UL61K+4tRWXl5CHOcyZv2oGLb1WJrBCy/LjpUZxHrqCYBpqTu+0kbHWv348/iEsoSEDAnW8cD+PsFynSZHFk9ZUFwPZaW0orzF8o6+JaC7DOsq3AWcirFkaZATcDieUDNXoO2KDC3P9KEsXTZQ28TBm01BY9jxZtExpCCdNEuZzbRxLH6+6hLjWMIesT83lY7FR2wX+wCs1H0raqNgneYiWJQlJARIsI4BrvnKJsSxMsdQpADLYBJFtp1veBEXXhrMTIuvxdEFsUqJGOV2LJv28Tmw2X+8Y1kWWqUcK32y8dla1yAWGwNodkimZplzxbnjWAZc7ys0DD9HonB1GWBa6v7sw+HVW6+1siEWZQkJDSRYR5181WBzd6yqKTFRmKORmPvuZXOzeD50pNr8ikraM/H0tzcy8s0t6HkwGtuGFDsBBL5bTX0UQRAoDkQptYjySPgDJGuW7YyTMQQug4vsCuZ0jnXAd8DyrPaM4FixRdcGDGI9c5BMTfhXfvNnslbSOChLSOggwTq6FGwfeuQdS4flhlt6VTW7sdNNusD77gU6BjyjD02kqGFsd6ebk2MJ/mE5IUyOtQBAmBUHzR3EyrQ93Ezb/lj8/aSOZ1QRx+Kx3L1bu6Ivmh0Lg1jr/XX8J2UJiaMECdYRpZTbGAvKQcE2ClWTO1FYSryqsHjN0nnGRVkWYPHxCZtLKX8FtXSszMXqMmgGBREExWbkwlrQsarQYINjsVRmZlgo8BTb3zTH4u+FXVlSvMHsWIt92Fw+uzF1rDY2xKKOo4QSEqwjR7nz3jQzjlWWuvEXDOEyJm+4fSpQvrJWthujwoX5ymu82VQU22f3i0S72CzRUE4Io9x088iVqmGOYxW5nVAIZelKxHLkJefuWLoGI57GsRjLi+IrGMRauR184M3D6N8P2xjEonkJCSUkWEeLKvpvNdOxagA3vKy5GuXdWDyIxb6+uRaVccecSiwMKS3mWOaYmbhYF7mIpSdWq8D1GAvM5exniViW3rtqltmx5BPWybEOVFMQ4lb4fkZMEVSOlRnEurCxDgD+d/bbKFg0LyGhhATrCFFdd9Mj7FiG+ERY9i4tdzfGAHmLhAqs0ATW4GeSCFCuevI4tipaEhzLxi0MjmW/k3UWZR9nLOhYoXFNto7Fm+z0wW9aZtmfMo5lcKzV5aOQJbw9OgTKEhIcJFhHgnLTgkpcr4XVhQRKX7Jw+Qynj3yYr6UVqGqRbgJmZvmgGMbWO8RmpsU8txay6JldZThbhX0DKnMcK/fNBPhBS8dyTfmWniuMI1joO05PzS8fFwIAWblCgcU+bLyXHLM2BrFO/cCnL/QWgbKEBAcJVvupbVqeIxzHigt7VT5y79L0xa+j6jgA1hXuBoIgz3XWyrEcZ7zOfkWi03Huoq5zLMvG8Tp47cjEclYfRnHHiqPZA1mSKqXElWoO3+zWB1UcyxzEet/psx948xDaKViMh69+ad5DIJoCCVabqSFwJVBKm6AmEEuP2iihz1LhBVgsAZueRxEEuSwth2OpR2U4OhbpsByhsklYYUmW+VxT/MjubBEcy+pOjFiUKsZgBACwtJihWTrHYjapjGMZHOv82vpGfz1+FEELHev0S5/pXdjE51SGRSAkWK1ljvNJt8uxZJdSXuLq/Cp4muc2aK7PuiCWK8yreAKptakNReNYNuJr0TA9X6dT2bEy7qx0sV7L9yY7x9qxzKEsVmvPJkm0wdWxPO6/rqwuw+qdwDvpQ2vLsPAJBbEIhASrnczRrpB5OZZTaMEyNDWePin+baiomNkOy2Is5bTE+HBNTpnxLCu9VL1Sh0Pr1aSPstIbynKsIgjjcst5Wp8tgmMJUpVvsU6OJfwJo0wULvS1S2t1x1Fs6b41GQ9v35v3WIhGQILVNupPC+ow/HautJLJMqmXL482lziWvWxlbVSmSZjbMsl2wmJXPZdEIZ9JtoljAXedtuloIBNnNWIoxbG0nTb1AzaE6AxbqTBd6+x8ENg2hkgWa4GTY3ncg31TV+0K3v/A02efWruEz1sXxMJmDRudLjVrIBASrFbRELViKHs7lR6byVEpVaRKaV65wkwsNsrzZhKgq3B3uPqyj4QAdo7le4ptsnQs38ujVkh1syJW2yJLepKB+YTxADwIIzcbFr6zWIAlIzcI5ZE9kn1f2eJ5xzIEsd73q/fxSRuDWKwMi5o1EECC1QKi6X+bZldIkXIiHbp6Kcs94HSRHqtezPe1yCcHljutjML2KLKaI8+A4crte+DrP5vpWDiwfK0QUnMXGjUrt2Ox8ctLsJdC5e5xvsVC91dN+nU3x1IuVsLSsWS1YtjEsS6eanOWkM2ZQ80aCBKsdtBMtWKUclucfZjKvLqy7gesOY5VXtiPD2JBrniVq2PxamWoA9M5VuzYxFKAjZZfvmGTcee4NrCYTNzeXy1e+qGhfsfil6RbGHMsXRBrc3mWJbyxc9NqfY0By7CA6twJACDBajpRvR0EcsP/NrW5FOVokcBbpu6Xd6UxpDnivl2sEGe2jPIcC0GvMkSt5OSa7FjKUdk7lnmcZsdyhTmW4K8GcvcmzSBLrRg1O9b2rtW4cPJBHSfW4IXXkixhS8uwECrDIkiwGgxTipobNeUjM7BUbtMpeXU5FqvMDzIaEsQybhd/m5gQrLKcgFk7Iv0B7XdNXmXGtytmt3EgGwvUrSWf+hSPY9nvNsXWyV5l51j2mjUcWo3Q4FhOO1YXxFpv+Zw5NwYHQGVYBAlWQ1FWXDXfsXhqbuNZ0Srsvx/FB6Cr0GFP9S6lXSRnM3lGJA2J3anXLdYj3mmiHhnzDYPK1clrtFcB3iYnE5hMkrHlLsl3xuDfFYSybBa5vKjWrG7Xaseag1iby2cBAEbx1VuvtTFL+NTCElAZFkGC1TjMxezNd6yoGqMy75N8qzOHrxh1fkVwXZyY2ruUQMHwFQ/eQig7TT7HwgYElnqkdCzX2W8Y8m4MPLGcSfmQKRLKchi+dSqwinRhkVCW2bEW+wBTx9IFsX7/v/Kh593Yudm6IBa7kZDKsAgSrMZgeZ9gMx0LZ/HD8Te/pMmVer4lKFXpG+LyM12O5xddjufndxoeoUF8PscqPpKUZtktDeVSeERR6p+l47xI7gOh5jdJnY5lw+kT6tdPrMG5pbP4vHWCRWVYBIMEqwEY1KqcG7urRJgguQrHMntnPT5X3RdFk0UtMf1k2YYKVCYx/YH6/YYgllDhruwRr/OSUTq4yBwr02Mst9TzpsPzwM9V8I4Ivig8LBvrG5BnCczAItxVm2OVVeDf7mYNVIZ1vCHBmje5WzDM3bFCY8f2hsexLPODPOV+VwzVaaWvSG8eap1iP+1w56e7YyHyzIYGDPf9uTZW0C3f1VzN0jY25gp1wpr55WByludrlNexdNMTWZZkyZgd6/F28kSZJWx1swbMEv7y47tUhnXMIcGaH8V7h87FscIstSoXm11Um8wZvi72Y7AJQJbyvUwPCUXBbFROC2ToHMtGrSzHgG/L116BEaddk8XYigSxAj/DsQRy7PmcjuXYzMyMzW+aFVUT0cw4li5LCAAvXvxk/HtjaGGWELthff+JzXkPhJgzJFjzoMS27HWmC129qs4gVqMcS1kpbXNDJXdd9ILplVh6pAxp+oq2MDv9waJYO5Z91CpzVPwb8jkWC1zZZ0udcHIsxPddUrcuS54df6NmWbZvmLVl19xSyivj+qpiCTa5QmUQ68WLn/Q+2IUWChYrw6I692MOCVa9OKmVU1CkUizVSjlDbW3YrytHfpDH7FjCMKJCPq08sLKn8f9MDSE9GOdbC5XD1u9nTGzFUhFVJgbHUsw/7eJY5pxgmBXE0jkQr48oEIJjWVYgle5Y7G0Rn9s1apYBYc/ZhD+VjmVGGcQ6uQ7/5q//PD5vYxkWu5eQ6tyPMyRYdVH1ZIJVOFYp2cAijtXYOYIyvze5vYo/jtJa+Gslu+nQk3+qH1457RtUx7TbKRRONfTckrF0LEGtKgpfAedY+UJZAnx1fKqOPmtRpjfoNQsdS1GAVSSbnCZ3EIuVYbUuiEV17gSQYNVEPaJQomPVWWVVIjaXgYLhK4byq1MkXuUpjqDnZ/SY5J1G7TeyuFTjWGFUqJgJ0o6VeUU3O5YcuJI9BleRGcRypRTH0mHYK/KPFFlazcmEjiXknV3Z3kue5EgU6iqxXrz4SXzSuiAWm5SQ6tyPMyRYFVN14EqgeElWFWqV78/f3JpS6ft5+G9PdQean8M4fXht2znlcixdLyXlYtmb/aCQqaD0FGlD6qv6flUXu5oNhltF/Y7ldharqvT60wBSKX+mZToWu4WQRw5ioWDFd9r3117//CYAbE3GFME6zpBgVUbNasWT43dk1fcGNrxrQ2688g60/qjxqUAhvsAK6DMWU2UcS1ax3C0VPA983+H8FR0r1x8YuiCWTQGWAGu7n62nErkdK993y/PB81Mf7vXKDIK7FmPJQayT6/BDH/5BAPDOBy2MYL0AABud7uj2XSrDOraQYFVD8StuQSOx/01ZlldlLsRpi4rsQMOKSskP1jnHIgAAeP5sbXJ5u1CJVcqo7P2ADxeFk9l/nRyLL/RB3bHfwYlj6d9dQ/gK189W1OsCuOxDhu8r2pOqe7RKT5TInxU7crHnMUAM/a7LcN3JLMYSNv/HfuR72luGxercKYh1bCHBOrpkXp3qL7SqLY5VxYp01/ySanfMYMDJXBvjgfGglx3EiqOk1bivGZPZsXQF1FEMXW6XFlRZS7sqUollGF4OxwoC2xJ+33M4zc216h53YpXoWK7FWBjEEhyLlWFdvfVvShtZLbA6d+LYQoJ1pNH97m9pDbsTpTiWZbCqFsfKHE62hbg4llmPhFlc7B0r911pum1HNyqlzzuPjZnJg5HdKIxyapYZ+2K1OM5+W9JWowGOxWAZQyZYN3ZulTWqeqA6d4IE6xjALgI1N2FXYnNlrah2zT4/mCNsUr1jsTsK+UeKGADAcxyJ7FiZQuA0R16n43C3P+uu3jXfJDh9hNzJLDuWQZLkkTgFsQxnh9KNynUsm9sty23WXwS1Y2m27lQ6iMXKsOLbk9aVYWGd++8e7FKK8NhCgtVISv81V7VXNbPDu9OKildW1RDHMtxRaDls1T5xyhXq7EoOYjEL7AQlzHwsE4biEUPHwgBJjtKrMOs0xur1fCeIjWMJDfGVFqJsGMY/L962CkoNYsls7bq9/6m1S96FDrRtUkKsc//Q0uqIityPKyRYR5eIe9Q5o44NhgtAueGrzCtNueXqtTgWP175LsJsjI5l9gBz7Mr3IJpoomtSbU0m5iCWTobQsQoWtstBLKdZonUpsNxxLFarni9elTltUWrTNIlC8y5lTbCUFAli/diPfA9XhtXWOne6kfB4QoJ15DD0umyUY9UGXjDcWxPlpIZcoSY5WCmspN2M+TJsdqxJSUHWIvVY6G38RjipVfby3UuymIiY41JlxoXdi7Ey127ZtWFpYfacbXh7BYv6uR9zSLCOCpZe1RzHUv5KbldT1nnBdYqK7ZODPI6JQqeiqyKOJaALYplzeZ5q8mlXfK+QWpnruHM4lnmvetx/y6EWxzIHsZCT67PnrROs/oVz+ITq3I8nJFgtJ8fcLKVbRe7AQ9XFWGznTPJ1QM9LvQXveRdh+0Ynu7KhYD1Wpl0huR2LlXbJRBbfHTZ9stmx5LSdYcDetAVrJrqjmpklNCyr6uZYBtDAsM49ujZqVw0WcClC4nhCgtU8Mq98kYtXNTxIU5biRKqHbkXl/70vUVvjhrKPr6AFTnbFcnyZKmDvWEIQy9Ku8Elux8K9WnWHUhvpYQ6dtBzzs0c1xzhWiUEs4Q1PrV3yX+hB6+rcP/YCAMQQP3z1S/MeCzEHSLDaQ5GJhAWaaV32m2Z2KYF5taWo2rFUk+65kb4eMpdijlUkdmXjWLxm2RRgWdoVj9KxLNtHFZfXzIZPUaRt1G4IT+ZzLJ3PjcztS8p2rEkIMX/HbiztpRgghlMbqddaWobVv7AJAC4dYYkjBQlW4yniVYYrRHMcK2OyD0edsl9RDXugYseSW165NsHS7fxOp/zMoHpFqgELmTgMYuWwq+J4nlVasCBRlIigfdo3M5RVSRyrZ/V2nVbm7h/xl/4M3UhItBISrKZSYrxKR6McC7e0LJdiGK7KXsW7F6ndsYoQxckD4hJmg7ZMsdmkCzM7VBkoXvCOjpXPtGy6lgP2W3dfeGMdS/x0Wq1Wl8U3KPfSBpdPxBkJ45uTdqUIgW4kPN6QYDWMsN48YHHHKmui6CpsUh4b+y3PJkkuUeZ01FWPlZMYIIYwTATC98CfRlGcHEuZ4yuljCnTrpQmwb9YxLHw2h/FuerEuSVkkilwypii75uWL8TDlJvg2qJWdqwdqQkWG1Lxrqf4aYxgeZc6rYtgMajd6DGEBKtJzKVaaO5xLOxQVeeZqNvkGmSrAvIEsaQtRa9SdGP3Swhl2aCLY6FdGZqOWl6+i8exIN+9eE7Lz/tlrC+UZU3gm9TKMoh1Ym32HINY0Lo69+mMhMPb9+Y7EqJ+SLAaA7Or+svY5+VYk6ldVdGSSmmr9mspV7aakCgssEVFHMs+iCU7Vr7YlQ57xxL6VPHXfl1ZOtLTrMIyiAUFvgfmqqxSHIst35AoxENWynQ9Au0twwKAr+3vUATrGEKC1QzmOwHzXJBbq1f9h3bua1cpsjWXr1p5mmgZyhqrOuabHYvPLfK3Fgp2JQexcpwv3U45F36zZuUGx1bkb41Mxypr2DrH4tXKrJXmINbdB6kj9af+xPc8tXYRn7dLsLAG6yPLa1SDdQwhwZo3ymmYC/4SzPEbOucEtrk+BdVPXCMMTIiQFbnEFvGVKr9tqSBWZYlOnWOVNcsNYlP2bnMMle/JbLykBBNegpw5yYp9EAsKO5ZOs+QdktGjQbVwhuxYsrw6bTWytJha1MY0S3h5/RIAwONW5e+nnRqI4wkJ1lxpVOCqnkThpMZpAcEi+ZhbtvK1e63iCzcdhhfUUUCWL13oWu2uPGjm6Z9zL9YJYVrlEkNZgp0oh2rfO8PgWCXG3phj5csJWlZiIdjPHU74v/CNX3Re01yhTg3HFhKs+VGRXRW5hlTtWJlqVUqWkO1Yw+aUm450kq0i3zm+Q6NyjbV8ofNVvrs6ll+4sF2g3LObNy1LZdHZQ6+rthObARt2hX0cqwj9XoZa5UgUCgtkQSxGu+rc++cTwaIyrOMGCdacyLSreQXCq3OsegJXuGPnOJGzLFvySGy+drHqwaPt8+0w2CKUcnehObcoO1Y3KMGu8mUJdYlL1CzLzu9K2zAISsGzWJcuZGvM0a1eWGAUZYev3BKFmkX9qT/xPexGwnYxi2DdIcE6XpBgzYPqMoOlWEXpalJ/WtCGGm5eN8S0+G9epku54v615i+Q9ubkGspi12b7rfSDqWZ56YflCKerk18sF2xyMQmdp+DOfG8Jp4N0jKKw/Lv8ci8wFcTyAAA6mpsxW3ojYf/COXxCEazjBglW7djb1RyrOW1+o1tuiKtaFfm9P8l1LaratOTjiOJV3KVM+aECi3UktD5R4xg8L3uL+QWirihiTtYeU0Mok+8fNsETXu+CfDjH/tRjW5FvCiNlKCu3ErFFYW6UdasypEqzg1jGA4pZQryRMPrqqF2CxdVgUSus4wUJVo0obxgskbm3DBVoZuCKp7YOjBH3hD0vd+3yV7nGL7f5Uo3pMzkbZWhzJcuJ+grtGNCCYntdzhIqu7NOhNNeM0jXkRT/fvOOFYUwHkNQQRyrlGp3ZRALbyT0n881Xw9B1A4JVl3kU6uGB7EM1H+rYKNuyZSZVHM059KlWxgAzl0oz6at8SrZSFJL87TblOOef3nxiE0niEwMGzKZSJoFM9MK/HLq9PNNX1jK/EUZveNVIyt4+DbWZs3c2xXBoiL3YwsJVi3UcO2vInyVe5kF7copcVJww+usxJIFq+q1V/39VkVldF7FI6qJdSAqx0WafcJpZ2fmPU2aOEXhWNOhGO6RNFPKF53Xo9xBLD4heEK60U8ZysLDdzhQLG11SXyFD2Lh8v/pT/0l/Ge77iJc/fgL+IR6jR43SLCqp6Bdzbevnu7XuW6j6kwL8mMrspMdc0y2KEus5LL3ljqWfqdZZojC0MGrePIFQsrazZ1AnRbUoXQs3AR0rJ57vquURlbFHcsmElZ6KX1LZyQEgL7v96jp6DGDBKti6slbVVp9Zb/wEtXK/Hs5Ls+uqiAzrlZyR6as73Hp33L90cGoQ+Zl1fOg11XXa0dZR7MTQOCXkC7MlyXMYQyCYyV25QEA+EHODclX6s4zThfjFy/GkoNYiBDKMmyvOYgF01L3+FEEAG9v38oxyHnRu7A5jKLR7bvUa/RYQYJVGSWWtM99cggLIYjqCVxV1OCqrL+z7YdX1tQ9lpT4RbcbrUFE+B/FUX5XsFQTzwewyFpmL2cqCjnaaGlzhQCQNyZX3LGAj0I5noRyFM08M/fsoHs5+5AhL178pHfShxZGsIhjCAlWNdQZU6nn5kH9WqJJLXalc5c6q+kNGNRK9yWr+a7P4t91ZTpPvxVKx1K3LK/MsbBNF7uis/owV98qnupCx9INuHhArjh56ttcPmKzDzODWGzK57e32yRYVOd+PGnA15poMxWqFf/ruI5eRrk+laOXlXK76rkZ0KZoRvce5QizNly4pppalucNZRm0ILMJauBny1a+vgNKzLVTrrNBl3IzIAjFWMWWqcsSMjwPNladF8u+YXE8nfIZ4MZOy1KE+ISauR8rSLBagu5Xc51RELauEGDugStkMr8+BVHZffPn7VhajdDVoUubr+xdxBZroyklOpbrTD7KyJZuzLmTXOPJtPhJudgyasssh1EE3hSdPI+t17AD5SBWV9PYnSAaDgkW4cL02lOHWpVlMPZYfhvwTsASfajmThPFJ4ZzDNo5BYGiGCL3HcJPvZxvLurZoiDZwHJdhxcR9AzdrYj1pwtLDGKVworkWIxktpxJ3LJWWNPZcohjRQO+TIQl8h/3c2ndHtZlV5nUX33FmiyUHm2Kq1msDsvvfa60oHo5lr0bpsc9h2MhfuCW0dPeS+jBaJJ0ZLBvyqAdlbTDzTGkJjuWnOjkP2vIEgqb7BQF7HYgjmFrd9qmoeO1tMidarCOFSRYhIZI/Yirrt83TJDMU5FdKb8QUVqtilxuDZ9tVLhOV88uDXIyTp7oJuidLcf1PjX3UBYLXPEBLbclpP5vhqxZRW6FQ8YT6He1P63BsQzZPde1J7cQ6r8dTknJ3X23tTcfmo7weEKC1Sp48yjxeqx0KRXV2pWlWtWJMKSqI0xxvSVlpdazWy3KfessHUuXFszTW0E/yHzRLIPHjMbaH4G5ft/LH+TTuU6RqvkgMO03YY0sypVPUtvba5Q4bpBgHSc0QSlLmF2V3p05GZs9lSYH8TtRf8t1ZO4zdldnV+zFwqEsIa9n09fUENBiS/PAamylJA0ZmY41r6Io5XqVN0IK92CeWE/907Wg/r1HAADnTonrZf53eZ11amjTjYTEMYQEq23gL7jMC14BkaqbBo6tokkDrReCPQtsHgBcq4gcDy9195wiKJK7s6t5Y3OEsjQniZPuZ6QOXRble9DtZK/dEBZiHzc7FtRYkiWM1n69nqd+c6Zd5QhiPbV2KX4YPbV2qUURLOyD1buwSTVYxwoSrJZTLChlTyXJwXxDLSt8ZVAHL/289k4QRW6CK7ou/qBYq5VYgGWzx6T3aOdXnh6pKEppFlOlHLktWbNyx2UNxmY/sNIdq6xIaOZ6+fCV8GalXQ2GpqXtqKqvZLf2TvktsisG2dVxgwSrhUzqDkrJdlU0SziXqJUQvGEvCrByXShPrZr9PUPH4sNXcVhAqe13WuY7VRKMmlVKnpoFtHQV+iNrmy/ejzSHYynLsGZtOVULyQwpGaRQFh25QSsO8sR6xooyW5IaaGMzd2o0ejxp9i9+Ik00hgh/C9dYqVN+7KqIWtmHr+R0mPmdMvNqYYorr/ermUwp4wNwV8083dVdd1qu2yo9P889huZsVL6yKsOM0ebwlbJ5po1jmUNKsfGf+XANnjm/f7oPhfAVlmEJVvff/onvaWkzd+IYQoLVGiLhl28tjlWyXRUMXJntylKnDB+HKieRrEDXSpSwOEoMQ45JZGrWLPyTbxvt+kHM3s5tdb6upPLakLK6XkGBO/IyHQv0VqfcEzl2jzx4pTMZ5hcKfPD90ibzQbZ3G9EElSDsoRO2BcwCVwJzv+PMnupygrmNSreoxlBzEMtMdjSrlPZgWWql3CeYNDTP9KckjtVrK/c+QRk+fCUnFm0cS1YNc4i2OMLuzZwqG+NSlo4VBLbVV8DaNOxEbSzDIo4VTfoVTqhQqxWjSiEwh68cKk5KUauq+7ZjG9V6mqlaU0lHjKw15pmSufA44yy7tdFNJ82Ks7qOWWqWHE8qHrmxdywM4GX+GsA3ZBZgedOHLHA5jjBzLOUOKVKGBQCw1qaLV//CJgBM4ojq3I8VbTpHjxvawJVANY5VjmSUFbiqKLaUvu+S3+RCVd4lUotgyc5kFjtRswoMkg8+GbxEtitD8ZONZmXaFWMSuk1uWFZezNKxAt/2myG/zZMewsLl9yeLsv4ysvoq827Z3Vcc0CiGc6cVb25vH6xOo4LSRPXQ8W4oVmrFKNs/SnCLKtSq+DZmNbMQxAI1a76mVVsQy7VtAWpWRz/ZS+bHmQaxVSkvw+arki7IZMgb2tuVMIxSro/K8nYlNo4FLkXlxeXPs7OrB1uz57xjlVuVRRANh873JmKwK99wJ1Rz6ofKKrdS9r10xb09mOwWcQjRvDRLowI1/DFs43audxqmWqSq4K/BpTgNr1m+n9OuhCEJo+rYxWlyIDuW8qBU5FhssZNpbtFwS4HhbOHv35QPKJt5kA9iGVZEU+UQbYEEq1nYpgV1lOFY9gEbxa/UGnKCmeG6vBMBZfpEFCaPmqk0iGXWI8v2TjaapXuPvHiUgHINMoq4CYnLQNYsG3dRhq/Me7isOBZvmfOF33Wu8zqzzfR6ZQ6JIKpg3l81gqOQWjGKOVahdFh1gSvle/i3ld3FXr7m8S/k0axSbrLLQZHWFWz9dgNQKpQhZLWgv0bmmwbYQDztBV9uPr2svKEZe8eyDGXZOxa/wCIdMfCAHnJt3D1fW+fOr0gow5rVC4zyD4Yg6oEEqxEUDVwJ5P09OP+ybt3FT3n3UwQQliZVNg4hvKXOgFaeIFa5JuE4kWIYWoW11PNB4wQ45cXtFGVDLtI5zvpuej708taiWWLpWGCdLnSNYxXvNyZL80QKG+vuXdjaTf2zpVnCSnt/EA2EBGv+lKlWDPffhgXtyoerhT4PLmMOAUKAYsU0qTWrtt1eKerQLKeZWHTqoGoimizexi/txsCaf+boAiqsopQLUkZRdhl91HCYncB0byO4lLcrmZdjFVcrBn/H4mQ8nY8qPQO3YXWxfs7vhjO8fRcAong2Zw5xHCDBmiclB64Eaql5L6c8yP4KF1bZbN0Cw+bWGtDSfXEz92Ths0J3xFGn5KujQbNs7lss4lhx7NBQQDf+TIQBZmqWeiF2m2mvF+U6Vim/S8IQFvoAAOOxOiiImhVodkVz7uEhCEtIsOZGhWrFsP6dNM/koM0gw2rVSnd5U76eeSmsTrNMl2F7SS3VsSy9JPM9hk3TOZbZY+zVSiC3afHk0ywzyWRO0qml21K+JMtgZmbHiqfLL/inFBu2Od+K4wy81LdM2Q0LJmRcRNMhwaqGEy+bf16HXSEW19252ZWNE1Qfsqpo81Gzyly47gqXI8OF7b8LZFs8L4+F8O7CX7AzL946x9K9brAr3brkkI+NaZkHzjtWwfwgj+xYBmxCWUrHkk+r3I7FBixkOW/f1w/JU7c/ndGhgiai6ZBg1U2RtKCpCZYZQ1nDHO3KQMUhK54clw2nT5TbqnQ22vImYcx34cwdIgJIaZbl2u1zhUUGpiSKk2yjkHO0GVFZoSxhm6p2LLY6YXYd8/FS/khnVzJCmI0dcXlj29vMnThWkGDVSn2BKxnVVaeUC7/z5dmsBfVWWWXuAW320GLh/HvicNawQH7Y4gFgAVaOmxjSllAkfFUc3KuxYwws07Gciq6c4OWArcXebxf7hTQL19JNL8HNsSzWjo5ls1H2X3kc5GjsUKGfGlJ6RS2tcGdc3X4w7yEQtVJe2JowMk+1YpR3212hMSgxXC2qnua5AVjqDqttr0gj7JkUkGC8PLMzkTmWTYzK97ROVuc+4Q1DOcefkk5g2m+ep94E0x8joUPDMHynQcviWDsGGabIBphdFYHtsZPr8OBxoUXNEZzj+cX10/3zdBfhMYIiWHXQCLtCuF+IdScHdX8a5w5ZlXHyWrYnUL9ewvrdiKP5B5+KoyussawuV3rYvOxKSSw9WD1RpwMdl79qs2sULb47/C7VCVnsormMzF1hb1fK6NQkSuJqivjfoOVfA+IYQIJVLdU2YsgHZjdKtatsTZEvFDVWWekovhMM2z33WGEN5NAa4fqtbOaeaVrCQuqxK3SFHPVqgS9qkKVm2bYucTyNBceS86qlOFYYFo1dMfj6sL/7D349ebbQpovX8M5dfEJ9sI4VbTpHW0fj1GpKOHEoLi6KMnBVqVdZX27t90BN+8qO0gcz94SjDoNmoQQEfnMHLyBrkNmxhM3qGlOBoWM0hzmWbu/h7h3bZef5XyaeBw+24HDgZle68NVsPHSlIloI1WBVRTPtSvgtL1+qS75c1axWSL0y5M2jBaJ9rYwlWH9jSe4CrHxdQ3VFWn7enZB77+ULXzHkkil0rInkMTlGF0a2zUWTVQcZNeMeNw6r8XhlJq95u3r7XQD3QF2jwBosAOhfODffkRB1Qn8XHBfC0Oo3FJu2omiIq/7AlSNltk4obUnzJJ9z1BlAUqYOa9v5paxI+TVkGcOkcjz3wq39JpmjRtn+SupGYY/nw4Mt50/luDeQdWdg/RoIooGQYB19LNVKiYNv8aeSruKqSbjqo9P7a7jqV5G1rNSWSpzpVjCtjI6UZYALH43cPqULKSm/j+hY+Y4ACx3JjiXnWPkd5fmJZhXxKsaj7eTJ4oL2Pf1+9nImKuXa3kv/u8QpEqtnePvevIdAzAESrNaQo8toEbVSIviW4hpfeuBKVwXSsDP3aASx5oKyzt0SIaBVkWZVsUzlF7PbUbfLMhdgiUvOTPxxJFJV1oyiHAbH4pHDV0q7Go+lnVCisNcIFbkfKxp2mSLKo56ShZRptSFwlZCrWMQcNPKkJ1VTehCrupbuVVwN2Xor1azci8qsiBILIqdPijd/1zkWvy2R0JW+yKUgBojh0Y74sqVjHQdmNVjUB+s4QYJ1BCk9cJXJaKwKNdXfZyvzLWHyqGgXVZ2oqg77krsiLUZLRLY6Zd6wdFyzhGYM52FBzRIci+0NQwsM2bF6XYs1xQCgsCvE1bEsy8hu7NzEJ0+tXXJbAUHUCAnWkaJ+tQJdL8H6L8PK/pNh6iEQuptWo/o1QEnjqXqjSg9f8XYld84ssTyruvAVTxiamr/nhsmKZ93E1TmOZbSrTIT8oM6uxo28I9uJ4Z27gecBpQiPGSRYR4S5qBUo7WquaUGzUSFy2ce89l4OGpIWFDBkCedVKlM8b1iPXQGA55kiNws9h/lwBCYT5wkfHRzLzq4qShR6NtG1xjC6fTeMYwDok2AdJ6gPVuuZlxk0JHBVYrcFtieV17PGNrQs0hOrIQG5hR4MSk29MdAtmOSxWsHMnVZ/IZ25kVXmTIKzBXLP4+kNhk6hKc/P6mg13XWWsavFBTgciC8K2meTHMR2o5gfjMetyQ8Ob1Mb92MKRbBazBzjLurAVW2zMnsZMSoDwu9xdnc6/5hMkj/9+UeTye1JrlvnWoBlGb5y2rs5joVlNIv5jXnU5jKs3NEmAAijjG90EGiXr0iG8jNSR25dQE1C5mhXiBzHuv3e7LnBrvj8oNPdlM2BVbgTxw2KYLWVBqlVdSiNzUUmFMmR2HmKtyKXzLbArKWIq+X4bJ3iKkSzdNQZ1JP3WBAoGr4r35O1aIik98SRQyhLHcfKZVcIH8cq0sSqvV1G6RbC4wYJVjvgm2DNsVqoVrtSwnI9PsSR86/pOLZIf0jgDm+4ZpU1eU5x02KYVaZMtXKZrsh8zhTcaKeTxLCHmWPpitxNGUPzbnfJGIpvq0aHXSdSbB000/OxhVKEbWK+OcH67UqRv4tmjxxLK0KOWw5bTXW5UWUzWtvPljeeMJrnpT3TX23ONEXG0DIna/0NShwrfcxy3zYoJwrlQ7C8OHuuvH8wqcG635qvIksRrn78+fmOhKgZEqx2MN9Lu5ValX4qWWyv/R1qeGEupaa7saZVUcV6HCfbO3HZauWhMahVv0A/d9e79nh4zYpj8P2kktqMsgyr9Bin5d5GzYqilF3J+UEZS80SpDa3XSGLC0UDYW9v3wQA70zwqSc/WWxJNbH7la/OewjEfKAUYQsYjaE7v3uSbeyqB1cBpo5VSowhBLC5m8mO8sMwHgDAJN2+qOE5RHvMk+/KV3224YYyrMprrVyyhDJhBBDP1Aqf5JiE2BJLFe5Y1GPN3tyzkioZc9IQl8kS0AXtCgDiGBb6MBgC2CUH33636BqbA9VgHTdIsBpNdVk58z3hhdZe7FLn2ujB9zKqakq2K0/5FMBoHrXhWoll7xC4VGV5deoVDwCgx/1eKXH3V3gvZwwASRAoyKVZ9sfaNdBo41heAFDMC5WaxS/K8+DhNhSEHcGFfnYBpa6/6I0dVuTejjYNu69fwydUg3XcIMFqKHMvJy80gNyOletPcINjpWZbSxfIOyNdFzNtpgnKxRBnvnO5zPNbaXML2zgUP9Zp8m8aTUMmNC3fVyvLaAQ9XVpTf/7b7/ZO+r4Ww5njpX/k+zDJ++XlbzMUtnprBwIPwgKOG8fJadCdnh75fk+0a54cvgkWdRk9bjT5197xZb52Vc7addM/G1BdtotkCUsLeKguivnqnapWLrbJZgeqsL9oDJ6vOO4TqeOGq3JlH818l2v9R9C0Aj87MmR5EIvsdvtcIbh0JZXBr5uwV7ammUEbx1J2qxJ23r0HyROng/b5n/v15NlBDEvNaJKbBVa4vzs6vDLvkRD1Q4LVLNoduJKx//VZrGZcDmKVY1ea3+El/moXroLmUc/lkiIPKSOIZbfnZeXq92BYTT93LRZDtdcsA65qpezOoHQsT29dVu2yVMxmcvSg14N7D9OL9SCMoadZr32z4VMb8HALQPNLwjD/4Nvbt9CuWtQH64neIhVgHUNIsBrEUQhcydiEssq4I493rBLsSn9F5H9SVvcpYeHN7hsPoLp4MxHJzWSS6hTvNM9x4Lv3XHDZywbN0rZWz6vDhkiV4FhKu4qlsTlpFv+HShxD4EO3I57kHXCLK+vCVwz7P8Ru7NxsV4qQFWBRj4ZjCAlWIzhqgSsZ3W9Qm7nVHLOESuNxuNoZ31lPDKk5mmUzBqFoqQj9Lgynp2JqWp64qlyqE8KWKsuwvNT/5aFjjDwxxzLErgTsQ1nMrtih3N1Xv9P+W2n53XVN8LbCroDr0bD6sRfmOhBiDlAfrPlz9O0KkS85Zc9d6FvHk9Q3pevmqON+XicVrc7eNc37MgjUvTorutePtR8zNSGr6wjhhvt+Um/kcY861h462BVimMSQ4XkQ+MkDQbvqa3rE2LSDl+2KD1+d2kgvcPqE5QeF7CS0eZ4c4hhCgjVP5tIefZ4D4C9B1cwMnTOIYnFtnEv9U23XbFeiCKIolcUrHr5CdJdzAaVvWe6rOC5nr4YRHI7AL/UY2SRGg0A7zbk5qqR0LHQvs3bncyyzXbky4Orz4rvN6/OrYnj7LpcifGGeQyHmAQlWVfhnXza/4bgErmQ8Z7uyn6EWVFd608XDTmFMC6jegOaiWbo4FKpVrdiUott3mS/JrhiHI4AaD9CsrWsux0Cd4h+gqdzXJQcFtB1K84xOsRvZ7Do/9w9/HQCu3vo3AOBttqaNOwDEEFN+8HhCgjUH5h64Go5qv12LJ2zGeWetLQ2JIUVxfUMx2JUARlzKCl8hlkEsHsxUTsIs342F/y8H5lgFj09m+EoIQbk6lhfMHgxLXTYcFNmxlIu0DF+x2js5Pwht6zKKPRq8pvwKIeqmCRe648XcA1dzVit2SfArPPsyr/cllbzXx6z5ULEB5Y63GQJXTrf7Vc0kq39EiWrF687hqDTNslkdI07fCqBEliqY1sjrjqll+Gq2tLzfZaEMa6w5fDt7yRO6hZBoEXQXYX0ca7UC8YbBcAKABdGqq0JH+nPZ9V5Cdt++oBTsX5lz7ID1lbL0Zg08oXRjV9U3GQoLzoxwBL5Ra3LR7+Y/XdXTQMXJdlVqzIcjWJzeV+h6lHJ7aqyqebepgvc8bZ96Jfw9noqlTb+hRcJXmbSryJ1uITzmkGDVBNlV8v921VfKuT5QmHp5571uSCzKCVPX7IJzPmrgF2lz6UWV6QQpxzLM+uyG3TbKdzIKjlXhJIYShyNY4Ho3sN1gHoJrclCAOZbD3YXTnSY7liF8lelY+SacRvjwlSY/ePPGzk04jJ46d7ldESyahfB4QoJVOaWo1XgM3bxiMWe1AgiH6tdjFlJwuf6Z9yevX7MglsPiZ8xXyKwmfasslJWjjF1wrOL0e6ZreSYzx2J9yVP/qoYYAGAwBABY7Kd+YmlaSqx6gEXWOXfp4PKO5ZocnC01AtCcBjbhK11yEMFbCJPw1aLfivAVzUJIUA1WtRzrwNUEYKK1qxzYVFLjDQTsEcc590AL7IpR3lhjx5sEy61tL50wSukMn47W7rMi/pX+7KHmzJc7ZsnhK96oHDqsRhZl75qD60+b1GeirHaPuBkMhc3JtCuhDMsA3kLYFrDC/Vce36P84LGl2b8gW84xvVVwMlUr+zvnq9EZz09+4w9GycP2gznWVdImRHF2ZZhq9XbNJozvieKi/RdKr3a3uZ3QPEPOJIKabr5UHTWdYyE2vUlz9K83OVbW8d0/dF6d0shdzwQhfCXkBxcXkh4NjFb0aMD84PedONe/cG7eYyHmA6UIjyBz8KpYqmHPUqsaymLw0tXpzOYV5h1rQZrkhP/UXDColVWsqEAOLIqdj4hySOUmCgueI7hF6pr3wszUxzjKQ1W6UL0clx8JCOqMjpWqx7JWZ5uyd1aJZXgnngnFk4M8X37nNXzy4sX/1PYz84Mq3AmKYB015ha14i4zOruKo9kjSdjEs8wNBm/Mj3j6yATvGze8cTCC0RiG6RhDQ+yq0DAcP8x2bLmUtUB5sj8eQ/iKHwDObMNPaFPa5totyBzKUlJ87sVZKMvOrlj1lU2usNPJ9jCbOJaNXbFSvKu3XovfC59au9T8Gizq4U4ARbAqpcbGkAANKGaHeBq9qOLuttj0T7EXw/QKYXMpZY7ledA3Xs7N5G7WkCcnmDEUAFBteXp3FFmvMiaEC/S8ZC653LdlFASPgrwPJhEEvvEr6fR1ddx7h0NFHEtnUZ5+Mhwn4szOqxrQsZQKpSsQlF++dx86Pkws9O7UBjzcmn5KE/TCDlje2QDa0ARrxFW4z3ckxByhCFa1cAGaapmjXfXCq/ikYG7I118JMsUljlMPPkrhAXQs/o7A6xAWrtVZvla+XTE00glSpVfu5KAQXxSYTJJHQcxBLAHRvNO7wVSwVaVdIYdDq1CW60TOOoXC74LlXQvKmwflUBZvV5bHpeNDR3OdUYav9g7EV3D7WtYB6/VrAPDPHtym/OBxhiJYNcH/Qi43rDX/wBUWulbX99JxyZ43u6IkjpXZ2F11SNiOLRLWMmDeY+WksaQwThyLi3XdvXEEUZYKd7tJEAthjmVjurNFZb1BsCXDhvC7YSKXZLl+IYsdGBbKMicBCwaxhL0RRabEn6E1AyvJcruzFeDe/dQ/5VCWZenVaAwHhwDcLYTtqHD/ylcB4L88feH0S5+e91iIuUERrDlQYlhr7nY1GkM0ATDGn+yRF5LDrmTiCAKfK/+y+AiPfVjLPh1TYeBKxgMA9bZbwhfP+QVqg3LHtDKDJXLgSoZFs7Aey/RW7WrK+d4a4liu4SsAxSYovzW5Z+n2fa1d6Y6LYFeILo6V+qC+KL5FFe58ARalCI8zJFjzpIhpzXnCZtWU1aU4FsOymD3PkjldcF1D8QSifSMGtjuL3wQXRrMzjT9Khj2cuiPBDn5p3a5p4cWzh3z4yuk8wc2fRO6zBnJrKV6BPhgpUup57Cr5ZPLw/Iy9ITtWZmdRs5ahY1keAeZYcvgqsxvW1Vuv2a1k/oyoxSgBAJQibAjZ/Q/TzF2tdNhM8GcGl5BPrcwBJL5fA4Ir4Qds74j8IbDPIdYauAKA6R2dLD1kbp6f6VJFwldK7LOHvR6MpNM+x3nCPhGG1p5U2VFDx+q4znLDIaa/4+w+C+Z0ofxmUCX4DCjDV4yOD3vWqU+WH+TneH7xYtNThLP7B6kA63hDgtUsMk2rsWrFKO5YVdiVYi2qF4WRW/qWTbXWvNRKCY4F93PuvGEm3a5DjCpHnZbleWJ4l5VjVXbghqPkhJmE4PsgDyR3GZaNY+HbzOEry5Rir+fweyni5rASuPdA+3uvZRXu0w5YVIB1zCHBaijKovg52pVTV3rPz3/ZjuI8/Q4s7YoFsSwX7xrcGo7Uauy6N1iDA906M/u4Cm/ILAC3wRy+Kiufyw6QbFosiJV5v6r9WHBHaTWrGrsSTleMJ4UTCAr+PuZPV4t+oTiXlDweRPi4ZRDLHL4SFuAZ/8n4az/763/8S38anze/wh0LsO6OBpu9BeqAdcwhwWoBMcBwOIcQCCPHnD85HKueDcy9EivZksuNc4nm7BY8DzwPApdB205PxIUxpqsykS85KNxO6IQupqU1uQJ36ipCWXV93fhsXTgBAAfNMt8eq3MspqfsibxLo3jWxy97X8az3u76t6QWFUhju2M0sxs7N+M7oXc+aH6FOxZgbfYWKD9IUJF7hSw+8XIpyxmWN1+yK3Iluz2en90fgSHYlVO+z+nN3TL+plA3fyrJrgTsy8IcJn/k4Fta5JYK/go9nswepdypMKuIj6DX4bJLcfpRjNSuq8uulKG4cJKYFjgVZqnGzNvbJEwetkxPvGQHx+oHo99NwleeJz74obE2V5l1YHwB1tVbr3nng1YUYN1+5Qv4ZPXjz893JMTcoQhW05mXXZU1U7VNKEsZu7JMFJY1y3Ju2OC9eCaUUeQaQ1HBrnBx9mYa1CrzSsZXPct3GoIxfDWeJCOUQZflg1hFDlYcT289yzwr8q4lSRdm7a7itxDaLMc1mqVDN4c3mpYyxJic0jG3J2MATz3RZDy124dbmlSj/nixGJs5fNWyAiyqcCemkGA1l/aqlXCTmtmx6k99djuJFpRI0soyAmAl5KV2lDU4Vo6olYyQLtTdbKHcb/YxKkPFj80HkyF5bit1paLJoRk4fktLCycQRtBVvTkVHpb2Bm9CNvVYjCiaHnX+MBkOmbkrRNZh4sd2Yh0ebyve06IWo7tfuYZPehc2qQCLoBRhQ5mLXRVJCJpR5gozO0JlXonnHr5CdKMolLmy27QidiVHtuTLcAwQxrOUnz18KlaYlDBzxu5YerNMpYfeNKNOGfB2ZfONs2x6Dvo8oHCsdYnCyPxnQaxtFoozCS4upBZl+beTMnzF8oPQqhajGL7qXdik8BUBJFgNZDicg11Vp1YMwbGKB64aa1fCK2V17Rc8I1/FVSZCv+8oyhi9ITmYSWaFlvmnVTtW1ZplCYbTxqFes2Kr+ipdppjpb/ZXspqJCszBvMFkePXWazCKW1GAhQ0aRrfvUoMGAkiwmsaRVCtkPJ6phv3vX91FtODFtZRSd3BJArqVYk+XK+SqUDgqUise1Kx8M6soEYJYPMqAlmV1fNWSXbpjeV6hEi5Bs7Ac3r5uHR1L+X77r6QcxMLwFbK4YFqUPJHz3QcARsfaGm4DAPS85hdgsRlyKD9IICRYDWIudlU143HyYIRRhdPgNJ9s0zJKg6ta2ffsTq0lyh/CyS2v7Kxwm/qmVY6lNAnXr+E4hCia3WnohHqaQlY2qP6MvgVGnLIrKBCZFtKmLD/4zh9+Pz5pfgHWw1e/hE/652l6HAKAitwbwhzUagRRxQdfcXdS+lrFftebr5Hy7YSlXFOLl7oXHEVm134BFngocc5Hufw5lP4Z+NqKfScTsumJFQF47lfoHJ1pneDL3ovEn/LJrkwcwWQ6wU6O7ZYbqScNeJM7NQBAf1Lqz70canVXP7UzMpgMr976HXzeggKsaQP3C5/94fmOhGgIFMGaP3Oxq0oRQlaI4ddvZtUzT2NLr3KTimlplsundRyuZK79NlXRGqdQVu7wVVTsvssa4lgFQ1m+n1+w+ExxkeZqLPzJLzDZLkNHN35W7DhV6s7CV/w5yZe6OyHL6yAc4JPmF2BRfpCQIcGaJ/XXs49G1dqVUq3A+u9snWlVdPnMbQMVXc1jUKQPlcXLVo5Vhl3NfqpsgJQmc38qK7EiDFxlfDTBMLmhJzcX0JOvvCy3Y9k01cxBkbAdOtZsi7z0E+E8FHKIHgDAw8fJv/KlBZXhKz9IdgWu//FwGwCi14d/+RN/Ps86agTzg68+vEP5QYJBgjU3jljgSqdWkOsyULNpOVHdEGZLjgFiiGOXvtvaZWVjGZ4pvbieqVVZuxT7hmsp437OHEekrMwglBS+YqT2lVAbKBwVj3vRA+BK3ZV2lTuIhQPZnxZgPfy+DwOA/7H+U2uX8i+xFjA/+NKp85QfJBgkWPPhKNmVWa0KXtGYaXmew8Q79pR1O2HpjLLqw0xhg+ml0aZayzUqg9fpHOGr5G1dgArUiqdqC3dyLGZXxTVLsKv88q2iw4KLcdYDAAAebjl0ukL4Wwh11Vf8Rj082L566zVoQ35w9yvXKD9IyDT18nJ0OUpqBQDd0VXhriLV0xIYj8EPII5Km6gkHzWErzLVihHFhQreMU0mlzxnEoaKHcGSbtkz8xTYjeYKbEaq7F04EWu8fdXX3x8gMxpDT9/MwgcoIlRlhh7ZvSll78vJBHb2Zv/cGiRt3RtuVwDw4NVfxSfUX5TgoQhWrRwxu1IwTSKE5XVRSib6nYKJqhIvGPZBrKrzk6OJg11pqbIIKVm+tAp+LhfWQ0t+YC4yKLwfbSKjniHDVXgAmdGjVEl74UBuKbOGC2DwqZPrz5WHW8k+NOxIQ5ZQGb5i33Fs0BCGsPXSh/GVH/rwD+YZZV0Mb99lDRqovyjBQ4JVH02zK0O9sD1y1ctgCIPplgrXV1cEtRJ/atG9ukQqtStPClxZap+Yo6nBrnLBHANdoZROE1aOxaqz+R4EeeGDc7oTr8jdgspSd4NdWf6ZYfm2jj5+xsPsCinleyF8zcMQtobbV2+9Ft8Nm58fHN2+CwCHcUj5QUKAUoR10DS1Kh3MyAyyNtO+aD1T/vgl4aUu39/illRqVwXbcc0ShRajLLE5O0M5FTGj0oxcZsZwNtF4zMWuqhmTwav8vCcnb1c5krk6Ck1UJe1uXa5wcQEOB+KLcviKfdm39wCmOoj5QW8zaLhdAcDtV74AAIteQOErQoAiWJVz5O0qWek4zx/urIadv2fQya4YRQJa8yp1N9wf4IRyjl45SlSCXcm17Xp1kDNjvC6U2C7V3EXM86dq5draNYtZ69cCUauqyQxfOf1l8jApixLP29x7VPiyY35wMBn+by9s4SvNzw/SBM+Ejqb+VjgqLD7xcp2rq7rNlZLhCIbTleJlppPXV3BiRLw7Sb5HKY6sqllKTx1WFL5KLlGOS2dbxz/CMGNOSXOKNij714DyMMmprhIdC1gXMRUZ7RsKEMUlq9VoPNt9VZRembHMEiox72C8hVAIX/F2xYevWtRflJ8eh/KDhAAJ1tFhLoGrobRS389zMRtP1JkyXrZcncnJtHRBrCquyyhDsWbpYQiepxYp3bYwr8AlC6ZVRVoQkcNXrvXcZTnWTKH0I/B81zm3TbCoVXbBe678oKVdmQNUyp/mzg+y8JUO+WAaSt0Ngeq3v/fJ+PfG0Pj7B4e372J+EGh6HEIF1WAdEeq3K6yu0P3+tJ8ezrICaTSGbid1wbDv15C7SKt0u2Lqg0+iyHRnvhvpcqTROHGX8kvTuHQkn3YzH22DLvhesZIgZSWfpjjL86enZYE1lht4U6L77pRYhuVKpl0hht4NfPhKaVe37gJM5x/0PtiFxucHsbz9jYPdj37gaQpfETIkWK1nLoEruXZVBi97Zs2ysStd5kv46zzTt1ikQeccwvTPZV1GMcin21Jz9yNnOLHAKzG7HvdLXAsAAPSmuzHTVTKDMUUcK6N1O4gH0vMKpd5SCcGpa07CMkX2cAgLPc3PPKPCpLFvZdIJsuJwLl8GYYByqbtsV9t8+6thonLNzw9i+OrZpVUKXxFKSLDazbwCV/boQln2gStL7INbmaaVm+F0tMImmzcWt7FczZpIDnEwTGqtlKblGhpBuyoxmGLjWMJutM1ES3cAeLm6ds4q2Zm3cYvVOZZ9fpA/gfG5eBrz0wXm9dHMndzpwkT40nmzSZ0tkQfIwle6zCCGrwDg7ve9H//R8PkH+e7tp1/6zLyHQzQREqwWU7NdWaqVLDdCKKt0tZKxDG7JpsWCWJnX7qHd8OxbMLBQVu5bBBiTEDxPcQlGhTqY3tYqmFay06QtV5TAxw5qVVGltjYtqB4Efmb2HCdfsgS9Sl3Mztlb7jiWLtSU0ixhtJzChKHiDC+xE6+rXSG8Y2GFexxnj2pruH311u8AwFNrlxqeH2TVV3TzIKGDBKuVND9wJeN5brZRIpnBLaFIS7iWWbqUQI7uVrjVRQSLKSMvG7p4x3A8+1EiW8qie8mQAh/iyGpqSCe78n2revzc9wOi4nvcPzMXpZaq8uaIsdGgMIRAeUroe3rpFmsIX2mzhAUy5d70BoutHZNdbe/Nwlfj/+IT8I0b8ZvjF//LRicHWXcGoO7thB4SrNYwGkGvlzypk+JqhWCVOmTd1GZQqzAqoaGAQbYmIUAMu/vQ11XAZMGkyrLAX0nuqqzMeww9fUvz0RjCMDnBDPD7n8mTzrRyxK4yHSufXcW653rHymi+4ElPAEAKYhkWYhth8mZvVgdiS58RkM8SapKD5uZtyiNos72DyfAXvvGLAOA9021R+IrK2wkdJFgto412JTiT4SJabuAqE/6X/v1Hyd/3/V7SG3ZxMf+S7W+iVJKjKitf3y+hPImdXbJpGdQWRcomoGWD7vTwc/Wyyi7Ax7AWt2S3vlZCqNAiUeiQvEtvry6Hq35bcaz3ttmJ7zwwnZx8+IqVt7948ZNNLm/nJx+k8nbCAAlWaxgMq59tmKMKtWLgNYz/vVyzWjHuPwLgUid87OrwEKCAZuVzLD4/aBnKUl5QlXENuUEBf0IFwWxRgmnZBA6FgFbBO/WEa3aOzggZbSO4SJ43nW4oT8tQ67l3nL1Hs8nKaFYYQSfION+yy9v5LKEHoK++cuqsZpkrH0yG//o7e7ADAPA//MHPOaygdlhykCYfJMyQYLWD2TR/wq/damZVq9SuGEyz6rcr9CpEtis/gGh6pSmiWQXjWGARyjJctj3JpXJMFYNX3Eno0OUhjrjpEe1Jv593LKtFxcqnVp+Ii/eyT+9rIYiVJ6Sks6vpPlEWtnteOTO4I4Jd5WhXOw7hzn04HIDnwUI/Y67SQTi4sXMTGt+dYXj77ts/+dP4/MrLjRZBYu6QYLUA0y8m/hdxGbJVUK3wl76TME1C2+rm4vBehfB/1huqWQpGswqiC2UZrty68BW42BXfYoBV+luaFu7Ygj05XT/u9A1gsSd/euDjAhX0cjFWr5szW2c5BGUoq7jT4wC6naJfybHFtvP5wW/+oSfh1g0A+KEP/7FCK64YCl8R9pBgVc7G+17e+vbL+T5r/ptPpFhwq56ole7NlTqW7FUIb1dCa0c+iMXIoVmlXPBAcqyMK7dyzmOX1Rm6N6FpLfW1b+D3Knuew7SCwCHP6LqPcTiel94tMcRxCcVkcYGZBF33E69Z+FzZ4Jc/KIZv+mSSfHxrt9Cpi3Z15/7sFbO58t0Z/vInmhsWorlxCCdIsJqLm13JuPhWWXZlP32NrGJyYVZBdF6FGOzKjKtm2V+ozA0aWLrQMi6SLycIdr0xdQEtXaGPU0CLXYw9v8Y2WlO0HSikhqXyi8KBxu21b1KfO3wWhhCG0AlSX2R+tZlfKxx5EJTwBeRjV+ZfLHL4qsnJQQDYff3a6PbdNw93P/6ffjc1FyUyIcFqKKmiq7iMm7E1vlVErRbCq/gkd+BKprhmmb0K0V3z+N2sDGIxDg8rcaxMDge2dxcWzAlawptWpknYBLQE9bFxLNd963sZjVJlx9LWv1vMB2WpWUWyqfidGg5T42Qns/LbpBszH0t2PW95teLDV4hQhsWmx8HJB6HxzUVZ9dUzi6unfoB6XxHZkGA1keSGQf6mr9KL2T2AMgJXrvXplu/PkTG08SpEuNQ5ha94nEJZ8rXKdQNnt/jZNXFwumCzKm95jh1LhmP1WdpVjVMZ0NJFlUqMY9lnKm07qVp/Mc1zAeW2K+ELFUWiYzHsh7qzNxutfN7qmmBlFl0Jx5eFr7723afh1pvx10cv/leN7s7AV19R+IqwgQSrWcz+wqvm9kDG/iEAQK/Y8XcNXDn9NWwZyrL3KqQsu2LYa1aROJacFjQ3cchnV0VRxVnNTSmRfi+jRqe4Y+Vp9MA7Fj/Zjp2sjCbi90sXyirLrhDBseK8bW8NjiUj2BWGrwx/v7Hw1d4gCV9d/sQHWhG+Aqq+IqwhwWoQRYuurEG7Kh1DAVbuRgw6zXL1KsSmGsY+S8hjqVmGa5WhAEtXdKULZdlfsEtTqwJ4PowmAFkOZF/JJJP7Zka5h2rxVK+gWfmGJn+heAFljlVwsDaOZXO3IIMtB8NXkwn87vechltvQuObi7LadgpfEfaQYDUFhV1VMAkGqlUFC9ZSSo8rljHM51WguTwXD18JVNHNIbOkPffUOpXYleO5xbtLZiG8svmTmYJ9IpA4ghjXW97Xxs8bzrT8QkVc+I1vIZvJ1k7qn2bHUtqVXH2lZDKBR4N2TO2MrdvfPNh9ZmmVel8R9jTgD1iC2VXFTURbalcAsL0Lu/uwu5/z4652xR+HHHXfh4eJaakXbn3Jx1vDbBiM4MClnC7w5x+78nx1kVMUm4JV8j4xaEopdgUAcak3tyZ42j1gwP4LVeKYdbvRHLtS5gcX+uB5sL0HkwlEMdz43ifjdyfQ+PBVUtu+tEozDxJOUARrzqQCV5WJD58TrMeuSlQrJM80JgBQLLVUBEM0y6aoxaxWyo06GMDSQvbAKlerLIW3sQrhfkNhe02TH3OfKo7c6SD3eZiCG55leZnTF4oNW6jHyk1yFDid1dmVTfjq+jsQxUnvK++JTsPDV7tfucbK26n6inBi3n/GHm/qKboSKq686qc0LMWutndndsXo6/tbKtHZlVNyMEcQi6GLZglxLKEAS2lXGNrRBXjQNg4Gpspim8BVp2yBSL3sHrPht1ecgE8V4fO9SuyKiUUUFY4MScMz75bROKddIU6jFfKDAjjf9jgsZFfvPYIohsFkeON7n8RXmhy+4juLnnrpMxS+IpygCNbcqMGuDMXsOBtGieDka8PCaiVLFaTDBv0+DO12XRG7KjeRqoxmKeNYvDHkjr0dHMJSel1zTwiCXeBKCdtLyuwqzr6HhlqWWkHW0c8fzTI0AFNNku36t4py2FHkVoZl4HBg9dXQWf5wBDfeBT/A8NWbkLRu//MljKwadl9Pwle9C5sUviJcIcGaA1q1Yr98WXvoAhd53q74hZXoDfx4AWA0UU/TYYlSrZTYOFa5mUH72wkNyJolOFYYljZs3rHmY1fcdbj45DNIHGtzXmg8EaRmWc65Fut3OmuWhf+xjGGOMLBh5MXrsSbT89/zAGLFuszhq9EIBiMAAD+AwWT4bz/Rgx0AgBcvfvKptUtFB1cNfPhq9WMv9C9sznc8ROtowB+2xwz8LaMmnj6Ae+LO/mFGI4bSU4SHAxhxfSY9z23SXGU20Iw5V2jQlNLvHHRFSBpiCiyOYTwpWQoPDmEwmnPsKkdOUECQ9U4nSdIlRiUpziScqUCe1bl/xDZpaPeNGI5gNIFD1/C2ynjEt2S9w5AflHep/fd7NJrZ1de/CQBw7of+6I2dm/E3x0+tXfqHn/k71kuqm9uvfGF0+y4A9C5sXvkpunmQcIYEqw423vcyPhkMa+ogKsDbWul3ER4MoM+sJU5pViY2aqWLEOgcqyy7qrRSbW8ftnchisHzYDIu5AQ6sHRsv4xZJkVs2ol55QSuPO6/AhjNUp4e+TTLvFlmQclwLOPJNBzNHozQPuZk/X3OEVpW7kn8avPbxIevMD+IXjUaAUz/qnznLgDAYDL8H3/rZwDAe7rb5OQgtmbA59SagcgHpQjro+qiK13UyqvMrrStAdKOhb/W+ZIv13iVDjlXWN09g6VkCYG7cB4cwsEhnNwAABgb4pocXTtBFKry0bGWLW4wLAun+KUBJgTyUcVUoPlwoxnYJA1LOWvkcFrSzF2zN4ZZBx1PlYwYpP1cPT5EEcSx7dGRvYofsOFO2FF6u1jMfmsXAODN/8Oss2hjbx7k+7ZTawYiNyRYNaHuIwql+Y4hJxhrnhcBW1Lh5b5vuOpji0JuvWWpFYM5VqZa5UgOluujYSQqaacDO3sAAGvLVkswexhOI+h70Fcpxf7A1rE6vnFGQnMLhqrvUMV6dpejYq9ZpcA0C8Uo1YXBy5YqmTDSO1aus1PpWEJ+0Cb+x4qxMHw1Um0asysMX2FrBgB4au3S//AHmxsW4mvbL1NykMgLCdb8qF6tqiBft08PYHc/T6WtTQVxv589a3UppVe5g1gHQ8U9XHxrhp19W8cyMAmTye+UdwD0+2WEsvQnbelqpQyQoCfhnYNO1KZZTIb4enxl5aVDy1llKKvALxBDHMs1teqn1Yr/JvJ2tbULg8nwN74rZrXtTW7NwMJXp1/6NNW2E7khwaqXsgugzI0YDKvKMc2zUq1M4aspGKTpdmcz3pRMDIt997rgijmYjkd5e3ynI86CvLMPYB3KkpmEGS2smHUNh7A4daxFp75imvOphqgVpN2o08njWFBYs8z5NTnOFEYQjrTnPG+QNvswjLjJggr/GpEDY2a1SmJv6XF6Hly/pX6/7JRnf+iP3vitnwGAhte2M7vqXdi88NkfmetYiHZDglUXZV+EZLXy9NnA4tnI3NPUoF0xynes6VYZHKtI+ErYq5lBrANuDLrOQ4Z5nXNoFrsudru2vY4wzLC4oN1jXbvJDetRKyg78jQJIYpLa5qVeZ+mzTkvhOsMOzYM898ZKoyEOdbWjtauZiPRDEm5dbxdsfDVz/7Wz+ArTa5tf/Dql1hykGrbiYKQYNWO7leni/7obhXUIciWk2mVolb8BdvesbLzg+ktUTpWDX0ZDqSVGkSH2VW3KwaxGJYZw4L3Hh4OZqEsAUXJYAwL6XBXpXbFhKO6pF5Bx8q0nFjxrBysit+NsILFMII4Tve4cuHGuwDcNxrFXY5dDSbDN9pW2376pU9TbTtREBKsxqD81Sb9alaqlWeMVxkiW2bMatUbXzXkB4XAVSWotqTOXKHsVZA1h6AhdiWQGcoS7Moy5iRgcKwUMQBnXbgu+23JjcGuOp1CMzL5XtKBzNWx5ttXjG9qbyp+t+NwCGEIQ4tmacoaMrQr8zuxtn3xmeWrt16DMH7qxFONTQ6iXf3O/vZHl9cpOUiUAglWs0n/9j84nL1scCbdP+1jV7mjVmCnVjZBrIzwlX5LeMcqJXzF7ze8DVA3+LLsiqEMZZXbNIulC3kCn+vDNN145nB4PWZVUKWbVhzXeNNfDGAxxw6bBjG2y/bHqf9zy4yrO3ula87QtPBMwPcbJhQS4pE4kyB/rhZ3NdxApV3dfTx85fTvAAAE3g99+I81tm/7w1e/tPv6NbQrSg4SpUCC1Rr29gFgNv8Ju+ob4lX5YleWdiWHr3RqpQyuFCrGytqS0uNY2o5fUzKLn3JbiBDKUtpVvvAVjyGUlblwfjbA4nSCnFMtFUFXvR7k8jzF8Ittkbmin79d0Xw7Lb6NP1dZ2whXxxLCV6OxOrg+mAzf23yIz1+8+Mm//ImGigs/Kw4lB4myIMFqB3sq6RGmAjQ/172fp+rAlUBOx7K7Vi324cGW+8JVRJFU6s6N3KauvLh87OzDJCyhlYMBOZSlnA5cdxkuJaDlZFedoMxgHq4XNSufVyngpS2vY9ncL7l7AIFFYA0bjerQOZZpdi8A0EybiOGr4YXl/2+UTOrc8OQgPqfkIFEiJFg1sfnsy3ffeDnfZ5V2xWP5a5z9SO7R4KpWSwsA0xBRkXIrnWMpsyTbu2KdtQzLovZ60O/Bg8f5x3b6BACXDZQTrJa37JUS2kGTUGYMi4eveA4HsL46W2MO8gW0assJMnijQvCsy7y1wpwl1H0B8/05kWlXTlMhCXaVo+spwsJXTK2U4aut4fbPRjfwefOTgwDQu7D5zM9/ft7DIY4OJFhNJ9OuBJRhKkP1VdVRq8zLv82FB/u/6+zqoJpWq/cfia/w+zAKYWMteyHF7UoQHXPxexDYap8MGypeLG06nBmwD2jxajWX5KDgdnzGzXlp/DPh7x73Oxad7CqMM4JY8r5V/M3gkiiUA1fsu/zOXRhMhl/r38HXm5wcfPDql26/8oUF3x9E0YXP/jC1FSVKhASr0bjaFY8yrMX/Ss2tVksLAKXeJ2hwLN3UOmap6k3lYGNNnAPEEuWVHvce64N190HyZPO0eiEF7coQQyql8ztDGCe2JD04hCCAtZXUj3KUQptNq2DgqkiWMPC1XQnkWQXdkHWqbLtyncNbPp+x/XqmY8n5QQxf8XYlhK8wOfjoyYf/ajKCliQHB1F06qXPnH7pM/MeEXGkIMFqLkXsSkAOaxUJXFUB71i+r/Cqhb5tpKqXDr3kcCxDHEXZZRRNS9AsG7sytMLK9AYMZZ3ayF6LDjZC5dQ6yVqmGi2YVg6E1KGsVk7hq4LtarHKyrwQ11CWcOdg8tyb+ZZ9ljCfXemCWOYdK3chNsexzN0xfB+iGPrPdm7cugVLi2hXzUwOCqVXV2jOQaJsSLAaSol2xYNzAiqLly1ZcpnJzqk8CC8/27upqxq7fa/IBdXJsUxVwGnpWeil/r7nNatI7MopJJPMFe1oP50ODFXTIwrMJmYB2NmbPS8SPCv3lsMcOBWw60JZcohKfdbkClwZrM41cAXS+Yw9GuSJmT07x/rm29KQ0n/23HgXtobbb95649fCPgD80If/WGPnHHxITduJiiHBaiIV2RVMA1fjSSHHqojtabBE7olg386qV6xyyN6udNx9AJ0ANs/kHICTXbGDuLNn5VhsE7LVyqizO9PzM4dp4ZhjaVrA3NVXllnCIjcGuoWyZKmy1qziaUEhiOW0V82ONR7D26rOosjuHgDAYASDyfDe+TswBFj1m196hc+pLwNREc27zB57qrarIqTCV+VNXM3Uan+/UGzDYFeZQaziaoWgMdy9DwBumlWw44AylIXNwHJM7M1gQSyloDiZltLpC86+bEMpPRfMjmX/PTBkCQ12lSNwBfpTWg5fMYR0IQvQ6hLZeJ6zNw8mw61LD7d3tn9tmhx0GnBt8MnBUy99hvoyEBVBgtUsarOrcoJYRseyyQ+iWu2nx5ZqI14eBsfKbVdCllAQBXb50ZnW4QDGEwCueNw+UqI8fDt7qSUUUSsGnyjUYTYteajCiTMJk3+X1oAKyl+aIV0oPQMA1bdDH8oq0a4wiJXDrhhs4FE0O/+F8JXw+wS/Bd0PLN+4dQ2mhe2NLb1688d+Ap9T6RVRKSRYTcFSrQ4OZ83cLdEFrlwdS119lSuOxYeseJThK8v8oE1yUOlY5caulLCAlrLRNp+Icb1/TZ6V2fNgvXBBem4E07I9wdjcwyGAuxjJWULLJeToTcVCWdrGC+XdMJgvcAVldLvAjcB6dv785H+Z7B8kT9CuwsudL996bfAouvrE8qf/xc6LP9rE0iuMXY1u3wXqekVUDwlWI2hyWjAbF8fSqRWk7co1iJW79Ep3KbJXKwxiKe1K0KnrtwCkaJaylFinWbPpljvqEWLUcH8Ayy73Iggo9rz7BRuHiv9dVYW1DGdNPs3K95Ec8EdH0fiK74miki3B6kq3K4gh0syuOLSeHnswmg0sjOA/vmV6JwDc3X/vd29dH47g6hPLP/ThH/yHf7ahyUGhsJ26XhGVQoI1f+ZoV/ZBLCF8tf/oaurf0tVSzg8qs4EG0LFKma2Zhw9iFbcrhNmVeSY4xL48K4pgMLSKZsl7u6BjFcEwT4DStHSexY6CjTbVo1Y8iqqsmJMqOyVV2lV+tbJerxmW9b5zX/sdwfAVvnMwGf7u2vXhCH5jvdGlV7df+ce3X/nCYuAfhhEVthM1QIJVH8rZctodu+LRRyRs1EqZHLRsa+kavtpYg8fb2p862dVgBL5v6iOlAzXriXMQ+EkZFqjyfaCKZjEnNle5leVYeBTCCQRZvy0yS77wnIzjpBjfMvQpB7T4CBB7vcR5Cc2wGWYCH6I4Tz4ujmcHXSCKoNcFAJgUm6YzisUglk34CoXp9nva4clvRrsa3Ai9k8FTa5f+5X/1vzkMuEbYbYOHYUSF7UQ9kGDNk4rsykmtbIJYtr2v0hdMQzbQkn4vu0QmR3JQt0yzWimnvEXv6ffzOFYQwPV3AQBOb2S/me/CCtYNxnI4liEza3As+2p61BHWv1Qd01KuPUz6dwRBsjeSwOHUG8qdk1FGOXOfpy8nV4K715z+Ho2h14UOp9R5ZMudb7+jeNHzFH+N7B+k7Ore7rZ3Mrh+8Zk/9FuLT/1oEwvbd79yjd02uPqxF6iwnagHEqy50QS7Qspsi+UBxHAwBBg6eJWhNUO+KXIN4NLWV8Vm8bxdKV1KJt9UKtg6IQgApkGCO/cBAM5bJA33DmBpESYhHA5tm4tWnSsscqNiDPBwCxYdh5eyK47ROHWqZM4LbknmjMjCKZpZO5i8QRW+053qnfSZpvYteWlcEMsQvnr3PXEbM8NXzK6urz+8t7MNANcvPvOf/GvvH/zCb2Z8ch4Itw0+8/epsJ2oCRKs+dAcu8rEqXU7WovNreD2GBzLNXzFL4c51mCUZ4Jke7s6lIJbyoIhg2btTW/X4m8g5eeCNMtWEccSsrR8EKtgDwj0gW4XDge2jsVPHSj2KZXezOdbDbKlO7syvQoAohji6WfDHMVP+hQpBrF0KIJb7mt/973kSeaWClG6h1sAAIPJMLq4fOOdawDwG+uLn/7nO//rP/2W8yCqB+3qzcPdZxZX6bZBomZIsOZAA+2qeBCLBYQGQ/A8h3vVdeGrfqnl7XgRFRJ5Cz14qC/G0qFUKyFLKEsVw1yOzWsW8yrE0J5DmHi7+LyBBtCxSrErRqZj6WZlFjRLZ0uWsgV2XgUAUSyqZ+BZOZYY3+IcK1+ktuNDzHWMEJaPQSw+fMW8CjQbaw5fJTeHTobRxeUvv/MaAPzG+uJ/8dWNcxtNzAyiXY1u30W7otsGiZohwaqbKuyqunr2zPCVkGhDuyod5YXTMny1vZu4Iz8uLDdBh9u3m0MaMdTd28S0bG522zuAb94QQ1lOzc/k4JZlEEu4PCs3ttst1HhdJyE6x7I5nSYubR2EOwnQtyy9CgAivUVlOpY6e6i569AcxGIIFWD8IeNXd/s9ELDcZLzlFoNYg2HyZeHt6r9+e2Nt/dJf/9u/brW4GmF2BdOmDHTbIFEzJFi10mS7cg1iCWoF6UuXtg1jGvvwleBYZrvix4Yb9e1byT/ZBZutYnnR1rEMdsWu7oaSZ7MBCPEqFspy7SsrwGRrZw/Ony60KFZFPglzOpbBTkByLFdTx47zrkV7Tn8SmMcPRscy12Ypx5zpWOb6ejxdcQ7ypYXZFJ8GtTKEr1gY7OB8h9nVj97aWPMv/bWfbaJd8Q1FL3z2h8muiPohwWoffDP3cmNXgmPpwlcPtmAkBa6QKsJXlvBSxXRKVsY4Bs8TBc7GsWzsCqZ7QL7y6ewK+wmNNDXIW3uwtQcX8k4dLXDnQeqY2jd8L+UGPZu77dCxcp9FWEvn9HHLN2eqFUPpWFVM/ZS5P+8/Tv0TD/3ePiz1AQAOXO57xar2xzswuZTYFQD80Id/cO3mNxprV9hQFABOv/Tp0y99Zq4jIo4pJFgtpu5OVwAPthQvKrs3gUUQy7X6igUnWPiKSRUzKh5dQK7XTTSLZ3kRQJMuNLfjUpqTTrMY+wfaHzEWpxp9+z4AlKNZB4OZY21zmURZtgJjPwjXIJZlLwPPh8EIFovdABjHEEZuwzPEvezViiE4VqZdRfp7LHRBLCe7Yvo+Gs+qvpbSO9ngW4MRDAYAMLOrjf762sf+j8/85jfe3tN+al4IdnXhsz9MLa+IeeHFxaetIlz41m+/LL/oehCWFiu0K/QSIXwlqNVoO+nkztuVMhhgcKx85e2dDmzvqo2KR2dX/MKVAxYcK4dd8cTpOYx1XiVHsBZVmcGyQlnK2CTvAesrVm0ObCSGP7d1p/l4DF56Pxd0LJhuTuYI+XNAdixTxRVOlWNoGxbPhmHGIFgACsGytCs8qfg7ZGenmWoJY+6dmE/c2oGtHQgCGEyGowvLX771Gm7OpU/818/85jfefhf+7j9sVviK7IpoFBTBagROSY3dA4hVJdXl9otClCErhi52ZYOrXW3vJnf82cR+LIvJ8EIlh7KYYxW0K1x44Iv1VZko7QrKC2XxcSwB3HUHg9S0PyfWc67I5i8H3xPtCgAOhyU4Fki3GWaMhItj5QhcCQQejCzaf5jtCqQglnmXvisVs/PLmZHVRH9pAd65C/uHKbvCH5FdEYQlJFgtY1d/qc7X91LWsvEE1lcy1Aoku9I5omW1uxLMAGLfHVzKaAzdLoyNk34Y7Eppb7p0oVkfdXYluJQH4Adu89Pp7IpRYsYQwT3m6wUde3nzhxKVy5woFFRA2HrlbMQ8BR2Lny9cp1nySev7VlPu2EziFEa2vRsyYY6ltKvRtDL9/iOXhaYdiw9fDYbwYJphHEyG909NvnrrNfABInh65/zl3/zG9h7ZFUFkQ4LVJgx2lRtZyx7vwPau6ea10fZVuc+T4XLJXxTwbYbW7XyteqJWMLOrTFztChFCWbhPlhbhQFP5bmhzxWA7hIUo/CDbsTLtii3znbuzAT9xzupTPOOJWwtZ4LYohtn0KUw0T6ajXIZAS6ZaMcqKYyGZ0axk2kevhPAVw+xYmeErHn6XjqTb/cx2pf7uSHEsXq0AYDAZfqVzfeu9bYCpXZ249Ggb/urfbJxdsY4MQHZFNAYSrNZQhV3JPN7JlgBZL+wvmTH3X4GdPVjogefBgy1F4Iu/QuiCWPnsajY2rl6K7W3ZsWzyTcr9gVdTg2Zl2pVwPWaxt3fvie/UKRe/i/hEoU2pkDIYic0RAODRVLl4DxCsy/48YRRxLD6IxdBpVrkZdn69pcSxhmPodRRehbjFrng8gBjGYRKv5e3q4e7wP65e39pKjuvTO+cvr1/a3jVNlD4XyK6IxkKC1Q5qsKvHO6l/8s0gykUOX2Gvpv2DpL7KAwAPYphdz6uLXSG4e2d5H84DcCcwzcoums74uVqz1ldM9TqGOIec30R45ep0wNMol6EYa7aK6UZ56X8ymGOBFLhi1rW4YFqRQR2g7DgWgpqF54ysVgWDWLLVKR3LMnw1CZNC9dFI0f7NRq3MX5+9Q4jjlFoBwGAy/I+r199965F3Otjor5+5v4R2df8R/Nw/alD4SugmevqlT5NdEc2BBKsF1GpX9d5UurMHj7YAVA7ELufKy4MQxHK1K3mXpqpqJInAdGFxu2LM8oa+1h4sL8BKx2I7hB1PIcrFfCvTsTzrQjo5Lcg3DsUb01zzkkhux1IGsRDfgzBUTHrDfprPsXSrs49jCUVghokybewqCAD0goUlg4Jd3d1/7993rh/sgWBXf+VvNEitYGpXr735xneubpBdEQ2EBKvp1B+7YlgGsZzyPix8xdQKjBGm8USca1bG0q50e1JdsIxr9AAAvvbWcKEP73v+2a1hsqe2BtsAsD1MJUvkarb1fpIh21hY3+ivAcDezTcWOokp4L2K3W6ScmVNtHUXVCHdlhrs1LFwV8RpJWKGxP/3nXuzN3Q6sLqkXbglp0/MnhsmFsytWeU6Fn/OptJ53EG0cSzPT3VqMGdaecfi7dlQVi+cDHwQyzItaAhf7R3Awy0xgLd9pvPvh9cxZLvRX3969/zG+noD7Wr3K9fe/LGfAACyK6KxUB+sOaBshaVE5wTLJSXvRLWSzgWlYG2/d5X/p6tgvf1O6hWDXQlpI/lUHY9NdmXIOiGCWg0mw+65xKJubN/cGm5vD3cAYCstUiKHkb/MLWgngjXtPWY7uwAAG/11AFjvrz195hL+c6O/tn/jesZwVSTdqmIALzkQayvagJP8OvNdvMra93aXwZakm9az8QiOlXmwkHyOxXvPzDs9AH07BnZuKN/AnzlMsCzbtaNjjbKmAtR5dq8rtmg3MxorFoWBK7yJhAnWYDIcnl/+8juvHTyKYdF764ln/q83Fxc6/Qba1e1X/vHtV76Az2meQaKxkGDNAUvBMsSuShEsReBKdS7IjsULlpNdvXNX8aK9YCGpEzY9YL5FQuZU0IEPg8lwf+MCcym1SEWxeSPN3TF2pBkb2a1b8gg3+utPrV9c769fXrto8C1eqsTBSK+scc7ER7DkSrh8jsWCVSwM4wGcc9csS8GCYo4l2BWSHaaS9qosWJl2NeE2cKyRJ1ayZkgLAsB4YtUGFlS9RmEauGLgcR9Mhv++cx2/AgeH8NYTz/w3tzcA4K0bzSq6Asmunvn5z/cvbM53SAShhARrDtgIljkzWFCw1DlBzYlQimBh8wW5+7yrXTHiGHod2D1Q306os6vBZNg5++w7e7du7Ny8saNoBh/vRt6qaEwYcOremgAAJvj6QR8AlroLQ9XaWSvUQZg06xyGw8FkCADxUx28hmX6H673o2efA4BPXHru1hvXsj8AAMYjsrqiViuETxVlapYyCSikuiyjWehY9oIFuRxLSIQ5CRb7LNbyC4HPOFLb1UTaIjY3URSbMneZdiVgkC1BsPjAFSOKYGu4/a/hDfznwSG8MD5/pncJmmdXw9t3H776pduvfGEQhwteQHZFNBwSrDmQKViZdVdFBEtXcWUobxcciwmWjV3t7CUxpxLtancPup0kHCELluwug8nwnf7yjZ2b7+6LUhXvRN40o5eI1PVgoQ/r/XV0qY1pHVUC65U1fTIcZU8UjbDrXAhDABiEg2kt187uJXHvCId4o7/+0TPPAQB8e3Jyw7QWw0ER1GpNsqhMxzIUV4Gmlshes+p0LCfBEj4raBYvWLJUQXrOR36NSscy2xWoBIshmBZbPi5TCFwhB6MkLRgfxt6i14vWL+8tXV6/tH/YRLvi2zGceukzV37qc/MdEkGYIcGaA2bBsqlqzydYWrWC7JsHmWPZh6+w+QI7vwTBymFXu3sAQkm75FjMrgaT4d76hRvbN796/+swba8QH0be4iz+sNFf714PABKd2uivW2VevNQ0MshQX1IjXDJ1RWNxMASAu/v3AODRwc7o/cn+koNqKFuX1y++/R+uK2VLPi6Gzq6MtRVFwwLULLNXMZSChWOxSRqOx7Z9VgFgNIL1Vds3M9gGugoWSHEsxlh16GWp0q2O16xMuwKjYDHwNOYFS2lXg8nw3/rXWWb8TPfihwan8O+KP/nnG6RWQM2uiHZCgjUH5iJYJruCPIJlsCtBrRBesJzsape7VinsxJsJVq8netX6aHW7t8u3V0CpYkbFXjeoFQtQGaaMxB/xmqW8WArj7+tXGoYwmAzv7t/bHs5kCyDVlYE3LRQZdqchOzo2asVgDrHGeZVTVZbsWPw+M2sWHsdMx2KHWzjBbHwLN1A4jvbtGPDjTLAwXsWK3A1SZV6dslJKh41gJe8cQ78P+wdw76Hip9tnO1++9Ro74me6Fz86ugAA9x/Byz/TLLsSiq7ohkGiLZBgzQGDYFk2ZXASrAy1AtveV+hYZsHamV5jTHbV166Rt6td6XKlvWHQg/EYIn/4Tn/5y++8xv8E1YpJ1ebyWc0ikrpj5UzS9lNx89dOXDW/l7odk1HJ8FdclK2Rt7P9hJRqnVZrXV67+Pa1WWm8TW5O3rI4BvAUE+BYapYgWMo9p9MsPhKp1CwUEX6Zht9eOt+KIsUBdXIs3DloV1hc6PRLVF5XGGXfVIg42RUAvPdIEVsdTIbjJ5e/fOs1COPI8zb66xceL51fvATNsytWdIX/pKIrol2QYM0BnWDZt7yyF6xsu4I8giXb1Q7nQ/I5xQSrz+6Ak2B25aBWkNwJ+NX7XxOK1jsBbPTXV24tbfTXxToqAABF4ZR89RJDHcMRAHz38x8Jd/cAINzdD/f2AGCS/FMc90e+fbrHXQz65zeHd+72z28CAL7ev3AOn+OLf+5n/5Tf6wHXBVQZ1RjC9tZw++bpO/KP0LSeP/vc7/zbawDgezCewBNaq1QQq+axRs2ycaxJmJrgzqCmsmYJ5XS8Y/F5NGGZ9r/AULlKEayH6UYJRQSLL5DP1Cx7wWJ9ZQXB2vr/t3fusW1d9x3/XpHipSRLpCVZlplIspO1eTSthTgd2gZrlmzA3DbGtnYomgFbig6YsRe2BgXaAtuqbQXWB7Cuw15dtzVuh6bY9sfQoGi6ZQ2UJW3SJK2c2M67luxY1jsiJZG8fN39ccjDw3MfvKQkk5S+H/gP6vry8kq61P3w+/udc6zk+Z6roixYKiFuxm7PHTNKJoDf+1QbqRUcZUHaFek4KFitwelYjU4oGsSxdtCuBL09LoLlr1Zwxlcer+vsERE47UrcM7IFayXW9/zSuXITSeWUhnt1rwrYhC7vXoaBkpUTIpW7uljY2Az3H0i//JrXEyeXjzo3ioFOgV64FuFb/XccB9B/YjKSGDUTow/87t3abj3Rcqz1erxsWiNDQLKEWBcq1UPjYkH9voKYVjjsaRtBNCtIgqWiaZZzyELI8dtvWrAEJbeJ7xtYiNBGvujyASPgafjYlcDfsYIIVjqLtWT1pyQFqxpcVbh588jR2LjYod3sSi0Lgk1XpDOhYLUGTbCamK7dX7ACqZWgccGSd5dUbWTjdSnp8VXt66a2ALc7q0DalfpBXKjV45efjJsx2aIbN2O9V0IjPSPdJe8pz70p5XI/O35M6FRxY1OLo0qwu2A8vb5+Oj8ptvxfcvXnYkNNvJAPi/ns4W73fvJIYrT/xKSZONx/YvIz//pxuV20SbmYVoXjh26biI0nX1wNqFk+giUYjAVyrIaWdZaapV4Gar1Y7bJ3L2sGRnx3ejYZWLDkj1FzrCYEy2vqLC/HqmtX6SySKX1BHnG0anBlADbiZuy6N3vH+setHM690najBUVZcClvjXSbbLoinQsFqzWogtXcYjg+grVLdiXIb0x3GbpaoVG7AjY2qy/ualfdYff2EaFW6saIHRte7E30HxYDoNQQxadxuJTLAXjn2LH0K6/nr1anQH16fX29kP+k/U7nU8p1vSOjssAnt8j/lYhahjWvT64qSh7W1YXq4/lF8WDjuRlt58tWZsx0+U2Luw6AoVMnP/3Z+4R/GMK00ouvxa5CaFbORsRAJdAqvFpzi3aaVnVi93oXho9mqTOOBkc4lrgSXIeRSsdyn6S+cb+pGUgYQLDKLe21G1XNCnIO8gTqTkzq1CwvwRKrDyUr73pVsLIWsgWrcF25N1F8yz+zMTgxMB4Nm+ls2wVXLAuSvQQFqzVIwWp6qUFXwWpArQSN//I3lqe1MpD/FSQES7UrmQ2J52l2lc0BQMRRGBJqNZcsTxAqbipxMzb+5qCzdb1Q9I4BMrk7bzyWfuX13PyCYUCEUiKgUncTdbpIolyqM4+MXrO1OKz5hdz8gpCtjWfPOq1LQ8pW4vRH//iBu1HRrMWtpY1EEbWB1nuvv/NobOy1Z6u98FKz1PGGAXuSjl3nsrGJBEtg5VEs1pytk55o84Ll/KaCO5ac4Mr5OtKxgp9DwEV1tGvYKVjpynQh7nZVsDaHa4Z9iH72o7FxAEur+PRn28iutH52sCxIOh8KVmsQgrWdhZydgrXbdiXuDVsrNQsRqpeP6zRIG1tlu3K2rgPI5ctGpeJqV89h9cWlyyjYCJcjmZGV3qMD49qeaY92q1Iu9+6REevqwk0/8azBSaPqPzHZVh+afZSraJdCRnWWLCFb/Scm//zMxwHYRjXQAjBysLzsjzPQCof1QCt437dTswLOOCDQZsMXz3XXLGEntvvS1P5/yXy+nfKihN7S42NXEqFZdc8hoFrJF1O7+1XBcqoVHHZ1PrIqPo3YbxaNg6Fb00eEWgH4rY+3kVoBsOYXZj/zeXlhsyxI9gYUrNbw+o+ntmNXqBWshtVKEHzklJwsdHm6oZpIKo1s1nO3taQ+S5NTrZJpa/GA/incqVb+XvXWmWjOUapDpbGpDY3KH+lbPvmWjLW+dO4MgNnkpfW8HmgJzTo+ctvZp2sOIkwruGABiB2oTuiAyljCOt+FW11YXCqq64wM1uxQdJyVKls+F6T/t2MYnoKlTs7u/yPpMuq8I7yWIHRHOVQuX7UrV7USiB+Oa3B1a+aIGPPx4wv4u6+2kV05J2IAwLIg2RtQsFrDzBNT2zyCFKxdtSvttiTjq4BXzauX3Dt1bBur6zCMGsGK1PazZwvNq1Upl/v0qT9Z/fb3hH/kDg9FKpMtSqm6llW/XUXcourK1pfOnRG98P91fB3AifnMyCBgINKNuBl779idS8/XzEd55FDDZyI1yyvBsn2nvJeoriPnVR0ZdLEr/fgl9Pe5HTDA5ep6SWtL39Q9jI9jFYsInl45X2y5dmIIV7vyrwm2m1qBwRXZ61CwWsOOCFaTaiWo92t3vScJwdqmXQHVYeRCsEp2dTpsQbZg/ai0Opeq1gQn3ix35oodXL3qi3/7mDW/sPHczOxnPq/9l/Sq4VMnA519ZyJka+Xh77kmduInkL/vnk/8/t2L6aUfvjsC4JafZm4cAyqBVv6VApSrI+yYaMK/R2qgDwAOOsZxBvEqlVKxpo1Lraz5n4B6IQnZChjF2aWaV3RdVTDIkWzbZRIHYZyNCtbsvMvm9RQOONoDsgUrOdT3/PI5dVDt0EpIvGWuLOJPP9d2aqV1XLGfnew9KFgtY5uO5bpSbFCa6lYplZBZmw54vSyuek6Ark7SEw5jM12zcK8WXIW6EDdj161WO9lVtfri31ZvG84/2dg3XuXEJ9aSVdG1tw7+we+857u3l3+g92bSwmXfe/2dx0due+aJ6hOdmuVEeo8B9B9AsYjhgw17lYrMsVz7lgzgkIdpabIur2fXcEt/ogFsw67Ke9Y6VkN2NXfF87XW3T5Qhbut8FjisbknpVoBiJux20tHoohdWcTiajsGV3Ko4BPJ1XtueRuDK7InoWC1jLPbEKxMtnzbaGiluSpeCuUvXiWkV6f99gCA8sJnqS2X+GqtcgsQdx/Z3i4Ey1WthpbKNUHpVWIM/5f/sUat5r9yZvXhR9TXEuWGoVMn9/lnYmemNZ1cuSs2jMqPaPOuW7+19thf/PAL8in35jOoBFq5V5RG+GDTphpAVwjRCOIDADAUb/7kSyXPrnApME7NUgXL65J2lS3xRNexGmhQsARdRrVa6iNYQqr8X8vVrqI3DD1++cnVTI1a3ZDuPRobv7KAbK4Dgqv+E5NH/+yT+/xNSvYqFKyW0bRgZbKA487RgGm5/cLrllFEnFBXsOSyss74SrUr0eAvJxHtMWtqgqGIAWDwjcFbDo9Hw2Y6g2wOXZWhcppaOStikcTosalP7o3+qh3Ep3ooTOuf37749fPfmktdEhvt9dKpPks2wstAy1+zxK+9KwQA0QiAbWmW/9Sa2iWmmpZQpYDFQSlbdqnch+4+E0Sgg1V2FgMelTnfNcFySpXXaznVKluw4m9NnF0qLw8lHDRuxg6v9h6NjYtf79QX21Gt1MuPHVdkz0PBahnNCVamMobI9eYRSLNqnxjwJhREsKRdxfr1mUilXW0qYyeFYBmhanAV6gKAuBk7+MZgvHukq6vmIE61Eh+Fv/vm4vsOHgYwdOrk8Klfolr5o6UIculAr0ALwL35jBZoeWmWUbErgXAsQXygMc0Sl5zPvAZeAxWFadmlxgZC2nYjC+ZU6PWY71crMnYZKNWTqpqTAeChVphQlocCiqV2VyvUNrO/YWWuN3uGTp1MnL6fwRXZ21CwWkYTguVvVxI/zVKe2NACt4LNFfeVnhHMrjbSNTdFIVj/ufE0gFAXes5bhVtGJtF79gdrb3/HpHoEVa0ArDz8yPxXzqhJDNWqCVYefmTj2bNaaRVAJDG6ddet/3NnpCbQej536paiFmhpmqXZlUB1LABDBxHvr3NimujUrRK6ki9Uhh/WW9BI/glsQrBcKRTLx1xcqZxMEVAGV/qvc+VqV0KttDUM+rtjE8nB0b6RdlYrZ02w/47jDK7IfoCC1TIaFSxpVwjsRi6mZTfw9OrL1QoWHI61qAzw1wRL2JWoCWp3xO4weqL4j4UX1wspAO8KDxaS472RmiV1NLXSxnWDBcFto9VucnYpYnShEmjl77vnzLmH/AMtoVlqcVBDcyz4apar5TTkWGph0WukBYBDg/qW7QjWwgqgKJT2Z1WbAct/ItbNNCLd1S+zBSs5Wji7dK5yLBvdhpiyZHygrVMr5zhB1gTJvoKC1UqCO5ZqV2jQkKqaZTesVnCzK4FwrMWauZNq7EpVK9TeC0VXe3d3eTGQl9dejZmxrbWgNUEB/17vLK5jBQBEEqP5j9zznRvWZKBlv543buyGYlpbFwq9prtdSVw1C6gxLS/FCS5Yzrat4Os6i3fH4QBLeC+s6FtUZ/K3K58npjPVd2i2YA28pdpoJYmbsSNrvUdj44vL7ehVcCj7XDY9Ee1lTZDsQyhYreTaCJZAc5fgeAkWgIWVcteUINYPoCxYa0l9ISADNdMxoPY+9O3vzqhlQapVq3Cd7QK+gRaAe/OZiYGxidh4+nyhz20dG4HTsaBoln+AFMSxfJrifeZql3i9rQoFhLzd0RlHNSRYgnSmfJx03hq/7eazS+fOLp+T/zu4HFo7VIybsWOpwdG+kbZVK7iV75kxk30LBauVBBQsza7QuGAVi+X7U9Sst6sDL8GSH+KlY8n4au5qzRF6TJekYX4ZR4bLj1W7qjtIkB+Frw0bz86sPPw9Z6CVOH3/0KmTn589M5e6/PXzDwGwV0rGcFW0P9Y1PBEbD826y47XFXi4cjEc9O7Q8poQS+BlVw39hXN9Z8mOdU2zPCesb0Sw5Pwj2YJlHSmP9rDXisZg+cXiZmxwOXS4byRuxtpcrcTaCc9trp84EAc/CJF9DwWrlQQRLKddoUHBErcBeXNqyLHUD/2qYDlLJGKNlNRm1a5kXuVqV0NxRMK4dBUzM2W7YrtVG+IMtF7YSr29b0ANtNReeJWJgfGPhYadpuVyBTqu55tvcD8fp2OJq8tpV839YXO+s5yTjoZCfk1Uwe1KqFW2YOUSfXOpS7PJy9oOFw7d9MGLqaOxccNAR6iV3EK1IgQUrNZSV7Bc7QqBBUveBrTbUnDHchUsp12J4mA6g9l5vQ4Ih2AJuwKwsFy2K02tAKw8/Ii63A3/Xrec+a886JxDS87munAgV9e0jg6MXX7+otiiX4He17NcdUe0RjkFyylA2/mTpr2znAeXJtftMVY3iGCtbVi9NyTmkpeqdcCNkn2gnAJeOHTTL19cFpEVgN/+RJt6lViWimpFiBcUrFbiL1hedoVggqV+yHbeloI4ltazsrky7VQrwYFeALh81eVG6bQrAEMxPPLoDIDv/+BNxzMAwJpfeOHe+8C/122Gf4dW4vRH51KXzpx76PE3npyWEwoUbYSqV8FdY3fes5k5OjC2/PLF6vPrXc/q4obywj48XCNAO/KXzEewXEuQTs1ST0OzK+FVzr518SzpVdmN8nfbbvOwS4RayV6r+Vw2EYnyrUqIBgWrlfgIlo9dIYBg+duVoK5jaYL12ksus4xGIwiHkbGwslbeop6aZldXlgBgOI5HHp2ZuHHya9/wu3+IWZrYbtWGqL1xP0itvWegPOGBujyRNK3Z5GU11rKvFo0jIQATA+NHY2Nl2XrpovsrORCmJS5v55o2I46ZFxpFfWfVtSuJqlnqH9QNywIw8JbEC1cuqU3rKueHb/qV2eVSupxXCdpZrVzXTuCyVIQ4oWC1GFfH8rcr+AqWszvEZy5sH8eqa1diRFg6i+5uAFXBguJYRu2X80sYjuO/vz8zdqyOXZGOwGdmBxlmiO6i6ctPeBUQBRMD47/5to+EX3z0aKzsWz5TWAHoiQY6w0aVS76zpF35q5VEOJZtI1uwem5IzCUvrVvJudTlmkl3S9VVoM8P3/TuZ8t1QPXt3OZq5VxMnakVIV5QsFqMU7CumV0JvBxLFay5eeRTVcFSB9uvJdF/oMauVNQznV9CdxglGwsroF3tJdRU48eb67cfiIvt4u7bf2JSjksQsRYAOdGDfalgjLt0M00MjN81dufEwNih2Wfi5sCLT3lGXJqGXV8vQ/FXLvHmEnYVRK2yBWv8tpvXrZQwqlml9pfaBLZK6KuOr4ybsdLLoZgZG+0b0V4R7apWro1WoFoREgAKVovRBKuuXcFDsLyGNdUVLHg4lhSsuXkAyKemtUmMMlb5bF0Fq2TXJBC0q/2Af6CllZCkbKkNW9qMDyqipDgxMC6t6ydPvBQNV69d/5Vz4OFemm+JN5fzbZgtWACES61nk0krKQIqbTcbsFeKG9HqdA5SqqJhUy0Cqq/Ytmrlujp4JDGaOH3/8KmTrToxQjoFClaLUQUriF3BTbC2Y1cCzbGEXQm1AtAbhbVeUyLMWEDlhK2c+xlKwZJ29cwzM48+4d7VTvYM2o35+a3kO/rKYuEVe4jS4ZlzD82lLs+lLlV966W8cXN11Rh7rWQM6vo1MTAO4Ghs7I7VBQCxisTEzVjcHJC7zTz5kvNUJ++8WT5et1LpLGwbYh3lpJVczyYBHBxOyZWV3UmX0NsFwAZSmxi6MpgtWCHbjJmxuBlTFVCQ2qo+/sLftJ1aOSOrC+nUrb0DkcRo/4lJrvhJSHAoWC1GClZAu4JDsHym5AkuWAKpWaVS2a56K50uqmCpdrW8hoEDLmeo2VU6gxdeoF3tL7yGHCJAgUlo1mzykrNNvorS0gTAXioaIy4Trv/iZkY+Ttd7l4k/h/Zy0ThUPZTRBVt5K9lXCsZ15bJm3IxduH70xA+XY2asu8uMhqIh+A0eaUOjkvgEkInT9/efmGQPOyENQcFqMUKwgtsVFMHyXzIWjQsWgKhZtqve2iZiKVjCruAtWGp8JewKwNM/ol3tX8SAUHHnvmxlxswe+V/BW3lkszwAEXRp4jUxMF4zXFGrNmZLiCpf5m10K0XFjRL6PReTEiEZgFsefyMaNrsMiJJfNBSVAZV4r7m2bbWzVMGtFJixiz1GSERW/XccZzWQkOagYLWYpgVrN+xKkNxw2WitT0u1Qj27AmAYtCtSg7iRbzx7VmuXFjQ91F9IlZSt2eSlC1/9J6tgodI4JXj1nuudz33LY2/Ix2bIFIMyzJAJIBqOAoiGzZ5w1aIi3c5jAECxpKtVm0sVfH8dnHaBkB2BgtV6nnp0qqH9A44bb0KwSjbWUzXrNws0u4KHYKm1y6vLZbsq2bAs/NXft/v9hlwzgpiWOvZwZ/nUH97tut1WPhsEQcqWsKv2NyoA1vxCbn5h47kZ7Yf/nbWFDwyOssuKkJ2FgtV6AglW5Y9+1nIRICfN2RXgLljri7Ud7hW7AqqC5WpXYmfaFXHF1bTSxWJvKAQgkhg1j4z233GcUco2sSpS5eyvAsBSICG7BAWr9bgIlvdn6N0QLOlG6ykAgQRruTIvgxAsre9+5c3qnrQrUhdhWtb8oqsBoCIBZuIwZSsgUqpEZKX+VyQxmptfoFcRsttQsFrPU/87FXDPrAW4CZBGc3aFYIKlxldwEyzVrgAKFmmMjWdnNp6bkT3XT6XW3jVQM1eVlK3dKyN2KEKqcvMLWig4n8skIuWBBawDEnLNoGC1noCClVW6oPwdK6BgabGTsCvXg0vB0uwKwMABd7tKZ2AYtCvSPF6tWiXYXUrGK3q2AOxD37LmFwBoSdVj68t3xw+pu8li6z78ERHSQihYbUEQxwooWM3ZFZoVrAN91ccrykhBFgfJDuLfF6+yt31LdKlbVxdca38aDKsIaS0UrLagrmBlawfxbVOwfOzKeXAfuyrZ1Sb3+aXquCraFdk9hGwBcJ3CFJWZx8XjSGIUgFCuSpAzeY1OdHuIdCq4TqHyDUYSo+ysIqQdoGC1Bf6CpdmVwMux/AXLa6HogIIV0K7A1ityTfCad0DjfDr1tt7qsjnCukTVDIqXtKR9XoZSEDo1vyi+1FYAlIhZQOWXsle9g9yRkH0CBast2CnB2r5dOY8sBEuLr8ShhGCpdgXGV6R1SN8CoCqXGDcnd9N8S0PqV/lB4rC6XfxXoJO5Wn1F8erW/GL1sbdCqZztN49vVN//4hxoVIR0BBSsdsHLsVztCg0KlpdaCQIKlmZXAAYO6HaVzuBL/0C7Iu2CplxeWrNVLPSFwuqWq7nskUjUued2+PflKx8+dJ26pTcUSnuvyaCW/FqYsRFCmiNcfxfSOrzsCkCxpJvQjtiVK14r+TjtyozUPxoh1wwzMWomKknP6fJGWZWTwVK/oypX165WCrnhcM3lnirmB0Iei+kAADS7ApAuFtXAzEwcbm29khCyg1Cw9jL+ahUE2YDljK8MQ19UJGriL/+a8RVpd8rW5fG/anc5KhU9VAp8covz6dqWiGJIos4oXUo8pkIRsrehYLUvPvGVE2d8FcSunPGVs/LoWhw0DGymASBfQHcY0QjSWdoV2QuY5dYrTwMjhJAgULDalIbsSiNgcBWkOOh6WDW4ipoAkPaoIRJCCCH7kwDL2pFrwrt+YarRp8jUSo2vtl8WVJHxlWZXVg5Rs2xXAsZXhBBCiISC1Y40HV8Ft6sg8dXGln5YaVeh6kQ8yOeDvighhBCyT2CJsO1o1K5EfLWzwZVkea18ZFkWjEYAoFA7tJzxFSGEEKJCwepsmrOrgPHVxVfKQwiFXQm1yuZqdsvnwZnUCCGEEA0KVnvRaHyVycI06+/WNCUbhlFWK4kWX33uy4yvCCGEkBrYg9VGNNHnHjVh1N+rhuDdV067YnxFCCGEBIGC1cF4TbC+U/SYenblhPEVIYQQ4oSC1amodhU8xAoYXxldmJ+d1raL+ErWBxlfEUIIIV5QsDqY6O50XxnBLgrbZnxFCCGEuEPBai9+/v1TQXZzFgeDhFhB4qvNjPt2rfsql3PfjRBCCCGgYHUiXq1XjXa7O5/udQRpV6I+KOyK8RUhhBDiBQWrw5B21Wh90D++Emq15RFfOaFdEUIIIT5QsNqOgFVCV5oIsVyDqys/rXa4szhICCGENAonGu0kmp6XwTW+0ryqbnwlxw8yviKEEEL8YYLVMQS0q4AhVsDdGF8RQgghTUDB6kgaasDS4ivXmqCMr+yS+0EYXxFCCCHBoWC1I842rIaKg17plM84QVcYXxFCCCHNQcHqAJpovZIiJeOr4GolOtyzbjrF+IoQQggJApvc2x2nXTU6QUNdtQrS3s74ihBCCAkOE6w2ZTuTNQgMIJlqcvZRxleEEELIdqBgtTVNz8sAwAqWOQWZXJTxFSGEENIQFKz2xdWuAtYHrRxKHuMB66LFV2L8IOMrQgghJDgUrD2IzK7MSJ09nfHVldlp9ctiEZkMFpZ36tQIIYSQfQEFq3153wenmniWsKum46t0BsVi9Z/gwW8yviKEEEIagKMIO4m69cGAfVcCZ3xlGABQVOTMsrC81sAxCSGEEAImWG1OQyGWtKvm4iunXQkYXxFCCCGNQsHaI3jZlVcblhZfGW7TOeTyjK8IIYSQZqBgtTsyxPKqD1q5xiqDTqRdvXiupsN9aYXxFSGEENIMFKzORlOrJoqDrtkVgFy+mfMhhBBCCChYHU3TwVXdyUVzecZXhBBCSPNQsDoA11Z3p11tM75KbVUfs/WKEEII2Q4UrM5Aa8BqKLvS+txlfKUVB69cLDdgieIg4ytCCCGkaShYncHdH5iSj13tqtH4yqv1CsDyGuxm5yklhBBCCChYHcc2BwyK+MppV7I+eGURYHxFCCGEbA8KVifhZVcNxVc+2RVHDhJCCCE7AgWrY1CrhI0i2rC2Mp52JRqwRG/71/6N8RUhhBCyLShYHU/T6zprML4ihBBCdgoKVidx8lenmn6uT3wlGrBEfMX2dkIIIWT7ULA6m4DxlW0j0u23g+htB9vbCSGEkJ2AgtVhNBpi2TZsG9kcAHSH0R3225ndV4QQQsiO4Hu/Je2Nf3xl2+UH2RyKxep24Vj5QvnL1BZ+9NS0YSAU2o1zJIQQQvYjTLA6j7ohlkit/JFpVtaCsKuvPsj4ihBCCNkZmGB1Kq7xldOrsr4Tk3aHceGF6VAIpaLfboQQQghpCCZYHYkzxHJNrYRdFb3laX65/OBfvsH4ihBCCNkxmGB1PF7VQP/sCkChIl4sDhJCCCE7CxOsTuX9H5ry6bWSduUVXxWKWFrD+eenWRwkhBBCdhwKVgfzgV+bau6JBUWqWBwkhBBCdhwK1h7Evzgo7IrxFSGEELJ7ULA6G2eIpdqVsz6oZlelIuMrQgghZFegYHU8qmMFya4ALK3t4vkQQgghhIK1d6g7bFDlhZ9MM74ihBBCdgkK1l7Atdtdqw+q8VWpxOIgIYQQsotQsPYI/iMKWRwkhBBCriUUrL3Dh359Sj5W46tCbZRVKuGBT0yBEEIIIbsGBWtPoTqWQLUrEV/RrgghhJDdhoK111Adq+CYpuGPHpjSNxFCCCFkp6Fg7UGEY2l2tbRGuyKEEEKuERSsvcmHf2Oq1adACCGE7F8M22u5YLIn+OaDU2B8RQghhFxbKFiEEEIIITsMS4SEEEIIITsMBYsQQgghZIehYBFCCCGE7DAULEIIIYSQHYaCRQghhBCyw/w/m0E93mFPW/4AAAAASUVORK5CYII=", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 8, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -30,7 +30,7 @@ "\"\"\"Align 2 shapes: a simple line to a polygonal mesh\"\"\"\n", "from vedo import *\n", "\n", - "settings.default_backend = '2d' # or k3d, ipyvtk, or vtk\n", + "settings.default_backend = '2d' # or k3d, ipyvtk,trame or vtk\n", "\n", "limb = Mesh(dataurl + \"270.vtk\").alpha(0.5)\n", "rim = Mesh(dataurl + \"270_rim.vtk\").c(\"red4\").lw(3)\n", @@ -43,7 +43,7 @@ "\n", "# compute how well it fits\n", "d = 0\n", - "for p in arim.points():\n", + "for p in arim.vertices:\n", " cpt = limb.closest_point(p)\n", " d += mag2(p - cpt) # square of residual distance\n", "\n", @@ -53,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -62,7 +62,7 @@ "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
center of mass " + utils.utils.precision(cm,3) + "
nr. points / tets " + str(self.npoints) + " / " + str(self.ncells) + "
\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", "vedo.mesh.Mesh
(....embl.es/examples/data/270.vtk)\n", @@ -77,10 +77,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } diff --git a/examples/notebooks/interpolate_volume.ipynb b/examples/notebooks/interpolate_volume.ipynb index 7ed999f8..47243c68 100644 --- a/examples/notebooks/interpolate_volume.ipynb +++ b/examples/notebooks/interpolate_volume.ipynb @@ -2,37 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "histogram : entries=100000\n", - "12639 █ \n", - " | █ \n", - " | █ \n", - " | █ \n", - " | █ \n", - " | █ \n", - " | █ \n", - " | █ \n", - " | ████ █████ \n", - " | █████████████ ███████████████████████████ \n", - "0.00..................................................1.00\n", - "\n" - ] - }, { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAEAAElEQVR4nLT9WdRvyVUniO198t7UvSmglKKQVIyaQIxChUoCMWpAIImpatlVqx+8lt0v7uoHt197eVr2g9vPbj90t1/cy/3g1e1yu4ACUcXcgGgo5pIQkyQkSkgglAkI3ZvKm3m2H2IPvz3E+b6kykep755/nBh27NjDL3bEicM/9mO/eZ5CRKeICBHJecp5nud5MvO6J6LzPEVo5RSS81yZSWTdy3kKkYisFC0r5I/WMxK9NOGU01M8VYuR//QyXvKMzCREHDUSe0EijkQRYko/iVZfLJG8fkvBRyvx1DsmTxah1RBWa3lOgsueMhERY+baaCGmkZFoA57QqZec5/n88+caO2OFEBHzQflyxiKnV53MTMTMB1PpLwGdq5sc/WbtIx+rOHv62CM5gWnaKN7gXyJibAr/OnsX7chtuGcjxRuJSvC+MNn55uQRid8nYVttMeYsBFcOlPsbLi49KlRBK719kiHNSSD6zHd9BxF9wf/wC6SMdqpUrYhw5Ic2N6khAygSLWekO0uZmUSIUZbY6+lVLW2w9Bu4ahJuTauJOFc5PlwWgTYh0IYQhvwnSCQcHTNrpt3i6rdaYGYiWZyXMDghrkDNGhGUQCKhU04SOeV0Y5sIyL1PFLraEoH6mGAT1mP3ZoOZeZmaRT/BOEXTvMYvRAJNsSkOCy3mh7xl2mFAMvOB9/kmOuKPlmCXdKywVk5VQ1NrzM7GyCDZVAkQ4K4wdcx4qzzMtEEipvPHnvzVv6Q/Wylf/+kfgBoi52SyJMsnEiKmaMH/42BmPtY/TMdxEK1EKvXnn+X+yOk83a88XNKRyMwKnopD/rAGThswodnPwpCliam4SM5snIR2jS9ERHeKJJ2n24cDE5mPpe2ixs7NDLvIeh7m45TT7bOrH17eDLp/d0/wCIrk5rxHkGV3PzZuIs5ESc1SHiBD8sNwAN6FOfPmgswxftBl76MOuT9iZsCBCbGep+PjSCdiG5fKUjIjvvAZ1Mbxn4NTQqeFKKTgBmOOONnqJaGU37tg8MS0PojLrTglyRCgLOXakhkVCdWSUJjgKjCNjU4FByKu4Qy8DJVzV9eAYOtbgkrpiYhwKo6yt/q/PJBbw+kaVAT8Vs3LP/Pt307PExHRt33HO37pF/NsAfvTCOb0j/1Q61vzZrtZsvvgHsocmioRET6OoR4J5z6QNF0o2A54rLJT+KgTEstfxN5Nqhi2cGPthpTX/9K8SDMzuVxBxcyHYS92CfTRZzrQJpDQScLEQqdVhJAozJzTmvCfPXPLHn3bIWLwLMdxrP6E10mOkNY8rV3LZp4HsyRdEHB0RZERpUXqdO2s+s44O3vKyHbjPClBBkYMxReyFJxKcp3ANPLCrEWdaQZ4GkwsOTkXT6MgMz4oNaTWcRpZZssAoLE52tyHx6TpKlhcOyJYPNEGRaT0msgVsaKrXslIcKo1dcH5kKpSlxmjJUsX7qzfZ3imINRRUWo4xjhBAWZ2cOZ0VHIhP2UT4LhkyTEzzJihhxkBKDmb2X91/O0pdS4vbd9kzvfiXqc8TcOPtI34xh8Seb9cWA/Iz71mdeWAsix85YGoRJJHZVLfBKNc3hYqNjohxlKegpYxMSMoLwrgpY5mZVztKRfE0eyDC6ZZQx4MXaMklsyizgE8TqrTQTO7WTEP5zEtalfx1t0ROAKoQ4myYWR3rIDULgPdmxi9GD537SulUoJLSgo6hGveXeByDQ1UWgRZZ7Kh/katYgwDExGLnMxHts46ZBA/FlCirRFPtBZzWnVNRXQhpGa/OXW2cIB5OQmfCy2HgQrIvCQfCDYCThE3axxtiVG9/neAZIY71AmwnCN6B6+vIn0k2CM2ACwix2DqczXR6Epl4hBRzqOQGcXtR7AJL+lFq/J3kxquxKUCDBem3NK8NA6gHKxWuLSLmdxVMROdPu1MtRY8NMCjDmVE5MuffvPz8jtE9Ep6/XVVmaTi/irNZRwQWnl3jki5DbrynOm+2fk22l360hUjmMJXqdgGVFnRS1sh6W8IKdaJdqCCnju5D0wkEG1iSBQzAnKe4Q/OAOXc9Tk6bNiokq82BFdboCuX14IQgxOb8jJTC8r6w+FufDxMYmJmb4zmWI7sRSDc1Z9yi8GkywOEBIxea7Uer1qgylMoBjxMcOpbTKaDMNSl4lGnEZTxnpnkJDq86Qw+LFekCVEErsewARaqup2YHwz0v8nI2sCpbwfz4Rxztmi/3JOhoGpEIcGeAEzQFvJnwYXioirGgnYjZp5vgAG30QDM7xyvbs74ZmYZo3F5ULZOdw3DUKcn8SAJjMVbtWjRAOZWl0MxYUO/Ul3FSEMT48gWo+9jHeZy5xUi6ONRIkU+WEOsX/GZYwmTJGBbKO1qONaioMnSYfFX8bLNkbCykaiyX8gjbcxV5TkKoOi79SBXt6wvJXNUdmoSNlTgzu7axZSMmUKTeFAfsAyv5ysNAcgLM4c5aEAk0ybJPjCo2AxKhOrAVYV6Fb/eunDmzBtgAVZxybVKd2sXsEvliU8hGsFX95Qd0G1mQRfZJjTupqElFmxXp6+tHmlFstNZApYBYmp4PbnjA9bXOzLYCt+/mUT6kAQ2HyYX2diSTeCGXrYwdQlFkMXbAR8Ya0yp4Q49Lpl4uRFBqEGYUoia6EG7aY8Gmb6tME0YK7N31eiQyn4usAVIS4InRvxmREajQ+bOEKA4q3vWRLAI8+HT98Mf3iDWVxOWnbiXPGRWjPAvPiViEoULwsvKSUN1XS21mxVjJYeeDWLVgmWCj95HwFi5P9PcsfY9aHxBUIsLFW//hV8ApQ65gugLT8RAJyjcv3WLyMDsZuiZsj3JT71vTM/9NBHRne/OTwsFXX7EkESCUEVn8dFEJOX+DvYlDwGjTrHaqsDuS2jONJsc1Co6o3KmkbDcXzPN3iOwS0EDc+Z/VXkcO4Ch4qlC6L+LHdeAjHqdeJyW1Kle4NhjeplsALiT1GtWGhIaaAijcJFbEci0Eey9PHhehr+Z+qmA7pwgQmrFB6siLTS8vUeJ0tzxjq4EKq4mPeekPlgcF2EV/nTf5VtdLwRsFdOExQtyqnvOUs75Si7eUlQpuIliFDI3CWiViegOLA6Spbp5RWUGS6cBrcgf9zGnWlOojXxmCcmZkh0cy/e5vj8pOOlSPQBy1VzbUglXHYH5kr3OveMwrEUBbhYpWCVkxw1FE87zeYhdBd5V660Yy21uEZEL2xdab+CsKi3wmaoHUlLZQYPFA2hjCDjPCXYcSf+0e5zWl8VB1LRiTJmYhE6uAxSVJ1x13nYPNcVO5JJzV9xHGbVgnFbmC8fq38PFqS0AQJI2h5UiSAPbL4MFjOGEXIXEts7pEiKi535Jfz3303T3HSaQLatIXvMKT5ZpBdOJXn7rHa/67A+VBTG5F+fACp/jzMcs1abTKLSrRmxpvISY2e25mw4tmeIrbE1Hx9cvLjOEBCBxBiL4r2jILk0spa5ges2MeaCVLZNzYKDHkdgqh+1uOri3WQtJ1y++/EfXzbf/2Q8YwWWYVv2nhawoP1M59xgVmR2MyKj1xDmA/N4sb90GY2HfS/FkV6coF/VRYBdoCENWnJWL5Mp7+Iqh97saSuXba8hWh2lI3VeCiISck9OcDTKGPdSc2cHJHW+owSZrB7zUCfc4Ly9Blx7fJvB8o8jvMJb1gfuevlJBAkwpnfHf6wsDV5OrBjqrp88+6WaIxvnnmKF0lt2v5HgVgdVWIiF8tVIIPXfYfcEb7OapRkS300Y3N+DVe+R/2fJ7p5J9T0UHPR8iNzvJ6WoMg0jIh0YqK1cludkYIIB/OXYlHjuYZsxWSSyvMA3YkfMA1f5iH2k0KJj5SsI7vLsyOkWdiYjAuU5dpuxoEGwxs6FMJhL6qde8d2X67g+9G4qWCrs8VBqnxJBkGCjUNSxuYobjpZV04FYFKN8W+Ys7sQXNT3/FJ176x3+v1NGilZ4kIfJYLwtJ7BVPGGdJMUzyUGZMBakxcxhH6BahVIknRMHBofGK0RALxEFRcVpz01ByCq8CR2+w4g5q1HDxsXZxyCm39QF2/cbLfvab/vytTn+10keHmw78lrT7TyWKmX2Lh3VF58wSlZAi4vDx2LkLjFXwBHK+1OPanWBT6T6+5UYGjnl6OXozYb5CV97PnBMjRIDDpGQbKh/TL4BagYz10RjWARteUNcycZNN5DuU9lFZVbY4CPt+0g4C4I6mnBYkxsRoKNsoj7Jgph3GYtjQPV5TQEsahRUq1abrVoMRrhEPy3/puTmXMcaW9fAGha84rzakxZnAI+JFhIAp6uS2DlXGAmec0y63cE6gBgd6sunqlhRTOrZg6COsHaQ8q+ldowLDPQ6ZM5BhaFR/MshYkr9MNpszI8dYRsboRRyZzfBocjll0JMt+Olv/S4iesf7/gfrQnP3qdB4zSrQoui+u7yQNxDshGMja/l1R8S/fc2Hv/RDrx4JFVqvQ0PSnW+j536aiOnOO1KjpZx1BKd/1qnVzZR54+A5Z0CZhLjPgFciwfn5y6/8uc/IZ4REvkLe+ZHvx4lQIl3QrtiaWxBgHojolLW/2PEVo8TJKWSLZU7NOi/F+OCrvYMxTDrctLPYL3IIZhJq7rBmxBh2a5Dm0eRw68uyYWCgz1VwFrxW4eEkC1/m7i8wEcrAhAlqgMDSJWes1qx47mrBQLs98AH98pdwrvDoxvQVwfa/ycbaRoWbHRB0BP0CHYvJlWNlp+ZM6jZ8JYaofHMzeK58M9XGTm3K3xnl1tsTIk9eqJGrmH3dNwmgWmWgsiMHsTT72uG+EnHE1/ENWiHRehGXiVhnDECIymiaB3eS93EsIZsPASNydxG6qnhtjbvN6/S/wmvn7Fz5JmJRW9gWKXJ/BbRXnkk+PHxVIlg+ZY/joErMScTngWy2AO2OQBNCQuvkh6kvqRLYjp38Qc5ZriUs67+cmAr67QhTJI/1TgMl/1fKSvmpEuLU+RyhihU7txHaQvpWCEduGBRj5oP5KKb8N7/tu9bNT3/rd16Id+6KNDPd8pqoVILg9C9m1vfp9IU+HGjiOjRmHH2P9OIl51FkhmE1aTSCXLC1p3feQXfe7lK8GVDvTx4kpmK7gsi473qNkmwCETNVVtakzK2VdebRaQehAMFpcAXqrK1DXUREVll0V1/IFv+ZMVGAtTGEDM0ND5hDCeBXdMM0BsbBDUud77l1qoM+oE7m47B4HftrpJT8CCObUErNXvjoaEGGyxiU0NV3/Pn3P0Gf94R83hs/9VZIN6zXQjhQVeVcC0vDgIbkax1HUA59OZiPI3NrbOvHiH6c6MchZVb5TG2Xf1ygILdIHNSYAFjZnZe8vJKFn2VS1GLserGtuoPaDdjYVOXCUFNSpr0pKXJ1xwr0/OAqlubq5kWvKp2KQdQOuxIv7DbzBioj0TjTp1kwjXCP5wU8fxCZbM2VAISatSmL/y0jzhbUU4TRonQpa6Yc2/UhGTJbv7i/Qug6QBSWOrt5J0ZwrMTiMd4gUoqUTOG6MDdYUHQF0LYarAmkcqaodBsGCdKcA0j85cCVjhKywmrv5bXJn/7mb1tP3/Erv4TtCuwgMSuIBamN2kDiFJ2ahXl/McfGu44ACklzDTSWbjT0aSVHz9FDjyKRCI6aJVJLmS/98Ktn+gZDQRSzIDRNZIANi+HkN0xWCepYkVjFq11qfmi2YvNlXBJjQoArEXEFt1X7QITJMIjvEGPlAwihITmBf3F/OWkwiRXjciZfTLQudAQzL574llAIbBuuY2apRapEEWiW/+x50pUkjk0CfdC7Ukj+S0yZMVDX1C6/8c/fxqwvv3hOvx1t1E4HvbPJCcUPsWFKNOb3YDrdPc2T/oDoK4fHGcQoSVtdbiNlBpXym6Fbe15DeinPhu39SrRtqL0RbM3jkh/FDVsI1tzZPthmP5kPspBwfqQAK+tkhqTefAlc+b2cHomtHRCpj6S9iz6GrAQNc73MRM2+P2XLFgTTsV2Jf7nUQA3emfyDz+NYTmooaiAQc0bqBlENzFnZp0Ta+G/2LnOsDnAAhspJQV6sUm0mgTYugJsD00iH2PKS6Zv1hJdb0qKAropu9+4XbI3UukahZacPPo/eJdHWupNWcJpWT0q41e5+VfO3AV7yhl/8H37m276LiN7xvp+fWi+lJD1Kel0xK/YIoLM6AAskhNc05tgZUYF+hjrRpL7zw9/XCYKChWvYIlngOXoq4dajp9yIOWXYIREdTDcZ3K/1NVyDC4JMVncTbSEh+ZaPfKe/0WvHD2arIsNdqcjcMs9zDd3u1IJATCQ7BMlgvvoju8se2e8irLilm7dPSr6osPtdxn85TCrjODQwl9BVYJdK0WiF0tNsz+NF9b6icNFB8RPFojcmsn6mj2GsS8CADqN4P//xlVOnqhEm6vo+lEu3cRKFN5kEf6pwUKi5/qtKoMGr2q6uyRBt2m0uJcResB4vJURhUANV6NsA5JvcNzux9EB2JjsKCyRPySkQKlE3+QkMxlgeV9fQWxEMXwnZAZK9/tkbCdXjp7dHki6qsCM7sifEJDLcRhFcXLv1BHimcLveJCJwFJbkY9yjAnKDJERt5dGYSUTJrJQapntyYw1lRZWSwrhsNY0Dorr9UQFLJk/rHiycSuO4zuVsBwPNFvxgT3fxRigGfWErCYa7diSKqEJGGHhgGrVEzbaB1weRvP2Xfp7CEvfOIthynOT8gdoEBwXtWt02kGeceJCPSpQh8N674vnggawFAF7IAIJePW9Q7kBDYLzimCpwsWEwLachrOi7v0sYxxIpS0NqOS/5IcwKNlRTQ8sonnQuUbYQ1XpJr0A9H0T8a0zzfWxilRKR7T5mw50qKnvbIiJ+OkB/hC1CN2LscmgqHI5yylUyj7bF12NqdxlsiFW/6ampj8v8GJIKygcl5WUKGIxS7hMUzx01KZroH2ng8gMkXAUmLNHypLyQ94Ee8IYLTDnRe4h+h+j1ReOQ3lBYMBG3hD4latXL3B703AJ7CYpNbzKnZ1ZzrA3dRFJFmZZ6dbLmKMOaGKeOmx8jIuI7CJtWEm1eJ8RuNDSW2tv8DDSWkUeHAuvEPERXY0sJcywdCJSwDJSck9NFIb5BmuskhtyyX2fu1b6Ahjzlv37Rv1pF/+efe6cnA8d8+z+6QLcImIhHZuh8NFhHyMP5Ap/KMDTYRJANLIq/acczm2kIi+nHw8zBBuzmBdCckn0Khz6Gielr78ifYpYcHwDk0eBRdku9xfiTRbQHV3I9WnDFGXPfSkEB9176OV7X4ud2gbN42yZLP/Gr2miKaCikOYnQ9Dw92Jv4zRCvcwi4a1kUsYZ8nYVBxhPyAhwWLdg/60UxaRm8iAUgzEcyueNnMYyloaXF1VOISU4Ts3r28XTvpkyJYKHTwJD3roxa5ooW5kBCrnLb1qGXrUaz4zrmxXrAiV+aH4TK9HCY+/UXQdCJFmuGxieJ6ypAgWOLdlzhsp0oBoRPvozhb6W5V1J/gbxNHe814yUpryY4uiodSUgCLcZtUJGZzGTnxV54y2Bp7uCmFTHBiBQA2Yvm/pGPGRXtmt4RwC2TD7FDtPiJGUCakm0xCtfGfwmCYw+WEHyIMCRV/KxRDg1SZQcZeSGRGV95sZMXhhrcLXl8y5w63teK032YT8svVHk/wZqSmOIxKU8gBAAbxe7XG4aA/EVEatX1r17069HYzZeBLduZ7TSLCNOxMBb0aRBWjvxqwTmrFnR/1q0d8slQwLYdBNoQ4nixWSJ/tRRz7T6DZyain3vlj630t330+yfiRZ29EBO/81f8o3tul73ddCJ/NGS/c1ioqZzRk9/tSKxD/gMkrhCW2T+Cu29uuMcuJ3aZZoRoefCG6uVygttuWtwr/7Eqj32MOQ4E/ldft14MpC+8Q9/0Wz/TGi+gaN0E4aTSA/maVFYfnOrD8JWTnmx9BK7QtZmPETvGK+3KXXvbxc9FCp9PsU+x8WQScmtFT2bnthe2G+R6sb0AK9HnU4154Q8JUfsyYDzrthfi1pxZlNU7C8ul9YOyoSwImHDvSUm37sxf3WSyg9djZQ4kuUwULHCl935jLQoQtu8GsGGMOgf5yX107d61YEd3VPRYgVSKouU81B7Y05vQTE9LQOTiyro9pBT6S9cabKqzPtr3rtDHaEzGC/FWwV5c36ZUeVrowI9pqAMJb6kMtPrlUnyeZ0ZFROUnZAeMFdXaybaewQLrWz0U0NW0v95qljIS3qIVAYZuJBkqv0naNH+xwoU2RrcNHUnk5fxzO0iuLxZodUMMPMAWGDxJQ9NFtq185JwDbVlSQ+ZaDSWdzbShjqGlKzwkSnJlKp1DAn/yFX/w5R99nZVgLOQRK7qw9e4PA6krYRr+yOa49HdGFQOfzdDHZh+tHAEc2/vvqMmjPc33YVtLABPu+zh20ybFrHi2eNMQW2R3TmwrRKXLN+oS8qoqyJpLJIPJ8Y/yL+3NQoa4DMTPCOtA10ostXTB0RWIrbAIkZxyqoe3uczpm8X8lFrY03z9yXOR9XFCVUeb9iRv5EsKk+4DS60cxmrLO4ahexyJeuMpydRootqW3Ho60xW6VqKbM7k99tC/5+HtDHZ1WzPpwmtM6q5dMgaxsrkoNNzuStA6vr8kUeHNoIo6fxbzk5oXw+Xp3QJjIA1FyAcuuh/9wCBWGUnwMkHcECkYXdUFGLoo6NkHPHNzQbggeLatR8blQiLrMa+Nd0dmCds37LauAl8VXPdKSG7M8Y29Qlgl0icH8N8g4qDJJ0a86mMndx7C8b+LR+ngBngvfbzYTc+YbVKDLbWY8j2fe2POz1Rnis5bSe/OpvxOFd5397+xcUHY+Nwv5OqNlw15VO60M/wM60bEJOsNeX0bXE6pgxlVAUW0onk4vzhgJjf2ymvoSq5iw3EcWhcnckTiF3StHGaRYAnQ75MNq1+EkxvAtpCHnOufODOnCKYb2QGtTClMZy1bG/dFrbowEiwefMC822v0Yvhc+n2Yl/P0oLU147vNF2XpPgXIc8NS24JGRYQE9j9aref67rqQnKfipwi/naUa9+O9qzI2HE9PkXOhK+tOCIDoORcG8/S5n4qSbNaRsTZadZBhu0y++DhMGihbIDbNW+qOYk8UMnbEy//QQ3AHIcmLwKCkkpR8lhqZwaypGjIfCzPedHbpv9tVtbL8dakYZ3izejjfalXeIsdbKcDJaRyhwuL0/YmROVnbVIux3OxVzlxPk8oQqkPAufubbHhJy+863vEDUm8mtJri21yYk/EQ2rVEuNu+3Wu58qDpw4V6ShZ7kCRjrGqzrEG3c4IHxuAyP2MUCsYAJhb2t5yNStfk90iGNNml9RF7/XE1WuOjZXB8Nt/qb9f/4nPfY1m9Qo4Oxl+jWCEUUTDeS1lZicx5NmNZ01SmXGIE7PooHcC1SM8avvmLzvkE4cYfZ12RfgFq7d8v/9hXZYUkSsOXmrW/eDLTQJ3/ZW0pzARu1BXxo2tBdVMlgwLbDsVVQ+TZoOGQw1zVVjKxtglvASEp0cFiqqeU8d9mi02hwE4iH9j+fO8HflZSHxm7lluRZ77hi+/9mz8NQmGf+c+87n1uH9/+e2+hEIrCLhd7tkjYzGbNZqt85BgF159SyICJTzNtQkQnmUkMSRHx0c2g1ptoyFE/YePr/qIOjGktNUA1WqIKAJuy93cGvXV3yQys1+VC6GG6oNp+RA4USktyw7c4J2L+feAe1FQj2c/YVDQQEkJZVNCqoPNyT1GZkSvZXBJtW2aPBKF1bcW2FilZIbLK7VTKTpB0oyFSDILXI+1RIgdx0gUiyWCoytHohkqnpkcyjRfeifQd8Td7Xc1uZbUcc7y3NNG/biJpKawe0wDx9jEGyzlwVfph5sSxIhHliWCLY2leTBFIddFeVXlJvulU9w0mKEhrgCbT5e4WsVfxZH4T48bp4KILnSk1b1N2iURkdstXPNUOi58Na83KiecA6eCar+09Kv26pVSCkyAcfjGL5tQQ8cBP0LQL7VKSpSqYln3bR7/fZ97+Fzrri1bFMOlww5mZev7bZEm7WUmwwI4v0P+qTrGqa2NfkMpIc+ps8MSBwsSiVvnhM5PDFkcJhbZVSz5kDP9CHiRZR1l3AOrvUDR/Nd2vOniBcSxjs7o/9Q1PEP0Vvf7Fb//tz5R6zCpIHGw6Y1+l1dI7Of6ziPH8Zg9aFRE51sZ4ESL6y+94y0t+4X21zya7OOtIsxHNoUdLOJ9Lt9yBoHWchKGo4c6ZaWncUMJGyyRe6FFCocq3U11udPhvsfJyY9RgmDaWPoz1s/E9GcBFm6zP+mTQQ0QkdJYUoLMTugS4bFahzCtKNNw8V6db+Cmkh93f1UcwgQGqQkdE4DNM5AZqi5pMYWl9/RMmXS7nu7Hsln+bbVNJxMXNisVKK4K5WnwUfE6sUPw9u52QE/wLwsMl/x1HTmE+YDxwe9YucpNRU8IuuDFrd+WwE1YjlI5mENhzvfxzh1qyuceUXTqhMbV/kWtjQTUfN2mBZdtW9QIuD1Pp0kB4AmXLWIjzPhhJMaBRiIs92mUbayjAxdocBNE0JObQhZvFOsCDGnZIGlXQFRHn7/l0grnd6LD51tlQQvsKRwMcBJiDSQMG4rN8yzxH76Brq9N4dNn8DYobL/dwBEzOJ5L0XiDSKvOzdhSZMFQew+HKlnQJ/A0wk4Azcf6LJhzKig/TQ6InsnUWWoYVQIMhDzpYpTxBCon/s/VeOU1pX5KTRqFi0G0AgXi3LB6R/KtvfwuJ0Le/5Xt+8X2QY4HAinLyxINtNyqLxAfImW3DlyLJxXxcFizXLCSy/fQH8RGH/XAMjpabhBa3tOokNgw+c9K+ww3X6EeKts6UN8uZRXHqE0i4Ng+TqwRMx8gfVr5xZCnRzWweYt9Zvx6VguiAnLCbPEqdi4Zl8/rTagAzpZeW0BuiyYKC5kxwIofyg+GrIm+3jmaNunDjI1R/NMzYtXYvVxR65d7BeSdWjN22gxAU14NGscDCVfHmINLgGYpXC7uVpZA5Ql/xMs0Nl5hBqzkLRID+dOSEWxGFNmugUK1AKU02Z2DCtUWKxWEz1CPwsw9JmM4exCLa6TMx0Qns4XgjAXfW7sYOhTsJeu7F9TV3ZF17i59yZWvSKYHad5wXIt9hwK4/4ruscPpoNeE8eyQy2dx1LyLMjyVbLlYzYIupwgqtcseWr6Vdhhxsuw1Xp4upCUM3f2KJswvJCKxJF9zqGMA6V9IdyfmCHiulzVXLxsyvlvsfVjeuIMZ5tuK4b/+9t3yQPkREX0OvYd0/wCugFMQvblPgaFEpcrIkGzcGOuzbEeBjouuiEAGsDhERf8db5Bf+x+jo/AZ04iozn8i9dXPiUk2i06Im6UMryOsWqM5tzw9cm5ADBCOX+ss2uVf9gjCYDTzjKkJutBEw2wO5/NlLMpV4xuJbzS+td7WhrSm2KA422vHTigbZY3vq0jv0qN8M7cJPAokmkyI8WqykNGOCcszOt2DYspmA2NQ0tXksEdkOMPdQOJUfYM32JxH931/ymN//R3/lC+7JOmC/EPPhvCUQ9k2TW6zZSVofZb6eALQuMJHcwWe6ad18z9Lb8xQbP9ktFBYLW4SiOMgurBfop8eoQiyHc7BgeVHwZFGZ9GdAPNb35bdtV7hZhmW1Oc3bxF0sRkdq0L66kxuientuZJ5IRPGUEvusC9E5lKRR0Hcv5lT+NLxCpc5NSqrctVTOk4+V2D8nTEWI+DjkFKrhE8xev7dWtLoswmTaSnVoqth0IeqMcIvGxkeNraIFJAFhZolW8ADm6FxL3+hNFg+AlhaXir8iz0+QK9mUtfLv/ilnGLo5Y8QlpLCNx5EKUT9N3rBLtSBK1Xe//yFFjz1AYqon9DX0Gjx0nv3wyzVwUaM2z1Wqs2PDAoBxRyBq7Z4xKkLEHOhKKAPpIofu6Z1NxZ4MrJam15qOBxkm5mP8APAaIrckbelYmdJIcCN9ZaH/RQksK3ESt6kjHL+2lnKnFSiljNm6xd/U5mou01OhxEafHox1s42ll8JqwZ3pb8GfOdhT2IFkYDrlbayYsquKIBGFhIiED87LHSX3/mROHcPR6dz8cxrcNEAmw10MZmSSk4pkYuAKycCntnrevqKDP/NaM61jGoaXhPOHBXeinK7DJl5oaVcQ64VgrFBCwExIilDM6SnLa5olSfm90hIk6p1gomMZXqefLPJhjLBzb6JIuYmOTMZ4o4dGMvRlwGEKp86TGquJyL4ou2z5SS4EzFQ3HmVfojdhBwerLZF5E7PZ1ez3IIK2JXZtBwS5rL4NnIEb9HbVSdJg2VvXWh9rzWMf8WFVxTZkToZzr1tM+FfDXRkcrwKG6aE4NLIGHTZgbtAVFbucq4X8m4haYxqqXnp93UI1izgL6CZjvN+FZtR5GtKJU0lcjmGrMzCTEHEH5ejeLKvnNAEXSVuuOM7SA8oQnWEUmeidv/jLlGTETjy5/HCN1c1NYIxd/WsQsppmA2SVp3nvmy53m5B468aOdXoB+6b46K5Mu5T83m2Lh7KCFykiKL1sU6WJNy/smc8Hmv2ktWmf3b1kD3Ozm6NQhJaWEHQoa0ZX3k61k30pJhuTUgnKNR6yMBELP6GJPc9LyVyDgIqFilbXQFPZG69kT0qKZ8GON4KVh65CA0ngLrLB7K3ThfxZ2R0zhfwtwsBVVX2ZcuDKac4ei+QMq8dEaJwcY53DF3Iop7iPyZWjzPkfqL+IpkARfzPLbfF2A5vCYQ6hcc1ns9e584VRlaRkvy5kuji1rZJrWI6EiM/1/re9Iq5PnWN5ykvIgivAx31csH2qA1RkV3K7bsUsJ0NFZsHn6VFCAFzSbgrVLoXZbVry2ljktNB3h5kJl2QIcuCsjMza+If5YsU290h5EVXOlsjeVNXMEVVdv9ncbDIz/Qz6waw0hAd1yOpCknNqP6zIlYRcpeABwDdbeeT5EpUlgcEftIMoXNFBOlo7Y4uC+2TDZIBOMbG0L1S6Y9PfAMI0WSuAk883RgABAXBNQK9Z7MBSbSje0ZRcebQS+rfIFuLjUEjKlSm67kPgPZl980pGXa0Dvlx4hIkwK0oEiuxdy413Q2R0JxZ1vgWvrAjuniEfK8wD6wCcKam4p9z7jAUJ6zNhQHh844uTiZ7Gn2WO/EWxajYStEq+Zh8AK014BIFZC3krGbK0PjJnRhQ0N8zcxoxbfPO//Mvnf56ffSu9qD26gjX470iPDButal7ocha81GZIy6QdrEuEN70gk1ot7bEJEeIwJoKvH/LBx3meB+wtaPRhrKlYfXXUeaIh9v60ITDc/Yk2h6bf2mSPN7AZFQaKTIKzWFqkoTtvN08hCvB+DQ35a2KIYVI8+322w0sLf/yKeadncH8xAVyg6sITYKHMoiJ9gLfcO2baDicSSAVGqj/XwxXNmnRt7z93GdAVqZLl8iudOdXDrSY28pjQyjAvOefU8bBTE7X7rkh/tHRrqKEb3yJLOLI1MHyg/l1slZS2GKRV6nus0WlvpfSHZTHnkgdBswkvgTrwFH4G66EoLglJzW+KTpR76/ZDzEP6kCnuIollAqh6rzWjy970eCIU59vL3LHZOhQqJTvXFyNlS6LLJzIyqtCQglVq68itSFa95NoxanDgflbS4Bj20XZSrz/c7A80we6NkjtMJEaPMWZnhzII5hQj1XxHaa+wRAQF2/KkHCaZlTk/+vDt6+4Hn4BPFGS7S8n24mP2hvLKQ+I5NrfpQR+vgdVgH6pgs1lE0yu3iwIbPJrpqegqfGjZa7+BZUrkW+nxZMQQ6jBVgSevv6PMIcBfCCjDV/LDO7ZiFqB4asafjB979mty02WdTcgXBMfckW05BIsdg1h7nebdtP8boMCTIA5N+l+OZURltBBxks4Skg3ZWi/q58hBcghi3+Yc14PMax+AwAYdvuzK1sd2REg5LrgaRTuoRTI8TfMe81qaoma6vXFieQf/Ol06g81s2Xfz6sLT3yiPxaaS0aYwHN/vhwr1j792Q1N+pcw25ysmLV6AjZm9vqgWdvM2Vwt90ShROTFI2k3RzDrYiLuQbAnDE9SyXw8CFtIyjNLY4owV8jWz4UK0uhpyXZs8GRORjyzYk9IodASotVYGjCI3GxyEKJ0nYeWhiZ1TlKJlpY3SKtt+tfWm4WSIxExvpEVFS6DsqCQeDQv+hoW/yziWRlh1mPF0GyGK/TpobL0Jzfzer/jtlfyuP/4Gm19h5t40U14TtC1+tENXDhtx1IkcB4xwp7eVHzSTjqL41694+xd88qc3FXpi2R4AsbUmAvsodU8sZBHz4fX2bqwuQpOdYG86NXU56eUhm+Sf6anUzH7PvuK6L5gY562Pb8IOVw62Of3OMum97tBt3dyBbyxQUXJ6wTuxWqRUQERqdB0abZVjPQxfm2EOEKZYTV1CIWxAWj6qOSzkSCJsigIrPiBKDW+sMst5cmJWHlpgyNg760oNGmFPId8hCUItax18WIhU4pRqzp+4NlfExlhhqucNdiSxwxYwnCVHVhsiso32bsT4yqliDwPymT4AGkD99AiHpyR/stJOHTixmSiuOqKt977AUVjeu5TH4SmnI6e9B6dKUCCrIvzJqnYeYDhXU45hDKZrNDo7BACVZ1luu0ZuMXCAcjQ2cBqcDcUS0wX9ZrCesnDsKg8rf4QBwVg1UZAK1IrKuIe/nYjBJZm3dXbB2aIzVcVSI0oIiYpDZcxeGwnjaoL3F7+cU459z0ZjgYk1X/JMQAsBMYuOg/xcDQ0GsOfOgatUFXKYiKrhQgoJzY2b3zAaLgChUj/2DW/Sx3/93xOFqQ5fVTjUrv5Gfe5IK5OOv0VfnhyHEsNmkdJUalhxWU+7m6sNZ5J0s6xHdj0nRFlwoFKTiQn+CPrbjDmMj5hpSs8NQIRAUtIOIwiHuG11H4DRQPHcEe/FHsePsGzAZE4v6eAlt7KBaBUtNaWQymToT6nhTsshVHGVXjkxFgAbpupF8Wl9bBirpxs8ok6MKFTIhtbYR8kEgfTbLL08ZvOEa1nQbpyVLrggMzeiTVg7Qz8a95ABr50ViR1sIviCpKYYzEpBQFR4r2cy7t317uVep4d7v7js0rDoLOhnskeskm1kuWFml/Yo3hv3WQx2mZ3bsbM+UnT0wfuRf9bD/y3GAv2p/YQj2lZH3SCHLYp3PBNbWmIQ727v5lAK0cEHvnqG/CBxjUUP5DoMjarIx248D4lr4BMobSEAXzfHhVELKBhpEySVbMcSnktnQVHMILnuGUVroLIjzYE0GOFlfNoG/QGEF+QQ2UZ7znlyneu7zEo4txp6CVBDPW5lGPQFjETOaJvpXF9LT96XIRwpPoyLJ6N6TxgrCKZ0KuFotdZdeiREWXoRftWG5KVv4qf+NfETJA9GEhaQKmzB2JWlHJS3VmVAI9YdlU/rdU7PolXZAggjj//8ss4XfPKnTSZN2ICYXnX6DRYbZnQ7EFNhn/9ooDPqBGfEuXiwBapiY9ohLngoHFt0VbloKFb60zqHwTpxQmgGnqZrC3NTlpoHUkKIKtvt12VAFwCWu2Vp9gh/NFzBICTJggzFE7DAWnfk0cQ4A15WTETal2Go5LF2i0H0v00Y622EvqWqbmmuCfqGM6PX3LjSbLPQyCGeam3lqkKFYuqV1LIo4ejybQQRtQDxkZmz20515hPwttfO0L+AlIxiY9k3U16MvsWrPveLREQv+nbLhOcMHVYsQQb9bRjUYC5nN7Pxx7e9xrFeNo4O/cYo0KYPF+hzT6s+CYZMM2u8wV++C1kReGqkyEx4k+G16aooYFEKET1KiiJP/ImLQ/bgHhS9cGtk9+7K1s6+tZotIgdSJ+ZDT6iC+MEQB0rVCnN+ty+wL1nXfKoQdUR/QJx4bfgD64/azSgDiiDZTJi/NcmxdDe5igaIk1Gdgl6Mv6Vy0F24ykDw4qlfI+Iv/OOT6N6b6asaDaZrAYbwRu0XbpnIhrqXKh3cciAu2fywd1hL+g+++KfjZ4Z7OM/XHWrlnC5DaDqzPBDBXNF40+OxhIuNssijxe77SJG9V5/Gesm914d1YyszmQxas5tU1CQlNk9dwAflbZ5eQYOnju1qE0Xsc8clTs7NsS7JyngneWe4zvMqQEebffFGShND5m6ocpFqFxesxqq4rqC5dU+QKwOvAc8RGBMzZeBc16iROSGUAoMHhtaLouZ30OFdp9D9W8QhTNYnOYPBJmY5I1rg1zrAAWoIIcA+BovS0wLIeJ/YSAvOz30cJ16UgQttJwTJkpZeNJKwO0XnF53EdOgqmFnthFGJ6Zmf0p/P/BTdeycQX8LLTJQG3r2jLduAu6xfi6E9P5MHzW4sTgwJ68bh8qkaWDDYTGalcRdzsujLUKxJCwmDGeJSZYHXmQPYO6kjsoSzgXvScELGWDOD3BqbF9pfJdp8iSGoGZxw3VChPl7/HgBjpiDBQJwJhWuN0My00XaFS5hiOQXKE/A2kQZxLAHknRvrKUuMIIzUPG6UxVhRtXxQ5D3v//VfeUREdP/O3W+gV+zRz2iRMJvkR8hABnEarPBJf3DQV+49XhnWfrkcTuFBSXdjbFJVCppCzVlQ2MZ3R6RTWuHsh7/yla/5o49GUri8FIKgGM0YXMIhWOWY9b8My5lmKZrJTPiGYpEX8EqaP04FLZTFzc2RTR4WRdhWlVLnQwuvBXUzNJ+mFmWM6iZ3DLk77xFsIYhBIbn+Kk6Lio1ZXBuJKAWoJI7VIYJ7xgWUzbACVepKgWs8+bxUmpbGqIVYBlG3rq83nm/CTGVoi+3A4lvb4RecsH86xzxOYvI0uL0J8WbAUVX3VkqS6wR5ZPzHK/R2ARakK2SszSmryWgUIsTx5gxDA4VihzFxLuhGQrmBtHl/0pwGjYsjgnhbioniaCK1W51yHsfLSfJ5pMA5hgNSZ6NvP27JMAVLZ29hmkWeZ5RzeGnghV9LoZqoEuWY1ZY9kaFYngktIWTp4pfk3sqUOV+XwOrL8/sEnmczuEjeXumLHyoWHw3gJpLUW7eUdGQGkS4pNidXumMtb6jVRzitX9LDXPSazboKEX3L3cWNVyglm+7XuRmxZQa7F+/AGqEFUoW4qAqc/F4iOekPH6PvA/yKTaF9u16vF+CPpHTt9YgOaXwKJNRgc6VPDHDkionkn3/lK4nkd1775f/ojz7WCo70qDiFoGgTtD61GS0eRxjMRWTtV+pBIRhxHnQXEYxVMvEs9yA1hYivpSPkQpmcGQs2H4mEeSDkh9qWY5Vj3Vk4ahgz/9W7OF2LZbaliRznVls2Iq5mJpbaCBPJKR6ZuYGC2cmwDSczH0SHkxrUBqkDwYNddj/Hy04Ug8v5YwWr7HEbh9S7kOCmvScoJHayq8NTnvS/WNs8QENOMs7TNO6y/28RXyrkgXXbYarXhGmIdI+/13+sHmUBYR7GkQ/2LVaJIW7wVU7uvVPL3fueNZQMkhxUcVQlREwH02H4jHkdWrsGfWa4Ezaz1D0UZ/TE85Uwlt8cbAuH1pNoXLyqQlVCV/0CkasZNrRdkhzXAWnlJLOumMygyJxKMYzaourwv0QO9Nt/7Lb5Qj5l7HXLc5Wf1AaTzYt6KSoGxNiTjyqIqZHVJadi+nUDssTqYKCVHL8Us2W9d2xBBXMr/u9R2JV5S4cNCh+HBT+UYM4dicFK/wmZDHui/lRAF+tzqsnN6TS0lLoWD/i3IzHNspgaqaPaQBOz9wQbhTq+qt3W7OPLqJZu4ZxTcDWbSR967as29gc8INt+16icSboyJj8IjDkqTV7LkcYldzDdg0SFVip3jiJsOvImGlPnoF67jQhisQ+9eOwDHuZjncJa/g5l500Rr0pS6N8Vpk2Ui9rX5mNbreYkE1M2Q9C6wxYwTwLq6EvslGHJmcN51Ai/w9LgC4wEpwBju6b0NPNJveUSKotKyIksR2ddzoRS6yXnedoUbEEsZjlh4chqUFPrvxNYwdi+N+cdWw/OzoS8MFRvrImLrbKYbb5A6EMloJKIToOpglZQzk97CyjPQVNtQH56eu97JqVCZTZnzEzpDSAmOdcrW0zkyy+suoN9aa+i7rgBi7l1YWh61cAH4oAbODZJpcezQZGyxpeuFnDdtev3Telq2fKGZnSWVKPX0CEmGIgb5q9GsDPQXtDwbxyRGQduXZXteCRhseJ1WkjwzuwNVW1MANugxNff7InYUbTallUyyIaWGCY2qghCtiXTbL6sHmGD6ISY5NxtQo0JZEQ/hBVD8EF5fg9XckC97mMwCCobJmN5akVEaT+++4vIwbEqKk7wQW/IspANy0TzqJLQnWk4YryiIQDKWrYZZ/jJnmcrWuGMROt97Yc+KsxSjXOVTw4CXAKCZqPTIwX+N/F/69hCebjwcDVbJKR10PepsY3d+u0bCmm0aSSpRxPfEh82/ivIW60bNzyEzK5H67rjq075uHbNcZ71A4c7oSkFN+Aku5YrufQ+p1eo2I5pwLHRIPk07fJc+lftoTsSeFR9wAX6CfwXSDTmYqPEzyJXMJm7+nK24coqp89LMv3rJVlDoF6NRFQS8vs09HCZ807hzYVnxU7NXd6o/aWnaVOQMsUx8SUhYT/dLtkgvOPFD/1hJ50fem47bHLnUjxuGkk6Rhk3LI7nYK8xejkiQ3xCRIftbhbxdcMRLwwMonA/IR680rnkLQb0BkTbmnKB6dj6VgU39ssFACUBhB18IeWVHob1BfE/mGD3GUCE/+M4M4MJBjEUL1kQ3jfhGUrv3NwrmhaHKyn/zrILPG3qX+hp5oQVu7N1ZSUaMd7xSQyUxIBZJAvTLKgVbix87FqwTpN+iyKYtMdQWpQfv5RZ+GnaenkBGEpiZvPt+rr0yo4vOQQtRKR7aUmIHqP37F6s3B+6O5t0v8CwXwiS9qCgq9K1YbChGXjc4l5ExPwP/+hP1rOlOK4IXrPFK+KnzT3QASUEpc+EDogRI3EMw5Q9I45g35ldvUDqTgA+PAMcwFZ4/EqPyufViLlZIGr4MgOJTi3jCKpeiDDznVG4EQmV+Jbd18xNvr3sLQUxzTAcQjF7GMa3XkkDZ30ba3ox2Db2OsfBuBtbuz64HTGDz0JV3osJpLqXs5rLcqiVtRJZoz92oIDy0Cg5zxPWwhiY3Jqt0AGrtybBhYHnxgtZXdEG5ImfoAXFTydZ7PmRlziPSYJOyaRutLGFEplK1xYugTku3uRGwRzUxtSZMOE0gE3bhZmEjmOBKXj3lCm/iTZciXzBDnCIq8+ZUskS9sNzwIkU2a0bKnYkte0dvvm11oG3VZBcQkboQItd8L0+Yv2tjL0+lmoizJsQMAjCjOInB/IKCbldG4rM1h+mwpY0F8/+AM2n/4XoRW8qOSFZPlDtA2wJrXSJA70ggznlKlegLYNaQXaU6tZ+UuoyFpz75W6ln8LDGZga/Y6MC96o1hskraiZTsTFahOtt0ks/IAI+EDn6kKzwBU0jB7D/bEbHDdrYUuaa0YzhLF5p6TQ7fWsG5thtvy+LtT6iF6S3Bb6KbXAifnKA8mVuwZHpkKl6lAHPg4DZ8mumhpuzMXK0s7Bunn+Cbo5SMsYmmWissk9r18oxxH07Ojou+C9k0X4dh7lYD9owRVPDF21zoJGRZQi9nvmvECMPWXbmdcjGdRqMJo0IqRn5E/nPA3DOuLOno/TP6tjZt/Yj7ei3X9ROJ31VQarjx0Od7kfi4xmws1ZQk7l3oXHcKHYiKRDp7KYAtBh+uCX/eiyl1/zsR8kNZDjGwpbVfG3jdHuUFBFFOdHdMUbvZGGoED2PNKyXn2HdxXVwVlUKwSyd0LSv2kuG2yJIc4uGwPAynMSmpVXPXSJ+rQ8XTDwcl4R0c8zPyRVsHdjHzJmROGUMtBpei1Ew9eaUzeRhxO2I3i0M6lihHpn+2Qq7rtqDYY+IR6EX+4BRkFFF1tUzMXA0vU9Ys+cdWfhK2N4C23sPYqYyO2FfrUOKzUUeWNDTAEZFUFaXwrfKNXm1HJmH6l0GMX9CtQi9ukNR1Tm6ZV5rXXKlELSxnGPrV8WwPhO58BsYI0myfwcRslfjl7cM1hQYQyHUOEljf90ihxrM91xTOoY7jNqkaJuPsVM5dU1MPadoNTYQfTqhMfM+uTWG7WqYNFjayQGkJOn90hAoS0qjRDg+lRO7J2CVuevE07LiPUaQPfVT5uhli7bzLWZUbhJr+BBvEcLEOlL6b6yhnGsNUQBTuCDpsoKd160NFTTy2Qag8hZLVyBktoYgGtgpYgtk0qkHbsA5y9wNpHsJsJPvN+DJOPvebrjNrzp4lUVYKzBnzfbM+lfTHywSM+QU0w9/+zLfq2UkJ55drpa7IBX7tn7xal4q7AmIt0QE/Zjrlb0yt/BYZG18ylc4GpHpndKpkYUG+XH8U2Cm4oLmckQIgNS6txynhONUWfFpQyE7uLpTgiw4S/lXhfztN5FX8xS9qqycCmYRrwOn5ldCbwSptPlSv+Ei4WTixO62vHZsYjY9785KrYb84bFxnICc5kXhWzIjxkF41iQjn+xCOeb2hmefpd0yY+zjpiHwx6xnWQm2KOFDC9UIGpT+xqhYigS6CA6yz6+NpDebuSNP94IQ5/RoDUYHt21cR2mssqICxeJXCrPpItD6jUYB4R/eSqYSdc4pum4O6AODqRJCAwE/Iby2+hP7A1N+5+qPNdJbJLcUnWrIWYx+VEo9cbRVGu3k8MoFV2AvBmQFcsmRHynoh8rhol9J1YqIkKbw9/H7F5k6aeiqyor7KBL/Ks408Xcwxj2sSJjcv1oIAyJ8ZkHyXGQt+wEzqzPdQKhQG3R9k2DFa2TW4R5qZ8tcMVEh+5nj0RKyqA9uMZV0MckJTEZuohTXnUmBwZuUUMyfAwGLmYtoyOemnapB59UhF7BTRKzYzhiY9XwE1/3Eq/hXR/4q067T4eWt+B4a3eRYSHoYx1GJ0amR/6J6Bq1EKFSZONmbiNSKiqLfOn1eDkFhl5y/huIIbMytzBGcdtuCq1obe1v11TMOJNUe8A+hWRIqV8TdzenC0fglGlgiKdnt3v1gTPeMS1bd512W5FluqQMUIpNiuCx4NaXimVly7hGZkmRU5aDvBCL6FX+Zzlx10u2T1pB9JrzPJOnm9BoRFcYF7ES8PEf1i7rO6PpAFpf9tRwFsNbUGEoAge0tcj0Y2COKCXaBTMIAj3tBudw0HMVGbpV+ghHQgHA7WKvq4SMnbb3HpaDOKyDqYlm9r1psLrh6SrGqUXrmQ/7nE1sdBwNfo3uSPHf0vmLwBWlDJuAlmdLYTPyJcITjqwEvB9VuW7jvP8CeG2iVgFau3cpASrsZ0Qmjha+Yl9UCEqOMGrVkFkhvJF2Q7K+c6Fr3BqaUKtWBDDvcDZMRuRfscrXzC+ldFabQFTMQqd6Vz2ZC3ZZxNUh6STKZuuWOFpo5EbHX0aHcyLvRCK1DKgftTSjq6j55R/7Bw+//OeI6JUfe1upwdEVVH4YKKcuACuzjXUdux29fgeu0qRO1I86wmWrDcKpIF1nJ4naCbrpRvqLve188wkWaPwLp19C6xORoY+3gdOOEhLXUTHV5r6ViEX+DfPrsfTNDaRuxNbXgBzanW7d0Au6YwNeIZtSVzsWSf+6jY8ASehLIiKMbzSy3RpdKgMKqrXwUVP/jBM8MdICigEsqM6GIEWMPzNTEqFpNXvqxZyU/VDKkM44XBVD1Bz5IQCOXWcZZ1O1Z/BjSToAvBAd8VPu5HQfzq11tyuDVm3YYP7Iiwkw3G2RmzuBL2mZ6WhnXVZTfKVJyP+CGr0PyfTl/JqjDQe24HWuIT4WSr2gKUq6Sl76lhQN2laMg1V4TsBz9WaWiMXhZuhohS59BnW7GASLSDloVKjFosT021PwTNHx3cPrnwCh+t/aDVwEBHx2BMzSneMwU4f5Iji5y+HquOnyAsIKvEg/xCRRJKHx1C+zzOiPzQYZtDJPKKcQHSLPm5QXA4q4arSt2w4tBm5yzUMzpphp6+pNm5R4AtEGJzjyv/JjbwWrEeNLRKK7lYtcNRcG9/a2wW29BzwS9T2WK+a86gDCXBI5viHP7c8RBDelyFOaBrkch1zQKvmr7y1Kn6FYY3jr+JTKpdSSgdePmXNzWHOBBQ6OlX2w79zaggp8DgYymccUpCBuhX71ye9l5jc9/S8tfFViV8lgQ/8qD1rrSfhviPkZymiOaquwGWlJY+bUiOPi2Jgc53dMBeFRpcL4mDw0TI2i+27irHV9ulBjvP48EJzQVTSRoWFUCiQtkTwtOrUeBLAzRfMwAcwZJFWEzXcYIUlUIrNGH6/NrdaIABalZX9ZH3ttmeb+ykX1FETlUNwwRCO1xr04mO08z8ceeyxXvpcibwXt/A1e6ebnqcW8Ty9lMIOCvcMlPzcvm+5XFSsBrQswGOdgnaeUSbIvRA0N3rS6saMy5NsqCfYzi57mhDkp7nUh+QgMweQqGhI0RlptJbHHrlwvrWmw+D5NFHujfkC73KNuFueTVfsQsWsqTDHR0Z+2DHjoiqRBLdt7kDrtgQpnNeGzZCLQO1HJedMbVIvOpDlu9WoQ1bAvJCb5Dumves3tb+os/hQ9JgcHsVdV7sMHGIWp+Xd94K8hZ7OtRLoqEVaRHVT5IFrAyKUofHiPm5IagYKuymg23DBgrASbcvhqa1WRLRmTxe1K3ym+i8TVetkM4Cq6qnZ5zTS4YaxcJ0StCru4/xKif/2S7/nUAyKif3H3ne959l+aam96F/VISeukwOn21flbh3wLg8kXHicS2YhszuCWymUVjrjbKWw1ODX8eHXNoDBPAslMQcopJAcf2sGyQhpeX7FFMZzxT/yfkXIP+3gHRUvEznsiWe+Nw2SHiFjkPCAomKNFrrFGagVO9adpNzNrlAHjpov0ayfpX6SmCF0KSky+rKOtGmsan6Oh49yjYqKxnmQ6UtuK//Hsqziv2Oc/faFtqplw4WCP57B0tUvb/MmDukUyyZAdhXSB41r+WTUwM8617myOvzJ7CrXKeVLEq6mXogZA4NE8eLYykg67Mh2wDdvlLSFxJ+UuhprNRcXGpmfW1EzTi4S1CPdDNVzxJf+ei2e/zlGrIrplpj2URUwsy2RoSIyJ+AzOgF8fXnKsbiktoyz3H/dzv7oPA2jlPxtWSokASeyF4Ym8qDk/CvX2Oqd3WtjAyk3aS4UqMp/Rc1IhZrlJPo5V0LjAWTVWGfwnSAToKS0sQTuV4fBSSmM1ABnr5yrGl+PKFUUMVCWy50J/9itEzK/45gm0wRb1Wa9GzJQBaESxUG5dQrygUCRJy59sDxBzmrN+AcyBn0ykm5bMGAHWSnQyyIEbrhAAVwdQXwRV3ZTdZKe8BYAv+wAzXhcYS4bn4uExlJ+lFodI7JdQgbBp6BF2FFEn2b721fEcKoiuCC6rLlVasStVq0o52UKHN1vcB9MaoZBYeJomVdYVouM4RPLgKPbSqRc4hOKSuDZA5S6+XkTDlW3mLJytTGrEmXAl81nrWUTgmzk4IqnMhuBbSOzf9gqHAjALI1X5vdoL+ZcGxSrAwJR8tItgo2m6mY18wB2sFWqZOVVMaAliw14TsTrTygWb6mWLQ0SEe+tM39QTp3hddpAlvkLEx3GQnyWjkMWhPoORyIHWbTiPtJwXa9O6vNBJqRFP9L9mPpwHy20LsQiLn85AyTAZi7Q9u5dI1BJ+FFByS3tpU9ZdGGVgezoqFy9LSWOEmbG2S9FPXTa9mTUBWufK5PjvgL/Fje2EnMWK2+mvKs06ZHawBoAld0pBP4p9dKzOwFZHygdeJP4TST9tINKY+gcfamBMCiURdYP/VEv0RIvT/oPiH/sJ/txT/LlP08d/dmQVE+n3TILxYvuRC0n7a3ipRNrPcr8TWnnT0z8BPAxy7e9NEsi41GEW8jzXt9aFSOTM31FAJW1+1BoUu9TPIzJMP7ACFO/MQHZT03XtRhVLGUZr4/KkWgY5LKVzkilsLlt4Kv4zxqIl5ihl3lNElMMmS/g9g2KFDvOv9rUWZF3+Ksujf0GP/gU/+jFrns1qLasOxOhv/zkeXkAZXZW/A5/rxdpxpsqNYpkvVx5CwvOEyyjjzKcqSkmoki/Y6+s0GfhbXUJdzYu/mO5v5PAlu3K1FM5UsnfYkAsLiHeI+LQ39lcOiFFFXbaMiOEuGu9b2z6KtiZokCtOERTp5HIJHx++lON/ifqO7MztXEQzrEQ+ylohQ4tMFMdrFV5Yu5u3JqeBy33hnNgVTwXc1wjGdZlGV/B50e8LQyLuOMP7YhGss/Zzj3U6VLLPvXkvxDmPiu3ufPV+hFljg4VSrokEw5VKeQs9rDUGuox1V/T0YgrZLZ4VgED6uw7I6Mb0aMG61ABZNivYF6KIB4vRabtuQ829bFGoXV8xv5ONGTjuGRBhzuy7f8u0K+s1U2zDyoK6Ygt4rPtM+XCSBZ6lsq73fO5fljx7nJdkLf87CI+vqXDUhuoQQ2/oHBFTvF7HhDaTQEGxzulCeAl3h3/hhFvm4ar1w2Hxixqmwlh7nw9X4MoqoGgnLXtsxMr/mFMLAJHAQTEXZYDYTr7ynSEhTnwcdp827NLzf2ARh2KWcyv4k/0kRjx/Bw24WiBrSFw09stVGycyJUw20BOquwRL65mKwLN+Hm2xPeyz+keodrnvw+fMtoAyd2h/dRkGd3Bhky6uyVtqKg+J7jPacFQtouTIvMtXfb5jOZWo8yxvcYvtiwrCw9r1Pqk18Pz6G9yemIFNJ7Ovm+YdDWXAWQwmx4SbsZab1HMJbfkJuOOv2nG8Jhre/4bL+8ZpsRLPZJdQtCCyDw+OcbMOBuh8uUBZKZ7BTa0Ak31FVYra1MMpWoeywoDdrlfRgdGsM7jq1Io1NJ0XwpiB6tP0E8ty3FjAv5PHdZ2XraHda5KF/lEypkQ7Lrugl5N0U+NJQjVGOOnOVUqBWRme+PleDFhc/F1BHC8feu9OCjoCCWXEiSje4YWqEkOOL3tbT7TMMY6sGg3fN23dhVJZkam69NV1yA1wJVByjGzbWY2eZuvZ9kU2RsQtkvmfIKBiev/msb7vVupcgqtxMSjVblL/NOCS3Gr5wFRVwwTz6k38hJ6UuElawTPgMdRjYGPZhao4tSabHR7IE6aESpslCRhu6sL6x7taxpXpsa+m8w/tEbe+jxd6RjYzUO2O75sNR8HGoiiOfS9Gj3K2C2uZOge/xU/jbBO2UsmR4txp7St0JMJYQNdNM+TdhfTcWMNO7HlOLpkqaEuDZT40KnJepSYo9lCKv75W3Z9ed8xbrwbO9Q82WbqHxuEiiJUL+iqKjtw5vEWf+41b0XWkJfqLs544+1+F1yNDAXH0JEhdXCOrXMwYKSWxnysqIfjESbmYdQvUXijQIvAUK+H0F9yetAMmZ220p35jYd44qgDemCvExojY790m98ID9lYKAV3HWop76wM0FgwjZGsgle2HL8iu6Ex6b3Fp0TRBHOKI4Fk3nrLmHxLzKgCJnBrKWiCHLTG1GPdpis/Uxshv2mENXoO1wxZbzZ6Ycze9iY01akKt7bZ35ZTyr3g30wFrNNvXSHNP47WS7Jn8pvzFMRKisJWbo6skdDf7cGDBrNlQqgs01oLd3DJT4qvPpdHq4bQi1jfMJnb1fjTqTAzJ9gg2cL+R8zzmSPJkA20nKI+6tlcmn0a7JqfBxKKxSUPH/ipADVtNWA2hugNehzKEd0XZy9X9XSKhO2+5RTcqP3w/cVZqV5O16V47DlsKpWNMX3ywGtaQXZvW/DRpedTGHNi0L42vzFjzsqUWl9eBYCI5T35syfIIkDuvQkcmnzqbi6medIMoD8BT8hp5RYVawf6w6rziilpn0SMd9AI87zS3rT/Lyl2aucbIjCgKm1TBcuEzhENQuefxOFY+xUBsUQ/OILD72Xln5hBJZrHXXd4olGS3V1Z2r8wcOfO1CgUW3BFTMQTBIOF+ryGmHr+VmZLZW/PgbY7zpeHWIL+HCU3zXtBcZJgiJ7FOPw2aETzt2hWZ8yivsmzdKatjHui0bRxWpC3F1obsbzcT2/yhRla3e9GlarQALrmBCyyEHEhx0Oo+sgUc0FXKmeS2HtihDrvMyUrYH9t0VTlwyhv8iMnMAek1Hgat+QTRh+Ng5KfaaZ/2ADW919cGvWRrnmm4zRU2nEt+HLm7OpRhcxxbKkJQz1JxM5s+lrU2jpdXBJ7GaFpDbiSTTsEPF9UY/vni6BYIyqAUtiYYckCV7zjWeVwW4X3yo9aJXMAiYLBI06gMTr5JiVlZXAt0hpD9sTnO6P6db721aCkD04uffgNKfVY/lQuugU7eHfmJDEn8uZWJDl0WFp5qVljgh71hgBxCnlqWfYmZzKsy3Zpjf/sLB3fut6R/XpD/cru0KwSwqYKq/UvTythYIowlJ8A9m6JgzXOkaiWp0GfodmaAbxnctTtoAFbmY0V9HRDDSyvjZNzYEA87X+KdfFjOK2Vc2NhWXHC6Uzp7cLzHV2oq+tCRkjURv1L+aGWAdBwSX0+IIABMpEv+bviKlOhAoFO8XgPCVlAcS3R3km9uVRnqkLHv3HnCKYO0CiW9tDGwlHOnIFhPvkliHIVR84pvBktjkn/a2dHgF61IHVJwYqs6pN8izI2EQfZMqHidKAof6uoXzh2CiuV4M7d3Ngv3FkeegzkesH53y6ULxKyKusnlyqbT5mlJVyb53FlVcWFhMEy5H4RcSp/3ZU3R2kUgYnqbywxO/KCNXm/Rjk/zxgmetVOWgUY6/E4NI3r2cuPMx4WVgq4Qb6mxJKaDc05oWYO75LKrxmQxCXsPNsbS14xlODuLm5sXP8eTifRjVQaDE8cMuKkTkYtRyFdSSUk3yYTuorlIPjbn7rzFBT2b5ESgZ9PKemlgxcqUK3VqHS4DaLZ78XF2h3LDVTDc2OWxnv/q+K/WzT+VfwrJyNJc6gWgu2LeUQCHJoI8/9ezZsh1wZCyTUdhV/YUVYamS6BsJGLgikhxvSmDkE6pownHBBSWG8EBbgx0FgTUIHUnrLjSvH7bozO8UTz1qNx4j5A/w3sydXjIczD8V7uGfSR3qfpH8AJq4vx9oDZe+1o84Hh3rybaX/ZOrSjF2juydBKIT8BOU5XJnFNoZC8f3JPbRM1empmxzu4q9XIrbmZdMMP677BGi/faCUlKMfcjRPaGJ1EdQPhnb3GWJ7BRMhUBJ9gokRi39rS/Lhrp+WfcqgR0gR4GF4d8PdIMGNBal7281fd7VVchXhF0z8R1/SyvMe7u8T+jsPZK/2N/q63zsQWsbHSzOZ6KruvZN3+jlxuXC1ytQ7/zGu/G7t5GO6qzzzJZBaPdkFmkMBmYThYEEjs1xgguOw3WyKo/W65crArSsyd5tQEGC2AdUqXAxtWjq1OQIf7CtQmWN4Cjxnw0oef833BJmyXBtAGkBYkY2D7WPPrcWhAsjvMhi/26maIvH3jJb37gJb8x6WN6I8o87FH6ReB9rrtS7tm3U0+g5EePH02/eZcx57mNf/A+MtH2EB/0FJn5VZznomblIvkOYjGHU/ClZxgnuCJr8+4rKfLHXiuVcSy65V1YbjlW2EmN/+HGyDMsNFzLc6oIeIcCN7SKQSzvlydezSB3PTGswMO4uukuibZx5zwFFHmZFURawIqp7TQ10Rp8uNnsI1mo07k6WBsitlds3MvuA6Ra/jn+1XVzl79lUdvmZBjB8q36+xovEuZHaPfnRiGnvewtvv446uGSYP/4hhCl5X9mqgp0qwuBBd7TTffohFfHfHHEg9iicnVBz4bFYYUPVxB9CpUJJpTFYouT4RZJ7ESWYIha2U0SSwmH4srl1gA5w2FSKWJI9mFmguGjuYYEE5p7qyfj90t+4s1vIBF60+u/91d/Swm2YiLn+sAoNJq8svV2tXU2kbiSsBb8gIoVuOiy3LV3GqIpg7HSnKtiDUiJv0wqFDqyzhYl23akFa6BtFCT1Mqh3yKy1hVcEpbD7siV9bBTsbeamP71j0RFb/oBX8X4kS/6/6xy3/+pf1SFOvhW0pMDzE1XDkIlBApoKrS5kPNEPo+Nhlp7Opzr4pylbK79lSd/4ZP0CWL6wyf/8Iee+sdaJE3GcC6EVTU/pVY90Tx2aErkmzLUSrD+KYRxWVj6BG+iqU1KEZlpCpzets5QYuquUJaDlPN83jjlm9wDISF+wk8WkmUlohMRmU/G1Pt7VQoOAF0x1l/seBhlsilI3eLj8ZUJDmiu4kTzkgaWuQEnz8PfggHXBjfR5mZolA6DUJzLla8YYbW1p0bhkbof11FSvDugzFH5imzxwRYj7CGr3hyf9NT6z2lrQbhGM0d31EqHod2NUeIq3BiTIw+3bP4TRo3FSL0O3HqXiYj+7hP/KzLNUU7O9no3WDL9R5MFF8iB9OHtiq1adG2pUHyLVP/LgygeZ4KLLCeZCo+fTfRKevIy0pUPAforK7Q5D4kxJ7IxvpeNleRWtGJ2CWZmPvhI8s0H88F8HB7XiAAH1av0oc1xzSrKqac0WYY/f/MbgEL/r8fbgheT4EX3fXSC53ktFQXDJmPom/3PIJ+opOJB+mC5h9yg6wNPYmOryWGKHy+Hxxa4ivAVKC8liQKvlIS/aL01HabVgbgFsVijVrCUwb//RR/gaD0xZJCrW1x7DGU1ZFdbMyU7mYzAhoKozRsAsRyP6vJRPse3cIpb1BdogBhw6NsL68h8xF9MxD9w/mCn8DYRDW5R8zkPtpYTMzDgmt8oxF+6IGN0AjPjvnyLMK59rzTdvvQsp5z2ug6CKpeeaI/jYzi1LYaj23dX8YHLkWVSDd8wcVJmm0a3YyBujEgl2bhxoNG+DQPuPQivNppssG6niIic53nmwJVnKNXuSGToqY6F53csW/qApFLEA3AypD4Q/kZPn6M/hElXKgKmPqCGxJsg4jgrZ86UVFOYjzGLG28RDbEL6XJa+WDiaFvzdKRO0YYQyb/47/4TIiL6T77vn/znpBArDr+pNVbMVKVA/0nGK5kmMUbYTy4502jYnQxCbIpJcuS3NAoj7N0WhqFZh8n5Tq+oMRmec/k0e9sXvpByo0bZzJgMWLRgVwyxyUyYxTCe+sOrQNBulcLMVXP8xOu/fGV4129/jIhEzq5g2XrUV389/WW/+ltOCamj8s0Abvd0kMRI1617VgjYwuh4YqYaQuoN9RWWbpo8RUjfutAKjxXYDlYyUd7454ekoKGU02JXAHeIMIxlVYK98CEJNpR+r8pz+MoinfHUfq9PpG8gCRO+ygaqyfbmdeOP1PIwdqzR2Qxxp4ahdL9Gr1E7PkHi0g390CR+cBFcn3zz09/xw0/+t9BaeVOK0TtUoxdO5ArReKC21FDDSNamJ/5H5z+li0jV9jJ1FlTkW5ZN9RiF6FyKYbnxCuYowPKzRs9T8gAmd07pGw79S8/4H1HAl+okRE4cUbtnHWls3gfg6PkJpAZMdtXZ0O1JsotnQiZKEkss4BOnMASrdkGppRuvqf7w/HLyYrIkwy1wWYpROzdSFgqxy4wFRaqmtRsalwUxALZqIuI79JXP0h9B6SIMHHKcFk9ToxMxbqM9fl732MHNytZJJqic29BDHXaQR2Zv3Je3hL7oif/kU5/9v+bK0C4msYR02vxMiRmR4NwO38QGRrVWupBYHCTcXZ0MgiPsVw9kqgoLdBtjrXCKCg5i6Wy2D0Qx1iynvp5pG/FRbGIo/Z26CCbCbyLU2wLNmUn+iJ4r/F7HnYDTGJBL0ejv/dXfXHlTH2EN9EIyfUBh/iPOUO9w4CrLt6mqUGqMyoLvaug42D8GRZmTVo1/l6Y2SvF1nFA0Sbu1ukI1duTIjWd2S7UgIGjyMs/wvqq7gzf9IP3eLxERfc23kZ0LJXL666tf8xevX7eoQDCDzRTaGWdg0/r4187Mfby+mo2SrsXGXbJHkh6sp2jq5Yee/ieWYbAMxkAEGcvaqJ1YfDlPeeyxg2hh2TSeiHJC01PfAxKVKyjZswrnUfmB/7MtbJGC6LryVsc0vRVUnONNxFSi7wAkQgFaii1Wcz3dIbsH6Z1RsTNbIOms0RkMFjvLdjCu6CxMdlzDabGVIjfiK8v4vlXR84QtjB8bx6t5ktX0cwL9iJNFzGUVJYS2+CYWtqLQ3pWaQC01pqE+pNSrQB0ImuEk8DdkPojLqF0Cei34InkPJflIZcT9cLwqMGCsqeaUkude6VnvSK+BzS6ngv6Q4Z+xeObtpx785+q3NLPkgvhTABKFrmXlQpLmdO8pGjUKXnSO4XAj5FhpvBkuvHj3NMO7+i/Ui+GHoBNTNkIrAEsAKOS/dkyHx1eWTgqevqsuJNFAZCGc19LdPxp6t9x5PWrBKYd37wvNhEXO2Abub5gWD7owSrLvRHWIyV6soxVNjOUBsZF1wCRuIXejCuhKDHvFe9wEfA+GWME0yUmf5na77y/tsoEE9HNuB1Bq3NeIsRW9if81MY6OC5DmfBf66m+VRDMR8Q9++n9C804AMfKK3jn98hsv+f+uxDc89Q+XEEGgYfV8jxFQVBAUpefRtIUe0A9WmFU2wJQZL3TB5zZ76ojM9fsOd/E4iLewvlBsqpRLAy0TH2QoYq1uhJTHnzUzG/snnJQy1jesHSfs/AVbVS6HyXRi8ytDLBGCarpYx8PzlKzqpHLfwAH859VIRgKCzV36/hAvBGeXYlHZukSiv+fsptZTbkdSJc42UeYn6bPoHfRYopB9kc07CZQMrlafWviKkWrLEBandOpDr/yNP6c/XT/f8sfft2MameRhzWOAxDJ7kVSD5QvHaSTFLR+HGceOYLxdao/GnwQNbWyQ5Vp/jzgBv3bBrbA4DbKrjYjo+/7J/w1qpnyP1g2VC0+diWEiGs09SlrHaoSj49W2wcq+LcpG06kLMvZ4tCnws5QCP4I5pYZLscLtde2yog0Gni99sN7FFFyI2DcncBkCInnX7/zJH9Fzrx32UczoitC2p8djZuz6UKFLAnhWV56Nu+qptvvCfKAdfZFaThOqYtLRmFzeOB2Om4iE0RTC1XFAP/wH/FGCGqmzAsecqqVf43o65VFbhqcIiYuREadrqZNlrnaygkItNixLXP3s7BFgi2mshHwOfICC8FlGYyEfDNYAb8oUdN0oljIJjCm9K+x5ynEcJCLHgpUbzV2VH24/DQKGO9t0HlrMT3eChybIGXVxQo0VSt6TXIJuClw1SQivn9LvtH3r6bKNVmS+ZndJy5NuwJKGVS0WlvWsUXO43hUPw96MefDi8u+Fd8wN1fwdIiVd1+j5UGH3VKB7gLFkmTiHWSeR6F/SXVinjPy/1FvrVKJzvmRa+PMJWQc6146Q8QDJpa1upsFhBFUKHf74XxMRv+qbbxwpL73Rt5KY/xpR5uP9qGuoweFAnqHgI69zMzkbb3beMc01RZIo2jRg14T+NMtSQzJt4KYVXipOdIexMrQCPeXCHECC84lzgLHWr+spDYadso6KEYx/oxfBloxNURM3s3kmotfS3T5e+wnY5G/njvhXcfDILUZ2i0W5DOVHcYTCGKKxxDRgS951m7lWQgaEqvC6vlNA1FDb7hEn9yNCNnFZW82sJubDsZLXxTyGMSR6V5VIvb7Kj4JGAQGMM+3KOYimWchAhkGJVvpkIy1bFS9xg2ManMbwPH4YqAN0lVtKkmzkAXgSuzHtRM7djnR2b55i0u6F1krNwSIYHK39DlnfdH3EWFPgraQXUhvYAjhaWnXYTS69fU7OZbzRA0qqqdOSFaJMzlCsqY48SFYLXA2V9Ed9tjoBGnQwKAHOlJyd6nMgw8zJPDDDBHp3LUG7yrzxQ5dZmzsiyq9pLBmXMyeuJjKW7Wys12YqsHo2nrbgUoU5d5UfreFyUgYbzX5qQCGD6bOfJmJ5/3v56999Ew+jrMvJpoPw1y2y+TagpNLegVSl1/4ZrJTZuNS7/LfFlpMJgMENhAwNdI2zrHkqydFWgVmNvbv+DlfAzpHnAjkmlakWU2zxa2MuxtdfilnYuopl9yPAAYq6RsnNBCKYyLCh/yLQSJkaiZgb2giUDbTvqSMeeSIDB1EnFcfV3ptLHOiVeAZONcRV7edmKk9E9N6v+XKv5D0f/Jj3TFwgDM/Fbj+PKkrteGJdTNqX/UnPrRl2r4H8i9l6Zbs0Zg6Oxq+CMPDRPfp8H0Hz1FkkBsEcZaYjCUE9SjrerqyPxVCjcRAlKRXdLcTbnaSmszitAdLxxjfTcz+vjECW/32u4bp4nDYFpVdw8DvsCsgDY2UUZbKT7HOaFl7TzMx3yNhEgF2QibDpZycZSS0d9kLIypvoplCBVOSH5bxcT4SyAjUrARwYJTm2TioX2ipz8LDpRkDP1jPwuIIplBd3iwJrl045RYJXkqJWwWfMMHUzOWzM8tqPvvG19EbL1C0LUQpldUN80VxK0JGMwADbf9YM7FJnIiGmP/030Uz6cPXc5nS/ublBSyu+nHwnjh3cCjX3b1xSz0EgjWzsRU9fDkpINnqWpUSUqMJYGCBHyMMONjzXmVB6bV3mnk2t/1GOTbGTwTiKUx9HiJFQ0Ufsr2fL+cnsyU4aEbhQvulFeEqq6kxVGIbMbprGbJtL2k9O9C/rZvZRb1P0JTBGuBPTewofsOpBAfOecwo1SuTPLLfKUziwSZGsnCu4kcJX6Jlt97sLy3I91R2LdR+H0kPOW1ab3IkzME1m3DuabR3m66lrUwBYvOKv+8vvofWREluCuGnSXq1Kw7v90Q1C1c3vBgZH3RJR28G1bctZpMpkSUamCQ71tsJmUV+Y7vSr8orZv3W7nRvElw+Ow8ypPvGwTAyQD0c6dHNBlzPVD7HhO9kSBewwXJW6DTqdRB8Zmi/BNXgwoHyjSboOLa2q2naxaovN2q/vJnAz1ppn0AoeFtIvyMn3xqc4mBQFsciWRLqaGud/1cZxqgFsZCM8JBuw5yzNWfJ297m321AtYbBw4p+rgc23/frir6e//HjOPJJdUQsP35qt2QBPz1I6EHqb6KbCmiIrCkF08h4wi/qeALeh+dGV3XGIYzltRnbgWZpVIEcTk1LEehJ9c1q6VPhUjzM9JdtwH1PyOi3BMdpdYkJ+lQ2eibXTZw7bi5lPqUY0Q8+dz+Ak9TcforYQDYioM10igz+FnL4SZE/FR0ygFv/pCOewItE5/VPOahb1MiJywJgZFWSW04g8zZAZ/KC1KrnCS56RHV8R6WpdWTCR/B/pNvkkYsErjoJAe1ayUzrGWkweDUKAyBbal+yzquvkqLLUOVuYXR6ZbIVTsJt8Wmiw1jmY63Cd1yQ5VcVbkYicpzz22GNGEhPRKXIEKCnYYLxuVPaLa7QwYYui3SINDY+GONXPsjD8hQrs9FylUor19jEisiVCz7qwbe3KzZ4GKoEG/DyqVPwm5HSMzUWEU9sy5FC36eHeVbVEKz7UDdCGgBo2aPPUmo15BDGciqdXC2UjPULicyvvqWceizD2KDBVkuxBk6GNrJHQdCu+2+4H98BdnDGbX/SABFZtBb72XRRuKnZiNv1pFOwUOGZpyUDcWp6LqBRKonUHi9Klyx6gicdhwtASDvEQGcVNlBIUBieZ2xgFRZdxLPY8mfgCMzjlz7O2UpLqVVUjojK1v4JNM7PEZINDo6frvV/5x6vyd//hV6D8rDlLOXR37W2fvI9ZLXzzomIsT29MQ9wz1B1QxmyjOG8hfrnuJJXLJ6q0urPswa/m5Hqfu9chN1nBet+zknXz3b/7Uac2mrVzDCzjwh0xIZL0ann4IP+butmZL/gjdQZY4hCqWrlJ7wrY4vxIa/P+RC81WwwZ8/W69nVEmSFzt9IGxVN8iw1dJUPXpp34KwWn9xhoZwCVlM3MlnLirsKpvU3cbsexm+J1izcIHhKLLGU5ovDTG08ncHvRrphFlbVEmDDXINJYNGM370J+1+CWPszLOkaqREcTALkB3JTdS/g6TFXIDUkZBoFwj3YcEnknOh2iBamKsToxpp/hY1KGnL+Quty1zkpgfiMzmak42fx+EJcSmNx/GEefI+qIu5mNUasnPvv4e9fNix69hygWNXqdSGNWmGpQnJ9iG/skETpYhD0wvdGU9Mv6yfDaemKpW/+dUGlpQGPDR06Kea1IKLrmAbDoTpk2lFbtN1S4skXswqHiTPt0H6JbxcOJInFbs2g2C7MwVkwZm3AJEf3SV33y2/7gFQBk3UFSGjtOpcicJJmSpkN150+YSbq/NnsZTPi4NZTJu7ryxAMvtAZmBmonbyOxmVbof+/54L9bITzsDMCZLzcVsbnBa1x7Ux9fZsbXs1DjoKGxKpeWWmQzI5Vi3NwV7qcBNf+m153gQk7dXbBHV5v6k5gUQ3pFzxhFs/JuEjoZ2FkGMcaZW4IiFoLy9FuCM548Wi07rTUztFgsHnpDJuqv7szjOB3TkH15c/xkN82wdUMZ6KfOO5u8imT44igkW7moAGuP6YT9G28wmMGaJJ5no3k7Q7QLaGm1I8RF8UtJ8DMnDOgk3BBOxRwwZYPiHsPyTGqP0TjOmbdTin4ZH5GSI0tOqWpm9HN3f+XOo29ppMYwZfXG2iRnXkLib62OTQounXgS/LoCcAsJTFHJbg2EiPg4iMajGeu4gGhZ22tY84B6RCMb2Uo/E76tVqm8DgHimBZwZlAAfs1ikotrrQbMUI9o7d1Zt+ulBNKPUNNh/oybMGzCSDs3itOSkgNtWCvb5k7ZKha5Kefq1erhFziSmVj8Fe/k3ojmXAXIdX9aKi32CLUL3sbKuaIezwBVgIgLrNX462ZskKvCGDIuvvdVDxfxn093v/VDj9GARUYOCEk9+xe4QeD1d1UNj9SAwCM5E2NBnnFoxgEKbYNJStCpZmUOVaZ+TWH+8Ed7AlJrzDiypa1ON1MWJ5ArvLnZWew6tTdFF155ssy1PNF8lgTDNAwyVwCD6A1azeUKChSSw78iOPnxGbZLrnHozPRonCXrPS9zevHyMyg6l8FwxyEUwzO+O58RULMvKmqBV9jWFHigeYbn8wVFhEjIl1ABECAIcGQ582L1U7vAIA5Rl96oFYg8I7rC/0TI/hOobUtP1ABnZXt6lp9geDsXgCn1Z+Rk8NBIyvSw0MwSJ34WyLlrMtwNqhuUCGHjXPKHWWcQK+8XyqbkmlYG21G+PqF2sF1ahouUOiOLmTbqrnGVVQq1UeMsz/8NkgnpzBb+Wv8d6YEKxhEW4TiYDy+2UoAkJJaJ6N1/+MovoHtfQPe+7Q9fQSorJzAgDSWMkY8OxuZCYDKfpP6XFGb3SP/LGRIBK4OCj2k8vNei137orhKk3eAzfbWyzdBh17hqqP/K+YI4NG5kami/wdBN9ITdYKL1uUggKISweZniJylYryHRQ1UsKXjCQz48p31UMnKsyz6QI06MqTQR2dfETR8TI7OTZkbZYnbVTozze7Fje6hdiNUmdDXLSgRsRCitaUrJllxYqJJ07g3133x1pbjVNUXpGo4JPDsoBoWyXVgtzxC1tpuhYqrHNKjWzO9t3qbr4i/3LdFLb67WUZe8XOI1EKVQ1gGhrLFR1k2Q6dQTtpPZYNLJhjbSfYTKjMgWmloVXqHJwgYiPvKeEmaqxkT7Nxh9tpbJ5MPnB2vOgBtjeQq1I3ui9jkws+9Gi8pOKDkDGYP1loAKcFOLluV49s1T3lzDLcjHsfZ5Cjwq5OWi1SeVnIODTx8ma3VmTnKIm1AmZmunVFi3Nkgwfw/WTj/3TAyjhDkZ0vgoYT8UMDX3VUj0LX2c5InQ2vYcZU0xVwam9UKQxanXzp2JZCYiWtAK6qfMsdN1fBpKF+9cVsbMRITfDoNWMnrYW40k0mxL2L1n4/2Dz/slInrib761KOM0ZGNt7VEyRXISHSksAaXQacGYnwgITjjxksT2yq/AFYsd9w4LCFvZHlMteM9eEBt3L4YuBu/X2IJVELXF5gGzhEhU3KgCABZVwV+Cn+TqExWpPEuNf0R/BKoF3vt0BlppLnVEHlwMu1LoHQFI0YJk1SNklNMFhtwjY/N00/XC81Me6F0+o+h2l/Zl/hIMVLi5AGDd9rW5ZUgRJ0nSPpTG6C+3OZdBFl6CXqId++Yr9HGqGNJp56jCjMfqlYIa3laeCY6n4l1b6gmlFii7mKLZ01sADzMfWvPy5Qr7Dj6fT+dQU7EjG5MN1ocyBUN2SXtCV/GcXzHfOMv0n5R/1krvPno3zPlmf+Zp8js/x8T0+rf2Jjo+NghOP/G6P1vp7/r9VxjxyyqV9Y5OQMGmWxjk4EBSYskDxVdnN6rX3AO6s7EFIheVm+VqbBLmtUAiuId1kGzCSbSihz4NyOhKS/rMHmplZv/wjGlE5hgRrS/dMC80s/iLHvVnvvyH180r6Iu/9mP/IEu9vzUWYqxRIjvgiUy3KyfyYaQ5bsqU0FXoG1QwmaG6ceCml2+iDvQ39NdP/NRq63Of95v3PvtNrUxRPf/PUyjfmw30F7NtJmfdSmtAAq8WZpueY7GnUDA8+G/z8BUom7yX0Ls+fP+P6K9fS5+XHxTV48AlyHndX5TwTZ/MUxquCvLqu/cUHaEMJSsXzOyEEs4jLDnEwC63ez9c0FKVpbGPhb4Vqd1nYDBHpzKWbd+nNWuUBz7OEjIS8MJAVZTibZ4eArjttfbwMJs+omoUN13rv02jzoT1halwxs4sTzlhirZDYAhUWsx2LMP+7zjVhvBVCKj3CotggGfjzHq4pdkXxp/jf/gU60SYQoSba5ouE8NncSph/fK8gauYU5HjYCY6DjwHwyYKWx0tXcDeyUUxC7B3bihdJLovWYRF1lKjYJGCsK07RjRz+ZDWoJDe+B+/n559Rp59KL/23qlTODpKwaErV7KwwF+97q7ldBsnBhMoM18aZ64YhcQeymLxLm4zxyDOwnzJGMZb9jW6TDFmbiFhG0dbi+HgTG6IydEVR2sWSLcnBx8HH/iUj8dI5ZeJ+TgeO/ixlec4Dub194hZOf7ntTMTH2uFlYnJ8mMc31h4oFSkKV+M7/LNBbkKwVS+cCDPK0+v51z3gtIyLUMJDcIzOP0yXMFZSlKkwmUy7sNezF25qv6mlDVbNxybJ9LnvFjCMPZGX9kvYOtqkn3NYocB8saO19LnA3l4U/uoRwj6zyAe30l6oZcbMSfbiKc08/EZkP0uXLVEHEr7b9UtifiBkrgzV4j2ZG8rqu3KhnFn3DyzvXUrrhSYAUCCCDDqZtuY+jYTX9zfCypbKhlJMhPRB4qY+Rhgy97qXrzbom8Rso69+LGi55nIMjEY3hPmFuxR6D5HknAtoHecefOdeW5hiQ10W8JvUSWowMoejiPDHMW0cqiTI+6FuoqT2kJAr8sUaAWftBYYobT0Jrq2r7qk04VsmzLSYrZFDGyz9qN0atff1Jlt1Jo2iIHLPdgOa5HHzJiQ/WJKbIVvmk8caRlCifo7v/+s8QA5UCSymGaZCR5YiANUQuiYKVkQtkXtkktFwgw6/MNQOS/HfNBuWFUvSi/W+DJ5pKG8KIpqYkAnbiiPjX+RI6SdrKTHrQ4+cAzZdj0bGFdy0HyLEcjMp86nT2vP98EIuPngv4cE4NioxYuUofEK+bRK+2Ch26aoIduIaKkyE3PZYPn3BRIBFjlo5dc0hkiY6d5n/36pWvPGyGxxSdcpfyarComBI6o236A4EYS+1k/jCRfrwfbiAunhJrql3nd43YSDUIDZ4yg4KDubcuvLm0iWwaJulBQWvEzyajJUZXjFBcme6mhfv7sQjLwJVfS+EKj/9YXmnSZK0GThWIC2/K2jShMZQfYLgW1j9HF3mcFJEZzb+Ee0vTBuaXzvLEWoAc984VN4/RXmwXDGIdQ+3jh16R9zgSMmuupmsY9p4W9Fn83YNktlfIEGdqdweRc4Qm7tZIqSXb0Sn3nzoPsSC2OXvWIWJRaielChuQrW1ht+9Xvf3AAO59/PBYMIr2rqsyTTRb7xaGmZMoytVUCgZV/5Dfzpj0OjggUiW6S6K0WBnFprd1rd2fMni9qqSm5+arEcRu7SRSa3Jw8f3wjjTn/+45r2sne3ynsfOf+X8D0NxihzQEGVIo2DY30w1zMOrTVnmAaK4AnAzhXyr9eRTi2eBwVTW4jsf9uf/BARAQaK7vvQ44KglZN8068Zf5SpznChG0pV7a9mIFcD4Z7ziHzBZ99hv+p31yBbGaMb0ZWhJfJ3ObuB1bgO2zGhUdTO16/gU4j0s+7QV4dXQu7faDsSnAcu5Mdxubs0qZwcOUuX444Z2AwvZwwk8CKhAPDK8Uc+7Lg19zRYbeoXRDo6J0Dx9V+mzfE6Y19uj66yRS0ZYpJm3DCLpVxY+zEqYfhzd78lC151bJI8l5iq3YnBUPymDJt6lB0J240figdJdQm4lZeOTC3ykeiQeIF/W+nBLK4/gHtispvnvrCQz/o0kVRcNXtGq6r3JciHaBza7iMwFvCHOfU3R/gYagt0NxHgFUUXtDnjhNgZsqIfPTVbACEuPD1o38FErdegnd98Kd31CnLK2kEDxxRxLdGa9komUSgu04sIvfFdrnVAfIgaQOF4+p4/eIWYQUiBk+GIr8R5Pjjj3ebLKvWIrmZbSQFIoN61WV4xli9gCfBTDmZ5+leyLJsoqati23UW1Xrewsp8cfu5rP4CVr42Z3iL4t9UPus7Ea2tW0BOmGnS6lhIzjUO50nLUzGR0MHHKbLCHGvDjg2uslcDKE1fnBSX6gNGROoGoHDbRjYAP20NFrkQcxu22yt+V4fRFpX8JXPTTdpc7P+yVc31mf2Qll5j/EClCPknA3wUrKeJnSjlLr/qfiD2GPBKPIw6niNYVAnsuYgfI8+YjvRL9nycnw5tIZPRAhcU5SsSojoy1VbMp0mjlapIq9A2RLYgdsIEK0tmzWpfLnFMb31GVx6wtLWLGOnNO/63BDT9QnNVnlCc0zvXfzNM2V0y7x7LT6+qdwAa1x0iJdpjSKOQYGIPYgEFu6MW/EogoHUgVgog/36mWGuNUg5gVApjYIxJTEy4XBgWUPOlM0WNSHL8ZI8u3i8IcEqUTEN6UhHYEl953k7ur3p1upKbojOXgYtSLSYHbqlKU/z89Mvfuwp90afes+kZK5OTH9cm49z6q3kDzNa8ebNV7Yp62FULy6LptNHBcCPUY7UxEdFxWC+AihkSMTNa2Nqb7ENnXUT3WVyp//VTgvAcAeymi3JesGiNVQKZqTDK7hxD53kRe9hn4QuPXcEOm2rLtSA0wpw2ha0Uk37RpUZXfGFZ0Q4xs80+OhoFIzmFOL5YIRQYa3BXMaDarujHgfmId9nwcrBEJiWi3jM8acrfULLV43MbyJtEkfMTVGBXImdlOVXL+0vhaJPlBHCB5tTCMJ4ZdenClrnRsxNDF0vTLl4iFjoX+9PEqViyz/4qEcmL3wyfwBBaAJyJ4gSN3OX1WBxBMAId6CZLjaAYO52IarXQ3QjcxBF6HjlK2CtFXiXVwAfJWRIxnu0rX5JbZCpv/yTLMiGAqrmSK/j3EbuKuWKZNPb9KivxlguFl9lMCOpQXojp7dFV0cTa6G2q7cTnN3SEiO64pdtUgb84k7Wnx5qvP02ksHJEAI6/bfLKfSDLjdOQNld57DJ5ArBH4RvS4IVfGPpl0g+mHCdbGDLhw7Ya6CP248Y8A/DBySZm4vPw0JRRiFBPiNbHQ5hI5GwCWkdSEmEp8wg+GEoxfdG/pU99aXkEdgoZXFiWRWV0xp3Jq7b9pkH2LvzZe7XBV7wHiLdMMSgV8TPMv5c4ZowcZOMplNpb23k0I/7upKInbVTKh2vCVxRb3DRuXU9+M/35ewf+zTGzHamXpo39/35eCEbokfhqEzh1IeVm5o++7BeJ6Mv//NuHokxMfMqZJw18wFK7Ro7dkaXo8oix6pXNzX5ANVdZCTvJ9/vGhMDcNnIhWotOfuRlP7F+vkhe/MWf+o6WweCDFNYsDTuIymo1EsawQssAzrjUb9g93gqDWnBLgzvsdKC9xanFOWDrX3BeDJj6PBJMn/kJp0VCoMCkQF5ecJqsNnZiJ2dkY+XiO11jwaiBGiWGsfJYQ4FJ0KKVw3yRzSuwwHIihx3+Pn9/cEovah5YcJwpXRoENDipwokSxpwlckZE5ynrnZU9h7f1VyA1kRrLhblDnKTilo2GGeAp/d/hii2z6SR3p/I8T1eZhgOEiM4zgmlof8oaiseN2xXOAy3vQr4UsngtFrqswJRDTcl5xEe1/dUA+My2j4ctqqxEqwHcczKCa4RlN5xJUvQ2tlqD2MMsUJ+d5+mUr7/GdtQo13XTfBN4tHqNolVDtZ4FZiEaIxL61JdCNVEt+syG4puBq/4Xh326bMtv7oZoo0ypgr/6Hfo7r689gpHJJiAadx7myJ81lBiOUMgjvdjjTD5z6FhIOvRkLYHlgUvKsB1KqCVvvcLJMbUrDB5jGpBkZ3yH3tmhbJky9Ny0H+UI8kfWg0no91723of0GSJ66mX/3Rv+/J/Y6vbKeog8T2YKSHFVUUAh3T/gvs32A5F/3I5L/mx5wYMynSKcWe8M6few7dIRVr2BnAnW2C1HWm7Q3gdcciGZyTCAB8d7MimPax7nIkxpPzjpmBr/zIoCZ1wszQ0YEwwQrPMXRIhP5sOPnnTtDPu6qqF42z/8xTO/Q/e/ATjQvuCtdpubhubaU9/Xza8wkdC3oFMbBKAMgHbwRNAE7DCmhEBKPVMk1csUAFIldmUJixTzXtwDE3BKc6bO4sWFNgo/fmlgvfyVHd5bHoQmcHRRy/bvQsAVwrtsJw1uW7IUcwFojr22WSoKkS3ON5wE5tcdgzQBm9wViZz25uCmJ+EeIhEmMWMponR26GTaqJxrAm7HAFg8kTzwuo5j5FkmMlOhRAKjcUWAFJD10V1gC/czVcmOjIXs5tm8L5DH35zi1UsKsIWGHrgSFgDeurp4YbQ+SaNGMIlhpi/61Huepg+9RF4D/mm4RvU4uqaluVQaiatrROb7dttAZGsHR5etzLqPILRjWb3whNlBporJNiFICn1M8oDmce6MpKHMtlUf7OMrkDk7+G22WjkZfXaMuA+PMsR+dKtdBrISn5wh80Y0q7TAq5TmyZhILIgFEIqZRd0hJYNBUNn2hkTdsQg5QEuKH6Ac1wcRb23w1dV4zY7jplJYsp4aWC7OrE7dmRTH97DqkBVJ4uibwolzbWYSIkVm52HliqtQZGYSvhowgy2OrmyxTN8URaqWI0mhrqAq7vJLmD9H9ICImH5c6D3RcUaD4hUYNTH0DLPQrFNmon/06796Kf/3v/93xSYifTzci6F6lpmHw7U+MskwKTXsVE0qnITcIbWNeyXwMtodWATyD/k8GtrTnYC9ub4w4wMBt7xuWppcOt+PQr0mLKRl84piERUd0DtZ1EJt/bwGr5eyCUhHlyDoSSVarFIwPFDiJWHKYUVrNiVLxGrHYuoWmMEfgGlGhTRrtOYQVaSLi3XffNipMDJES+wuLy5QGYM8Mys4BvWBIUUCWDWoNf0UyKmHisFWFUBpTWKepNfQ5ijXg53Vrd+paRzq1JmUcvO+vVS0tqXhq02JC4wlOHYMvEgCtKFdlhCxxloFN8ZBnuHC5S3L1W0fktPUJOW8sJKZ7jxi9YaJ/NWuEA6G/4LewYC1OAGnh+Edv/rP3/ObL/tvtSr3asE81DiOGplIRANX4XppHV7qq2b7IFa/SWSesjZjTYZOztg8rY8Wi/AVfcw/mFO/Xvmpd44fTU8xeOBcz0m1XudQGdNB1TAdaWc+3Ck7K0d/uv4vftwoMdE6O0MOXRowzquJZX1hg9aCH/HnvyugQqUv3hVdwyh2Pwm4N6Tzzn/1ih9d+b73k3ck1gqhy/VgzyoNlj1k0nPbsWeEbxp95uu/5vPf/7uUBQDpK/Y/aavCJLZgZ4JiI0qwwmwToWq7akb7uwnDlKvbLtNBVmF2UDgidcMfu/UJIaW8tHJhwS4xVnHO6cG1Q4FqZaRBPKKf0jOI8r/7IFQsEXJ2xolK3NUeD3fXsLM4LLykAQBzVmcB1TZ5EJX1COBsIoM//lPBmZrGFFZR9IMwC2vjNpcNewG23cwHemRJVRWetTMg2Dd5poO4mOAb1eFpM0MkJWk1P/6N+vL2u3/7J6ld6hucFeHat8MJmjxb7cs5CgYRPf+2kltckO0Vu93367pRwfBmdsY2sa8uv1bCRERHen3KnNUeXltaoQTsmlIxelwhwoWAQe/91iS+rDucZhCbNqaGNm42fQWlXAzFxG0u0vWNf/aPK8ES4mx2B2SGiMhPwxI6zJF7SIHrlPR2kJ3WJndbk5PYi2cW6bR5lPOyH3y0ca/FDIbwtEB4rksVv7EXtnRCKsdIWQJEYbn8HZyf4D+8moHNDMmLtC4uvPs8H4efZOUY1diZuqZTPLLhY7YwWInC6glZaOZFbOYdG0i8o47MmEh++xXPfeMnH4vADZeOszZQvSxmEPjBZzHs9vTz3//BufRkUk0HK45pVuIGfHBlLbM5h8U72aCiHazBhobm0r6KtehznvzYY4XSa2pvMzlshM21bXp3kafK5qY5pXRKHK4ep7/jbbe8xYM4lZE2bFPgsOpo7bLCg1mZ3O3VlYGURGAfKFZDHMLBh+5/z5GAZrC4pdTnptjALT7isIZyChc4OL+gdZCuHKCuYzHRbC4LhuDD3/wOeqa0kqy83sWyhlsgDf5buLtDCqcqdhW4esCWI33SxGlWjB/7ljetm+/7H38tPeB+B/hDaqbS5VrVDD+6UYufgPcvWmlC0pRI9FwAgFFz3NHXn9wH9wh2yl9i/jJxOIGj+V3X4MashEkYLvS0PjrzqYko650On+oQraDFSCpbdIo0DC46+2cVStspbJCLqFmG6YrzHfK+J9KYi7+tEiqQSu9s8w0Ir7gubiDGHW1VxhHoAHndKUYlhm9GuoNLrNthyWFZlsCilWqI2RZcySFQooGsKqJYJ5SJFnbXEBZbT+gQclkucS0m4NjLid9EYpBOzNeTv0QZvbB+Bm8bhgYTKicJfd/vfPB3SF7vITZy4AilMwdspxqnPJNkXiOSyz0gVlvOEouYV+dnXojrKG+S7qPaK29+64l0af2mUvH2DRGleFKOLe3qgXG5yCkkdGYGYsFRW6Wfg1XdxHqHSHxXu5k4tXKDWac8JC64xQGn13g3FwRyqmAYlgqyV52NNROBFdCo+vXAVfoV4FLVqRg1KKPWgZuJ5yG7LjTpqrX+Ld2Ha2e7X/UrP/17FsFqOQvjpGToUugBUhHfVoUdNN9ZI1grMYILudhNV4/qZ+LtSZOy7QUdn6PBmBK9EOKfeNWPEPG7//gHW85asz4btgHJiV9tw+Ewl2oVge1TV6tRokw2E9Ff/J0fXbV80V9/PxCWDTqMoArdYFuNjQx/Li/xr8idxAdd5JfAWJuB0qE9SQMh/jonnimKNHNAK/Um5jlJt8rblL0PhPd3hFwRLbGd/b5A5WfHAPg43bymf3ec8F60oKbl0PpN9RLBU/aoGEVXJaRokJfikMP0oAkGA5xyfvr2XKaM703MJMYmm6iygGLYS61HCoUkpdchibqCi14y9fF7P/mDv/SKnyai13/yTTbMGtoMgz1M/4JO4ACVEVH7bADn9UbxFKcMGZshRTljGK7bQRAZfpq9zZZcH7kxyR3MxbM7/mdf9cXr5h//4Sd2tPVdYquGvZyf4/r4TVcBLq3BG/KXslZcKHNSzW5ZRNZHCjfSKM9odQEKWzG44+8DDuuAW/rT8QnOYxGA/rI36J459WELbkQ6iiMQaPipyu3TkapR3kQ+0wHJaOZh8MerKdjOPxDm9aSarwUj3hrwcCDazDXwtTXl0cr+nt/+qfc/pK+7D5Xc7iohk4itU0dXFA5P0RXZ/mjimMLiZMt1t9SV6qEccvF/JB+avwoyw46ZszzN1yRsm8s28BD90it/ZqW895U/AhjrhnpyiFSv/JmEdM95oQKe28bqNoYwV0b7ntEVWwTuBo12AQYHhJKTiFubbGKsLwTMz7/dPIVXOtYfOYm4fE/CMDqhlrEelUVxgNZ5OqYKwtTMTd501FdvCVVPlDjAFuRBl02No2UnMmswLWXe0qey2TaYCro9o65BpWy9kIpMvIOqXRH7hzE/r3VnDfgVROXD3dwaXD7+Fd/YgFqk04+ug1ZWlm/9xNusgtWQv2NuO0YM9JfL3/pMArM4fWpVE837sbODvaJs7bqrXlu66s2E2jtzJGeX0PuxEsNaaNuBDMLx/tdf9SVYSXMNqV7f5i6n8GMMfiv3id2tUOfbZRPUZPj2WnObdGk3wEZBalPOMnOwFEziYYkwFQNKNOwv5cGyZNTfVy1eDZafxEU5L0iBuWnca5bIYwAlK7uk5BeiN+OhiwvVPznx6DLRXueJl29UhM0A0SjE6jbqQywHHc/TWuNgf+OFUy0wx65HRMSvr78v2bMVPUxHb2Afyl/oQHLDH/nIR171qle5nVp5AYQZx1QkqlSAFcBErfw3vvynVtI3fey7AWPtgEKMi/4eFumgHzcYMe8ANQZKn3gNAulNZZyQiUQL6Fkd0NRxG34wHgNzccjZeBULQmVwzXG1EkxEdMp52Eu2RMK68YzNkUGhizORK9zMR4WJ5AMOyrWkij18lXa1M0w0QYG7NowsYfxO6DIsvj4oDGfBeJ0jVii9Y+NHSimCumqbtrwIpb19NlJ2ov3gzG5wPNvoQhv7AZsWSROR46jiHkRb1ynGWMwCWC4cGYNB2Y3hTIqISH7lxxVcf/N7rH7W8p4PT920KtaNN+9VniJeSZlawygbPIleENkSpEwC77MIG6YiGPq3eMDxAnTV6oA7Cw1yt0G1lJ+tkJqewVmEqSZY4KEaDgsyW1omnE3OLza26wJUSctAxtJbYC+ghIjsxcCQWiQNYBPnwjKPHaStjz1rZf6B56WFtUxq0qrRHaKNWTiV1DLxbmD+KwmCpH8TDXluUZ8CwbnmlOcQOP+zw+jci91rvTqKPsNGX5uPVy4EbEHeXtK0qhq+hgV+iN8IFhNPKZUPAwU5gbHNYvCHP/zhj3zkI8T86le/BtMb1bcQcaLv/5VfJ6JfetM3/tKb30Ai3/5rv/NZ+syG0IFBsQvXejtHLHq56+AKETN/x0ff9t6v+GEifvdHfwjsG5ecrR50/ynnfhj6jRdEmoN4joMe2epPZcfx8zzmzh+LdFvtB7OLRoT0PFuPAYgv4BRLZf2Fl0hK12ZuWDxmCsg1rST/WrAoxnLgpWXZor1hcG8WDAzAE61IWSCazEaOJcShomuXWaC5AUrcHkToraLCOshuJXkyiKlNV42B/5s9+j2pBL3Yed9K6ckXyQAF1DH3gquW4oqZg0wS6yXKkrV5XhbAoRXe1jef1If/yC/+w0XvD33nP7daiEF6sXsLrZ0WePdmgXYxHkkak8KvjLFOETxMujOTkuaWDDC4Kr2pqU1VqWD+ifIW78TK0Low85v+4OMffd0XQ+WF4AJ0IgWGLZmGmKAuNudXZPaQqMxsa1+iB0MFKO1ERP/147+zbv7DR98ItVEagmHxijrDy0kNA1i0hDu1zpqBqmu3W45vidvQsuX3OeXVZTuNEnFuCnfAkG0KVjHHGNPulHP84fyINyWM2vrYBzaMlxt/93y3XKY7mJ8/oR5seOJ/XvS86UqjH46ziPXyi3lZfY3PEnH+xCc+8ZE//ggxfeQjH/myL/tyAjjiNeBCiqFwoJCJ7LQIv55mWl+WffToWSfv41/xwZd/6LXeQbevmTBNUeNoopijjKF/l5GM6IInffcfvYeIn6NHNF989wO/wUSPvu6bIBF8bv5n3adZoE2I05Jcswu5Eiamlzz97pX2yGgrLnIHkHOdz4FR5uzRmUyfYVIkzI+RnU3hg69yU5uKbuZ208zVnKq2IrLQRnLakyEIgygarl0sPIGZQiQnfI6XiOzrvDveUl2JVkWRxYyoWWLwKmU5bB8eJmxahlBmAT3RwhWlBgZLSxS7Mw8+DjVnqlfJbZgOojOovb+wINAdtEKhLNmCoIwV56QayiY7RonzJ5Wa6tEG75Jtmf34Hzz7Ra+ysfcXxh0WMRH96V/9wy964v9tFfq7irWX8A+CKp2K2Evry9tJxg4rgiWGMzTFyE31402DVuUvmzkbX06Ru3fvIlOGLKlFgVHzft0wC/7Hf/iJRWc28gM5a/8+07FGYdpS0lJugQ6Id1kXZ44rwW3PfpL+6K/oIT6FIJJMJULmxwDidXM2TxCEh4z/xjlYHKtV5/pqATMR6z1Z5G9Z3ljeUruQNZztlyka2Rt/kY1zKah1fNot0fob2stQUeS9ksu0WpyfjNGaIKTYHEa+bhraZroBPG1HXUqmidr6mn32kgYSmRVdMX3ik5/83Q9+0Hn+J3/yb/MQMPNBUYnrJLjsam6in5V+loWurJJVWljPug619zxGf2cIi7gbvsFv15Lq1qQkre4SE/3VU/RXT919309Zv+Thw4eQGb27cAhVSidnlPSuYeYbSL2xZyN2F12Sk4VOFOwslpEIiR2Zfio9hmps2DRnodPWVsJLPXjwWft5GmgWovUjwyCr1si47LhhRNGuh6kBZZScmSwxaF6NrUCIoCsV7+bKbjvfWw07rk/+teZJYnNVh/2Tl9ZQAbyAw1agM1MrZeyGbPbRE6RckIzg1ZKE80zipH+Vk3mpCyGFU2Q1n1rrwwcPmr6s2s5nX/bKFSplIpJz9eWU07rtOY1UIQFrABeJ0HmKnKLtgtw6H/MIBDGTWk2DCEK4dz1LrOIVzo3E8KNHz9VS0Uo3BlURjE4nPhWBdaetlWS4aqcs/RK65wvkjl3c4igAtJM+sCcU63VNVQ+tagZuOU1Ub/Wfy0Af2TuprZXJW06RAHvGvkEBOkyeUWIdQZ8h/lXpYXyLl22V0TRBGyp8gIvhozpK1iAJ7HYh14jYa7rSE+X1FDi0VQhNktSE/72FpHroXiXbXTiAaKh5a6bzXc6WO6XDwRbkJyKOYCyXYsxE9IlPfAKr+MhHPvJFX/RF9+/f96osbw7aGaRgD/uvXdKNplX2LR/+gWx5mYBFni3baOuT7sGRlDHEiVEO1nICCMjOE2/hCv3h70Zb1ZgUDY85UIBOWGXLLW7HV0SWy5O6lVIJ7Yoy1RA/vRKR5xdEVhcYEUGSkBGzCksh4tVbTyTjpFDezd2Rku8cNt6x6FmtsSEmqE6vYaMxihaZbI1GGSFk0gNN71zfkB5E6AYzsbT+RoXbySpIIWCDUnh4KcRIK8HBbSK6evMzv/wfriLv+Nb/xpgT3C5GeaT2pstnWdAqtIIaKpCfxKbv6Rgsi9kME1ch8oOq6lDcv3/vwWcf3L9/n1gD/I++6Z3abkZArGd2sJB875v/2e/9EX3Na63i4EysW4eztjDnEtcPfPFvEMnXfvzvm76oUG7EJF13P/IL9OjBMjSPXve9PcM8b5f+q+h3Zf6jR4/u3r27Gcqu492IhduSWJNNrUhdqy29IMisLGKOgIE94pZ/sz6o3W6dLW7N04fu9CuU+J302t+lX21FHCRRsc/Nxk40by+2DxZwHNOQDUOjmgFamia4DSO3C6VMVFPkBYyIg2jTAvM79ZACHlfQSNaXlaEVpSlcazqeasBKL+AqcuimsR0iWjP3LrAKeM6v/ilkO7US8AW9YDPkF5YAkQoR+WtJQYIzDdnzkpe85Omnn8Z6nnnmmfv37+9YyLAHo6Dtcn3v+34d4R3kX9302gSeYLUeL1FIFagx23j1BWX8Bf45VHJw8SLnhuurvo4/9afodx4+eHj//n3gsIMn/QnoyuhjNjt+cSWl1PlJ/8h3J1FwqW1QH0f20AoyWTP4koi+ZW2+UHS/YQAQUhhrNjPvVLDWJf0yNJYNUMEjgOUIB927hWaRoq4yN+KAAUFV+Q36dvp+TWHx9x0tE6dvZ2HvmmWL9KjDu+x6PByTYRJUSPyDD0EWMWDHJ3ubNra1b7c2eJgxKZ54RypccJh199d+hYkevelbrFGP5Tbur4ILbNvLegnla8WiuO0oNtGOuVpKxHZeh5xf/Voi4nWObOqRm8iOc+T8tS/9xb+hzxDRJ7/4x9/28XdDl9Ef51Lp/Q7hlJOhYGFXskyZtD5MUX9Ll3wDzzbwaJe/YyxtUrevFUOBDaVvUSdo0trf7r5S2a1yN+TMxr9faHaQmP/1s28uawUuWrDaQBNzdqhr6qEaBzumodfjhgun10NgiTx2ETrNpNZNYscfaEtImM98+5EgyYDe4Hvg8BvPCJ/VZPhrbZrdkWE46YbA5q3ME3N9V38uhjIoIb/reyBiHWFiloOEWJ4fR91QDFETC0wEzs/BRccUBV3pP69+9auffPLJ3/3dD67El7/85U8++eSeIWpcBmjF8RR6Ej/rdMfekG/pSff83QKmhQAOM4vlTVU/cdroZHMgHuuufMNOpevRt3039onZkZkuSGDfEbYA1rmGVpEhJOr24nm9Du4NSLg08AE6fOa8Cc1QBFncvZhwmR9VoVqq2W19nSfQ2oan721lsRGoaoQIBlwS0LH0wBmIDWJsujQiYS64P/21f7nS3/7+L1j9jnUB9+5WVHkAP0Hmwo2C8w2aMNabKkxeNomlirqthtnbu8VnUDIzmwsQQZd/JQ9w+QA47r7/t/iZB0R09xd+5rnvfLvT3yctEE4a+zVdK/6dqgpnubonYocmLwVAvUklC+U24DFzFYJRhvw+bIPCxT0DL6eO1KLJAF6bhdF6jCa0DGKt2c8wq7SsVNO4vATGWYpUGJjXJpG4Vg18xN6cAtGyKE57gm8Qidsaz0360po0rJK+kJPryA7xdhTSHTnP1f9z/IShWlVMj1P9qAKgEF8hC4DHu6NJo8Jwq0ci3GF6o4ip7qRMGpQLX5vCRSOo6tUWjodkTFBvJnMPCgNkABESNdlKqXUteMVZ0KNgmEIfjvEN2KbQ65jIFrtih81IMBERP/nkS5988sknn3zy7/7dv5tDweVKPIfb0pb/Ky5n0wbJaaCLXZAkZ+rf2OdexaYsUmDGwF5txGDdz02LI73HoLFenMsLniBLWaJugbcGT5apqoLNwwBJFqHenQxNtB7VGlvS1JiNCB+HRrFEG7OzqA4+bX4F0GbqVU0Pr+YRUI1QGfMw/rudC2F01wVC4uEtfFii6Q++PoPyieh27qVDbBxcxkMoGKuoVe5Gh4XoK18jz3zu/0HE3/C12MPkvYgOaGRr925GNDUveqBqjpo9IQozMNCA6yCeNqJAEwk91ypeSgPFYX93VW+IZH051Zr2oPqms4anxC+CTeujyXWgycyPXv0dlt4+ccVNEEvTXvngiJPOisjdu48/++yzjz9+FzNM0HmWczNuo0ejkg5rCOsmVZ5N8apWEdheyzbpG3dKAQSR/ouftQu5PrC03epeCAgcH+o15RmpSSn55GnzqZz4gccBmCrAP514O3ASNkCJnhKX0VX1fI4PyKQNe2J7JDNuvrSSscIIkCsW8uqi3mxpgncBChLlN1jqtDo5tbNbuLH79MRXXoC6EBGP2bRQRGpuphMghekQw0P988znnrlz984YRrBGM4hUEtohUiTcWGeiSZ1yD6cy+7vzlTZeTldkfYqbjLc+l4rGabyPFnGmBRwbrI8mmMw7oLBq7JCYuJkCw6tyAAxOwATCMsHm9YK2BJFrTxuYYxI94g4wsPPfnSICnYKa1mtUeHgem4oT+srQ7mrF3K0FsQbRtFGwZUFiChslVfScy9ap7HgcffkwAbZkChNCUxCgAzd5gOhPFkvvTIUpSpsYJF21PHrFR5np7idfTVFV12I5mE+Rb/hat6/YULKavmKAuobLHCa1EfvaCnlKTGMHIXAhkkff8I13f+Fnj/rUCzbTsdq39YoeTI23IhRjnRyH6edaXLxtEbs8vbyEiP7Bn3y7abPFBTPHIP4dK7xmliVybeq/TImxxhYnEQXsWixWrZwLwzfVZtWBUh6tdIBLOgn3QXd5Hr8Ewc6fTOINGOsaYm4eUc4jJNXeggrHODLjz1ZXDuq7HUX31qGkC8Udophn22HuXsdgxdaDDAJK1VqKasQlUT2nj3lXtYw82BfvA8fUphO19tF7YaLIeJr8psqyKTs/vaAl2VMWPpj1zWImxx8aurNPuxOFxBBIDzYY+GZQNo775JgzUNJK++tOyfo4ReltQnsC1xCpUnldGCs9DXHMZmC6JNsCcZveptbgt1CWlbbbmGbJf8hnBYCDEybIegj+YLnvc1hWaJKZVcAR6Q2v7KRnUacQDo0Qy3keZg4dBzgfmBlhYJ7AkYekM6iVyfojVe1ZvPhFhrHUtk2BDYoBdU1nIeGYh6g/RvTAor7CWur+Bvjylf+G/vrr7xLRP/jAPSK5e/d/JKJnn30zdGT0B9ZBA9xx5BV0bzX3N6/4wGfpUwcxveKPX/bJtwUZFfGsgRiC2SKoOBwOpmNtjZHAtwMhwNf5qxW2LlosmAjemyGi577zbes2IbmtIgX8w/HNg3KjcDuoDyTMMLqltShYfRc5MzG9cVuWPE52yNXhzOrMrT3QndRHcar3oSbPWYxbqTyGDyeNrUKBXNyIVAyQTf24B5zbSQICICzTt4tC4caGod81/Dwbl02YECrx4U/xiH4jsWiI9somXZquNPxn919ORP/bZ/7Mcse3CBtBI4nqAbcXymaHLG1UhhRN3NUf9nS6aujlpov7LxfKvBn+SMGGMJl4nN6O5lsRlEUw/BrDjopYX2A+mEUoHTEKYB1qmr79lKIVhQr9f/Gy+vBzzzzz5EueNOagNU+VHE0Pc/dEOs7MgCe0rV4ZYey5C0gLs6FFo+RHLTVLZGFo9EOnMBwSqfgjAjts3yT2WgfrhhhrFCTIML8/6K3hb8jZVZuQTnxgcZ21vFRQ26JP9DyWpYxl+qVmp0IZrEH/Ff8niGQmOQUbtTWaQwy+4rsQqUulJ9kKMVH99gE5Skk+AGNXeL3x/ffWzZ27P7NKPP74bz/77DcCAQNSJCKbCyWHp4psMi8kdAqxnCEGnP+mShXYrOyAFwyDNpjC7GAypRM6ZximiifCHnlLPutLFNqt+XMsFdgG5NnyuEG6MqXeKV1Eq7rLpNMUe818sH7DTGQRc/hjCPFG+DJSYhx9KkBkexKW0oNvRjUqLYO8hY2sWtyKBAKwIZhBhkCjzARvv3bE41FId6BdoXC8grE+m/XjEtd/53kex+HBwONImzqKaSqYKWyXyVJ2HjsbSBdmNvdL7GUy9wO7UNAqhhYMWo+1KSGm/+z+K1bq//ney/53z3xqVV7l75w/6za03layms+WyCa1VLGhWO3ZE8HFD0X02TEx3UfIE8CgcP6ver5oVvwne5W3gk3TdQsL0nPDfG6ppQ7TGPK9CBxHHrxfvSkDGIZer2ee+dy9e/d9oKPhOkUsNZf0y/6/AOZUM2elO7DILmpLrKUIPuU68mDaqoVXNBBQyd3ayiCWyayAmLW6bc+n4b4uaHCh5dJeMEN3tIgZNDEX7J1NjS6vzfFIjz4SEZHTz0Bidom1PPp0/fc80cksFMcQ2X8Wg/Qzb9bW8nX50ywG5tjQe5H7dvcfiW+LYK2WcBdm7b63kdoPnog+sMewrxSjIOC/rZsv/vOvXbkoWcidq3BJAyboJ7ODXUU+xyBntaVCFnjUbgQBQiSn/gdyy3FZ4GInz249iSh/J+eW1hTDWiDZubPiokgUUne2zKF9hj9UsLTIErdY+/b8rjE4oC6WIaM66HsFdecIQs1ExyU3tLpHj56lZF4qNyyU5NrNIPlJcaa4RCUATAQTcXTRtuKsn+fpeoTuhHfVji0ObosVSBIx8+F9KYar3LenYShQMUEHZgkpRlukMlDkdMOgFZmO3AmzFM98OUzLn2dYmfPsO2oqK+yzA0Z1/75p1kBUmzxbUlUfG0LrmQjwGf/hOiw1o0OnhtU4VpeYISjUiOANzUgizsri9M65R+KdSjNIo5BtVOKvGKCOqIltSSZwDDipld1rRDHiHt0q2fjhw3UMwRD5j0jV9s21isfn+DqlCWO0vQnbSJa0qMRKGWFMpNYymcU2+JTEtY8pmtQLy6kEK3UgA2TLapZBIH8Z9KABh1jU2rCtDxbZk41kVnLnVHguZHNWRhkT/QKDWWUXSwbVXvTbqzCIJhMPUbfaYKyWiSi9wOADqu/xcWhYQgNXe+BTIzWGWct4nZJT6NGj11sIGcOWUCbWiEOLl+CrSIgxR4hIXvZn30VVErgNqD/YmD9Sb2cTzskupfrhp7J8EHLOZftKSiPBjV8pb1BX9WFypUHR4PlbFzKvXNbs/zwUgdYiGkEEUyOyGDunhuDd/tDxJD8inq04vireM0HZGzb8xDldnIps5LdKjV2n+j5muYr8oAcPJ7EkLfMb/6PZzN/6KhHZggILtHC9ckrro2SCYhwFBhRvsKBEX8SeJKzyv3nwyf/qxS8non/64M+8+B0tIOay49qNUizv2J6tlVvKTRFvaSnY3Jle2Q00MNkWuKo29qwSaMNg02bEi9HJXclODtvfmLleLcKt3haSrnMZOc9cumSa2zL/7S8JZpE01saxoofnsbBs1bpcQ4PXrN8u6vRsiZ8GQRqpW/PK9scnkjaHYLE5dAmM0vLFTOQTABjo0pCkDKilREQf//onv+T9TwGF9vTACpmo2kcDHKEgYd7zpl3AZ13nJf5NtVHO0HhehWnzC6hofXGFXEEuFvJNRQp2RIjpJLZNTvq+4UHqbyKGLUKkxauXMpwjtvmKCBYHxY86JSKh07IS1OsdqC6FohI0jjolm2Q4fz9HHj162+Qsxe/aozq4YvjUTAprvITCQGxwR2rEZSd1GLwsuM/NdCaKhRmDHfHVojIkIrQq7xXqTCa918sUPzjq0jG8hlADJZYkJX+8QogbDTdd16x+QuYax9UDIiK5+29/clX76EvfSRFpTkpnopiHuB213Ru/xP+Lmoh6Ym1qpiGSVuR2dFWtATf75chlmvQGu6boykG86Y4uEXrT50mPPZZWEjsVl959aP0WhTbww9/NrJouXfzai5ymU466o6HkIwBaqamMPVgQJuvamKBOt9xq7DFIUbBaseg1SDCBBRG62CZvXcu+sD5lrkEs8sVySuk4R2fYFoPerJNwbslz65fKqvJeYZHI+Ju/+Zuf/exn3/KWt0Q1RCLnBz7wgQcPH/79N/x9xk0M2DYH+JhUBezd0eFSr0qT/vIv//LJJ58cugqLs5tQU+rX+lc2/oxIQx9QBOqfqGQi5uNcUVmB8EqNz9tguKZxr01j3W2Zg4nkg9/wBR+jh0R//W++7s673v8cVmuUs1eC7Qqh36LNkElBGzh7aXGF9Rb6BFThkCr/B8fRhPZG06YFNS6V5VYMWBFZqEZPn7DXuIgUb7H86md/iIjfTP/cYuEC/Il7C9+ihVHtNszFqYhpMtQQG01kOHLdHyKiCIYsRxmoNznOyrRmmtpLeBK+OrFtJTNziogI+YGt+uqV89jqxXALVAhtVmlI6GZ7AS/GdLvXwVDdsDfSWxArIEDuvuqGyzkZzux8iuxXUlpyODq10PWmW9gppfXU93yV+UjqIhNV0Am3WHwIjH5RipmJ0EnjIGBPVXqb2UzcyFhWEdXjjz/+3HPP3717J7o5n/zitVSr4gQ0HmWOTlZdA1e4A5P1PwOs3Uhjd8aLjXXby0TLxH0MEBaxa2Ls6Ad9/ZQ5Ja7FH1nnflRVH2VViOhOQlbtb7MONacUBXJPIoQingnCjYReEV0iekrDtZhsLNbpBmyNt6Cfv4mto+I+AnVlGs/C8Z2q6zzjkuxSYVUkrDz2bhAR0cc+9rEnnnhCrAl3Hh//0z+996J7wED2gwm8zinI6StWHrs6kAGc8NaghA8fPigAK7dyY98boyr3La62GZVrgwlruyRix88OdYH7nqjFOPHgRG3AN0u9bsUwqaG1WshJ1bJ57YyoIk4iBTBYh/Y0wCVYXmyfY8Cx7IApFxwIoxaFlrtR0gwzkcneIXLaSiL9iz/9R6vaX5UffNOLf1jEEZVgHAkX0aCnrh3lDFIi0siQrcYIEo/acSWBzcaRbz2/VOtSitnCVEKTvHVt8peyXFuL2yV76l3IqFBqhQ4voCv+t9CAXtGnE16xDkhbKO+y7QBxC4YiFtu0Nt50X44Vg3guw0T379/3zQmVD7kzyBBV3orxKmGm76vffogRmUSdLp0OotCne9mCtCjxUNBWJMOQKEmJdl/EjM1IprLQl9jf0hl00+y3XvDGSzc+jgE8RoVrDgqvTjkfy5ujOw2XVHH7uZU0SB/0vU0DpPzbUex4Q8Fc8S675eyRyzvZ2yh950lHkxUzhm7sxv6FGFXX5K/IBGJone3znZRunZlcZEBR8Ithyv3Ad+8ELecAjTJ6JXdXuBlzshNb9Bpjk5dNR4NLZhf09fLPPnggRC+6d0/kPM/TffCDhw9JxMxN6j7Qk1qHPOSOOWBWkqHk0koTzzzzubt3H2/dTNGRdsXQVoIbedvL67ha55A1WjDirfycEKLVM5VA8df8m8987Bv2L95SAkcrj0TelG5RNCsVBRw0pFnzeIl5qUXqvIv54ldQnbrfptQgDD5FXn9ifSQdKBwdFrKQmpjTsidioa/U95MIjV113j1ivV7Lwfha2sWidyrb3KKaJQ/Ck+mblyPmpimlq79BB7F+BcaaTT8IfDOoKSGpPDzo6AdclBMYpXzXXK3KTYeJbhaY4Bv0FBAkMsRuWSvTSuE+9bR0vFu5rYIMtsUcoRf02QgzC4vAWKw3n0pY0ueqUTlHzBjnCzCrgXGCfEbDSH8rEolMFfvW/I72EDvfEl1N2VCc8LYKiQyvbaah36Kcmr/f9583XBcTfiRDzGpO57tCmXy0pMRJQ6jszdby2oPlhlCduD1cZtB/DsMpALYm415alJP4gLSxyDZIeMUCHu4oBQALsimSX0guX/yoBWENMVvPQXpuIxZa1Xk+T+Ye/uZv/oZIvvALX7qeu2t65uEzRPSSl7wk15BacQtY9DB9zpnxaSUS5iJkJJHy0FzZtBBZ6kkC4y4uUzy0Tk1yPK8QxSSzEt09YqtFNumjEanpQkTvev/ztHo9ROGpdNlu0fxBKyqDqQ5mjrm8hzC0mkG6cErDmCft3Nw6Iauq8jPmwRrul2mIJQ6UMV0TIiZ7p8Zw1erPGz//fy+P3tgVr/cLzBlvyNMTCgSW4dyEGZBBRvV7vBhO/KyPPDaM3rdUOE04q4/0EGPFWIPpuBgy6BeCRrpi10AVHm9nAqcBkuMApLB0XHOaYSm0BZKoSu09VrRRvvIe9pUp3j8BOLMzBGzBgx2XNunYLXH9Qv+lznbdP/qy77GRTcvNqWnYERjBMIrFUwwvmakncB+FviSuiK6yvSVmevbZZx9//PHqEpdlOteRYNOXcOD6Z699Yt18BT3+5g/91S4bkDfWlpwFJSeeVhHzohZhdzZ1ptZTd9JmQWf+pi58BmSmyGJFoiU6i1WJdWw0MmHYmfiO2qWUT21co2OMW20Hr57ME/lDjHJoh2jbyuobYYcxZDVebnUte3/bTksbl5M0a/xA/OR7rnUXo4gv9iRgN84JduKgVfzFX3yKiJ544gk3AcvQP3z4gIju379nmdGO+wcE/W01S4fryF9xpoBK1KhKwvf000+//vWvvyR/HDm33VDhWBooajWg9naMVdtN9s/TdoK1bwuIYSL6udf8CBG9/SM/1BptNjo/6s5glnLHXTzkyQLMTliEZpOPve5sJxJ7zfmZH+3TXZoYY9mhgp00oCr07lf8M7r7U4YVk6OSU+bNvhHcCXdI6oih9Cm2dppMlimzOnVL6zeJG3d+//ef+6qvSukQCXPNLkoP7XJ7XoeP/DWHZBzUJBYh0SF2EILBlNx+w1jlEsxt74GkOoyPRsMCWn5ah9IzHbcYrFI/wtmfZdWFcrjmzbzW4AxjLUsk+ih4H93EuHyTzH7TGCK4LCtk+/Dce1qfUlVlPQjq0/dXAO0jAUPMzzD3GfHDIax1ocKZlURE9L4n/1+rgm99+j+wgxsHW2StXNe/vxheCMCqbfCnImaqbp7sEdbQIuslwrJ1N00RYhyZmyO4yRt1SqYmsJ3QkcN+iRupNYfGEhlseVrRriZ1+KjkjCwzj2yyODxFoVy9uAXTva3NU8E8pR6xBzGfuJTdXdOL2IsLA796/8T9+0aAENH5/Pnw4UMiuXfvXhkCPg6ynYVMdBwryJKAOeehhZSdbXKFkYcPH8C65J6TcDFcyxMEVIFOe3ZMva7ZjPnlmLZCU0pJHA2EtvLrr/3Z9ftnXvXDbnCdyW58+Ui9bhymMnCbi41/xAfhBlUYRDffQWSOeV1PEMt/pctBa9S+lvWyevrGXhVSETn1jKtTTtFjseQ8hUSOOx9YFch5ynlqlVZs/Uck67AlOZ8nOm3DJjYqRJpT1o3ThYTVIsr5dZXO3v3Zn6WPf/zOz/6sCPQShn+QH++s9LNuYrAa53WYQkZiq3iMaf/PdLmkW+YyhrxksTUdp1p4WSKSg306bIJ9LJSjf6DpcmWIaSIQUgH4mblPuRehiibZJw7WeGDMwXYUrtKGQupsRJVxwSUSOU+Xw3ycWBTPVZEfRQaTdzUL8SPTADWEhIA8lNDX2JdVRoz5lshEJL/15L+ACruRv2DUBXvBBjT7AD9r+hR37/d/i0vyTart9u9d8ZxH8vNd85knOBB23YEchdYS1sJUvWV4i63grcTIfg5WJhWngKxvIeFZXBX7R7A9U2iPhJlPKYn1fn955W419J0oM9nM8FZJCoZd1s/pn/yoRL9O+YtP/QXZXqt4aZ3k6aefJuKyB4sh+mQmKtR9kYwEjHZfP/bI3ZKxiDzzzOfu3buXWxyCqLnmgRVusjUDF27vrtTK3Tvvf/Tc1++WCq0hkUxPG5qBCTiCKbpN5LCOlJ2pwgcPHjzxRNkYJ+PNHLpSe4yxjaAxeSY8A59jSFsw+PqaPeVlhpq12VAOXdahkSU8vhLz3LNfnU+UHqxB+rFOdkCBCY+ilaSOCxPR85/3k0QkQncevFPcgWbjZtULEdHv/Z5EYodT+V5SClsoYiOLOdbCZGjMK2EiuX/v3sNnHt67d8/QD2BowYiTXB7vha+P2vsrDN1izpH4pB/eIiQR0fVxApzYabW6WfR3VvTLo2IkUTUbFDplz+3z4lQ4W6BCVi5mBsSfaW0YEQbah7X0Bwdaf65SjFsezaiFKMry8QJ2shiiUnN9tHf5tlKBdjr+7uQ2KkSN+5/+0YMP8ue+lu4R1W+g7a/QehN+DE2dcHo5Y86uHj0tA8HxKU2j0zelDQSPLUYzbCoSGYfM0rYwsX6Zy+chqS17BUBFTIjktO/cJXEM1wB/JMoKSl/uWJp4wQRxzSRhmilFl5uzye5uC40pmsMWq8DlUhJMySLub/PEcMb0NsvrgK64/Lsh2F+rNDKXt/70U5/2sAARPXz4UETu3b/3ohe9CDrSaSZHq0QrprLmicQrtFVJZOaDj4PgkNyUA6ZZuTMO5sQmbcB5uN73qp9536t/FvouRPYq/60uzXb3zq/evfNeoj+5e+e9WFMLYCyVFuxMii1ZYZsyktOffuodMfMbP/zW1aV3fOSHkgRM/QUlSOagG4AS5jACD17DZhGmAL6RVuuxG1/LmF3+3gzJNHwiYRBsvC0IZB/iFcsZCovHR8mz73j4198uz76ztwgDIpRm7Taucoo8L/K8nbWd4grpJ6u2r/gDkdATv5HCS9l9BrVf/bpstaf7IUiWhG1kXe2vqJK2uIKYCRYCbngp2P7l8gkiMYR30IBDVZb4p6/9aIwpkJFlphuK2qHtZQISXTepFfGboZxjEZfi1vbAXmCIrsA4g1G1lbJwBmIJNHIJxhc91JChGZO16MmUfH9k2109M+qFMseKP/74488++6ypo3zr0//Bi5/+4hc//cVvePr7ydwByElpQp9+Ld2Dh4UJ5RIiaV9MWRhL7Kbkx1zp0d46OZ0DH9Locy0CBWNqmmpf9LVHg5Ah7Zljfu9AZvPylRDRHQgwpoCEKvuxzCn5hlmwrdQ/f0ZEtD7LnONfZQ3xLOdgSfQtYFYfqrUlKk9nadplPyu+EqylMHUqJvB0KRdTbMSMmBPvImToNUtDmf74JeEwvvqrX/fRj330N3/zN3/v9z54/959Inr48KEDrKmefjn6iRSRM2/JAr3VujxCkqh9+umnX/rkk5o5ha8I3P9MzL981T9fN+979c9+64ff5s1OBP/7vbjSYwnMPvHySyCTp4k9E2Z++4d/gKPvJQte3Qegt7FmEA03A4R5bgq7emack1wXKcVvMHaAohhSylPkiZ6MBZb3nEhiJL63m6jBOZIkW0nVJujd86ccOfGsAS19/Oitb1sf+ZlpGAL8rSf1ZeGrvmApz6l4Qg02A8PxhnEcQHMXXgnI1RyYaFCI+edf+5NE9Iev/YO3fuh7rGkmIjp4HCIw81mhmnqVK8WAYQuZ6DbKg4QoR3cIdmQBUzlak8oZMETXl7ktIjvhdjde8XcRKC1nDW/PI26SBosGIluaffklZ8vXPm4vIq+n75wmVwrpXBnjaa3JPFXtCBENH6OTOMy2kyQQ2dJjyUyUZnRVeFJiRa1HNerRK+zpU7tsQQMWksmQpC71GgqeKNcdE2g0XtFMnNVuYAboUvhG1biU1itsEaP1//Dpl67E/+OTfxGvS2o2MUr8k73h6hbM+sm/8/nv/KvPNP8WiziAe0K2IlsysJIqSF4tzEKqPT2CK0S388SODyyJk+F+4sUv/sEf/IGPffRjn/3sZx88+KyI3L9/70Uv+nsf+tCHFt6C4umUpHalz8XAT3ucg16bXtEzzzxz7969bNRoL1elg0hO+qc/mJ4GHHvuuTdr7GpsyYbs+LzfJaLzb76WNH4b1SAa9nIIMS86AugqKcK+bHeTo9FMrfQkKzd/oRmrD4+Uh3ivnuXmBiasHVF6rzpV5cU/EQMHs2j+wetfkKTmhft7o2X+5kZ85brz2Xc8oN8gofv0hjOdD0cNXaU4yxrZGhqXXHx/TWh4byjqhRbYgIeXLUuFBGcD5NZHrAnPcU4sH3/NR77kQ6+C/Fsx5sSksCSeNPUapieezilPbtJ1EF1SypJVbSc8s6inkQ597H+jKklQQO2/J7QRiBrcRHSLgY6pXCY/p0OiZjQEPtERajhNFHdDafzcymN5k8Ra3+R3b3mzhMPzEancAgyVbHjDwz3vGiJ7gyMZ5wNDD/qaOGGGi8tRzZHH4o7JAfnZjGSKAZ7DpM1nEYXuCqKG5lGqmPm//6Tod3pSULS6mvrRVsvyf/mCFxPJr/+dz/9PF8ZiImI8V13KeuMS3TwZi2CTGYjFC7XUvBjBpvBkjELdEixO8DJJanl7WoTpvT1d6udLp1/2ZV962iUin/70pz/0ITyjofRQYFzwSBIutmAWO8hU2M1EDx8+eNnLXsZMFMfcrZ513aZRBojoWz/ytpug1T7JrkfPvbulLflSJj7/eT9OTMwin/+Rxz7znkyUbQMHSUnB1P3FrAEAX8khsC/Bh+T6w8gCc1tDg0lMSaDqNQ9MRpfYeMppRZlQRG+4LvKgfXDDExjrYh+S5XGWXFxsLQAGCtXs+y8902mVMxHdl7+vLVYfXynLwwHjlYLu0stlguH3cDZ0zXP3wc8vGPzci79rJMx01FlHg5XXZLEdV0iSFVGZ9xcAcbpMX/KhV6U4dDvnxGf3GFPyXrsuEBU7MIZ1Nd1RqEXsKm5Sk6u7vzjHSBLU2wpT1nBMzTd+3/5qvztaFakYizO7pOTXfNBFzwZywpXn7RrN1LPPfu7u3TslI4WFH/nTBXKrkzlqhdRCal4KOM/zscf8bNJoC6DY2MdRrztj7ScElTcGvDaEoq5/cjQU3KKbTY1qTWep0JhWbPmdGr7CLqlsmO8nj74kn6RxwgY7aPiSTDDlH71cfvPTQlUIxObfykBDOEB2qlJ+8iWf/91/+RkNrga1wwFCoqOLAxkmqoqYeB1o3VBoupbe6ir2NxCVtSZCDx48+NSnPvWlX/qlyL8HDx786Z9+gojWceoYqHBD4PLUDnwbY85dAwerxLooyEpuaoeaYgys+N6P/JCWqZbUySi/+eLpZJvAIZuI+WfsSnDeRNsdw+H2OAVrG5FiBwfgfE6jAiLiZz2vFBc3pqBpV/kWThZZxSDWxppw+vIdR+sXkJWIOpdy7WEiyhex9Gmr3XRE3CdK0uLttXMJTkYI7ZKDDbWeZfamU9lkA5OI15y3YqZc9ndlufPoD567+1VIGI54wlhLpLms4PtOcPwbhDvaRoPw1g99L4Uuxv4eR6PDrGltRNQRxUApEVP6WqNiL+QuNyawJwr5qhezToyKhMv9+/cePnxoZ9OwraC+AKsr5d89xgI+DMZQ//G+Y5eYpmrVKTE6kFTEcodQJ6HlHFahPQLrdG4tc/pM5HDd1ESpX5VpWD7L53NeVD6sAF551e3Q3FQwGqSlT3Rk8qqgrgMvrJ8hyVP8MlMjwmznYBWi+ySMdfdVpLhAsB0wuOyWzTcLHKHe7f/TSz/9c5+mt37hVlNSYIlCZdEBf/dffmbTQXQD1XJNP5PyWB1irSneu2ZpGR7jjNd/w+FE6112IvngB3/3ox/96Ac/+Lv37927d//+avvjH//4/fv3X/3qV7/0pS+1pdslJQiqdpsHrQlxwib5ABMQWI2YiJ56+ulvfMMb1gNjL1NVjBs1n2709y0YfYMJcOCoYb9VpPYiXKaIrN2oEi9dE8Wi/jXZYxds20TKlmInmz7MLWXXHokQV/bCgzUxi1DZaFMpzuW4yEyPdY1qb11j13tIjGpB/PEV9ws58fGakdPVO21LNCW9pZip8pvuaCefCktg1j7muRFmHVQ5Fg+D4pkSMt+c41gzzKqljGp0aRl+pVVIFFXCAYJFDCYSm2glQZT0De9cfJwpiX1gXgyg5f+iq9bWoZM8xrqiPTy+sgxgT9r6ZmV0RlfdeeHT8mh0c1hPeEUMBGp0IEc6eOqS2fzxUpL8sKi8TOHOe6Q8rs2KxO4qUqd/z/N87LHHPMXjfLJFV6nOaxcGCMqtetcd6EtOqzQvCRfIH0+JyICjEOlXCEO7OvHc9FmXCAMVSZrKmEFJg+2bV70W6IKbbTzoLOSmmJu3fuE8z2uJ4QlX0n/6V39DdTG7Mred1HCjpmFmuFdvJWTn86qTHo6u7GYabVccBJUoF3sbwfr+xje+8XWve91HP/rRT33qUw8fPnzw4MH9+0+85jWv+Xt/7++96EUvypqTxrSIJtcdbMhPT8nS7OYPiI/po43DpP+3QVcl51ikGBSirZdaecwwWZ7HPvOeTGFqCJDKYX0hmj+LUhqqWARpZqZqmhISMi3jLMcNkfea0dvtpyKW27umOGOiVk19rPi32ub1xCnRbaa5ipitJxfOsVN4bpTyM3ex+6HvdmO9PMg5tSujkPMgZcg3k2qnnibDuKVQjfymE4/ufNWUnI0hKsyS3oBHkksJZKQmrp3/3DnsHqsZE/scMjGbw1R7uFb0Sj3UhmKVJFsWXJEoZibWF/nXS1XRadESefUZkDpyKO2ua/yWXMSz6BgZU6U/HYs0bEE0CLb3guKQzCQ11nqExLjkuABDRPL4448/evTo8cfvZgrtRw4tjjWgc791+CfVAN9GLFCh47zhKujK/+jPOP4tGmxd8Kpu44MYg2pqrkC42o0sSaWwLUv5DCZd2GUHWMZczmCIvDyIp6n1kglrxhw5USBWpe3mzR+rypprZpaYoa+4AG5mZ7kYBfN4nHjtJmH6M9S2nAvjVdlknat/+tHjR37g/IFVvzNw7BdYAXniifuve91XfeVXfqVvwDpPEZEVu3KpzfEM/JY7OWH21x3DVgo30yZ65pln7t+/n+deO7W5FvER9Mj4GB/xbrDFDxm/0K7qiR1wR2SiUfK3vdBAVFtvga5q5S/sgsNBqKG+rXY5DjeCgPFCIyAgOVNGMkTl6DFCbUhocV07LTALMvjCoe3LRAHWVscpev45npmERvyGyi1IMHZiuIoRfvTEd7UMIxIiu2FXYXPDAwNzhAN3YZopr7JSxS8HvSZKDH0RYeBK/Aljzni3kYmyeREysWHRUxWOH/3h/xkRk5zf90P/TyPDJQ9JLRsCDNmrOMZoDpqlEgvF84H10w3+RHdZ5KGgGS6lwuY0pcwhAOk1gD8dqRqv/mjsmtvYC0MxtAJeprDae9HBImCD2k0ozfB0k2tD5JRpua36aBLvEP4DcIThIghq2D9XGGt182BGG2TmUSAT7nbhhMC0pcb8NFQyJc4ptaISdyn5zzNgn/9HcCRjs1my/9n9h9Q8bWcAOFDJ5eK8nP/y+C8+Tv/2vzz+C6BHloaLRa7Oi4WP7GksGK6nBxVquQbSw7axHdByHMdxMDHxcVzIrJ3DdBx8hIRCzUZG1NyGonI4c1XWsUZ7c9YZsaJ8IuKcE/Phbp78v4LkqqQhzW6kLwkgsJJXWXRKrkxXTJ8YAhph48gTkSkb0gAF6Sa+UR8OubEPLQWOm5pqXmepqxBafyGxjfi6P3NKeSTWbp+Fi6R3A+M/MFACT0+vVkTg7K6TmfwkbuuLNLJ3wkxZ3W64bp1xLOyiU/QlTnwqBqEjgCKHUCgPXCyde0yHlQIXYRGi2JuiTfNaQ0l2crVxMPlhfHhBp4R0CVJ7JUaAQD1aSFKn2dybUYw0ZMGzujIR+kZRE5tMm7Vlg14zQJ+i0TwXCgMi5yhp5Qoe7qhqRXx0RlWdr8mbDGRs8rvepVYQL258K3bN0tsnJiND7bG04pVIv1UrnKIMnuuIPGiHlwEPs7wSOSdSBG43lNxZERGeP3ZqSWtBgQ8VjkkSOE21K0ulvcVWK9guftBO8hh2IwIOHEGbD5JYhUUgUinmEiRgSwx+6CFyhDsiS5+JKF5b/I3j17/p+W8yAobuhPrhf2YUxjn9UQ8mSZvNWKe6TIk5jL1FATUrGW8C+5E7Tz311JN+CFYY6zShDJzeh1JqW94mxpWoC+Cqj8hf/oORDBWdIuEXNoKHBzdFLLBgD3oDyiQb+FRc/dgCg2nUbuN1kynJnRWkB8KTO2Mq7a+71XTxZpWw5Mp+BUs7tZRXX00Oo9+p4CZ2NVr/cXRsO060FTEq9Iu4x0GjA2evE69ZGLzFS3bFFPEWXM0FOXGqiYvoATes5ohDjVb2cgSJwOjU00mSVMOcTw8vqse/iQuAwFsO+PIyuJ1COLixNRHRAH9CJ9q5BCxI0Rfa2whxKayUGP3Ik++X+2CA74axQIuBLUhDkcCd6dC+Da4BpTpu53rqB5u3HoSnn7Pr9Gs/SZultNlwF6dyngUqsnMPxbLXNuh1dxklRWD73QZscfu1PAnaLi434c6YKOS8rCeC7BKZDtbrTgKMNmFwJUGsV3jOepLpOBIMJqx0xpoalmZnZ9OQE4yESRviIR4WJeOcBcOCtc49RKMkHKLvMvctLFBtDp4TEdE3Pf/3k9uNxUrvpRCt77ilHhnkir67EZ1Zz/COG6mKmwMmU4kKeX0s4JwV5J4rTMx6cYqAPia99pI5mnwpGRdzBsyL/+/dLGtnXRQRPa7ui+BJHYxuZNL2LfqxnnLKqVUx4NxqzvrM4nYYC2pHrOZvgeSd3Wh3+hVkhPkY2+qPWs5ZCoMn7u8Z7iNflsL2kZOwZJLSx0gISkMVJNZD+xBsGQGV7FWDjMljH42k22wXEz5oE7DemPt8JjOcpMc2QEIU36XxZx1XGZ1kylviFpBB6IQi1kw9Qg/IGC622Zh1xOkJASYholP4YCFi+bIveY7txSA9bdRHXlxYJCCLsTLDSvsZcan0V5Y8JI9ehjtgVg5Wlb/I2N3QcysSHIjK42GpZ8tevx49etb2YBVKesFw9P3U0MsLsXixaevpAbxiYIsWt23vWHBAVxdWa7wQvTTh3NZlh2AxZssRL/8rfByAscjMmpkPM2DpbGBg0Z08tsoXO2k9SmioRsnaDvlkYjS/3FS2FS85ZS5+KX4tFuWtuKx0V7pzOQw3ybQ1kBfo6j8+/2NMD1B14ddsBUSXw9AYhfLDMEdJzrRRkfUR46cg1hHVYtannnrqla98ZRjMfVUxcQkJnocoMaCjlIti2DcppnBzwUJDIbmNwg3mLAraTZ4E4od7CYQfLQgXYXkhzUWrMB8I33wdIME5gP4deCa9CHrrqlBbnR59T1I3pYe5iAP64JtM7nKoSBsrDIGwSjMCPhzQkA9k2VBxafDu3vnZReOj595mtY2vMUbCmgLhaRq9R7UMmCx43zWU3TYaa98zxIxqLdhwgNTyhVkAU2m1TB+WhRwxslOtSq19dJo5TBYR8Te+8b+hsHuu6mIvsLhlg48UCpUxpSLh8HdVkjVWavF1L4ZQU8RItJpk2ISI5ARnbzru/GmNTszU7OVbNCKCu8i1smY6U80Qk+46aC3OkbB04fFpnXgCcZrMr8A0z0R3RlBoG4sDSNn3MSp0f2MGyo+4bqWuGXpZ1BSTQ8aok35/QVf7rLI72ShbFTBY4rvXs+H1liS9p3ZFNEaV7Wd63njafyqVpSyDD52ATsqKL7wgJmjuhzaJfjKFMViI8t52jE7xvIYV2SK6RsjlwSWoe/aT20usrtua7RWH3ziRq5ypd/JbbuwAgc1NlEWH5E5HOvBAgT6k3qupNeWIrDeYbnbFt7hug3WMz65sfkgKmeNotaEjX48AE/w7ElY18wUW3wIIk+dkYqiZucC4tzFYXLg3K11I+6AXVBkLT6I2l5qw8jvNKrFkq7aRfW3i7t75rUfPvYGImI/pe8Os2NserGl0m1IOSNoNeihX0MfggEOmFIEg8LG4MkIf4EwdWQiREqWPm5Ul6XKhH0JKV34yx64twq6ovBci/I1IhEbWI2LdHAI4zKHPhKu8HiDSb6rJHUI1qZclMTxaoCUhOGiqNFfZ1bynn9e7DRo1YgTJaMZ5r/t7mznCwRdQHsja5L6th9pfSco2+S9qwNc1iHT4QkcS1fDdcah2aaJzXhcQ/YDcVfywCisps0tbTiRrF6rQ5qYYLCZi5sNo4ibBCBoEbrtigIaYxGMYuYaUqY9sVbDpvpWooEdaFzbdmVN2LdaCNV6tmz3devU+qiHKqig28yBSg5thlv3wEXzqqaeefOmTZPNNknMcgdToLXRIWwwCGP7TqnRdD1qC+Vl0yXo6tbF9g2AgpxEw1NZ/Pnjw2ftPPHGLGSEy29XnFmTlkhPBRLRDABPFNtZsAe6JeB4R1Za2ZkKIBDhqi7MmQ5Po1CHkeIuC8d4ln6QLov0nYuiqPioiZH2Egr02bidxJJpL/XMAJ5hv/+x5m5wlNK2KbBrmulxxLyk08bL6ARavByoUZtzYrgWjrb6wnVM2gdBqr5jR1SSjJCRCp9Cp7xywvgZE+I6I2gI55XmRE75uiX+p20nYYyEUsGwQvCQGdTiyaE1GRfQ74+d65RuLZGpTE5jTNMmDr7KqzUUE3KLcvXt3ffKZqr+7xX/Stvw2B4r/Zc5kZ5RrFu1ZcEk8eQJDkdB00zLcBj8xTTZ8p2WcWi0QBW804DpV7o8iP1Z7Z8Hn8yQ85gR76HvbHSeabkdOXASDGxXusW9+dacAzWkCVohXnv7atqjNxbA8Z/cMleB9TN1yIkHi0lpvUlITlAJXPET4ZLyfcqZSzAfVXvqZmWD4Voc0HhV//J+DYzGrwV+boZIw88OHD+7dv2dzM7BigK3btpJ9H9DFODAgTszVrphRnqb1ZfEifkjPXtu+wk8155gsREjtNr62u3xumhenoHCdvURBeHTA9DeEMCgk6aUgW9OmGlMRVIehh7kCiytA+8M1Phj1Hbsh+QnuZC8kRaiYOaIB/fIOubVJs3aQuhbcSh1/9NzbiH6LiIje0JooappEuZsXKCVEfPc3fn4R89wb37ZSqi5AKKqMuHdg2Tv/Ppr3EbdOK1D1gbZDf8CaVTai3Wjm2nsI9li9BJeOlDUNI0i5EyDPsLK5nibAzXMDjksbWLOwOYzAn5i5dSnVgFikuSfb4IFrApsKNz/FX8kiStrB9tSQ1gaU9Dr71CLn3Uy2oziO+EQVPJC+Y+8K6Ej5HRVeWWsG/nREVXASPjJ6MnvavW1hIMbNu5IOmyjal/pyJ7eY4JHUdwNXg3Nmp95W0PdebuePmpcxdbNXdqOG+iKVN6362w8L7XVPrV6CGygpKQx4lbMRzGkVw/8R5v5lIaSKA0JVHBmLjJw+bxl20tpJUgIYy0UZzY1q43aSzR4Hr9syBKWqSDA6NhlyQPWpj1FDSpx+YnICfjfiKsyJY3R1TZjiFsVMUkeRs0G5TT27FkP+b1NQbVxr0yiU3kTF9EhGQIHusao/zk2kXS8JUwgJHtmQnDJOtLj1vVNYAI1HEZA0r8RLLvL0rHyo4w0DB+qlVLk/xBkL4BUj/o9/38EGpUEEsyOrFjTrzdaL7SBnhnhZEMN8INTLHWFX/wwB02e4UqWSIU6dXhcKwUhkKUrdJSGm+0/cf/Dwwf379/MIdvBUx7f0a9wEMklpIbs/lcxq/Jsh42nvNnYksackfMQ8meDUd5OsAdPkguYmdjZBG/UDXyfWpWCpBVDT4poIMeuhG7igLNPm+ima5f4s9xh602eelArcytSjr2zRrEmtklgyUkMk9hpHKI6IlO9Ehg3Y9RwVQXx7VnFkRATT32nUSzcHZ5YWBA1G3s7jIfC3GpR8AF7+KqkCMu+gZx7wlmbgOLm4H87dCcp+1DVTyQDQI6TBZAVVBlWLQKNh8iCZh0Og77Y9KdxEOqidD+Tqsu/h27S5Bw8ePHH/iZCKpiFuCZBEf4DMyzwhosHepVrJTEJKv5Kl9PQWwnJD1lnowOi8ENQ21eCyt+dAKbn9HOFF+BPQQ3HAnurBMHQBSwYuJyE3xVx3125YlzTBVtzcVnJdVaew5q0bGwdtRW6MK8EinKwbf9iktyKPlW3rpEH10FdBnAN8LSwSuUZnK+p4KdRZqY+gI0QkROho41vBaHL2uD3In0K22vEAA0EqOKeZJ14tAVvQmYgJgTc657FKEm25INGwwx070l0GtZTEor2wTTIgpG+gt5d8rapSOa3MPTZUaH706NHjjz++HpbJ/EDGZHWraPmgA9ABqN2rrYlsvoX9vxtmevma8dOcFf729JtbGu6ZQDI3GerdYFSZ+I4bCJAIWSeZJnGLaJazvMsQ5/yWujfB8cgMWqXFR06qVNFg3ayH6SwGnCJj5Tma8oIdZRCD9XPd0j50HGGcpZCk3Y5oTfzQh+IjtSqC1TQRkvXylCu/noMgBCA9R2DzNMV6pOlCn/6LT3/hF74U5pRA+TXUuUXSVjZCGMZn3N8DyW/8b/7dXqUncsPDGlvel73FxUxk3xy9Eazk+DxKS8Kv/jNLTqEQxX6a5xQGk0kF5o+pCPrUWjh7BYZErWLJrajAz8DWr7vyx4/4VeMUyAtmxJA0tFVuKeG8jDCdq4mOOs4w0etsXwlUegwvGm1LjdgthgAriIjoVV9NT33SKZvwSolgkZtRB3841wpnGR+HJqIUYMiT+MpPYCmSPeQ7hjiNV4tdoKK13MQV907Ff9BjSdvs8FTCEUhVyb8OKbWfyYPAhHYoOCE5Mx2J251RScI2Eamk7LYjjf3lJ6RwQ1KuMWC0UYkip9xyFUC7gfHX0hC2rcVF5DiO+vTyStGpGK4+cJzzz8TA6l4pyzWB/HRQac2prVjuXjlwxPnvuuGKUwTLd96kbxF284yk5xEUeET7cqvmXLHo/3J0wG/cKg2vyGKjORgglWvJLqT5GcbJ8/3WmnDsxpid0gTyKhuMFW58ry11v9gGTpaVZ7OvqNPQHLPrrZSnxIeKzcrw8OHDP/nYnzz11KfX05e//OX379/HqkzZOdJuQ/Gw6aQELK/rck1LKm0r0xUs3oqmsYld2dX+UT+PYEbzBnCQm4jS2X4Nl9Tm9GuDsEvyRt9wTVgLQ6eR5fosIwNP39dfa6UI56wdNtIkaTgU4O6zP0lEd+kPHz3+zjwn4Zw/0QZqIZ69yl6xZj4hSe8d7wPbtVG3+INHiXihpxyM8+bn/sHbgPKNSJDGBk4Ax2us/CAEtw/YePtJVL1+iDGGavDzO8VzuZdyO86Rnkx9ajqsrXeW1ZYFDbBbXxhWigNdMSO6imbQHGZzjSO1U4qeAYWNTHbqEs1myNbwrJ7h6Sej8qZWsO49wTBHmt6fGK2EJx0dZ6sfKMsvOs2YRAUDpviiOpzRv0U/IflT1zjdSkrcAKba06FShG7Q4bFsRpA+Hz5T6wrL4vcdKylEASzEJCFUpS0OQtMypovXwvpz5zw0XT8cr9k8c21LfP6XXLWNqPp8h4hAZIWo2z2wsVzgKASvClnEwRZDd6gUlKCtteYmg5mh+6dDxoqaeuXwkYGFNBg6yCb6FrsKIQATTIRr5EL3791/3ete98u//L5XvepVL33pSxPJRq2nTEdR8EZb0sQRJ4IYCahuavyV6jzKSLH/ueHa5eE29EaZm4sQz2aebr6aTJqJGWIDDcwB5R3lNM3X6UlVhxq3GI6H8dK7XvDFXvIhd7NfwETVahXIhRSgTyjDIiuO9Uqc53hfplHI2odWMXmUwtvIg/Muy+YF7ayO6rzQUERlRq3GsZbWQxRBqCJFLyi5c0LMAUwZSXLr7XBntD/pPYYciVydVZ5kNFAuLBL3EhbAsLioux3qQdcRv50VIbo6nxRMIURXHsMr2AXiDU6qlDxQPHQkk9j/luJFwie7bYtBsONihwkCM0GGUa5SIWmw7+LisMMVITV1cAkMRFWCWEucVaotG7O/iCgxyb+RsHFykrepWE/VhRXAlLFg73e9z6IOmtYPMmXfd5VrCzWUOwU55SvwDUh8IdSeZ2LwmaVIu0lthV+Z2d5Qjsm/dioBpiKU7rSSJa1GU/xuLbSxDpZgDThV8rZm+0Lkc1+kpztReE3KZvNgVnyJEJsIOeqPVK79rLxgYKWzK4bNr9L7P9AvJ6w8zVZ/mApTL1IKJlRNt7ycOVcQYOpFf8qUmWWJMuSFXy8EUe0rus46o6t+JWqLRbgOjMVkDs7AvI0BtCF2/ZI9eSndPTep8qaAMeSfR5ZZnuWvcGPiTnHCAbdkdQJnY8Qa00FuozQrK/o+mLlyMyapziZRA98sfYhDa3Mw4RQ5j+Soisuc+5UbNah0zUv2c7mMDKseFlvDfvaFdnvUP8It8J8WVsKTe7rYZZUARG021UnYEBaHheZU3L14wYKYCcJaqKRk83kP32LVkm55/CGPP3730aNn7959vPZp1t+gEHUVX3cgWm9yECWOVczBHBlY50UhZmv1dp1quxh0MDiWibDMvZ5xBKN5Gq+B8Px9ISg1CcAFRdsn+phRiovLYyKCJcLiOfIijkejciIKrupGAVVoNPfzcqwXVGaAYlfeDpIw/I4W7do8VJFUho04aiy4rAck95XQBlygOZPU9YHI83zedNKj8clfqmcDgJINEH73OsCWG6D+NtAEF/jTn37qa7/267zZrAPFYSQvkotEid5xlJBRTjAv1rrKbfIMKDB7skRVZbD4P5xSGBK5Ckxr7oVeiHRF5QlitGPmjRlY44L0hPgWr19z2ghL+YT8ZCLWEPjsJU1jrLmgyXwMCGEZfQhD6gBXfj56/HuComRbknCC0KGCFKp2FhRnNSkb8+HHFjTLpiccpJQomO4h8qnYw1zU1TBl+ouy4hDYVNN6cNJ5wLzcpMvP4E6GBQn2IERi20AP6j7aStQozpwZ9bwYavx5NnmoA1qsU65hTI9rKrutRIZNVLOf6oAP8yGbwrTFk9xE0q0b7MzlxA+2JGpF2fYiNSrkhzt0rLxFsAR/hm+KnXmjj0i0XadkwDdkiwxywYFa6nLxIVOeZJpV6wlDZSHdd6xyKzAFA6agQrL2WdrSpu+8UCgwikWRjGA4t6RcbREKayisKUvyW0ZjZMtwZMrvblzcIMRZ8GlbOvs5EdAtjvULigwDxpL8n1cIAW1keHqTOTwKE8X7limClUTfblxzdlNnevjgwf379+7fv1eKUziwlF78615kw8h6VR7DAKaNgxs8gDx4cbKn8Hz/BS5xPWlEkhKXkrqhdz7cYPgynX+7i9O/HvuZG792G3yZU2TeEzrXliZghUF6WOISMyoeyAO3lxOhkug6e1KVxpm+DrngPhznXDhbdhH5+Nf8KRF9yQe/BGNvJe/FTAExNMX3DIpjTmqS77mw0a5x9/TComLeQT+nuqZUeRLoIA+BEdHWKlNmpgA/4Qa0pwUILyAR9mKd+RS7r1A593q3EydpN7iqPqj2ZZ3FTIn/youh+9Cu4Ia/kc4brx0KubFIRM5Cku08PJeExZw+/d61iL8Wuqq7EfbTsFz/tsV9HkuPDQ+jlRsrr5TkU5GKbyVWr2tYlTGiLLT2YKXa4q/VkkwHOtBRATyTkhMW80pUshBns+82FPO7D8ZTshDNXIgmYK9rKUw17Jz5tglHWx7DGzCWNlTMeoA61riSFcmgYbHXkV/qkgInkwnWeu2PEmnS709b3yuuKhlLBMuDnaXUjfMVgZfIMgG3uSpDJ73ybT1LLVDVkRrlMnt0yuF1zR0SMZmemy8s0gI/ox256bqF8P//4XLKky+ByDmRiWPOj0+nbYtCt+kISmCOYHVzOfCwqR4IJK6Y5+snv+Zn183vfs3vv/OD78DMyIYyp7+g/N69e8888/ALfv/3/vo7/2I9feIz7xy7u6hD2XFrDn/xkd6KgacINw5yrZArg9EC++IKjBhAavPFOShEw4iPmEYSeNKXLsna2OCw+WYQJOtmcW/krVDDRMzhXLFam6BG70ijbQGdOwXMw4LZoB6Jfoa/UeWzzz579+5dKgO0qytPBizk6Wt5fnYXLonGdwkddeG0PLPFlYiY+UifaRrfv456UmqL4O7zYLbZtpfmpnomykaCGUSEmfLLKmTWg/o5WGRMAc3pOTynym4AKenTUEcPa6JGPuPEKFedAuoevb5S+UI8x0x+/QjR4DQLtMIFiErBFMRSC1FJFQxZDrNegf+ceoMFA2Ea35LYjehfY3BT69BMlP9HxKtcNoUGk7GeP3zmmSeeeAIfHIbPKObKOtExJ5eULatEH76AQk5Gk4eNHFajzC15cAzMLPd/WNn08IfyV8PaqEXsdla/ln4r+ew7N9Ht3ep6wXBuXVv+X5WZgudNdMnkP++D1BvnUpT6xCt+bNXxxX/2fZ6YdG10ShuazT5Kub/x6u9GwMIfWtErjrsawgoLk9vdS0LSFOWppzz9/PzfPz7zulZ+lHnZy2e9qgGDYBX7H0Lltfx6K7U0bL/TfOsnbPWlwUuJBfkGSOSP8rA6uhoxWb8x+5kMKHoZ8XlsqaGg7tGSlO5ETkNX+aoD1KGq2+NLQ4DewWsmkPzcZi+f7SquZafV2+R5j+Vr7IQFb0tz7vuCIInPUx57bMZSm+vGbHxDHp9LN9EtdLZLyr9BTYd0Jq9MLB4QISEiPwdLJCOYEizFUSk5M00CQyVAEu71Ftv2jy8MBurSv90WQI8LGttB0vwW5Dbfok1IoYFR4h1O8bNuM6HSKNQgglEKX+yxNhOT8/qpBJ4pTflPYxdH1MXxE5pLjmQS0pXBsUMx+n/x6U994d99qfPb42k+iYGrz/iT+EKRwjzxhSjwTwmt8maMKyuMktaR+Mn33yeoI+kHVqWHbINFRuKLZF74tkr2jcG8nr85xX1rV9etHPBcUvw1VfvZHK0IEZ15xPVfzEhg11aGZ17++y/65Fd5U+ZShfLIbAxOupzAbL4u+JXwhGG7w4jEwBjBTeqRHZOBciKGscigxo5y0JQP/1HJs3MAeTrE0w34e6SKyLdnheOxOQYo2mbRjRU6FToBDUO7UjAW0bQnBmd5YGl99ANd3b9//8HDB/fv3fcM+SYlru8+Qa/Dr4UgsReLHZ3tuoBxQ35JTJ+8Og5f5se1v3/8x3902apn3/ODe8IIhmCqpa4yVaBm0SwqiSv4ZOpwLGQDc3sK4x+cJwRV11frOOeUhmkuK7ObApImkZ4vHOis+xld4VSZj0MxltsfJj2moeEqysIxuhOhhHPtXm0NQIQ4XtY7iqvy+z47Xgh8NmRmhrXWqyhXYI/LcUJTVev0+wNPiICSE4Ww078/sze2RERO/YiynM7MTtsiIwKNbChJw9GXoUfARdsX/Wx0RIjga4pQSZwFv+o5ivzAvJAgfWu/8jlDvsgYW/sTegoDopjM3V5xh7mV0Nj6vDJAhrt6sdl9VTMYC/TWU4dlhKe9teIdr68LPXrhuAoZAKUvJjwUA9d9jxBB3LRdgK6uqEXMNFLSok2DldwR7zVAF0ptif53/cE7Xd5EH+GnIVcBr+HInCzMsXyvfi392Z8/9oCIiJ64z3/9OpqcbmPj7X0Gh9pYwTIpM8Kv5C1F4gHVQTSLwiA5eVsLgMQs6+HOwmEWud5TfAu38Lnp/sJndUDrwojVfjLPmGwkNRpJk8kR9GAvLDPwOJWx8G1fADmNsru/+suP3vwtBUY8/vjjjx49+/jjj6eBlLRc29AVYWaNPXMQ6UPJdoT1sqJDdI4Neq8b6SuGbqLpmOL3tcZG3v7phXb04rcJS9t832f7VdIcVy1mQTeZFsYyIZI75iGYiE7/alKyBcVhxOdXag6/T8UtLTYvFxNZpFnSX2ifNvjpcnsXjnFIFae40bio0XtG+T4eXVq4hMzUyOUjvs7nTxHfwSZqX8Bjgur6JKOuSiDEVIE2VWEckxjuKltmXwhre+rTn371a16N3ceyfm+WMTUCeahwDJuFkY0QJtEWKIMMuMJj36UMSDBklXn4rZ+jX2aix+ktQZJVkGksA10JKS6cmYlwK3fiieWfAWiE7oKYUhASuwZEZ8fFuxsvKf/az5txibXIlDYGFZNQ56Mi9IpPfN9T9KGX0msGebjyxUxzAJUyS5O73atolUkTJzZRPFrNURCElvq8v5NnTRzTxx6EiB69/R2PP0dERH+9Ff5dT0BcS1kXvMSTDQ+9Kjfa6SZVWRst0CQEnmgcgxmRNCma5JlrYhn6uIFjs71OM55uS4lkzVknwUuJUfk4aWzgvqSIUW9WYhgDk0Cqz1xLuxVwTJRk9Xboarcy2KpnIpxEtSx+HBspIFuxrvM8j8cei0qutBurG6HSNeTaVVWGY2xesACJlMRhqoP/uOywbYUiorXJfQpfQbPQkhUTd+o+QSj366k5arGn6/PfaxxM95IOzozv6ReRqingVIcnlwUpJN0LWjw3ZChSvrK6j5nDXReXIy2/JkH3IUBIkQNjsJVED+OhleeARKJ1RogOVOAA71DiSwJmrmOUU6ikxAT+5ql2MRRm7aZAFAe4lAQFzXlLVgm0LYXyF9FbSspII+xcbAgg7unBgwdPPPFiTElk465/su+fam/ByyZl9YJp3AdqK23XiRdXMRJzhR0rQ8iwaJa04lL4RkQNXUn+9wX1ou4IxGcT8rNiUsUjGQ31veVAkxGxOSbbaP2CjsyouYWWiy5j2GmXZWUoitMgPg5lEnciGpQWJqLunGyKj4UZPUnu1IXoTqMf9/G3Q4r1qI21tBt1mFHNSoutossV+gs2AqWgBiEiunv3J5axefTo3VPXyrtyRKARGQKm4ay1zH5K8z1681vo8rqlGwXJX6JO7kyyqmY3YYkoVqKvwYp2XzXkaNF6NdRam6QmNhf7n3yqZ84Qnaqy7bTtmyAdETc7XTtGwgYEyDGkTCTU3yLMQ5uEUk7JxmX+5F88FYloZ6ABi+VY7Sj6ST14PgenqBDn86fH8OfEEU9tXVi0aW/twQTyAlcZPdU6TfwRKBsU4899EMJRcnlZD7c72ExBV8qRKpebpTOJR6V7y/Q8ePjwiSeeQNPAFvOkzTXMvP5/rP1t1GdZVScI7n0j4omI58lMEDNSUDEzQZRMEFESFFBSRHkTEMXXcrrK6qmusutl1XSvmepZqz/Mmi+z1qyuNTM9U/1SXatrVVd3lVW+IaIWWiUKlIAKIiCZiYBkpFgmRiYo5PMPIp6Mu+fDOXvv395nn/t/gq5L8sT9n3te9tlnv/zOPueeuyGp6FJhvEcPJJilqILVVo4vvFu2kaqMGN5+98+3mzd++i3YJ4JgTty6zFEARuHjFt2Htw0o5JlajPDJhdjZ01x7bcppymX8FK8iCDfE7cqrfCqnyDMQG4O70Q2UzqusQQsEVe1nLaIzAAxnKyYhoox12pKKi2g7JSTOHzZ5FSokChWW086hOMd4MBqEUSCJhHCFwypufxE9JDc54lSg9pTdHLGRebxgDzcEcnIjmTQ3Mm3vr2lisudANoPn9aR8z5g7EYeeiYPX97lcbfSYiK6/7g06bgUnN0ObofUU3x/GZRx3UitnnytSmV+4vY1GKA9aSYtg9XRxpVDHpH8CUsfuWB7l7YKwbO+loKyoP40O5gmiiCEGIupwpvCerWuRWiIhOpsxVDV4kGg6iSAg3TuVHV3NVcsmfNgtHZKQNquhcpx2Yfjqy/I3AS/at2CTE+12BMBTOloGSY3R2I6lTPTXdTWtrofC4RO8ENCeQIyJ1T03yyKJ1Eg8qLdVTUQku92Omdv3B0vbPeXbaVhtCh+bRjZSwQXsuJXOClMNd2EN0/Vh+oNZATS7AU9NQqFOim8osUXbPl6bCCBRG41ihQmq4jwZpn2jw0aeSUvABNjKuZNfJSIROjn3eqPndG51g6RTlTKosde7nPLK06FwRkCen6VJTgmzIKITF26ALZvEh6FOU/OqoORbHYcBepqOcFQlCsVyVBgxFgcNDjEJr4DUdVVCm3QWb4xBnm7Bv6Kz9ZUYJQoUnAYdXzfCbE8Zy+65sAkI2ySWRvA0zKK1iuCo+47YMPLFQRgicnJycvbsWaenshLYKEYHMHnoFIBGfWCl4rB69JeZ11WYG8bqzm5hHpXIaw4jgLvBLF0zR3OIbKB8IQaaWlF9bmJpmZPfRJNolTC5eRCh8Jnas1B1JnTEturOzQXSaGKy2tS6pK8K2moXEX6FMBWwGBVG4CctBoIn6cxVRGrMlPNISkejMNqvghgr2212XApMNqWbrHzSI9uZjRDlJjc9CrCgNhRZGtK9vyO11aM92Gr7qqoSUPUmG/62fx1gWGyvYmE4rKW5Ba578M30wkfoU1YeqqoMpb9L3oe0ssWKAMbGmM79wS93Qs4fPnnPq2gUmjxfZqo/AbFxTdEb2DT0ijLeTrpGRETXP6J+iKK3th6w/svlUH7Z1388dBW6ah6C+nnC1lbBdbNXKo0+j09A8xQ0EPMyvJBorQv0d9nHvXFAR2QWjEzIL7TSOjhV750Mq2Dgg+3gJyFifecm1eMvr8TO+o2JJcb/NE9yJSPeGjlfIDmjgfIV2o2RudKwEy+6PcO+tCj2PlHl8g195obVRevbAX1HTTRl9nPja4N7w8nmwmAOUJovhg3dPU8KZAa6VB26RxdPseIG/dQJZis5RCgHwrT8KIdpEjI8revEHk0kRyVt4vxWVApAimdHuFChB4I4swuoxk7wPcECl4gvFArFDfKVwjSxDqQ6Cp0AIxTkySSSlIbiOg3eqsjBdmXGe4ULe6sWqwXpBBPT/+KMkznoUhdNP26CCJTWjz6PEmzKAi0SEe12x3F9kGrh2rzghDrvqv1f5Aam4lCnaoZqWcS/RxlHsHaH8aoH69Knv5qIvp1eiuqv51sESltcnKRNFVmilhI197x6yaI10YmPmZ5Nqvc8JqqMqQrGtMqu111EEtqgKHupGxkHKFCeGCGowexgFeutjePw9D8Kuiqai0aDNsUJjWHwZxOg6b8njafgX+dnRJOFW60mGDTgD/Q9yL1iT5h0IDCAAAeUpapyaNdMkCPQkQ1GFWKpRO1Qsk4PnZoUxMQxj7PasDWK6MnJ6yr6TVz8iTmxGD/bvmy+zasfvDxMSv3NcV96y9ccWiFDBvjIsRuMYyHeIZtRFITh3/baXDMt67raFKI5hSXiHckzauxYnJ45dSZUqacoA+lIdzRlMiSiHKYh649EVl/l7B2n4epNnl37YZUW3xs+R6PvdgHFUzBhhKZQU5Vz+zLLQs2N6qzy5uuYXDcJqsKNMqSNrgmGr0jGyoudWIkza6SkvdctssZz+p0ME25XNmeyoDi2UJDi4149cqaKBPR8jz/+uJ0yCpkJCaiuVE8BraijqxF3ju42hrXBcaAjhEHRDhbXKBDJjvO3k20ghTUh73YvYWTgSdjSSTWvJcQLyToXQsUv4cMU4enw8zQSG0guaxicKdm0EcR9oy19dPBN9OTjRHxy9rvotDoVRuF0Ya0RXVWZhunsrMJzV//45OKzNqtKMX30Q0XOc7/+a0SrENHFi9df/h2kkZzC8ufy8V5FRz09Qg3v33Lwjpa4Xn8NpWdwjUsQ2oyMf8Gm9Wzld0aMxOibCaQLjY/iFZX0iNmmmImz+M3uPRHCHlPsNSSOpg+ecfOmYFgQStm8N2IMuzFWVgG/jcusevvB4trqpIZ1HjUd584dnJw8ee7cudN4PZsSjCuViZiZnZe8UGmZG9MWwyOKqJj6+ukylMLytQ2EgsO7zUweO8jd9RwD/f7W82SAtkYN5D+7FQHW4DENolCgvS3CIqsGn1JxX9qDAGBc8jON6v3uQiC6tJ3Md2XNk0p0Y9WrmltPa0jvLd5jGAg5khUP/HSYhlbOQ+sMiFM0e73yjYXtP9UUy7a2txl7dGQoPhhdCYinJ/puAFOqQmdEKHw6Jswh2gYsGkRQ9ENmlrPqXywwQK3xKnoaHV2iIA0KhyBrdo9w635scoXPTzEB3GLtOtlJiu2tmYAaKN8X/T154RtFAoAGW+zRr8CBwlAMlI8RDvN3TkihbmnAmH3jp1QT5T95/jki+rqPvTKN2hxmbSBycx64xuQZyhjwILR53GM0qN+e++w7iOjcFz5+8lUhGjFUToRnAvs/g3lXalktAsEsAIbMrApTIeqs/9mZnGNzWd3OHHzgxvX75l1wO2DwDSzGAhiLKMhWuE+C4Z0OPClvyvVEioM7AUzwVPw+F7Q+DrVNb2KIi6ucoX70a2AqsVSFzwLaWqlQoHzJNIpgwycOrXQyJ9Eb9hfh83RpJI0zM8e5PHTNQ5Bx8TGctAljAUxTakXWVc6cWbQ23nQfNcxKP9OoF6sl1k1nf7Q2p7satU1/qucgAxJKnYUczrs8n5bg/itnLKNZT7VRJwHh+FZ/ZGg0vo2Yw9qnmj1LuEth/C/rCjIKNGy5HPu5ruA22iGwspI63Q5huSudvtToTYRoKhqaLv2mBinYQ9koiJULI/j44489+9lfP0P3E+CT+05E0ZlMOT7g0foNF58dFKtL3tMKsqM+MmUu5Iz+p0E5a4FopfLVjdIQqB1v8sypj3mCm+Snm2agO3rfKFreYBA2syVc9zs48skn1cOEj4h+5fl/0W4+8jx6w8e+YpgHB+ZcvfqlixcvDoYvN9HTVdGxhm3vNHjZWYbQ3LkvfvTk1m/aqLbPcaDiEr4TdcTdZo/mksmMHVhyiAGbjo9i44fqYHNRVCYyMO1+WMBNAe92Y0GsbWZ3TrSKi0dIZ3ArQ1UlzCo6wqrOh4eHu93u8PBidM8blfgNuqq6Z5tX5Ng0F+I2/dE1epiG5MEtnffot33VgqwB8wiL5kl0Jt/UoILvIIzArrQPQrJIbwIDUSMSMutNvNhW9xIwlQazfho/ZtpSfEQiVkrIyTHWoJBciQoVZcGxks5ViEiXCykwDTobzsEaLoQ4gqAkrNrA7FDVLiyQGaXa+tQcAOydkMPjbe7S/OqWpaw/AMFT5JkQNtU9DGgV5bvhxnWuHpSyvVljPFP0Jycf0zWHyNEVWvyReU3f6rkIZpz1btPoyJmD9zDTybXvTGYi3exrC8QsVDKMfetNTYx5tbqNluzzFXJeINdgcqbJSamLyaDn8C5L/zm6H/Dlg0fPbRFR2/gv2nV8Z82aScXqIYNZVc7QIWLpBhzBF/gj5Z0/giwoqOpNkBaraX9kgEJfbVxPbnsBb1m/iq4iJEZEdPLq19Lv/R4RyX33vfcb30dEL/34Sz3zipqKNCVzlMBT8dXUps7r9dcsB79GROvJizkyoepOF1QAJVF0YcgwSqFsTwOKP3VBotsnqbMFIS+5nWCQeLtsLGAVv3HEZfLTgF3q6VgKfTZY8xwjiLSdigaa5UcXyvEBiiVGljZHmZj5+vXrZ8+1r7NY0/1GgiCN18wp5KbJVgCjZ4n9tazEC1N/kZBEaF1JR7BwMbPVw6p+gaaZ8nJEtIFaYDNoZWdnVM35hhHO1Wqq38Ojs0POdiPRXKbLwNZ+UBJqB6yWPm4zGao9FzYKOpAfQaQqi9FNNTFPT5YFaSiWNmKUQuxrOVgzxGD3LIayDjkAL3yVqYMnmEca0sp0URRxPUJzwjFHN1ssPXfwDqFjIjp3/udOrr0lPpS5vJdouM48wbx2DQAMpr886nkphAZR6ia3FJcc17Z7sKy2HnaK1yAyNX4DP9lsjaqD9B97R6rZLKusmRSj9tw7/k1LfvJ1ryMqueRDNioyCGTSwQnf9nC0BwDGz2YPJGlt+uvkq14/EtZznxpsQXf0evGLiei93/DeL9AXiejXvvHXX/Px1zTLo19nA3p8EpzOHeBEc/vAWehS2z58/bVUDUJBWLjEPQQTdfHDItkz+UQiGhkohWBLM+MZnjUZ/mxhTwSbYIILDNnySukRoquNbH4/Zp7bXi5ryOFnr3abVHZ+ObrKEInUaE/wpS5idtA7AspEPxG8th/MZR2rU6MCoqFibLDPeaj3LELrKsvC0ofWxCzvlGeORzN444Zp5rC1CV0M8SYEVpQKV5PJCmM56g7OQpL1qGo+G5f/SnFq0DdYW2wm3ZbXKKk5RW9n2VQOVG0GSmAOneup4vAFGae4R0DAsRI1iKfdO58uwVJaifSwRMG9hSEzxYgF0zISnyJYLUYjuhzJcBB868lutyPYgzUSfMp+bT+SybhrBo7M325iw5AlFMVESSQkZiDIaVmDm5SiEmzQOhYUT9qicPaCInkG5sTA3EDYSGDVSzVM0ZqsX3jmB4noKZ+5r2JbyWrSqtq5GUF+zr37XanUGz721FSTKWDSxNAlTp3aS1sYl2j6Mdoxu+IQ7wFte9HJzeXHqWNFD6Z0HRxCFFwV4qqe0MQ4dwce9jTmIM8hdgXeKFRV47kEnbuJETthEgkJZZ10JcVy95/uVxkXuGeXCa3RWsCglFjhCYGnvgiQul7VbI/Ec9Rh9oHsHn/GxFQmGbGxEraWNqMVgxlkGxmDMqwjK5CYUJ/3z0pFF0yK4fojERHhVYgdWgGoCgQPm92do2CssPeD2E97D/Z4I5MBvtR5ay1UULfcvkXYJQA3CI9t46MBf1SEcn9dLlSx3S18yBy0vf88BQNb6YHaUxbcQxj6+xkTTgPayLBOIAwdW3ZC4D4tqed0m8ueWY27zSQQZklliE2pUq83md7BxDTPybXXnj3/86M4VdHHsnZjxYaB88wTq+S0zotjus7xecjs+lJSFZuyzxRkjBh6/MvP+YV284ZP/GCoQzLBImul740unQEzP/K1b2+tP2XAFDGO5eYhhmPRGkSj5pWIciPQgGIWaItYZA/3rDF97sFZcOqxoXJAHShMIxFD9pudI2H+l//Ry/7NN/xarHrLiEOe0nmooa/qiBEXu69NMfzSvXTS3w8H+m3qal8WZqDNKCxuYP6mPRK761VL0UFSQBa2bdlfrwMkgSfbLSahl/QT/QJNxCZd4ICgIZj5bJYkauK3x/13f51ITXqU4rW5aWtis60obN16B3cQb8ApiB1iFcFg13r7SUQauBJu92fOLI60NMKl+I7GOnOnnORs0zZVbKinqL8shCe1JmiVLiGLlg2P4eBX9Xno9tA3axpGlaARNaxYw2muZNm386Jh1enyEq2DQwe0/DN0mH7O7zfm3DdxsS8aCtlJ90XHo+BF2+GTjCg0vOBgJeM7wqzGH4fo0cC1Q7Auns4A7bmevP5D0UhNWSl5o4YN98j/trSa4GaJuva43gBianjpSGdzIkuha2hcIxnlrIOIPv2cj9/9iW+EUiXNxeUdiCHxa1/70Pk/+UbPFq1iknZvlIkEVYyfvP+7zr3rt4jk5P5XOsCL0fiBgKIL2MqpdEopAWg1M5QbdQHmaxI4EwroWlq430Mm9Ot1f/SaJkh+cvKGB0D95WSajOwQe0uTolOYTUrWr3+7yWpWwUAbXlcCh4hqteONtmNB9ngmcLIzFKCVEI2hF/dHRES0Eq1ReLQvU78bTAqC9SpzzzRbBBguMwwyJoJAGb6sUWDCAtOwPWqfYJIQ8bmDcycnJwcHBxWdY1Pm9MOjAV0lssur4QEzqtSBlOgrR/rt53azrqqOYLRjSxzqNgnRkYxuYoOqWpZwKGO0L3ezvco/vthcNBUa7QJz1gYSAnop9o68C6pCJKc4VjiarRYlrHfBs4DRL+V7bhqHxv4jX4xjU3R5PtwY9BrzpKo0sx0kXXhBvYmGdmFTD8veG431qztki36XM6GrV68eHh6dajY/HRM4rGVaEu0ID8QADBpoLCrz/JirVLPm+VLf1uZC3OIP07VIXzAoRHkfFeTkbIKr2fbdn/iGnhTpahCtW1RZXQyovkwGzn/mudZEhCmCxrSYVDCRvychRHJy//1WlvWBO5JqIQzFNUKrmwkRqQRZJYMP3qPyhYoVIjkY1kU/MZDkx8et0Brwi8waPzYLHud1NbXR9iKwCo4H1/QN1JZeecQrCeIYWAHUUqq0IgTCL5+6hnrAtTHNwDFiggyD5Fef+ast//f96esjYfkvuORwE+scjV7iUom60rgUqpF5cQoBjvsuBtzgfHEzsqEazHoqjLMgPPdsU3pC6+O+TwnbDFLlRv4GymyVWHP+U4Tb9nbx3e6ydAguC/vZDWPtM0QMdPdsMqZOC2wYDReMt198NhG96eqnCYJTsrX8Kpqh/y42uSdwlx5hfGqQhqLVZs6qiFF/Y+7mrG0gTEVqKVcAjU0guGDxo7NLy6OzDla9w5hZFf3Sn6vbCpFgPSLNbd/V+DhO30Gdsrd1P6q0Dc6jw2JQ1TCTZiI6Pt61U0Y3DA3UOzFDq0RRlMHCpqfWGVWqScRrsA7YDOCeWpW6cZHeEORXSAGzt2RUMP+yu3p8dHgEOzedVHNHFG68AyaNt9KtlondN7urhkpSPQU4JqJn/smbvGzsfheYGFWJ6GfpvFVAB7IhYymCsGghI415IGajKRjAmbeIChUBIl4wfNU1EeBTQLTW5MzCVSG4oa0gf+hyIvGtg2ooKiogr1Ii9jTSK6ksxWLFo9iV5iTaV5CHV9AD1UiKf/y0j+nq4ziAm6ihAfebjI1/e1kOS4SlMBSWc6wndWEgspedOimrdpg2QIulaEl8YgCi48h1aNHsPMxYJY1h1RAUjwnwbzSABcwCD4IWOtiwnohBLAmGlA1aicRxJsK3sjYA4s1cpaEo8qQLO/7/XJ9Nx0xED9Cz/q9nPp0y9gpa52YRX7JzsJr+2vylcPDIy+QDOmVz4HWqvjnFQyV2j2/DlR7fdQ8+JWZP431Fg0XpB/1lmuKnsQlWbfGOxezQRDdJQ1WCREZ0pUg/uf7QR7Zhyu1ahT63Hs0uP/bYY3feeSemi1C9GWTrso5WziE2aliKIz0V1Cg9GU2tjM3QSag+tXJ0t+lro2jJuO7RiK8CCVOM9Yo/+h6zueapoL+dLavGrnqEPUb7KtjBGoCxPOlVhsKXNE9z7gufPLnt64FRWAmpNxLzTIrXZ3uBOflw0Ogg2FBklF53w1V+olqPnOybn8d1gzDU7OiGIoeBWD8INwICj5Hoz9BHcPNBMbFZp62yYzgcyYBEGsrRp8jPdMwP6iDKJ+GNhpomNhY6+xH6wwSJKqfoDUGAzUjdamIe+xgVh4c6g7UPsp0ML4jDQDOKMxYoiKm2fIYiRqqKUOqXEPHJycm5c+eG3tGQE5vyqiSftB5pcAJrBfSfTEubFemrGzhlbeO3isSv5RSkRggJb7kFshMrZsOtfxmDTBvyw+lfJWkp0yGD35fnYAVa1TfxjJDwkhTOg6YqUNfk/hU/RDO9skzsi6UxM0GkAQxKlnt/XZEIcNUMklXIUsKiSX8J1+J2WpdQXFuJHIik0/CzkkbNsCgDS+PreYfpb7hQUTO62h6ciKlib7CzmbaYBe9qmdkMGGjixoHteYoGJiAYmoHhN+eqx15YTyXgJANECn+J+Fde/Lz28PW/+xHLE/owoBC4S44E04o+NGk89/Dbiejc5x48ufMNRCM4SCEB06aRmDjtbih0z+yrNJQm2K2t/MZr7GNVqcGhGgjWtU1qNglZ+69hk5VP0phs5wMhQIjx47LBibmJhrFScUVpJtI0NFRaVyEfR0RaaMd58ogofUDMMZAJXkJjRMTfzM//DD/sihoASqhEqyI1myPkxWwz4JWHKT5NvQvwVCT6hURAD04ODfJwk4lh7gtkDgKYWfon7LoMzYunn9sdnBFHRAjKx6dCtCisZDWPLUNAY6qh7dYmGPadnNaQLxFGHjZva2RPrER4Y1opBU8+vC081NMlHLOVulbcaWZDZ+XRWX7BEmFsolzUK6tI4YdAB0RcNMOIxsSlaqRjIGZonjC2pG05aa7znZ97oMFG07zMt75KYcb6A4dfuMXBK7dyqMDgt9BOoQSnvvCQUl+AzzhLKlS12+3gQ4TMWSJvCm4gYgzSv8/dtlaKOEqovBm3jCljv7Lt5vjXgcDAySJYCHuXYxBhf5xk4HbtCNL76kRED73km+/5vY+koqMv2YwcqDWYTmCEP/8J5ScZ2AvcCP7SHo2opYA+p9gMkEawEbCAISkqnzUKrc+g1XZt5RX0kZqGD1UqxnKdhSgI80Kn3kRfYSgM49UYi4B7MwnZ6PVYKWoN1TMZYG8VmAy2zq7v+8z3KT2mvwVWGNmOM1sAK1hDLgs1WBMJOA5F0DiLcMcTItW+OmhjTDL6lzKr1maZ3f5ro4SNzrGT+dONI+Ka5Ai0SCA2DeUQYB3v0bCAaDcOPXUg2s2iBnYhonWlM2d85zvsxKIGjSLCC7wNWCz1B7ckdrSVUBqOchCwmcH8r/hTQx/JnYWXTRfALw3RicGjcXEQq8BJagxWZemftM1J8eKEWIC4lC0lhpvE7ptbCAi10VjbbBJQ9BQsi6dnE0BEtAbbCqXck/Gs3QlJaFJP0X+wGjG1c2O32xHRxYsXkzyRL6WvEq+6AaRa6xI5jaPdvjIDW1+Ydd4U+JfAiosNW5crZsN0nIce8fCXqgyJ5uQ/krbH/4R0t0KqWN8fFiFZSdY2IMT2ZJO3Qo/e/f5Hn/U7A23a1tO+AdqplWKwO66nMASNvzYSQvqJ0puaWA90ppuhe5vzQPyZpOSU11iQmXlZKqPfYxONMO27qnkfLf+PeRn+I+XnAu2OIjElFm7QWpby3N98TFXEdcOkdxIZ3ofY4kz4n4ltVXYEgqNq9Ovw8PDq1R3W6Rq/8IRCojBwjgj17ygzswFqNbgMoMATS8HaovXMNOSSckMLLos5KfJNLz0aNLZz7ty5k5OTsfuha37DlGUD6zcbGJ72VRpZO3LwUfAb67L1p63jkG7jln4sFq2reRBOrsG0bO7VLMNwhFM4Vizjqqj3BZIJbUzNoCcPlqTX047VZ/3AswjE8FkxdRXNgp9bBj0TPFRVHmDNnCPAhF6w8t5xg1SYYDGUmdnuZD5KAjSjeKbQaFioav/anHXM5tJv3NY5LkE9jLQxLlnHqQ9tfv06dGAPK9JPadIo/rMsPmKs3rkpGWECQWSyUUHSSsVKSohg6JnDPqqKPSAnRfhK49vgTK2gDmXmQ9UEVekJbBVXE4bv+70/fO+Ln0/Ez/3dj0BrUNDHBt80k0yR3j9GnyGix571mef/8VvyMyIiOrnrjb0+WNouCSzJjpfa1Syfc5tZ0E3kwQkOo3YqGnzURqAQF2jmVQxQTM2jmQPytULU0kXX6+F7FWVzFy9evHr1qh7tO4M1FPlgrcSdo5A9lp1GNaL2SSSgvsIkxgviw3TqSt1yHNOkFFsKEvlQNDRze1Xx4WlQ7sTGPvRxKBVPSM652YW87Sm4RYdWRoMvO5RYpBqyQl+imDL5gQC+SCdCvKh/Fy9uwa3+rnvobvJK3eEwdfxOHhfDxehF+dBQqq27cWm2tfI07rY51lLwmxY41skOwDBXM67JOo8zpJnecoTxHCwiPbBEwVYhr0Ni8XMY+NMHLAorpjMoG2E7U545TLlOY2pjQ7GEvz81KIktP3X0NleWJmTzDgtRbWFRTXHWaO4lijJRsdMiu/wI17zf2GU0AJZ5t7t6eHioTsOJnY/j4AkE0/13XUFX9wJwn0J0kpLMDE2ypKgxUghPgK08KtiwHFbqxcw9BEqGp/hIiPhlv/cxVXIhlfuNsmA9s+b/Kf3RpLmxL7b66ZRUhmbboBtBkuwaqtsmGaGWAjDe5KVKEVGLnSG3ZwqbrQ1OR2eWoeepfDQmftlhXQ2lJO/efaFVP3ES6qqdndodXyHCgqrYETlVOTOFmziJAFqVKSEd1gwkbjrmcYwS5ZPEvSgwV8h5MxDGJW7uEjh7RT0IhfUPH1mfhPNEeDpMqY82lS7nejKCFlnENkvpm8wEaKhjpHYDpdMLSa0q7QQDTmKoodHRpl5t3XBdlmUktl4JLcxe7CgLgfHyZGsXQeaeq8CmlZD38SKh/8eZD6i5o/9aXrwMi4OjhWnZ978/ieh1ELs9xVnjrlgGO9MHb46iAmSu4TwnKwDLwzk/YJfQyKBj80657NbPgj1lGqVhMQHlVIsoh0e7T+6DY3eYGRYaFmZeAF0REVNflmCiq7vd0eEh+/7w0dLNOzx5pFWIpwlWfJomZlfhAMbaXD7noGZWLa6Ewopo5VSM5TmD+ZjUcyQ4P+I2W9yKBEQB9gr6ymHix9fQc/Z2tsKms8TRs065izjACdq69o7SaTKgAxjjNzBKTU18LY4HggkW79Jknb34kmCoDZ9l9nnsl+ONh0a9p8xpjZG83dHWkaMrCqMxdpxUBTBDvEbpJV0gCokxsxE4qu0oHqNGxyaEYlup3cLNz9uyJpI4pA4yDiJzgRKG+veaHzfgzEm/mPIq4c1eDV3BuMfKFaSynhHKNulQCWvLfExkW9fd1XVU1c/ldFQaP2ihW0yH5cKxR2sKe+89ED9fYEgbY7s7FVYnezO1kQksD/+BHfHcZwcrT4jaSo1S+KzTsgKQlS/pCEHwhvX9ApEVfI91IkqPGSUnwGV6e+bHOa7j1jRlhMkBSp5AJZTusctwflXOgz+NeyOlLgFs+w9NMhJCFc3PMYWC0QwNhZsKqoqW4OPjJ2yHO3I7tx+K2lu0uU6JPwPc2rziqqsUZNTU6FUiHyJKMuMmvmIpMpDVJ3RWiTk53/Pe0m/a9pXuxGRSQGzLffQymbCOF7eVQUPv+IjcDrqxYGKRG5AHCrgnNqmbDtOghsV5V1gtkNTNta5NnKKXA6mYFtYrwSpKvkvoCs2UjbvomASLp4sghQCr6btpy14JCXrfOhucs5DyFASYcIEl7Jlj909Pc7oKyxnxULpJpbhKFPVxo9PBDLNrlD0FFP6U4SkR9R1IUIpMBeweax0axZX3NIj6vu2SV+dhcdCR89if69evtxfARzEb4u4lqah9DoCFeqA39c+nIqnCYGH6wp+7wfYmqEmVfqrZFotIue3B+zBQe+VwlDTSap3MTlUQsMSN/DMaDh81pv5OC5GYIg0HjUrvfah1ttFKPyjGHYpm0a+wSFULkbmQxGJt3QFvMGcRPWRYFpvQyoKhjxTGtTnPmVZLrZJudwbi0z24SafHBc1+mZyKdNYiHg3N63V8fExER7ccoRqWYtH2rRNTW/sTkhG8G7i8evXq7bffnkjNlxARHXzsQ0Ry/XnfYin4OCYko1lVZ8glA3TDFcHepTzVfb84/WvZeMRVQ6F2D4u0wvh1ZgaqJKfNr8j+7L0Q6CsY4h6UyrDDjD64hzkFlcdFMqQqO6ttxFvlu4TJahNHRGIFQbYFHhpzpsigpMeuswfvJ+InT769Q6swmGoU8Zs2obtcjZTThhoaPWL+DINZnnECFukVTK9MaPb3sSo0/VoWWhuLDLNBUvibrfF4IZHn+N+0tBN5fWq1ugRf/sJF8JStLDugrnyAU+0LAi5pA7dE0+ToapgAFEbYWHfwwEeu3/tN1YR2IN0Fhn0VDOomor7OxSxiMjbK4Yy9rm44IdFOtHYTkQmHaWhHCHASt7dWjAOsG/zbb9EhEKNA3XQPowDJ6yrLsjDJKsRMy0LrSkTrsoTj77d03bIMeVSOksexn5yaAHzjGprtvwlFTVPLwP/1et/b6Y+J+I10N5GEc7DSDh6ltUVTcL123NCd9LODD8MNo43IKXMTRlbRkG9+hTmlTgVAmIKaOVGamG/yDLWrJ6A0aHiGKfHRusI2RsWmAAO7sxynIPbz4Ycfvnz58vHx8dHRLcfHx0R811133XPPPdG8EhHvdrsPfOADduzCY48/dnh4eN99991x6Y6BQmo6f3x8/IxnPGPiLD3l4B2/0H4e/Mmnr78WP1Rs0i2xhAw34ScIT5FhnBpGTo/Sq9qi9wxTAgqRoKlcsf7hLJYyO6AGslTJtRehlIgzVBGpeKi/cR44+ZhjbB0fJSBLxdNeX9lTgZyar3rhY4yDgmPehguZtnHKMelCv84evF/oMSJazv7S+uQbQ/+gC3mur6LbvplTteVEDgFjXE3zPmJYyJurxGGYUHENtCZFyuen60LCf+N+6p6QmKaxzPZLDs586uTGs61+FFFoFF2p+ZESTRY9r6CMjBmGhTAnykjihX3ewoUhQd5mx8VMRAfv+CUhOviTh6+/5g17nRQSpr5jCpUYNsOVblRpm+KtFBzQesx2VV7MamYd5/aHOcmmBzokRD6gTbGBF1nhpU8ikmVhZhKS1b9ivy6LCnyjsr2E5/I2ugYUrcLj4OiRhB1vtk2GU77yNIrIMONnYvEb6Vl6+t1ytiIX8jaLkAVm5h5S1lzSEAOEOsc3a8xMLxpGdM0PngOGGVqgIdyXqEf85FR58RCitH24CWMxVBAonK0Mak57tIisIEUC4Sv3UmqRieIS4cMPX37ggQde/OKXXLp0exPC4+PjD3zgA8fHu/vuuw9b3O127373u++55552LHtTkA984AOXL1++dOkSBLGCSTU0BgQoF0IfR0kQ+GeGruoiyDScIP72nf+63b/88o+kkga5jPgoJ3msvQtwr7YGpYVtBtNvOjRz3Yp9m8jYYA2SgYheJ+V2U5jnoMoZghGJ/tWqKmsOTYw/wxwp0FleI8/3XCMigfm0GcRcT7R3m1gDCiFJOtNOjIo6m2SjCQvbUxCkc29vj9frb1BDKBwPsgABAABJREFUkUcWdRnSmfLUBbtJEx7uQ1A5a8IITl3ZdDJWGg2y+Jzt1vXh3vB2JzeenR5VsFgCWX2ZG59ud7CwQhbEGgRMMq4F4EDd0WrXKj5vGb1PfpyCzmO2oS6jB6ZQw0QxFCxn2sa9EQqcO3dwcvLkuXOwPMXUhzJIulHNsc5s7XrAlxeMYFlfSONw0Itq7AR3lzNRC1kp2mLSFCKStvfMjZvSG98GoFIGNGqHj8LPIDzS+0d5u1NtG4c+2atm2IqeLyyCx9hHem3YeKwOms0zrSjW8fO3A9owuGH/gEtzX7fAUHfzVE1fZhZ5636gaqPaYLNOWXllFLUvPZgq0ReSwntuHUfA367j4+MHHnjg/vvvv3TpktV2dHR05513Xb58OTXW1hD9ozdMRHR4eLjb7QZb01vZ7Xa73e7w8Gig3DtlNClThjNptq6UbRmZZimfvPO3Z2TAlc6A3ud9od3N4/gojnimU59PVREfap9slEl/zgy3dNitjDUmx5wySFHigFnS8T+iKNVDR1LmfKHuSL/W6t3APCJJpPV+9MEmKvXxjPsuIZInT759O0PXNiXJ7It222zOYiYKGXjm4HeIiBcUD/Gai+4L9EslceFhZLevxMDFiCykdCg5rTF0ATOPKiaD7NGJvP7kyaedPPm0siMg8BKFP9nAPUwwSgrLEvpiOQWeOwHtZ1LMeaMqHmOjX69Hx8USQ0JEJ7HyoWBQzyb/ng3cI8HGplQrUbcdko8eZGB1arrLvG63anyMbRpD2sFBTBTn4W1JxhoVMw2rrOuKf2/cuKEPOz5r2aCeYOsio8YhS7vgjS8iRpX+RHI7vCoW/4zJadIyDHVxMds5WOuqnzmrdl+mcHFIY/zR7ldskPfE15GcuGmJSNKQ6sxJs5D13JqQLDGna1prFiKMWsFkQmJDhcPIS6hamn1dAOsUUAzNw6lCgYkjW88uX37k6Ojo6OiWRMOlS7dTP4H9yAbqjjvu2O12Dz700O23395G+MqVxy5fvvziF7/Ye5+YQeRnuBcnGDkHrr/uLdox8cL1Vaq3PzLR0v52W/ScR17+2a/715PaQB5OK2mVDrnmuGlriXlhi6mva+j//CkXQuFiLEGzKjM7wixO6aihjUugj565VOFY+fiUwdTOmDg+bfRoYtPWuvSWX8G1EoZRHHrBlRSZ7d+6bpy8MSaMo9Wr8i/H9+mie0XrZM0/pXkSHyJlV2to3U/0WHtdpKCmDIPhKRIzOvVRKM4hAodNxOrbdeYl+jOp55ZrxGjOkCG72Ke+/zeYhEiuv+r7rS2tH82I1TziElL1GTtSj8sYjATil5PXfX9XSaIZY1ORlM1qtvmJBRH7z4VFBE4pKmrtfER3vHr81ZanB6RC0cElK5FdKsxDFlKdFzvlKpTNJ0poHvetsPggIh1Hruu62Nu4tUuPEuJkY+VgowfHnQ5GYA0n9cz5EUrXUKpVmLZnMJGkc7CGAtghzkC4HQpVXGYkTWg4x59hWbC7cH8oegYrSGEBAhIgU+o5FsHtVrXcL46NeP7t1sK4x06FDCPGImL7vJQoj8CLlx/Mc0/fGNOE+cqfP3bpjjuGHZ1dDDXy1N3D7uruzrvuunz58pUrV9rwX7ny2D333HP77ZdwSfnhhx9+4MEHrLbd1avv/M132tNXvvKV+mWP3N/RTWWmsUPhufOGMvlNBfmOR35UjU7tFLGs0UzEBdrecmrFM5z2xpzpCNlaDHodOjez3wPxUnFmlPzuSAZ0NZsYFx06xaPS9XJBD6cMMeOpGiXvUTD5HExVrgpw5OlRSrhqm21Qqm+BF+4zXl7shxWXJ9+40h8t9A1+YlEXFY7aHPg2GGvMN5MBoqA+GW9ZnRExjDhg+wy/mDOvuVtD3Xqd4hqhlVDgQKhzowa8Dv7gfSZqCVTVjRbqhsVH1Ut23smewpqATmJbhngGZcHZxVBhKySxF8zMQmsrOrxTh5n55MmTcwfnqLgGONnBEqkxc+IZ74fJIQ4ceIICSLS+WNZ4OpAegkVCHlNQo1m/9TKMV/wYqMhKQahChkE7RLsP50pym+ipHxHRbWGtg6UvKxACMfsybT9xWSZSNFzsrxaWL8skGiYyWqGfRQ0uNOURM2iXcDgTGjxFDxymhjqFFg1iSbf+FtDCLuWBrzUwGEamtqHyRiErA1rlWGFHV+06GtbvmBf4eiAip8tE9NrXvs4q2e1273jHO+6+6+7DwyOT9aNbbrn33v5R4StXrux2u9tvv2TC19YZTY3M+EaCoS9B1gxdzDWE6Ctu+X0i+vwT39qTwjLTtlBmf6NK0v6v076WFBFY/BtuVNl0I0DD7tAdIbm6252/cH63OyYSoVVNlHkmNSltd053buvco5ymj/2nxd7BXRUOFcqi49nSjgmr1wyn1S5vEazZr169WjWEagV6Fa0l5kkV8LKnL9rQjDPJZPR9tMGxtXlLzA7FvpboKoNGEMkqK4H0VlPEUWL7de3atRjKnfbJ5lcWTWj9Ch9l46Ke9o2ryFj3owO1IwgQQDatlQEp6mSvglYUjd6CGSY3fjHz+dZ9EprIFVLeyJ/nuenLlrFSsj4V/zcoiGwMumMPVWp7pId2hqpS/shbbrdPPvkk7PGwMY1kX3lba4MuvdnYxWTvVBr0KPrRphRqELdtSzIcFHw7ERHLKnKmw6m2n116G2HmNUpaQHjwL8NP9qB4IVrqVou6KzNdanHvxIDtmUjO4mjur/9mhHVYspGK+0QgUo6TQH/Tjbi4EAIvRzFp07q2O6LAipoWAmtFPJC2QtgWzFOiMHUfJjTZxyFkxrBuHj8MAdqDo6Mji6wQaPMDDzx411132xcPWh2XL1++774Xaz1MPcTFx8e7w6MjY8jtt99+++2X2v3x8e7w8Ojrv/7riYK2+zq52YKpPFQGKIDF8PSA3kHrMRF9xeE7rvNbJPunEWCVPAdRYUyxuOYMYBWJGGlg7nsuXeDa7oB1vXh4kUSIVl3cp4ix+s8uMyJC62T2XzKHD770ESK6fuEFY69PNxHiuFrUZKnedrbp0ddsyqZBjFqrDi8ejsmuvEWhQbjKimEaFuucOJVcMOA6BVjddnnABmC1EocWyg2LfqBtY+/p3EYTkZB9QWEsPjoBSGlrKyEPoERQWyGwYKzJMiGMH3nuHcT0zAc+6yQCwKp8Xqohmy/KS9s1WJkALDr5lpfy7793d+PG0be94rBYJY+5Qz25rTHKUvYk20BXPQl1Rji7qZ41JIXviABCLfBrhu9x0Bci0c8RzloX+ty/A0rU1+hggcSBh9KTfWKMNBGQ32oUhYdN9qjbToL8C+UjWrCz2eylezj7QYAAkCJ/izHwUlcmikY7Jfok5ahITcbK0chZqq4UgRpjM5YyCl+k1HxrgJD9J4fRMViDnUKEoeuJS2mwfPMEpjtMGp4w7hcZgnBReRZaRBfJpuG66U/Uc662ABtZlhMVJpkJuuOOOz72sY9duuOOo6OjluGJJ44ffvjybrfTKJQdyCtEvNtdZVqIOv2PXH7k6PDo9kuX8rKMXrvd7tKlS2OPMKatCJWjpGBfRgOTEjfMWe7ygGtrxSgvQ0kUNpfg39B+Gi9MZqJ8SKnXgyI9JWXxmU7ZhVD44C9+qeU5OLly/dZXRVeBxsLGZaxTiJZU7WiULTF0OZGu5nfat+0rDykpDbNTWZl4z2mcIlJKS6QnePoJWaoufuxTHEjWt6pgnHM1Ak0Mk8vTXntA5FZ6cmwzzuG6+XzQ+5Nfvfc2kqsk9NF7bnv9g184JWG9nWTfg+vFbOlmdq/THCJ60cv46lXKG4liX9ha3ES0oTtU2meYANu7chKLhHOA2y5ksJbJKHClp02jl1I3MY9ucQ42GUgN27YoSGJwwXbpOVzeC1HFJCbpZ507rlJcYq0jfEmaCDW23pFjLIVBTNJW31eiM6VVXNf1zJlxTpgkZ/JXCI6MwLFAuzEfETfvlVOItGDIw0DeeA7W9AKQlN0/isUMihWuGj6rNCuFvTUrGFjAo0seglgypm9cDHgLDSoCe1tDLNDnvFqy4dQIFLcDsQCpTAqDIt19993Hu92v/MqvXLp06ejo6Ph4t9vtLl264/77729Zd7vjD3zgg3feedddd915330vfs+73/Pggw9eunSJRI6Pd7uru+98xXcKHI2RtHS32x0cHKSmDRMzc4OasdSALMAM6cnE0QnBdZ1ee0A/T5TmKwhP64ITZs2f9L4EKk9Vsj/tu9zXhma69eq4Q8Y63OHaFE0qQLHRNani7skvloYjUZ5NPM7DhoWh8mrw4mZxg9kpVeGB5e2pAWg4B3UPaJvTv4WlrMh8xWH0+nDDNuBQcRzoGZ3ksa4NGW3tlKhxG9MkUrcbKOtBR6AEbIXN9hPgUUCejc6GuCZH3utRT59nDhnA1WSyZgaKYRnkNPa8gLZs9eDnQDiSNI6+d0pNcRTmiCA98DEMSyLp3LlzJycn586dA68XO/W076HP/Tsipqd976y/Ov/R6ChhXJ/S8q4GLATAhgGuBqT62z692qaA4m69TZcGmNL4Vk8YuJjJBGOo4pfRmIdgK+5BPekpQswSluVrjGCNJjB3SeI7n1v3yrsRZs1WlxLLFAcUNECL+h5piC7MThP1ftL06A5kAppPzMWke+e2Y1pEI3z0DwRxO8eQiVcjxnTSDJM+WHptz3/+8++++24iOj7eicgdd3xVk83G46OjWy9duqMd4nDHHXf80A/90PFud3x83EChLQWCNAc1Pj4+vnjxIvIJOrI2MizeCyyMGIOJwnRwHO7AzevcXkisZWnGyeLaEnjH3LQfKnhFqkbNr7aBKgpbHkJGgOs1sB7PFpw5dSKSn3vZC9vd9z9IGkK19qI4FhuTO8eGeXynbL50lX5uudt918Aoozqq5+mCDVOjcfMBo2a13Xii6UCDbr5C13GydndqM3BONgSLbEtyjUQ3YU3iW3d0KcapV1zepCyzEOXdamtCj8T7hK7KLo8O0m+wYIdWjX/QeByFOeFzHiakjs4XhqnUUEARtD9wOUwJvCHIYnlyaaKVuhGeranNmEnJNYkIP+17oWmEmAsR9/gVC5wQwULddumxYc0kuDHhgqYc46BWuw5nA19qkUrwaNwYzz1BLIECo8kQvkKwJfkFgkhufSHMqurpNATtOjsD7GPYad8VEB+iq/89F0SSaHy1tWUZgBQTkX//IAGgZbb7KnUWxQKeonvo7jJ9kHKr5iZTAq6NiaR4b4uNhnhjP/iWW24VkaOjW7pB7Di2e5p7732eAQJiOjo6PDw8bKM6YsooJbzbXZ0dgmUop1m6BrOAJa2SNS099G//9Kyj44kM3bw2rQ8NIiexWsZEdXUpTtZaIZBnm4AREX3q+I1E610XfnH7hSwwumoEvKdG3SqbjvPnXvbNxpxC8nWuWLVcZjylhyYg1YDa6ceoMiZhEploziZJq7g5xJS09ZTXpEgHKKRWoBHMxGsUFQnbKPV14PB2c6ARbtJ6mRTEALNx7IZxbD/x80eMXagosaoIbJrZGjJiXv/AF6EG8yszQcroqukRThHnV4EMQvSrxatwkxlrT7P9pyxUp/ZCEDIRS6mdTmuFjcgkFbaSyLGINxSn0wF7nfvw24kWYqKDw+vPfWVFaSBpEImR4HHURojWhZw6MLF3gxSo6FfFmBcy7WARH6zyQiAR9CIRIG3PSQhk1Tmh1wn1msFPP2ds2XvNpB2qlUk6EVkEy0nYY6RQ6cn2Douf2LR9jbR2wDHK8Sa2M/TTPiRlXNBwKM4qrNFaAJL3LVuJJBlUmJA6p7ydN9bydKgh1E/Vj8Ro8yC7aGMrW8yjDttfCAQmB9CocSO12+0Ojw4dqSgGQy4hXiReSdCWS9l3Z1eWwKDhGIbZKwDk4tqGZFxmsquZe2NReD0TQLxAdCmgsfb8Zz/45l78uW++68JbN+NzjSzsgAx/rfMJfo3uefzQPENmpiCniXg3Ul64iGmVlZ/mmmEUn822CWsFOyK0Cpq6EZSacPsmZoPblzvXrqHi5xul1fwe0+X2mnmfa8Voa9nfAiQxcz4mNCpL5cM2MBwlRtWKmeaNsa1KqCgKGBI2I4Yg82nBVmM+BiRGNNBulEh084iukostZTtBQ0OZ2JyjXZ9Q1l4/YSwrnnUWqsVums9icZMYehSHMrmw/lOXCLFyTjE2kTW/yOmuM+At7B3YWA9MIQ+ouizQBQHCm7Iz46Weot+lI9rxp5AOihLTCrqL9EojmIvyM4h0IVABI/WDRmuIo9vGIZpVd7RErw1y1SYvn30V+pe2q/d22e7H3rpSAboi/4pnsO9bhng+X4lluZ8Yu07qjBaWSKe4ywLZ7HMEHtSpQR4NHE6vCgaI2TKrVw35uxPjxbCIpphUtY8bagzBbFaOfWsH14G93LsT6SWBj5ZjSN8kFDhpnBuGOxkpgvtghrQ7am6HzxvDAKES1ugKKJQBBqWfw1WaQu6noMGsDq/eizc98HXvo4eJ6KV01yAauuW8U83KhLAHNvkznCXPvXXZERTREurlxA3fgwqLj0PvYoK7qoKGZA1p/h6J5u8kN7M7RjiCgQWC9JN19ifgyDbhU4ntr+OsE6eeO7tBbMtyCnTlfTKrYaTDOkDexz3BWExhCJL9UcXK0anUl1E7is7Ogx+294ON+MHsY53uOOZRK7e0QHx2sVGqTVztzVIxJvfgJpQ1cIbTxUpxUi/sp1iyzpGToUhsL01irHTYAA2dghDEhGvaaYZFQm9uQFczXyaQuc0YeaVlGRgofrBOqTvjtW2TFYcFvGV9Lju73ZD3Mdio4vOFLYJlJ8AwE9G62pnRVQuS7gu50XQnAUNcHN/Rmweu5loXcsY4E/YQbGf0vm5fClgZXlibaYUzGAR3Y2U9nacaPXfqnK1IeCNJaj3iooDS/4Nj3PryOVh8tqAj64kj3rAQEe2Od0eHR0TuJzxY5f22MkxxBAHGjf1KZgs63Njnkw8MkhEwLRMQq9m0DkRmIEY9gewNpggMQcrPRHLXhbeCkJQgafQ6tWuZLDT2xJfSXWWn0CzaYA1zg+yKBiMbcmJUb6CTYOymSgH5M+iBXze7X0pHIrBqy+xWZ6loqXymFVEydEzxHERUUuk21GIY1rswl2IbkSKub5wMUo3NeYu+j7vwoRsciDYNrHH7PUz/3JZue8fqGkUuSPsGAgO0JENxIuobfSbRVp7cj5QMD7jgJqaA8Rmn5aIGOVU1liXLr09dH7dDrScvfCN98v1ETM95KftIJaTlHRSp7bNmoy1p6SaRhqh/6J201wmF9IyqAImgCLaFshSlonltkr5G3ZXIbdq6rmfOnHHIUsMg1PF0IxSCLTL8vanLJHCcUVj9hUUlkrPigzQzvqGA5cFztSxSpdGmQEGKcEaDAQ1YpEotgttiTtnMvCXyPATKxLTU87ZkfydOTunwL+c4AWtwRVPT48pGRGxfsrTtHQvRDcLJpb1jG4ZCkVOYnfcYmtamAKuaWfbzGGVtMy/rfnke0m539eLFiw6RFY6ZrKNjl0LYZOqt9RXdxCIsHMNXVknB4YMP/1siuv7Nr0Y1IkoBCZQeJR68iwpYePFHMZaR1xNF5C0v/AVtRXToRwEoYUp0IYKptZXf9qAhtytJMOJVJWiUw3xrmLVHgkJm9MRjzWFIdZa/AK6qLFTGNOlnHzthmvIs1Yen0GkDLbKrTY0+rvtOcaiehyB8usqkN5gPsxssRJQihYgV+hbGGgck/+GVRIun+jF5RXeCW9qzCLO6wyPigZzRTZLyaiQcm0S45oo8gpLhZz86P9UDykiHh4fHx8ftnBq4EPfUFG7GJ0INOlc0Lpun2O+hI0Srm9hUcKHnvLTfEFE/HmJWYRO0LC36IuFBtA/YtO/crXqA3qE5dWlTdGvTuIU23sBnJTM+qhIH1KAbWOCkO05MRDlBJpWK1gfMICXDw1RwfEwWkpwMFvs6FNZhSyj1OVg9p8wHlUfvahSUYCVUu9Vk3QsHVTG+FXEVG2Uz74IUanPzZt1WgveFvPYUNDAuCcUUMHIpJ4d/bFZBeJC4Z21jg4ti3MFDrzvJZeRDaiuSttvtbr/9diJfa9APfzBnfjaflxxexyJDe6LCiFrX9SwMQKyqIJXo4MO/TteOiejgd9967SVvpvkFWiW85/1/0xMnuHOYMWpd7mUxHRb4OaOIwBnOqtq4Erqym/12X4uXalsYWaCHJwW3Gh3Rc8K1MbsMTdDbvrGfBPb9H48fE6zNnZvXuLKslICNBvLMsJThltSSL+yOsStoUdQolazW3zxKVFD2zbluywDwrttkKgZlEoSWuE7tqML7jR8PC/67ZE6856HFufUP3r+oFsNO1ayMR3qQzj2wakZS+3fhjzz9p9vvb/qzH62yynCPpt7qSut0TBtqK8XSdUVisFdWFKpBtkT+q7fIlYaQITrN9mahMLiYGFHDWwlVgU/QzQ0u6hHEeI9OadIA9U4tMIrihjT0eVFdMLExyRtD656evmdnN0XPfKlo9Nm1ZBeP5lYGxLBavyhsarHHsI1Z+7yAjV//DzGKN1oJ2UTmiJx/4wg15jZBERjg/BqnmeV1NRTFDb44rZo00ANZYgovvPDim2Rbj5fFjp5jBWH1pbUe7451aySRR9fMFgQCiZhpYVqIF+JFAmFDA0FstE6y7dviT5ylqfsV2X7VqqUg2peezejEFIpaCv+JKKGy5sUnmdw0+CQjPR26ZqNg/40115eFjaEjdm1ZEHjv2qsy0sSvcf/QqIn75In44OB9T33qHwTdVHFnZpXZdhHHy+r/0Dd+aIsX5GQ3SbM6tadC3DkM7wsEhqvmqqZMhVmY0SCUeXpZXhbonfWRjDZtuqikvS1f/WdNUDeCywJpldgw8cKxQz4ciZJOm0pEpVbZS5VjV3WqwqLsXXGrUAu/u2Sk1mo++I2fO/iNnz/4jZ8/DXv3XMXMVojoc8/4yIQwHm4C2UCwkZ1Q76j+MrB6oyMbmohPE4XZ8Q28qo4X5m4M0eyYORKBCP0qsoqsa4Pyei0jtcmCmfyt6+rVFjY26a8/HcJXVAlV7MJem4sEGqJyN+2vCxgxbY9ObhWILvUEXiIzUzIEsUUoL0LVMw+tIVBPiTCtX82ul9B03TrBUIPfsBl1UvAR0MZpzIF7odiVVBR1vt10zMPM3E8W3W5I+8lzI8tE/REvy7IMnelIy7pqT2xEvCr1cgvBW4StZbDdHP6jzsy+mChea1iy3IJcFD+Ky9S1lHSYoK1YyfVvfvVmxZG5IqvIXz7zo3/5zD+cgBJXVzV/oYL+V4TaAR/S/fR82jT+PL3ybveKAUmQMW1iNNMQe8dArmgo6KVgUe+mKHeDcHDwNuYrRI8dHLyXDPos7MroJTelJSd38jpcErIaXfyYAViUlePPNFjbF4rQRmY0PkXPUNJgaJR7U2YkH2lVqcaH7rDbzKrGAUb0QogLCwK8FZtSnvaqNngEehgmijV52l/yjlvvhUkO/t3Ppmx7ZThUs+fUZ5motst/jBuNTdBww1WFs5RQ6zw9Dbf9NIM2q4dzcz7/FDWozQZ1/VvjlgmR1TXTlaVBrY65Ko0LaFI7IPqB5ClIGgwvxcxbH4TYeDTUmSNH7kxBEVPJyTlY8GKa3vTOFzsXAgZ0UUPbIRZ/zweHCkiW8BLqr2mbXo1IJtKTMKP91grpNOaAw2tzuuGpJqaGRwPl6qzipi5baQYdDcOFVrNTVnjQVnFaNd+4gmnG+93uavtitIeo2bZ2UcG9frC7r9FOrunZnHrgChaP90wHf/DWdn/9hT/QUq+/5Ae0iuL9zXT9+de99/P0GSL+D8984Ll/8iPalw6U1SVnVuDeBYblHotBNvvCVlWnfFSHnCCFRaAqZZulCV15YnLA5mNmxoSHPQBDVq5Gx/kzJ7LVJrDIvklKnFZ9/x+96be+8beI6IUPfYu5ZWT42PCcX5B3optVZbNHG0PDKgYpA6RUVi7whIcb/WHGLO1GwBy4paHoiJpzJIDzgqZmKCEWxaX++prmkXqZD/syIgNnUQKj5aWPJorGKVt6GDa5M/MLHv3xTzz9V4j4Kx99QdP/tKrrpMPMB2+GhnwPXMX5XpeVNmLaeOxzi71Y24NVPhp/jKxwPcd3wCnETXy+qr/Z+ZOlGoleV1lYAMhjm3l/cDvKiXxpirqKoVHIjUj1M9PDSdYiAxIZ8VQLJS3LN0PTfQ8WrI/GReIMdyhBj1Fvw/AP0hZLxQM/1coPpmXoP/u2dHXMIW/2Lta5RMAm3vKuhcfY3c2jH0wfyEhkQuReKUnb3QkRYf+aOqnxxFeRz7T7CK2wC0g1p12EBC21f3e73eHh4fgSQKo2U856ZCbRmo8JOBVvxfczusCY8Bx86t+LFzzVNbG8Qj651KGRsYgpeQCU488eJtdSovQz3CfIVd1XXshgU20ARvfL8ad3JHqj2XBgZgiGVhqwfc183vXrL7NWJnX29Aht6bse+q4hq5lYCYmKfGekjRZg+JkUpNLQAiSNY8R77iOc4LCvyyLObcCaRBX11zM+bhUSbQcgM8ayLWhEvm4yGyN4xPBzit+hkDNPomTuvbKEh+nQwkR08uofPvj3v0pE17/j9TX5mmovu8zaQtTbbp7z6Pdp8RrlRMiVfUHLMjjsJu3tKLVxslRQbhXOMdboL4kGoc3zdh+bNFo9UUl1gjEnq5uT0ETvY6a+FekEOBaJfy2bc2xdZeFkx4Q8RiNQKg2B30vcO48Yq5pVBporNZ8Zin7V52Cl8ZuMZWH359Mgq8dHW6BY+rgyTKl91P3wJ6ZhcQmEI9ClNpetEoR9Zb/Mv3JYofXeJToDEJlE4LLlCguFPn9VxrS9EdA7Y4izxWx1UBUT/VJRw56qXgvI1u7q1VuObsHuVMWL7mg/Zna5Felo0PuNj+IkHnRYrj/7Ow4+9AvR+cWqowBH7WIRuXT5pZ+/82crqmjQahzfJM+MJmO32x0dHcYu97+SU/RmC6gk90/DfW15h+ATmw9AApQnozngMTORgXEt3lz+TQCtfl2//v3UgfvevKfxHzgjAANFxA63Zn2E3wvpOyI061UyxDEnD4nBK5QVRnrwV3f5InR4eLjb7Y5uObKestu97atwJxaagnA0thteGATVy64RaE5kCCncOJVwnDJbJCnhsI5B0fpBzzq0cpJnWIcGCSlaB9u+RPAQCmZGgX8YM5cXtDV6T9QL8KEFM7PdYOY8QwPOdf4IcTiYJORvm0812pKoFqsl6J4ShsgqE8osq8jSZwK9qnZyqdCyLNQ/1+s2mck/HwJLPonmQro2hZNzh6dXchBEZJQQCIj96Kw5C0SAjml5JcK9l/qwBYQvvRGdEkNnKIv8rGvK9CU5dYaniroKVQmuESJeQ/tYcpTyYZIIC3wmFlsB24S6YL7iE5ctPWSLx2qXTWGyO3FYUFBBem48PG2WivoswdFOY2s1nRLVnJlityIcqaKK4aMLJINZ7fvtGKS8/i0/SJc/SHd+67AQKToKJu4jImEi+obLP9w75wOSJpTeHJINImCDiD8jhKr+psBAJa4lT2rlANUrRP10DqwYlH66r34iM/ZrfJWscOdJ/fG+XdWxx1uWjYko+Ae3axvFu8ZNcaSdrCNsq9udeBeAGEovu8nDcJXaVyjjrKPcyXfxYjXWYEaSZlW0dUTl3IitBXdLYOQ1rbcVI9mm2gQi3UpJBKMz2tL93usUXs9zodBW4l3jqm3CRtgRwqumd9EpYGVBJKqhsMXZDcI4FekPBMdFYh876Dl3cO7JJ2+cO3cuwjLFPmG9pOC2u4B6Jao1HGrmQBgwIXZe1r4wKrKwn00oylVbifN2qwm/YMclPyLzVlHkebyfTEAS5NAAf87grjPfEJ2Ny3kjoamlaFEwyjVTHlVJ/NXgF4ezRlKBkD1QyF5D2VTqTr9nTC/6MoqyjEii7mKoaoxjjeWZXVftb3sCvrwvUEPP7IRDNxaKjaZKQnZsphipHWYMRoevXLly6dIlXpa+lA6yIdTBmBBGAVNTPFPFkVGTDNZFIK7VeeeLlGn1Od0o/eAYsB+0xrNVVZNx6CXS2UkKlPgVYtHRG5EWRIVc2uGucYF7xgksG0Rbrbz72hgrHV1amZj6y04tQ/vd7299eLG6CjEwOLtvKaRlnn44d5jSiHXDox36bBVZ8hwM67LSY4YkFZG2UEUCuKdDBjN6dBSWweSXRq8WoS356b8NgpULjWCXWA2AZ/vlu/qBcG94+Ac7EflNewJMFrRpJDhFr6GIT/yyf2Uipsmu0zAE2QvexNWhT5K3Utd82gPdTeMVPH1zE2tDAGPN+RqHvsAb3vFm63u8hzJWaMM7cxmFqIQ2htk1xjsTyDPtynGKkAFNGemNNO/GzMkLjo47wqM8CqdUycFg3ZwWjxCt/Sr37hQNoEks9nkp6IGyDCl9OIFR7BmxomSCXWO5P40pOU8ldJGkGQitf1rvhzxhxLfPwO0/YfFYrVUPdbLH6k3aevUiIvaqRqESkMKZmS2pfY3ZK+l0MMEWDX0ku+PjQ1zLYX2nfOnvJMLLPflyOJPJo0lKwerSaqg1SGa6vIyx2SyQmwY0xPhX4j3FdB8vJVWIVv2vP2Wl1S1YKyv2Tg0NEaxx5GR+Q6ZZ6bt1Kl0Z5LX7armnTOg1iJG9xzOVTzdcfknqnDBPHxXKrvDGGeb60D1//OF7P6314lOQh1z3KCQ24v2/YqFoeuVHkw6m3ktTqPE/wnSxYiOQQhuFN2yvUg88SVf+IlvsVa/vD+7+3dhidn6pY4C6ctMVtpjIntt85E2WkMjwm/OXFQ0zDTIv4E7ND8eJNHQzDjlPT9dEfpDngxkR4cqpJe+0QYQ9ED3AJTbA1JPVgXWHhVcjBH9r6a6GK0g3meBBuptlJouVBOsh9mfsQhWyKjqqVUSrhPBjLGtkt6FhE03LisgA9BuC8Bw1cdgQ4OIVAlpDGL+GVCFzlFpvcQIpNq/I1g0cGQiJd3Gt1x8aNwm6v8wHr6OUtu/KZAi9Qmm1sf72LzIqNNeGteEnBU8u0P2eqG33EK9WYJe2CB3vrh4cHMhASZrAZRr7AfFm8mpctcfrhhrEnZnWaScLaLYNGZjpw3i5N5V8xNWIAAxjNVCFJg+QmaxMRPaisqLX2GJJM/7nHdm+QdnelvPRPvZ6nMmxBdKzo1hieklPjbRmHg5M0lin16j/yTgYqRfMC8goEdPb7nnvI/TZR+izb7vn31vtE6lIlCRML1EU279I1CgnW4TOkdaUVzkjwCuAFwFImSfn5vH1JmbA1jg2QCrtX/aFUBW7ZuqZBR6nQHP9HT98bhdHPlC8oWFoShA7juk4uFISiRirpooT1LDBGWqYzLJAfNDDuuVMHDk5OQE1NAu2341Gbz6S50+6JhS7FFAjnQndJ3kr4/6zRmd9Rnfs4miaCMZo68ovKuYA1Mgcic/BUMJcZ4GTldqL/R57hNB9qp0pcrwkETMPtAU187mj01pKavwLWXCVIXQ1lyr6Elgpsd5uuqSjhva0Mu3MDLujrCEXo8GMjgf8S7Las/hwq3xcWMney85/SwETjV3pejnbPKPVIoq0jo+PL148TM5eMm7zzrbJLCBQMzrbyCC51XKAXEaHV29aqQ1eNX3f/uKv1ebzJwUhq5Zt6ZhB6YMYDHP/T+GqMb+8CbyYX3t5CFmDgdZRcQpDheMqZ5DJbrjl+jMfvP7Mh3qNp7rMa97EtS/As+EakUE6EFWGjirUq5yGPoE6QW2FceWUR85su+Tco0lnu8xXCji77NhG9P0ziJBuVJkz/0eJCgS84dNvuY1uu41ue+GnXzLpaWoFwQFXjgPlZ9v9MxGRyNHR0RNPPIHKi/+B+mNPNwSsbGhk18yt9DRmPnPw1uXcW8+c/0XP6AKT/iuIqVBa8BqWrQpEBQFjF1kBzp+GydCer7cwZekyrm65rtibokXwKSMB5tLBNQMfJIyvOaDTqfoWXbMOTTtq46cxYiLb5O55QKhasCpCmR6+CvA2WhBOn16W2de2em6tvzZDQxkxVSxHZWbiudxFMpod3M4LdQ7emkG2vDqOy/Psz5PBHe1vxlihI/M3eBsWaV3ToelPpH/dhW2WoIz23grBSiHzbre7ePHiBOcBwmPFbmHgmHmR9UZVduNK/TWzsSEPe3XZijRIsRIwVqQNsutVY1uyViJrNZuEHG1HnM9OiLqcjAjGb0xCtqouOlLe+P0w22PK66QurmJ7QbqAZhL+9Jm/2G7OP/NPb/+TV6U8FTIQvIHj2hMBpW5aurTRV7nt7J18LxmVv1b5Nz308l967m+PZI7ipU9xTAxUscnGA3f+THt4z+Uf1g5qATSH0J2SMG+zMlZzkKrsdVMmOMeL8VfvhXZ6VQccXmtnT3DnBNYmj7sFG17x6e+ZUXj6zsYMvq/ZMtuNwAFL3L8X2X7SWMqKUDGtpeq+vMYMyAEiHHdteTn4NfUYSTY3u8/E1KyHeTeJIpTutVy9jxlWA5xvYz3llQRYFQ23uwlkY9JX10Vo4cDqOBzh33TwSF9KFD1hBEtUp0/FKucXjn6ciNYQf8wZ849YBYpz7wmEGPxbhEyUvvrAoaRQtHSnwIfF0p53YLbttLfias890f3TjOB+2cGVvL1ncJVUqsOrlLx5xSZCo01O7Mw6M39IUay9dMxt0BCJWrsFOV64HQ2naG9wUa3a1dAWMx8fHx8eHqkAZScaEF5XMIEKqCnzQF4pkRvgaSozMR1YYT0Ots/hFKRwrKEld9+DwSV2VdleXNYPH6253bkpRwnjCfAnzzC9SffdBAxAnMecQ+lyxIsaeMH5x5Y3JaKqTmDxnpzaNr4CMmTZjPgSEb3poZfjeRO8+IbugfoZpMYtkk2e+OE7f+3uR15LIF0cKj79xZUu8KQSc2ldteMnR8Y95qYgeQnG5Y/rQWzpJXvB4pWjxkG8s2/D04+mIx5r8x4FjEUsZGeCs6a3hXv/YglFmxAnb/tHar5ZYpRF83fwiKuc9cXEKyhXPzohqnPNNAhTeaue36EqYCwx77kHbElbw2EnrM9S2sS+hebR7YRAciCYKToL0n3JSsa6ypkzvVr1IMLCxCSrCMlyZunrF40eIQkAej/eMlokvPeaDqrImeO9mLx5qu3DT/bWJkA4v89MT46sJAFkq8ML14Qy56wD2zk3Mid8jZdZvoaf4Bsn+hhkJwVCR2LKRwVVYMVSclMjtHl5PcvnbdDWaRiC8cWMNlLouQ90/09EdrurR0eHTLbGhCH90M6jL/iOXiriCd9VoJW07mtw2jfLw3/YEbUUmAcjrqw4mMJWhh5mjT2ivPZtzBcJq374iPoyX2Ddxn/Kx3qPP1Sb72Hopu9m8OTG2ELKHOekjt2m3eyAYebI3RDf/ievsjRHOadwTJGrqeOiikYz746Y0/VRcm08v+bNlbSBOko33GTouW0ZcWpx3LELMyufYFMS/lMxFOoh06/WnI24dX3kAKizyosxRCSzQlkEzCwlv+xs6lHyQ45vxpHKVBd1+mqpbnLAn93ziOtvEgPPJkHH6wusGaNrs2pDBSpd6/VXP3n99pNrd6wnP7BHDaHjpIDDQY8Yl3BAtzmfKybmg4PzJycn2k4QFpqsLUFPo77oTgfzTr0uJbB/QmeLNhcM5WX2X0M8QmslWtewWyMuDmq9p1Mm5ae6qPgIBtp0bbRgdaOLKlkj/myszi0XzvQGUWRfHGFi0vM/KUmcLBqcDIsp3tR4tGkZcypP0AmGGEu5vIYX2o01UNyLBfZxDn2ZMd1Yag6NAkn+tzW3WjCUOvo3PpIe6YYD0fFYb0IJwpkNEwT5PWAG/OrV9CCHSk3sYxc4If0kQeyd0fSv7nwZfZHp7u/80U+/C0i1ENcaSgHJJs3RVuTlVyOPwuCGBUpZA5ecE9KOkofaoiIM1JCtNYRkW1fZutz0CPQHnpb3GpWJuWGc+5OzT/nok3/5goFyhl8b9AmHGGekTUINrUboAn/tZ95cVQ5COLXM2KOCPB5sWft3CLAOZ2Dus5spSIPtnM7kagQofYfOtZLuvfzDH6ffJuK76eXOQeUz10HlU1483LslMQpdZgfoYH9/8dm/1lKfQre+8lMvT9WivW0Cp8Zqreqc0DqGak5x6XQrA8otVFU96jBqYTOqmB+jXFYCqrLE0q/l9rFFTNHEaIX0Wug7B4NwWqQlUgaWzAGN/lG/QbevZi/bPVmbl4FddeM3VAbIchiU3lfHVX4f6DIyoYZCkBrEQhesjp6Z7Jw+dNzYCupIIHVo1H+lHrXW8TSf2F9O/C66043GQkRnu64Vfsj5DCI7DnApOiiI4cEorAOaibSOD/YZsiFKmcpK1EwpaeBi39VUypU/hOPdaoA5rhDRunrTzk8XazegbonaThRwimANXdZgDucOX/nQK2RMGMz0lSuP3X777RTCp0FA+6m+PTJMj77gFU//8LslIKTR9KsdHC2RJvgxp2pZRNKggM7YXR8KYx30nCxxiY0GAvB930QtpdhEIBtshw65yUNE80WjoPm5dj23hojoxlPedoOInvLHZ/7yzY5pTuvSsu8vLxzlwSBuQbc9bc+tfWnvdKyzoQgqeYp+w7TKq40049tnrqH+XF0FsbztRS9ozPiB3/8oisJz+TsoaHq6kk+V4e+sYNmd0SGN/WJQ1QSSkucAvZY+6Y2s2B7Z2dNZX1CWVKe8xbJU6X0n1LjGWdUi+XMOTkk1Yd4ehQzg6qlaXYe51D3KAgWW072UM8LHm7jCC8NqT4KVEJy5225IHMc506Bg/VxWlTmUWywhKpYsspJue2qHF6J+r/3hbINdYfMlbI1K/Mh0+B51knYqZOohCgD6SjfS3JEaHDSawaDlc3SVLAgGA0G4kc2jtTUSR8WeSu3cVRQoDc9+DpGeKJfJpoxRqyH6hY+KUFZppAT0DNb7ksIzecjBhC/R1lTc4nwtp7QRVt+x9O+aK2eEiG0nLNugNwooSgztdseXLl0ysofZMy3MrXYmFpanf+TdQ5wd8M/WZdgKUsJIZSPSep1MtfIk1oz7ofTDiBNjWmpm78LYhz4/BnVRaFX2d49DqiS/DT3t5A8OPJ2DPg31VM15tbbINVDXDyFkriI2Uu5uzPJQ3WwMvZhBD5Uyv++uf9WE8ts/9aMIqVgXseZ1pvqxWqLQ8cwfqRJjfUJEH/7Wb3rhh/7QhkZJRvlACIWJ6W8idcu7w1sCuJ1oQ5JttpGYEExf5+dq8AL1a0pMnOTc1FUARPjZE3/j2Q+3m1d96s6bb6JfCNNhumsgMjgdNS+hgkx68RIVIi2JUVUACIMcDrw12R7M57Rfya/jecsMr+xkuWpztpOTk/MH51teUQNO7vG1IGt8SJxxBP3hYSgRvpCDkuTHzd80iE/g4CyWD3N/DWFROrrWqRJjK+ybLDQdQy2IrnhBpJWUFJCfx9FHGEOKjQBd5aiEUItgEREvJGsQzeZGZWN7Ndt7HE0IwtZC7q8PJoLIIvCzORNa/BjDKKwSZHD+akQRMyDx9gb+DGOVZjf5wqmDHICRNI8lXkdoulELM542CCrpslBfXV0sOqW4wbW6D0MMMY5RKEKZGa7d7urZs2ejsUiVCDP92CP/fl0ldhYAk9CQXh5cPogsTNkjwwOL7YrmD1CPE+8KP9ipjcuFGZ2Q3vuQr36aA5addzB2yuZqQG2/DumFT9Jl1RfsZlVVpUMl2hgvITl77cMnB9+cqxWh5qg4ZkerFDfng1WKP3tmnr0u8HH6YMiYgI/usKUSJs66FahqhtiGrqmZxOxB5TkzsBs0/+3jFbo5WcShIedpumCGvrLswHwLC7X8b3n49V4KBMwiH6cJgXx5AZKqF0pjjC/a09+ny39JVzdr2OAbWn6rXwxjEZHEwd1iaao6uJVg6iuz6s886lq82DtWcapRgOmumzWrH6bKajGAA8EmadMdffpyOHtfJfQXrcy4CmFtaAiAyODe1NgCYKJOC+Bg9RdCS1sFbqTmN0xxdJKqOr4pNhYM5nSMmPbwVfNHLP0dxr5fTfC0cyZOb0yHk5uYCN4iRCwiKCUVg5zVHRB3ViVY43SfQmNHaasFOXmjsRbLmARxuAzo+ApXnHBsfZiFPMTlDfcUHYyQpwEgcbiVwB/V01ORVYgXkXVdm/AZiFFVYe5BG1sjbAOXD+/vJMYpVb63TyVq/WukypxNeOvKDVnGWBtXaewQnPU+EVFUFen9KwIzXmRsy6eeVZ6xm6e73AiW6Ru1iRBzd6Wp9Nm//H7qX6eTkSfzimc01C7/4Im3i/C5a4+c3PoGiirtJBIR8cZbNoO9mwHZ+lDp59J9v02fUMDQbH69PruJDPYlBnQVSMKtsir28gO//4e/9a3PJ6IXfuijqUeos2V0p1WyafD2gq0IT11oqRsWvTG/O5deVFjpr2NH2qxHE+AY8u4heeO5xi5OrVyj+9zYihe6rOGrhOo2Ika1NcgwAwjRf7IzGtwND05E4JF/7bEZAYBNG6SylS+84fDu88e/4z4i+tYPPWhmRI2nDYYZGSHYtZK4YWqZtFiE2D3dBDC4GCMKS+rT0VWb4azrjTPLmfbNUGs3mYYoTvtNbkUbEsB6Zh7bo97ZBqgyZyxPqARvzlLX10JWYlYRO5MmwEBJuePXl6M6wbEFY0N9hAABlAMWvVHkdVcsO6FgVnwdi6N7gDiWWy6Y0wT8mxrS+mvfZkHsVop1v7NkATUOtBMEZF1FhEX6ezSwNZs1viVDa00o+5BFnuAA9cyPPfb4S17yEhtr7Xth0rwX1I1QxppT8Z7BaOwyjUJV19W/vq4F1wkKidfMcg1QEgciY4jj/k2h0WRv/8QK/frDb38xET/vfb+b/AFsBaBi0U7r/kV5Y7t5M/9SfBx4W07rmwCee/KTJ2e/PhKcVIPjDRG1bRCLQZQuLcHkdfO0eDRs6AXTyy//+EPy+99IL6J4hJ4oVA/ZC5hV3odE03pQEiNb6SD7ycz0yg/9IQHTekViNxtYxJDEbOmt9ENWNldrmxQHW2S9g055E6FfLfRNXZSlmp8UQ5NNPJyYVfdgA2aFBZd+fSvd+TA/FPNFRJV7MW19gJhuxidBp7IhbeNUYcgNLx78KSCeERBMfOVW4ob8ZFf+tm97QavhU9/y3B/+0EPRTyEVUYmkIY3xU48Kd4AEBfnhOJURc3i3w9ofqRVd1K8R6dEbIuuynIFB1Bs2ggMzZ/A9EgZwyh2csmVBdJW7kOaZkoJkzIpeHM+cjbVYXe41weIt+rDvl7ToQqvWzWFhGN2SdeIG8LQd5Rpn+a0hxGOV5IkOlY8HYqwW5yn3s8/1J/ibCMiM1NLRiv1nBg4gl819VeRbzKtHvtpYsNnJtgugLwvSDS3YRcmjyr7oImxM7uPqUajdbnd4eDH2ussZBn7iNXYUjBpMXKKZSDa4NGestnwPWgIiuKqqtERTMQPNF/2pxkNCtnhTVlhDK1TvNghve+mL2+9PvvQl3/++3yPKatHVNdWoP/7gz4iejhkp8RaMSNB8IpUkputnnw3YY9ad7ISGTvnUq4zFUuwbSs9z+UU6iG7vuH+pBxqCsuT8r63qQKydx0sKSvIFBppB5k9jqXjMNtC5ddkwQaSHJno3ixEWGYcUiX/n9cDiLBj10zE8V7UReeIf/OQ9QFJJ7fTJ4eHhbrc7OjqcdCTo6cC0GVriIQXTh4/6Dpe5qsoRRD84PC1F5dTDTapBJc6thZlIysP4ElhpgtwpEY8qWbQwmLaFifhnnnxtW5v/kbO/HttM5KmXsfO2AI8117wsZ4yqSmpluFFyKnZ6sXCuqeEtjtnA10ekuJh30Ogec3PtmhxPcucwvpU4WqxLg2JIBHbFgpA9gsLL9C0VkEKGlHAzXOBMoCz62gSqEqcjxiIqEFgpcGMcS0GSE5Y6ZbBp7fEqZRV0Exb32JZfzbWLCAuJSPuaYSu1MMkqBsj8JAtFCb1xWV0rWq0iK/s2+Q4jdrvdxcPD7EXdMLECMy9FQ050eBgFTMyJ9v2mDKtsDNDErMyQwVg2I4CSJBAA2aSzSEmGcgLEa1dNE2a98Bn0sMyAkdlB3wqKDerKoFoZqc8ejHtCnfhudAzVCZEIL8vIGej8yGRUWA82lJg78UVVcgxIF+MCS4ECWVBJ+5jOPLEpNAzQ+JeGe8S4dYYtoOMZRlGhyM9S6rZrbiM4mNlBDJBlQM8E1jix7iD6dMXiH6Et6IKYQJ7iAoe8J+P+Gke8tccUVKX2XrFaowojGaqSsIxQkopxgWS202vghWRGn1tJjkdn1N1rMAOxF04YifzAzd86eDWd9CZa4MfhhfQ6Wc9mIyah/v5QO4CjNWFGpm2EivMfcstjNI/DMbXrCT8xMw/fEcqau8Z3v1pnfB4S9ze3+7ONgnm0OKIu14ZgARXGUrSMNyV83DVz65IBSFkaeJgOKAU5Hp2ZOWnf8B5vMDAWqXSYNZobq0QoILxOlN5Y+IqHpq3ydnitRbBEiNd11e3spIePN+Fr/XdcZswRalhKFm4fHOycWWXVIENP7y2t7cXcrnV6ODiw14EUIirvoEA/TT2gm54S14wKb1pw39lvoLHTOdiaUdRndY6PxDx9snGFzN/MJVIHJCp69hEKJH/V0UpEL939cmvEWgPhxw9CW3RTdGRnRjbQTiEuhQYIzKjWMXTT1ZPhaXftKg6qkt22rmaOtbKaL33jY/TUoeXk0n1RoyIViuHvOAks6Yi2fPRtJX11ig5J1Zzz0gzezA2jM8gfVKlMIqndEDOjVEhGYTDt+qV7HiWiNz34dGsllGzTv00uDi8ZEBSI6WLcGGt0Imef9UVtLujA9MCJ/ViNixXYuijbxhiyvkjUkroK94BVHrNg3/87H2lJBwcHXi5To74DJzmsPVF9bL2fLGWweuN2+KWQrNTOUxRfwmZmWe1YonbWgoA64rELAEF6fllXWc4sxqmRCPjlHgfX9WIe84GsymL/GVsCi6ZgV+zI+aySZyv/R+rpAy3mXxf4Zg7OfqLGssrLZFocgkangmLDV8m60U/nPvsqVYyN4aOEsZiImeK3c7bC+0PsAV8DxMQqROH8NpjiTw2mKOjRJcK+Nd52XFnu9MaHSJ9GiAfzqHWtZV6BFDKgc+XKla/8yttbqmGfgCfcSdlkSySnKOLp8hO2dorypDzjIidA7SDWKHVuEboImcTVl0OlQYr8ZvBVkvL/wbPfR0TP+cgLhuKnukZf2JcFiYg4q4JCF8wfeynk0Cr3ZUaCKYLL5yw77MMYbEvoiAWeiNBKks59iX11iYQADXMrtuLpdRpspUweZ0JtZtePYO+ZJXKxowfttSZPvAWSEQUm4csSQoVEJhuwbVwFnCRlWXgNe4+YgVwJEcnBrxMRXXvNdimbqUIsUB0eDi4REX3p6Q9eePTe7Qrf9tw/azfvuucvvuuhp6bWlNSNABWrhUwYSyJjb07prPjgXxs9Mq/WoQbFu33NkbnkFJnaKscMkhs0KEng5uyuyHNycnLu3EGZreUtXJWQnkttJQTm3pwGxYI9QrQwf/eNf/vOw+8lou++8W9DWwEfieouUsQavsLP/7VGly7nRe/RdEp0GaNGJ0Uur6iersXBWzOrvEp/PacZZ53H0llzw7iQk6ASc2oqUTD7iGHRgcnKjhBRuYxYYRRMV5Oq7ejJgd3FJ9zTTqMwjFXFtIS2tLd0zP0XOPsBVFlH2fGUeDQIVaKtBlpUqQOs1abz+uaThEqUC0HuiaA1pVLT9TicVtNud3x4eOj4DgJE3oEAz4lIVn19UdMbWtXtyXHap1BfoAzangnT/JCF8HiIWgn+O1Ri3CjeCYUXJ613LGGltV+//Oyf6XcvoBd84tvKJsrEyqPkcWemtZ8om0DPGo3CBoKkiBscJyfUaHoBaxRILlEYPsahjJVjEAuWEjLAKqJf1nHNhlO1RYmOU4LBN7NvRYgBY20pdAsmdVE405WhXrTIo6zW9lpjwVwNXepGvG9+qtuKUzp1mO6c/4V2s5z/bbn28pwvkg+rARH6R7v7mae/lYjo6Q/dSl/9lEe/7ZQkEfjdROo0PgPhk21d7tn2sccIwLgpwcimeXhosYZWNwvvTj+G3kTiDwK1GLuaEnPw/vcT8fVv//aKAuhYeuNKg8rALsvZ32gBCwDaJGLzsWb/v/vGr49EMpPuZKe2ysFqHwDvYuWsFbIhFf2o6KiJI0OCbhZWqLXfJcnkCTOz/U5sRwtJTPFzCB0m4udC8QFhS2ryS3RlBPT/Qh+yYLUMIWAr2bSnSmY5A8X4Q4GIwZdYCrg0Gtmx2TF80tMXK+v/WSw0/qVV+rfMDFQhuhK8KPy4sa7SXyEUs3ktKKiVCPRRqL+TuAJVzj0RkZVEdPkRruPd7tbbbnMiVlnXtX9MtRcMxK3ruq6G//pP0TBC7GaAEUAPaZyC7Sc04feQAe1gArs6rh7vpZhhBL5I1WnkbduwWhPI/ARNsdrC65DP75jCFu/QhTGOg5YuSrURIDFniyqRZhf9acau9iioDgfve+vB+96aHuns0yrpNSORoC+sT3PlME+NjJoOQoGZIvcoEHZaL4mywaqDwRDHfhWE+SOXTckmvW4Ut2fexGXalKoFJYJUH22g0yWkByDhP9K/WWbe/PGvbhW98uNfgVI0SFR9QRahZmORS8kD3gxqiehKlCSMzo6e4qZgUSBRUHQZM+ynk8N+8fAE2kpN5/uD97+frjxGV64cvP3tp2uUySdI7hk73IUMETGjFoSZVbDoQdqFiVjNgsiNZC11ytQ8XfsvGbHxOuXWCyp51RoKyD7lMasc0u2/pY84ACf1gL7JnVG19KdCe24GAV/Dabms5QwbB9hkJTg6WgxO+vCUrOTJvqgRyIoSwSEoBdawFwmh0Y6Kx1fjwowH8BmeoW//RG5s7O5HdAU3BizUtHabuMBzr16Z2UQzxVRzW/3G+sGYTrJK3+QVMADLOnTSzqGAVRlUDyabpAb3MLCCgyzVyAMjWEl4eKi1uU4ZZLKGC/hIYFYtsDYEiV7m6z/8TXS4p8J4CYaRRASEORRfRZZgLHp/Kgsyesq0wbzAWGAEUXKQsVl+wCf5cX8H73tby3Tw3reevPwHwGk1o1NMwSvmdMjC+b0WJurnIMJBo2tBXGRCNBFTc0zuPTlmnpnpTnyaJAA5M9TCIW+qr2ikeTi36H2ofOz2X86B60P4yhpyBekuJA3QzGo95dEyIuKZ3/zxZ+TW2DOoLA1+LEQ9vf66y7DcPLj8nHVoJSQO/iiVw8G1bOOIc+GEuiUtyMhN+bZIartmxzyxHjeaszrT8J07d+769evnzp3bECG2g7j0J8GNFwwkRM6I7X6G/G6EcHwDsRRsF1PbTq6VRiVlIpI1Ly/IPCY6dtT75bNxeO9+opw8jPB4Ka3OhLMEg6enMY1RJYJd7daOww5mxwdR1ILHqpQ2K0A5wYIkcMgh4G/LZG5kGxoJngzOoIpWZmixJEMwaCxVIsEbr5Mtqh7dIYNVImuPgmqwam2LgiLrqsG4BoNoZVr6T3A/RKLnv4cB0h52FIX6IeL9f/yxz73oW1/UEVZy0GT0pviwZfIyImKHRRrGMtZAtsRcgjFDDpukhvHVGsSqQoylg1t7vsGFOPSpMJZJtRDR933yh9qY7WgHPUoed2r+Uv2JFTY6BoLbH+YlGZnxnepJT2/iUmQTFF+NRXvOkJd4kBLzneYgNwMYJpD+/mDEWEkN49au3vCIpH3yjUiLWdcU2M4BzgVLrngVvSET/rIsB+0QtAZjnaikfaiJNQoeRhmUi/fvNVyu/4CWysIJsxg3kQrsAk9guJiInvnZt9ivyeyXMf9Ing5fsfKuzZ3Cg4Um8KqHQwUyQoTiGnilrhxrQ1NQVQiq7fi9iV0ThS25aV6JfdY+6w4NIkQjQ05e+rJzW7ErUfpRwtObvN7FU4ELraXzu+hFtWtTo59tI4SiTGKidV3PnFki9LGHmZem9bHFJJP4k6kcPq1gEqiTgfmlKHoiHtNglVoOaaeGauzK2xMqT15A9jkQnqHLYEB5/mieHuJPMHlNsZnUZy/VfLEXROc3DFjuAZc5mbNNNarWddUbw1V+YxU2vEXSnbsBV3EQoi4iGkH7rS9OMDWFIXu/AZ26I5qru6sXL16wZuJg9eZXwSUHUeb5z16vD3dHJ6icGC8LvDTaJCQBb7GS8O6nAVYgDDcx1eYepMjo7OkpzgTZUsGiWsxZXiCu+G68VU7q+qCDFFJpaqZP4+Gosq220xkqCcHpJVpGJqLrL/uBg9//dSI+edGroXInYEiZWQC/sfBVnEZLHHHXZ6b+9mGfMvllfdS8Jh5CgNVKRia9Tt2xp/6ouu8OddCm3BD80JolC1kSfvADAk/rQS9ara1uzYdZDXPvUlbVNiyn6VZycJICfrMQ2umu5FDjs/5ydNBEdBlQNGl9oB/YyFwJhVbogCu60USVZmFcv+5SweG4xJGeLK5EdPLGNw48cTXM4VXjg7r1FMHytqbjojQEnzgqiGjr1kqQXlFd0I4joCmFfGboTG2xI/rTx5etlu0PBaRns29/NXNjRc4yLzq7c69rVQjJ0k8J52Vp8RbixYwa6WnapFxTIKyOy/omehA8BgZ6+uJmy/TfggoGo9PAm2km2OiK9RBQ1kdGuoQrDcptG8X2PRrwJhqgQmlw+YYUMhFMIRaPrTL36rltWm/4KUAEtbAEjzq7Wk/I3QWj5jZK8qibTvY8xpCO3Vqu3e6Jw8NDKi4VC/LMauJpDabWSoixyAY6IFodOIeN3lZJAD4qbgAcBw3kZRH/ZqI1js24cFZNV9ScyuiXNjSnqMCEp0PAjyCd8CdaHc2cEIbVucSeZhwQ083OJDOU8hARX//W12hsgPQvgysNlGMX4hyJiBBdUYRHewwfq/shqqdknTOcK8luo9874Gspk2neMojrdLBSzmrHe3A8h0cXr+52h4dHUrXNAHyVDIZeNKM3fpgliAeEi7IEblyRnNKDjpcFj2bS2OtOTCtjvfg80XxAv09E1+lFs6hSk940Tzh38DNtiE+u/3CI3GihOHsvFJPQWWRjaLAL7c8YOKHkU4gU5Th+W4QMY5GIMPk3dgaSMnPaz5OTk3ZSw4a564670llgjnaz0IzgJbNB1nSIitlfR5VNgoloWRYNlLsZFz9HCG1X6IKzMaCrBUZgUa2xR0TEYw2agPcjz3qt1k3ljgjRWYvfALJpkEu6aWsxP8g2ABoiomXpa4tqAvqkWESWZTEva+DDAJBVGFIUtTC3MIygEmrrRDSgsfBiFMyKmMJssgGnUZHgLJ9em+6DBCCVvEWZ4ka/kdHCV8yyrrKuN4hy+Er0PCt0vQq3VGDbl3OIWfuDssvMRGs7YJYhP+uLIW1IiITWfpzfbnf8J3/yp1ev7na744cf/vTh4eEdd9zh8kB6II6T0GQnaE7w8vDLjom38JIgb0+DVbResG4JRoRs6E7UsjWBYyL9JpFIVRZTFue3BNCjOsL63/hOoustJHHVnEMHGYgPxXW6x0nMqp7jE1MXm1+M1gGpVblVfcl5Rh+J5jITvG3H7RamVVYPEwTsIigU7Gu0AysHmh2fNOWgHEFJN+0Ru8XoaxP4kROnaPiSfchT9f204t6WC6SDwhGMUjdKPYrtVEE2xH8W3ktgKNEj0YKV0C6qd2907CkOlpFtzHdzrTfZU0qOIm80QbfccuvBkz/X7s/Tw9fP/tBIXhLIPvGj3+1gRQUYEU7L6ccHBhXAEeF4j+aOakEoLiailJPZoXh3DVHyTVNGniANBhfaVVI+Fq/yJMxEFN+10ZmVnX2V7QaaC9U167gGAUja8ktoeaC0dSVaZs9qTb/vzPtetr7cq4jQSrM5f2KzUgAvVn8/MtAGi8B/twiWyKrvxLHDiMRd8SZbFQ02NRvUtmBZqwIvUiqugn188SeiK2hOawPGaTpnOMVEQeYkWl7VGzRYcEY+tr7K6vLjmhaNtTMkaMYg04RGn1m3VRlsgilqA+YGraSDmvH75c6hQdvRQ7jNEiVbILYMGFie+cyv+cxnPkP0tK/6qq+6ePFiGgLCuFfwSW6NPBG7E6CVdgsNUCC/hDsmJDMswZaN4njZI2gdbmBaGWvD6Ysj10gV/ldSXvSEiDjQhgxAu596F69oHzk+At1PycH6xE55HTrfWGJDVtyMUYAjsRUmj6TmR6WCW69xxgV9HelMPobxPsECBASJnlgVpvh9lOEoTqpQ4wUN5SebPyk2gQvWmAddFLY5mgm2l8bVT6ymfQdPvrXVc/3sD1aUIJdGNS/y50dR3rRC3U1oTnFZ+iPH1lZOLXNusWD6AO6Torlex9FX2eZ2Ri6jLhIFVyp9+QUnVDBbZ0ZLXfuyliGO1CQ+WjuU4Df1bZNZTH0YwdlTpwUMKM9zZkXAGuJHM5PZTPrYt7QrBuhjwezfk3Dhl/6EuYW1xNpKoB+sN/3DM/+QiH/7zHv/L+s/ACzFeA+l3HmkD1fglEsGlqjuCTtkdBHntsm90Y5TSfadlLirprfBCpusNYzidDnwQx2JK3SlYS0HBfB0xeZSzam5xs8i7tXvFXXp1xJtSBpkJF8uDIaYiFCdYikXCTJqclljZgtfSTvEb1319APMKQp2pMdEFWn5O4Ygo34ESPSUiH6KS4lpe+o6YUdHR63I4eHh4eFFbCsX99QNSFHaDvEnnFPKg6mgoPkJRzODKzWPi0giQSgAQ/MIlvJzw4VY/USgmcOJXIX71NTgRrbr999oyweyrQjrG5RgdwTRTyyCN9H3BAeJ7gotmhk/dVRu5sIqYXUhNuqtg1K7zaW8sxgJ1rpghwpk4Hc+/xwRvfIjXxo3AM0H2qlS5Fe9W5S8EJaPxjf1OtcTG1VZEoCjZpo4slTdYUQlRDZ/DpNhIqL2VhYTn/y+xuldJAOpEaYqQ/ZPJOrOmYti5BpjYtrXwMCH7phg2LcbHiKOHgdST6m2lF5ycrITEeZXdhPBqarklQjWZL1iNS61wINRKogHajdgENtBfSCNQuROFuCCvh+TYxYcJjld/Od2JnZig0iwA4v2yAAlZsAa7C/rGoGqZ6CqxW44UiXwlONN7IWmvWN5x+vkdZpu/zURdNUGaG51mo8HmGU2dmmLe93+cD9VZ3UahKh97JkhzgE+UHsLnyIWO8EzxauSLEI2sBRp1BVdacFGwFAbUVwHBC6b9emDAmtzRA6BW9MUpMvxutipmHYAmqbAqE5RFA8pPVtHcB0hiS4FWvjK/munSTnPW4csv2qDN4KoX/9d48KNuCRJh8Q2qup3fQr++OOP3f2su7V3QautO2u1SCfhXF0kkic/E0gL/RqMuJpCjmUkEABEopcNvpaISdaWY9PxQ9vBdc1cIxnmi/Rj0zGrp2IcDzN7LnezE5phsgUO2T2KRgjcBSQNKogE+JBsd0EDYqnWUPCm4FxRqZUAt2tDyNNNAxqldMVpTJDYdz7/3OfphEh+4QXLWz7qrtG0HlrHwR3NlGfuP5mY+G3P+peW/02f+nFkHQ5WNXBlXzoZovsxzBKqERtnBVI3pP9a4ERK4dVuFRTaWzrdqs46kvq0lQFggaGKiLFiaZCH1f0gWR2hS39x/fuObrllRpa2iB7ElOWVajTUfKSWukMx4s1ZNXxjvaNx6IFchmqTEZvB1lCPbnRW0Bx2M5sdcb5QxfCD8wfXT64f2HnujNkR6mHxRAwaVYnKYrovqlJJVgGbQhPM9v6cmUNRFYjNtW0eK8Gnb3AhMgwupr9OXhdWBvEpB5c39N13CBikcXOketVHIQhYr29hPrss/rZLAwPmehNssnJlcB7+kr62hlErd34ImxJEizWvPRu8YJJCZUR+4CeG0yPqUsOqpRRgN2L0xllm5sJaCYF6QFGePUFAY0UbUBHSozgFXiHsUKflEjFMxqp8rPLXEHHxUduIq9hrdIJFH7rNMvp1cswadPbKFSMaY6TETD5k9QEPEv760QmMiEQKJ4AoasUTmDhEsBCDtg0TK2hatF8VRhxTooL1qhDJ7XZXDw+PhnqYc2hteg0HeLCyN5jpwvcFp1o8hZE3oUUPUZI3gK1cs6gBzR+vAKtqfwPSGi/UfXMznCNY0b67Ihu1Ade6efEIs3c2or2cOPYWB33SCRtAtzNWVez4hqQV2XTqpL4HuDTw01UpEmB2n4gI7Xmv/uA+uvF4yzv5DhIn9u+9ypWuSHPwRqawswpjr2Ml5uEsvcP3sjYfZYeg7ib6zxRGhQIGI8zpIFHZUFTSYt4heXFM3LhwlJc0ozA94lxChuI61wJRGTV0D4yurEdULhNgikPMqLbRIoUpcQT8CZARMy/LwkzL0ichI8328x/IPyAi5gXEpFfTf+alQAJ20UAhgSukKMaNlc53yy8kZ612EDLhhRmCKDiWuOQ3xCGNL673cR7mkkranbESxTS6t117b2GnjGbIPnUiGMQasqE11Pluzin2c+D7CLZYvK+oSGHB3iy9dDjHJEsLZImOkUOuRqdSKgLnzvkkACXPOa1EwgIrGoygHS4rRPL444/dd9+LdEisIxHIdhm4EaqT3mKs2b0s5ctS2pCRbsPH8E9ZcI2yq1kDCmzRU0Y3E9t1azXQk+3jpCHrFwbnT4PbuEpXWYRoFmCUggwaZtmQh4n6V71RJmO+krchkxMVyHauwsgaqWhbC/qZa/RphsWqVYXCphEd4Ah2GTbzgtW/6qNP/twLSuvZfpbvsiUrhIyFDJxzRj6ngRslLRdPlxkZtZw30L5P2GItunREI6bEiBDTyZnXSCi4QQ5emG+qOENOIwF70YaAwR/3G0fIHpK0jocaov/e6EPw2QGNhlBCmKIPRY2GfqNvH7mAj/VjdAcTY1UVwbGfKFSqLBbK4pg1Gpagy6OrHSWkshvOXG72B+MXMCi6tB1WRZO5QuZ3xonqI4AhNC9kWEp9qQOPOJoMHV+w2fiITWAGJR0r1HZNToyXjTYzRJ1xjiNbcV0i7Av/BuE9cNKkUL0XBpNC2Cn8tUhFtQFLCVzViGiLIpCClpTC7im4omlWNOaL1k6qDaj54wjI3F47Z3kEW5aCEsyREi3iqIdFubneuCF29eYakG2Iq71LqLjNJQtfcWk3q0lGwRbCuVjgpA2/9WK32x0eHqanjK8li/1Tu8lo+LCehOlSQVvLyul207ACM0t6rOfFp4KJYqQknRRsPZo0vXUxL+lFfWULB77pQ2gr2CR07az8GQ0HtkJYILciaqeIgjWB3mXaRlJtG0R4hBYqwawRlbZHhZn2dzBz5YarlPjRKIvpNVLOebLnNf/wR70BKMJwU/MZ+2JNJ3p+4NM/8UH+PSJ6kbwYIFftvQjYNYhcFhjOU3PkRumr0oKm1bOYLVXhtKpRAm0zSB4XpA2XkFj/zLVlylVnFDNkDOYXu1A1kpnA3bGPjaLSOS6JmhsgnZdUN4GPpC3SsciK8yt3/+OsTEu5/WZahIRk1Q9u0ki5ClwWQbEuiHRi7ImqYzJx4HDlySefPDg4n8gb77GGSJnEDls2hzttxsSZDBQtvxlEzlcAmXlZNrTTr2kvpElZ0IiQE0a7PqkhgIGxxR5/8pf2wYB3XyN0dlkWEzCPQOqKIwXo4Ck4bBW6csHyTsQlvHbUByASXEZsaQDL1CQAHlIyehRE1T59pw03dQ3oTXAnloMiK2jcVIiBHO99TGz1rlGHTd26ibD0rzB1m9YQQsNeqx7WwLSoFBOIgJAdmmAjn22i+w/dRM+9ktr69Ovq1auxuDIgHMcqlqcbCyGiyGolQ7RERV640VUdwfShUmyaoe+IOR1BD+5QzdD+gLw6ockF4FLioDN5wLWsltTEmKqFDchJhY2GDWLSaKlLJgpbX4ceZIdVZSvgQjCjyiUx9xaaGABiuh+4ZEPnapichN0MMEWSVal6PZLBcfjSo6Jo+fM+fkkr7AQ6KRuEbBCGiUSqIaftl54ahB1shgi2rdQjrl9n0gleJAMygtPSV+JAn2sE2csGGphIzv/Fz7Qmrn/Fj5osxaC7DJKe+k7drWPEAnARGFGMcAZDgeJp5UezbxZHpJ3dk0Larl3oC7RTZLiI+oZopn6qZ9kzkgixGmQxU6dYRkhY6Ym99nt3FsyuaK2RjDkidynz3QvGJw26NwqNpTyoQR5EABViCToLMO9MYwZdIkzWxtR5QfIRPCUgBRxAK9SHHBxKBqB9DJY+oCTSX4nthAp3NEO2RJjfdZewGYuIIoqaLBQaGCrjW55nKRYNocj40kRXkDwhQ4PCZqC7IcZIZjc0WfRbbb7CSH6yqGvOfIrjJloloqtTi1BpgIpFuC8aCrev4vhTG00ikdWxJIoBMQktzMJExSmCweUkORaiuCUruSgi4osXD2OJ8p4iRKC46crz85hZ+yAxJ7C2D/eQIaK0jIJbc0xu2pAhphgrhRcMaeAAEeSIBjp2wRHGUnSwXjTn8Z45yBIXmz+KS+cJHPlsT22/eXIbuVfzlJY8zFIG4mmC4dqEx96vQgQTfecMyHIcJgZ5VtzupAGG6IWX6mQyygMd6k9mFPJJahprGCtUaitbUZFRXNA3m21SlKhJDU0unKthcxs5i8ohS7HY1C0vsixLyOZDZLNTLpoY3bS326+D6w+enL+3KRQIQAvEc8hcCSYvDOgttBbgi1mSwGc81b2xeqFkH/QIblXwpe2UgP52x0U06DVOSi2fRcJk1NOqG4O4svWOXeVt4Wgoi+MbbNS89VxLSne8E/afYcKsMqRHsJ7KLBP3fVfcbuKTbEbKExbgHoVEkQARtSiU27ewk2LsjLUKsRstwPYeVR/3s6RnhJI5Oc/ZPMHi6KQjkulCoeK/GbrSGaf2JUW5AtGOsjGKliJhZDppYTC97wRjBC7FDGJECsxEfwqvXAJ5KTEFsUxi7Ex4lQNuB/ISL9LOcVcgK7bhvb3sYF0QaZZDyM4VE/A6EwcJrOv2j9opL2yO3DpBRI89duUrv/JpseD2VYAq/Cme7kQy/K1Kdhw4rxyhlQ+i9BE1iBxqaKCVKClJ0cSHnv87JPQtD3wbEUdCJjAihgrM4s2w0ViP6EedJci8kzT7FEPjFeeOKNqYGk01gnlMZjQWTj2ZT5uThGL+dMFUzBD9mWMCfTRKOCJmggyZdTkegN46K25yCIUZ1UbHgcjbwJfzH1i/9GJC9s5lfXZlbxEi+m5nxtrR6VpKdcrMSBYmNpZqVRzbc//ZaTOqmnlL1A12MrXL8FBOzj8vK5Le5qAr7HohxZWtROojTKGXyLcC1DBz3+sbz4PUTraUFcMKVLzbblMgJ4/DKX2lIyucy0DdmEfVGWiMOyz7s4ef89G7PvH8VvDg4OD69evpPPcN2eBCiFn/ESWMVYmIengFtTXpMgpDZyvKmJPSw1TIKIK3nUb5z+dxuPKHASIVcsEGG1RdwqtURh26nva4Ue4OH1cJ/ZaJqC8RqnU21AbkhiAW1fLhqxLiJg/QlVelRFVhrbiRIke22GogClKbBD1MC8S4D8OhLdopoBjEcuuAtMEI5US016IxZEQZOqLcTgbWGC+16G5DTUzcFgz19fQ2Tmzjp+LJZgBHZVT5Kw18uDiGTKwCqAq67N5JQG1K70VEeiBCw3YWJK8I8rMQiVs3V7fTFX1DfIiHwbIO9pslvUNldAdLdJkuE9Pl511+88d+VK1wM7tTqzdgLNrmOWZYdMINKh7t5aQ0myYMzTXFcVHJlY292PD5Y+8608DRShwp908H73wnEZ286lX9URtTBmglRnBwTua6Yu+y7ODeZxQAMDVma+0fhumVPuy7PdoK8gyFcz2skHk9+OkbRHThk8u1Hw+Eh/xVYuhUnBjozTChQ9XbaiAC9GD10TzF2UKmBNuO8FpGhutmLjK5HhgKnlVFX700qSkwIvFsOSOAUB6MsPjIAc3MVKauQe9p1Au1lqyQV1JczToCBHtdHIKsbL2LroRjDaGS//D0nybir370x4h8MTdlY8JXtDvg/ZWv/9+I6IHnfOT1n/grI6IaZoOjkU6mdcp/ZcJsginDTf8ZKxcRx1Wzq71IyHo5JSBx6Tg0ZTtHyuM9k5BiLJ0BhpkhdJk0kx5BICzc1+W8m8K8pLcIxaYj4lvzZFkWxQ6OaViXlvuyYAHPXXXhkWjNcUtWVFeYzgKmgQCV3kQUn1c5EcCRDWeiE4cZEKRQNUcZcJW3RcS8cNv/uK5r7EU/yESEeTkjK5ktYCLqA8PMybohyhagPRClU9uG7RTjm4iQvUDK6zrCTXr88cfvftbdGwd+SrEWiJMS4wH+MO7pOJn+k3pcp0wkm/UE9XylvI8puL822ueuvZeITs6/FPoeakPFSB18iB5yj5zsl55tEfraFRs9Uwlf9nja4Ns4E5YjWDbcQy/cRO2LYPVGYYY9v3j4qV4zONp4iRz85m/yo48S0cG/+BfXf+IniOiJ4yduueXWUNdi75oYlxwkWV1YL9yYYQk6rrqW/aV/g4wK1niP0CfK2H3kSnh0Qr9zFgagKlNMAPwZ6nND883aLzqzDc3leW+oKWfGcpnPkJ6FQfWrc6Eh4sUHPwkwEMRtxQCr6//+7rPfTUQv+eP7NZGJ+PpX/Dj3PTcOD6wY8yJCsBhXANB23XLL0fHxE0dHR2DSoz3KwKUEXGZsu5NKjxVm6SdYEyacXKyAx7KNs/dsc4Ix5C8+/d+3R//h6f/qax61E9cIioj9UMkVYvo4PWAHvqOOVABr02SEzG2YBdMAWo2irnqalcq6jMMaipovwyVC5pZ+xioxeDQ0jSkc782l+uFE7aCizem6QEdsRHW2QETw3pWOuB40irXFGWEHXI0N+nkcNUlCJBG19A9Ch/1VOS4F29spwiBoPUbIRFqIp+OY0H1RzLdmYLQwRZAkrkVVmAq2j8TVQ4r53SSpn3D5av1dluXGjZWZ11V0awjzstAqst6w90dAvsyAkY0fERGtZEsYZrrU/BH+1tUynBs1tpCwfZVCcoC81OoBHPT5P+qDxJx+XJzZlBgFC0MW7zglxhQDjgxlAsw4t/sNWq8y08GTbz85elNES6PCZAv7XH7ug/ThktbSEseO13XC01HnjTZCjzVKdnklc8wxnTllo2rITnMlvytgpKYrobwswwMDUqkXOvbaj6iPZf2B5+1L3oOdwTZoGJcgYxXHJHY5Uz2SdkDfttKnlDkV1Wooy97YjFFrdgLUfYVVISC+bAg8vuAPoH/sUUFZnxN1GqNL5litm8o2lUTKmIjoZ5/1z1uhLzzrl77302+GZ+08oLo/+vFWFHAe9A6ayrgBX0nBNrfKOlgZprNhptdOq9mvrNhwaqt5s2CrOwUicXm9pBPlFCp3o8vPped/kn+/i5nO4XMl290INteiy1lEOUPNZMmFiBZeUIghmMw8sUiGqwZq2f9l2++PHcmlBilyQsJh+op2jDJ/5PXYYd0hQ5J8wxlnW5wcQJU27shD6eJ07wbSoJgFhEQTEWwR6deUe4odpjBCMaTd39rgTFVLT+dgoW1CCJXmDRSqWtiRCoWcA7tTyNeyGQdImakdYRJqW90b9F65fdG1LU9wX0JrdbVPQeOgNuDEwClo1PbD4rJpXKIkkvUGMaswhdDI448/9qIXfatGsEr3pgJdh9oFc6k/KBfWcpIU6adw/8NaT2tWE/NLAICJSX9CpISJiH7gYz/aHwZTSL7fG+pg5yTWPPVV4ekkyCB462CG88Php3Q7w6Z3sZTao9FzV7Vt9aUbMg/pVeZerr/qVQf/4l/EqhiaBslQpKm/FtJ3aSuSBnJ0uwxExIMvqvoS7hPAckiyjJmJCpnuGZbrP7GX2OS5W9pgK+rZ/4A9thxk11WuksP9OJ8JHXSvSTDuPBIDBpxA6PIwtu5R4ENTzPosBmqvt8u6GowG4xpqh6W6ZBg9omZclHGluJqGYZQBc/Zuxt3WI/HOhJQGLeh6QrjUSfl7CU959DufeMZPUzu7pxrTePQE43a4N3ziPwlNM12/fv38+fNjJbPLtBN+IueZjIHDt6oIKMkvwMdG0FA3MxMZI+mG7Rs6jDQElY8pNKYg8wFJZkmI4HvsZg5ASnMc6gPPWl7DTz1MpeLFRLzYy24IpHhp8aqw9NY/MtgkRXSx2ld2mIRWpmAQh0XDYolQAbhQfEXRBoYShKJQtt9X+6u8eGQo4BWniqo8PnjcttfwjRsrGCOvR0R44YWWdRWyKXyju2dYF2Cmoivwy6BBgOF8vNvIGdGmla1W5h7qa8Zitzu+ePHCeLyQX/2dsr0+z8CSmdghg4y5STOjmCa8xUMhJqLf+cru1b7t8f/t5OJ3Hxy/PbknNcqVqnB0xomUrEIDvUT26dx9F1e/Wn/RRvtpukS856X6cX7W/i4uQwReB3JlOzW/ZoMI5szc9JCrrQxaVcwhXyW03uhsXAoSNT4RfYDqVHEVMmnNqefYGvSK61/GhQ6byDQ2zM0SH4LzwPWjovYCwY9uhkb+q/k1RyhQ2NBVxiIJIwKszXsFmejVn36zTe5ssyDY3rBKaF7Jy7vxM9uqI8jhRULEKMMxF/mbgwpiOQ4NTI89hdT3j9KLl/a95YqLppZnWZwUQidla0TK5q/97F9BJgTicX4bJSv6ATIzCxv5Ux2Cxan8QWRvFplD6UJnU9H0Xmo5IQ7NGfW2gSkxizm8S3jGFKIBLexO9c0fzwBqhYqPmcefJvD2E4FBqMekyKo6G+tSmKV7twBO9XtSUMJ+6Aom+nH+rO/HO4gJH9gyGEHbKVa52ZbIpg6tWv2dB7PAVTh4LcTPCDaVR2hV4KoxT3tsnmNZlvWGHlbeJaZtzWvVrdodQ43MvZtniFYIHYtx2IZ2enEXUQesOmdkIllJoZIvFLZPUAfsEq1KmoZut208EpAKMrCrZnRSYeFui2aU43/2xZB+/ehNNHOsicz4T4Eo85Q6oTEZ4NHprmAhs30EHMz2a442MhZpr7GoeM9KgffLCHJOdHJbiaq9DO+2MFrs/o4beiFoa0qXcUYiFeDaC1hZ1tMJS5NRChTs79vNXGNtPqEzYwJQYDa1GDby53b2Ds9aypWaX2snpIODSAETeDVqWWBYvSM/+umfbFkRThDs7Cx7xIChsTv4fwAoG2KvXQA4iE431Y2l1FtZiuVI4CC1R+41HCtntpDCRWqE2TZTIDj2qwxzDoTImEQgbKNQmRfMZcxrc6hnURvIbhvDpNQcCiLbUaeCCZrIpCFajMiIWRVLrLDRmHL6py54yDEI4drsLh5dG6aexMxn2yq4hpxU1anvlmUY8AZFRTdgiRCL6K4sPIbKdHVdmNci2qT0Di+FxZSAdUTEERQjvmGRtfujVgMZhXmyNVIScFI8rSQ/hRRItEr6MIsQL4uscmZZnlxvGPGdS+qepYNPxomGUWSmtvNezKkwkwi3yDlt2JS4Amb8BOavQkxXr149PLzQHwkVEGioheocEZHoMAWbKiNARB1LLj9IeU8y0ec4KgXokYI5lefhkJUTinVDl/s4/iwvjo2O9sWGPrAi6kU2nODtWLOrCyG16fV6LlbFe7pQCdcc883L1HwT052g8jVFUt04AydUJXOcrqXKlm6+vOumCnZbhAZNp7IopLObwVOkB2HxlHM+h/eBpG6TxHLyxribjsB72fE5S9qWYG8esDeXpREXNNqfaEzggc6xRy/r5lpTCMx11v6RdPUrsrV0nUBbT0TTUeliVv92t+prZK1rajNZ64yGqpj7aVExIXZkIyIHBwcnJyftpIaBIi0YzEs0NbrSK97HQEMyXJwd0Yb9V2KZFVfNxsXd5QLHvVdCnhU/oKW0hhCAB85UQX3URcI02H56B7HdsxbBY4cX7UeH/H3XVG9h4RaS6SElCG41l62KGyNVMoajbiqIhei1I60+3AEQiZ4tREMAzPqFcey0KElgn/YGsTDurOcIswgtC99YdV2NF6EbajGR7wwfSI/IT3Q/eX5r3drEiDNaCv0XCFt1ZxVjHnM5Qo8/fuUrv/IriURjgN4ngvvwev3+KykGQlJOiUPBEWNtF9G6mfaCqh5k3SI3NJGzNqXSsO7cZEx/zR8LrmhPplOFpVCARRaaNfnNDUMNUP+ctxNXufFzqBMzotZ0yuvRKE9DC5UbN2a9gHRnCedq47RpH3DcuqTyn7Ocs4bA0Lk9m8gYFkt3w3TFTtvLc1mK+QMZKihlzaTMT8BiFj0VeGqtSDV8adKrRgvckkXYuAeW2tSTDUDEtlzAGIapvZ/IKBhDbzEt2o2A7GN2UZHLIjHXlMBVEWknh4gS3FmqYxJpk34cfJYWIwYIUraMIYPYizyImfJOshkf2x6HfRFrfdtlaFszXoUe2RIhc7LAFRCcw6xxLOYAUWLNyAKfDsXM7dYF+CwvLGs7a9RgDfUDEaRBhPCWn8LM/E4jwKauzoCuAi4ZkdNYT3mDVfnZXU3tdB8DD1TF+z6xqPOw0BCGxZXExoEiFAczaWnnOTGJrMTcjv1lnwX1OirBE+sX8UKykp7Qo5wnk27xcRQ0Lg19RslWgWNrRbkKHQy4zLOppg+qW93nvriWbZXKVmbyE/8SEb352v865CQTfUtMLm2wc9tuVc0J1HC8Oz46OtpTw6RWDrfot9Bg2T352HnOAK1sOwXapP7Uk0zqCnNWrQnVxIeOTOGIjHlYpb/dw/m9VMhPmLfUjQ+yjUUH7qERzCyHlgqQNPBqctkccp7FH1YerrDvkcOpOzQM0uB9Q+YxvwUkgn7FLtRMhkeo2hxTcv40c8g+L3K/nARJU22dWBOZi5VhdHmkWaj7rDZUS9/KwqwnZpppRadQ0cPQX4oNObqyDp4CfOPoU1+AcxdjQbTAI3ftPJ7e3mBVy9HdQTo0e66/PODOAfG4WsAq4XTtcluJQIQkpXQaJu8Shjxl0wlpTX6mFENOUT9BugFUAZp3fxw/KkDhJHfudrCvNLJ+v20xBqL4Crw52MFEayROlvbGpYoMGieIxeFVQUKlBlls9/qKR67Z35cUpxWMnTsnG+3onrGs6w8T9wB4m1N09LScObM+2cJXy0qrqjFOOIiI/vkLPtO4/3/4yNcQmHqZiibGve1lBe9Oo2zVyRxwyoavd1SIHnvssWfd/SwqMpdXoqdy2J51hqj2Qq69P7VxdQ8Tw62Hheq18EbX0iUmaYN55XmnA/OySlcd6FKkuztH8wfSmE0eIhjLEGWZ1NRmnoN5SYZmw62mfm3My8cbjio/O3StSz0XbExNCJ7Q7TGOSAYv1bm7zi7jjB3ug/I/6sKGPqrxrK/xKUL/1CixH0+VqqkrB5Ax0ItCEYxPUX+FJIpME+HnimNYc3KTqLn4NxsZHT/P0/aau90rm/R2oUnxROa+9cLyLFnvpleNxnNZdBxDzmFosEg6JLZZoujaW1BNp76ZnmxasTvXrl2LLxIWPcgJoV9ETPq5azRZAXbP7H84FiG1CRjDwlVDdwayNVslS+NYhJXBJJARSk5gludkUvTaxNPwNVZ+li3W2iNPi8/HFEJLNOKIohRztPtwOi3HxS8elu08JeXsKIX7AqUlWsHW3fhutlYVf6KZ6GeUkWEjLOsMAkuYZjMD2GL7+JFCO90RqdukRHT1rb+CXtkgZiL61W/+/Ov/4KnGYbYt870HYmSTJ+nSne8tRZQl5Kv4G5dEC3DK9+NoXq0tN54GSxm1+Kh0AxIe+RgR6EOofEAqZReYYa+GZo5bF0GKuj4jvXMoMntQ5lQzgdRySbt9cN7LQnPS6R+NemmttmVjIHTPDJiAUVZE7DuTPpkJ4oGlBQpum1e02v1fpHS4KYsXllTTeV+KW7/hZZFpi9sQZyBvcqpHxGQ5U1XEJug+CTF4T2Q7dqqKULjSUxxFwY1WFiCnLo3dlJZvh0j6Nz5MgyuSh5u7VoZEqobVDT7Z2zyGEuwTCGx8WCUMunrUSmCGpqi7GPxoKXCyVgQexEztQTt+a6WIA3qgIKAsP9Ad+hMDcqX+cvi31Ai/B3QlZnfVt3a8AAWQpMr+KBMUiNsjI6abnRbQwr/anTTugX7ApmQ2P+afZY5WKMLcBGkGYyLUAFZLxZFuE8llWUhXv8wJxQU7YbbhXa29hmMkRqGsYL8PB2JZ/QazqL1L39a8zPPg63WCnbGwmS846iKmMnMIlWktZn3yvvjsFSx/z5M/ZMH2wzahN8aKHpoafUYU6cG82D4tnaPiMoS11dUYUCEREUuzDjIIDP6Q3W534cIFIvLAmTchqiaj2pMJvWfO1M88CD4wlRtzl5gMvCY3Z9zZigCobDVFVoe5S6pfIa1zwAwK+YBtmKl4TYJnesKZk2HdMToLgnG/L6CyTjca23jthbk0GWun4RSYFauyG7Yxsp0D4DIlDZ9Z6i/nbU1rekJeHERyIWyN6sjHQillRNZzqdP8gx1H/khMgy3SWTKLn9zFuyTB6nVPEAyaA/RJNwbzYXayny5SCVPobDuWq4ocKB83Zioh0Qyplu5Pb731li9+8Yu33HKLZTRLG9mu3iFUnJWOAtjSCr0ruavxt1DeghJiP6TYC0rzOALmgQjE1RY5I3zqI9Bf3GYigu8+A/Zpsl0CrDzA9nfim6xyx1idDIv9M+6KGUFPbjB8LsQyty2J/b/oOPwdz2pSiijKqtrY1T7OxiU/FZMLNFBYvLDbZ3vZIBDCzLzYR3DY0FJ7tIp0hxwQVTjxz8xotcqm6KTt6BYcHicgcJ8S9HHvJrA8gFrRk+Mxqlo5eQavDwdJcnPUo0Sm3pCBqZ8Cp3MFpmVZ1vWGiJiGGHNchZhE5K995Gt/XT5FRN9LXyMqoAB22aBn1EMxslAsjPnUzyVRCdOtWUYjEX3p6lUmunjxouEwsXHwVkxGkxGsXTikzucrdfFk/VGzU+uoh4LKEJUwVTugq9FzSCiVUNfpsMXciAxX2ojXZCkZCzv/dtJ660P0FYEF2AQyaqky5GypOyP+m13Rm+JkRrD0OIEhj0+0qRR+kG5sJZFn0wxjyf5SuX7bfy1KUKingALmTMyQQlteBoM6NVUo5nt4HMzIACNij6x+8BwMwm2mpPLu9ihU6J5r6nozLeFgwqHYhbf9fLu59uYfgmSwRIIuM6IWta5g4RfF2OlLz+hBothVIBg7wIEhm10Nzh7nkO7LDFdFpDW26ttdAv/hpNOI+Vqv2DbY/vMX3d5DTCJ/9YOP7VlMDp2ANB73SInBC/OZA/f2mgpVf0nWuKFA0rdN8T/MmS16bBIVxOxiBpeTn5UwsMSVi7F7wRm1DGeXhddVqH/lQvF9GxE1+WZBAFHh+hpEleIhjRDEUvefD44XCzXpTVpnZLgZJwcY8XJR66iGQyXp3rkSsVQFrVqKfw6P2rBx0xDlNTO1cyv6RzyWHoDTEqZsbcitU6+mZyuEKt0hq9sRJnUhf/HLRMJPfaOFqngIZbUPI6pAGDRE9ISN6t+Akez4uAR0SJcDkkNnOOxhPGFu7J1UT3mSPthydgNanNdEwWgFXYSxZfSBZntzS7HZMDG6uQvn7rG8w98QaVCVgfTkGDIlUlbvNQjc57KmZZYw7cj4UZxEVMyuLXKQljB5IJG1rblzKDIlI4LO/jEo8gXfYCJS/kQb0G3CA6bZvYubL+wwzj/zA62za2humijsFBRmvvXWW5544hjiMVvXVKBSK/hSvdDGt0etLo2XjFWRM81cXvXeTrKlMWYQXd0T/Vy787/z29e+7WVFH8Bx2iQZqWouWXTPCXnEAscXiunL2rFfxS9L2APNh2twJbitxYUzTeTGykUEzmUlUI3RirD9073UwqwHHDGxMJ2/cOH69ZPz588HKJAbDZEzS+uNOEP8b29XqWoI4h9/zf+vPfhbf/r3hn5JqFztFjPH6R/af8VdTMx9n5Z9+7lCUWBI4xwJ8hNRksxxNqtaLNZHMqGKUmE7xXviWcMGRCS46U9XNTYAStt5oBDHPgVIydwETDZ+1CKc255W8dIre2zwK6WTi5+qX0ZgAZYp0z2gRfFsLc0WcqbBEP/J1HeqcYKY1lExnMUYtGt4xlZU7ewGbtFD7VX0qZ/7V73+v/gleuobm+VO7Oo3S19jtTd/Uc52u93Fixeg5qa4+CtdoXh0lojbwk+rqa/qCeYP7hbYZS6BIU9kQvvTX9Vs6gzzD2VvYbRMqcsPfk0RoVG4INkTmztrs64XqwreiHNirKl1kFP1TML65S8wOtYKflckW5PYhAwpVWeGfgTE4C6kjT7OMQgNqOg+Swalq10j0G8WgAfGYMzDatscL+C8N61PPIQQRSSG6rWHgf0m925zoALGdgfyphBTuwVoL3EpAFnsO568M7uqucmILAM9av1H4vM9uMDeFh5wvDFG6iMCbRa+0n6ZXlAkJ3F3aC43KzMbssWH0Jxt5UwvGFL3U8tSbbKDzEAh04hiOfPK7afoMuein/FVOWgtLMHWh24ykc3k41w3t2ZqRSa6Zt8dfxPRr33tL7/mM28gmpkyXdOs7DXzYpuu1NoVSjHWnHBVhbqAAHflqbbCSAaZEawtN6cfe+5HM7D6eIoARVedQKDHIBb89Sio2h0FN3AaBxEiEqcXMD7CpoYN8+7dSJh2Pix6irdewKx8H3+6V4Cnbt2oQStt19ADTC+8/oC8fGSIiAkgZhhI4wkMG34pszVrNLQ8SowaoxAn6KeIidDnPvfY09ohWIRlT2U7sHdOaaMQaeZQAMaUq4ZCBDRwq6SqtdQ96FL7oJSicZdYud8aaE42FPy0UKVyp7zQ6Y1PmcMjf0W7HhThJutDNUNr2KhAX2ZdGBGt1jANXE3SXUak6vSSvx1pHBimYbliG/dg71jJT8bUNXZCZRru1GL5mqE+UyQnQvDavD3SGiLl2kA3XSlPxKAVva36zNKCPCJp662S3572nBkxcOz7KaCP02UjkMhX/xsryVthrr/0O85/4d8Q0bVbXxur4EgA9rTNMrBT2EbmSdZ9mI9NejM82JTMMbuftYPoipkx2jpIKI+j4HPucF5cNeRdrn7yg4+9V46F5GV0ZJkl342XTOwDHPYdyW2mxYvDFpWGnraFZzAszPEcUWrAI7zRIW0hhW2O7YgTKMnYaGhmbDgYeY5lVY6zNFa1CZ1ddK+VccdffegSYIiqO554zxC7ws1YDVjgN6cao7NWG8RJN0Nih1a2d8ojXiH4BDCrV2JNIJ0eeOuZg+kpKASSWg6ObWkES7nN/QCLASso4rReNNPdkKKiH7TlsPDHpI5HiESe+ob2OaIkHwatAPBBh9yLiw6K969SOnS3yfWO/oOV65gYhBTWTZLtA93fY8otW+gLFmRif5O/UCoOP5uTk5THqGIKE6DRH+81sl7X9BEzzkgVE4xtDSs3nrNd3bLBy0XAHNY2/L0QwoKATiDRqZ9hryQ1kWz2w4HtqUppU+omeGoiBdaz6qt32QS7j+lwcHlchSn4iRVO+pL7pNM2dEKyqgcktSrkZspMkyBnTPqHbjrFLqsVJyYvGSpTPI95oBmy51S6ajKZ7q2ZGCiku5JUh3WNia//1f9jy3n+8f+5Pb7wuX967Sv/09RuIqkbRXSy1KxeH4yJRnclKixQaKVpwlRl98SxQB85HmQvIkvfKkMmt2VD0ASnfxf8MdCumspC8nK+pVelLuHk+vULF/JJDS7LkIAzhC72oEQwU/C9Jcjn//xP//6/+tr/RYhe+5k3bQLRMFRcy2j/z6JZesPsGm5aE7s1QNVsLXOGJC2QefxgwAL7YlJZbh97Zp8vishyZjGvi6tmrPAC502GWhokAPsFOxL69E/Q5AU76PGbjlH0foHjr8jKkolm+T2cxe/t0bBW2CiE/V5RYmaTPDUTDL84KVrXTlUe7QrTDQKFdibIulJfEFwN7gA8crPRr6f9WK+hyztxgFMNFq8GgrXRrhoGsj73+Ofuftbdgyi32cYiKTV8ZcwrjLmSXZ25YY43zhP46zfgxrAGitJs9jUSM5BQ7+9OeHD4pa00aoPjPz26Gq8A47qZSKhiNOJdQv7DN/4mEX3NJ75nzNnrcbCE1BLptGQwJWqbY9f13xFCTbulf20EF/tghI0g6JrFV7iPI1NkRWxL3GgG6AR7OqG/yzBe6QyOUPWerin5ZsQslGCoy6hK6/VArVqAwquKlQZzKkS4hoa5y5UVSTrTfujPOWyFQujPYbXIHBhvCgB0MlCXRDS6MWJiwb1Gic4iwM+BgYoiXSSSjYpa3OcbsX6kc49iZ8XJj4u71sLi0RqxLK5mNvlOQKDGc5gYyeghJDuGiW0OTybIQEj1mfA4BObSVE70xgiWMJ0jEqIf+8xfi0beMqAAJOHWjQ/MxLScsc88L8UIZlkqLbPZHE8ZZbi06v/sGV9FxD/5Z4+yaZEMnBl51X2tLhGyhl66cjdh908NzqLKtv+A8J594S9EvDgYJu5jpgNFUDWkWOAK8UFWLc2AqIsrRDXbkhXCZtjTaBzF0InhPL33n3Yyui/sibHF9MHMHVhhtw0KRrtlHcsaxIm1+egutuFOVieE/EY7GAGNyWDys3usiXc02FVx01Fah1Qhg4PBRpMRyb0+eOtbmzAx0fUf/EF3sYWF5Oqe+1Izl09DTuYFPbTDhNPDrMG6th/J5QzWgYho0a59+Ll9on/lG/7JC//obw6Gg8BbgtycitoSGBc4L/7k6pE55qYnOv/T4yls+qRWoku1Ob6CTpVcU9CufYx9J9ARcs9bUz716FWXmZhkXZl5BVTOSz+ZpYJW2LXIsaI1HscIXxmL5eO/iVArTjzOl7z58ObjqFyCJJ3+crMZiEkOLO/pacQGm4TPuOxxZ/jCfjwcMJs5yP9YfnT2maB5L4kc9kE2aCVRCgQAnx1o23tgQ1mNUhQETq8+gsYCmxLwwgwb8WTaT7cq3X/pkCEQUEuotUguPxiU9DOLX6scdq8PZAE2GsxmbiXWkHBVMYUzw0JE/81XP+MKERH9g69++n/zZ49OQRUTvFdgLBBqn8oh+KyRwqzMBdaX4iD+1CtGOAToyn82B0aKrpyX4i/7CQax2osP8MKFyGoiSLSq3wggqQOgyFOlk6g6D8ILOngizJ+q6j87SdZQiGCJXkSyrjCj7UdbmPmQziCy/6hBIljXsz2zXYaGSUyWVPYjHhbWI7N50dFYBffA7a7uLl64YAAoQBtHSMnNJxPs5glS2FXFC86u0fMlVzR1h9RfFDKNabOrYjPW/Oo+EvpeeaK8UwQx98Qrn4YG8xe9B6xeZ9MeDTX3OZFaiggm+nPxnNYL78I+0uPZ6nuukBMltsex1JgLt6UTFXebHvsyJlccLggerKRNpdBuzk6mmJl70qZrtYPzlx2dG6IiNz4xWh9qLukxK2SmYy35r3qSoZt1HE5fG4TKTVCqm+Gfgu2ZF4M/cxrEHiTbEoBOIuz67X/Ds3VvlCuPZEizcOCMbacST5gzu6pH45RYr//12f99u/lPPvW3PQ/k0l6OxEdi3ARLW+4Uocgs/XZd/Y21qgPgkcl9R/9048HBwbXr184fnAcrvedquBUNFIApRqvoyBx6DGSlWVC6bEvlOCEJxCxL/8+uTC20PrS4veF9rCGkqH65BG4ALz3JnWnhxcJJ4lBJp2JEEGuxt94w2IR2RCiEi2yS2m0Q/rScAN7FPzWY41KEr9pRgFmCGlXF6ltb8Mkd34Zi92OdpDSTPiWdi4TutFpa2XWVdbWpQ5MqWvs5vC3Ok9BScIotA7HVIGaM1DAmJ4pDqxM4IVtj7Y8WbuE1Zt7tdtQPwXIKSt8912jTAVSGQr1SmQSSYnujB8pwYShuZwDW9UTCOFKo+uaaNq4fuWOezJZMWgavdBOX5P3aUFeym8y4qYPhxUB9OowCQ+5twIskDaUTFB67KsOA9kTTJo72SIPf/d7QlfbF/4YWsWe9iWDuTT3H7gwANF3F+A2zrEX0BJQhJ6FZ0BufNRnNuD9h0lz+rhnOTmektmvJwHR4P7HqZfiVAzMK0QtcON8JZixvgmGHqlQdT4kiK1Sb5S2pCTfK2ESBe6GbmBgQZTtTUBW4pB386LN/55s+9W1E5IeoNRomjbuHZs2pwk9JcGsbiATXJmKgUXPCNP00L5PGaljfhGuNY8DC80AJdVthIIfOZRyfbUijGk5vx8OxfNw3INHwMxnwOj8R/VePfvb//IynF0+HdzVgvN1Zk+hJ7ot65ab62nbPZ7ghckQjULoWFvFTF6MGm6K5WXBu15sIi3QEU0A3bVrDmtoyYqyTFrgSEbMtzWIUlVDa5hXu0SJYgM1GyCJ2SoOIyLrKKmu74b4dqpwGNUkS0eAZjrSI9G3zjrG00BRaKU7sE412IqwdVde/Wo3ReyysaQI/icjegSmtBWKs/deArqDFMbMd0RutvO8jIG6BuutveQu95z1MQq94RZqaTKmwRmC41T4X+c0mMrgqm6Z8WVdEeP0AKHjhaHQn0NALH/ob3lNOyG+ydanXjChkm/RxZDmSPSui7QmyjjiwEfXXGpL2qS7WaMSUQjWtsd3+8/wn/nG7v/acv6UtQy8E6SxkL5tONSn2qKsSlHdIKBj5FkNXhZue+19vWmac3lA6blLUPnkGeHpbQzkPtHMBKKjQPxFN7FvnHPUDaNiI2Sd4NBfOuiAGtAKyYSYpX9zZUyE+BQdDuSbVS9BQd5yoLDBgDH+iywNEPsgHO3R0FwBzv1lXmM2i+/qOxexPa7zNvcIsrhBgJhfZvKYpUfFmDblu60RLJWFRTofLcKN1N9aGwqYOFSnOyp5T/mFcGfSB7jND8JsyFGc7pqF3nqmtFHZ+dOvQ6eKOBdp2bFbPK+ry1JTE2NUAR6zxDsUalc33Fqt+njiu2QV7NxxhSiBDuhTYAzpsXYToBYJIDHrpT5P7Hq/ShnC8euwKINeqXk+1w7ebEOHM1g2x2nSiDlRhHwEvjGcEIjeQCTpoTglYfBaRq1evHh4ejvUUKrBpn1Ip7VrwPoN7o6rGcQNN2UqoUwsIfed3dBmNzVQanT0jhe6Pk17rWlPvJSw2FbsENmxIAiuhX/p6oHYtKqpTp45T8yx6b0VKWwPpRvqeK2GpDSGYIX5THEPttmQvcN+UQrQXPpITR5xIKqVFiOj8wz997a4fNwBakbqXCdYXNy86Xr4QGVdC3SNbnjCDYlHjOeleu0L4ymV73zfLGWX6FPONUkEk8l73R8+ndlv1M5n9Wczp7gf3oa1hmTYTcNttt33hC1+47bZbQx00Ytt8wZgWD0ktd9FHhYsv+NRLSY+qR4eC0ApglY27/43oqo9fONwB+cHxzW/NMlKOGbTd7ocYNwIxFJmwGVwq9b8dYRR5vY/mZlUOZvQNzQ1J/voaq4rAPi3wkSMvyimT6Wn8OS0yh1kZdWmKCNHZZVmaN17aiQy+9UdMr9RgdFHoy2F+PCas8UWjw/AyatqRYE+VHsvQ2kpz3MRqRFFi3cuZGTMTOeDT4ZdQZ8JzXhxkUYQIpt2490LjfI15FpTqtnhdb3RvQ6INr9KqgKkRAC7V7WSHJwDFELy9jaUmHpimZ5kS0dWrVy9evDg4ntJXbUMsSc+zO9HuCW3UApvzws34ZQfTJDfVUIoNqUwutH2JJBmUygjpyOCJJ5645ZZbAAdGnQz1hyomXDUNp/k33osqAV2FlKoXNQGyxylawyPZI1LhmYCIHvZjBHPgGXt01E976dmtd6ZrEwrTDYEsMC3F+ToBKKB93HNhsFPQjpFNvTolomYTD7LJBM53T1cuS2lm5qRrgcTOU583TMBMbVGNfq+sp23vm5lW3g2eincXAzX7E2OwF8PVBDTRKrZgCq3hDeiNmqf1OyPAsv21T/1doNkdsEqYaF9DMLquu3vG9fzF/7lZpZMv/Y1h7mdDgzf2r084xWoMro4RmV27du3ChfMRUoEBy3CW7S3DJooK3meeAQgJds69V/bTdQ2qybwsZxY7nGHRPXfmtVugMgf9QBJxgGKeYNA2YVZMqabWmNCaPNvujQfs66wep6HunvsWOXsbKEIi20wNyGOCukKIKwAp2yO1pM1SBJ67guuerrEc0mo7eak2/cnFmiOT18OdJd1oNreuzGGLYDGRwio1rR3YmQkWhfySkVa3wl0GpUN0BbLarIfNqBRKgJtaDywvtpKifuLq1d3h4UWHJcHIDtdMjzADufpod4ZR2tiYEHEGAqaRDFM7nUkl+qLJyK2oSCv21RbTBpFg0M1DmHgMODI1bZRK7FG40KRpQ73I9N0xdrKZuUWwwBaHSnJT8YdMGAT/cnUvQ4kRXnfhJyLWd+/ZLL1BZxiN1pfGMDXinARr48JRu/4NP3X+4X9JTNfu+isTaZsJzOwSCiPO+nM1s4YnpvaJpUW5/N371FwtqBFAj32cIsLG4IUXmVdSmo4KxXZLp8ngCKZXHiywVG3xF+j3EZBYQ3B4s2tORSHUp/lkOPSrUByDKTPbm4t1Qwf6Hejh0JzPJZqRESI6uPiOk2uvi6XIOcxc6zdKmSX3/2PctAXiAwKB+rD+7j+4/9+UmiDQMBsMFFdVHMV0SZCGAe0irHCql0Zx5v4bWhEaTd8AoZIwFFO4DZjFfkxVZdjz/nI6aw1I00z14hEfdNciJK2K9vlCrRN2SoXIeWPS4uBpiKtj/VgVanaMZlEkj1Pxfu+HiXCkEKehlr9/A5EorzN6Nlh/ATDXB2Ztrwvam4xirYi9EEBEejqV6GD3/xjmwdIBUV+OVehjU5TCJvVhNpKYjLdETLySeq2OkpmJ6LHHH7/z674uDdzM4QruYyhMdlMaTB+WRYyftTKyVizIeMvusw9/RZXAmFrTkHHihBo3VMpZW+SIrpLRD/JQ3Mya2XpInFsJ4GnDTDAjiwSeG50zbxFq4wnGalkAJ/HAkKI70eIEA1Q5eyYiPO/CebDMuLoxoPGG+drdPzEpEjGNv25WXuoNggyoDsbtEHr04w0zUEG5vItMRI8959/JKpc+9b11d1QRE+eDP5xKuMWwJYrTRjfHRwkREmVF3Kiqrn+UgXKT9SaAw+ookdEMYPGlATXEWv+Uvo3WUmOIsyNJaq8LkBesq83TYk62LXOcV99QqZo9n7iBWQ8k3DBHHtp7AULS3u0N9RvkEh9Gh8k8tqTiAunq2YgaEDFyg1P2/vZte2DbVemIuOF1nYn1hUKZI+AEs9BTtMThZwblYPbJbRZbfmcFQ3DrbJvuWJxJzP+QZSbqK2O4yslwaPuiUAlRpC1tdYWEk8yyASJlc8JJww2Z5jtyKiCRBC8t1nkSGdMby8W+Oa31iP4ULKJPmUBXl2VZb9wg8rUA7kwnYLcB1uB6iFdrZdiHDuxqrLUBGJRLMasfIa162AcePxzZrnPnzuroir7eUPvRpkpBAMdsTKTxMXIxYsg+twtDi7Ff+Jz1JWaGDKmhuiqlPDffDD1+hSm+0s+kXp+XBSy4jqnnTA1tkCEERLeUFrKCQNqS8ittyVcxpHgeIHJy6WhMcrWdkYNh7jfjELoCHvzc/0RE194C79uz/x3LOYxQsx17HJqou1HfzK6a+ElGGbONhotI4jd/0tSOQUv4oa//x214P/+cf/KNn/ybsZ7eAfV/2UjmkS6IJBOPgGaiw4hrghTumajv9CrdZ1kJzfIglek9Wdu8G4nfOAbWGwijsiXGlDDVBEd56iQszQS8GKcK1A1Ln60l/KXzGUFJsKrx18m1vyX0Wwvdr6SCMkguxEs45GuzW+2HsH6Y8MKFi/rJ59jN7geaJIhNQdHGsq3kDPJpOwvZ6WTIxtCW3sGhTt4v46otAjIRU4tmGUxgYVp8Jo+QfZgWjpgJMQN6E+dGQl2eAf1f0DL1tvrzrPS2O5XL0g9SstfxDBd0kKjAI3YABLRv5TYT02F5m5dZ1MoADSuDOLO73n0FIEw3dcGk35boNE8YvATgSN0tvHto9QTeldBKuWHwdNV7Gw9ZFr5xoyEbDW11abB9WvafjRvvdscPPPDA8e746vHVw6OjS5cu3XnnXYeHh+IiG8Z7t9s9cvmRK1eu7K7uDg+PLl26/c477zw8PIw8bJ67D+nVq7uLh4dkx/uSuTozMdteysckSluPBbY4Cyxrwue4i5lr8o6Vw1e+q49p/zdV9AlG+JH1f7RvcKyFF5n54Oxu3SMNXdnr54OR7r6HwBgl/TfyMA9id8YMmy1rZvcA0CVwMO1dltg0Ac+xoU7z+Z/7n9rvCz//T6790N+E3gV1Vg0iYlerQMrQi8v3PHrnA8+Ydai6zVIUjekpxLvLmO82hgkMC62uO92GuHxBTBqmiF51sfkaxh1Bc6JWpK+kJiIJRk5QhpW9CYTRwJ8kyyYiw1K4qd8ErRSXpO5AjwYbf1rDA4SWmBKea3jdvNdAH+Te7hR0wO1k7JruzWgPXDHzoj+MXEj9LrLBAJuGu96Be+Dehr7kDffgy5u4hq+ewGyqL1ZpKXjgHeWFB3xF7WQ7pADpb7AMXKSHJDz2AQZgwS/hMLO+SEi6kCESvl3D1A5EIHOpE4Q0ql7Kk87My3KFgVJ20JLgHRHR2UZ9c4TKR90wJPjyJ7peDuAJd7i3IdXTOzVRGSzSzxCNYTPlLLcDRWHlzgDeELiCaVCEUx6JKeDUmIfKPIpTIWSnAmFPQTS5oxMfBaZl4XW1oNGquNuZSR3X2ij264EHPvbww5fvvPPOO++8q8WWHnzowcuXH3nRi1506dIlEN7e3oMPPvjI5cuXLl265957iGi32+12u3e84x2vfe1rDg8Pm/43OWamdSVm3u2OSQ/Bsl4L2cEQ6CRu+rLBMliJ7oGZaataGb7n3bnVptQ/c+9fI6IfeeB/aZnJp0fu2zbQVWqrD5wZPjjULbRvR0QDtmCvMmIvtOWhnuTw4mN3EppQ7QmLKMpzqgKNHa9Y7Y3LmNQUFr6tbsi76iwlBQEb4xFc9qqcZoKxw6sg+N/d8/4/osvERPfS33nwx2b96ffVCE4q3xJvNQG9splJGcnAyRjMJxmI42UhageIFpONcKqZssgtC9ie0APlcNjFmB1DgJh+waIWVj+KE+dnmYraaLRXiya6P8x6UIHSAxsTcNx1JZE6tn96LTwQPhTL64BGljIx8Db4HdgMo3s3J4RZ1RFv6kJAMyL29hwDysJ6uJyyqs2ANDgbgMyaNaAkiSXWFqt8eChD5bm996zd3Hc1a4txin7UsMApFUb8wDHBXctEZN/OafbPoFh6PzdgDOPYVDUwQ15DAN+EwE5DeiqUAlp61oZGuW6rmO7+HS36wjDDcaOLQiWyv9rMEikkFzYJc7i4GMeWViAq3+qkIgcLiK3r1vO/I3+vVfY0etr/nf5vttDloXuoPH730HawIoUoHDowC/MaoJjIqocXt24LM62rLf8Rta8OBr70n5cvP/zwww/ff//9h4eHyge+dOn2d7/nPY88cvnSpdspXpcvX758+eEX33ffpUuXkJ9333XnxcPDSLbGC1ebWZm3aMO9iKzQsT7oycxkRa4UGzAWuzhR10jV2OLiZcFHfaKlXv+3X/zX6SoR0c88/6//yB/+U20LXlBiKEjFvVNtobW4cjLotVDQT0E5xsAreCVwzAHEZPcWzDPQj3qrN+bqckdUxoLhqzwH+FAfilzdGsQ4YamSk9kqX/vhnzr/s/8jEV374Z+yUpWzz1VVvl9Fz8cV2Zt9LLr/qrnKYReVUMipViWZX1mlzZow/xD2XpmJidc44vf+8U9Fr+3NdW1dSE122RdQRkjGt5HB3Jc14CPtHTg1c86hQX3PZnhaSPLQks2iXfeBxI1pwOTi8VYK8YQsLqnhboqxAqwcWsMtwlqdW1R1NICNB3nPA9SrsMpB5kNvZSEW6IOOzhjfUuMZmrd3CeXatWsXLlyIdKFGWOiVie0lL9/F63+zZJkNkjEU5Bmbe+2fNwmwvDPMDULbzs5n8OB2AAamo61i7kAUKgy2MYpunIvGQS9SfJLAFHVN3/wDpWTms/0x65IqLW3tSi0sMIw6lgIw1DoJNsXTBdYEbWdygPmsGGoWkYroypftcEM6cMcOleilbHT6PCC0nnZcheYi6/E1Q85PuZlaWpZlXVfbRLWuQrSqzvc41rqufduBC4OPRJvsPvzwwy95yUuOjo6oA74uxHfdeecHPvjBF73oRTq+TCS73e6DH/zgK17xikuXLlEfiV5hO+PKtru66Rch5qtXrx4eXoxNx1EQnep0g+iHRdSGYXoFJHWqk4Oth/ZlFdMg0A1VXXd+EZ3k+0Rp0isdXrPVMI/zbGzyhCdlp5UCaCTcDC1qjQ6eVIGRF7FTJcQxZ1ziS88WO/QLL3h9u/nBj/yqZWrfOlx1xtKn4PYNwQC2QuX46PqP/BT5WLPJcKSnxG01Jnj1Qy/9o3svt+c4vEMfUzLWNhO8ssVBpg0IGKZmovC9LAlmEENcQgunL2Egjh8JEFZXXc4Nxs6UyHWQmUIk4F+UjqG2nkGd2R7sM1ALu2Aj2YHRe8PlM24YQeZ3sen2L7Spj9j+2WuUEBxYfp2hcWAjuHxV584yzlCp7sVoRkhbAdGXlEOdnWMs8nahWYNhg6UT+AU8YZs36CuIIeYaVQwxqyOvWg0ZVqUExRWoa5aNF1qWFuhamc/QcInI0o7nAGvJ4NOj48ilrQgJEcAD7L6neDTHKxSFVuHoMhIiOWusk9RnRVFMlCAXM/WPRaxWEbpnVpzDIsTLgjBzjEWNKSuYJwsjxShCHwVxT0BE6R1AYCsb3Aw4qdfsLGb46CFBVdYvX/q00WmAU3yPmoK/tbPYeN2hLKo9B2E9Pt7tdrsWppK1lZfWyOHhxcOLFzTs16s9Pn7i8PDiLUeHV65c2e12x7tjIrp06dIdDW91o9iZ8ed//ucmIFceu0LMX/ziF60jt956C8N6JesrhyqBHX0HA5EtYnS5faUp4NFoAcBIDE4RzpTr9DPzd37gn/3r5/0k5rN5PgCRMMHC1icrnhzzjnl6U3qORh8RNKtIKpSqjWk48ipQ6H4IAJNUwKvzTv0JFuGca7hrWf7sJHtiAmhF5BOnRFXsWolEQwo3GzkQQsUYTd3P333gx8Pv7GHysZyzeoZrlhMcMfd5NgX/bL5ZogXzbGp1xNBJJ5XRxoRVM5F22g13c1EsoZZX8mFRVDK+GUZKcMKfctoLJYIl92IFNV0wAUJrzIwZTJiR5tSv8q0usKXQLrQFdYadZFDv6bd8CTJHiDixWqh93My4o3sPsODItDQc2RKxjJu3uv3cop2x3bHRzt5BupDOfoMC0VY0uMOO5JdNitRodHeybRIRb3j3XZ2jDw+09h1afef7wu0QtLG5Yn2QTDY6J/oiKYJCmE0UFriT3UAVQ4UU4MdZDjBFvELi1m3pNTBgCAtidd8XV9yaSVUD3Zvqu+bU1ZG1aEBKGb0CaFsR6sVsxgKYO0YOiMh/T//o/83/LRH9F/T3TRpzyE0FpVfYvUumVkfdY3LGZUUjCkNppX6/iDwpXc7MJAtIlY6TCBFduXLFB29hWQ3U8vFuZ90y4h977LHdbveud72LiC5dunR4eEhM7373u+64dOkVr3hFr4dISHZXd+95z3scKxERyXvec8UEwvInBurfUbwt0yx5fDBadkvuIz5sPOrXoub1jb/3P7QMV/VJhCBqFNRZN7of+N6H7v23z53QK/jFibIvVvPVq1fZKQuZhTSA2MdYUlmoLZvLxdQkQBlLSeApBQWXAZbloXKHqTr+u8dM9/ZnX/jCF1J3xVeGKXpWs8uzForriSd2Y56B1FzDKYAFromEf8cfG9epGhp+il52D19qd7IMKODCQUQnrgsaZ16YebfbjTOEnrEIr2K2JT3Ed7cLRIsJ3sRIp1Ul5aN8Sfo33AbfNpRjJUBykYxFRgoeffTRo6OjDdp6zWKx0Cbep5IWCD0yFVMsct/hHtanSpTzb1hIz2HGgRRSYnGVhU2glfonfe/ptevXnvrUp7oVhgWQRIwtBzEpNPbIiNkK3AvbYQMyOXbLpNEXiMb9fTotZxLhRZZlYZZlYWZbGgoBLTNTKi0TtI3o3ZFA6jS1Jc6QQHEomUhf70922/KfHUMLIg3QYfgBGpG2CtsdIjg0g03mG4j87KuQTStktUoenfJIWdhQ0sfMQhEYsUO0pK0o6mL6L+n/lJYC2/qOvT8oTkBDdRlp4c6twFq3s911NTy7MD/Z3yhsAHEVzeyD3RmOFmQhksPDw1akj5kWuXLlz4+OjjrV2t/dbnd4eHhf34DV67nrrrvf/a53Xb78yJ13fp22xYeHh697/etkbTCAHnzwwcPDi894+jNsTC9evBBmeKa4slKc/Hl8A5IoXlv+ts4VrD8YJyYwMeff+vO94OHR9df4KXwMqIcXjm+Dy7946b8moU9876d+4v0/mpke6MfkQBsQttxyy5GlWt4VuAEmMLkH1MBgdbsVCedEcJdB7VuX3tR0KwfgbANdtdxtKL/nKfxxnZPcdtttE/+NHk5gPSeY+PJCG8N89tZbbxmJShjrFEDHi58i8+lrqwrn+iOYVnsq7TujIrB5EREFltJDHArKExsXIrrjF3+6/bj2135qm1SMn2nxhKLylSE+oKW4i40SG2G9iYnonzz3/9Vu/rOH/kuKkmOdipZjMiiASq1TmJQMQruWfNJef3TbbbfFFKSEY+XKOhT5ocLh4vQYDfvAPySbU7nTSKkFKeACvyyFtYH2FT66sRLFZXIL3fKlL129cOECUZLVqiFSp6lbsWJsK4F+w0sOcQALRqEyMAFJ9m+fBSws2leR1c7yELmhkwpWZBH2oWZIqqgg4f400wOc1Ff2qM4v2ZTHWyL9FqGhim477C1TCFkp5OrzVzvWnRfSNbIWzDEI1bZeLR3T9EdiwIuImBaSlRT6KFKxETVQBWEqG7MQAAPCEE4BO1q6UgI7vbTgCijQzEVAWh1xY2in9133sDPJKn4WK0lbJH3yyeYIV9jb3rCdRqoWkRtEdOXKnxM1pvmXiI6Pjy9fvvyKV7yCfRWPiejSpUuXL1+GDVhMRIeHFw+PDo+Pjyleh4eH1JZ1iY6Pn/jqZzz98PCi2ZrGX4DU/i6nYBBY/8xMA0wZ9qAsDAFC6XGWhtGdVjk3lRvN4mjB/5AeYu6TTRvKIbS+gNpDD4ZL+9/1vGVP/SzsnBsahPLeirS9j4jSgkXWn3NYoWBlocxPvQOlIiIm/rsP/IrGMEIAD5Ccf+ABXKAMXZwOdBtOXd+YZRvtYOhUdRWZy8brwqdCcmP9ODpEfSj7mYxCi9Cavl6Q7JXkCMHWZRkv/NtfvvbqN6IDS6gidSd+K8bc6khVWoW3boVbbasAhe+id4IHlVheiwhBHpqO2lB9n2BImBAhFueQgoQzT4AXW8jAX+cyw5LwwRaJVrdJWDKPtnfWL7QufTvrAMenTQemjTGSMY8ldjaG6tV8EbPZ2xjPSyS1RR70qjMCMVBSZNrSWhfCig3S2CrrysviSItkWZgXJu4H0y9BG9iMVSJbihkapiTIREMlHdnafu+xCVbwu/SN+XogPeu7j7zQsjC1nTTUpL3ZywYAFX2g0OvYG+huaYjBezabmrNowQ7m7AZ8Sm+L2PeKUfA4wkzGXdZrvNfDX0UpEms0ZpZUVn/691LarAUiPT4QisCaMomIH5GfR9Ht0MrMz3rWs6hjLGlyQ8zHx7sHHnjozjvvbEDKTB8RtcOu3v3udyP5ly9fPj4+vv3S7aLyhda1NbjbHbczGig8dbb0IDCRaPRT79sfT5P4X9FmbzT/l9gLVyi7wBEJ6esOWlPjlXMTr2/ie4ntCVvBQX9KysNlUucopb/OUzWsRVQpQDX0ScxjRbon0ICoGwmnlMRFN+wDEEVHns+Jb6Fpq8r6zqL9QONkKyCqfdCt2N9qWBczKUzUw4r6X1DJppdadsFsM35qA3svqlPnI7V5LbHRJfVIbRqZEkVxahtGSrKXojaiiUyKNpHzeLs4/lFbITN+C2WEzlgndEpv+rj5T+1I/7KJdqQp5qbADP9RosF67d03OpvQDvoHAoD61XfQEhGzeT7TiW0JCfB6qBkzins8m5tbX4rDnLHjmQlGsP/MUpFGbeyIWmYh6ut22CMB15VNH8dVLDU4NOQEoarQBpnz3dJaNebUQx5RmIVtr1U7lIFNyaQbKwnSAmKpKcpgIy/xCsUGdQoH2u6SdaEgGGSIzb9FqMEeXenD9z5dmW0dkLiDBmJa1CU4KRY0bbAiRpW6EAkRkb0d0I5o6g2GM80bJKIQr7Kx7J1VYbEMRNV3byS8ZhhrayQJwHBKsN3nLoquRLerLAs9+aS6xS7UIn0bcsdWLcqlBIPG9qMTiIi++7tf+c53/ubR0dFdd911fHxMxH/+539+111333vv89pS49Xd7oEHDW/J/fe/4gMf+MCv/ptfvfuuu46Pj3e73fFud9ddd91xxx1Kqjaq7wUeHx+T9NcMCeyLYUU/A9Zf/4RFwygbp7hOm9NFl6gPOns6L3ztLT9M7/4tEiLYMWalVCSyuf2J9/74kLm3INofogV/TOiHuavYg1nvRmuFhLWG8ttVo7lWhVJNzFGHlmdZdDY6IaaXbaPJmFMlv4tCa0t6GveornRfIdYRSjKMvUYqmCXBWRCzsobc/bKJU1+1uZ/lvKlsHCP6dvpNf0o+SrKuxHzhn/wP7eeX/rP/fG8zhiG+9Oo3TvOYztomBhrk10jSseuhX47qNlSTKlJTb8n8XfTdj9MjIScXr+TxpML5FTFWX0jpS0L6RYXel96qeqxiDNVJNzFvplmtStVcmAVtkSem/OZZauuhwyRk70T3V6nYqiEYpAFO1bVafr/nqGag49YC60lY1BaArl27frEtEZK5eGWZJD9rvjJndtBQqP/IDjL7WXZEzYO+ndUOOeEQuNK/ja9LQ5DsULsHCdMQS0FPsf8dUgxUOWUMMKM0L/5IhLleIsQyfUuUulvcq2QVhn1LohuHOJzRwFqPYcA+cn24e8RE5c9a6bYmbKkzvxuWCLVFo39cHxwhV1xkpJw/IC0FaeuaEYb2izrOFOon1vb5AbDXB9JbJCJ9/fCOO+544xvf8NnPfvb4+Pjo6Ojw8Ojee5/XwJDJ+m53vNsdE11i5qOjo/vvv//4+PiRy5cbqLrzzjtdHMTRZMCj6utZ+oKpixGhMKw2iUFWDJtPNy7e+HXaYm0wW6OvuB+tyHADhRu7VNpHRSKwPPbmwcb1xBNP3HLLrR1flqcqRyJg0pOJ0xlP2nSF3WnKxKjDzPGYCyaDKa3AHtSrqidd6Ug3RPusrPsK154zikIVY5E9Ihilbl7hxHawDjD/S9RTlp+SYykbGvebAluzCqdZ4B50Z3QObXfE0vU/lmYR4WWh33qnzf2rjyAlYuTaX//bX/ziF2+99dZQZ8xTUzh1XTr43U/wwMP2TXvTilBR4ayJfuihn3QXq4sKqHTUlYWST530qKJcg0DaAXxjq7DYaiiUlsCYYMfQx1kvMwUi49CoCmNHWEGG0qC5hERhZ3CpWsossV2TMcWYJXIyYqzG/xZNxXHtbIlIaLwxG8J4BLzyEdBVEFp9vZpoD3t9jhZ7mWxvtcNSLGf/25YL21Hvy8LLQkvBTApUmAwP9W+nRFBFo0FDvKX09wxn+7dxmsJJp6kjoQ5zR5hmbxQuGqdpxzGorelbuCwk65rcmuaOnNy1rwE/MfXjpcREwuYJCQA5OIhnQIxXk40UoBox5fynHqt65sy6rnRDdb4r1+o5+7yWF6YbKri6Savv1gITw4qDOiVHR0d33303qeCpCjVMRg1Radne91tuObz3efdgYq85bDvo6cfHTxweHmFGVninPzU26UfIZkRVSUV5hX0nj937s627lx74kX0FtfIGBPTLn6Zkres5M2Xn3CNwJvBTww4nLMmYT6zfYNLGPPNeQIZ4VH2NEd2QCWebEfIv1M+4p8iNmDXNk7EhtcXgOP10QZeQNo+C35kQTW1cAosjOhntlDCIYoIaoJu9eGmmA/mRjk2BTEZdQq08/osyn+syd37xH/23QnT17/w9tm0L4GDdCX3Xq+iPPk7FGIyILfd07FTWxyjbqjhQqmuzDdAIeXWIJgxM9hBLEZz2RA2iwUOR7bBWeamKO2hLlARnBOktQtvXDCIQCb3oaftgXon+e+E+qTFj6CcFxswdysYc0tzs2KDat6FJCf8oRhHu/NZZjQjxIrUuMPzp7wwCVGBQiplRUqQFtlL8uzuBPUPXenqMkoq2XOEgyyCkW4lI/+NlWdrukR7R6ajSWBF7zml0MhysrEdzMPpdhKwysqe48uislbdRMcgiPR9zCGL5+eaWM4eOhPpUVqGfAq9mujXyJPSh9Z5vWT62rikUKatvk7fV9xCvCls541MlDKXfcM8WPmgQZoK02kyU21tDrfK+Dtg39S8iN9qThZdVbpByrLkZRHLtEzrQLC6Es40Cuzw2mtvB0ADNiumCVqrTAgaI3G52u11/k7mJI8BWK6iZvRLjKk2uQANX/5DKCo8EV6ZJ60TgY7ooHEan5Tj3FT9NxE9+/iegZYFTGCp3BjVP0vG+Lp/pVo7FAUJSg11DRbWcbGv/xvWE/NRm62TIms5ERjeR4JiQiC68qAlmzpUKFkm1x9kup951m6gaWn/KF70msA7rKr0Rpg92eWwhl83iXKfmOn3ILvx//z8t6eJ/94++9Hf/LhH1wIFqigJKYpZrf+vvyG/+Bn3Xd0eCRp1CZmaW62wzHtKoDwKvxkUiP4PbK2Q4/W6ECUaI6BLhYDJ14CSe/DwOWsl/ofRmgD9lAqvoHAHKQ1WCmdnMZNIsyeIf+lKQAYBSYm3WKCqnkLFDlFpRZ0H6Cb1W1DSOYDwyTun9XbTjli2+AdDX9KCPMrFUCCvl/PmDL33pSxcuXCCNggN8qrBOF6tC6XARQJU39UlyidxLSga2w6kMbqx3laQWPlG61/CUqd/0RKAZ1Srh+2xWhvrOdhsexRL8qwuZDls4+LvZf9GjREXlSux9wC5iRG5u+pa0H/nNe0iI6Hn/8v4/VHhDTLTCtiubWeHcl80dBMgVSYW+1Bliv9Y6nfAnwxcGzc7CdJzbJH+VFTltw4PHT6hmBqs92vu+RBqtp5ofHNGReKM8K8lutzs8vDgDCk2AYIgX7CCsgIQJGJhy1BVsPUl46cPGS5Z8alR3uuP879xT395aO/PUf7n+5V8BaG4FBf9FyqNaZ95EI0sAg2Zgq9VsOSnlHDCQpPRwGKn1dcIzsNQOn4YmVDZ05kpQqvLyrN97ZSK5KP9dS/7S8nfQfXlJMdNzQ7249YXNXBAJGhalM3HAEUDsReJ2hN8hQ8mpyEQpxg6PNiqNr+fsgAPdODoG9OLqGkX4la8aamIgbCZOweWAelpbKw481Iz0MJFjIMyGtkqbSBRi60RgWMLcIGRvQyixSNGnCYBu7t43ogANqBpAJfO69l3JAkEWNPLgfdXZDN1Myo4ylrtAFD8Tp54tmOg8LMjizHp1eEAAYhNCLqkt647DRb+TQBzt79BRv4M+mm4G7RMT0b6TxxiCn2oOVf/Tbz5oN//ph6+FDTU+NFHyXQpGwyUhp+4SJqLlTItk6csVYbtnBNMM3YjzlkHTU5iNiwybNdgGO9KDRqnvT+zuX6EJtciUrfoJhjqUXbDrTdEDNCREIH3gy37uo7o/iVQlGrqy8e7RLt/wjuM3LBH25TBERSbGhv9Q3CyDhaSw2thK+IJe+yqO1bwsy7qSyJMNb+trl0JMvLDcWPVLz60/Yi/cxUEbVZdl7QcBJNoQ5FhmLJj4g1wSkd1ud+nSJbO5IitMYqF1PeVVcS0HhuuHEygsEPSRAwHI3Qr/DOmDl2qcZK84EBr0kBda20DqcGkxbGXUh9Gr5TeKASKPpmEoC0UQZAw9DRZfrUbwAXFYS1Lpf/y2z7ebv/17X5GojYDDYTeRmblIG8c1Gd0+c4F+ybvcpz4DfFtsUmUvepodNFb0WC9yL7E08a1iXcEE41lMzviyKFNAshmw8vEyH/Glv/9fXPhn/5SIr/7Vn2TCV1iICM2RmTJ3TjBMo2z0DMqHZHLRQJHGrrDOLC047oqxMo4nNRq4ApS9nRA5knIw4AAuMC+Y6+HwrQyXo2qzDTeE0hvkWpcFR8vvk4vN81ImwgkPsy28IA+w7yEqFh0tBvg1D8efWGsQMHV6XnN6VvySmGz98g6I9l2a5dPddkmcQbOwdCNGkomzIeH21NqN3+2VyC4ioseWJ4ELCji0roFBNii9K73pvsGDqb/1SYqnbIlQQA4Z5L+WEG3ZOjJkK8w+1Siq/inGs5ZiB42OS4SBXxgNIrUd/a9hMibdttUxUxsWgl0XQmsDW2/5JvnXv+WqwISwn90k0Zoa9ZumMIU5S/GqvOdfE4mIVzBXqQbob5cODec0mMXr2psQWXnhtiurV2KayZ0D1IPEsix848aqQ2Hi3syTN01EvCyy2odim/j4B81haGn0OgwBPMBYwky73fHBwdcgQ0jhqwSV00F1pVIG9ib0+Cjwb522YDHsjr/qwR/rP6YfXw9fDrHu4XNmi14Fk3fy+Ted+Yp/SSQ3Pv8TSqdhQZ8BwOh8GVewR4PqEgxoWpIIxZPqUu+lvduRofPM57+L/oz4olZj/tgKluT5v2ma5jIYPb7KFxPJomtgsEsaxr83miJ8QW2H6UHaFN/+Hc137Ib3bkTkobNF4U5UdoEANO1PXdj0lJm+9JN/nQh6Ragpls15BWQHsDVGRyZXk9/uqUy7jXPRxwzCEFB7dr0gdWUGhXFmPYdhQ+ANw8P9nZ9UXdHlIcVlVHfDcP90Hfdf3cs2bj71qU/9i7/4/FOe8lSs24bA4Xt/ujozYHQMV0VTEYYYHGWfNiiIbCNrbzva/xkLa1ew9e6ZQWoDqMIOEdkSkz7n5jSNBhOALbkyhvS+LAv1Q7xsITBtqmPljJPuC1PJsnJA0XpCW6vVMFdirEEwJhFDzN31tQy2dwJb0oGzR6Ph5aW5hGj0IiYuSoEhnTyFn8GmCjO3twgJZcVTuNsdo1taFCu3ZA2Y+w8sC8Co/xUi+pn7P0oqzaJZkZhGZPeNHo3USQZYLZF2tnsd0DJ71LI6tNKOjIGrgLTMNBEvS/uQMxP1L1D2BcG+WW0hutGN9doCVevCfENuOLSSauoQjJVvOTeUYBe6KCjrz+MjQuFo7D8+Pr548cKQrWdl/v/T9ufhm25XWSB8r/0ryKmqc3KGDIAdhgCKftclYZSWIUACYgMC0owqQ3AAFYcwqN1On4q2AwgK2g6fImArgkh3hA+hScIclYQheH2KggwBEgg5VZWcqjqH1Pus74813Wvv/f7qxO5+cvKr532ePay99hruvfbw2LnkEtC5jpAorpJ6B0AHMH0Prug5Y67PXFKEC61tX0rls8W96NON32WGmKiC23cu2vWg5SVWCKflfpmQ7cJ8eudHpuXPTNy+BfSM//idAH7t//XbV/V2s9J3r2zrSoZEjdt5yRnSXr36DXbz1JOfbYm9usIXrhpP4pMekK8H8NTFZwviPAIy5UQDHGPRlIGdikRDssYiRmPEAukMWQSgZzwDGuYJ8mBTmMLtla0vIhcHAA7z5ABmMtxseQtdJR6aCF47Nz3F3GxeVhxj2YAbIL4dWVE+N7/VYdZ8hWna8HxCG1pCXiJHlrPc/nZkuO/V9hpdxQTgr9Rl0+D26lDAQx2ZpaOrcE+1tpXsfLQrHI1XorMc7XEhuxqbiXGXGCsloxvy8Bsq1jTP8+Q606lKdbJ4IizS0NZ77TdnyX7jh/+W53zvv3/qqafsMHeyM0B+7FO3OtiY1o/FBoq1YovTF3aRvbpkpwGvB8tcUTOgFsTymJYbTP8P6BmJz6NPWDby4nG3wzMPiSFLgiUu47sII9pkVSIBiZ2dE3k9cyItoehI/a1V7V6sfe+ZbKuCsZRbtDYnZfSFKekQrUMiCquYSCEdw6rPmlLeIFRBt+BYCVCejJyqYwHq0yn9LtuvKnaMcRyBQtyBHLVogwEc962/Hb73VZaRy2yW2Fj35lbUqg227ty5ff369TKjvQrENygUMSyjtWtRo9+UJdsrUYck8yF7+ysFqZfJSm6GsiMGt4aVgLWo8rtRlnh2X3r2xjTvz/gpBY7piz2Uxc3fAz/6L/HkmwE88EP/6KkP+TxOltJxHl0pgI/Ar3uTPAXgU//dA33oRhP3fgmAB37+lQCefJePhHw3cAvAIF9bNwE/Uk2euvgc8iK2jScdT5dGBWqUmLLdxrjkjCOZBImouUsqIYV89hmGISYILunJ4K2oDG2hwll8HFxAJKsCogqEgeJiKfNcXVYqk+4vpuA+l8iwTVMiUNrck0yIn+1Y/0J12clTa6v8eSRxGS1ZaZUbBnZTfGvgrr26+eGLEWjgRH+9TfZk5Pb2DakpPKH+vRJiyxRuiGRroc1fTJM8VGRKwBQknoaBVBMpkTvl9MLdGVXzAj4SyMbET76+4oXvB9yTD3+/P/xdP5SamCDYb/xrI5P8N1FBOVAJ2lWAP/VjXnvfRKqcEQ7fJv8ytyyzEKIyVJWm9TJxXQDQBndOAi/CCCETzGmqhLRprc+B3EU4xtBIx9glUUsIrkQMq+S7g5WyzmnhpqWOwsg0pJgC6SCE5KOfydyzA+ZmMhKaAlpsyzpKm6Fb5iq2RhtTP0QgfmrdESM1UT3RcjEYQhpj2IRg6rYIbyHc2IKJ5uXS86+YH1xIgWb7fCERcJBtjOwBr9fzrhJJj9leI71guuANcU/LcBukaw41HFSBUZY675notIUVVXJagbldXnhXPAl75inJVN7vGmPUcE75wz4+wYFin2nWvL2uAyagca9I/ZRXPSNtVLZm4bMA+sAPf7U9feDJm0/+hgcljsdhr79iLHQcIICKpiYkzqiK0tQGrOUIVpSXEZfojk4vkTFd1M2SzgpC1NDVUroxswb06ZVN1UWRcKV8z6NKxNnIlAzUEcozXJx922qUv5mI9NIGDZl8DUL1O4vBhLG4pMvckrSx0ORmisYEuCALT96d7apSUU/zilyaU03CnR54IsUUS2PnFajxl9tixqTRRrYOVMLEkAkZ16/WUnWn6OzWifPSuzjNb1hv2IGTtaZqGWDnpYyolmYul4sOvv9jPuzjX/XaytUXV+0sCTcTLP8iotDRguVKJC8G1gqYn9T9sA/bCeObyQaq25NRm5Q1Vo1zUQWA3OSVuyeWtPvVnkzy34zEbsWI3GeK0BzlKANaWh2HFCz2IjBsdLDmaJb+yYqmkV+MbtMElyhnnInJXyFXPQloaMV++dt/K4AveevvDD5WFcs4smtOeYKORGSInMYYx3EvpgKtwSmgSrYmW1HmL5m69ErDWJGaeiAXMCbFVcNUWDMWgIevAES3puD2PMZwG8YQoRa4kNjFnxmimbqTy8uuMnLzxeOGbHwa7sVeF42dsnThoc87vHIpfWe66T72K6YyRHglgsIChIAIfu0DPu0ZP/j/2ZTmLUgHZq/Glk+WoL4C1RwJN0Ny3COAjI8G/tNUbyK6oKjtpilKPOGGpTHbPzGNNVFl2HJwDYEJVS1RpKPG7GlDn2n6sXrcbPB6l9PCm7mqdoUB3hXLP8P7llXc+cuwgU5n++LkXDG9Omv9w3SGV0s2liaZE8k+1TopjeK+E9paql4ImBy21TDo7VYXyrWG8FRjRSZ1zZROhneYsC/TRbxz92LptdB0VTkmD8ZPaiuTa+TRdcfQ+2t6y4yskmX+P8kt9VyXNIWW3d+oFdXTey1swkqzTrkAfNT3/Pu7qlcfeMCOmRUhjjNpZ670tj4LjHmFa3CcDtErm8ycApa8akPT4NqkOiL+MS7/hI4YHHNstO0yr4RcOckRFtlYLbyKjJn9vaK0k5Y+Dhot22Ai5XVHuKqkTaaVWGk3QyErbI5aHECSmj8rfh5vE0KlvXbd0GbEa0jhLwu7UGujB1X1JW//t+3Z17/9Kz/nrR+JjqKKeUvEnkIp1b02RWir4yE6hk3ncTzMY1fHAfuEcyxs1xT9mpHvRnkXnfa+CDu4kO0sk2gX1itR8m07BEvWAorzQZDZN4KwSUq62kYd0KXtvggmbc9KwyVXSUV9Vt20GyJjYdBGSUi/sm6d9KqKcRmblHbTEaxXgIpcNGzkVqQcJYBf+9DfT20uC4SCOzyaXE8oVafE3dQ5y2Ka63mf/I2/U0SefPKPwD7p1dpEeYPLAU00/EIcTb3v32gswmrGhwXdXEJB69O4dlL/yabXwttGHKZO2FtGQg/ThN1KPzc/5XOl59wlVHhWvo5CzdbZ991nfekIrFkGG94EVLTjYCCK41l/Kx3xxc2Xkp8VBLpiYOQ3JcI06mg8qDs6/vBgiVk0C2EooxZjoor4AZhrhyn/6h1csm3rTIpO4RK49qmzVGJtVjq+y+1SRkFAfLzPjIFGs+fZSWtR2rla4JiLdntBNKIGL9vyj52gXAbmo5anRWbFEL5KEb7ke/99liMSow47gNKoJp9+nlkViHGMtckVk4TVMzsEFj5n10cGmuLrkSIiJB6RJs+AJlHv5Sxvq4Jyamvtq/u4/En7Gd8inDcP8hMk5AJJXow/GuoyQiVhlqAFusRLOAO20gwdBL+Akq0elt+Yx7JQkpvIrCciO7OMtagTQExvIa4pF41WSKxDQdS2TMaWKCSI5IHvpqcbT3YGV9mINffYZS4C+BXoHnfu3Ll2/TowAJHwW5w/CxXxLZZMWMqAlbyzVOeRypp0aX7PmHl5WaLQDTk/rR6frglBVHBUXPfvBwTnUxvyxyUZZcRJuwBy0aqkYOVAHAtWE+pKEMYa9BY9S0awzrlJAeTJ3/LHovIYnCCzSL6inQq9dQz4NDNOxNP0NxmKKID+0VKZYYNmCakuejKj71dlKBwITymNFaywpKXsTBGPXjacbLdezyWDMZC1ZG4UW9LKUdU5xGquqFvgFO/WOh4aZGBvDIodRpxOYjlsR1HUuXSeVNa+H5+F9SOZoZED8065CCrK1tFaKjb+h297WqpDrGIsj794tcIcFBrUlFQ3egdPkpCyT1aqlTyzoYN1oYRpdpp/Jpa2gib5+Buv/yx7/qXv9PVAdqJWb5o8x+3WulFTNgCUK0+d5TkJTw/A8Lrxs0PFyfhTa2b06bAguVNKGr5lZ++5S+IosbIeDqfER5MGNPKvLLGVdOXEjeQ6CBUwnfPDPYTqBuMMDksYIFA/aDQWNXclp1dpkb3VAadAkuRcECUY3s97K2wUJK3RV1rq3vh15vj/vmi97xwsFBWZXvLWFzPSWmEWZ0x4Xgf75Jo8gUjsIjzUVtiMMYDjOJzQ4wj4EuyFxOnjHVCWLu2j06VYZHydnuZvXAJZtjSMrdd4+/bt5zznOVFas4/CxQqgtdp9ukZAz+XNf/PForn+3NlWsveAbTCe7cJUSBRLbqYrfLMFvS5E5HlJsNZiMODAuMgyQzmrf7sJaMWGpxsBaCzjeuC1J3eq8uuoE+ELNhiDuRSynpwsmN2ukii1TM1hh5hI1RhACsXYLGuqhgZg3V9X+sxnQutGrACExhESy8CrlCvwkNV29qSQqnMv4Nl2jkh1+EIWI1xFfn5qi/Oc/8zGxgtaGaPVU+7Zj81QTQAdckEAnbkh0Y9xX5CZY+Ar7hFyBACOGNhsOdaMR1fh5N5+MqEpByPRXY+wKvVRa1tVPJXYKiPdnNpwxokyzmjtUtUIJzPSDAWPLbgQ+a6fe5Y+MBVuJRdqUmgeTre1OyDSRxMbWbvPlwl2wkXk7p07DzzjGQ03zGpLUKyc48SY5nYbY1RC4FbR5hLqntQjBk49TBPYS+LeTarQiVlUjaagSj7xKlutl9C0e3IGh9F1JRsyUk+IdxoRaQZVhTMyiQRqgP+ogFYRX09aIKrZkRVvRUrEJFgevBkxSWsVI7ApxPX1916abSFWtRq7EraolTDu9CXJpcljCOBnYgGQITjUnh9HIqvqD9WjTg5LOqjz+kA2e4THDaFCqg1TnvMIBNJv377zvOc9YAcq7D5SYU0IjOXVVB+1Dq3Cz1S7FPw2JpDlifuqSUGj9SUGZ8ox4UFgfR8bhdjfj7yohepds5SzLHzhlkWFcgXYbrlYWqxRpCBb8jRNy2RxiGYkSY3s1r9VWrZjSuYk2bdrs31A96NK8lBLuDYq5jBBqu3hgYIessS0QB6lmFq1wAe4xXIyoNOgcY0rRHU69e+G8UlsMmR3pakJAnpNhfPShuYrHlmNtlWWOInoCwvqXbn5xbfxfwK4jo9Ohyy5LNqWHndfQiXa/UgWEJ2zuQzHz8t75wNDe0s3ViKRbv7ddYcPCsOMK8fwOkRY61cUCJ68TJChEZZOuWrZZ0hKApwatXHHGZkL2oTSj9xRpApRPR56Z7w1KzGc1FwhkzQ1cit4togKFepbfb8dwWyLuwqD5rBMoiohtnRMydyfmQaX6T7FlLqQRz8k61qr0h2GNXAf6ZpC84ND/OgDhD0Pva7ZsxSAVkHDcMXMMnrxs7XxDIraleA/sz5cEZEMGqH8egEpQXVH8t1tYSzXt4EagyDulbQaDBqs/Xbk0oSrlihUId8MiSVtnX89+wq5AlWE99tMDzkf8psSfV48xWCMwQI3hhyxXHcMOQK6JP3M4VTtXXhohVaeSf0IOOPFGlrS6Nu9xbNi79y5fe3aVRHuo0lhahKNa1gYpUTM07xWx7bJ24R9acyMEiJHGeI6Z3pbttGQyxuapYxW7zsFGyZMVc1+N6JQEh6CzBAJhmcu6zy6uvl7crflYYIwOjGDWdTpDbuDsnGN3t2IrQGdRLcy0UDQsHwb9eFip+LYQCOJJGNZfogGoOMG2DagHp81f5i9F6I5CbA2drjDzWlahFrVrEcmU+ZS9toSmV6vCfCkEBJUhQB4EB/jnKGGx8aH0vSOL9PfSW946kaEzTyLsKYEZTozt10p22Ca2SmcUzemGRDgCBRYTaTAHkugUxWObDZTU5BrNRXe1bPYFElrA+P5LIjqyzCgUCklAiD/w2M/8hO//AJOW06rGiLk9MpCY3d1h7jBnRYAmZJoqieAnFNOsdFq5SS0VC0/1LAwKdxIpRYg11ucsaVehA+9RKSUpVBBzoZpuEEasTS/UPSx7dk5PqJnT94eRcX9Ghuyn1dgW8o19YxtQUhfjvWVQU9YU0s5HLou6Co8x7wpQ6bZwP622p8Bs94GrS6wvGPuhrxJdiwPS2J6rlq83zirKv6dHFfdQeeEjTEuVO0rOha+SmdwHFnOAagM6CkFQu1IiZow2FifsokBy2zaNCm38nkreJfvuG7f9kOwolHH5ISJk16UlludxkZ7PafrnAqdVS1yjl6R6LQAq8iIv2jEBGkZ9+9xlPB8rcx8C8yY22t8y1ve8tBDD9Xj6KxnfMPXWkVPffbnUS4V8Ujnaqzt/tXv85X28wN/7KU1fCQp7QostM8fzMDJ3c5AsCwLv+z1hbjbmLCRSiSEIGrv9xmdt7cR/F6slTvsVlE4d3aFnIexwiXWeQen8tjefcgk2CFqkGJbrjYBSxeS830LGR7HMj23wZEbGRp9JdyRNsQNrrUIFst89iDKJwfzy0ML7EsY2jDWruncCFKTCaBkF/VdzLv207simCwqWTmQ8HDGhEeGonJ8skJbhlZws9yi8yRSvLS3veVit6ZAiy0kpVygnBkzEz/D3goA+RPv+E/mNBSKRbKrJVnK58bNPboxZdwSmwW6evWBp/yTz1nJ4R+/2lxrZ7EVWrjbqOx523fi8yabPNbWxrSDbRk0NfGzHPzY92HLUR2xuMCL9IKeFoRanvRlAD3BbOVCKq4EFEDi0JSSVINEi4VwFaoa3x9LONIUaSKXTsOSNUH+TGyXKDXLz5SeLMbiHLKaedQzbowvLacofrVoE70dohq7CA/JfhpDNCZO8kuFIjLGxel0DwCfhmUuz618LHqd+ozQlVC/jAhiqTetjcVAgHgzNwzI7du3r1+/FsaL35IK1/ENRgOL0FTgfa8ZxOT96m/Xh/SmUbu4WIITz/s6u7mCh49f/KQoM7WiyhkykEM1Njj3axGFcPCMb/3mILzBC2mXkQhO8JPv+w2b2ojR04h/8ouLAzCDMqGrHCpIOjl2Qms/dKgdpW14Ut4Xdab/7J8kvfHGJE0cS7w7wbXGGDOs8Xajy9u8RUlYgDaPQw1X9RgDi9aC9hqLuCgap7nOutOpwWr07xBos7FTydJGVvw4Gbv3EKhqUnhiJd/G3QYacITUhjGl9uDRf2RY/R4Vu1AUzxs+SMkQVZWxftN90vTzRqJX9OijD9+8cePhhx/esbF6lucfRGSNrGw5RtQp5rmXwsf+W3PboBFSX0irQ+jOtmS2DlgeTp6xJQ2Rp0Jbla2KwF1kIHS2B/tr4o9uHjfyJb+1FWK3tmsj1tKmCCXhAYDYkOtQBYEa5xaR4ky6VtXonKWLhKwJJoxTiCWq8HOw0qanfATMcooRbkMpGBcU2NwYm62FRdG0FtMCj2MmI5jDTdfMKaXGhGQp7hKd6mGq3VsvoBNAPJVmN80qBtbypVfMaJeS4SfXI78ul5sHzVMeR6l9+RvBZHbdQ5XspRvLONZZa7vaLFW9ffv29esPUqXWfP9wNRqw3rp5NnbVX3Nfb64y9whv39+Qe94o9uYQzuBD+zyP5urtBbuMYJT9X2i11iSBS6MSnaTaRMRHSESAFBmq1v82n81mSGsymiudunXClPFW+IlJYKCx0nBK2bMUn8/ZUW3S165mYnIshAAXIr4PHTI1H71vuv+rrYWz06K/G4LPgy2AGEsWNmmPBMZBje+En29ymvXKT3yIVyI1TAIAPvCFqmPWpYHCgi2K2C4Dzp8mhHEn0owS+vJEgpLpU0nxSpZyHYxRHvVeyqKzxkHR2KiiOMV9WSFqbrrDFIlFHlXjYxtUe2hrV2qvl6gKg8BhpeTwLP66NHsXDizXWWAr+Da24lekNB5Jf7NVRC0OTUVpA4jKLYxUDRXzEnJyzVSvcB5av5ut9u8w7hS0NYQQbM4vC4dhOYP0ToQP6mzY6EsVaQ41WS1lszuzltLWKYuNPSnmbPbqYbpnTboS3tpbrsECCn2XZGtZQIDh0XBe8Rgx/p7VySVqldmPeBzPtwPWsI5Bg3CZGfo6B7PWt5Sguss5EDwYQ47jSDmr5VZqmOuQI0iPLQtJeGIpjxoW4GMblyQxtivmN4tMvEwzVHqZNiuu27dvk8J0DCHgjojaVws/63k3WPuLWdo4gqCaSArrEGHRGOuQry1HS3Ld9CnvqeoYJMD2dSIOAgVoh8euUXwjNFUhv/bJn/6Mf/VNgD71yZ+WvjFrDxPPVDoNv+nHP+fV+jIA749PANFMwYzScwIWCPwETtDYvGg7KPHGbV96zd8jKm6kz8tIcxxip3jatYSkQaS5c3alWVQ5Myp59XnbVjQ/wZ1bLhEA5C+/7z+wB3/6x/7A5ZSvRjlpHjLU2TK0j+uInmnNK1NbBU7Nu5SlsuomiUTLvppjVeWBP9QHkEql+D7VvQGZCKghR4a8Up+5Wkh6WbK6pC9Bc+kIAoPGE/M9TcckF/g3XsytPsrHLYhWJzYJLpW0KSzKx0aE+1cAD3znl1s5T/72Lwb0bbKcl6Y7Q1X9u45qytdQE2YvyRUIIA47m2CmXzuPrqLGETtfWZeVIG7PQ+Hz5IOo6sXFhQTyEhH7fo7ZtzH8P+lir11IwiY0BzKRcBZmkS3dJybfeUXiEJVy2y4cPvzSUoDklId/BoVDaeXdRFYipzaH2FI0XFUl+PPOmnyOJax1VhSFci3PQdi8LT9CCUJqCeKg0Xv3jvyptU6o8T31ig4apYFUB9Rm4zgNolOSOdne6B3fejXscLw2huutFAFw586d5z7nud0STyeTTkLTnhDAmn3G07jM9yx6pNqEnGjozi8xFq+hUQQbBwSqF7/4OU5bEW/8pzN/KFhrhbj/JqmLZOxfQPNT1aKnPvlT035NQAquh9QIauoHyCei5imKtiDA5yIZJna8Nav37ETLR/vPs9kvdRxnntQKFxdLhD6O6J6QMxljsh52H7CJfGdpmXZsp5NmURPOUk+j7TYWL+Nuf8QUXr4N37sUPl35UHecmdPROFOm9PT5trnwBA8idUBMo3tPni4/hcYkmp4skragRhGTc1qQv/zbX2zpf91xfN53vUIgfXm1NHLndoQkSxjfpRWACGyjtVXviCRHjhSdtld5iHZoHMSOy5KkBaEqMbbIunogsxpAGqGJ7xf+5jBvf53HvpIe8IHX/Mv759pXcj9Ly4q1KVY4hQbm5evJp5584OrVLGGx7dbNG8/eP9mOs2xIUspMbZSaWsOoA7SsyiaI6ow0K3UKYuk8zFNeLc0ET7X2Z81Br297CZGY8KOIXCm+BZCszb0eJhFSFo9OSSx4D4cHaPteuio7QiKi5gfBKbfweWLBJXDKfS92hSyRLSz4RttKMmVRaQEwkrxca2UP7KcxJFe4hzScVA1jGevQHXzhuWklinQEuW72TDFdtLLUKf6vgNy5c8cOwdp511nQJ5wHADgRs0XmcNf2kvQueXoWdasFL6rJm/wb8iaIEKo05jRIaMVThOqQd55jpbkValfiAKTxO2+/3FWLLcOM3gl2ZZLsrn2rDU7Z/PIEmBInLWRII8OeLLaLNxt2Pj39KymP6mJyGyoGsiR8alFWHk2pnBg+ifDmxGg+emI0sZn/9oGKPwE2e7Y1uSpu1KJRG9/WHVf9lJpYp2wsk4Consw1rNqR2EZpkSviUarJLgyzk5yz2pMSO0+y71CE96bP73KZIw0iObFeTtnGGW4lj2M2AlnO4sAgU3PphtEhEM5s2j8bypVeqahhBQx0pvS8zvNMMMr8OqMos4uNf9zQpyqEJjtQO6t26w7BTdJd7rMlKhmH8B3HUoubxmZtuOgK8FAnh1UMEH9WEBX09YbRDGLqu/ZZwlJn6QAxpdrJFVU9iQxfFJ+niKX3Syqb+nSd1cb5DqpWzyhP/+eVWnRmri48hGo50QAuhIIR0MrXl+WxIiFMsS6+qQ9hID8lfLfwnK/L8FZbU4acK4yqJMdPrForAium9I2KrqvR8jCFacFTXqF6GPrJGcMxBiCn0z3yzRTDkySy8GUWOPUWA9D0FrsRRvVQcpteAsDt27ef97zn0QN2Kc0wZe8HGVPigiAImU7c0Gb7lT+r0gMJmUb8iCi22Uvr1lfsR92AtE8bhaJKIbvaiCSheiUAZP3ZZOeNcE3nXF1BhMrO6+LzYdS7nryApFCSSkMpsiGMmMAKMhuLyLw1rI1fU1vm9J4rnzc0Q82cfOcqrj6kiUh/++7hto33fT69VV0tfoyzSeXz+gR8xI/JT9qDMXiysqezAjQlbTZKQI8xn3WnzTyKTxf4jVBbFqdHzJ9RxwQ9Detbf4VzLRhUE9KkRYCKwueCqtEpPIpYrD1f22aWw7PM1TtJMPvOKfMxNbwF6YkCjZBnKqm3VGQ/+7E4lMvdZFS5a18jo98WZxXAUx/4qQ/8m79ub9fywwVsq5y6fqeVm7bu5NMnaoaqVv+Lkckp49SuLCJWX0ddjMHN+whk5ZtGaUGTCKCBsYK8tjKnWrdEf02kbX5Q8+ODY4wxci9h/IrVn1KLdaJbFiJlbv7bhqLaEwX37xWpAElUHpNV5X4CD5KzhyS0olmbAJVtTs3uDYRFhKz0gCV0kv6MP12WYGqqcMqonftySVlsmZ0fpaDqLCZy0DZgimblYnYkWIHvIjwl7HRiaHWw9CAQ4RWGccWu2Vk6yPewaihBYwegt5944trVqwgosU7XEQECj7syLNAsTEIesr7UZwk3A/gB6/E1NLaAiGSVdf+lm/tfQkCkLlc+07IxvLpcXkzmrJMEAgcbYNcFKUuICIGkgtX5/0RUMpCBSO/KGnWtn7VXeluNJwql+n3mybmMTNzGafaG04/yzgn3a4tr4GlPu4DRpBOBAGQxczNGXP3Kxsxl5rIMqdnMARVhFfCVEH/uxz/f08g0dT4VL4tDikq5I2qLJQ/MLqFfBXLU7mzPNqW55EbbT3R+BpDtIlF3DcAJIH/m37z8nykg8ruzBxUQKGLJbSNgww20vltupHZTQrA7W196L0x+umDakNFUSCjNTNBCq1vrDegR+tcDDe1NZ1svtsbhZCqf/O1f2mut5GdQuJV7zi6yQG7fbkTOXXbIpZH5wAMPPPnkk1evXu3kKfOLhncNBbl5H5wRXQ5bz1o5o2YMItq3kJtSR6felBSpan44koGBB3wCXulW0VZ2L+uXNoPYFN55ADmVWU7zCnyFb1mBWKEfU1diwbuUgKzBoFWgBp46XBaB7oAR4meBIS9Z0zS7z50iYRprsHqWuRa/scmhAIIVm5nmJb1ll5uJUhv71twJCqiFr2KddJ3UgNpRqIGxIBmOgtZ9HJrFvZtVJ45JxBOUS65kb6cAs+eoTpPbd25fu37NmgECZDhzWVVdbkpcg5jsoGIRZVEqpIYjuyrZTM+sWB8ykaX4XeIBFbkwQGV/UALgzeHGxfxtajqZlEAs8bSoZckM/sjk0TsMYnFKSqYWS6YKN7k6SHQ+B1W0qDaSBdpsmHI6xz+5fCnKzU7vA4kcD4gwJpfoBeYPFeNGBwsTzga2GQ3PlM2NaQOw3n3IUaOqDhE7mHJKua3fK4tjWXh4mLrJ1NK0yyUutEakzhUUb3vN2ctSzjvFleBLTaxo1s7faQZvBFOo6EVJtYuK/O4RItdwHkmObu6yDatg150dOpOrG852K/MnTXEYoMhxzPCoqVXFDrZFC7Oo10hNK/mhJOfozVF0hipwnDNibBnmt+txfUwSqXMkmMkRSt8dSoRIOgJu6c801NPTvuyvFyjwOUFMs3UAWjAspxFE0gq4N194k+CblENjAVZJQcoONUeoxnA6Sy3xqnGNzPsmfDMHCReZmp5cGUMOpYPpwWiywFCub8xwi60zSfDYYBYk9tHwmq0ondgn53/CEUALsLX0NJ9V4EM25ayKleepVr1RFKXfnB8xBk6nZkDTiySY4POFo5PyECwtIgOjaFn27Y68xF4lHUR5pCFf6/W29tsZDVdN1mdjsbi3zLk8LHufgJLSSFKXNi30AlMwchFNCa8gBHHwhvf+xzKgB97pJz6PUuZf76BcPt/b5qenJBtoNlOTUWTdWpld47k3UxQV8B0G5J8LdhU72lUqzeI8LesmdLUtpPMuLM5O34U4ptf+2l/zF488cvcP/sFGVsaYtckbYUQWjBXqFfcImIo0qgRIZI+2ZqvK2fityVv3pWSrHG6uwFUqKWihgGv0IgUgFI0q62aMad8pb9nV3VX8NJ4dbusgIo888sitWzef+cxnrkVCZ4OwSQPkssSQpU0ggdNHgdk7QeXUR/lm01HLI1pbP4GesIcRUqGzodaATOJxy7zQP9lk5FTJkpKM/GzntuO6zSWVZynZKzSxOSQFxnk/UPOcAkBrKmQnPEgGnhteEhndYpBAzv5luZGlI1vrN5woM/hlkeAvAX+WLedOwJC4IpRunQTMq03sGBNy/k/isFHaQgh6CxFAYgHCDLYu80STqZkT7LD4/JOy5zlYuXPQbxQyivsVASJvtMYtkImJa9JSknidwRPZkEJXIJmo8M9Usje9uBPIr0eqZmUr7kyL9NPJoUfghgD+kZ/EVYKYKBGROFZUx5DTCYiDRi2Q4PBrtJnBtOPRzJT+dtRCGN+g0D8dyn3aZJpMJG4/cfv6tWvEf2eZoKzbphOqLMICZd+P4rrzqRFk7fMzPQPUlgHYmY3oBQH0dfihtzPDNPb2LhWIKNSuU75bymSHMJZIxWBAOg9CD03zC7mVqedF46m6miGZVIId8ZOBnj1BB1i5RJQTNKshwnrdIGCKqHhnZ5rJowAo6B+kNwvXi0XaAUBF8uPWjXizeplSU1h1JgDmkza8Kpu4rNJfTXkWFepcxITHrY0vsBWAPdZlA1WFjBpsz7O69Wm8FCKZlw8rXETtRAC27FPD43WIn5s6RrHMdWlFSJeikkBSdnJmmAuCGaWCX5r7DyrvSuy5q79qsOqcFng1u6c79HwJ9HG1hQ8Al4Rs8HcGaCNdaBZvfrWjy5fEBIJkhK1kaRWoxQUpbFVyX8N3ia9MSQszmwW4zK952eNYu5588smrV69Nqi30/yVyOTnTrkG9tv7TNx51C+ymXInbHHoQIQPlOQ+zOTmfM91PjT330x+Ott1qTSMirMH7BODeEzjAmncOIhCDpYP6RJv7/iajcBOTqusihfkJArV1uMNhGNTD0u3RcFVHVz2XCZe2bhBgQVcTAfCmlquegCMhLQyRkyhExsWF4iQnSQ9qK9zbtw7r4IlySyITltE4or1S6ux7omOlrK8IpE6uI5/FXKE+gu37tH+tzxP17IaifFF3TwovcZoMAEiA4YiFQN0jahSTvXpuXN9U9F3wIa/Hf8rMi7HN4ubwVQ3dQysiwJoYK8UyC82gEdj0Jr5nYCHxGz74C2PkplICCcQiwk1bN3awaZVUskmXOw4TQGVcZLFsX0TSgEYVxMLVRpimU5wPdRR4OAqGngFbpSghNUp+klSIAOuEOPOErer0esKU1JS5EExNrW5tpQnAQ7VonIqIL+vJ7MqBPdsh2LjYowULzJqkaiF7xvrTSGgq0i1284XdPTcJ6ehqqt1ejdjdVdyjD2RhuS4zF3MCaf8kn0PMqGsmOYcspPLPajBJIAB99NHHbt540yOPPIrG2B3dE4/re6891YYFs1Ly4z6SN5utm8R5T8pe3UpquBjLQn6sfQvxTZUmqqbBjAhoUuLo2Reyy5z8OZG/RGZnRl1YLrZso9ZIaW9ka8vOd6fByRXu5oWHnYNlIxsupQy25s96f4m1qScNhOmSJiFHNfBKng8hFU3hG4rwRq3W6zQDmNaWmKuawEsqUqXewuUM9+mntHjVBMJmvl8SoBJAqbpKsw1r8Z6y3q9+D8CBVEjekIFx2HdzqEAqhJufHDP29O0FxeOGdFUzrMiSUR3iaEx9DVE8mYXjl3/5V5773Hcw0yxI0QqNWux58bBZ52wgTZYV9QfpmL9irIxae84ez1afuyGKGg/DRr/utZ/3Ovmhd8GHALRsf3aWKhbj8jJpLEUJ/8FHfY9V8Pnf/REZaXOrHcA96AraqQr0IRrBvXRLmT2xRbioBrPOanIrfl4jtcFVxEWW/IYCmSQR3P2f/tSakoo1OSdWZI/UxDcPBkwsTToPO1Nbq5Mk+Baf4wzhWVs0I4htc7p1PlNCurqpcbPFDOEUTioSE2vVxVNxBs19FB6PQmdDtUxpjFXLeGnX5IqzgsUpBk5KzmBye6D1WNGsroZgEKxVbJWmQJvxXzFZOGkaT51pFDchxJ4Y7xi2JkMz9r85Rp+6QKaCJswxYawkb4eNWr4piHJpi5rrUe80bq+RVZg7ENISxzpDi/0ztYuMFVVCBFer60X7Z9u6jJ4F/znYSF+mB+bqoW4m/PGfjYRrECsznjV683MjZUHFqhgDYwyrNvYJmkXxUJYTp+WL4wAtMrA9OLNBSJfROUvUwtLYmRf0XzH6c+FFuPZ0/FyiqwTHLVHmxNpGE4UVTCIo1rWS4IXUz/lUAlTh5Kim0FeWWPhGa00JSfx+nVaQUHVFG613fa+EreAfAxr7tCO8p3JCHNaAe/dOgC9sh7s6rVmqYJv/G1Z1C7byFVtXmjqsoUOZoqVpqnr79u13eId3cNA8tRZ1YtvCzo3zJj00nxzsgvEWQM04iBXiPn5QIZPuNftFx2zKu+BDiRsaVpd3mJaVSVRR5GVUVdwA/cBH/dcP/e7nM4OtM4UzdW5ksX1OEPE9Iu8VL6wQZLZ0Y1Kl5HA1TJqYM/oXPVlrNfUGf44jE1QVfH7pejmahwrCSIxyubsqsqLo3JwjFmeLtg/CtKKyWuLJhjApgdPW6l0JlxdlV+ryssyABX4xPrQ7hyqezGYFZgjcQCbNcn1tD3Poherf4hihtEBO5WU3rc+U6WC80Z54TMkJskvIHVmcaGsQNlO+UrA4V13ujaUdJLjwTHntn4FltsvGb1yEAWMRWU//orxl0C4HYL26jaAu/VrLebsEbo3AxOGiShdz3oHghqT2yu1VOikerYVsQI8aKkM8gqUhugT2zRIIr6bsZnaxM2eaKWwMzTbTsvfp2BGugjCrfWOghbK8cFWNJfDVdpINH1qcX+EXSTYwqxpyOQgzhcsarnCLRZAfKo6i7NAG9YhLjEfzjIbInuH/4EJLU7XrpWZLVWUwcgrzN+OquYRMRkXxSot+Q9OI2YscdpoCV4iT9rxc4mRvciIdvRjjdDo5LBMcPTDW7S9rmdLDmnysGFWkY5ZWQ1oYqnTVCrl9+/bbvd3b5SOSEd2OHTl7v9k8NxlWVcQqz+BbWRyXlNJ8KkfsLPxJ8SLBDvy5btk9RRNkXi0OMm2xvEjr1CWTKSGWTmjS8l+M+mYgSkE8b2KQIklAGyniRgqEZV3dvVT53Qo41iRPmdROvJkkzWr3yVAW2MlM5IhC9RDkl9RdoBl2VNdXvCUble68yLA28pCJRxFdGBpFyXyJhjReyX1LaFdHabq1s3A3M/JNUitD9MigS0wReiFp7nnNjYoMCwS0oF2I3JZCinlI9hd1TeH1dcENWrEcvvJ2IVVxbbqWxqWEpejCxCPM73mbMF2JqGibY7WVm9O6deeh7Q3zIQ1va2+O8Jqgcq1nr406XJ4lkAinCEM9LRgKn2hF8vCYMpb3AbElAxCrXdLZrZR/oZsqbYJoqmGfAVW9etVPaghFuaxzycQWVXNXVjhNQ4+LePbhVZRZm/PnUkSzj9wZHUve/X6MCwtySUwaBlt4ei0J6Kwjv9j7XZcn9/sZBV2RHrIKlUYcIhD1ijsN2R3KQFJG0JKgWJAZGKGWwlQjp4NDXSIFaeoZhE8hLkJXQQc4Zn7ZFQZ0ph+kHpJIyzdO2pjA+a4RdZf4eFBHgY69Djsl66BcJnnHJMxmKcoQSxu/ro0SiYM2eLQ2NfP27SfCyyL70pvcfXYj5TKTFJQs3igzOk2K+vK0xmCljQa6PidK7lOTZKmLYqvGorJ23hVSedS8m6+E+4LvftG3vPg1AF74ivcIWJQHVWTkVVPPYnsg3vKWtzzzmQ8DRAgAh48VzsnYZnrHKE1dqfbDO3t44IxZSbCVIAlLvwjQ5xdMbNq5QWlqtqebrh3B2kO2e4qQkROlERZl6ZI9h6VnO75p132up5EkirX/i7Q1hzwyZBOcgLowVmxr5ywgVBS2iMYbQNmv1uQ5lo8Yo06WLakqWxTmoSNL7v1oq3CPCBRXH/gy+3331/5c5kqoWSiWmoeCDGV1zwO7ykWv9n0kNRPUQobs+OYsPaPSk9KLdOv3t10cFprk8PLEWx1sP3N8ldKizTJMFTRnwTWSL1rx4pZy6fysuhJz2026MHbHfdlSa+/Kjz6UFcb0DnA0ClnwirWJnnuPUkiYio5vC0ostGIAyvxUPQ4dFRApRk1dtsNMQyZBjhYRA0ltL8NY0egrYW2WKcIYxYqI6hQAl4RZpusyKliVqIvC73MuMr5hnsrVMcXBczjcnsfBws2tf7RNBQIlqdvth1kfC3RDV8E07/0xANhhV4a68sxVQMT7aQFqEr2opwBkGGpRJ1XqyA2QOmcrSuu8yHlYk9ft208897nPoQhLWjLvbqptrj1/uBV/z68FoD/1kpWeCuxkcwIf+GOP36bsKoCv/eRrRvhLvqU+R61g+V4mRCKuAEBCUMPMxlm2EhE1d0v6KS9/v3Ap55rpvTYdBNAgQXveDLSbAcS5pij6zQqs/cgIkvpg6kRtLiRfnTEcnaQmVN3ICqfPgZbXyFDAj1CqRR4igrCB3CYyssyZCswswGuVbO+8zh+35vx9uoWbG4BaMAU07BZOMKdcqQprA6FgFQhzhOa5zPaho058ThvFNLsck7UMc9poiNLBZZ5DEoGnuR7v+mvP+Kd3n/rdzDczz5HeJdaNSanf1rY0CEXwS4hs3qJYWSbPF0LO+jnjs1wqIb6VO3NX0C48cdJz9jrHuen3majSxAXfRBReY4KkZ234UrX2GhEsahiro72yDyg2pnlYqdWwadxH85oc4sMZ0isMzJJjxfv/k9yN0Gw4Ihnnb763ZN7bnpA1/Ygq7JDe7Z4truvM/VabZoHfzPavMItmkq4IjUmFTg3IMGwqDAels/sdM83zhpD47HZaCrTNhitfpUlMXyxFY0TK4p+Tc6RVwuHVbRa/b/AWvWJmLbErERGoT/ZBVdW+HzlOp6PndVE7vNczPhE+JtsCqB6IOTVgVKQvnEwOeooz1PHwEZKCEpNDKmY98cQT169dDR8j6Qm42B6YZatcKQUYv+Ef+5vf8I9P//nzwFfLzxP2vO9TFcproX8QbwTeJcPttLtxU3L2SZIVDTYFjk1A4veCAtTxa6E1YqNl5BGHzlthY8jgsRo5RTKCOf4xHYspdat0EM2lyQ0NuVXJprpXizB+ZS/cqYif84r4SGzpL8LlpFfjVEKCWuwJvSCMMq++yrZskNyWnrQ8a++SOAr9o2GKQ3qOoyZr+5TH9tIIPHeC73ct9nlqhZNNy61IMiVMPwJ1NaYlN4MXulCl22FS732IXFDG2TJkeqTRnxvWig+v3GLGwl0RlE2k9p8bC08yn2VWFVYIY8EuCLNUOA3SHxX9pSvEhO21l4RdfI4IbcYWMzNCJ5koLiC9ajzc0nAJ2bN7WuWEEXlkqNFKtiP/8OM4zD07a4NUtkQV6CB6lIZJa/VzsMirU/qxKoWXPH0Yp937jKFJQ/8nK19iK+eFdtcXC4zppq8VHp/KAdDXaSKQZKKodOBaM4kaKbOzaX6QWSqBe5wKqbN3xZlnJcfudmDZaZjsYdhEo7rOBerxBrPm/YOom63IcuR/yADUjmU/TqqqeowhwDgOW8xu5N8zIThwgCcEqdg4JkDIBCf35NAT6mNg/H2GrXUjhx0AmRklwJ07tx988CGTtUjJDMuhamJoTQvFVPtfitY1DSyPAn6eyxD9n1SwlKPyVK1FUzn8UGTUsRAScM7++gS3reZTXoV+3mTUEHBUH8Ur7L5jSuYLxGrnSeurMvwJevoADaoaM5Klq9IokWpssID9PhHcrIP1djSuzcVk5enhEMOnKIGCKArEvu5oWep4+TQNxJZkCdlZatCJWkp1R8nRC/a3vhQLbn67Wgddfcp2NuHJZ/xFWxXbeXKJ33UBj9qbkZ0iGcQajlo52HV7WLPG56rLDzlwtEN6vwTNpevJn62jcsJCvVyt7j71p68+4+8AuPvU7454VXVJAP4GFpOeM3B2EqRzzZR2L9OTWEfDLe3VBEHlZdsr4faGzJ2h5X4xrSmbyzhHoVI8yEtoNomH+pPsNO1Jds0spJk11o628Zn11EjBel9s8YpYwwChcsIJklnS3ceLJs5sO6KonwZ+s6TOwIWOi8IREXLHQyIYwwwsYiW7ApoHuyv00GPoSN0hA8hGb2sBQhdCn87LGJHLoG1KELGCK4gZrlDvnCIcedQKedPynSlwHKySzSQg2KMQkLLXdaB5pqYjRkHiddlSd5BwM7xYQlYzPpuK4iBZDwg5GzxmZjvSbd2MHqq5YbC+H9fHOlUsoaBa/QaqY0WQl1lnsn01H9ZW6qS4awIsTgPnv28Bix5bbVAU9Z8/D+/5jwDVn/q9UbAXk7fRTxW1Ksn11S1l5D5Yn/OWb/lpQH8bfl0MgOpjZ52O9HaD2yjuHEpsxLaiehCpQBv7/t60GuWICFDoDZCIYO3tMqEf6so0ntL2Z5eL7KUlPrOTeKT3Y9xw9MLcTbF7A7/yXRC0GJoOF0hoZ9pUIdD95yJThiV6rRiuZiDbICEek9xE85UKLY81MTboPdcdxgfvgGvyr+/iE3tiXcWALQDaopleuO+baTIvtXNwnbX00gH0M0gbMnIIqMfRjFLBjrKmkkiRzsALSqhscREM65G29O5TXyhxYZlayr4jqUhfvrIrtZWvFfAt97NwHlRpFtI37YRBYfsscbRAq2/kLkK2q6yDW3M693UY3iM6mQpRX7dCzjruploki0pwFm3vVFigWqU+2qaBfKwubk3ZF0yxBeJhMbtYxgQmGYLDz8RqW5RWLq1PViXSqfKnl1c49BWvbMlyDRf1UJuBKS+lkxdrpFoAyP4btKRyR/P6dsFMXm7O9MiaQAJkmC0TkSuOAGJ5QSbigYsILB6A0LQVlEic4OAw0Bssm7fFUgZSoTA0mZSFl+nufUPEtJ+GRVcINa0M41fzPcUkCGnpGHKcDgRmSlioqmPgu9/3WQBe+O9+Rfw89xP3gQhOx6GFukDkaeIAX8Dl6Ko+XD9rZO9Yd2TlYLwd9vNXfvkN7/iO79hzTAsB4TNU/CwRBpUIQH/69xr9197rFQDu/OSLnHAsH+x0MyTNX4YOJvj4bXgnUBCR+hch/eTCh50Y7hjLlz/6X3iX+TpABlXpmWYaqbRsrYlxEqpjdGat7I/Rs4zYJEz7IjNhd13tBcKtEs0AWH76TXdyE8JLdiWFQWRmaaYksQKR05tYUtxgdaanpQ/NPQ8Zoy+GjV7IygppZDVXX/ayu5/wO/rziBHtHeRMktF0Vz6JhToKON+VY3rVly5kIb6UME1t8bA/abZ0rosy8HjMiIwha7EgqlDaiL5HmfS2VRLlFIpiI0by08SPvmHPoc3Qu0sCQq3JAkSceb5GV8+eKf5ZXmymxQN88M1CyJThDP3ECkuW5tp5qAu15yoRgmczS4hu6U4u0eRkWdNKMDEFxckOKFTajhY27bGZ0YViqOrVq1fv3r179erVyeCfvzaGgu71zL21qacUb9pcnC+8CMtutI7cQugfxkF9MwcGQAQ2aWjPSZG8F5oWtBoXOWwJLp1eJPzg+a8UjGCAQvKe5eZekokD9ofiNO5ayliLkUUwq+/4Q6Irn6wsaaZ6GN4ldFvX5RVRm9/uGTZZGHJ5hvjNiNMmCulY5xhSQv/6C668Ho8D+I4PuvKXX/WUfYgq5TegVYvwpTGdznHIDeH2bJG6vUlIDUvas81P3L79ju/wDt24hQOYWS1hm8Q9XzKPqn3gX3zd6Y++9Y6lfa//ip/8vSEIEq3OMkcqT69IuSHLh9JqGJBPvHUVAK+zstz5aoK5mHUE+lTIWd3IX+U5BACGyMjjzIlxectsh+Nj+boPeRmAz/7B39FH4bpAkypIkK5OptVZK3+8sCCYjKxQroSVxVVqavndjvnIM4VJZxC0VR+ATUO3HHMES9c0bO8AXP1zfw7A1Vf/8N2/+BfTAhZ83hPQQp5y8ahZErJ45YoWiLlpzGpYFus/0c8P9S+87580fvzZV/8vgNZ5Yo0vUwlDoEfHau3csuhkQk7Z6F1b+liVVCkvViWmpPVOsxqHkg5q2prZhsz+cj52i/5paJu7RlNwFptSUjGRF6jrscceu3Hj5qOPPsrFcvVswJk0pfhkI1kmAUhXxaLupHT9kqUE1gJ/uXwDquwwl02+Y6J8Qs9pu3nFRtP0+IKIr6uQGNVfemoPFsq3by+/JiRJTiCst1TvRzfB7bLqEVMueuhxIRfJGYaeVReVTtb4PE46NxxqQjsnYGgFwkn2LUKfq5pOdbcYQKhzNF5XfOPvg7w6ybQCy4wnqMkTSAr+YtImTnYuDt/eLgutlgHiGkOay7TAXrBKABynw/rx8MUochyH+pENTeSyNJFxOu7FmRdBQ65er91JVqPHaRliRhSnObbznmFyon498cRbHnjXdzWD2hqY8KoKZq3OV+w7+61zZ2sdsibXD22KZevwMrtXOgH7YqTEPzZ2seVwJMux+NjWttciewNe0npnP9/X/LgUcil3FK2pVjFxMV78DvzAL8ubAPyND/0nf+IHPrezBeiuejGsSczikHfkuvMG2jdtqK7V8jIxkzdtP6l959ztShi5fyCiosm7EPtsQDah+/i4ufayl939xE/0dg0mY650Wsf75Nt/8dL87N8sZwagWT1bahG2iop0WTOxImJ7LA5WiJ/6gP/wnq/+zeidbvlixSCCNwoob5UQlmEkX4/eI6skB2Rx9zp5AkSx3Ok1MYpAGOEXrJiYugqTELLWxKzua6YLFqCaaSwpzRvt7RKKJm7t3lZx+OEeKkXr4sd53Ly93E3Huh9Wt5mgyWCcpUSQLKucnfhgDDu16BklFF4+Ykif0CcEMdtz1VjcQvjyPmzgcSO3m56ybGxsTwOm9a8PQiUWKRUTJy+jaudTKnyRu/+Xi9pVD9WhmguOZ+S0R1FCG426eJ/FZNWJ3rI0eFfywy+x6anwFrk7RZtAXDHs8iTkLeeGCpYFowp+FRM384M0dVg1nJscNAatk4PTxeucEMrG940qtQOrdOQJC46XjzGG6skyfumPvvWL3q9qECDPyV1Y14AdfRMqHw4SNHaB+wmmqlTWTuGOcHQcJHBThdZdeXXZOcQZtYGFqF75qitv/fNvzdyYycog9kQGoc/MEdYagSYZ1ueT2Kg/xCjwA2CztfnZE7c15WcEMocQhDhWviqBflgroD5XXFU98E1fboU8+WlfTIbLq5ZogPZOD+fs2s8FUl9UXzdyW78nADLOqA9/oroNnIqRkjPNIrGojQWh6Ftv3Xrt3EXmu25u3Ljx6KOPVl/k8g5HWqkOc3uNm3c/6RNdWAldrZQUSE1rUMqbGIXdTxtVrC3uVSzMpFdLTCKYHwX8hte8d3jOPW+jnNqGmt71wuY8agyReslYpOBrNhl5t1TdFUriZQOUPXGnN8SMMGtyacOfs282mVor6PFi8ZQVZFe6K5/KpvyppLZEBAAf3Bj5ZnxALlKYwyx4/iwFczMtw8zR/ELTQvAhEMiwb1WlKwkFkuOw7NkX2uSBTnQjfq2iGDZZ5Nz48228tsZkvepbhIHmzfe1jyHarYwa60pEtMJVqE2Oaa7VRkEu/65O+qkNTiIF6UBuB8LcWoUpL0L9lxkAASAWwYKb51iqaRkVKrFwyrGLNmy0BJYCRdVyY8kyi9D4mcgjO4QWSC3xKgWG7F9teq2IXG9U+1ihXk2a1opUET/mvvyB2lltIlA9Afrlr9bjOOzgBgXEFmzFwhdbynAcfqCXdUhiLGhu5SBr6+HQ0tVL3VwpyWRN3vCGN7z4RS8C5Ex+AfLsz14ULZJDwBcInvrMz8W/+8HxDYIP+hBmUvnjLEhagZGMWxSC1WKzZjJGunZXKsQQ2mTLfIOvQBfSjBjPZfrC7jk8sV/8xVOhunwgNBrkAoAHvvcbU4AKeGlx8H+QD/tx/BQCUiClOn6q5lJtt+lR/eStp2sy88m9BA0dM1MuArXqhj63FtU3fbeGNeXiLMhAJWCn2/jmzA77gMANiTXZUj35ZV/GrU50tTh1r4aGJzy4L8VndCUVIlp5tfk1PU1D57Q1aobqPWv0c/EOnm0MOedr3IEmEAdoHCsh81V1/AmBSX1vFErKT7E0iQxNYVGR1FoTwR2tPAG864UzVxtcLa9yykY6kZPlnXaIK+b6+S11atcHhGHnK/3C1e//OlXc/bDP6V+VaY0gh6XUL3kaC8JEzbTQ/Al/TDrNoJB8am+O/1Q/iK5oCDHWWL7dSAq5UZVZuXqLmFYFcPfu3atXn8EcmrkBAPoV7/XH7e6Lf/KruiRdnrFVH8ZOAdqgFfvrbXtgoJEZqmscAiHlpITeOf7ROvxARHIAv4lEtCfL9GszrDK5SlJRuF/KcQhPEfbOi9ZPi9H2KzCkC01HgJhm66IxDbpVBRvwNOMqIoopnxoy1WIvwreFsnkcXal32n2xXnUMeevpCGkQQZhqOwQVceAAoDKAe9wKERnj4nQ6jfjmhrOzTWsmmo4RaoLruCm0HRp0mSQD3/Ed3/HEE0889OBDr3jFKwG86EUvgmDTgyE3JrFmZYxESVROXwIREfz3H7Y43XDV9EgzkDTXhxxdBRBvDiO+36mxjrEi4bGAPVxm0xAeS4TXIhWYvlDWFzWXDw4agJhSKeQXVixKKwPrLQb+1A+9JMvkRoGgfN5Qd1zikJbLu14DDTo++z8+5M2f9EPPXLykKnFJ4V9xFxHFce3qn3fz+uRfzAzU3ktImKrRvprHnkzJtN0oyLVkIVOd1tfzQn6vpSfNt7ySAc3dTiX0Avaa0fprTUA12kEu+kde+yfcNQ41bO1rMrNJyZPMvRvXBYAmOzCPQ1bh4WbMHRTFUroKwuUQRJdUAfvOAKtk0fYtk+GTa5pWbkqzgfikYpU4jBXC5lCTz1CxQgEj+Nq//LNZ/KURrDLbbKXNNEZpI5hq0wWJkif5YRcZOC/iWDH69n4Py+x/TAtUdfiuf9CxBY2T4exdE9f2RMgtG5z+/fIDGoo//+Q3/pWX/OSfLuLuY7kSyBM34ZigSPLbsUgIz/kM/6SVAAI6ECvAlIhIha/6WGsi4JKfDc8I8fGSvLQJHldq3RXqk3keYXLWe4ERwcuQD8EaUPhqWocOOxGUxUszOzFeZxy6AVvRNfG9wk1oKlgBxFInfjRrnjSrRpZLl3tA9dAx5KR66OFLd31i9TjUsZU6x2zAkeErK+cQkePILTkGLDTnGaQxNjvY6I/DMFGy6Hl2LiHN5cd97Me+4Q1v+NEf/dEXvehFlYUEItp4uGBQCS3kUxC2hn0mNVSpGR0y2CWTkyWVyJFzaiBvkRFvBzZmaxrEqUYk/Mr2ke9p3gj1vFKWWY+P0JUfEd8rPwg3yJMf8RkPfNvfA8bdj/8D3tAs5lxLuW8mDZ9d4TkXtV5JZ3mHv/Ch/xnQH/uQN/yFH/yNS2mr0zXG/+9B1RZANDnx/GGQU8c5zVoGuWU3LXVeKI2WyuB2fmbvp6A0Hk6Nq2qY+KKNzyaSXsZ557C+aD2b4+xI7MtAvYfNZ/ejTyTDIf69whCGOVVfwFTVKilFSG+kOQ90LhIqVU0q9NAa4CzyEHF298SUpaf38MuBQrVB+AkB4l0hEgAhQENMAFEb2UpfTkyyr4BmQD0AuPqjL7v7vp9AnFmzJ8mNyBi9DMnvGwCFrRp7J/vgh3SgRCIJr/FetJPlShQ6RI5DA12t/SPNRlT5sYUwUaU3zU7qnNFVZ7V5OqpOqiCuvf2D3S9Qr7cesbZrRYsVEhsGxc8UtT4IR6G2Xnxanl+GcfhMxH2EVqTiT5NSIM31XlCx62tf5A74N2TctQd1vvJRI1ogHgraBjMnNmoIDTI7GmZy9nYIhZ5m/1DB95vKjxrcZ95W3cod5VBQruikvLZSzfKOMez4q4BZMkbOhcsYcjoByMOxihLPe9jhHrn/WaAnIizY32yB+78YPDHpqwzTiGDHH6olb+Icgug3Sp+LfIseNwMMpVrx0491Z0fJaTi/ajsdmlBAh0YOsSAvnkeaKC/NTTXED8ZBcTgz2k1QGPqaDjj2wzL80bsf/we8Ub07eOy8EbCJC4LmdG2h2NMCWMEKa5mtMBB8n/ysN5x8hlb6qXqIn/X1SSI/QqD28kqzYp742IhgWIxKLC2jBts3ct446jXKBAFlyjQ1rmHovNnsvLqsxb3otDZhJzVde7nEmgeOKtL6XcpcRASrtyLJbH6I/G7cVuG1nLJPSO1bFO6kbB/SGU9xm50npXob8VNbupNiv+BF0kD4gkoLQQIg+JMf/QJL8de/+7XsvttgOD5fFoWskr/FYW5fnny/T0RfzbLkyI7ORUKSJpimgsPfZLb5+A9Olh9xKrOT3jPcutT498jMAmB041pcjQLdoMHhhTajPUmdPnD1gTt37/hJDWlGA5xExuNL/vPf/vL3+qMAXvKTf3qRMaW/Z8xZOpSzOjHCOa5w1ltpGm0r2ck3OUSJFe7upL0dZJq4tEmMLwNhOss8/yzNjwbmx54ZHQfoQYp+QCutE7MSJ/XA1QyAmPqKWqXN5e1+LVcxsrAUr8fyBhmibmm06PcWMaiq6nqMioisEA0nsM88w1fSHXaGu6r4JzNVh30bK1ZTOdAHhsjpOKA6BKdD0/WrHsioW3xHllrNm5jOuu358peDJfcNb3jDO73TO02IqvioiSqiK/sOAN6pV8OrUFJfO98MNC3qpQHB6gQTVKUKBVSy56E2EvLp2+Xyp1JGzo6ATaL9Q+6E5ISyVF4Q25mnne3SmyxpSpcQRAXgl44rPtdFwOjSK01YqA4GgA/Hu70SP+k9Fg5ycYozJBGRu0/+JcG3Qj65oyh2q71iG2bMxrpypaHJVXOkaI013iO5zYexSQDftJ5UuFIptYwSGz5nUUAeEdjTSAuHcEP2urZ7Og3bJtt4xHIzgHhIVlvDfWqqBVwFakbbFlsYBErtOGMPkpipXTw/LnyTlJf+Eiu6FDWXvGXPamPR+zF9QYDtHBExqsv0+Fsf9T6++ll1jME2SiIoQCyduNdZs2jZ3U/9S/muOYKNLiZ5IMPCDl/CqYVfr6jbOeGU3lMi1BayaaqlKdWWnZoih8SOrogtfWgSqTtdX/rRvyWb++Uv/2F/+X98qdf0CX8d0C/9yb8dg4ddm3r7lidJwmpdWIkO0s2YWBPE557FbvKHyBj1/Rx/ZadEB5Zr0VPujvJrgrNvnVmdn2n0du29kr1IwUMNFFy93qLEM79qVVO3L21gQmGkc0BqSjM/nFKS65rTtMRF9/7iSrlxObzSZoYwRFTk5NErHTJg0atY8nw6nazn82vQiVDHkNPpCAmvETD6UpXwmpMc1KAZkD43R9fiUcnaRhLXusFZsrslVpyvfkhyHjlXVlYTkjChYnPmg7U6i02Uky1Ng2LBXq1dVJqUpzSXYZKaAxKiRG1GvmxJqCjK+uxcVJwoISK3bt18+JFHyNbWAgYrRJudWEyyLhUUe4hX2f5m+HYFVhES5qZY/Bd+8L3czs8Z55+RF2F0fufChmrntdNX2M3diy9GaJzj53kXS6sofWhQvDjdwhTZ9kkLDKNVrym6F5zZwlXTqxSdaUQQrKSimvWcEtCXlDawLDXaa3N8P8LjRZMLXlhwi7LEpU3M/I40h/su83CzN92BYjV2N2cvAzApdttWt/Tey8M+t4qmnqgWaYqQD1/RktFYyLbRubg3TJyuIKD2LD8zrdMWXupKEfED91OpNmW47eVYEZeQwyQR+FqR9CyqmLknblIqkF+x0RR7xzFL/5LXWFvqk05NSPbm5LLedx78wP9Kepy1d3u1lyJF9/XnkzelFoGfHnd4XWPYHCzri0erknXOuOPAgGr7uvskgdP9/Z6k1dpnn31l7Ajui9zTAYr3ulIXOkqALoGr2eQ1SxHSzAZFc0AZYOtD3vHXAfjBN/xS8O4+oaytli/DGvqJTTQrU/INdbBphC8jO3xroEWwUnad9WPIcZwcgQ2cYvPgGHI6nURUfF+DjuGzjRLbLU0senuzI8uve6NrbsI37u6UplmxN7zh9b/5N//mMjfVPTGD4HobQBPgDpzKjLjF5EfDkdI4LJxjxY2qo1DcS6lNDxpltmG6kj6L5Dgei/LoOmytrXMxaZ8rpplR1cwUXpEYB1N39NYskqj8ymUPMSTg0pf6jmkHE61tXS4ydtRhga6YqgnUIvnP7JIdbflI9IbfLB6F4ftqwpYSU6v8uDIyOFFDPamQ1fSTiwu+Suf8elcEzaCkCJ333PS6Vu6w0Su9IIvqi59lom4CmoLBXj9mXU380lt7aW5uZVGrZvx72/LmBBab1vgm0xMHZp6f86U0RGzW4D4QjpAqjcxT9wF96ct/9Jvl1wB8Gp7RBWwsICMX0W+8BMcR6PHSI0U3MazjMvIX/lMzFjcvRCnb3suf+MzmqCuRs2JaXpeK3toSrsQK7KEH8Q/+MT1Tu+7evUMCEJ60GcD7gio2Ppd1/NRAlCNWB99HxgIdSQvyi++2xsbmlEFxLBljQH1XvqrFjOygnjKS2ZxuDRTAxz70zfbrO574tMkwzsbtzM9UVjsHy7+gVyg+xlvWHSbqDhXB+FGII6iutS5Xl4istFJqOD0ogA9+h3eyFJ/xTr/uG1//SzM26lOExmopJDeHu+DqPce0zGYlPRyvYsA2Ia2QX0dRZDUSV/nPMQZwnE4HPJRV9xHTEntiBiroOUINtvMUdUv/sjdaJJg8draDscgZf537pT1XSKMXyrSR9ko3O8o+Mjc8+9MS65oy352+49Zh/habk0O+uJmnfMGfmkmj4IPb3Idovbqav4WTChxQTazjDi+kmFR0M8Thdi3eOeomvzqqZ4uh+04LPwEgTqkoSch2TTQUN4pyav4aj+mE9JsqgUdQ5+RrytK6hktpVLXS0tMvh9jJ1FITH3py1soLzFvUBo5zF5u7/pDa3ICtJXZi1oKF2rY61Ahp8FuNgYXsWD1DpcWRNyBZdcwPuSzmKllF06ClRVwOWezQuBpe1JRuGGp3hSXSIZAy6smnywOtJlIgaT3jX/MUXvYWyKRCX7pwDAIcZ0RgA9cWNJm9Vhvn95rbLUQ9r/TRX8NXslc5tuphLreEzvpKYww/kUwjxHJ/U6Ixxle94tX/HCeofgYuvOwP+wIA+h+/E7/xt3U6p78k1MWBrfWYLgaXoTia62jtVAa5GAOCnBXkk64ypmVIZYwh9RZxAGnVtcFG2psC/OmHvv+vPPHClrjZurWQbI0LgEewykomMvJAUbiRmsZqWATID6BqKiF1ni3SSWWrXCtxSWIioUZxtm4KZa3l0C+GjIXtesqJsOKkqsQaL/vJkbx8IiJj4IhvBsbMIOBr4U+qyNXuY4zTKWN4I9QAmCNYLbYJwFb8+RNaa0v85C4vTAvgl17/ix/92z4qVcJbtKy6dOyYtYBPH2C02o1ynZ1WD4NRseAjEFP0FX3iZomvxMlTI9ksznENSlxvwyNOo8MqlrrSjyQV4cQ12xN56aqVXiKyfOckzCG7QDIoZ7wPF7/cmjfqIPtysIJsO9uO1MHJKIRt8NtwXeQJuI+JNRExnQkPBWycW5Wan+xk1UXSauq52ElkRUqvzFtpzIcqcj9X2kH2Wxs7IfBjyTbwcmnCbG1iICqC/LxVRb9z/guzw7e/R4+7EFJU0mBvPwEuykHdx6ZDr33L/5w6e+d//Cs9QfDZ1bcdO0LSG8ofHXDWqTRWzeqc+CkSlxGWiMV106chlrbthps3D4TCGSnVUtHrxx577PHHH3/ssWcRGYDYiGnStXjFMLJdqwxv7F6wrQnzohHTkROsWQxEZHpdyST/UcmjndoKk2k0l7ozrxGlQ796n4r8LlwJW05jj9/0MVHgurhN0yUtrTirWtOhOUGVxlHbB4XM4fsKAcgRm2+HwaklSAyUYHuLfGi8s3LzzxLGLvYaloXNJpYyo93Sz8FiyFLmRrYj1NAKidUYmaCBHkJdyTuE9UiQ9G/f+Ib//rnvBOCbfvmXNOjhiRWx9ePCI4PWKy2IFcSsYTBqLPgVlovzer0Oj+4lryL4p3roEIGMA/fgYS3us9YHUnP0SQ/SoESjmhAteB4AAQAASURBVGhyvHDShP6KeBK+8y1vectDDz3YuyCsUipr5vCSUrfD7jTfp9O/6BJGEJz+Srn8wFgIzZcw5VmU/5dPMqNqwgKf2KrvnnpluTHNgSzsINLyWSa3A7NuNG9ny4ij9mxncsIFjXxPRWpx9pL+OhulbvjnvJPNkOXNJZaLOpE+/059kpoYTn1xYBJF3X27v7KGV6OWdZxzhuZmaqYhBPngspQ1CJjOdFAq0CypFoxv/qXc6kQ40So0YGMwQeK6aUsmCKPP6oxuTuPcQ6oz20JXxvTdSgREeExi+il4sPj1KCFURuFLpuZA/i6CokL62G8K4ZF6nr1cecvesnsi+9J2Vll3Z+8PqhTz/aw9RacJQN9FCKjaOooy5i7nxOuUvSbgM9d6GwFa37IMilJuJv01Y94KIUqnnsqp0hmkEiVx4JIU62KN7IjTFg/uNNcNddeMXW/WQCC5Os0RFc5geZDOtPJfl5rEzRe70+GEqIcKN6CvQy6GXxLr2Yf55YuLWOseQSymdo+xqF++84nP+Ar84BfjQ9DUf/Ljs2VbfiqgVwRYQ+7LjecipDJlccuiymJRtXIPhZsiay74t7/ySwoomvLHyFIhTRKitJnUQGbVS9gI7lwO0KJlXQGCDEAh8W0cxOELGOPCRgGWZsg4+ddalaJWcjopNN5GBxBPym+HTgoLaO88OiUOU95Q6miLCG7ffiJ+9kKCR5PFogriNIREQegFEIer9tmm8CW0Ij7Hqa48eWB6Nj/dW+Ir+Cyths3lLMEv35qeoR0wAMuMCfIWy7XKivINW+Lue1YebTmwlE5ioO1YefYeljt6rf3UiKczms/aaOd4mlf+2WFyqTrDJXdFa7c6y6VRyeQjMxYWqaF2SLiyN5q4XRYk2nx0LmoG2FRV/ND0FboAkxEBrr3l791+8AtqNIGOgkjNdtLfSGB7aF0xw1HFiFPW4kkupYhdJbTyHaSzQoPGhkLPXBaaFT/dSvqXylvL8lbifKwu5NVxtaV39qnLFcNc62itShoEJxfu33NOk8i4dsG4SZIPwsun+HzCAE7FCZEagNFSlmopKUc81KVdutwIo7QU6eh6Cw/kafsTGp4hV2n5dgV8jOqWYM/eUtXZOcLs6mOnXG6xEATg2rVrd+/evXbtGrpjjaTaxXgyUkzM6nF649JdVYvYrzRNN1s7BkTi6GmTAhyKoRHIctGASu/KMeD7I6CdG8EiKdkXkS/Bh3DVC9nbe253TBEapTktaF8vttQhkYyj3dxYlhYKcrqd9dPSq7KTKMwEk+8c6wSTp9GkZ1yB1KX+bEp2n5vAyIzGFnDpO0dUD/cGx6HHCYAMGRj37t2zxo8xjnsKK1ahRx4wZmEwOZ0I38woFmTpJvmrTvUoc+xlmXUnHb4IgIceeoiQrr0cfQDH9ebQWgD6lv2kLPEzjhzzwkP9vEE8tiOFH2U5w3yjDnTxF/ZjjPZTxD5FaGhghAeeDUXKsP1KVlA5Lf0ZWVJCelyL9HLmwqvY/dCtP3bLpQBwXDBaFaegLFofK1cv95Z6izbHQHDT6l+6r/a0jjNMuwSxtjJRLjDI47PdPc3ckMidq1DNPDQrniGibqxFHFVnw+NmtESd7mu/+kWAXP+1L779rL8ZLZHaPyPVyxEvOofC1b/i0E0KtziGgiehNSVeJmEd47oiDyImkw83JjMmbleG3/Tup/xVvPLvC4AXfb5w60nj41aoA7gTrQdTts0wjjMS1WG6hi315guT1/CF8iEw7udIW+PhDkwIewpwI2uRO9PmItViBEyO0N9e0wzC+NroRQVMJsTQCs3H/Z9Wr46SYSXLkMacx2PUTE9ar4yHTXikZqm69VR6T44p5PWsSdlgw2TpmQ3vLAvlj3I0Ibv78BxVbepp/UflF8yScIxcTqN4CLFneRvi0t8sUf8Ov64knws8CbRvgq3Sa3xW0NjS8NJFALkWPuQ4g1tWcz6hMFL/GbUvabhxffTA42ORAnnzc5Ibqm7dC1lGU/2EBYrTQ22geLp3Mr6PMWwNeyUGRBJRrc2sfVhJldtcOdI/YXPxML0MustZ4hSBiLz+9a9/3vOeN5UzDcrpHd9q9hO7wKYUM4UaxEgIReXhsYmxlnxhSJFZcYroikwiC9t6Ic0edhhnvKkqapdcL2paRsBwc/ZhJurJ9PxS/QqtCu3sjXXYkfRvKbfx0dZM2y1i9EIr2Eb8yov3PVPC5NklT0aNn0jYi4b4VWflysRT4zruTPJavbuIcsErNGaGtZShNo3lG295UngGW3EjVGMTPgH08X/ho6qY+Mqorc/mkbQrzWJoFQ5fv9KBUktoIZb46QKZgY2y9aRo5ACUQnHRlVgNeuOh+o4HEcGLviDhbPEkDLaVWRV0KJBkS55K0fRoamx3akFM7v3i53POWX+r7WOQJm2WmrUhNA0XwZNiJH4ApsF5BozLhK6Kj50RJrs9bztVzX7cNo0tVVZdhrEL6nbbU8yGuyNO5nQ3HzKZ9jM6TqdE9GvtneYZJii50kYNJQVpre5ZPOLolTUtbexKq6eADPO7NC0YK95pojD/jHFxcRHnYJVb2bdxPZmINIhU80whDZw5869Ea8phECoKwS3slVPO9UHACTEQ6qqBBQec7Pkql7IEnC6PQqnbr0IqsybcD3T3EWcerNq8i9EWrQ5jIjjU1qj6eVeqJzdaxBMyyNS1FYrD0kazCrkWpzlvZmC87RltaYtqGtnuLCmc7oQNG1tIKGpXgEgWFf/0x/2oAO/+7e+b3JVGD40P3L8s8+ule2njMOgwyTSjZBckbzJCNjZBkSDDp1wAnHyuRKbCM+NCXLNTzS2ZFI2qUaW6VaaSzw9K6xQl4pPRrvQFKwZvrZRjOek9EKRKSGaO1rp5Qqu4NTKFRDLjBGqTSl4aLAu74okyZ9g1krRPWK2a05B4LHelhigbE3uSSgfyKMwkYgNUII99On7138faLYgR3M9ZaKSF5SWrnwLsxnAHHdIujaSuoJjy/5vfzcjEobHxP3T5LLoixyfFk2yL9mReryxLlbmglHCRCh+irZ/rTTYLouof1FsguPZzTjfNCC+DoI0x1pR1dRBk1jLNoE8fpnzm6TaaM5g7vs6PphhShB5yNiDdXdOeTn9z52Hgc1mu9P2muqXBJGSQJjI6pO6uTHRg785SBRPyunv37vXr162Fq0NkJky0ZaHh/bOaTJxV0qnCKY+L+eWfspnt9nplA/wnay8LwJqY5oVNtgVplJZWL1Yoy69gwRWT5ziZqeJPulZMeCEq3yi8TqLvyYwRM1kEkiZ+TT1UCGxmUPVps+BIMuCxtNCKo2OgncFq9loAO8ZdTifNLySMIYDcu3eyJ2OMexHKEj+u5DDvbgvhRXxFvNg6ksBaMg/CtNjUTSRTG+nNxGey3J3n6EpEfumXXv+CF7yAbSKFrzSjTSkbjQvlZeQfftz/Ym//w8f/+Cd82+c2ILbV28IOByWLiEG0zsTe5svTF+ffpFNEgCOmC8GmR9thYMrOz/qoFdtM1mrnEw0os9oeTqvESGFB3bTh42VXGK9YxlfinYaSPcSFCH+yyUizGaokR8hw3IeQMjkjWqwK23HZVDuVpY+L2NvlXzbHHMGa84Q+ao/LpY0p4UO2zF6Z+y6sQFZ8411mJtiPO8/+m9Z+W8rRXF2zv8amGF+1ViilaW+FDE4mNf5xQ+DLHJXbzqBB3Kc0dLU6gFjOZXdLkmRioW4lpoQpyOyE1dzC29RmIp9zFfAvHlEjlkUy1p9OdALQl3n59kYavIWxKtWvxOeiKVl2+ZFDKogwWwSj81w0iwpp9QbZJXtxdj8AvOE3/5t3/ImP2ZE0kCogLXtdLRjWllBozAgpC6rLtLgfCRlKbbsPl9K00fhsAh+XcHrpCPqZ0lb2dSC8D+k401L1AtlfUgpq71QvLi4ybkVxLbkYF5agFmaT5EwyTBGuqdX1KhhSlZOON71Ir3ElTUoOwqRNGioosjofahXYqMefPM7JcSaE/2BwU8balLsHsZJ98bDxFKjESUnSPNv0XAXQUgoVhX7PyCyXXhnMGqfTvXhihzKc7LuEeSaWW6Ux9HQyVgd+HaoHcETJWFhnUl2L+3jksRg16SY+nVxol1+HLQRD+dPN5hFxq9GcSrxBbD7Iftr77Vu/4/XPfNk7Llar6WdDIYR9AiuwmMbTTQzcBkAX8L4+gjCRmNn0zMVABdazKZqXkWRD1eJ1jTzydGz7wssgU0v/XmbWDkCP7ozdTHZHRta8UxepNoGb9n5FGbNPRNjWylIOoG1tmbNBoYeMC4BRvhUwMgSVqj0ZYpKmkT2hLK4o6BZt1/kmOksag6y65svd3EkINqX9xo/7SACf8e0v723cmuN9r7YgB4Xzxffu+8vmh+hj2XDXGZ6sR7Y6GZp/Ogfmpw5upIGVaHHaHHYgXGd+rqrK5qLyeTpJ8UnWgrpDLqCq8Z1Ny3E051StD/KCddHgGMz713xTF7bh80icBgSoaKJEWDTBFooDc19PPj7VAewWs1huh0nvy1/wxQD+fy/47he/9suXMovLhDx12Vg3K7wijVzm2SAzVplFeJYaEiKE8+/pWTIuM2eOE2jv4UKYSYkfmRD1mm3ZR0bLX8D8qsTXV0XsTNGeLH8qNDcSpnmcFblQ827YQM60Qa5zhXSmSRzTgEn+gAZZEMbRH25iP0poabO61t+qN5uB1AyhqroJKu0zUh2NyRMIa+mbSjOF0qitRF606ik+QVitHmMAehyH+n5gq0DVN0HYkMCgVcZvfGRCf3kZgZlmPwYGOfIL6B72jdV7ZI+GpDqa+cVf/KWP/diPWwdjEOiRwyzZ9Skt/HCupamV9gT43t/xb35MfhwAPgF/7F//SYjaCbxTX7Cep+nLMxTcsIbvy96g3mF7IWHVUzMtJStSMrx8T5fMjgSltS2TBPhDvk2N7zzNAsltn73CQ/CwKijf2oIghhJH4Kr8yH4WqfkQADSNQumNf1ZvhBVRSgR/3Xb3hOcWc6z2lwH84d8VAYkP0yX1siC+GYr8UJLnY6+S88WJY4QbGTYtUsumqwDYui7L8dc/7iNeBwHwQx/3UV/97S/fjyHOd2iqOgA9NACvTO/hft27ZNa5sAnxvRbr2SGSZw0cbXQjWXIVtBMACZ8vaKLtcVlFYNqlkTmotnROAwH/RkuhJKja8fTq7Uy8GDMbBiw0o4N0blHD90496TifBhoKF/jGKpe1p6JtzbOoSvfrTUsIB0tgLB515PD46HqnAwLof8QrZaiNPgi3cBvV/FoCskXCVp2hF952qWl9BwRhHSXMYGpm1Ustpios67WrV2MjYRiFmeyVtS1Jc2ebZAzQM9nOMQOoIYiGmutEhvolcTOPFYLydnPm53RP5nnNGHpK+KGGl1BcyYMxkysIk2r9ruGqnW5FGDWPDPHEH4epkiaCULHjI9g4QyhaVsW8y4zTuvW8yb/U2k2y6SYNHJHRABmKfkT46sg5QUCPk+pxWCgLgM0SBpKQsKDci75mK3suvhk++cUZi9Ar3rWXp4+mJwE7ube85c3PfOihFq7nisJwhlNND5eqXl7hD3z7/0zVgIXbfFn+GOb8hlu93pBI7izSnHcLQyASLrMgVyGzzRCH1uj4p6BJkUZWV9wLknshc2nReRpTNO7plu4gJrQCpbur1TPbp8EZ32VGFYKEjeaa1EMq5oquthQ2IotpxJkYFAa8a9yOmeWlITWfMhgXZiExVGio0y2MBc5tpoB0MMlVEyjzUa7hJJ8OxjRVNaQ5IJ+n22wZKdMZJgCjS5dqnPBRzrUcWC6ZSAsY+mx36TFz1ZrIhTsB/yr83CdWq/jqzCw1TbIpyPaAx/tcUq3VlK6yItRlLbCIAh/ntnRkb+TiGPIhEIiK6JGxegD2neb4vk3IGtG6kV7Gf1MwEojoPBdBjSFNPHiiYJqjmGvzNuz5yW5L9Yhxrk69+ZvwEb+k3w4gJgOteR3PCQTLkafztTyUzrFsMmcIK51ILpIspqXVJF2qhUqIDPPXwKm8csdC/cWWsAxOAZF9Y4knygILSH4Yx0fmdKR7hKzilQiGCO1Gb0DZiDZhbUQQiJn0xV/10RFbYc+ugPST3DWWPeUUITEuc/I/zlDrFTJzcV+sIrwPVy1nfWgagzbK0qJW3r/rQqv14IZGPGGmCa2Yk1vQIeMwVYWKHgcd0KB6HBakGUOOe4f9HEPu3Tul4fVPy7lMVwzAtoOmFHaiCgijRh3ctMETtSS1Gb5i97b6ldZxUQ33OAm9yGRkdg4WArzo2z72x37Hj1MTgK4nhGCEHkrUoO48AjeAZvqmuuguvYJQe2XhWP7UfUmt0Fn9RHCR3+vwRDuX5o6CW32Z5/MzxoJsVc3VshYB766Ok0GPyhgw1ExJWw9+GcxK/OaOoZGWEf6FZJezrevZil+SRxYqhJ+6IE5vSRDgDWqYpXMDNLgLugG2hMWkYousgqgKUYj8iW97+R/5+BfnS5+hmwqzG7HaD0mUx4YxMoVJZAejoXCr0wy8GGFt6lYQVlhZn83PKBd3buMEerg3vp2bIUAdYZqSR8lis5HEP+Yi6ssHYUtzZYhDrYuRqzEBWwchxJmJyav0TlvYglcdcjE7ATzrsWe96Vff9KxnPcseSd/DlIH1TfZdpai+HtE05w3P6xGkwIt//G/0dgmdJ5zwULt7V2p9Kc2meQBo2OPEuBYMt6hemtvaKnqJqM3Aa1k9CQS0Osswz5Z8BtlkTbNFTdqN2dKjCYD85o/rjhhot40g7ROxWtdci/nwMcpAEW3Y/mSP3Nejz17pfIEq00nuOfkVeMv1JJGH+YDgXYdTZvqdopLiutcw6w3+8xK9zaw2UzwFqyYJXJOZiCSSOHzE3HSs9YRwCfXaDrdkUi1eZV93tsS+GOvQIePQI0bQ4zgOCRPvFmocUCh0+LxhJ6JOGE87SEMH67a+LYAYxcEbAfQtb3nzM5/50Hk/KyGatq6ZpykV7vF0w+J4z+z/on/9P1XBbkg05q/I0hOFYqNVNwxmnCUkzX0JY8RmdUJvRfzQhN52bmYzi/V8Y1lThTTtEX9DNFre1K/nnixQwd+ZecFAEqyaFe3mqbyIezwx+QEDmkkALrk0ZD1ZGJQSUG2GLxSz4IROK01jrdt0dqukoWzBEbYbdJ+QqiiNo5QIyZRAanE4MigzzXisUJV+lDNggxyNrvE1kV/9bS9PbxesyJKzRfFv1MyCMV3dfDWu9i5GLOmu8RWBsxK/nUNKXiWBRWSfE1xvDti3cgVQjQgkw+smUCKt4XySwmSo1ZcwY+Ci+l40BUHlqFUoQNtyWKCB9SGA6dNBV40kIVsa2mQSK6dZkOfyWKG4gXU6PBpmqmQClngudA0ecwJnccYEFvM7ufM23iHAp8CAKm+8074U74wgsapKJwy8C/aMwAMRHSwpkhbZ4PBNENzmWLI6Nc1V+G739vmHqEnVZgaDXUpY61CF6iCI0fwIylxwEyTdbg4YOPuakWXfn4e0+knuQCnVsvrKIKmfLGoUGsNsij01MTpEI6TVQ6lRBWlvQ9MOGnjJVD88YnUeGX/aIjPjdI2o1ptm6FvkjDrbibWNhOJNPmyBJHtEwpMiIjhijlXEDhe21EMubFG8p5y79kimkL/Pv6AmsA2KsktqAcgv/MIv/nf/3fNoBJ+Nys5tUKEXq9mn+4uWTKwv2VVMpiSkXEWG2lel3Uwg5N8AfX6OEL1dcA77nat++p4uJrq7t3Z120G0WSEKvfn4jccee9TGq4xmerFBwZZHfo3pqYapCgk8egKeIvRKleYhhrOp5gSzr54OxnIBYzgyxGNqztAG68ssdwxUAkDKcM5w95fKjYrJGtWYNe7slPhJxnfjpZYmVqU5C5CxcINXzRqEP0AJbTAgaisQkC3vmshiT9WXJWzq0HUooHatZ4XvUCnKC5KCxaacZiz/Cj4v4hoG3zypHO6DbSfpudFI8jA6zjFfBqjKZgZ4zZWm6ad9M6JhrzwlOMVLCnzEHKvWrzTUAQGydpRqMLnREKU3voVQwq/NrGna00wuP2G7LyLwxWYc7/RWJQ4g3vMeJglAQJ0TqjcZ5/TqUfzIxXBRHEpLmykQqRWBe8g4sUGA23fuXL9+vSWLGadd9k0hSUC6/ok7IZxN2MTmlEHslGybmtCJt1BivTvSe9h/w0/Fir+0zKMT4GR3m0k/Hdfv306Gthfu91ck5x2i+xy1LIvcUWxKdO3WMRgQvzqUiXvwfSCf/QTfHKaKWuYgVreBe6saWA2ANvNH3cf1xoNMPAZOp/wya6y+OgLkCrt2GQP37tkpDOYpTm5hUrhjMsgChKoHSpJMNkDYy3cV9I408o5oHVJ/kt8E1dm+sNb5+EADNgaRp2CJdIxF/ZeP9rqaj0TrVYfUtH4oDIeW/PvAK61DMyNBRrp1EbFJHt+odV+EMcWWl7eStYYXQYC95t6mtpOZuAxhkJrkkw3Nl7Qh0bzECgOyAqWel1xuo+pwo+oUXbo1JD9nWDpE6E6Af+ZQxJ/PwYaGsZDrExxjrfAX6Tl09wkzLpZ+mB5yyMEMDqQMVcPu3AqtKNdaNswAh6EwParElG2DPgkDVdWjLSf1g4JskTtpdJYU08o+qefjgHBAvehgKZkWMxsjukZ72W7EADiKC4JLZxUi/gmSpC2sk+PX2E4oNNY93JOQs6BKjXVh2SMVlmAnwrAWSVqc77zyEemhKjCmHQXPwpK0fo1YPodbqOxyiF6vNBsZUprrWzcyHDg+WEsDjyZvNIfgqiqAD6ab64kyqXvcNVBFXPglV9DbBucbiZ0vYgtXWCWo+p4tn9zYuO00jtoLTH1KKAWlZb6R0yVE9VAdEQDqkhA83ljd1tP+Datu2WSKs29wFan9FRGMWNZzBIooiBZr26Xcfj3k0pWktYBR4TahNPYqUrY16eBxSZbsGTRWbi1vEyZGLZh++o2T1IBj9jan9B6OKHSscH9r9Jzm1p70EykQsRILgNr5WO6ctQ40UkUGMMnk2hFZyv0kZEeo1WGiaKlgWHmkk/iFX3jd+7//+69iNDFtgrxTWn6qbR6HJY81r1kTRuTRToR15wCMODiAQGxZqKVphnt3qSpssiLIWhxX/C/t1q40d6VRowZyBX1UVc74fgm1Rw5bp6Lzn9zNk7S2NZT3vShtQlKaJH2a5UTiiD0YOMiypeLZYRZrf/uurwU95pHXsLCEz/GQpZtIJQ+B/mpOmWGeXpEAeQzHLMMhYGUlo39LtNg6lS2vkffSRy1qksQQDpiakSCmBigTFuz+z52rNkw2S7dUbCP9Vs0PIERashxlzy7WiqK5G+raoJ5GmBW246rOnMgf0KEsahy7KhJqSSyv7ks0jDB3/pPAUMBfcBryqJqkWppByxxpd9FILejj7iIA/qk05i372AsSHgmabYmesPkEg43oIaRv8scHKUozyaXgrrvNExbXESHEEAzJc8WQenoJVhLYR5Fc2c+ZVb52bAkekos5ok2y08pZo5cgXuDGQ3WIyIWffVWewv2FtGXvBV6ykg0qQpBWDZotavPLZ0pAhyftJPfAAQGqnKnpfSvw64W66tS84YS3EtPkE0Jg292C0S+EkyZIFK1oca+sbh2LXHIlAdorWMyiI2LxvYRy1MbzRAY1VlA/H8sO0LJjHTTLrRodXx/JpO6BnPnUxqJKapJXJj+xE/HZXRHTRk7M77InO0SqB7dnQ2zykKQ1KxP6IGyv4299+TVUpexjV7ZIZv/UAsZQgoaCwsHUNOiityjAZzEB0tsgz4nbIok00mnX6t8uWCOJqa9gztfGmImIHhZ0LDRA/BHZdESWNrHOXXFKTuwVryzCi5RCwmPjaqtIsuQNCDniXHILs2xm0GZ8IwgxyGtiuL3cBbGUjzpjQgl8BNoYdbyqkUEWsygk83I0kTraQpxENm7lqnkELzIhW/wQucQfFxG+ApD+w5CZphAqIBja9hsyc1hrGiaWJqBNYoOQRFSDtkDmKtJlQMV2aThxIjgMuxAiOWKFCYDqPmVJEPIjKXIZr53F2zWR1q5pr3SiLzdOtRrZwgzrBOsLXrd+JDeZgJynnhyfa44wM6OtHhSx3yU8l0x5BwxV4BBbMzf3LzfWPcnw7RYxYmSQukCZlVfXrl27e+fO1WvXyCtOuRZtn0tzhhC1jQBJkzl3LpuIWvkTBtzAky8HT6/U6+XzGgYg9rWcUeBygm6T+gsboB2WOlNCsCRf+TlY2qYFCzBBuXfD91CYhKASM3SHtAolaBEZ0I01BO7v5VjmTgi3zee/88WKtL0Jyqk3i3iT6IjWKIaI+ncGJcJXaYsUtpYLpi0qPkt4yopcvEQbeKIIVsyQ8CBGcuGkNAkrIiXPJAOg9nmchrQA/MIvvO4jP/IjMh9JQ8auYqlpELd30lUq73ksgN9tbq5pbJibbyaARQ+rFWOwTV+bQLRJcaBkPSnKblYl77spKu24q0os46XDRVX2DKpq4l7nZ1NKFRU9U9Q+p2ou+SxHHqBEMpR95mqvhvvLOlhBOj7KoVHGNUkIY58sr5yAf+5LNcmIbcIhM8QUr+jaq19x5wNe5CUQip1Uft+GfWMHcjkAcP3//UVW392/+FUh8w6qRIb6LOHqOaygEaEyoD5qTnMcclG+Ss1XaPJk0oi1fAaaCgpmhZQdcqQ0ulMWWThgDxpuCMCQqlfHVoXFSsVQb+tCpJlZbUKlQXUFMifzzGmlBEDDFGQtUqA5pmuZ/kUr6wnV2FxMMi4Akr9qjapcZMFYjwLM0ZBI2eJNYVOZe1ayJUHSwXlC3SZIRMEFppDcRYaak4dhrtE7oncHcnxYQ6klGf8k81iY7JxVWW3p9DNdAwCzJPZxtuzKclXpSogVEidrUI2ug0LzWAooOdO692p9rlBSinaAqf9UfqU915mw1pnSrowaEFdoKkCS3SPDRd5EF0UKXIXoOvioicXGGgYKDpXmif+siCailGpvqe1PjRKqZAqPTVEuYCYj0QWjgaTH/uoR/XMc1qGASn5yOEHn4eshxD+MU6GsIj64pzpCFJA6rHrKmsVXTi7QipszosQAK4lI3vzmNz/zmc985jOfWV2wuRyISAkf87f9CNhSeVk9CMz4TJP6ctcm1kkkWVv/6a4kBC+Sj2za6rHE8U/T5NY4Rw7GOA1tGWWOo30E9eAcSUSVVHnnta6Ma507Ww2TZTiCtecs1PnLoUru9vWGX4LmpvzxzyEitnINQJ59E+benI4Lc9Rp9U/jtlQAtW0t1iyCWfkeuVbJuHrtK74IwPXv+7Y7X/w3OWVMZHh1dt+gsl9n5NkakFQBiuPay77x7id+RnkLH+ZdiLd2z6u08xqmnY0eoGgnIzDoFywbhIlpzJVOvauyAhi2CUx01Ecqq9EhAGMawUaiBLSsO7kRlJ3xtJg9WBcTo0Ejo4RJd6pdYdX9iRE26sn0WcmkIX/miVACcjpsmrqBIo7k6Hj+csBk0o8sHO0rqBYMyyA3l3/UvF75/vlyp1mJJD47LVFEwc/og4IaWQL1sVswIWN1xmSxj0ecCJjRx5ngc7CJsGDbguMkT2CayusPV+YUP0VEtTVksu2dFeSm7d6iHlI+wl0Affi5Pvlsb+yJicKeY0QwBYknNCZCUGctoWl/pfEpQgu4mXVTKs4NSkVCPSNpdRJWorlGXERAWKqfaxWwbMI3gfnmMBU/j3H2lItF1yrEmasStbaQPitNuwMY48KC2wybQo01fLGz9HQ6WDH4Oy0BtCUAlkZsLw9A0oD8aYaVOOrwq4iL89CD8xogZu+8Q+v0gX/wD/XmLXMgT37plzZMXNY20jcgXnVpWqjmg4V+KtkHH2jS5nk/DYH4mU7A/F8rM/rOFAy09WyCWWXU+vMiJYs9p3tjpMcPhkh0SdvnknGCdTzXDJCWuU41WSS2UcoKJT1j5WOmrVc6CEou3IMIlV+yjpC3ZNdpca5Ip76W0POi9S0A4Nq//Pt3PuULuEUpt75eJ3nYyj4n2DQudhh77hMc4ed0M+tL40axb0UaRW6vIKr6dtdf+dbbLwpqikKh1lG7yP2c80StaRomZbRjlpY4ClXh9xMGKrMsNZTqRKwdZ1n4w/MtPXwMRezaSIUbdgIXGqIymQsxo0hupaRFNa3ZBHGMRYhQGcx/TWd9dUaNgHBWvgKHRGTYBxZ9xoMqzcYeS+eVAUlXEmbT5KYwJTlx8e8crOEDT0ufSrPmLWmyu/Nn2EbNLqigpWfff42nylGB4M6dJx988MHYCZotuER2s1Pa26V1bHgVC1hnkUAZEI3FBiyBnl5VKFrhcawUKj1ER0hIZKJKE72lVDR6WI+mmGU0YoJi5fWuhF1tIzNyorXWVWLW0wVzWXEV7ND0po2zaSSb/J0/t50fcghtd2RDzgkKVdH0pNY9MEYu09PaEsjA2DVGTajFf67wBLSh7Rw9pWPWXQeS/zHOGyYPEdBQa4fNQ6LWniEiJ4PIRgCyoT47lv7S79785jc//PDDO6uH7CnxuYcjgtCTq5HGscWOu6LKYLGbvCzBJlZ+SZMktdaqJJg8hMTZx1OnZ7ESLMrlNd6RSQHY53rGke3aQqvecd47NfkE+pddAdkFftl+1r7x6dUOMWhPx5o+0TB59bNXFpHyz9CQhhyBKYLzE8jbEKqKf/bCfwfgM7/vt4CAdYYwFqQFQO986h9s/eqvSblmRgj9XcnQjCNIfL3q7id+xkTq9T/1R+wIqDt/9auFT/ehKvIprZTzjlOoPPjSe3rI9Zfp7a+UsphAtyelJlU5/7u8gLApE+PE5Nxi/k7MEk8liVOsehrjItFNDJ7T00SfxqCa5sLI9CRXQW/SCOt+XLHgp3S6fCRVZQzfWd6Uc8n0t+lDo7AZ7mAjWaTSVPtfyCMfWC+FRyNx2PazhoKZ1nVkUf9A7faBHX/UaswsdAB8Et2WKma1VI5/FVRtCpsWqnPhZ1UY4IVExYGWYJ+xCm+RMBfX4sByAsgMyNjFr4KRVVgAQmo9+4ijGey/4c5Dhh3jHlmEu08SOLLwt+YgmOCiuryaiQc5pvzYM4EhbSApG9wm4+DYiKcqEOok7dAsZ8eEpeqtujFls8JptBYnNVeTUIy75MxAihlQdGKWaV0IsF5Rq86slZ0vanTbDGB+POc4wpKJjHER3yDadKpGVwEYxi4RVbsVDIXaIlo/nkdDEKRgFwmiakaw0qu97nU//87v/LwJQ0STCwdIWFhxs9jEnZaRuq2PPmMMnQax4T/WzGCASkyzVfgKEMQ2wDFI0Js75VqIvDJBS0cX8po4YLURuwr5TQVkXC28q1JHTjWylZlJzRG2Hkqr8ZTypRI/nWuGA/e9hPLUQ4I7U9q4QAt0CnyfUTH53z7sVT+M/wLgh1/4n7/y+35PmH2QYzMMrADufFHODCbryPLWIp5Ndd39r23yu7t/8W8hHCYVEiQpRPT6t37jnU/+TIQ2dT4UdSIS3wZuog7I213/l/fufFrStfUHvaFefe+RnY9x5ZA6OhxhnMvZD2EsyBA2l50VUgS7NCv2IKO3Hn1M5Gm0a1BccxWJTUOo8QsajN2pFMLv02GKGCB1ter1ZLskslixz372s3/1V9/02GOPNa2pdS62l/Awo21Le2gaMcexKcbGhAYgqC35sM/SBLUOTkVUfR3kcRxl4GY5pxhqWPX0yFHm5Bs1Vkz4GncfPGSqTYh6e7nFNnvsHMiTIudrITtUAIF4yW2tmitTwxOQkIsxW32RZ74YmLKAjyovwZqWt1tYJOcNCaqiyCECeNk3GZ852ZSqfra2aHwqZ+LCBJJibFbzhyBXKsupDQbGltVaQHwHmo0UoQRQ+u2M4QSnercS02SGwI2Mc6vjpwGc6YFtG9STHdpuW6KGyMkMrrugIffuHYFKVU8xNHHtqJl+rm1ribSi6eLH1x2HL2Avno/sl8BqZV+8+wpAkBR4RY2OJ7/g8yvWszGCZqvIfGZXaraOA0Qdn9kfJ8ePNJRob5IqvgbLviBFo4oos8Q3n9SX44pmmgzSSN09TgydE3cmxmpkU3MmRNcr5fSxhkMA2xAOTRtTbqadyLAv7Wlcq/g2s7U1hCQIWh7ZxaSug07BBTSjLylTG1lOGrqdtPLqSH8k+l/y7wucB5EUlJSzeaYuzz+zwkFsMVzzi4ocNS7lEwrRjM8BuHf707K9vWm6+DMbZ+4arfmvw25xS6UxyZbjllgB5s1ySxW1W3aVUv7TyqFmEM4sw5ooj64/Z8eKAEKWwGJwJucaLfKtprGIF1VOm5Vh+ZlXAxsZNZslaTKPvj3ADxiDJhxBGD8TlwuSgfI7vZlrW5wYuxkyFP7RDqfV6VGy5T5gm/Bx1BLH9Ulhqcl/Z/DRf1kUo03K26tGA+Zr06dhkIfk7w02Kp6spRGoasxzRdursJGtgTFA/GD0byZKLKRHww1lgSTYdQAXGoEKWnDMdt60KYlPbTdeEIk7mCU0LcjP/aBRhfI0tBlYoyRwA3M2FB6u4eC+JHGnV1N0Kp/Uo5geOztj2F5Je+tkhzucwOIE/qhdM6KaKoUFh/08pHpv/9g2t3v37qlqfOzZ7uU4YCdaDVpm1BsO8vc+08cjkgrsS+oiQPsPNHZoh5l1/U2RfN3rXveCF7zgzJkCyd7suOZpZ8XgHKFlJYCQJDeMRcixQiWnikRqEagijxL1BVjWG7Fon+UCCAXIPqhlzxP24k6KLKgSFBC5fu1PArCVknfufsXlDuDM8aHdj0KLQkphKHCJVLC5fluhVaOM3HLTi5XEKWsvpC6d00iY2kx2LOyq3L/n+z/oh1/4X6bybGDm6uOSfybMTI3wXiebhRni7Fy3pIHml+bTZtRu/9z55E/v81wZkmnHBelxTHvk9PZXQk/+qZlNN+okPAkKyWX0tms0Ib2ySG7yoABACjx5XN8WOonlOSQ6sj726Gegldt1IYRL+xWycA5+d6FSTra+4udCdhtwz7ki16QCaRO0Jk8OeCgq40+TpEST92jDCw+XOc+rYNVangADqtgjmhQSy6QyWzquomJasYxZic/dXBowMgMbrSRTvT+hlzuovPm1aw/cuXP7+vXry8yG9owkh86PFVcVvekEe/OqaTwt5pqe4C6sh7kMuewafEnMJBpAIGBk7jPL74Kyw1LgriEUIQQR4HYvI1iaoElQ//poImNuQt+umXBYcjZlRW0msR/bA99MRPGkyycHz61zxxwMo07AuWtCb5FYmRhmnwiGyEECQgyxgf7hcEoP1cMg1+l0+GCh22gzdqFdpUjcJQdoIZeARiNdAmg1qEbYeTKCUH37t387loCshsClxsTH4aglRKUryeU4oNQMjnnq+/AhfBDE8CEE0f5NhUAOPSf04I98KJYBsWxmO3zBGVdgJ61D1KDpgHM3yrmGdTQwe69iqD/Ragp5LIZ8YAzcyvxvQFo2nlmfPd2r89HUqiAbnFtHbEqS8NbbRe4uVH/7+z/LzELMTLQBZvTIOYaH1JMgRt818+02p1uMbNRUxWjVOS13/trfySFBFJBdZjf9KzTCGwM16Qont3U/oPREf3uT/2g0PTtBsq5mD49A0yRJqU+rN9tdMwAtIreI3wuvQ9vdNpGXIljgfxcDcn8bkjaN7UMMynbNEQC4/ubfb2p/56G/TxC58JMBLA5Kcb28XIybRhI1SDYEvGQlUlRxkQluefo4X5kP1fcSskQK0sReCCSy1FsLamSSPtasOQfeGM/MzJTlvmoXiUNKNz2wPtLNUwqRbGkof0T2Npz1gBzWHI/qwtzoNHhIDcr7hC22q+gicQgjId3RU4rQvOfsSZMnEz+ZU1diIjPHDqpT46ncCXIhcVhaGzBrMvs0mdpt5bkZw95RPVgViKMlgAOF2GHHAG66QcoiheK29toHvyLhbBTAsNMHhhyHg7OAWRoDqZnyM+ayGVONBRN6WEyrTorP7gwjENMEECo8tVoBefOb3/LMhx6e5UayFqouQ8pQ6vHZaa3XPFKJejRskMZK6oBSTm9KeLzJkF4yT4ljBVgCoV20+lobi7oo83CFoYFRFkn+eAPPSRV7S1cnWY3MQhoIK/NIdm+HtDbFn0eAa477J6Useln6ahaoB1Zr4mml4HG+2bN0e08JyYHRaAHd2iSFnJUAMVktLpA9DVkAbRtCiTCtesL+SHcVSn/rSQiOWv/Z6xELWB1KKZaOi3Y0QJDIo+2wSzpFRHeRxY3aphb1U0UYH53N6yVYrpMMjpklIM7lEE34fXjeYNbWx5ORD5u4V8BozvWnvhKmVA6jWAG9IUNGG5XFoBRALsdkqxiiW36W5IHOX9pZP6+9RIvd1lFihvlwEPLWCE4KcVKh+Eu/5Qss8Z979d8nrpEWh8iIkMqQxVm+EpaNXTgLdeZE1JkauLtYmOdEGzvgL5Rf5QiftGyzfssU1nosj3F3MyWx1MSuDGAFYBmTbFDbY4oDE67CdI9u62SnMomx8piGsB0QjRXtJBlbzNT5Ffnjl2efVmKJVEBriidtfm7DVIWQJmS2C1DhUg/SpwWTR1xsYgXATo+F6r3ExiLDPt4X0DOZznyIk7up5t6vFKVzfea4nQMmlzYgYJbvMxSyTWncb926Cegzn/kQvYJ1XZYw9W/aNMKje2vLwGtvZRaxE4s4SAIseh7+m/4ml5KLSkhI6Nwm0I36xhGvN89CvECAbntx5+6XC75RRGR8Zvb/4hWQ5LVKwN64vRLJQhS8LoDnQXRfEV8xQdQqnCs7W8RlJU+X2aBNb9oC8z5im4BpEiMhLpZoOjaJp3jYCZw9DX9uC9fOWr9L37FRCsxcqJM654y201vf5my/Dgsd5SdTOg1cXHW3RoBEuOpKsnVsAO3Devazn2VrtJd2pPpMSrqDI+t4wOJzGkIg3lhKsOrCZPBjB3EU0NOwaK2gajbKCV5h8MB7m7VetyXceeCLr7/196MJXPEhpaU+p+HVjalAm2mhxh0RIy3oHRHMI5l/BjRkLYXP4guM5PuqHRIGcmoyQDr4rfjnS02ZnTkJ0OSjaq52Ojck2FsMAy137tx58PqD3RRcYmH23boD683PJkklw94KTVcFlFECYLApyzFvrLE/jxTOl2FdXFzEUVgJxdHaFT55g6Xud88/J+x1JbmASSAQCzmV+TZHoQpIBZU6+yqhhwnqqzsIG80/uxTOKKpuFrSXQtxb13MtM4+eNxAPHHfK6QQ9NJa06xjDzxsNEyD0wXaJOGAnda3HDFDtS5qQSjzJ/0yfK1htgetRQf0AL559OUMvOVCOyo/pClZoqGdWl9cxeWJUsoqlxSsXgPgIsTfWfVKbIuR7WT6SlUVFCf5zCEkg2yBaQE/U52mQZJxFPjPycuLW5je96U3PetazyJ5ERVu5YcK7QLKnyU7fZnOC9HwVTMmlFNzvKvubIqMcycxIiWoslpsjQ6ybEisnupHiOdP7U1ToTbMgblqp2Jn2mpmob0v7l0+CxsyuWhBW53KKii5FoFM9U32Q7hZoESlKUAQvaj7DqamlcR1CSzMOTuALT9NFLGXPV4LI6r3QmXUV12VXeKsOSZc03LTP/23vaDd//7tevxLq6MNoo7NtO+AoJ5L5bz/0D7It4ZvROGKiFeUldUVBH7GrqvhYuuxP3Euu0tuOLUHdrd37hO9bRgimXG27LjeZOeVL/qOR8TgFbKElBoPNa1danR9Yw4IQeKxlM/6chgpn6u+wjIdV5PXWXHECiUicE1az824j9dBj6Cj4Ra+UlrdrVqcxuytCn7R/G3EVFghF3tmrYt90ZYjkR7VcAkIyEnBpkw9LUkCKoi/rQQwhTDqvK68AFVk/ytKkf33Y39YNh2TqOUC1c64GFKoHBQAOm/9TwKNTY4ieDtWjPvbcBuhlRvMfhQ8hJmVUl18UtShgx0FR8JaKeAWJaTiKWB+JsURw69bNhx9+ONvVpTz47/OD2hcZjI4hiu5kXYrRpB4TckIsf2FvF3gm47HqI1YBb1iLGztnErU2EZKLsah1FEqZsVdrCFtpgnc1PODLfY/wg6kTe3oRQC8e/BoAx+0v5FCC+45ItjXN5J3tjgV+qvocJU/XO07pVdX3Px6KUo0A9xomvY2Ds/JUnDoSVmOWR20XYRuwktLR0btQ5KrgoE17o3a171pUMm9bKbKGNh+Bkl4u2LEMnXsUx/UllWERJdsePbuhZEalwZyoXYiqvJlaKuGZTKfWUy771SWJS4mMeeM+KbXrcg7vLLCkssesVlDRxmNSqAf4uo95z8/5zv/Sy3GnTiv3g8nde2HmM6JFvd7yKiIyZFxI5xqjNBJLf6UQP6BQ7QtpfRzSuHGOY015097SQ8qYQjI1pt7LJ+N33Xz1DQCfhz88qwahnXU8M4cSyBCl2wV4DT0CQoQFmJtJvJy+3lS4rSOvS/dabeWZjKR7Pbb5Hr9q1+B7Wt5u78YQ//RZCanOIr38jHRdsruL6a6nYS9cgW0ojeGrBqZASJuEt58KTTjFudhPdaRlgMxHgYWWFIh5rmkl3R5s9RVw/ncDz89cIU/nsJqVk4uQqHGGq3znYH7sGbHeK5qvll4EEZ0yrm5pE1poxeMn7iCNvMEwbriHGNUNb1lzed3rXhenjFpjDy4R7vKPvEmDBh5L1dJd7RlnXJU3QYPreRLtrjQ+gQdTOakIRzSy1nBEsa2vRCR2xxwIAMRVLafY7bGISF/6vBjJctL3N6B49fv/KwAf8JpPHg/+hQNvHILx4Bcet7+mHC9NyJKLoJLbFtK5/KcBLP7bruQGQHoRFoD1OEbVOXU4URh8ijCPY3c0kMHQyvdXVu8mrjg7r/Q2tagwFjsOalem70vHVG3S3zWry8CipK3SfiOBV6Z5kLxR0AmW4iKgLVlCheKJcMxsumiwernvL69pbumBB/8sgKdu/6Uz6afW7aoWsXNYnOxYVx7mokBPykkjPKUu1Lhwm9NZ3udc6IgoqaQCCPzzkaxjSyfmQxW5gKYMoAPiFtO6pGrCQOnvNCcKtxYH3K/Ct64+n4c/tCbslztuy6H55DBHiZDMzQq8uRQAwLVr12/fvvPg9eupvv096gvoDA+WZztDmtLQXtEEa0UNTZCkTsqFffa+k8xeKb22WtgvvkhYycvrAJOSysz8fa6Gq7bp86BRlONMq1RPw0BqNJURfeGwDdKa9ohShAYo9RNpCdpDVDnngFEylj3E2ZseY5uI8ee+XB3HEdBS7NM3b9V8IEPEdm7babJ5FBZbYZ8SwiRETrOmMQqrIbSwfXZ+0X0SLKI+j25C7EkWwcMPPzP7m81ZOB2J7k3fr1Db3BuGXhEmT7JdTNLUHVF1Yiy4NAZsonp9PkJqVXjSL7nLj+JzVoF14BHZNKyxDrnIxtI1KkgxvzrCgNaEXbcCDDIuu77hA/7MG/F6AN/3Ad/+Jf/pXdpMJHi1VrL0/+mrLHvcPK0rxSA9AKmuF+j21YZjHSAi8sTSSYCEwVM1jKFTjbSBbin0aV8LmslxhbXBv2d/pkzZlgAyj96JS9OXcrKoqiss2whlV0/ZMUhwYy4t78+awftjoCmDAPrAg/adIr364FfdfeKPbrOuNdF6YaLNzOEAW0I7E06h74y3s1Sf+50/1TOmVckClRlIJ3VJbmLt+Gbb8DREO47RQ6c24KltMvJt4vVF9oRZE9JaOZMV1H08GltklkaquBFQqd6npTqTu93pcmp/GTnh8TZzgH9KRQcUEzFMRIZfvL5wW1TOQi4RHtPuSUO6tsC19JEoVW163UJW6Xr4Ghf+JcJxcYEoNqD7PEWwuLPqeb/fuZLmPnR+eCWKr7BNWqLQk9Z4MGyKNWX5HN6Bvk6eQRiTuLJ+jlfJ9LDaw3vc4m9ujhP4cCGztxvLb+XHwwa/qKXmxM2YujW0DxEe92pz35Bx6GFsGOMCdkZDLJAySCFyARwhodaReaZOrYRGvxKZTZ1Iol+s04auBNCf//mfe5/3eZ9AKhImLBpbfxF/Y3ggChxNmehWWIVi2oIDFQnvxLf7WUouACnNaeIkDEAqSUbXtvpJIm2tHhHHahdNSa0l1KcPLW2O6tIfdrw1F0C35W/19p8fD/6RXcrWESAxO1P+/5VLlhtsTHq8mTKWYY3zQUv4Wp69SwvYFFLlqKwSu0mJw0GGDI0PxrPFCDcTAUt/smHX4q6Ue5bMn+NCnw8J+efDkyNvAcouA4pQgcBbzY0xkGJiuBBZ5lS49sKUgZZSpyjZYt9rUuxtEqfQnY7e3pYCYgglcLwtyNER0vD65mv989/185ZPz4l94YmRuj8d1KxHbl6pydYs75xCTebd7pgR+VKsj1R8EIgB0eNQsr2FIXpXkplrDpE/VrMeQ5V9mo5vaPrdoDTWogjQYgSgbBMV7EetmB1D0phbQtm+PZaptEIFmitgyp8ke0Qa03ohWXXuACj33TunUoa0YQyx8bPW0e20+uoYrqiH+rlox2GHuctoNq23d76Hm6DLkl1e1JURXxikaJObSN/BFy419/RJLkZMOEWwpjwueN2V9V8ydDPTV4wva9sfLhkxXbTjYE3JfbyuFcv7YIZS+MqafASUgc1tqZ78u4QQIM+/9v9E0ojXcvggI6x9VGnGMcW0jLs9IYFjDe896hAuasEznvGMkFq2+Dlo8PhQDlAAQZxt3dA4QQQXg+7p0pNFXMqlIh3DKrIiI72pVLn0K8FXWNi5q6WS8acYk+JqHZ0T0znWiWrhFfNv3v8A1gx5ffar//JXfODn5c/jia9pA0ruK4aq/49Aq+lqFl8sPlpKihWyBLqCqkoektv8ugDThHeKR9qiFDoFkFs7Y7yQQxwTRUsnq8OKFSIHUsIJp20aOb/Jd2Xx7b/r/+YLrbNv//avgYPAIyvkkFNoN1JJydzH92NXV+vgssuk5MyAO7yCCAFlNY8L3lzLR2k2fvP+F9GU1sY1cRe+aqV3q6tu2oJ2CUayvro5M6NJ0KSXzhA24aSgJEkqY/O+Gee4bDj0nOc8+41v/JXnPOc5aJZwERwGajC/diDPqEp2aZ6eTuQHzd3iJf6LRRfmQTCayBBJNgQwuWC7bGXWevOC1EYWlcXmLmB6ahBh1hh9asi2rQKv2KqXf/XBf34CLvT3sU/oYmG8OKaZx/WaECq1n79QSYUCgB56QoKHYJy6S621iZZ4jAvDUfntZ9oZBtCpeJcAI3QH+HTQGC8l5wRXMh3zJhFSYStqRpDrEaAELoSBvNQFx5iVj40N8zzgdsZwKrnZ/Akdr7gtWzvDrAb+GtIaw9dF+QFlhrYyfHWYMonadkLIcdyDiM0YwiWZaQCgMoYDqRgjJMjCPhww205a6p6BOgZb06gdt27deOihB0H8p+bP6CrSHCWIjJ9d7hnxBE080PD3Q8R2gEBqDCqVL6eQ3HVpZIzPHsakIcnGPOyTymPQgakL6FomLGcmeQhhC7k0bKe3MW2ayaqxDIQp+tItv77k1f8YTUWCR7Wt2JYYZoqn7xU31b2tV3hxr7kbSXZWvocFs30hxJ/WjVZLVv6UskMjVTSYML39xpDYneqMJiOkSUCOU+xHVMVsaTBRpi6obvUX11/z1d6+4Ejss6jWkPCls6FyBUcPyxEngnukdy73WbKCVjfmjH+szlHN759MyptZjBz6NNwkJG8D5hKRp27/PQYE0/vlucw34uahZL6GSSh42rhaSEtbmfU2rIfjie7V0P1OZtl+lMybuX1OFkzYQYxYSpiDbOgB6ybRKejpzS/avGz2Bdl3MvPPrUIgBjNHIPk0aJVnQ0hXuOJm3LqlkbCMYKUPLUvLhvJEoHLd+77dg194AkRw4AffHl+XHTUi95TNu9QlvJjMTnbOQat0jJjDPGWMctEy6Ggzg0IThfAV3uLDQ6FzsMaQiwv73grGaCP2DWBy5U6yZ+nd3DcJr/t+TAO7Fw9KdaHUikJJrLgKF0ySRWvY18gT2DjLnIBLmBAY9ZDsUVfmDb2m0jbl7OBdDonC8Uffe7DKYuCxsN2Wh4t/mC+ttgZTs9WHRXZu3Lz5X//rT//Mz/wMoI888sj7vu/72l4/G0BwDwDcCtviJbdu3Xrta3/iQz/0QzNlYiMps663br0ZwMMPPzLK4jRLHZ84LWBKsiIhC9bwY4xc3lTGiNKjSk6MldDHzqCabas1rc0CEGCSXZYiyV4NSxadxF3JLaIOnspQUNybYhfxvEFPlhMsz3YVzKO0NBRPx/mFffSSluYvpXzZR/xjAH/me16yLy5NwBDVQ1SOVSO0oBMZd04k9HMmKWtCGQNvRUCo5LDrbHZbP6MoGkeoRspYp89Z2NvoJFWMAYlzwD1zrhNPOQmnyY+Z0b3C1TAGVSUAgdFDosgiedQ/cuqRX+JLFnLR4fB8pNFs+v8d1zlHO6fpRgCQ0Xz7cSD8gi1AFqcWk8xyJeGQiQpTbin5yb4SADJUT25Gyt5i7qGnd3Ut8xptKCwitvzDGOOSoSIWSUpPzP3l5mjVjknCl4smXqopcXhfurFtxiySoGJFelCmJ2AIwwjiw67rhTpOi4DWoQ6DyGYO1OfRzrTXM2aNjHjmlZhCGBqQQ1Wgwz/krLl6XRV+fxw6oHoBP7Ihyk2sHMVyFUxS/JQp2T7XvF6+pbkyhhwHO9qaAZU0b1onDSScmsJFyTMW2aqJDALnOo+rmifcw6kOjxAGIuHwRN42oLXEsXSMcTrdC1N8mCuyGV9f5K7p2QOLiI4x7t07KG7ZIkwmbS9/xct/5DU/+sgjjzz66COPPPLIz/zMz77yla98t3d7/kte8pLoe/dxZD/L6nz/9//A93//Dzz88MMf+qEfmkKS3lcM6CGV3POKD501hYA4Wcc02OPuTyS0JXfciTRpmzVHEjHlRCF3YwiPBvyKZCPuUye9Z3rxdNyLSC31sLxxdpTLMK0pbNpL8VEGcJoYq6Ip3Rg9zasrWjY8ZfC8uVmvcnu7eur6gg//q3bzTz7i21/yvR+/KahBtF0YX/11mmTGQ0GDRhr3AcThQhUz0glHGLgK4HHhBstu3eTKt0vYmF8pSEOU6QXAE+//R69/5xf2gllSC3IVHOrEkF5ORBJ9/j04FqGc0VCCWGLJ3ALMENYU9Igv1ovQ9NSQGWZuKZk8PSXYeJrzGbdPpvOmNkklx8mVcjYL9UPLWYnkmrwIZzrtNjhsDqsqDXwjIqz4fanZdLH76940vLv7tfhKUQhthOdSSTSO6ecWmZwHHWEQFpG2SerQqZhhSDYO+lLTrgVkGwMY+btY9hcx9Gjylg8s/x3rp5Ja5EDTdVoEOGRhkMhvGE4WItCYP04YmdZKVI9wh/VW2oX4C1rnPiQOaMhjGkTE1mARlzCZHRezuHYIrP88s6mQ76/AR5CBfugEZw9QwVCI5wvetCNWk3FZxfSq1KyeNKYzNrKazgWoqq4z57xnjXyzfYtAb6COV9Uxhp4OER1jHKd7gY5tGfsJkFPsTTV4qieP5I0hx2EiCDKmqqqveMUrf/RHfuxTPuVTnv/859sJn6q4cePGV3zF33zlK1/5kS96UUqWiJ1jWmD31q2br/2J//Da1/6Hd3mXdwVgK1cAm4kbChXYzL2dNKU3b9545JFHrO/NSPk2HLMJbXsIKAwOm64O3WDPo1IyVYwkFSqNSgULVc8UUUcA94BZBeHq+HVy9wSpw0yFJTUrPOQCGevLYDsQfqvONMqaEY3KV/Qk51sLWNB1KUIK+Mjpt4PXLpZsOvfld5DUSRK+25tO4gZ4O/BUGPVtda75uMSf5OYnKnJeLNdtAhD6LpPLQ0SwyOl0EBCW7m3Co70N+4NRvPTbH/N33D20zzwnOW1ha88dJAnQXMWUUm32c8EU6T6PWHah+dfXgXEtTklh0+hJomLPAn58iTfF1HzxyUqU6nuB3FnxMOfZW1HwhzxEEWbYDpyW+1CRQdBUigvAEaPBAmPkm7vhJWejml85OydTiXhS0Q7PImGHVUQGhuIwUQ9tst5Im5bMzxUygjqNZ+LVYhyWBaORqXDPrz36h8dQAEOfOx7/8563APkhMur7HtHqGiPJKjVlBid/eu/237WbBx+83rlq1BYmI5tZlrazFwvrdbGNafzhmC3cqHVBLAtN12/dKxG+suijxbSUw1fJyDgJiys9i6X2uMpz3gda2f2VPtavMFVGm0j0yzjCl8BHayk2RaVNwSFMeGiGUJFlQmMIOL2BXNRrWdc+diXcllKkCNzzePew9FBRPWSMgQOQ0+kU69whIip66HH4vGE21wVO+vKmmzdvvvzl/+fv+32//93f/fnMMZsl/Nmf/dkKBGtKrVghb37zrW/7tm+7efPNn/XZn/2yl/3rTBTNMeU7ctmkiN66dcvOaCDeS2dFsit3yfrCs8YcEfGjqiCT4i8jwpCQKRCVmwEHNITSbVGWTLmqqA0y9v6OqUibf6wSu/GysQF/PIfonArVslAV3BYAOxqe/lVOa/MqBjRM2iVlRaO2r/zmJa/82G3e4aFWJuq+TSsr7NxRC8mUoZ8yKFQwOoUa/7G3TjAu7Doau2q0c3/oOV81h7uHH+UUzPUc00w3EiAuHFKc6YLd5W5+AfH+VBUycjP+qfWvBvCCqaIG3bVmAFR6AIdWw/3I4wRpr5DV93tN7xsPUTK8LX3yTAm/daXNyK8jjtJ1ERQIuO2OaTDNvNW/Cp3glxKHmOoyd62b4okYj6n8k/TdBuGCmIa0P0RS7DXWBuMiTsHcSOwiGx1V1VFLo7VPrm2vLIXmyhcIvomoAZiFagEsUUGWz3tIzUizX16KF0ATpmeCI8+GNGQqxYjoTQXknDF0t0Kxq8RhEQ+bKLe6CoRgFeA15dOAYgKpRe4FPgg8ZVgLJEsTNHFvKrEfIVwtx7QmpAVCP/Xzkp2DYDzHBc4oTZUVLwsB825HWDXWjhLV0yFxSL+hKpslBHA67lnGi3EhkHvHKZCN+HeF/aq5mNe85jXv/u7v8Z7v+Z4hxycjBMDzn/+uP/qjP5Jmva8NxK1bt77hG77hvd/7fX7PZ304ILdu3Xrv935vHxV1O+GKpArg1q1bHsHKtSYpja4LsUA2R9LFHwXEl1C4sCbup+p27lnkCNsX8z7jwpRafGA5ykYHugp0LbkJMXsEmAUXTQ34+wkzPbUa/YyvEV9s0Z7E4MY1c1P1ZdDkEt/bX7HtvRRWefIKElgPt8mC//WVXxq3eer07Gz6bYYBLrlyZsGpl3CE8aCF7onO9iR8UD4k7a7n5VEwl8AZnya00Z64fHCQROvWww0Tx2buxcjBneFW8HcEzJ2ANnqRwjS1G4ZocwkZEBUMSQUHznzT5jL+nJPY1SwTtdW0MDhLXcJTKpN2SMs+A6a5ingyc3L2rERtTpLwbAkXOEcvtg6ZJi5SnqdBQng7XTUr8/qUDneBB+00JLAF8LhdIQm9DdOUJXFOFWPgsA3ffd4wOCwR4JuGZda6FrVlKBmFgPoiBQBL73DHIU+jSH2Bj7czNBuq7WiZ2pNcBv1jPGwnOAojNgJP9d9xKERl6HGcZFyoTz2JiIwh+XFo7gK/UbSfmH9Kk/bkUtOODrkA1SsBI/1RgqcMRPnKfAqZSEwzaS0nz4BNSeqkGwx3EvTMQamQDZHFTyyvZutQxZIR5yAWbUic3hJhgaQ9peEqfevpdKiFrE4SUVCLYEmNzNTOvAAk1kx4sf/1Z3763d/93aWN/utro4888kgCn5AuAeT7vu+VP/7jP/aCF7zghS98oRV169aNRx55ZvI59eTWzVuv/YnXils8fe1rf/xd3/XdfviHfzhEfLzXe/1GO9h9ifOlxVcWlDSIhDMmbm+NcvS7m18LH1XMXgBIypWLoIQeJrS633cV2OELoLlEzN911DRl3Qw7HGeVs88md1Xj6t+mS7e39WTv/uodO+YlQ1vo69lmXxJCXoaeihKguSgWxSowzaHksSzLNFw/W9kgybBN6Tv3xk7DGlKc10qzG1nvu9hES8nIZBVrkCb+dDuzeFBduHvfi9U8S2GQN5C9WU6UI/e5uuAIj39+yvM8tppcwj7BnvhJ5fVM8pzJQzlXX+HOzA8BOxfxSk2uFtVgu/sLpjxx8naBdpStCSMuS7BXwsS+HpnZJBIfxW7esATS/ZFvk/gY7NVC0gjTR6sLnMmVN/0d8QNO0rtPrWNb3QYPvckTncyE/HkAuH379vXr184YL42wkPXRQTVnIAoeJdFjJ5COz/zIj6yePPsmjx7hQ20ReaiMilwZx5ETiDFvqDgOFTk0IltggV4O+trZhOYBO5bQOU10mZ+DZYwkIZAswoVb1/k1RyQbMARHKvmKiprw0ASGCgPTQ5ocbAGMTRr+mU0ospcpsHYvEPEI1umtJ9gBc8eheowx4BOF1TTjo7qAjTHkOOpoUODIodWNx2889v6PNYvjafTmzRtAjZIBqMrNmzd+/Md/7Cde+9rP/uzP9m2GwK1bN6H6yMMPBxApFPITP/HaH/iBH0hhUeC1r/0J1r1f/+t//Y0bjy+1o1gKJTcqAKQHrTrLZQIiMZaVIMwA07Q4XkVG24qfgCzA3Azj0Pb6nfG2xj5+Xocq9OZS8mi+hw0PTTCZQ5ObN27O5kBmPXzbrku83ZlSF78gqoeJFhOF6L98mCugS++bs6Hvas/Km/cHjciFssPN6JlmsNG5efMmxdsuZ52bHaVRrPRGPb1yclRQ7cp1YPaL+FBe/P9Szzr9fF3JJzQqKTZCRI9TMPZkj+PDI9FBAihu3rxlTZAxGIP2ihdBWZLdh/qE77bsYYyKRgPAoEWlWa1bGFZeW0c8O7BJqSc6CcLaRDPKVrfEqs1Gxa+xE5JolB4Abty4mVZry5bolAyT5LHpDPUByCqT01ECQsqooXhAxsuPqt8XAlYhCcGpCpbLbsCnpZChQNaE3gXNrjL54f7OjmkvUQvvu6mGaHNPy+k2kql0SFCu2RD4N7WAmtpjX28w1E5hGGOM4VMkgycIy7CnZWjY44yU8s9A112Rs7SWuI0B6JiGhEHZYqX2OD6NbzYTlZ7oXGQomTm9XVeXV/JYwLQ2uLJvg1gEodZLI962JbV614YSIhG+Gqe3nmK1lT2R4wi5HDKA43A17jXXLMyNGzfyJAJur4j87M/+7Pu93/uGKfF2/euXvexnf+7ngdPXfM3XEGOGyPin//R/e9d3e9fP+qzPKmOhx4d/+As//MNfGNXrV3/1V3/6p33aww8/ikUMpI/2+DYQD1FHAYl+/hN9TqfIQ7ptk2aF0jYOhNrHenZCV+gebjWsbVxdaapVnDRbocu+G9M+ar46xIh4eughoBDIs5/9bKzXGYtz/Z98FYDbn/vS5Y32fyemXVamvSPhNPk8KIdAzDGXgU4GlpzDNLoBLIn5dy+o2ChEK5mEIiMJaLZS5CKbHKXJs571rKk5SwObRnBVlwQezl8SI5BkwuhizwCrkP2KCd7Ga7IkF12GZw9nhs5EMI5SnDw1ArDiWc96VrrARIRV7kKJ/dm3pZiDMzzxQbX456cs/Zj6Oj0lffbKdTud4hl3RdyYUKIXOujlPBPSgEtoBAtVs2+HxnoM7HUZrTRvTsggaF3KeVHMUf+GBvMmBQuhiva7Z4lOqWirK1E4xFC0/ifaAWeXKB8JNguBNO5FMhb+KYfeuXPHHzY7LHlGf+QNjE55AfTtnGm3mwQKQCFea9ogxZQVY2XxweRD1WberjizdP7vOBTQQfiLqCIOFa6iiR2dU14G0ULLrhRMCUzFTzCDGK9Ee1wKfbPhDF8UGhFQMy2CWLAlM31pZboJqL/NCwCYYq19F+R0UyQ1V1QPbefg6XQCcnLXDxRVnPSeJvwaY9y7Z6c2aPGGukljzhHAo48+OhMPAfTxxx//mZ/5mRe/+MVWeaBGfMInftLNmzcmBPOzP/tzr33taz/hEz7h4YcflipKk+3Wops3bwL68MOP2FjQ2sf6w9BEYomlYnKZzOBLPCK3PDXNI0riyxJUZPizOBzcqGKh6pjAiLkcfxBzutnJEIjMTUmFCezFQKKX/au/+qvPec5zdv5L5tanAP/UfxLgwT/z+be/7O9PWcLjIUhbio0B9Ka6JgbIIvxtGSvRI200pO2l0kjLU8MhDHoC8X+pscR4MaCsiux3MWWfmro2ModzdtZ8rn9vEGCTbS8YbnWa+gsnlT4gRFMN8M3Tu7rbcQETZot6pL+RrgcPAFSKDSXZYdpDxBminfX95mWrJB86UNVZWph6548it85xdc3Zk57adaTwqB2C10ndFeUAiuLZ5bSX2rMEUCdqGEyIjImTzCLjzXOe8+w3vvFNz372sxdeLWxJGRhtReBWJPiZIz8rJ11MmjX3bL6AYSptCqikI0in6U0PVtXHGS1XeNIu5GNqHr3ivWv2hNkO2tDq9LW4VLGwaU0QF2ffs6EKkuZ4SvfyiuQhRA/4ns0RBbKjzzE8IoIlQzCGfRkYAvi3cSJ2Fe1IwJKRVwZPjDTYfzytPYPJmXx+JSzguf2DtaqJgkZz1Md/QpfS8nneO4ayVYEItVGKS1E/9ofeCcFlWrXQxKUpbLsSDNEq/sp4OOutP3QMOZ00rgM2Lw6xL+RAMeQK5LinPkKKA3KzhxJ7yXu8x3t813d91wd+4AeqZi/qjRs3vuVb/tX7v//7vfu7P5/IEBF99NFHH3nk4e6K5Od+7ucBPP/5z+/9qsChahBQBRhjXIwLc6J9xLhzbBE38vVRlVrqZqe92cxpRJLzgxQTGnFCySBRz7xVrEN/xn+9FxWHMBmXOsFujjND1pVnB/SA6xnjvhQuLS2Ab/m6EfTaCD5XCYgJa9he6AJT7GAOsGtLYlIrC8Wm9yRrlaapubH+Nuv3nUz1dqmRfjcVrhGU+56qTgHh86arbb345a6TIdTpUqdmb6+zXdSiGPZ38daDIljRqP3i8ZXIPR3LyC1jLopOU/A505hknom+y3Dj0udxaAzfmi1+Dgs0orkWlqIC51ZorX3xb1ixxSXHM9sUpCOvCDQLwCKH9G8OpYJmZ5M7aDoLJAhY16KEYgw/hibHD6TaIxdZz7hhvoqh6SxXCNX5NhcRXqWgQHoFM4e0t6PKnBwccY8UteJOsO/rCXYUxDQTi9PsQEV7B2kKrAGZ8o0igFx/8ME7d+5ev36tcy9LOFotmq2Y+CbhGppy9v0+mndu6wIGUHNsHgkZ5bEsX/KR7/FzuGf33/aqX7ZijLscK8nKbG6lC/Ys5MU37T+fdhqKYAnvHwxR7hafhjsNNnlrg1fEXBohyVlhSiAyPyTmMwLjMvlaQ1aX3GSZmdc+dhPfyYGqnS8a1so9itrnIo9x2Becx7g4jlytwohQQ9P0Mz/zM/7u3/27f/kvf9kHfuAHPvroY6r60z/90695zWs+6qM++sUvfrFlfPzxx3/kR37kXd/13d7t3d4N7gBO3Lpbt24+8sjDacjS6Ph3C2KR3K1bb7ZlW5Eq4w+CVT3CyPeVmox7xsJmUCcGPKsbw74QHx8kzLL/NOhPdk0Fol46fUzxhpDlydlr8l5kgl16xZlWUGZbzP73//g5+JEfXN4krrHgNcsb5Z5auSmflZY2xLUz0LlSoU5UGLhNkHeOSCdl9qBAoiQJLCWMg6OJ9vJoKfXkXzqnIgVATiaaRpMyU4zN0m7PVzQrvpOIfip0hBU2+CC7Ip5rjgGr3TsZWEEG/yQXcq4J/rxNYU8HJXG36gE9MC64bwy0N1+l4Y+ndasz1tmpTDSUhsdrsjpPjhrbZSBHa2fxGD9tJZS7sVDrnD9crCYcMEAwpLDmPBSfXUbbmjcpOM2p5TIyVe67ywddIARW/gUW0VFpp4ozdFyNEvumFGB0o+Q2C/vuVJELchP7GksXywojHLtLcpJFhUyCtBEDe0uyuRESb2M8seBGNjCEURlnR9OEyPOXI+ZIogrEQaPGdlvqLsehMkJzaCG1G9mdMFsT7wOtOhohp1bfIozAFfL83OwGDhFNcEonjJLT0R05Adggm8wrlWX+6+P/ZRG9FVL+a6tI0qprN2jE2P1xeLzRoNXplF+LNAAhNhjy8JuKyBBR1dOlmuc24w/9oT/4nd/5nY8//qaf/umfUuCxRx/7/M//fAtHRVQAr3jFK973fd/v+c9/vjtFd0LeyEceefj5z3+3EWvPyQlpsAuAvPnNtx555JGRX9htpxcmt5heyU98LJiVQM/cqGIgA75WVoGqEfc5aHAS4q9QwattPhMEyTf3M3wINiGPjdeuNBmPUTOvWwcz1z/x8c5f+YfZISSSwUNTbMqLaivZ+nQAVA954m7jUgXKAm5cPtA2cLUhCoBYrpG4sg0j/eq7wQuDZj0NU1g1u+G10yRaIqStUe5WKPe2EG3/difFbTDruCUjyQwBzurve2Wt3T/Zu42x2mxzC/fmUhcnmCQriJHjQsZFQQ+mPfUmJpWCsPw7AVYiv5KIBa425bYSGJok/ijusV1a/PrUKGFuB5JIv8Puh/oxKLaskV7taM2sIuy5ArC16rFiXXk2M0qboLAN8A5qHXOCoy9rA1tiGrlZOi6NC1UutgPKxreOeiWZs6ycFbLPozprbkUzr90h6CquVHL3HZeZynNXWqvQ8G48CAKegAsEM4ECVdyiIZvdsjaBoKo8UZgLgg1+FQLZ4afp5/nn1aa1HDmdjsBz3tRcCctPtKLcEm+VGZQ82j6vv7TatB6qhsDo/DdwLq3PlSkNKOo431z6anp4qJ5Oehx6Op2OQ4/jOJ1Ox3Ecx3Hv3inu9TgO1ePePbu35e+1q4sLDCLz09Gu/867CJVl4scfv/Hww49ECRoRLIn+mtCM15O1WeGveMUrAHzQB31QQMP5YvRMhbDHrbS+pqL5HjbE9veCtM/pcbwlGOOKyXSsCRBAS9K53qdx7SzF1JqzRQVJF81sq2+bCg47HHzjG994Zg0Wj3TdmRA9bPrK15YShuFmfQEs0hPlNJBCxWoXe+LALH7exxqwqXxtaIRET2tsIC72bs0rURu7qUkcUuVTWO3nm970q4/Ni9wt2UW65CC4NcRAuKrqcVqzc0H8D6DAlYDL+cRPHcQiPx0ckKvaSJSuGZfHdSmQsTRjGlmGpQ49EsIGF6pFb3rTm571rGfJ/JWPrHuyh5NObfxru5wBFfY7ak3e2l5f3VaaKwOQPJfBkuWXFRbubACZP8m9dP7ggh5MKK1YFyw9+Cd7LvgZ6geAX/kV02j0vMmF2Y8SUjmrDq1ts9YI00MuEmeCsnNR5C+ycCZm6qB+L/AFuDtMtzRhbmB4K7ftgN69+yRxb0P/pSOT+dWCAYwI3W1LCq/hTkTQ4pQhvkOGyN8dT8gYf2w8PMa4uLgyxoV9Mufi4sJg1sWFDJExMC7s+ZCl3+ef+/CV1k+ds/P9FXqkPqqPqQShsJa1f7K/68Sf5sh4G/RKq06WlOBqC2tlD8SA2z+xKaDBgbSMVlq70eUJ3UwPRTEGVHWMC/vsIGL6VkTGGMeh4pAPYUwO/wJgjekZf9T0f9nBargZtdqe+uijj2otGgAtuXAW1d775FlPICI3b954/vPfPchLVq9ixPKkmBa5L1op3Gc1hIXEfIDH9QOjOFIBRCKMo/ncLICixvokr/e5Jj+3vG+nE0xtrKnbGKEKkCvMMsHhkB4ewGyWuCCB9L+qHCiFRF/HVPsm3B2UBQSP3wOtf6dGzugKpKrEEY1RfGluAeUqY/Sja9BrnAmw5oYH69QwX1COnlcUUBtYTaosB4beM9ojNjvwFzCVyju4Ja562rjYrSFRtG+38kMJo7Nrd/pF1Dr9TWozLPXtufjggSz8RriQhDXzEIttGn32qin//S7pXby/Xx+GUInV2AlbV51nLekpCdc2g2NSwM5iA9QQ0rgDD26iVY9cvt0A/Szxg3bTYkl1Fh9s2RJicESnoAuA7ghuxaYfTAQZ9/YfT4JLJ9jLlyK9ScuZK2XJ/uW+M+Mw0rWJCB/ieGmx+1bC7RX5RGx1SlkSpIl6wd/wJhDRPyIPWbjK4lMiOgbGcB9kYSx7a1RohO7OyfzeUDQjdyakHPdXLJG2ZjNCqlh9h03O3L6sJKeNS8lZaJAIQ4BaZu4Vu30JCMNgi7oGBpoIeM2qKOsNzGprFzOJhxxVsv/8yFARo8UvE9sxxuGjapExhuI4ncJ3ihCLVFXkwr7VWsZ05I4MRHD7RPjM9CEFOimWBhn6PwBSK27dunXt2tVYBgju1uy40NVmEYTuEx3pPMFCSiBNOh1usQtw7zrg4pA7vaWnezpaerk+63JrLZ/QWJrLdAxIhOGZogd8FC5SAGyHJaqp1FMAVIkL7WQac65sPROIg8zl1NIEEHYeg53adzkzOqBZhtdQXStZLuE7jYw8BOr6yb+kl9h+kuxIs1nznoPKsY6OzlAu/UX1ntARTS2D9dEYAaGAsvuuK0umlchm6Oqpm5GmhnkQcaOZtXBXbIhvS1f2uS3JCI60BWE7iYkT+8ln7LnkxSYk8l6bPkdYlldm9xMDeGqRo5ANYec0ffc8PPTkMjRGdHmGDu+V8+bMN62uho0oK8HXy/FrRQeCvMtiV5MnpbYMYt1UQpHVOQ3YyqQImgCLvq8lxLzoNDwJKJOPOO/TuhjOHoEn1NFAECA5LMm/gTFaN1SpiGyR2HwWX/ZdQueK+XZVXFzkqpUZEtE9hwDOpNFtxrq/MuknusaCYCMITpUma6kHlTBnBNjHSzInPH2pf+Pfzph2qZ+A7flQVi9NKr6VxQ5AbaN7BEg9JmHrmU4ni/P6l+0bahnzR0872X1g2vySNZsHBMpFkfAVlEw+BZ+TfgC4efPWo48+llt7orNCFutnYB2Azmigi8J09tty3f3w77r6vR+NsvjBWzdh6QYkdFKlNmOXolpeEenfFzp3XZ7gvh/kKvrZxPuLw5W92CKh+c5rQgaq4sMj6y07R16DB4hmIh4im0yrzHVKhujBHboiQH7e8YQ+qvoXBbgioEmfoP0VSpG7e+drZ+DoSVU3xZyEU1UesgES3LG/NZDz50LNYx1vnjJ1IY2e6hEiHmKsGblcD50vqSDli1DdZLvO4o8NZxavCfK7YL5K8//ZXZIXaBquE8CWp1Ow2yE7XwLp6263hVcZ3oR8G6vHCncgOU65te83bGBoC6mxOBHs+gKSU7Fbl1H6tRynKT3Nnj9W0fXx/72tHzcVzp5uzZXh75C+g+HllJ4L4e1iWULIInqQHl33EHbYPkHCw7xeo0x3EmERqJ5kXKh9ES7A9LWrV28/8cT169e3LFrHH8yHqMU7IlfBGrbO+c/ybskKqedCdKahDqXwD+AkZqKfdpm59riJhVGgicxZr6tDknucoP08s/idE1zxQnU++ZPCWs4aVe0PI8QVTJhGD86fDtf4LT9U9dUh3O+pMHNeamxBQi253F+cK810sFgdUkEsLOXx9lPGZS/GOClkQO/Z4ndnjAY+SM+dEmAIOkxPAPEQ9rI9K/waA3oi3EBuMaUOYemoiTdu3Ljx+JseicPfk8nBNDYE1gnalxh3NgFkSSGCf/9hfxQKvPDbPuj7/3ZVLaHV9idYE9jiohco+V8grcFWeE/FfYZKl7+tVCIIPBdKjiSZ/FA3gn26p5WYao9SilIZhGmbcJr42N0HKlrn9bEQ1L1IhIUdQZ0FWhJ7T4LilbMgGCQyt2tsS9ZkSlunpCWX0iSIVza4VxPtouroPWaYZ/tQS4h8tXJqFtJvWVJ0JxdBAiWL7C6Hqw4jHqG0GYuAKgWJY7u5FGYxYxkXVnBiRT9hFthSj+c85zm/+qu/+uxnP4uQ1tmqXd5UqUekoOKGQnNDfrrK573ITzb+2u/5w1soIB7STS9Qrk7a894ML0e6anBDtuTRLMfcTIIXyu0EaKZCVSNEHdMTc4OQIHau3ntnQPX63c8BcB3/4va1r0cJm9J9y5nkwDTR3RM5r5YrQVg7A5ndGUezFmzUMZ8/Cbh0DvxMVEt6f4hc6HHyiEOpQMu0MuvMi7OXiBxuy3hltjbOqK1zDQ0lC0IzsHKcThglilF8hrIsiHUohqodjnVhXn5UBKvp/h5OPb3n/T7WYGFBVD3snDaoHmZxbvUoccuy0xORmA3cTQVS4WlSC0fJ7gSHNLJC5M03y3qs8PBBlYctDkTPjDFUTxBEbx16HOL22UO1Q3gDjkz8Mf3sYhcD2VzxbKY1BtY+aik8FHKzV5TpoTz66GNdDkgJqU8cy5qJrM9/9oxNgPRH8E3OZzr+qm7Kp2Yk5qAvgBYZBB/EJGFyM09fS9+mK6zNSCok/+FWO8cdqzTC4o48XRYuspHnWDeDNLA+VomSNHP3J40ev9jyaIdhzfHHN4gA4PL5l7V5u8H47hkYMOr6glfX6a4Q6XLApcgsD15OuCoKK/WMC4FBgLmJMVJiqS6ijb6DW5AOicU35nXLgS2oNaPit5KDyZxvrdWVjbz0vpegqzNgqzRyJb6nq0nM5Pc//MhXfP73fNSS9hwMsuKP7Dtjzma825bPNrNwSV3pAvJ68A2faTdPvMM/5S4TAXwhmi7Cww64V9JMNJ/qpFDF7X8oF9nR1cbFG6YjASVOBe8iROZkGwBL8toOFf7MDjatScrJ94NRbxU8xYDbL7KNpBRaRucSI9WIj3cboVXVIaL+YdME5aatB6WvXkuHJBDU8UnIr4WISB67GCX4wkRHWfGPqgfJNb7OkqxjNl52r/MrFmaJoet46Utfil03SECYqbckymJtl15noyaMg2fn5Y1aVTDro8B5UU/SOVHLLVQqYXOzDfql7hC8vbAFGQrxde42V3iRZsvW0OVUUf9P6D+3PvTXaRljRGwz5QNiyNovW5GHjHDafz4Uy9ga/Xfz5o1HH32Eqw8LGH2XPB/DxVVrE1kv7bBaLJFA3h+fbrgTyggjAbRzA26vXVmg4Vo61QFi47h3HPYfuIG7Ns4JLvkPU6MQB0akHo7AP4hcR5B7+MB3U+68DCLsjzVT6Qc1s9FjFR7MPeO5QMkVRK4OA5sosbCJCPiHBRXXq2fu9nERZmVByv9y9pSEodcBFkJUdfWfxl8S0Xgi4l1ABaYj5+o7TwIkEB+KfrUDpZpQzVf1Fz0DbY+AmYCQhV5X2DfugyTabU5E7LKLygjUphaST9tkPsa4IEMxXWP6L6zHqC9Vrd2a3W1SI8M/uOAyIdjoHaJbWZZGsTz6HTGIYY1FWCBu75Z+3xkzs47U2bvyeOhNf3zpwsN6W5gs7hASf5J6/sv/Add///yEpGNGV+2544BLL+3Cw/KWP49IFic2yzgvDNxobl27iCdRr4dX1UFwmaYqRJX1oyxHQ14Kc1PIJ4uLzye9mRoMIdpnPW0stZvYzr9edlD4YUpAf/3cLDp2dMI5JRvz835PWlAdl9BFRK686lWvetWrXvVbf+tv/YVf+IWXvvSl3/TN32yZzVdY6xN6J1+xfJEGZndEgSno5ZZQWnyLxvr04fTMIrsI0/SKF+an2a2ZBaKt3bRlZFX0cZg7LBlKUy1D1I90P0TgKIIWTk3Eo8mTBajrI30OKubFp0L3KVIS5WfJ1boUL75u3Ljx6KOP8hPZcy8G0ABkAAdHBDNr/GefdlcAH/yDXx3FTnWrG2QHJbxO1hhZNhuOqkeKqzgwmOrf2IUirRQ6H+VVp0Y1PjryE8oF8ZbJUl2Yj4UxIjEnSl1j3mKIL+FcDUpQk7bhiL50Q6PttdU8erymAeG1+N3wckJ10tPIkn5/uaZ5G5qK3SfbHsag+sT+2ZXDNoQmLFJf8nO80SMbohH95+1VY4E3QjoZs2xY5mA/y0xzD5s641XPJRHzGOb/A/aY/O0UqqrIINOW+c3H67StR49laVaEyTSxHkQwBF//PV/4j/BdgP5efNS8TA3cILZRwWhZyZ64knZGl1ernGT/TTpQj89In0zKYqU95znPfuMbf8XPGog3YYdZETZ26PbVr0sGeEofe+vGCmfKwHJwh3JWWbqc7L8nQ0JIm3Iq0VrqLMyY82xJaWmI8Xrnzh1ag8UasZGTTnk97EqNwxbAHtFfIuFYCUNJuUhtky2Wxj6bAVVRlfDg0gbEhxpT+T9RVRWKas/qzFiqPQ/lOaOMLeOVr/zKr3zpS1/6qZ/6qd/8zd/8Td/0TROiQqAWXbmzSdlzbeYKvVb29O3dksDpl80r8ZFkpSzUIi4a+WQPtkiObYORKmRAVNSPBzvUvy0vEqgo4NeMO4NCbz7/zG7Ih106U4CyqceyWwQhYR5d11pUWiUbwFo+qTFxfgTGQtQFhcr+YOAcuwdWL9GvTrFqUkwVah+QCiyF6MhcnrVR/llf2cq0Fi3hC/o1tSHv2uCEh1tHooCp5aHkq0USFbnSHgSLtNnHstdCS5AsZrc6lnlMAsS4v1XUETw7Kna3uVE0n22N+97a6mXvQxgYa3X6e3Ip+eD+jONnOePKgXw+eaCwQJIOWyYJcVJh+CutYVNHkV6Visi0+VGX3omHG3vayq/hXzWBUm7QC488s1gfzLXjhc9dBtRAoxUFBGPwXJX9sb7LMsXG9FBAfp98TIheqclUS7+KTtLusyRKmpKo3BpPvOtL0cOYmzbYCPmJd/pnD/3y74LiiWf/7Q0L4kdoAavMip8CJ81L4H3gtx7mTmPjxgSvNmJXIV73wzRNwlnUeWmmixObtDNlJZ2rTUPjznqVaVcyPyG66kgIycyFlwgq/d9WyWC5SCcuAl8i5f28fvZAdq0mHYEklI2bOmlRKtYHDmKpwr4OvcFVHXJUc1AAdAu/eDBuz6+88zu/8/Oe97xXvepV//bf/luE6LBFm2wEcydLKZkoypZyovYJkzW2OXSgMFWPY02vJh/fEI+4fNMr0M268At8HJGdsT/GhSrUP/LsqDFh1sRKKqomfbqGU0d0ZtlPaasHjOx6LcSj7oDKy9648fh7vMd71BAnMhK16fslekfoYfdNZTF9jAscSInszqqKNgxngzy3CK4GVHSpDXOPVHDS//7zEi+zv1TTloc0EwwKK9+Ytu45osJCCSMYyYqgfRSY51E1MGTHczgo81L9+9Ndp+aRYu9N7ujsOQVO4bdQVFEh1ZTVzpZORb+B6UEsrSmIsDpUqkyCJJHWuRvzlFdXzFnRbGpVAOiBgh2rXS7OJikom6BQCZ8avu1o4FWBSQakGiFbyjsBlg5sbSrEPkPkzHJERQVWRFp1a9X99zQeFuJGCElz1bYgxTZHu/R6uvpg8CQnCwEFB6eepb7GYHmvQuboTgC7GGBLATBFjBVuv+M/z8pIOMOIaf3DwtBF66C8MxyQ8HyrNIbl5IFicS3Vt1vvs9JCnrSG7kGS1XV27DF5kPzT+xfdjNwH8VUk3NEVEN/BUnQlmlfZaWRr7rgrYyNcglO5C4A5CcA9jn/JIAhDML9cLVekgOpxIF110BXxLaji4kL4cqKalnltl6hey6jzQwWu/PE//sc/+IM/+Ju+6ZtsolDIfjdoElxn6x+PpRc64ydGP12Atpa04EiGwdCvBrzczzU8J7Fvbn5iN949OdQA/LODww6ZPB2nPKNdj0PM69VEoYpASLbODLglzQ6dNQwSCG6vM14quDFWnQ/uZSFeYd7cuHHr2rUHLz0ILp00UDH2WR0BII6tyjEBbKbmjKGQmjVkWWcjqxbFOQdc2gBnwV5V5O5XCuS5K7SIpKakSEn27n/ig4mQfZ+BAhFBsGp+LghpaGlQlNbZn1KxYJkE4BPo+04EsJw1BWZJEdCGgJiznDG3ZNbZN0MBPXyO/r4oQ8Pe9ep0N/2E5nSXq3s1iS0U9fZSQqrsZvTbaZ+tjSbxswBK/r3cSbVMqWgaMKEztkhMnie62pr++13bWYX4axIKkTpaLL5IYO2ylXvV5FLkWW7IxiTU2EIlzsBYMVerbJvRW5HPMvGEQvLnqhT5fJSCi3v3yjs3JwnI+N9mJN/Z60UwwdX8NsQqCjvxbot4+NcTbxi1Ge3PmsTohHNWoY5NVFEfo9T6qbj6wNXbt29fv3adYOVcUejmxvsYv+i5ALXXddhZgIJYukK96VZRWRdcNUQzfJVLlmsN88WwcFVffWWL3I/jGOPC9q51pYMsLYqbBUI1hk/CLyLAla/6qq9653d+59/6W3/rS1/6UgtiIWR2hib9Ibp4FWbChJ8ckDK6WpFW5mXUkpgDQDs5Z8qrl8j9/ETPzS2WK8o+gB3TELBXZYwBPZ1OGVwIbUyhaVAvh0Cp1bYZMbKApJ3R0oFYxxfymhJm5xud9UM3bjz+yCOPxMGV7GKna2MEZ53ogZNJvte82n6ljh3OXBnq38mezV91DVW290DnnRqZ7LWNSk3w59kS+0ZNN/Hyxje+8TnP2XzgpZcGQA1qoBnEDXV6RByLm7L2i+agBcHUjbUqJQnxmIvZ9HijZ/ewf21w4b+xji2d5CTfGbtvJZB2sERZWNStevovdlELvYpa6jcd0vY2XGTB0n1a6WUKrEsdjPAQVpv4bB3JRDT/ZDu+SxOskEwY/9QhvfepJiXb/3FIaF9EzkoPyTUGMmziJ0OyYdGtnUbAyEK1dSKlbGxpsIxIswiWpotcYlfgEnbjcNay9NNTECiP8s//mLb4GQaW2DIIRpbblK5lGgsu+SKrzpa/JZlY1AtkG7KwohRA5zdO646HKn0YwxzoJYVT4YhDZNF8KL6QVlxJSKQhXMFMpDjpva819zBF5elGeJAJjS9bmBWN/hCYrIYZoWZ6YaqH4kLjsu89q+pRm8hCEInWzakx/HMDrRpuYV+msClCAB/8wR9sGOsrv/IrZUFRIEHcPDRjFNKjMV8bwNN5XLgqVrUz0iK2l1J1IMW2fpfrXLzq0htCXb4K4d495SvOxIKeVI/jUIxx4SeR7sR6rSiYZqIjbgWOU5glS5zrog461zsl3xiY2KOWUgHgVYE3btx85JFHkuHMz5XOvG3P6/Yi7YvELonyiHRNNYSAuYWNJYGoGxlxtoWEDtthhaSxT++6NGkTm1QkGm94f5ANyYz8e9fLhYCn6nZ0ZIS6hoZGyt5MW+UCaB0+ty3+OF9ptm+RAaXXU6OaQm2lO/UFeYTMtr+Id5OJn9yzdUYYp0ZW+W+iP3uwCeHTlpnJxylwxCaDcg8Zvyn7WfnbkcLs3ZdL4cCGEVUvrqVOZAOCdKxx+76eUYyWVem0IAaWsJPnxGL5KhaWljmXEBlCZCzkm6RaNczbhV6Vk32DskvhiqIieXPHiWAwwZ0gb425Zu8078hpYtG0ydiRzlUaVV0uy5gXhWFvJc7oX5lZp6FG7eUc83lHWhLIhRw5cey+l8Z2h0Y/XOPuV0oYcJHJHFjUsdeEQOjtmZeSqySYhsyWYAAAYQPGWL4K3L+65tRLrLsCbZOX2oYvHsXy8NVFCklGTEBHBDg9PSjPI6twUPxcuUcYiGfGWqv7VV/1VR/0QR906UTh5mHWPQGjqZoESdFZ8+r41iSttk5AKhBHn+BDGIuJ2stvqiOLZlULX+E47Bwz6wnXJRGIwtZp5P9X89o5AKD/1Da/aZRrAb4L+wz4xJboxeb1RcQPUwAAoS2EJu+SkUd0ds2KQIJPiY6eLI1sE8HFE3fTkIZGkxD4DFPXcY3priKRHM5/07Uao6S8usMWuc/jlbRpilw0cv3Jz7Ob2w98bZHtioo002yHljvptoODRt6hIRu977XyU3o7jbYn6SMNqJoTjbHKUR5kuWY1nGv0NEbeiq626jy3IRuyNG13pdemIHptOn6bxCNoA8I7WGHxWTLJBTdjkocdr2ane/YqR1+WbXltb+3v4HEspVl2qyXA7Q3c/ZKuAwh3lWc1VB4Z7D2F7IzzfNNyUpV4sDhbS8BAIUbmVMWuIVXJuY4uP05OgSEpf2eGBXvd3w1ep0C2QjhkRb5stc9Iay/L1k0qtnHxvOtUVaEwz1TQGX50ehzbyEY8SCWKtiNCtoVoNQ4CFdy5c/fBB69ntoY+Tb+p0JhqroCfDaRtaD0NarP2iW/krIf9EoH4cFwCYAVXxY78sZPAzYceeQPYqisfzGd2ETkOzXgW17u7pwaGRk+Jle7bZijbUcgThZw0bRw/jNpquV9D4svoRE1caipkNtOTdZY2fsX0inMF3Nmm3RTI6M1upPrGsa31wBjjdCrkCxbXtoAgfVxObsZmLnWoa+OkRF1pIU2ZIKJ2Ts/SiiCpONaH9Qrg8ccff+zRx9x6TmoZ4/QdaOu/JIeEKWoacpyfpCW/sS0HyFFFyGLrBMCDedkFMn8DIcvkZp6nvBe+pmFbkJ0eLkSWwmP9Zjy+fvpySjO5JUUKdseMiw3UUGFb/dNeaWGjFMIqFuH7vVkOy2cu5KMYGxyAoBbzOijRWPxw1m3tG+usG344ez2ZmhjVWao6na7Mh3CHePt7UVO9tXfdy3f834T8fFNaacY5k2RHD3BelEruWVOAoz88Y6MgGcRKhEhismhF/bMoJqeM4dlZL9te1XqgNaYe/ldKtNylehmBpHORAyUVbgeRcs5gQ+xTrKvYtSjCWebPWYBEfLXwUfyQMjmmLW+he4u/1DDI9eWM3sWT05N4mPMMjDY0ZV9ajyb8mreHc8OjLjf1m1gR5Gynb64AOvl7cZDT77TutRKPVtkLLcwlX7vqoC2u80+XsGofquH6m31fyEjvg4RoBaeAWHqFeO7DBanFWCKCvDFjqAroRbpyO/NLIxg2tuKhwGyaSgHP4zCbqUQDWB/8wR/8vOc9b5ooxAaUVBQq2UlYCqgRpzuTlQh1GJHDjoVKV+JtHAtrsVkg0xDmYDfJvayg9/SxgVz1XvQEAupmQAu7K2WCZj9rsMAAQrX3TeiVIsU6VhKEpkEbr3JpmhU+ANy4cTN7IFCuzE1ulAKYw79GSSzhZy9rv3cHDnldG1bwuxg1bNMH3+pdwLyepP9cSVltj1LUtXlHATKef0nM5dyImhKd9XLxjtK0imYuqbboQTqIQAONtg0Mr4oz+qgE1LLGkazmwf1URvS41u9p66U3jhztXAKQlmFl8RY01E8wf2I04i/959P3NIvcRxUBqySYfJ6khfSz/J9cTldD3S6ocl6nxZgKmlsbMrxss7jkyhFd1ML6FRCBgA59ZJNMaMyjBV2JNs5eVIc6mg0fTlZxRdgzD6ZnaVgbgIliAYxxcRx23s0I2z5hLOKq6sRJsrTM/PRfdqg6TR1J06YOZSp7VF0wa5pFyXShg8rJwu/tGHWmE3gzQip+LxNko8LLiIwp9gkI7Ph1mFjnNt6zdaI6Oto1Vy0B4LoAFPNJTzWRkIZDAeCRSO8mCa9tnehY6uLiQmQMuUhXbv+kfzdDOUYPYIcfTVK5kfvnoSd22wAWgG/5lm/JiUJQ9zaAElvT0cWC7a9QMKmBqoU4HrtswoZtUhbbV1mI0gJ2hm6J/7gXDZDlk+M4Ek6p6nGcDAvbS6NNY6IwkFzzns3l9tVmjWooe4u4d8YaawBoj947Z7owhxK6rt648fh7vMe7k5ve4oaOnLTpMEgtfIPPQAwPNrNCxAIuIKp3xbATOKVUjYWj8uSyZc0SFluigDzjwc+1H0898bUAHrz+5QCeuP0lxOGVS/CQnsQyW8IuU6PQVNevOxdfgtt/DQCe+SebFTjnZNmmAMghR2v6fLKACGr5nf9Z0ImI+Gg9A+9aokOT3SawkaB915LwfX0gU/tGTvExegGQhVHhk7rWdstwlJeuEpTY3rwRzcWozD1ZjW0+7z64AqtVYXahunsW78tLpfs1U7O4+TMm4Eq2mcp97RquZLbmMzyKus5eHksLY6ilBppYOaWC6ypCXR21136fq5uYSQy8iQzUagh0CXorj6GbjhNax6PjKNyT83pLHM2FoDWfa5puREbBC2degWMZ3p8p2Pkv2d6suVxYckuL1S3Z2Wvzdn6SY00qslXRApxur7W5MNH2HYuNKE4VYoxB0imzaJGnNrYqeT4JtZQhgPzvH/BPfudrXhLnW7GXEcSH7ghGWyjEDn6+0EMVxwGI5Lr3Y+BCItyVZ2V1EcXZ+wXeMHhNPZoBFmiiULK1+xXuxu9aTsQ9MQe6ZKZyhmVS90kwAgaVLV3m9SbQNo0GwpfX9PyahlvklkxGIi3rIfEvQGcEi9eYe9VT23ypQxF2UI2pQqxd1OSIUTO0VxN1UhuBQOqzTTduPP6e7/nrI6OWe3ZxCO1ldOhpUu7Tm3p/1KdzJZDujCl0udUlKqbTrhUAwJBc6i6ZPnWeJL0ue+A++OqD33D3LfeA/wjgweu/94nbXxvJOnBJqmRA9dAT9dXEH65oqfzhPzU1d/I8S6VufA0irQ4SaJ/BLnHKfzXDQycrSHLQADapNV7UGqVoiBOAIZWueZE0CouJTHlg61+XQ5w9vkzMJLYCJjpTqe1C9xCpKlZb1m1CA2TMrnPXrrsBgcQ3GaRrb4GMteS3EX5FyWEw+xLaDZH0ksxUFEntSBdotmQPQpbxpLUqzWz4NXZUjRzX5VZ6foyPPeX9+iCKoEqadaoRcqkJ5mJ3lRA/mzOydxf2aVe1xYfyDs997q/8yq8897nPNVKoa4z5GVk8mjKGC9+1RjfqSBSLpNJpEHlQGYJwcM3OV2mzIVoDDflifTTR5LyhlHS/nGttXkAkA+kQXL/+4J07d+08dx637IhKF1aeJcPZND4SAHrQ1n5Ui8MdC6Cf/YEfD+BbP+Cb/+mPfIfBq2hR9pA5dzeCI9Zp+YorkTEu7MtRuYtQ1ZdaqNasDTqE2sOs/eSgGf1mXTen/uREIZeY6M4fLvDNi+7P2bKtBprLhOL/z92/h2+eXXWB6Fr7LR5Juqoh3V3VF7qc4xAZJYSjg9h0e0EInONtngHSVpCL42UcLnLpTukZvIPCA+gU3Qpq4lFnvACm0x3ijAJqCEE93ckRfQYJEghznmesmHRVdbrFrg4O1LvX+WPdPmvv/X1/b3Va7WT327/6vt/3+9177bXX5bPXvk2LyAL0BJ9H+4v5xK+Rj6sNBwHaHgxr4qJrqPi2dz3YKE5Aa3ZUpFDfdwVJbAOFgK5S3/jxz/2lBChAhs/RizNkgmb2++YU/WbSvnQ8AQfjuLHnnnvula98BXCDFcSAlqYxqheIL8k9OxFJ83OvgMjyYd4x7+o5Yjtuu3pC2Q5YET4yZpsJCeW1C5iNYpQWZqi4/eaWWuABJWlnBDATsxD3vreS/BDA+unDh/0YO44lKkpQ8Q3BxvkTrA0JwWTlhoJHvj6FLtph3tOf7Nfw3Fav7DDYIQTds/eM7RC3haUWBm4MWkZjNHS0+1nVeAKMznQRyGZwcoIaOjQ0PKB3QOTafJhdqxKY5/3BOW7jk/WtRtyIm2+e1GB7ua1kVcuzRSs3/A6TrVU06U2JAnlklzVjEduwB3uLF92g+AcVeTDgwxl2pPYBbV18RX2H+aPk+/MNhuvQh6npZyUzm2zEFslWzvk1c0OjpYhnqLWdf/LwPgLTmq+EDSTKYxxbEZiVAVxLkZ0d2fQiRSsHiEVyh31JF2kUunIPZmqlGqggmawVi5ZJ5p/ednAN/rrySIBFiIsoUL8KcFiEIJWkd05viwzPDLgkarWRW9OzF6m1Fix/22f9DSm1UMVkIeqdxA7MsY+x2UNWuvw/rrWUnUWw6sESUlharo212RZml6bneR4i1DQMFEZAgs39uv1lxO+xcAmuna1UJmnNg80U2Q5/oS3zXcae2fTrXB2OGVqcz/hFzBw3l6b3vQ3Eu3rU2q7vM6AVpwYor3Ul6X/7uT9FJH/7c+nt7/oMZVhhV3Ri+j6YAeB/qGxhV+WJtkXz49jsyeeee073aAhFwrgjmK3C0lUS/IdJdNYOOMLFw/BSVEq0+xCOMxpE+8Fd9r4/hdcoQYPjMCrbdhLx/3X9f75B30lEp+i/IybmH/Nsh2WPyoE8l5CoZRc3+F/Ehh3jKj5LcvMfAEwCzD8p9aIKQdMY2oOp6xmDDEc7+Se3IKaKMOrjaKCR9g0pNgfS+scMP1dqt7NeSCvPO3W8UWU1doNmhQRB1uKdOgaJ0nPCOut5VcZaY3dcgBbEAUdB2UwRFLy+4850AiLp8+wWZrCOFcGjEsLlWxJExjbvw9rFnxkzwMJQNci8PFAbNDvyOwHAiFs8qGvW0zXFPV8oo5TXo7go7EQVGLB57kgctr8+46jiSN2CZkUJdAssLJ1bGaYAeCHgO3fEKuVtMKFJuLlCgSO2guaiod52UVfTCPEJcFQfJjKXbU8mZyL/zfVewIdNCUA/GzljMCtrkba87OXrr2s1ONQcizTDqJVpwcZWwaITY64zLURQAvrYAAUSET34L//7Qi9EyLiRNygx26bWDtESw7HDAHXvItLItdMkPwsElsZE2IHCED7Xb7i/Blg0DRRSddhSdFSG0S4sIJqTnf8LTAZfeWuXLHM8E/yqRUcmBIMOhHHyCWOJaNSKehcR7r2zHecuzOJ7jYpI936CCBEOuOs/f5f+j23fQ7EjJYUgJA3dKiKEksTMRN13apGoIKWZ8KlNRET07LPP3Xbb7cgcQBiyom0Ua7jPlCi81qX43DmluMNbyQcoT21991+b6iQT+xK+SiZcnaJvilvXX/hbB6gBT9a7dOZdyKor91DGWDewggPYoGVzH53SxE/BofBqpe3cZ5Qn9eXQsoh8JXWL9hK/C7ZUkpiKosZOlD9WolxYB/fi/Zlnnrn99tuY3SonTRMvcqWSza+CXgFea85SofNSHCtPq/sDbDdlcZIP23rA8ixiaz7Vi5tEC+o4Ud8LedqJD6MjWSliyhWpB2ivOpi3UAVSd9NcAAoLqcB6KZ2b5x9M5Q013aJ4a/T5hOSmzw2+eVn9YyYRmcC8A8waXr+TOZrqxdx9imDbRUXiSZQ2VBnU90E+wRUWUx3YAvPcZM0agRXTvlKWeAt2qxKfkTlsUfEL/+EXTp85TXpEb4ogliY+LaI7TC9pcGEjRhsptfb6vn/5ww7LSob4xfqYItqXFut25rihzlhQiny40KAViAHSmbIUojs9M17iA5sASwcKL126dPHiRcaJ06vFg/pLiZfEBPMKs7AjjjZ6lowRSAEbGbctNf0fgRpBIK1c0HinMQlHvF2kS9/vLZrYu+6T41AslIdaox5rvJmJ6EvpU7+f3us0eHsIDTRAZAKqlNCKJY/vULuw093GKcFl9AzStj777LO3vepV2EUQCT/qZZRQDU2KGgi9wgq3D/nrtoITsQ8iEMwbzLkRrW4uDNhLiBoZAq5lCHHTbvc4UcNrdsAYB/4Qpga5Sm2DwVvr8xOhVDlzM2lCUqmuI/0mIC5vQpKLdxYV978ZyqKUKAdSpYhAYx34aXiLhzIKCAt93KP7mVIKpyq/OjgwVcSMliusSxpfs86em/esRo5tu/ZRwlHSQj2X9G9U6pgUL4YWhRZbzsU65wPjq3UFA+mIFzoi3FvIO1pHkM2Z50RzpIRvi/ejqbIbdnKxFZw1r3gAUgQlwRDWyp1QwKA6xb6Z728WvlKx1HnuMVXDLH+FuewPhPX2GbfFKw08Z8/KCOsYTgsDkKG14vtQvMk7EsC0o9KKV8WUqwwCl8SiDoasvGntpdXp19LJ5m/YTDUpIh2FiW8p16I7yzDjEzDNMTXi4ZqSb0R+YCLDhBkmarZCiwBFqe+O8JV4b5BExJYQJmIEPGMFjwGquMAYE97fBFhE9MQTT9xzzz26ybuzjAYbF7Gi6tdpvgamrB+AgJM1+vCTiin8BFPXpxWFmxdOcJTuLLa/bPPZ92yASz2dMDfmzgGAbed3wt2J/tcf+4zQOn/KxE/KyCnKYWym0q25FR1GT713JspgBrN3xdBF0XPPPXfbba9KfXTQzqCo7nS3JDoWBNgzGkmKnt+Gng9OhVIus3G9bFjEEBmGoBLFJtrgHVN/yBtrooDx1w2HISJhVSV7k/5MG97AbtnaDVtP/wTbt8hncnKMgCpvmAMTG/oMLpYSA1Q5GhM0D+zh1kplVFxBkqqDSME0aftwPUegMTER9RwbU/LftHgQNvQ9VIaZlJ6Y4CIObov3qjVgHgY9gSU0JeYw9/ryCY17IKsTkvPJpMPNL1FAIuwe1K7CaBuSvHBI0JKljaj02bZrJAd/5kL91kNe9FHM8ToF3X0eyvcHm5sp70IbKDkMB5cU+hVzwnebP806f08HuaiAfsxcwH8TEkZEHndvOPLOXrJPHiHtnEd1QvxgDigN0oh9eK9LsGuse+XMVnNUOxOd/Oztx1hw1QRmP+4zcUbwJJ01vMPUTHXL7iEa0NJJVHYSQrjI2uUYqzAgqomMABWRj+g23dK7NPXVney4nE7C0qWTMHeYkNday24/RxBhglDz/Xhe5pueDgEsInr88cengUKiYTA4C4ZYIwEqmpEWF7XZfkzZtxoxrD+RG+bI7VCtgFMi0ppu/8qhCb2L4yo0bXYuoTtmn4dDXrhp2HImCoNQNtcZ651O1MYr7D6vEe39N8eypb+lf336pLpVN/FEQnIDgx0hsoNNiSrUbI/spabbhn3hRrGD5ovhTh2NjYPt5rYb+YMwHYsfgtU9YzlkK6cFraRswyNFG9HN3Xho64fyzLizkclOwfcZcAKMGHY5K+FZxj9DJ6GzUz828cQtl0Zx6M8BrKHRFxbc+gAUIe1G4VTGsgQcWIjixDyFs7qKR6qc5DMVSBm7CG+mYk5pEMjj5JmWWR354uh8iGjc1GeCXJvyJK3Rbmc+yW4JNMf45jGCOQQnVuDOf2DU7TYz2dQpJG6VSZDU19Rx04iIz300XQAh9GzBBR5I0H/LnZu0n9zaDmKvs4MXl9uhOuprrPpugow9JbbRcvoKqFCEYAXCrmkBKLSnLMAPALdMxwCs9YtcwiISFPoDemVLr5BZt9zyyhdeeOGWW14Zszv8DSLqFmZvIzUOhboE1DV9zMI2NHdRzUF/HdvGpPgY+8uAlq05YF+2aR918wYDVGSmzE03t+7TxDUk8gSAtRoohNwd4pBPrnURsWdm2JSS52Y3XMjiFVDkOTesqmMsHQHMMURSD+eeJPBvRMLYxxMjM937SoRaa/v9L2pvw9cPQgzP9rKeDI1fgyOvNbFfy9KwQZGyFG6BylUNEmLC20T0/ve//9Wv/lQ3ZVpBP9KVSKgxd3j3sOcQ700uJf4Yr1PQs6soDG5qTxLi88oqcMYDmaiCo0spjte/aLdVd3POyAqzS5xKxXpkRYTn8PiceDChSDnkK4nC61PeiQSMNdQsbuTE1/g51sgYLRFSYiwrLCMJBA4MkHWByFO3LrfBrPhIZuVgToianTtey5kWhlvhHKhwwprjw0HhKitRN2lVQAjIzNvLLQ3RujV/0bDpZpKZl9i3cIC84mhPONzRJl3sa9AIMXd94bAnXtB3kPAVEfEzke4OYzCoDyB+Vt7DxYqXyh7CzokQIglDk74x92VdwsnlmAPDmjuU3tPXvySur59+GxFTmQOH3fvsoYWOpI6R9TQwvO0yWmCqe3hyIgvM8riy1n08UGvhT0P9xrSwbXg95VBENOzUlGc6WSL68t/wRXrz+578+xYERf4yWAFygWcL7wXbSEjXuCSZG+oAkQtEZhyNS9IpN1rq0puQdOq8I5G22+0UDzswZpQHhJJDoatrYZh0ND4gRCcCLKoDhW6iEuQguKEcsS4PIRob3hooC/COj8VMr1JhSp9V4lhHXzDnWCGzNGZpdONG99jVXolRO+itZWYzpNFFB+s7wyxHdaVqzTsQDH8JH4Yc2oFAsXLu2Wc//Kmf+mq9np5R4M5IQOFlNkRElUJki6TBl3mKccnaj3MeUmyio8zzsIl7Sm/KarInZDJWPklhDKWEJwIbN1Zk5ua1a9dsp5xAUFnGsvyKQqZ8xwgWkaEUbro9T/gAhS4+CY99minsykPExB3iXZw21y1OQVHpjH3zQyQbCQ2rU2sKZfkPQnbkhalG4GWq7nmAy2XpX8/TvccSgUfgezAePIpxdnOnPJQMZaPLXp+ba2LLjMPkGMwNuXiEO2irvQ4DWEJT53ilojD/Cp2Xd95ke0/tm0wyfOHT/+yvXf+N//1ADFHICst4JF/N6gBVbvOIiHB+ZJHboUt5VB3TlE2kLT3oZBgDk+XDgLHC1Ovf3BgsAxDZNKS9ClxE78zLamIdp4DWbMyXQzRbA68lT6zUzAf/zadzGl+APBPmZMt3P/AdoXjMZD1zNEOmCRGstWFEKUUb/1a04xNGXVpU38REjQmT9qRM5S2e5bs/kJ51KL0JMZ0y9pvJpd3O7dEMrRJ7Zbuz9gfS7I7M1OuTARYRPfroo5cuXXr88cfhZSIYCyNvQrgGTAOmwdiS/e4iK9FLiMcCYxFVR7sVx4J1HyNYqVOyBtSl4Kk17l3N2U5kL6Ijgxi+SgSJ/qNChBj1S+exoRW13oYtKMxXdGIAmRG4mfz77LPPvfa1r8xQDWkVtNzuynLAVEW9BO7Mqhj1mp3NYEqllRsogkZFazkG5/qzsggzYkQyQaQlmkBsRr9t+VTwhUapIYMxc6EMuQ1qP7XgCLxGQa0VEGAgkQVHBZ4prgV63qlHIrb3Y0BGh0D6dx9IA9QoHHJSaUqaFcJlrkSyR2HxLHxkRHRerMS8FqEUXKh1p9hocRT+VBaaWj+ekQXzF4rvjnqGsimxHH0FwRczFzohHXhgUPbtR8e25hgtqsq1Kr6CMIdZru+uXidUoma5BHNOIRHx6Td9KRGd+akfuf7Vf3d4M9+VRQcYckLhXxWSX3bMGn1gkOchYM8DH5Kc8pDfRC+PVgXlioVZzYQt7nYblS8P1h5I7wTxaVQYc5Fk7qCB36mmzWo1RBzCg1SbnA5ILPINHfulpVprRGQy/JodUWCf0SNEv/grf68+dcsHHyfoQGTmTDrnCuXZr42B7CKbKEm0zTaliKdfndXhPVLBtflEp/24ZxchFtntdrBte+zdoHNYGfcazSKEKIPQWLRdy+pmEHsUwLpw4cJb3vIWHSiksKeTWCR+z2iqFwy7MyA1I9Kq0oD5DCmA13Ju+2xnnD0jDUK6dqCL0I29hgpUdDt7MDmC1SK6IEXfjq2hXG6Kk1AXJj5DxWdQuegiHjWS115Z/VAPcbcB5AlzPPvss/VdKy7shROzCfLcSxER6xoupvCPwS3Pn4tIzejKbViEWPbDBkgtHJ6iH0uwGyFjbttU12chqJP4xDBBLh0iyt7HlFfOtqZ0XaXPOqcyigHTMTK2FEWEjPm1x2Zsfgdn03sPMhmxiJIOSZLYKBUmUK5BvuXXfUZg2EQr1F35ziRCiPJcHV2UZVhUUhSYiNmPBpvcefgwdgbunT+YA1ZcIcUsw46uVqyY7qHeYfXnh9cWf3y30llvMZXhLfcs0yslz9XaTDVFFHZjDOrn/kwHSJrS5I+lfD39D74NblU0pOPRTvxmzxF8NdVIVyos3BAR28oozBE0jcvkPEdiVaMBvZljojvvvPPKlSt33nl3iIx0ef6Wv6fdBTLV7Opz0cVGNQrGMoLBuRpECU3DCaNWI1Ct9FbVNSDbrUMVEA4628j52vTbHQZxSwhPrdtvvhv++j/c/a2f+ME/SUzf8M/+6NcTvZn/ylfT1xLrGUU+5c3dBvR8wuBjv5qIw/QdSGExkhx7m3HAnZlJh6TYB+KZSaSLNN1CXCyRX+S279kNSxjKpX3TNrE3Ntzk3DNYbx4FsIjo0Ucfve+++2JFITsiinzty7TLqDuP6clKWb6+PnzQLfS0+cIS7UXOibogT+biqJzXGr5iW0Qost//UjSAol0iunEj4NTCUgN51Qo0nVtnwuQuRAeDulctfJNNDYoeD/POJmll4w9TuOTZZ5/7Fb/iv0R37u+K86EgKIJ/KpuJmW1KOHNabRmErHj6KaOwq+OTrlzpZkCCE3kEMbXQKXnektAqjBSHaSJRGKCf9NA15pF8K8q/MGH+/WS4UwoQEdGZvEEhUQbZjM9dwRalbEu8bdY4yuXkjOO2A7RQbQ6DLG6zWYg6SauzfEp3u+MX1akGjGAQe3vXXwcm2q1hD8OU55Su4EkVaahLsYeD8a1uLz11sYYDb+Cfen0CW2tibHL9x5hsQshJnvNfd4sZyy+ZFkHigOCLVk9Us41FMk11M9pe+J1/8vSb3uClL4ZHR7+yeKJcF2+OKCNojjDzDDFRJQ/WgBOOxo8L/sR7abETtnL+XEvh/EllqluwyrOchi+8odmWvTpE1uwah+RjPILySSq43HKS4mdDWWrVNlt+UBMrbPXk3Bb22Cd+8E+oCdDsvpq+1npLUzO5DcX7MuSm1oInqvM5D1WUalhZYQXSpIhBZQoc5bte7dhnvuu099ZagFh3wJL5y1jccL9tRbA8HQuwzp8/f/xA4fTVh8O5PLCFtDAuRQ6S0OjPGIs2dsbKJ8H6C8S6rNkZIW3X5EiLYwMF6FuX8xncnYj3QsIp6qhlDDlbPAJRlPp7EfY4WZANfzsIopWgSmV/n3v2udte9SovSIAqp8elIIIlll0VZ39LSv4LNYumWIjK9Ji2j41XAs7Cb0Vsbi5N78woM0kpA4Xje3jhvw7HGoa5dHuL3dmR82n6Ej/akeK+noiIiLvPs3D8D0PCVlimnrXjlCWXmWmiN1YqJJPxPvbURZf5sPFHBQ9RlfiYYHynFA0w9MXO5vJ7raOa4qEj7vPrjQSou+mvostoFx+NQNiETDsBEt2MpK0QyDrT+DkavIVTYU+pj/nKYnE4prvuuuvKlSt33nlnmDh3Ofpag9duWoPY+h9zrQRGBhd1dpy3nU6AK/ijmlBbNA27K3NK+wCkssUzTKiOZu5nFE9k3ePcacx1p2QPf0upSb8VmKIeLp9EAKsJc5Pew0kRuLmZIVhByT5KedZrXv1Cavcqw2W/QtbPliT57i97/99mohdeeIHOxQRKSU2MGd+QnxBx7Nkw9QRikXVYmonqwUfEqpH4NXwHTDgx4EWttZYT3i2OJe7mmal32u12ut97a6BFjqIGfRzuj+iqQmQ+sAPvnC5cuEBEly5dspddNZAAZoxPDE7Uih9uLiqgmTtKCdmFN+vI7/T6ItuDz6jRZ9Nmbga4bMK7H0SVnpt9LQlrt79UNi0pj1uc6V+/IIP8bAKs2webfjoxneQGc4xXivaZhlo/++yzt912W7RLBmQjtaZn88WhWvahZhnTQDwxx/zc8km5MjecJ68NCdpdVANHwydFJLxtZ2XnAx9HGIynfRmRtYvDJJQjv168jBWsOo7n0HFGlXuEl8ltIA/HtAGFTMRdWOyADY6PSNPwqEgTmV+vC6GJKi6UUgdTlnIGH/J/40NEKuq2Lkz8WxzbVQt3yUV/PnGuNrSUO2I5J+3GQTvPwBVxEgJmHyah1nYMowyVJ0MLatKdh5Sfa8EGMoaPgD6m7V58QiL9HAgvTkzBRXTz1SqEpY5zxWc+DE8ysZtLEer1I/43PxvSfgJYWuqHLLgt9emNBqEioWyto03Z3a6OZ4PCdSfau8EUZtMoMzU8SAUWGRfhmJfV3tAX56KZ7TQ4UZwaNT3NUE8l5OZEtubUungMFtPvtMif7ShDt29preezOPNYWPcDjKLmDRGILVtlw4QDYSnbfPr06Y985AUm8qCrMIckFOUahJyBbG8GNFbF2OrH7YQO9/lGoNAgPlDnGFP3GPM5ar33mO2DZ1Hm18Zdutu6ZAVeIIvCYeH9EJm4jmeOjWBpWgwUEg3RpihgMLJc538c8Yo2wGrEUMK7F4SkuTHMdofeeQa6sCxmJpHW2NcPkojuUrYTJqY9E/sZkfqW+SHNa64IM+GUKXs2OxYMFRAKgog1cwG5r6FmYMniIrSdqCxd1Iz2EBTE3AQIGxI2RClRBjFavVxfFCL2VZsHkwvCQWKm3zL4oSQl3ziF06PZqe1gXmuBzMTcyQ6JA/fjxdn9zLVMgQyWqjaKdOvqKV7vXaxTS5S79seLFYuQwAMy/aVV85UHMvaZ8sAWDRIS6njkYnhDZpscGiILgihE1HtAB5hvkWdYLOXW2RYwen5KsF5BtVHh4zh+p3YOQRIX0sK8q7zakEQefnLrwctcN1MZeOYkzyeLRBuxlxLPCBUMjVWI4f4Q8th1mvXIEcKJTmn314pXmzWVZGue3knaOzzHw3cKdUFYRWBUiKKz6hYsQvvlppFJurDfdY3zPjyfh5IBOUYhuAzMnw42tqpQE99G1DwpsB2cS2Pbd6m3tgsXDl6pY2CKc0XX7AIktSz29BHQo0L2wjBDD8cdwWr55+yCnQAvgeMOD08Y5TDQQ3bT2kiIaJrcQkV5i9czGQhZ1gCHk135Tro3uD9G3LgLNdtlNICxxO/eGLTb7RhCIUA2QUEnXcMb4WV467DnrbQeKDTRLoUhbPL6K8Ya0dIW0lrjLcRMjPdJRKCG660Zlhci6jA4+gattRs3fjF68HZfQhoUXo1CHFsKMfuQpcmWMsdm0ENg38IGoefAzMN8CHxmdf+5n9NNsGz/Um9ge0bF2gEuIgY5zm8olzzmVjl/dBrKXf0SBr+4hIWoLIkYuMQ5p0FIhncJFHhMEwxFQqDReahINHS10cwOpNz5WTMgK+MVHY+OGrH7n8jZDPe0KjtFaCZa/xU3fD3Lbi518KiBGoaXQ0M7LKcPx+gKQd6P9cFupwc2cLKSujM5VSbMcgwP1dYpQWuR/QYQ2ZJnSek6IPPCOhckBV1Qbks6oXPhEMDBk73hSCse0ZbNbedg26ch/zaupdCdUHDFVnlpaL0NCvVfzimW4XheqiRED/7m305Ej//TH6yUrX05I163jm0MiRLKjNZ36EGBHyE4dgzLEjCSVHv+oWh9EL+qYkJ2fFnsqGKtqxc+kdF0jpn3+x60G2pwIvXfwStpKQj4POiLAG6AgyHbMm3ugOI6XywfOym5E0bVsj+uzGDqktTDRTDYn+lGWMvB8FJd1W5F73YR5HP81DgEJsB37323a9Ai6/F6R2/jT8y5FKncnMg6Ko0DhdBxZGYsYOg3uWUZ/+IDkUP8jXxm0lf1JBdywhczt+kOuYKJUO97jyvufU9Ybo2Fmn40DGujRSRE8v/4db9bP4bcI34ogcCir9+4DN8Ex0gx3tgZqaMzYJo5Kh11f/bZZ2+//XbHiMFGnPbBRK1ElY/4OKmwsi/0RzVYNADrGBSHG6PxslUx0rPUMU5DCAMaOQIjBB8Ba8hm1irlnnDocKygR9ebxfmtaELijR5r427BcA9el+EX6iJ7HVeyFQziw0yxWnAEcAU4hNZE6696IwJ/Ka7NEgVw6UiatqOOSHL256AGxDviRtRIxytFPfpOhPWj6EqAKpfJlBCpBOdQIIyMemeRqLTokOcBK6yCPYyo0gEhH8Rs88PlifowvA+G7kAS0n5WNwWHEcMiNsdhmcEAgoWkWDmhYH4ULiYa1XP4uDe2HqBPiVhUCFrzUIYlPfybvkpfevA3/nZ/pK0/0KYixKT21jqrXJrJFUHScK4k5wCGSMEDOxm/cmwxHXNF4IibwHDVldgwZQxLmQ0RotaoNWoszeovXMV4ZaaCTrRvdl1FN8B3GMObgUo3l4RIXnjhOjlTaLAmxiobEFehdHjTJsrrxxtkaDG3t4TM97JschupxeuKmUTjJjafuutYoVNF2Y7WLo31LzINNW64741OzYzYpk24uQiWpnGgkG1LnCg++xBusxCe8wTGeYppDTcZAlfxUwaFMShVfM9KwqZftF/NTK3tNJSlbROSYxphc5FFp+wN3Pybv+6x3/sv3iCp6uSkLoJ2NTEzs+h0v9alM/Rv8LFaB3Qq9Oyz/+4Vr7iFal+NrQNHwbeaj1RhPTExS8bnPCttQch3ZHkgqjEgQT6nNcO27DVz+u1RWcYqzCkvGzmBnH1fV5PLc8k3ZtJp1BHgUVnwO9qrzp+yrtU8SNaKcO9+doCcr5mvLfBFOnb+sgx9Ymo+9vtYMsOvhlZr0Kpqgt40vpTRCicxMJBA43rN/Y/JfMdzUXBqahWJiA23GpZbbViwTuUpGHwUfGCAffB2ipr9WcXOj+qLAsHWmsorC4IL2aARa5SDzKl4K8PrwauhJlZKmkF7JXeNGUXmCKr9L2D68NCl5KUezTc32Js/bZgd57/WxTqZfIqIOuyfBJYCKF/3W2Q4M4MchTththcd6FWMGDbQFKoHCBKgHKxm9hC0JtpGjbnbCp8CDjRbNM9c1vAGwUtDrWUFbTTJyTgtp74YFmCZlhv6eBfRyhqxSByLYZDA9ZfNx4YlgZoNdyjqNFWH019En9cN1aytbJO27Nic5isHNe1as2vEHREWRWhVss0+mAytPLAirm86gkUwUDj9IgdKKoQmwhZ8YGlPrc4bfZHhxfjqdm24M/U5mNVpBMjttlWDkmghLZEuXfscWkrzSpik/d5/8aUEnQ8HHw30cEDuFYYHCsmblQOjVkgomLJx7jjGrzChksrU3ZMBVhKcWABcrLegVUF7NJlr1CwegZxVVwGLm5HkwiXri8lSjZQsDCCVYJIcriOgBGtT6CCyzr4cmtKNOJoY/5Wza67BHgv5sM3Z1EUG5eMTc9Wujq2ePCz1YFYxm/0WfMTmEibrbbbH0AsP2929eXRaVQmmeveUJKPUcaF/G1Hj7Elr9QcWxRqLmLQb0iQuSy82CY38G30NQIeJXR6l6DSyOz7xa+qgK1f5RF2SO9ZesMSp2WQCEE6pKimVJ4NXTqo0RMrkk6Y1QBjhoFY+7FtaD1/dPnSb5iU9RKjq0RZ/TkiP/NM3Hf9wNpOoQWhs4NE/nBEs76gTkc13jOUa0KA0Gd7grYp82BzyiX3N2yrFw0kLc0GTSadxiQlHWI7YD03itCLhQGLsJTxUSI7LlaT9c4PP0SJoE4pygWfEDODTps/gnkqzLGUe/TiYx3gpumYebqxmarLVHeqe3GOK8wTVFKepidh8VEqEhZiEffp6areIDjKYJdztGihFc8UdkxMUfMhnGrCah2t5UREsmrce5QxiMQBy3ohFBeuZYKgdGnV+kUgfLf22eYbg6mJ6Rku1wImoU2dy9bVNybz7xNzaTqQz42EUKtz0j3/8+/8n+qt/mP7gcHQMUh5ZxUU0AZnlb2NPQ0Yp5dxeBa/toZ/7uf/jD/yB3z9ohVr4YAVkbb/XGdabqTwB4odCNgklTr+lbG/Lr/S/vYm0OUjHCZmrotqO9pYBFrbUh5nwQxVM5yeBpWZxUnGD0sTb2n7y34R8nwX7JVrfzErOPL/le/UQEn7hK/4aaf3VelqOg5nzriDUfUadGXSjUQDEiPTVP3SjzOUX2/6euVHMcYH9JL3Q/Bq2HuJvs2k2Z+D2Bx4Y1wyGo2IiOyfxKKfskmZfYpd7mZ4idq8K9ygaOm9RURmOg2/9R+ji61tIbfJc/C9kObaZkO6DtdBfvNPrV0Ft1MXnPOQSwuLnGNb84RkTOCFi4r6tOccipCG97Z/9Qy/15l4MIfPOIbufweojACW3bBHFHeKRCS+Mw7F7gmkpZ2Zoh122QWCjcYtggwf0/zPFNAl9pnNrkptaKRUxwT+Lztn6o1iG3IIzdA1dDZuETPr3sUXA7vVB3vBb7fCadUF7ZNMPOS/J2H1QiloJ+ghF06izbuztr9GshHcweZGYaVrdbosGPYJl4Sv1vzOf1t5tGayaAu349UUCLPKBwgsXLpw/f97yhdnuIzZKQzAhLVVqkBvoZfIaaa0yz8d4xFgKPV2Cxwn4OkYrxL3b2C1z8y6dBQIkWs2AQ85V/8P0VRNvpFpDCZQFNnqowQ5D2ZxzXvXRrDWzz5j2ijz77HO33XYbugpME7TKhmBuU/x8TEt7eECe4D0e/K1hJxbBkdPeV5lEg6aVzIRg5lA6yhk4UGDHT+zm0rZIUIkCFIgFL4tQs4JPMjn+YJsjI0R0y9/7Js/A5kBZllKyKtc830wGh4CBpI0vGO+M3Q2kQhwH+Go16mwDTxwQJKwz4K1mPQTZTyQRODOfIyL7fH1sxKrUC/ewkcSF7cBCMO2c1fvTGLqCRfsNiBI4v2XMPuwsVbHUIEd6mWXXpKQsgod2swadeWtN3FpDi3IsjEnZMVpFhKz/Fq1Zn36REKumo2GWGw1yEbJha0leOSxmohjBV0rT/Lh45yqBfIJcZxQ0OF6x3nYylclP//J5IHX4Z9IL6JitfaLqvUR9ZOo+EfgJ8S2Isb/npHGwwB9OP1gpCYTn0z1TaLjkNuIGdBx8yy2nX3jhI7fccgs5qxamBqghO01r+fP8fFYv9ZFKZ51gsTy8FoE9R3wiip9ExLfa0RmoTGRgi2MKfGrfeGFf/YTqLQ0u8IuY+OYnuUfSgcKHH354yjq6a+6sqjFauOfiVPLFuVsQEbz4ulXDcmEuGf2ECbcOCBIRiUSEVSAxk25e4jHGLrZj7IEBBQNk3pYU0UuPLuScxAERg7HOwTV24eeIBGTXjp599sO3334be7R5mGk6ZO57gVBgiDGoEB6RPEujQkDASxPTKm1N31VW+CAaeaS3Aa/IGahVZKAKiKw7Ey1p2EhSLgSqnJMqvL0MD7VVETx+CknNW5yH/FG68TfkalY+25Ky3az0st+VgiqMm+Zf3WoE7bL9GlHVmA/f8THmFraOiVVHyNY35BJHO42AOeksyYWNRHcz4txVf9joyF4PCm++TZdfFwbRxmWoMTWyeZZxM4QfHg/pFB3WhV3rzLLjh3LHIxeOGMujujGVvq7dOOs7UVgAbZEuJNL3w7IFcvPBRPqM6XgoblqBjU9KouaoW4oE2cwghCu+vti0NA00SA6x7/zkbWHBDDTmFAPtaLXL+GCWpz5bT8uZikZr5u+O+5+ZC692b1Tw6VNin1FNsh0WYewYDC6byFHc8yoH75CAFScppxOBYsach904xClb7VK8m/fBQIwoJjjI6AhtLpbE/ISDA/HmXsVMQQODOay7Grgd/tFXCVDOQ2ALW+nOeeSzr5jd0bvZDEaNEAKabLpPi+c5JfajAFjkKwofe+yxOd/RoE2xtSqjRqsLFtUnx87B8BbIEFs+/m5e+Jw7lw/jV++y3+sqA+ld+l6kS46SE4lw78TEOx8AbtEXn1LoNxXvRRC+ymedPKVpUM4mibCcgZQyi+xJYiaeI6uBG2RS6OAmtqfzOCpjdJXgdWY+/Te/+5b/5S9qVs992h/Qz8yKiRz2SUiIAELE841w3s7BYboY6KHMfmoJdwlexEycdULky/eKS0mpWzqWsSRJVFlMhv7EIw30whd9B505S2fOvvCVf90LIgAf+foIROaiAV05iA9ehkS6/CT96YTsl9AhnTvCvubJaIvZJFzAItE0t8+hgKMEvXYxxQWqOPODbPpLa6CCx3y0b0owLSOtMJhdeJ6Z2878ql140fEutZg+gOJcsd9AiW72uCPaMZ9ypYMV1qaVg5QReUGBkCOoEpGVUmrjlb/R38AhrQBv6LV+HKmFrwJT0Fph4EvyyVlgBxZ7KhdMqMSnovtUQpQ0SzGrw2cb+gRHIendgaurt1q8toOi4VezCXuHFI5+Jp+lWhsge2ETLKIWkzHACfpR94GxRkcGF0GeLwc+sGqqEidhUR1y2cUaTE3G5zAeAnM6ZcjM7/gN//M7fsP/Arpperr8mNmhxtwEeizahGy9XYldfLWrw2X+sbcFi+fZKF1wlGV3fK8Aam1cuHbidXGp9Rl8+MUPEWrSgcL7779/GigsBNXQ6DhIt3yg5iPlp7qocFGx5QJDeFJsj9e0LWF3eheJTavUK2j/38A7Oz2L6S9UQggRox78OlbIrrxjFkUIUysHDnpcgYncfthUg/f/7M+++tX/pf9YcY2+5XeCYwx7RM21WEiKp1v+5nfTz72PiG7541/zwrf9lXi+vfqx/nMXlq+A5FmkGGo+7NYS4Wuiselz8chUPS9ni2hxjpaAeSxFKYfiXb127ezZs2PhQmTzJOgge7SCY1zVdX3x4gtf9B3TPRy2o+noG4KbEhCq/sURAWLmn/msryJmEfpV/+LN6iksm6y4FNOhTcNEUraSd19M6HjIBLLCUGSgSuWAD0AqsrJCsL/Xyf5jSpLled2HyZH5pJhMEBH5QLkqBJAnkus4B7HMqvjfNLkqxgFZHLhweQOI1mAN/OJYh8RCGCY/qOAJ10hhIGOWB1g0PuGKEBZVz9cLOwZCz2t7OyWmFIlJ7G+2YY0xPNyKCzdysQ3KTGSDNy1EbmILkuqWofsyw1O5rTQv6uId1C2k4vmGR+gdGIn+6BiOyLYErm2LE2myJ7KVw7yJCea8Sd4LL7xwyy2nKyEwzEb0nb/hD3yQLhPT//Yb/+5fiEl4E6noHjTowdZbAEvqCoi9FMoQmjBJWF6VYt95gVi31Pe/7uupNfaTc6h3nQwHHaHKQLwY6XeDiOTFwx8twDp//vzFixcffvhh3Xq0gqd0gFx82/h1eQcr4JhgjdKiPoi62DUt7sT4eZg/Eeld9nvZ7yX2zGBmsjW12mOwjR8DjrijzTTQ7F+1XNXAsOBt4ICaobDjuu+3x2S8emTGauIPk22CdQdzW4gu9zA/QdskKLK85pjdvMjXHuvdjC+iq4L3hze97xWCKKYP6aXA4ya0asxQjSMtdIWbYVmhdWLsz6Cwsncje0QtB5KQsKTNQpklNcqSc4892wWgs7YWXFox1i7qAnFAXEpNRPKv6XvtWJl1syCeIPJJSG5oABV4Px5zmDo5wb0BPx1IFZnZZF4qs8hPToP3FcoKZ82DXWCaBus5cONAQaq2MvDHynORrjnJ8G/m5DwIl2J8LMruchIYyRa9ihxBv9+ySUjIdLdINo2aiSVDm1HBebnM4cTwd0irYZPxQZyybc+X3lds3eUmJICggSzIUYDzFQNA+WXPC7XwHQRnqLuLlhXU2ZEdm6WKwDFTYqlx6IO5iU1JHFiANtDWnQzzZdkm4y54t0wA972Mk7Cym6blY8Pgg6gDYlRnxsGWlfAzSdVJj3KUkB7kx4YqQOnYR7ujfbyZOlETdcAQtYq5KL3LbrezOViLddlHBbGgKqO2a/qohgg16ULCYaAQzXGA6IGmAz+5iVpqQkj3IsMjk9gErJx3RdYHbYa09rZBWdzXdmxc9slAIRMJpYoW1evSwwDD36ILxUxDNH7a66/m4MuCmOnZZz98/vyn+CZrMDSzCn4MXoc3wvdLzhPRR37vNxCRzzDl297/Nz7y/t/yqvf/9S1dnXJJ4uIOFVUv+lcBBM6rkPkzhJztfgQSrVj2T8YXbY4Lad8daUXaJqq3LA9RnP7Wy9458M6C/IFhgJOyQjLnZvWS8MgycP3T6SvUnFA3qRDaC+2JfYdYIl+Z310N9CO+u4eeoWYb8eE6f8eCQtSDNLB6o3rOyuKGTz++zITkxOUXlfvi5fIAMoJIgj0m3F/mh2CgIdmLwK/aUt9HUUCuKDrHQEy8vpUaD1NhbN5bWqRxkM4aYDcAuqzgSixD8ooCiipz8MD2tWl5bBtOczlpl8gTPjHxdCX9RXc7iHp8xcrkGnCtiZ9+wES+u1jy0MU+Tx1ADVnaWJX8cA0EFzmPIuRFB0yUsbqdpYuHjk6GTZ6LG3AbQXGx0Wjp/yAbqvFmJPimkmykaPopLW+WzlXKocqYTfnybWts+kFrvNMPE7emvzL5LEAXSLNCZqNgcDvawNsjuLFr7VRru9Z2DPbKPasJuYj0vhff9tJZPcaxGHDekr34/Hh9Iow9Jl2+fPm+++5797vfrQOFmuflD1z+wOUP3Pc5n2PsN4dWEEn8Hb4W4EKrxxzaBw3RvMOThKEvoEFnX/3iL+73ve/3OhOr7x1X7fc3et//0i/9kkhoL7HPUpcKp1Z1sTfEN5VxeQ0120dAxVxLQmwi980BdLRH5XOTREQ+/OFnf/AH/wERvf/977/ttttuv/32z/mcz7nnnns8f30LvNQC7GT+Hc5WyFodnao/C3zsGeaD3oGuIRNy56RPM2e9ycDgTuDJo0jCLqzE2ih8gHz5uu7ySsx87drVc+fOlRfNKcl0Os1GsTTIAE3St3eEF/TA8Tgu2I7rbsyFBooCgNKLOminPyGX/Gv63k+nr/Af4/zBrk8w6wwkm0TMbadAhaFjp34Jbc2gcbogFA3QM898+I477giblTzabEIJvxKPbD8cSKjeBbSx0fdGwcjnt8kbvBoubxTmHTdm/oRAV2Fgb87VMXFsFspJZtTiypUrd955Z6XKYo10Ahh9ER4XJucJWtqEpx91OkwVFrEj69YOP8WKP/LYSZCMaEZUUlvbue+kK1ev3H3X3YNYgkk/5fp+mHLvZMh+3MpY9mR2g+EV8FbJ3Z52mu2WvxvaLUQifS/WB8SyZjZutU7xUJShtRkDcH1rzjDfuOWWW0DaOXr+xyT3EqGw5GBf85pjRQG/8H7GvYruU/REWmu82+1ie4bdbrfb7fLmbrfb2cOU5daiBWUsR2DwGVlBsY92iFDTPFD4b/7Nv7lw4YKIvPXxt37Kp3xKkquOoZqzWWODg1I2TJJ4nm1PLH2GggUHkgFjE1ndWVScmylGDrN0gWF4ZfONA2eTSBW6hGKkosu2mwhzGVhU42j7zTATjOWzutuWz1ur6yCn2Jlccvvtd3zO5zxAJO9+93sefPB3EdErXvFK6LrRYD6q1kw9p8RkOhIOPcLVLBZsMs6hWKtp/FAbhP2TaCLqT2XZbZGWKi60amYJf7T4idWUENuBuHHfc/S6Dig5qIo35v0Gp2+S9ar3yPihgwIhEuJGNiCXDtBgE5RiEl25IhMJ2amCbheK5DBRf42jKyLCSJhi2QKP2eMZYLWiW+atrNmUTpBGgyvZDBdY/toHgI6I5Lh/3QFf4AunOE22mLSJx1gsE7YpiGoLKgflRuIDOpk9MN5xnJ/o9ChtHd+e8BbQWYoLlpl1gx7I8DrXN0pBHw0MCgcjZdRMVAdWLB2vtjLWf46gbcyKG4qWAElgIsy74GRZMsmkGG33bkfOL4xGCoeSc2GD4CJXKSnaNA2e7OYqskfNE7ihbGT1Sy2q4w7OBJXIDaxJXRHplVplL2vg50q6t1M6PkGMpcUXSRTfjEplnsuQLh0oVMYRdjAd6RNjy6KwP3FhL0bHxvXOl9M2XS1jO5TqQT2txQLDpgBA/DBiEYHTcgTn5sYGDbTdVwxsgDdfgiFCTTpQ+NRTTxHRpUuX9BSdtz7+1nvvvXdBlrMFcwALXm/6Nu5bPUJvXZdZcAb2etyp7cHMvcv+hsIpg1wEje13ePhgDlQbu1AlhNOEQWklJlg6eAghhvgko9gV/ugjn/Zpn3b77bfffvttr371p7761Z96222v4jK4UzUK9M6ZAAZmrAsqJMNXdrW3i/x0iWU7YwNZMVBTA6MeZsAPZeQfUlpSgmBb4IT6HfIi9gHA/DXiz2RbXNWVMlCr2BWaSrd4mH+ArVeqX5+K3QfSe5HVpnmBLELS2a+zPxA92sJLPFVwg+tO1sgfzhTLSNn/UpgnW9WjQ1nlq91km9DTC1kjGiAUmFmhQK6ymiKiJyjExwfue6z7dSlSPtpJcPoBADI0bveVR/kJrfTBZT9H0qMQ0WYhuoMkRx3LGknj7c6X0Db4LDlgiA2moayetHkkdv4g1+RNcEwKDgypDErixfhh/DqnQR/nYySO+XTyAw8m2eahNLEuC7bUoAfGM1cfqco4qrGxo7UVf3KXOBGxheiiW50UhozmApjD8W+soAfrBXqUbTUZvfBKlUh8ODvr4yJ9Sl0I4QknSO6mCgfjr5DH6JyN4/SpSmH9BFpqZMtncD1pc4yVRaejT5eaLRJSGoKqusvC3jRiJsVTbVZqLbfjQfqZbwJdYeKPfhUhposXLz744IMXLlx47LHH3vjGN77xjW8kciNXsHlOJeYanQqyxptM8/OKpSfBDUtX77G/S0S2EU1EsNxoETHbVHdXCUW4ehC6gx7rz2RLLDtk3ulpeIgVA8EhJJ6PdYOi7+5xJgoTwGZ8M2L03HPP3n77bRrb9HIHArxj1NSBFVJRRKSuLpzZKIhsKLtoYjP0XdEQ7yDySeIEH6lF2LZkKiFqRtgobd70pP8l8TI2uBJfA05AZumPhqqre29Fq83nhxklfCu/pl0aKtTqEyoBe0qDbraZkp9EFGM+ixzTJRj0D09vld52dWPihNSMX31kkNy1jMY3Xhfh3jsx7aTZFK/6ADl6n+qyJDJUyyzaILBotCXGjCR/qmb9YJKy1ABejBY3Gk+f+XL94frz31uzCObDi/E67yDb4ZlNmtg1UMPGU+Ak7eHR9RyL2L4/Zhma6FZXSHD++8Kj1PdfKgqZyOM34QnyYiisEe1dNWPKFxGx+Axaq1yeJ5E5hH8Bs7xBpS+JYaLusjo5goRu832Ed55nrZGjfbZC0onUx7dUXumPp2NFZIGdKUqgDmKdTy0MdgG0AFaaIVvuZ/vwZmlHayJM8rOquD5qWNx/WYGzqHsgwo72nFVoWKDfiJiMet8zU+/UeCc27b0B8WG7FpUK1JVIgLJt4uZLCbDOnz9//vx5RVca0IJQfBGmQEhCob0nriJc4xhQCRIPX+PoYfxkAMroMB77sds+98oHDbVdRWyAT2cxMrOdc5INkFZVoZhDKGN/BKKjd+6OP6EPWg0ndu8txI66ZpFlSmkZt5DBikdWLThRHVUIaDAwihAR3a+Fit3p1TZFueFKXS5DBDmemYOmEQT2EhH9+C+ScQLYgxgw1gi0K7oi2pF2fWJ/CoXWHnKHbsqczJUeZTVWj6TopoS4dfS9Pb0hELotV9KxwJ6vFhBKlxdig9QEKyQMkNkg78JSWCWbK0qwJ63rA2POJlqtKeTtTlaRnxQn0d9yLf1mCqxYcgsWeXbM2RUxXYhSj2wmxm+Cl/5d6M0TM7F6Ubs6jM1B62FERUWoYGh2roj3yz+6NOyLsiavuHkDIrbjbg8PN6ajSOMv+c2v06snfuwdWySu7nhn6+Qk0JgZVVXvG9PcJfBKipraBq0pIZQBTcFekPc3mVnmw+Q3QI/rd+IAA2nz81xf80XwaUyKdOCTRMuAmRleSYbEK4qoTCXCNcevSZ4zSHX4hRdeOH3LGfKZbQhGuPxDkNVwp0iUGWZqsXoa3EGSHayomi4RP4ua+prBjosHman3zrzTrRt2PmjY1sdVqcsolVk7i8VNmb3di0xPPvnkgw8+SET333//Aw88gHRUDFhJouEByhcH9sn400GPiK+Za8Qy4FQcA7bN9uSzSG/fG4bQu3VrxAzk4rAkCZVdoQMn0/Ahd6JBvWB9HTCF1GY4IfGU75D2/p/92f/q034lLPiKj7gUhmu3kBzVob1oBaMc2eubIeUsWh98bDq4nd4Xze4BO8jRIvVTvDKQ5zFd3c4af+rUcfCofvb77jtgh+j4yJEueTPJs5Fl24jWFL5PYxknrmg7PsUpyLZ5fVzH4BEMwRFKTsT8i2lcJ6kXKH5lE074i9LlZ0fACJpvY413KHZmZxs6pEEIKQZBPCXyXlOPAC7Q8KA++lhM+zNKgrwNGasfycFE28oSF+H6ICDT/wA2ZFG7qImUgdpYCbg5Gug8j6ENMBgwT2BgOHyGRCd8UIbWmaxvpnUi8nnEq5ZDm7L5ST165HO/ubYINLpdKFe7s7cYzy2ZMQuT9hlNmQ93Et91591Xr1wjakLsu+nqy+5IF3ugM8zgsYV7TVeCM0/jnkhQZa1dp/0dvJ9LEYoce6FIjP3kD0P1s9ZDngO6kng4HEqoVYCYoZmZ3IsYAWoBunucKj/Va00LHhs8lzUl7HVYyoE/NoOwgA1EBI/ZjKtWC4pVhMxswwe9i+R0IOa6HauUBvUX4XrjpqaXIIJ1+fLlxx57TOddPfroo5cvX37wwQdjRWGQZe0j2ajQrYcu7Wq/K65BrPFdLlAXRw/jjmXmWLQ17npYpO842s1dq2mT1lj2sjGpOUyMw1uiGHUSaob9s2+Ewi02+FXG0rSRGkabmHcQAfZ9oBKZqXh0l7ScjM8+zFerbxoFlJWEDeTmtEhw6RJx/SNuk8D/qXlE/kNuA0IQ599guwX/YYroIYcUWaxwlToMRqtmqZb5nFdntQRJElYAaA7uCU/rEIOrcGfZY/HGMqyG5k48ggVyAvsRYt2w9NJFBXVBbvnFvg4JeJdRwprM+8qg1QtJ2Jx/gFV3OQtBC+6tFivNkuibcA3PjXKbQTwGCg+lrQekBJ9KKfrKC9e/T+jNvDhytNLodGkre2C0kl3oGf+SbdIUbb8BZaC4emeJew5SfURijxS60sXnBIYfTg+9609JyQTE2c8njaFzbqo7bXiyXjsCEwLzFXChlQeJiGx3vaJi6CT9dQbtcMKMCTaQNkYrlYwRadUU7SU+rCGeM/qsLDoGQ8xupdEo4AkpYdccbcQ5z+VXdLgTzcnYMJhEAzZKIpEfkMqQxfCzu9H55ehQOQ1etTq6InFTSCfF8Y5tRwbmXQ/HL6JzSPWvbeVAhijOnn5QS33mhSdGdkn9ur5pJL0EAOuxxx577LHHLl68qMOC661Hq4zOEAoJZffdw2N6k6oELMcNo8LLIsROd9ZoYfMuuIrL3pyex7dwEVPMEMIy2Jd4WMiYmYlF9pQrFtE06RbtMBENYIc2icA2ynNdrDruPn/2Z9//hV/wBWQbMwZz4jJYtzBkpQQJnURXYfdolCd33jY7jUC4F6Nas28LHEkkRHiEDvqJpRepaIFHJ502xuysD2Uy+/iIerHmGWDRJWfkCTThVlLN70GSLCxsiIJhKyNUQtqZfM2T5oZvevU72XgNBPZNnGpF1FrMC6DcFqYH8s61z/rMvjIwBx2/keTXJseC7I/uoL9iDXFopFUfoxWf/Q5EiaDJLP8TYdaiSAah2tASpq9e0TPrBUr11uCAGo0d+P7IxzbX4AL94b1iLhZVWRW1JuDFJq6zEY5K2Jl82z/5kb8k3/018ocmakOoemlWfbfrRIViIqBPzoTqmeaIJg5DSbCzgjNcPFehbEuY7uk2BTrGAxAxTHhEzBvCAYzoiqrwpD1k3sHUEX0MneAsu+y8mS1qIBWHI9UFhBOBnAf1ZyK65ZbTL7zwwunTp8FcTB2eUWIHTZvleXL6aFcCBRQv4EuARbA4NQjlPJw0bszMu7YznEzuppmZ+bPPfP2KMKOFaxEDgchSekkiWLpgUNGVposXLz755JNPPfWU/jSDoWhClIzlY0l1dGJrxR3wFnm1C+JAaZmtCGv8ioiZey4usGhWbGvGOhrvhlRLq3iO1QRYYFlDUEbMzs9gMTkWnzerKA1hEEgNaQ9AN7z0mevcfUOHrLx3Wrw1WwRFWIsztAcOD+JYs/TMUBV5PzwcpfvEeQ91A6Nc/03DF0KZNZIlSSelEWxVAocfeFELq0kJ4fjIIL7itjvm+C/8n+Tf0o/k6ZH42dvChQRxsJv5Jr4PlmM2KMhIXHp6yqIHj8hou9MaMpeDwH0V6ugnODrFRD7LUIu3bnjW1gbRAjAFkVvNHS4WZE/ij/0WNrcOSWzBsuOTmDOFbRFKrcuTtPoaAimgC1x9ZCogct5rFL9mJBtLUig8u6zNNEkfyZLzh5IbakSiS3e+TQVjmFC+Vv6QdzPCAm5TxbEjRofDOPRWBKFR4/StllIaG7wR88C5sVJWoLca4jMVMvcmrrzmsHo3k12gzInb5g32FlFOOEcbT/Dr0JEIMcR4RebkYasT27pAgYE5IlJvohnRHe+MM759FA9MLu77ULcZOTDQHE4/3HD6l7E1OdSNiViNkQhLJ2IWn30l0ns3f9elt9bI4Bc32Nx1ImyL4IH40dO9BADrgQceiElXkXRF4b/9t/92IOgg0tLkQlPPNMzn67z4E8mLxxpzVy9gY649z3W2JK3xfi+wktNdaQprmEuu+aeTYx+fGigZ5gBXYBWXTETcdhg52zFDxy6sMBHJz/zM+77ma76a0ujaiQpGiFE+Fjvxbemh1ynaq2q4Fqdzm7BXJ7VTMfcjKcyZJGPnZjUgx/lKVKdmlqEOKvnURwbMt7LwUsmo1aDaDvWL3WIeWG1t6n0lErnlT/9xeeaaPvHCX3yz5cA+izRx2+gYPEOqrBjw0KpBfSzWgZQ+l98ifKUwwHGDzsab+ObuU2E91U5Opd1rFBhxgbOxXsFDmMWVVzPKYWbcJWus9+iM02+t01TT+UmertND+OuF2qFb5Z1+cqwloQvb6Wh0taTVg4g38eJgbKVzbNV2k5n4dZITQQP9xYAXdnjSLQhzHLSgvh+D5ZPRYA4xjqsBQlRQns3NzBqJD1Id2Fnn1UgQCcdVt8ISGqV0zas5tuSMMraM8uleQMlgQ5kFIKaEu/GPPAGH9YD3Xt8JUWV+qqpoaaMnpn/L5sDLnjnXP64dWyI0WJjJ+hkPigJK735SuzVQ9BXd2hnygmvyo/DsDDdFqz9+/Xt+3emvI6Ifv/49WK73cCpJhT8j2S/lKkJMDzzwgGKsmxoo5OweE5FhrANwKvIJNJZ3qtBE/I985mBrrXdiFpG9DgiKUO/eACY6rir18K6gj6AXEOQJdDsGVM6sh3t7ADYWxEV2GqXgUAYhEoRrirTUq334w8/ccccdkzjanqXe6Rx1OEr3P4JAdom9sNYTDvMKClHbkUuw77JgtG68W/m5GRuIb2owBnAGX4rSFuzlA2vmhYe+4JxXDfjRYuhz4aQWtQP8LQ5/bZmPBI/sbweRIkN4wJsUsDEOcaKrmxUHJ8wSEcz9JE5vIdacM4AAAI2GG6tcCPOZbeSeDNWZx42wEw8NkBFFpUEzBnm2VnYzjeiwkCpCaSfA5w11AeeT8kXeqwau1oOr/REi8jhicvJE3HTXXXc//fTTd999100hmzn5bgtZkcFmYpqi2kytCSzuIXTodcFXvIKe26/tx+j+gUinL9dG8PZR+JkSCDiGK1Qi0tEDN5XMbGP3Wd/EX+jsEROP8zQWDBHPkAb5J+I6vj/nVJJ3WYdIYdgov+ZdjGclMzZ6pM7MKKIVjaOxrRg34KUcKoXs0ouFkH/kIx+59dZPoilyM1ITBOcDUuRkQfzy6zjgCynE2CGBiAh3Yeq6drvF5uGq6UK6knCnohC7YpFDK4SbixJ9GRxKYVZQiA4DLJ29fvny5YsXL+KM9SPTMFAYVGL4yulcIq3Bi/hPgLrmX7eIiV/FF6DpYkEdsGvMtuE3CbMFtxRygfMYkJB3MyhGbiKIKiR74uz8hXGtaAb35QSzkmhN2NYWZ6cu1C99S1HvLMj1J8CUgFdDYWHvkpZGmVloBXQpVYNTV9VTG8wfLU64TPXZBxyK6/2wpHx64VAeMjwjwBllYO6YEmJz7dq1O86eFbBtIFGjNC4R1kkpjKNTR80jOXOXblimkDIPFccLmeb9MEhX3kQH4/aEARnEjBa3g0kvam4ITEB2eE4carR43i58vWTsGjLUF4jfYLBS5cLkSfynwQhweWDKa/zBVngNSco/yf94fS2JoSORD+fAvzOcXBsPyTMRuQM4/MwRiSk7QIec4nTT5JRIPA6RnT0iBCuE8mPyXaCVizQR6awJspAMOaIPMsO+RLmzAw4F0a91YaxWpCGa1JcMuZQx9MhhqMXEw4JNY24ueAPokiG4jByQaVE0R0ys4g9Sw1tv+sJq762VFyWZvSUyoTJB0/jkYGeKh3VzYUiUy0ujBrGu8pHkA3aERocxpYEw773MI3rZChSWziRBFxUqhtrh1soiIj0V04sAL18tWN6FqyW6oi2AFQsDdcb6i0BXmnCgMN3DhJB4M0a1CaeiSvkioDf8idxFBHRj5tYUzBIz+86ivSeoaszCVm737uyKBocLSTEJSxgg31pkdHV+XXA9ZCKtsZNNfejgux9ijWA5gCOADoEnDF47MI1NubqJjdO8ABAbaFWLFp95hiHGeI1taxc0spC59h5KICo8WLpzqNc6TcCXquzLfHuIoBTKERFCtlwydMRxDLjyNinSC4iNmV/45m9106h7NkAr1A709hrGuOAx3oNSObzpjRITKaac2YmpEmswvbgl9wpofG03Ch+QzPVfXCaBZc7pZuaoSSEMKMkRY04mLKo/fR1hZ1TWpijjVI9BQ916DtLFgxqS+t0k2KvZOzMTd6Jd0r724lvpsO+/ibTokW6JGNjPlFIzJnNWC9ri6xTQKtMJiMT3rxqmiBR0ctgykLt/KLpMRUdRTU1PkKQSHosZZWjuehL57J40n+7d4kEGiHwP5PLWwEa1/QqdYvB0RF0DFBu9pxEj2HYOU8X3KFKz5nUPlDbqXch8TtBU3R43WoI4ldOR40jxVJM+9L6mrlFJ0RsJFVtKvhCRbmap/QchJukiTYcCVfl0W6zeuXWSJru2K3s3VP6NyAmrWQdDhmf0YgGwdJ8FInr88cfnyVU3lXSg8OGHH37kkUcIMFZQsMRVy/t4E2evl7TRQBb8dHMA4Ss7hMhjnntmYbbGkD5ajcGaiflFWJ6uZRH5ED6Tbb6gxCkVOT5YYY3ZrMBP4UN8K8qw5abzP/MzP/OrftV/pWIB3aDYaA4lQyxrWOwKBYv4xm4ByFdT4KzW5G4S4nPRAE665lI8U20TkhqkcjVjItiuAnKGf5nqr8ND5BQKrseRhODs9r2ofXSqJb03w28r0LWVZLhIwAltDp6yMEFvM3RnD4AFz2Q+8XdhsNKqmsyrfUz7Qt41HAtlZqLRmiT91X0W4mAoxzB5vKfxItsJW2pucXT0ystGRFezLV/HZzeT4JW1AozaI1VWEPZNSy7SKeauWQPn4lCHsNiUQ9TkRFopOuJeIksGP5beBmqBd0LPfOJcQTzDlAzwMVCRnec9t7YM4HtBVhEhIcrBClfPVnnl7xHenmvnFAoRd4uSLsYHKYyzd7SMuRNVlldRSrUeJscLt4UXkZPTn/Al2D4zZ8qEPaTOusMzcCbCYAycdGFmW2OkBVrpEuVgmTOG4ACRcKe6lAwPtSHHrUophbhSBfdAPthbWPMKX5x1U8XE9l8oFztmv7YRQxafYGrtvYmutDEWpDIvXiwASwNXjz322IULF3BV4EeTLl68+PrXv74MFBoKKeCJXD0WoGrD/BTIFTkA9oqbkJU6EmIyc8UeYIgoa56fw2UYfWXELCcicqiAPQkHdCCYKgg2yiYss5mIWzYhmjyObYOLbM+U8ezCAQ4kUUh1jx3+LsNr0QkFMjYtPnj9BFK1IKLE9yijxWjGZGt4N9p6ZLWb7MGPHlDISgw45tRDx1hRkQiz4xim9SFd6072hDTJa5XgEEVtCKYd8R5YU5CKNy587fsVw2li5pIgHbQLV01hXt3fEJEwdzC7I1QM8iZsHcLPVBQByWCUkOAIGoN4bGVvEaZIlSidptor2cMJB8AHr0VcVp8daquIgcHrj4bLCjK8EiKc1fPADM2wVTPcBq/zkx4/5XFT9vnh1Z1Cggd083nVCfgbv4X/syPnoatGUcGNcjcT59yj/Lu0tIQmGGLIAOb8TsuzNa3Kw3T4YucUBWMF8TcpOg+b6YMNnN2QC4wHoeeRD7812MYJnxHRNNqj/y7xmefJy30iqinmldQtZTtqFGSKHn7MTKdvOX39+vUzZ87MOVRtK+IBICsLXN2cq6A5ZAhNGTZUinRn0sbcErWLm3IRjR/bdWs7joMrgG4ULbR14UEW1E73E2AFunr88cdxTPDy5ctPPfXUk08+qcOFh+u/TBrEeve7302T9KxEZ4G08OGETSeaoynZzmNim4D3brteOaJi5taa7PeKtKIPrQXO9PgfzbtcxFsJE8lmPlg7CncmWPUQ70eISIRYYHccfERI6H0//b7f+tt+K4Js5x4JPO/mT0BQijs5EjZAxQO5ondPGpBBU5KwDiIxAjvUnZF+o3lB4xKMjcRWv1gKK63HxEOTYumjUSiNgVB+DcW1OLN6xXrW7KAtHSIzdmq7TIunSj4Hk8No1zPvt8fOW/ikJDoxo7YDtBHVLVBPRUJVioh8H3NKXCUhexC+nNwJ0dD6SNgQAuS4iN4FcGaGujTeiTCNW2isjkdqbZ4AhGfmIGtpeulBDEawOJwoOajVbKptHyn1vkgMxyCKLY/+0c/+jZrNd/zzfzZV1hE85569tHD/i8RuW4KeAjyYZQ6gwq9bP4Gpl2SRTXKYHH/MJqbgJwGH4VnGM+mi6kV/77rrrqeffvquu+4Z+r/kwRumlssUqp6B3UHejZY8OSt4h90Uz0EszIErfvWMPJSOqDRMXKhmMIJG/ktkDr6AFsJcmnvsUDFgDmb2GCGtM8k9AQZPV/aVPGKLNfbHsl6hSeU59ogUNSJpeiZOszMqmiWNY+30sC/bxMFZE7zCjisqaaU8Z1PHfb1IgDWjq5iJFc9cvnz50UcfPYkLY3rggQfuv//+YaAQh+3i5sSj6BnQwtnM4avpIuoZ0WO2DUWZuTE19jE438k9Bg2Ns9lVCtYa7/W6C7UpYBiSyCGa6Y7qXDTKbLNhVGdQOyV6n/4MmVjlELhIqWxFrozTul0t4+FGY5foZKMLErbhFqY3RLC+ZCS5gVsa+ixlMl9Z+MkYi7isLrO5ETaPNu/KYM/gm2GsZQHl/hYxzCQtYViKlZxQBzGDDBSlmTux8kF8XNfJBkOvEaMpvbzNS2wH3OvAomznGdOPVDnCCAK8ADNbMjyfvwIhcQzoAXc+J9WCiJp4ZMRGCZ85f0EfO/uBx6T0cBawD90P/oTGevHAlp7ND6qdZ5Jk0WZNmegtn/1NX/rj3zH/wuSOmfyY4qNTOBvgs8RX1BSnwoXBOTxnWO12ExHi3TTezUR0+ku+RL+88La3RV2UKTaxIJ9NDBriV/tpKFQR0k5uMDPJECpGiw1Aa5UM9AiyYmE9Vhgr2bLKWOsyjy9X7LJhKgffP18fIANwBod/dC9JzLsDmdBKYEyaiWP3VPTXg3kB5dL7OQSsf4dKsM20JuZAVFpcc/PbRZhoJ9JFdrtdTIDfZI6Zo4MMnJlpTaXo6pFHHgl0pWcLXr58+fHHH//gBz/4nve8h4guX768xcfD6dFHH33qqaeeeuqpyoVxfhwV/Ag3iYOJRxlQIZIxKw1WxSmEGr7Sr3CKmr0VG5Caic9egmfoh8flDFgtDaWvdA7UEjA8WZ5VGXNbQPF3qBam973vfbfddlvAZ8i8XDh5o4fwUtgtUXSpGQ5APPQZFftQ0tr7cWDWC2lk8xDDSjY4rS8/doiVjaLDZ76z+HhVkZgkPEqBxqXZavHqc0Stdae7UlxphRmpxBeU+Wg7SVJ1iPnET6ljnNWVHhs69/gX2U63/h4685Vy+svl9JebOswfZ5kus9C/ieMkBlvXZ/NFexExU2MddCvPtKleemXeVMVmi7o1ycTQBOqjjeafv/cbQs4Farf6kE+InqTIF3mNDaGj/NVe82ZqxbioeqIips6WGEAcx4a64C81tvPdTlbzbcIMiNt2Nn6SIwiAmt0uHY7qq23gqukHSYl4BKsoxOlv/tOhRP6bWz0/R7ZZHXfMGTp1iMB+1KTbdSVM8tRR6VY6uyTUA0lF9LHs4XBIEcAhhotZbocD9Xi2V3Ff61h8QXRQk3W9GmRnzORbZ6dgonXQmkFDk8qSb4werU8vvPDCoA5TinbvGsjnuEk42T+tB3pbdgcX3S3Hc6NPAR4SMZObEeMWN5iG1YaKxFmEA8eIzFEfQlcyM9YoP0VEly9f1pMEY0r7pUuXljOx3vCGNyyb4Zj0yCOPrAcKff4dr4YLl4k3wldDyGr9lv+ONiJmYfXeVQl1d9re024O0ReT+OKRsVdErkWlVw10muuUQZK8IJt8B/etXC/ymWeeueOOO+64446x187hsMviPqIyHgd9dxVr6/BlOVv9oMrS8r102MYkGXkxTrIHJiXfdafnbVRomMmpoHf1q07eLwWz78oxlA2xoaG0I0FkpGxu/1dtep/7paqJcx14Q4atY52PhywdIAYbxue+AUo+rG4TysQj4bCmXKUoDTeG6+KZsEGmOqX/Wqu8WbFGZgSaaZPuLli4A9Tz0C4lbxmXRrJk1FBDvAwvDNpR7ktOgjQZlnEniywlMPRWNS13CTRpRmH55J/7l0/+HfqfvoL+MBA1LyUhIvJZRwdm85TnB7K980l2ggU3ob27UmSPCwM4r9BrBK7uBchfHrwd+erCRKbu3twyFyuIDTRMMEBDLTo7R8sVwRdbdSW5zA19gUj8ZehF4MN4oC0Wvd6sdfCD4odhGBeGOckRKhPHfkaqDQ5wC2GZ1XzQOJCN4ohldge4kNDPWUd8R0NW6KytNaJ5Rch2rsrcAYZqxUkH+2AaHNYl0WPeInPuzcHUrrVYiy023bYF1N/tOEBqtQtZ9ZGBjroWkMvTKSLSwJKO/W3NxHrsscfOnz9/4cIFerFpPVA4I61p1WsAIwGXvEyoD5YJl4LEp7H3vvfdGQxXBUhn1uHLPVk3wofkeZA/tlMiXUyzGgu1UQsZG6Jmo3HkVusbRXHG3tc2dao1hd2MbpDbej/GWIipOX4j9wEjwdvpJMCxwj02773OZJr9qf9A7kcCEp5Q5gaNsftz5Gy2XhL7urnfLOQI/OGGyKMdRM5q7+N2XatS8wzp2so97ZqLdCtA8HBDKX0LJOC4UtBZSxipFdCJnYQKKM2bMJSfQYLeAxKQuYMOllPGVp7W6m43vO6YmauDw9tuzSlE2UtLnz66vHXr5b/wf9K3EdF/QX/cMdMiSzDrxQPVvl84KolNGmnF5CXVsKVqep3Nd5m/kv7Hla8zMcWu6cqWrrM984m/VS+e/w8/PBPIZTmbnyZeFxvFGU0RmtFr8ckbIjEtb0HW9W/+ltNf/MWpZvrc2E+yc9yJWKg3tidwwlnJ37zs3jHWgCHSYpip9I54RaVBjN33nqSUsgoEnyeZVYaO7wqgEkH6p7cMGtqWpCBmiVWCD9vlZxfFi2CWbMEKlJn54BAhkavDCOVjUZE6JhLynklgHaA5bDWl9+QwJVypUtUjouZWl0WIhXY7BVse7IrzwTweiWKiP6wqFfkXOSnPEJPQKSJ6y1vecu+99+rdLXSlA4hbTDwyPfroo/fdd9+4ovCkTRmmulG1EYmipidzmpcrRjTYzhGV+F9xvIVrkQg7N9X9S+TluaIEpLl32hhJEhGx/RRsa46Matljdlhu9p9qunbt2h133DFWNqGJHhToVs9hOxWgQ3GzKNXJaeNZXlxFEugwVZi1UcYgr8184nahh5OUa8n21X8X9BwN6TI45/ACM8e/86vMbVitGviPUloC12iDIalHeOl8As09x5i4Z9S2oin8/N/R84mdADT9mTn27FNByh+LA2kHGxd4H4c25kLDb1TjuJFGJ5suNam0+wat7McSf0JwORjV/Ftwt6tbg19BW9Y2OhXfHQnD4rgTKkqucYsOhnXrhE8+ro6I6MwrvimDkOAvoyIg2753VLequ6Fu0vtChcUNkIRcLfij6foP/MBMW9JlOxx7qaVjxvAkRat748G46tgQYraUPRCVBBcwHfXSCfiO3PcOOrFo8n0iphzGBDSk0sn06/A8kyGVwVYERolSp9ImF0pheC3cQJiJXpw+feb69edPnz69In6ZxobOgFl2d9Asw1din33VKqKKa10ThiNU+mHWMUJu3FoXIUVeXVRCe5fdLgHbAK1qEevrctM5mREs8pHBGV1dunTpkUce+Sj3xNK0OVAYoGq1/9IJP6089xyZjDu9JPHUmbuBLaHWuHeLfIpQnNA8VUhCiDMYK7lNLft0cmZtUGkWUecurn62tpBS2tjf7RGHhyoTE9H73ve+X/2rf/VQtYE3+seRaOyYiuhKELD6W4Mmr9IJFn7xM4MdOcqXOnR2K7dRpFHNi5ubxMxuzC+PBlVbydFUzi2IoA5lRx/oroQzxRbnIcAUCHxRHYlhgC2KoDjdxiTnz42vHQC+PtIBRhxf1/CDeDjWvgLgMLYIka2w88ovRfdwSp8hHos9NgcZ5YQNZVSurjXJ1D1Uhoh1lGFpZsuFcUumX+GFYrhLDszks21OklHz9YflWChD4y9G4mHb22zBwUBqA3sPszPvHNVUTJqrCEtfdMJYSzolEYyNKnj9PZJPwZLxVR3OkNw0ywlKTGrVHDBKkTcpAwUDeERwMJCNU+C9whNoc9+k1VHokOS5SaHtgjz/w1HPIKp82RHhXqC5tALAaxZamkqDReU2AibEuwDrRBVEoKeX8QJy8FS6Ou5V3Jzo2GgaFsnJfrqCjZhZem8OplpTgmxuVu99txsXMy4Q1UEEFtQxHvas6Arnucdw4UuFrojogQceuPfeex9++OFHH310DEQZUbpB1DE/ZUjmsEEREd+tXXyRYCTyC4sl9i4+86lR6mkDYqKs0EOVAlYP5pHUlLCIhKuqaH/IRlwET07l/KMrn6OSEvB+YfuxdQFshbnpYnbB31ksxkS7pzpwYwvSvOg0oqCxgNIx8ofg74G0xL6HEm5m+FHVE0OMgagiKO1fw0zHtgVpJYsj8H+XgN7NU2kqEw6ZRCOyE7z23rAjLgJ4cVLnbDCXBTZVEx93Yu1qRJhEK0dMoqu7WQSAz1omFjcCdBsRG10geBMngtgdWo8orrKRKsCuQU2NP/k4YBh3fUcDCd4z7qQ4Y9VSQRtqs7e451Crc6Cyq8S4e6SzquWSvQ2c/vwvfOeZT/x/Uj5UpAU4HxKOzlUAghBx81gsstj8twhtD59Nd4ztAwhjWn8fXvdRKI0LhuWZSqmmciFCKyK1ak3kRiUpLlpdomjQnaC3TAUcEDGLTQju5a2CwxJ2uBDGTP90S8CbLRGS3F4gV98z5SQqF/INgRm89qCz/gjY/wLSzMSFg641GmkWp9A5w1BTdPQ6C8u3ZlBp020vG4vOZWDe7RqtFgeUcqtxGB+WcrMRkc6sunTp0r333vvAAw9cvnxZp73fd999uorwpUJXmp544gndWGuuBvPCTxz8yS8m3xyN4xeAe4WIuHfq3WKDItR7R9QFmVhBkJufCTkOcEiU5YtZdkS23xnTzhf1wOo2otg2wimzTYkUH5lEqQkQyg/R+973vrvuuovKXYX/AfxtOQzWArmK/OHBUpEQ4eKj5Wd3wqftuOVX3xUpP/DwYh3N8AEqT/gAeTVR/G31hzjTCg3BcGczzQoPwapAVxTX8JedFQLuItWYHZrUgjhEwgPmzT3Nxqf8RPY1XMuhru+QxNZVpeHvswT6pw/7fgX9JvjUXLCZUSrqZxIbr0gYZ0dZ0vuaEKpPRvxA5Gbqng3tAJqIyNfHlW2vYVwi9YuIiBrYoPoRX2blLPV5xAR6kdXfUpODH4K3Qt3AC4VMuGzF5/p/+If6cbsU8QwZdUc6stSzCUglzjEKZKz1FVw8uCVTq2YNlffJarhOmaXWxi+SmS6UJkTZiOYx0j5ja/pHWlMbPnxIt4ayOWGzjE3IRjURe2giuszRJw5nNCssSTAQsskKMvBZOTyy73CHJDW36TrWBqzmhUpC6dx2BqYLbBIkCf1/qk5KoOAEHneUMQ/Mc5YwBUFPPEBx/J2fhqdbB3Tp0lpjO36BODYaDXrBRUZuSrjel+G+t+CQThHRxYsXdTfRp5566p577tEfzp8//5JDq0g6UPie97yHK2ZXiteRreknohzhUm5gVAaL84FAPeaZbKaVaYug7+19T0Tq+mieqGQQLzIvSyfSTEHKr3oiZmsiovZJuk6+aTCJ3nTA4bVP/9LAmHlHIu8svuIVr5gZuMEu55ZVJ3welR/M5GFlP4q0jfRnYkn6cPqe3a+vJ5VHFVxLLI4gGxGyM1cNlBztfpNdOrHdDrWQ0jo8POkL05h87yV7LiYX+j7gnCGHqXabfBXvjcVUIXcjvXNrpDNLWEevbdHDoHogwJplCjylqGAAI5MjV44n3VHF31rEUSm028c7JccI1g4Dig4ib7JQ8nez+l4jD0laawPDTGAxpiVAAyPZHH0gDaBLTiRyY267IaCqHpdGMOKOljcyKSZvmVwaEzozd+dsw/sDuFoR5q3JZDMxTtqdq3AgXSIeC42/lkpKuRTyuCo2TCkiT6CuNtQfrBVBrmrm3Qw26rfst4kKFKUpZhqsG6tirIYesMIXcaUeu9lE9P7f+n2/8oe/rBIjPtXJhOGgzvLzz09zsKAXIkkqRLvF2ccMqKh0w9BcQGXsvg2cejYz7rZ3tSPLjW1dqOK0RkQxTRl6xX5MGLLP0Tfed8qjlJGr+sIpIjp//vwTTzwRG4qeP3/+/vvvf9EHPB+TdKDwoYce0qWLI5yqErD10/TrAmOxT97yrrriFHaPZRPbHedyDrqzSRX0elFbRwfsKA0tYJIJ12L4iFntKhHBhIYkmHywf4IdpiLXrj1z++13eEMvvAVqlOiWQp4TD49lRVyTfVr8nO3R6RgHVrz1Chel3Tups4XPn0i4VGcZBLhRmBHRgmZ/09wV5TRYPzJMMrctgsT9K8ksOQ5aUJ55QfkWq3WMeGnKdRUFmwFiGXZVnnPKiwRVffWEpPHRnkz+HD5Ga5onxB2ZAsaJ2GpKF13FWIdyq72ywwM9Y1phmmIBwG+ZIap+CABHNSBuuHLndzfWGrAvCoL9t5sBiLhlQNA41UOfBGJPyjbgu7K0BRDU1+vYazhLc4w/9pm/TX/43H/1Q6WsaWfEzdLt324jCdBLqZ2CjRU5onbO3hglZ2CC2yHoMJS61TdLdXxOS6/z//L6zAe+RISun/8BwGdqFvaBmVYdmFnUQ9m7LklZyi12dYjozb/tdxDRO3/b937VD/0ggakJ9azC3Fd5WswJCshfVTM9T8+KQDiE8sASyy3kHEVek6035Ip78F10wYqbujD1PTFpRAxGD2yT993Ot3qfZC9KGcVypYnOq9T9nIP1Uh0+eGR64okn7rvvvieffPKBBx4YfCefvFnDpsedMZaxOPcXpTgth7kxd4zrovREVy8nVU0Fwtr1NdxGwuCbEIlw0/0JFTVrvyV+zn8XuJyuXbtKIrffdttIU8GmEeGjKUw9wfMCyBb8f4mTqVtYDQcNk3hvv7y6fzPOevh67dq1s2fPbtjZzUwqi8I+Mpf9RA7lEtt2sK/pKqIiYLEtm2Ef58MJPcfEbUmKae6WLLvsBkS9/bCSgvSYoeEscfirr3uhA6LdqEuUplFgMmMK1Twqn5tOYzCPoMTiFGkYoSjUo32wMFVmzzYT/BQVnrN7dPZqjg7nqJROgkC1rVNItB+e9npl3TeyjAVGWGP2o2YifJXAzb07kc5G29OVz/jr537y94MsHavDXl4D9IZ/oTqLLIWI77rr7qeffvquu+52G065/IOJxg5PorYaHyKiHG3wr7bJqrf21hopOvOBL9ZMT1/+4ufvfZtmJT5rU2Rfiq4MQFa4q9KL5pzJylAV41Q9Tz/32zSOlZPZMX8odz7QRtKkGDFxnwhIkhw+RjFukoIdpigHr6eGaMSe+dqppQ5GJrqfO1zbR6e0Y8/tSFc+W3e8He/OzPpPl3SgkGZ0EpI817MAiKJUy2lYkfl2ajBMKzEco4x682c9uvD540h8ttzhEuN1fbrl+C+SbeP3LkOqNhLXRLQ8yNOSbHxSgvGDbGUfYlc7wdtZeUE3RcBWJvaR9etLdEn8En1eRMq3MpavJy1ZML/7Z1ntmLHkq0Nt8LepG+CJSAuBaX+LG40zVQ+n4N7IRh+AsKGI3nvv+zia04+Ngk/3j21+LXMiAF7BLpP00JdU9rXr8n9GJrjLCT0doO3RHLmJt1T1KD6Vh/M1snooJdU/YaiY4Gvjxl8R8nktLeaXhD4u5nkA6jz4sS3L1Y0wUW6rveFHkvQNaxbmi5nZJo2Jni/AGs6XuC7TSW3WuxA3uvO9f8AE4rjAVVhdvxC4DsLKK9Vy9jpxsBPtB4satdsggXibK+yAgHOBwiG/4CWOjeq0HWKFO4sichPZo6JVneV4HUYJycQPdNC9w26lF3T69Onr168DA4ESIcoxuGXaQwsWUOV8a7UWOXsSjAlHBV2azJGp7IkwbhlgGYmIiMIs3R8LGwV4gS2VvyrVWGUCMKMpI1j/6ZMOFF66dAmDZ3z07KsxO157fSHqXafFxJQ3Hxnc3xDpzLqgPObTaYeDPue//q+J6G/+ur/1//nxH9ecQG7K6p6wrQeF2yF6kt4Z9sEk271d52M18T4mWQcXK9Q+/OFnz54956G1xbldyiKGno3f2SIveKv6hherV7aM4U3iFmjHjcazf/iEzF+aYNtR1LthyqCjiC2ejp4Qso51gMARghfkQ9fa77QXCkwR9J2E3Dg+zYbbyOtCTNQt2CCt6XYDzUvCQTQZuK/1Hm2m9xSs0ISYI/uQtiIAQptq7GrgPXsh6j78SK6C8OKA9MxMR9Wy+77t17kQC/m67mcV2B/3ZhSyrRdhmKYs7WZyaKKlsIXkEIe5tkrME3B+bmGs4xJaVzeqBHbj2GyAAHIfHO3HMegskpFMcWf4m//VD/9z+oufTd8A2eFY0khn3PGL+MrI5IMgba5YSMmy3zIq8qHM4CuzHcruAjZ7q8zw+vm3n778RUR8/fwPOOvj19whb2bFYF58zXuYbgbHtCLSNhKSGBmsTyi8W6CNOTvAFoM9T1MAqGTMxTYpZd0bLI+v0Uyqt11UH2Qq7oONVZAPx+N4KIuYDVftdm3XmmYTUBiKKYiqXEtcrx4gJqJTuhfDk08++cQTTyx4+B85PfHEE/fcc0+c0gMeZY20CGoyQq60VmV0g0Vaa110kaDt2N48VO6DsrpWg1G74+qv/rq/+Af/+TdGucu/y+QgOpPRTF2nvAsN4jjafbe5qXgKmP71v37v2bN3LNzIzCnLk9bebiQ2o9lebiF/+/UXkXiAhoBOaLoP5SfGG4zCR5+KcS9FjyR1Jy3BVuCSQqXl1uI04vwJIBV5c1POZ8f5rVQNx/FpfpiRnWK4QGdkWTiF64b7HtfH46YF8kHTRs6BNR+IaB65ADYeqoUx2DaKA+eXKHQ1ic0z8F9jVqJp2VYLZ9lTr8neNbNuXJTeiZtuHqwFFK8wzOHQUgsZaOvw2Qa8mt3MceJghQzwJREAoqso+jDSGoTESSXHVeznC/mSHY4ZAfb/r6dvDOjluzsJwxz5SfGt7dzw6j0Oy0kkAJWOmmOH6zCmRt/C3+Od9ERuop3V0WqHAs/P3/sDG63YVTU1jxECedEEpqEqI7onyyRZ24Xt/GPEYWH1t3iynoOFz4BI25NV0lp93uoGztTOqeMV3MGqU7a+hY0cCPhMqjjXHpaNzxEsPWJjt2sLdFVQFA8XZhVX5AUsO/XQQw994AMf+E88AQvT448/PqwoZC77WhUsRUyLDkFJtY11vK87c0mHQvS0HB0biRkDXGYEp0T+Dz/+0LB81/47qMAHgVfz2S89x/2tUoEOU9jjRexr4jbuqxR1kenOobSym/njia/fVPI1dFp325oEfw9vTcPt+Nm7sED/ISKHkEvcYWbYZTt/HfF9XW9iIakRZzR4ZYSnw77t4dCgn2RoOKAb2aSW4MMy80OV3vzBY2oqab0LUW/NpgyLyLIE7CUXSoQI/cqi00kOcWozL3zGwDepD4sbhM7Iua1gg/2yiwhuDSXWx8hdN1lgbJIZD5NwlKjffR9I1SDMWaAgx4QKK9jRRYyDAMKI5j6owifr9FTNVBMmC8BBle3mIYDiWjNsuUlOv9qQ5pFCBQrsKAvkSm9v1CL6fA5UYp9J9L5tfmNZ5Y2apNTM9TWHPYoV0noAOQ12aROwVjQWHNM9RyrEXL/bcdYR9I3hNaEqRQ4dvMz4xVRDCrcBKW5y9fr166dPnyFno6xHTkah4gxQCbcdectyaZFjsLLWLvZaKGIpIiJmuv286sa6IVZrOsN91frjplalvLDcVJ4ZXMYpXcf3H3XN4OG0Hijcnuc+BLcGODXnrwKjw6/sU6ZE9tGQyuh9v+GHaZvtfve//JfWNtBa9paZQqB3dN7rxLi82ZQqgsBmPadupQyRDxH66Z/+6c/7vM87IHUyhgCPkdEEuEBtIsvB5s4meBFxPFjWSW8x7oe+yCJLF7izCcgCE88wC66zvit6BACWjjeT7XQwlOdtaDBFZGNGReMUnkJVF4k97L1phvoc5VqnlDPbJVghRD7CYKcHem+vvkng9Tl3rQz7O5Mos5UMeaao+NTEGLxIvnH8ibfTxR7FjcjXffe8MEJIdoDD9OFBzmm2xlV5YxZ5wgMsIQI5RBwQ4cwrfzvzjliu/8IPw6NU4c6LaHTwYbC/NvbWgPhUgQOKPFnd6DyQ58wO1DIaZAUtUZCLRqKt7YpGhn7hs2aXWnsCwwRA1uj9RyKnL2NeOTk9jnXfEf3SaFUEXzH0Lb5qz1VSaPSAQ9EhybqDdKt9Yw58WIuUMQ+PjXlfxfsMEW882XGsUyzJZ9+AAzJEQK/H1zDFIlDy8XTxwzwoMeKCnjInj8LUxF+b7sytNd1rtKkjVlvuLUCY+WKyY21BXt6Pd/3mqf+M0CrS5kAhQPLU56ne7B2NAQdI7DJk3G++VJB6v+Gz3liIu+x1X0owFiwiOq6tMu+tZcC2EmLu9Cho4Z5tuo9tPCOb2Ep+r53dV7zilu0FHUMgSsDSHaSsPjNAqAHQoPr6A0QnTIPIauJXrxoBlEQHfIDgLC46HJUqqZfuOdcOsqdiQxnlOkEVUSinQB61VIfUNDQWwOjCCv9JyJZ1F4w157NKh6WQvRAlXcvQOcrkeIP9Y1Wg0hBqBJlznhZnzhZYCoKHZzwL3gGmXDf3EBoE8QsnombQd5peQGfgGyjUUM7EIoFC7elJd9KNBQCKXg0pPx1k1L+u4ImzPPOCuhjQD/JnInad0ITuQP2LOnvXq8FbOLY7B2/ywawpDUajA9OMZob6WsdylW16t7rHgxHkIbJSouSapBfV43DnPXttnnac37ZsaLXiWoR0p8M4z6DkM4pqtjWzHibFwMxl9aCVqUs0GVnfLixKlV69bgF4jHIrKa6XptI3BpsSQ53J7Z5DRpo25S76xQ6QvRsAUmrWFSc9zyUbJOTIsLonnymrWwdIayRCu92O7aznJMO5t/B6I4paLU7l6e5/zknumB5//PFLly498MADCSloHCjE+wPw2ko6uaR3ZW73Xa90xNDAFsFXCrvDjWmvLoATzoujq+ow3KDEXxOvqVVcCRVKaNc8+t8DWEl3G/4kJkg988y1O+64rQ42jVdhlb1eh8GKz3UVSrvpLnMq4yVYfJqTvVSJsoMS538xjTIcVhW/hblaav6WUQxPho68bTxuTtR7PEJEfnIFVmn4N8uo/qKCSCnVdCnqQkIeUqWMAfAJa0hPTur+Z2JIN3jsTK0laAiSQA6EUjerr0i/GV3DWi6RuxyJfd5rNAsvNGS4p1CoFvaTSi3MxkpxBzkxHCsb3Nt0V8PIFy1sK6dFBsxU5FJEOunGO5JeIYdvWE20RziJiKQL95ZLhs33B14pe53P1E/9UjKt7zixaagIwgKwM0Ihcys34oYBDxAjqH5aDDMpMc3d+eBPhqkhYt1iND10lBccwxlp5q1bC7P8IlI9OsLKDRBeyXBa/AoNPqnOmn3oo/CPO2BNtI43mE1800zNKdjOTCK6Ldwwr9fyonITZHXyGnadFjjbyrZqUwYNrsQQDYPFWKvPEmNp+MNJjQeiduhI4wLj1uwxlIBW0Edhao0b6wx3Gx/UOFbjJr7KtnTUDzBd5ZApDPfy+YHK//xJY1ex2ammCLUdCL0AH8d6Gs/hn2wGhVS5xaj4Hg2eAxza5RlQvJr3K2GBDKqryI+bSEG3QnXVKzPBcuLud4T96IxrV6+S0O233U6Y95I55jmN8lZ2AMkPe4fFVGQ4SSZ+8ogBhVS+yI+S1LTeyoNVK7uBKywstqIEcpEJk7yM0m+xGnNCiEpXDSrdjt0moIAXxWj20YyQpZcyfBifATob5UE6+MEaTh+OwuH2RF4wS3xHVCHqcBhH7/voiuCJ6Pv4oRz8PPDLzhRX9+Dhd9Zjo/yVjrsDeHMItINmhgdmC1Ns4JrPmSKnN0QtGj7KwN10MX6CZn3LDryaTnOKA0O8aoRjZAklqm7WQOD4GWUEnmTiu++6+0MfenpLq7DJ45B4N2O5MQHXE10YphLXix7XY6KwAL1STDUfMkbp2i3wf/6R+Bt6cMjWGxQbFXk1mjMr2uEPvERuWJa0rOxEbQiAJi51NZ/DSDA8xYlPDjZz3Cg4vEatKc405XodL5aT0HLTELbdZKTLwAESuuWVtzz//PNZtE9DdKrQx2Wh9Yyjwd0z3MyH4YinkE8UKuaQuDgAx87gYhLdZ6bbX4EcKAPhB/mctwGM+4vVkTEe9vyfPT366KP33XffMFDI04z1IYiFOQwPi/UpSEcDzTOYt+gQx3LszRRZOo9qfxfcJvYPvL9HKK+cjzF5H5GsUz6EUqOPIN4P8JdrxFUnxYfFj7KQnppEYBBt6yEGyk+MCzKjWn40SZtRNH7udBobze97L/wg+c5djC1PD06iog/hRKKFnUY0Jz5mz+77N/gwWR+rKlZN69vm1smWL7mohGn3FLY8HotemMu198lk23e5yrCzJQO6ZFIB2eXaftdT8nYSHTm0Pdaje0AkaL9siwURNtTUnTQbgxDxoViXyS5i00w01lKqqCadFmYwH5lgccYO46fCJmZGCA52M9/y6KsMATPXo5Gk8DfxNfj8/Ed+iPlUSKaxg8e2XI+uBdEL1D4s21y7EIh4eVmz4IxmYbHGShR4GWNglLAdIBtkTCswzL41ybfZ3BHxPhGCHJGilT2CUhSPF7IhXs1pPgOZA0dUHUYM+AO1zpvQy7ip5J5xF55LcmxkPzV3J9rBu0pYmbTklcSKW0OHoxtCvLUhFJrvJGSVxVHKqGKWJa/4nB2GYDIjtVPrD2CLbUURM7O0poODJbSgCKw11mYc0dJ0TZTax2Zy4BlZvPgyAljnz59/9NFHcaCQtvy9Dtqt5mbhHQqDlFC3cTk/srEi8i7u+Zo7FM1kF3bnUErbLTrOwi1GoMssRVfI1SG42WlBPwul+HL5q9euwB4NNMsZXk/yMSZxVOdoDKbhn5SWeH/MfONVcltgLdWQUUJU9pIBnhSOVEghk9qfmPD5TXfiRlPMAWUbbU04S8IMItTMw9EZ7oBfHVcK0T4wmW3qwfHIgmJEyaUSC/IY3g2P5d4ljRq8wMPshFqDUrQJlIijK4m/xXHhtQ+TldtzJyraV+GpWe6outCKA/Ey/oOSFo0T5nIH7ctQBZ8IUlhBDsL8UEI3RJT4KTALvgsAYvwKI3oKObelGrmveVfwoRVZLEEfkrPaK2wnApbGxdezXaLLIUQCA96+zEpE9Oi3A0mtpZ9CiNywmmFU1lufDjX3wRQVufvue55++um7774H7iPaKNgIKm4OVb9an1kXpAt5dDxSq3vlj0grelzkwdrAbW5uZLum0cr7aZ47+YgqVrllrDeJYfBKhUjgQFIbOjj8BPSQRtR8hzjmthC/lCDRSBva8JBoifiWa5NmRYRSXzQuRmCEuWnhOkAYnYeIOPauG41uIqrx/mRPl8/HzZfLEKGmCxcukA8UXrp06bHHHiNK05x/oZKHTYYiq95pGPKIr+KBbrZwoi208cYUPpisJDNsaAOIigrpDLCEcW71YNDBySWiutewOOBTyCzXrj1zx9mzMrW1P701hrD+kLmM7n17iXHJEz9A4XYTrPkm3rLmhOqw2txNFx8zLdnX49yb74WNn+UYChOxx8AbhKmbb96jpgEztDiFv07KaUz2RI4UmHHKtnFZMSNsd3qIWRXdVka208PUTppZlFbXqyOL5o+SNd4Bu5M7t8e5Ula53vXnlDVLbWJvU8vmJm9rY+hG1FqOsjG5JLThFaewyLtFuWLAd/PD1OGT1QZfwj6KFQ1lBHBr3E5xO2XD7FAdH0xpkIW1ZDFNCy0JKhrwhGh0vXqx1ZRBc7AIa0Sq21Xju+2rXD/kMUXf4f1Aqvwz8nImUxg0d41t/SH8KOdadHopxH4yufWa8M6RaWos8bLQ1wiVrdIrC0aAQlHf6W9pkcFfBbqyGVzdu1cJbdusXIPwTHudR1lSagHObqEgoycVHDQXmLEQ1tX10Sh84YWPuF0NkXYmeycefEdym4h8dxuFmB14jmfmRFsjnQi/FsLWuLHBSmqN5iky5n0mIDEUesL9jeHFl1EES5MOFBIRMyvekpVwY++WYdyQnFPh9XoXBU/aSWrNJmYW7bVltSFktu82s8rQIQARgTQbKJi7OzYhwvoo3i90kEFxYG0XJt2ySwdQtsrVU/MWAnEki2sqPPQ8o+il0CyzObo4zVZfiYVBYKfU4vhmGYZPRIPo+ZQnXJ5zkAbnvQ9VRENrwnkS2TTiIIo6qRo60mXv4mMJBJYRh1r8ZjS+/6ODHcw2508b3Zu+m3ckCywsK0UGigstByQ26KlUsgs8EZH0Ig95khoO8yg/OUZARjVlJs59AZb0uPxzdmE17qU8FghokORgGwRosKd1ggTK+puMzUai0EBIGsVWjEKyV2tAJUIArtdHuMJbuz2xg2kBdZnGxbWJnBTZhgi9GZjw+htVZKzOXG+ADquXN5cNDc8PE0yHB+KOuq3pV8zbVZuIXAYslAXTqjjV0fIP43m0cVqkCFOVU86oZLpwumSMggr5SWtO1SDwMjXZ/NUuMHYVVmijRQofRfp7ftMXE58ios9+19s8W/YIlgvWBruGai6w41ji+tUBvA7mnbnNfcAQJYdW9iJkksswHZDNx9LjZryBtnJTeCYFUjYxSz+2wajs3OwU7diytxVpNavBanBQ08sOYBHR+fPndWd5070jlg0GxiIfF9dK6oLM1kikxbBg7ze8U8460U2cWWwD2OZ9xczlmk6EJm6jgTbcTs9jvy7oAHuNZvLNvm1esJ8DwvG6VZT4p//1T3/u537u4akYx6fAo1b0thEfQBikTd9WWZTepep6EBBfnV3BMUUAjiaUmkAjnnNagS0hgYKqN8tVBeg/COyd2wzlkhCG37FGs7dJTJaQmoGA0bqJUEw3AU5ueka4cNaUFaNLf8k+WGU1JVMB/ZeJJFbZEqGrZAA8LHLDae4YxTkmFUdFDMvUiX2YK7aRmvOcZ6u4DByTUqFovrLKRqDQ8y6mcxYwm90SljpMCrvkz64LDHqjIifK5DgkmDcKXVZqTsiZE1nEriCxBOLAKxmrpez0enHW6WzuSBcLYL0HNSK89HmhfsWBTlncRGIPe0SGO6ohnIMNPeKbCU6BgXdjUZ/n/NG3LBYpsmEObcRY5pjmKulsRqL2kc/9/lf+2JciSYVZ0JhujYt+gRKhzJQqRIanv+SL9er6D7wNoGT2GfxJveiuDdGNBIRl3TdxGeg+1TihklM7oyvyWjTXNpvcnn0SUUSVa/b92BxiJttdeQNPBw8mCVFZ58rScv3yGiK8fPnypUuXHn/8cSK6dOnSElm71oUVW2oX+EjrGtgRvL3vHcNywNtIZhBzfdB6nVH9MBFnlBsuIpqqF1xCx8ww3BDBTJ8T04ioC+lBuwk4tDYkt5y+JaQZ1q8cm2bWOW+NM22VogswpY0hANjYDS9c+j20C54GGoJjdUlQyBxhCnaIQxC1luCFchhGRcq4R9g19+t87dozd9xxloh9+RVL18ijxh2ZONquQa8XK1vk0NtGwjIiSvYGSM6jmGMG+Fk3pQgIgtdPcIi55pcksnSKASJ9HayJm8I6vCTUu+yFul24L8zg7AkgYEyl+gmx1cyzA8GlDGOVclyTxlZffnDkWGo1g5YdcFWAVHErMaaogdejs9fBV02Kvx6KS5WSaGvbux84LDI1xvy5Wf7PbYFWYRqfyuF4HyHSp3ciw8JMzhwkmnTTisLCTFHtbqNB0N7fsIpThxqDvDDd4x3Q092UCTP6gJMnP8hKZilkwwdA+sa2GgPSxb9FBlZk6MXKAVmSV/7Yl0ZTes7w4bheEIMS7sdgS8xXiZWn2hc98zVfxWA+mPmWW255/vnn0xyV/KP/RlgQ0CmmvEqA5dCdgHxrMpiYIYdhjWFTcEZot20b95hzjVlFEWAPF+BpaPzFA/Lyi2DpzvK4olCmPbGGxNj1yU3t1AhKY5Jx8pDxMNafqw31vlSGUmQ7Zhbl6nX0XNy7k6Fxt5WS45dC8Qyz+HLo0pvXZ81viN+x9My1a3fcfns+DT6UNuRvTlipresD6agyTiCgMzNOAcdWZubFRlNEbWyOUNpxUyUrpZMHv3wJJmM/SaxBdGpRgiFYPSpJYSE/HkgIaBTgY1FZRIoDkaWHKcWaHJGqgXDfvfm00EYjs4Zs2aamSogx0Fbmt1KRW3/e7FqY1wO1YIZ4s1Yc29c5kHZ5EFRtO/IQodM2jyCcnIqC2eWeaEfENk2DdOp++ImF4+QMU+HgIDlbEKURUSPbIqu5qYmLFNHAWAPnjwdSbvQik3VIHtox/7KJPo/PCioaIw5wWED1LR5v1OxcBkRFQCVDreXktyQcc427LK7LW0kUZtId/u7oZlKUAkrhuefq0ZES7Rh4TQVuFgF0tRITftgLjQi1O69+/T95/J/TX/ts+urBVI1YQYJrc2OgGdIbOa/OFVyb2EPdzk2Go8257VxqhoKy1WZLQrTTiKlzb5p8l2qFVYsPym1WOTRXhKWzMM7KNafcKPJfWV2h9X2t0WpqAj788opgxbbysaIwfhriHHEHUwoTeB0PV0jy1He98s4KUYxPRJMQpZUZ2zqNCIpvafvqkyF2gl1kdhTI8B5bl057J+IX1Ohdl4jatWsfJuKzd5xdzXQuJ5cen5CGSarX6djnNt+OjkZOL82Oi3VfxHc4Sk52M0YaoegemOyikyE6ztAWPXNyv9/vO07att0Myx3rblK0u1pAtIMjz2qf3gaThHTSrnbtYDaox0SpkS9spYQjJUgAzYif0mGNDxMz7RrvYr4wxcU4j7k5SaU4Jc/nmxtvop9KJaCi/fJ99M5r+CS8bIeGTNGOUFt84sxsIvEYIENoITRiIajqIiOU4qsTKGo0Mmo7zqqBjca7ZlFkfd3m3atE1SDTuAbF8X14a0Ico63puwo5SQG8fCQa8H0IeRoM23LGipvFY/2BEpMhOGF5kqv46n5U5m1pvUXzL80moSoO4sLx48IWKm+6QcTcGuVmRTLkE/w5KbjXoe1CjjCCtQPajklrE2vZTvHIlbQM1Rcc1eKca5+9HAdwwV7y1lQetM+mrw7J94dVjHcZXEzxnpMM/5JEowzeSojk+pvexHfdxXfd9fzb3x4CULmIAbYG8/Fj6ziG9SKize1rHZitP0Pe9F1VgnPuArI0YJ81xNCU2jTNnWQsp/BZWQssERMB8VdgftlBZc5B5fblBbAwxYrCBekTxopn8iJBMDERHvFYWZyWBYKKaS4ss0iuq+iBioGgmNXullPAs2gehP08uweGSU/6FMoIs9Cbv5B+5h/Rm78wGHCCYb35z9Y2pJvbk64/J3qyDNQTcSsdR+Q5uSfA1netCqzce1pRM7PsI4abVk5xWEAicsv1yrf9uVe+7c8DEKfooVXpqxvoV0Umd0IyzhLIVqWNAACAD0lEQVRyYYIBDpTYMY0ViEWUQ1sTmmmigD59Ik7iYbxZrafeMUNZ+jCSKeCR86oEDk30qbyuOuHDWLRyUVEddm5tujGiWKif1UlfW3DA8SnQtGpsj7Gek1xv/JQ+29rEeToAVorNvnrxtQmnXPiomgHHynWUcxCV1X3PcGRpZRc6jOYXpK5OH6/iytOOM9lrdaAw9FonzoEP42h0Jl93khvIsc1pU71tYbW8u3IYaMbSxQJfouhCz/KzbvFhmpEKUeIJhK24MLlC3mBRAg7bYiC0SULj4iO1W4g9nBGC5HajiTgVASAGctCTE1fsh6GmQfDzb3rT9Tf9lViFOsnhnmS/wc3uo4167b3KnIzBAa+JyLwzB2MxtLYtVcGKlEZuzAIroztsmlpQxEpaK9KaRzzh2ocUX3ZDhJiWA4U87EF3YLtRYor1g77gHDhLzl99xQwRR1dSdOu3oRURkgr8ZSK5evUqET/99NOvfe1riYSpCXWd4ynjVnvxPF29evU1r/mMuMm8I+rCnYhZ7de7/lwEA65dvXL2jjvmIastWZvTiZ5nDg2e8PiYsax+hVtcxkG0AUTyyBD2gSfOEaiSVbhphbMUXW3wUhEVcJDLzdGPE5CKIUKvfPT3apmv/IE//8IX/REvh9ygJP3eO8TOpTiBLjtaqi805ADU+q8vg60ipE+mn7dfQHmXuERursnQ1Q0CaYaIzHwMj5nl0CCiWRGygTM0i/FohcsDDSVnIibu7MuOWuNYosnk7UtECQWGnuFS9qAC8yrHWnmBxxPalDX2DIuVONwMlBO/Fv+NBdbnS2uKOeYYELSTSeDhfHKNV5YAxizYOP+hAGIZucfTsVpLBmqtOdSgTqkJsqFqoyej3KuzlK6OKeI3TEx2jgVHkQf960A5hbplSCj7FeSqeZQaOR9ykMsv+vBcUEA08pMMm4L3IdszSvqe/egwlQfFVytVCvNVMGCIx1oODT0kBEn+l5NYPcNSL892YyD++vXrZ86cScWJsiZdqDyi2prRXKIxLUThk0JQVUwmYvG1Jfqo9qmpa/Sr73a72ALHZ2GtO7oL5GTX5gbw7vLhlzXAwq1H9Q5iLI5JV9MCQ7wOYN3aTuGq+TiSiDe6gIK5T21HIfYkToyXe+XKle/73u97xzveEaJz7tydDz300Gs+4zU6JOWCK0R89erV9/7Ue9/5zne+970/yVYinTt37uu+7us/4zMUaYWpaiJ7+i3/L/6Zf0RE0n2Pho+CqyvbXNKB6W6QydLZ0+SzZTzoVH9gyh04AUMUheMmtnnBLrWKu/ghj9kiPtIUNs4xFpx/NJQEYItUSGDau0OoNFtgPZemweBUokap8hKbDEi8jlasMlzqnSUcMpfQwH6uQcaU8FcBM6TBhubmWcJxBt9MTQyMZJc9DHrYUqsVcCF1k9gngnmxqYDWrAaJSVdG2R6E4k9HqyH8NE1U9NeGxzSaeIT7DJspIrYyHNUfTai3tdcEeuT6a5pWCM9gcqblzormTCeYEteHtoxZJvWFdNxIRUS5aikoXyMPwTkZitI2yXYEVTVbV/nA3KTv1d25OQ3ORAvYJv4TDxNGSB2yQcoZm8DXpsFjO6IdM9u4wUlpmBAMhkiDJC3mMtJsSw0rIaxkB4Essichbs3NRfd9akzREvNgllg6QH+HjyB7UCZorbOtHorqKXZ+h1NGciZiMCEuWg0tO6CVEJIkn3P5fGFR7ZiJhrhGJ2LztJw5sKYbVzST+2jOQdjoQxIz9S5MNG40OmKnUnA8UDkAOaRFfTkdlbNMFy5ceMtb3vLYY49duHBh07gAxiIXOIdfHlL2OGFr3LmpUgtxRAjZ59aJDBtaovgmAVjKO/7xOx555NHXve513/7t3/4Zn/Haq1evMtH3ff/3/7E/9se+7du+9TWv+XTIjYn4ne985zvf+c7P//zP/9I3vOHOO89pbt/93d/zp/7Un/wzf+bPvuY1rwH/Ya/IV/2IXl19y2Nnz567mclzUr/cnIHeTnMIYRZH5dhudWKD/i6cJ6twzr0ac3DNsYtO2kxMpj9JA5H7CTBhFNou+YAbti6s5+t6Nhq+UnuduCo3zVANBF9qzjugFbtoJFH+pYzaE0VYbXIbGDdFN5F2RO+qYzA6YdOpE1D01NkKixMnK097TwOWiECIE+9W3GyeDEWUeAn55lkDKybIzr5U3YMNlhXnFOAkAirDOUgVIIacxi2G6B/GQEHMZQFHP6TC4/DjQVgGwOrbPL9s90Vn1gciDx/J7jOMqs3ZHViOROSD/S3veM9VyR+iIUpIxi0qp2QDHg207TUzuK4DWYygrbY9eQwJO8mNuQdiS5SwNaQe6G1YfxB+zum0rArr7rrr7itXrtx1111ErW65PqfwL0s5SnwDTGtF+FWeevS3GN4lnR4uIhbQt+0trF2ExuaTIphpFkwPgXVZSPZqYjFNvDqg+VIjRxVZ4hp+TOzKOnqVbehTfHVXnvDN7ikYC4K3c17j3/g1f56Ifv///keICc6PL90V/U+JFeLeieEcl9aldzl1qtVSDoOncZa9jA+MXZCb7hL9p0+XL1++77773vOe95w/f94E1FmpD0CfgIb7QrTf9xs3et/LjRv7Gzf2+/1+v/eJz132+72P6fgrObwduRVzkFciRPL001d+3+/7fV/2ZV/2ZV/25RL2mERE/tgf++NE8q3f+meByajbuYhXS/mar/7q13zGa77+67/Bu/622MSuuxDRX/pLf/k1r3nNZ33Wr912FkGlcBZ3VCvjQ2sTknZhwgTDdxE3LqkVQ89YRHrfmyIQ9ZzTQz5M3om4yw13OIa3oGksHzaNLROEKRFSdKeiJ1Rs0LVr186ePQd11xz2Q5drzS/HedFkWguGSLybirA1gfdGf6FvE8be4kVuPI5Qf0IAjxWHh7QwE8OFAqxad+05e/RKoik8Cm9s3Pki6MxNo61IFbgHh0DRWLIPmy1epKriVEeFpjtKs8vkK3qgk+rDl+BV1nwp3eVkb2unKGcRUbODAimyF3iF+ZQ7Nv1qm/e01SEhREQZl41C1ZMpjBiCEDvN4EMf+tA999xzYo2wFgp6WWef6J0N0+EYy2YHinRKnB0bRuiT0cN0MrhGKYYxhC4pmUlz2IUb5GEhsMOktbYmxuqsI1URKS8AK7H2iGnyztNXnr7rrruIiOQwwBp4xaQr31zlRUT6DTdEhHxwQw4KGmNxYz8wcFjMp4zXClexqlAnnalWNFEf9XeVcljWyjBb0HKJDBeRqvJo8APw25kzp8msaDYWkhQe3Lqk1NwUchDPvn4357x7db7w11jM4pfT/+2v/8QPBpEqLb7BVUNqmbi1ttvtdjv7e+rUbneq7RqfOtXKPljRbaByodUMBBboqjw8SdfLd5J7pPPnz1+8ePGhhx4a7hcWwITc8X6mtJXsMYcVUJAqt7MyI8ho3/u933fnnXd92Zd9hUttYprXve7z3vven9SJWf4rwwfPHGjXrj5z9doz587dFVNlLdwqbCvCiEX42rVrp0+frqTmJyd8m2OJO3i9/rgv8QhAfvKuLFR6ncI3jP2DkZtMxL6efdd4B4rkPVcKuY/KCeQm7nNtZ1iHpNGgcVGODcHjYEgIt1AylON4zvPs+i8yVci3XzLktxeJnaKi1lFqF9KFjra7LbIizaiIDPM5gvjSKVQGiM8YFWZpbTgOgubPbtf8gvVv3NHtylrTfctO2WlCDc8UilQWNDTflGhevhfS7hOTdTVTnc2quTnaipb2cTf2hRE7IjveQmSPc8bFdoyzG34IVpHWAX0CFBtEJSCgq54Q2bIJzoWfzEysaw994ecif9pMYRAaXoQrLbQ4PS4ndOZHHyWH9VupiIpGsDyUddIrpk8TDclLrCYRkXRb6mXB3A4Tn3tMamYmX9RKNoHSXTNn9MUYp5tAph1gVPmBGAk4BdY+N7uCxUwIXo015EteqoSvk7/lhzslTDT5KI0OECo7FyMLJf+VTuLnoKfDaq3t2m7HzG23a7ud3uA2bigYsH7yespGLHFcb+FGNEa6ZXhsuCnlztAqo9AO9znbojWbvb4DwSvuDCer0ZTMfzA2K3t810tPGEDluLyuG/qBZRgHKKEgvT9VcuthvXi5DxFqunjx4pNPPhkDhcMoeCSus7LI7AoxkzrB8Kf+8fUUhUVoKBfci6CIlvKTP/mTX/C6181kMPO5c2fJjEjXH8BKEuAAvnr16l/6nu85d/bcG97wpUTkEXXVWAwy92vXrt12+yd36Fke5JxK2yEJ8FodgE4TWClL/9yEpO3DsKjWUyfs6w34yWMAzjES3eaAY0MUv8kt8Y7tKQW4zYJY2u2O5tTH8+DepNjiahw7ZXsvExyMUH2FaDPcazpsi4NsTqaWqMxfRsIYBqHyJ+vRzY6WWU/U8unnibTcIphxv+Vbf5/ef+FP/DVJUAbs8i5uZGzClp3dMH82zm4WmvxYJzXcFrmw7GGAMtnmQs4OguPEaiaSsuzDBguIG5OPoYhQy56iabSU0JEQUe9xpBIxn+o+FtZaI1trEu2IQf5BB/Cbz5WTnIsW7TPZH/Gy1SsEXEgOx9/xrYX+BleXToWJ6Mxf+EIhOv0T/+D5b/xH0+uQixFMTNxJco8x5kknIuIb/pV9yIyHbJGHQV0ETrYeXuqOP28SaMqj8rVLCfcnNy3U9IB4jySCH8nM2qCapik+BwsSQfRJJg/MzM3XgHBYQuRJiJO5JyIqe2IBbG0cCxLSxjYzcdwWS7uIusVwyaMsMGSK5tTt55qfTnPIJ05vCu4l1mBgqNcrZGj0DuyWJEhSy0s0zBRkKO8kH2coM2Gmld3tGAgyEyG90263KyjcZXgAT5XsUfy8FkU95xAPfawALIIVhTpQyHVFYUIrt33uOA1LBevjojUJd1WzomjRA0ZBteLKlStXrlx57Wd+ZhVfFE3Wnr1YTCRAQLrzK1eufMs3fzMRvelNbxpKuXr16lve8pjeEBGRfu3atR/8wR8m2UeDfuVXfmWId/yBXCJ0z/HzAnMtcORQ98GjDA5ACNiOGjfHDQAEpUFkixsXIWYfRDPnDF3VyDg0VKXCgFHY/TBdYgggyHEM100GJCc1+zP2ZO9oTJFu0K6whVld5uFx5KBtLBm/zkMwma2zXILsKF3lWbfZZyZ619t3ZDXd7XYAmoBaHxEA0kI2rPl6x6rpLDnu+70jNkF0NeKUFaDPiscqsFI3AwKO54hyvVtxV/pCY19mGN7MlRe6oEZsXQdcvkwNU0U1vakWI8bkIvz4SvMCwiuge1iyBWVe8Em34coqEJUn/85WdVaStihUHKIOvQh9XrqwjZgQqm6oBuh4/EQDuoKHowVHkqAvRD7Lu1OMRaQNCcBqJA/ihnV3M8IMITGCGFjQFu9W+3RgGtZMNhgrivpKs+lu3vQISXmRW7xrVAcDLMhdZcxFj0j1FExxOxXyBsDX7WUv68Bc8HjmaEi1I6SySXJt98mNMF+/fv3MrbdCE8QeY1nrBtOwnEUBBIO8UONO1HJDHeZ3/MRP6TPMTOy9d866iNeXiaV33bmdiHGrIH2yi/RuTomrY1zYMZDkUW1WisYv/0nukWKg8IknnsD7g9pT2ETXpVjdg+jK41gMYq3PF30DiQQpD1Pe5erVp4nkMz/ztaUXYstg5OqVK+fOnj137pznMOuzXLly5U//6T/9eZ/3eW94wxv0XcpimEje9a536rvWxST5sXe9K+T17LmzTz99xd+YuGb7vhgYnfwBbb548KFhtikoM9ogoozDzXAtRzfsMcb7FsH1zPY+qJHhK8RJRMG28AmhBrr4X8TsJoMpTDf53HP/zswWw7vdTG2cVjSlAyPsqKtb4cZhTu6AvPEnpuxrOaxpjSiOL/W5Pq/9TZ/0T9+uPbhnn33Oi071z1bLQql4Whs+3SMlYjc7uddMMoyNuwbhKGZ67rnnXvWqV129+kzezA59OhsmFtJjiWxxSRUeEilbbIsvRujSo9MkCRmI6RTbjKA01tVW1qVVcL9+JeZda02BPTPtdp/APrGAMN5nee4C2GkddRZI6NwG7gzOJ5ZCS+WP6TCiPPPMM/QrvuDMP/9b+u6HPvShVZ5RXCJp7WotKrzAWE0BFonETGQiGjQ4jC3emy1A/ZroxBu3u2nF3ENYYa+QzUgYmO6kQYgo9thLjMX1HafkmWee8WCKTNw4lMAuRY32QnvvI1gpPt/AOeBmHvQdYaKEwtbTLKrF8xfT85DoxMTU5DIsOLMuZ7OAnGDlCMbyOJ6MxwaRTqxXcthjDCypy26wwKCE2l9EeAqLYrOuzB2CphyGPccPQsxsMyYbC9JotxpMsROZvPoSOc+Is6ArIoysF8Ua3v2YAVjkA4VPPvnkMefnaIqRwXDamjjnFPEUD/PtryzaOQw8hfQzsVy5co2I6xY4pA6DhH7kR37k3Llztd9AjVt3nfjRH/2x7/me77lw4cIb3vAGIqoOmJno3Lk7//JffpPDDvqpn3rvu971rt/ze74yjiojotv12BznRUVRdbdAo/+EGIO/guLubwIM8efiYUILGN3f3vf53MrOJsZSk9B1a3Vx46Vbh4sHdSx79P1xN3C135ecjpaztnm6IKF++x23QRN4LCXdwDKcmShq2UcnswJDnxi9ZvBjwIuLsjw3a00m9jMjbQqQoq2P/Nm/ze/8AXrd6+8kYe19RticCLyg/WvnRRFROgnq/QZAHInHup6ODvM8XKJiynlUie644yxQD+rjrIlnSfY+2cLeBW6cAhYhSSaK2n8Ij65T0SVmvoM6oJOYuqozw4XpVHhlZtrtfBo7sXif2itFNgOmsQKy3Q5wUu0ZD6XAP8rJU8laiphBjmHdfffdz3/jP9aH797OcBizc1BePBQ46+B2NKXh2JI1eMkZYI3utj6tj9Sb8RO4KkiwUlIj3F5w1Q633mDihIg0DocrBoqZAmvCzHzXXcHLjSXPTh7WxS1DIK1O1H3+hlrA7BiD9HrFQeOMcgNOYaDWKXRBHOQxM9W5E4D1hYhu/Bf/jWbZ/n9/j4hgjUWEIRj4DCio7KiZNm9LpK9fv14b1C1qOKgSzRLDRsy+eVWO63k2TXLzM2RL2LHm9Y3+T5mNzqzz+XSWKvvJumjEMpQ4JJQWvLlEHrM7+FgCWER08eLFBx98MFYUDgOCPASxTLXc9vlEYIVWKlJ5HqdLPY3zi4mqMEFv2dKVK1cSSDkQuHr16nvf+95v/Mavh56EbUigJb7lLW9514++68LvunDhwhvUaXWREKPonZw9ezYAFhGdPXv29ttvR5fs8o59pptLW6qCArfCstopxA6N5WZAx0aWgMk5C8TjwwnewqpYNt6CDYxOuueYmsYc4SgmygXhwfBAz56neIlJ85zEiRMhEcZpZOBWYyyAHACl8rumC5RVM/DqGJJPPBd8Ge2U+Qh33GynljZDV3YgN/MXXmDmiO3r046hTB8C47amiEr8PhFJaw0UKod9mUOtBlAilZPin6A/io9HBjfZpLzucuVT9Tg3UskWtNhAogSVHYvAMDcIHsRFOiFoFEB7SXP0oZVeiV+guxuUEJHEpHwizglAEtUZ4A1wDwiaaCPyTblc4U5MY2xVbDan66HRnbQRSXYUc+icKq+SD4PRmG1I+K36a7kpGNG0n2D7AOgMHKiqYNNrrawRdj5KGK4UCCvSyzQKyUZRbnDcqhdpVI41n0Io3ikSXSjnM3E5xkmYqVtIGPLBWN0BYnrhS2nHQjCRPEPf88kcj4kIMS9xJKeIm26hiSOX7KmtS6kLUOXMqdJnbWGWyU0KtIyOJPbOrYlZmIaq5I2ajRs/IXWadO0OM4l0Edaz1BS5MZetsKZ8igwjukIYt3rxY2EVIaYHHnhguaIwUnDaPVBoFvd9nDvXxdYZLbAUZkVE4CokGK2iwMRf+AVfSEQ/+ZM/mQ8aoGYNX73udV9AFuJSlN1I6NrVa4quvu7rvu7ChQvoifwQhC5ma9Tj2s4RV69ePXv2DiQDVsegyfc7dh1/CYjhIz5EvNPVXhxglchXHfqq78Jos2iS0yZwgGbsUlNmHTc63OeNJSRcc+ActQRiBDq+5iiZYfkbOtctXqUtEInQmniLEI2dcgeJtEiCqYsvTBP/NWszVDM9K+dizxYdMSJfl2wdMztkhMUW+Dnwasx2hDxRPs1ENp4VBTF7PEwZ6Y8NiApt3JAOe0RCiSEiWzkbNeMdp1zk6YxtzdbKY9qPxr4UtGkKp7zcS66fzBxCEy3abX0wMdG1DduEMp4qpkMkubDUr8mwrIp9D9htnkh80Uz05cZP4j1cOkdqTzwHO2UlTwFSqk28SYio7tDGDhqRn2MjHuZPirE/vwDlkGFkW1gXxWHRQYI3t8GYoWhlinJ/i3DvIG8mxz3J2KCBiPTc6KoaERxyfyzkp43NRKT5DUu1ssy53Qy8O0fK7Zk76Oul2/JNsQXpq6rNX7ZOrcZiqiScOXPm+vXr8dVRJkNvRV/w4xGzLoJcdVan6oloH6ANPLFyMpCRIq2qJNJ73/fe+/6GCBlj076FcKxYYr5uIeHLt/BJpo+dOViRtgYKuY7EEVm/3D+9Ne7dhKE1EmnSbdkFRr/0VW1s5ZWsFc4s2We+9rXfdekSibzuda/TTK5c+dA73vGOH/mRdz700EPkKP7q1avnzp0j6levXn3nO9/5oz/6zm/5lm8+d+5cdFPwZIwuErsx+gNCRNeuXfv0T/90/7pqcppb3C0uTI4WmIF0MPEQzyvIHXw/gWCxdUwb2Q6cbeiKBasZOmrVf+cuUGw7I0PfETKDnh9lY0H8cmq7odZCxM888wwOZgVvYQ8t7Y2mEbeJQBxQgdyMslOCZmmx6NIflEqSMQRcS7ii5jbaMIg+HUaigcVw3gq0zjjfi4g0bipdfM2iwDO4/77NSMWaVqdCbuwAJOaeztDllT3ZtI5ZHgTGBhbq7KUYdNgYRlEx6m79hGLlIz60UJ25rMAoKYoVlM8ESLgT0Zm83s9AEd8EI5Gn7fKVJmjywVs0R4rgExIpG6ZsSNFJsAktEVZnIvF5GSKdR8K2c4Tew5k/8oeJ6Oe/889XezumUAEsImOIS5Qs5P2reL5zjnmFJw6a4pxDiQVtbi1BjZHE2KI9lzQZkR7lPWWE2mPRM9mHXhuKZVs1HSEQyfYpndKJmYQYAn5p08PiBNCp//Pt4ixCg4yWt2IDTk5UPo/o6mDy6VPlWbblSxFEEIJdVU3uyxxEsf3cZa9bFxGVA7TcnobZJD/LUouzGH9rO99sJsYIqavnbdKASuOKEG0I28k3laTjVO7llZ588kkcKKTgBGiyCvG+y34v+33f7/v+xg3bYnTf9/v+Szf2vZc4BByiOXAlmw1+iGnadOnSpXe840eI6M4777xy5WkiOXfu7Ld/+3ecPXu7hyj4D/7BP3j16tW3v/3tf+JP/In3vve9toODaYu17Nd93de95jWvoeLac4yGiL/lW77ld/yO3/lpn/bqtW0FJzn8AEJD7gsJxR2qmbVmkNp5XXpi/2l5ttJiXtO3D116Fms+/1XDijbVxyp+Q3Q7jU4eOaLip0CksfUpDJlzJp/3CL/eToDlFhV4roVGIGHA3G3AlyMneUSoqtXOQuQJShcOZeYrnCkRDLPuaxV76wH0sZO8ohCdlwBWU4jIN+aSwjOxSe6UP1p3ZS8yVDaqH5COicTOdLLxkWjuPfMOZQlZnVWmkqLJ42FvFMSxQkIWlPNONVbZmoMg2rHlw8LJtU9AnMq8i943e/8kKk7emSbDwc2bY8WuLGrUV6ZTcV5R6pe/8aEPfejuu1czr4Z86vzuQ08CHcpL3cyMGzduQjeYKvGhUatsls5W4Nf+nd9x6z/8IXVbP/+Od9rGHLTGvGFYUHv1FQGbY8BFsDsRtc/V+zS4bH9XiD74wQ/eddfdDkJRYcMaLKrqnGAwcYRKHajST2UWsZU7MBmLKX2O5ZLbj3EWlJV1qvZDKfm7V37V1oh1WTFZeAfmOq3ZzZGzleKx1KAN+HDmzJlAjkTM1Kw3WfxFWByFmjEcGRrHZEukybfK4+y2+SWoJFEu2ORYRcTMrfFut9s13p1qu93Ovu52rem2YryDaazIuRlIBVMOwS9vr4+9CBbBQGGuKFy5b7FJ7hoLlxpK70ydrQdzuGPHcDEEuixdvHjxy7/8K3TLhjvvPHf27B133nlOnUA88/mf//lx8Xmf91vINdk2TyImorNnzwLgUJnTeAypTl679sztt7+KaB3F3qjDjH6qYSpPlsdgensoZebgIj2O+oWhcV6JvziCYL/Pzg2OfiS8m3BQQmGhFlTzMm+XYx8FE1ePFo6vAeXas2KABaKdqzrZk2MLvvDo4Ckkixt56rprt3vlEhNYGX9Jf9q50fHwldsdn+lOLknhtHy+QjKII+omYtsiOOXCzNJvONnkIM0qaUtDlCGkJ5e71gmREDct1/jWWHe5iiWH1G0aqQSrJNf8s+Sekxn1KTC0TrKEnVrDFqqdZmbdsKNzAtwgCiQhO/E5mTqfXVjYlEbXHRERD4p0MKdq8JtyHAseUoy5w72cJxe1Xr6bmfhADGSLkKXWbomC3Lnp85ySw64RAH6FCr2F9IF546/6j3Mf543OtBm+zDwB+cCZUd6XKLjZtTI2zgBIHLwR0XWK8in33KsYyykp7mTmv4jEUz5+Qi4Ywaawh6TrBkT2oFuQ1VhQ2mdJbQ6SuL7FA7MZpnPhDzwhRRFiXbdb5hQKSD6SFg0LZnaNqPXI51st+suuMiO6WhLfXOcLbEyekDhOU2MexttV0qA0A3Y0w0lmMxFIRSIiW2zoW5RYtZEFdBy6wvQxCbBoHih0h4EAKHAts03aFREfJdSjJ2KBG+iqN9XQq47EdYRLn7/rrjvvvPNOMqCgv3eUwt/9u3+3Pvn5n//5jp8wtLOOvqgP9GFQvnbt6h13nCUR8a04C2FrVjEszpJ5m8rp4VTdUDn092mooD84yJkzcIOgSrZA5Nxf92OqxNYcJOLJdhk6mrCDDuk2fVrWgEW1oNI0CgLAUwbsyAu9DX+HugiwhTebotisgXsDGKWaCfsSmEZEPvOK2073v6Jm/TyuvBXdrrEW2oDPiW+YSaQr30RIJDdsY+bepWm1grHJE+N6WDKv0SifLfvHJuGQCbnnSUfr/R9yHGNOS5SwBY+ZdJpJ4t1oESN6ltg1fHFw58+UH8bnxA1uzcm41/K1VVnu8/2r+g3ycGlqIxMR3X3PXR/60AeHINZqAcoOoI4M1VlQAH9wHUPYGAd96o2Ftoc+NovRWvyP38Q//EOKTDxnEHcUVFv04ApWhuRKgT7vUp9OZEPu1IWEZfg14cSSfQdSATcmi0k4qj+aIOYmsk8BgN3dIFsmPZ7Vc4rYbaA3L52J2pIdqoWamzEYaYMCc405GUJFRgCi2koHrBziWW3hgC2I1Vx3gqJV/m6EhWzrDYaPPRYK76T7T+LlpYWkMHe6A1bvTTkfp1qdgK7o5KlXcfNjFWCRryj84Ac/GE6CwFvbtS4oEhNudd7iE9d83JfMNNsUn86GjdPrDykkmFxoXP/F1UlAgDYUwTObxs4zYOwaKGTn5Z0l6THn7GhWRf46wzF2sfLMQUbBLmdlsbjl1416CZR+gFpwIqyhb/YWYeKdzUlrTL2D2x4ytDERjBoCcEmSHGVGDhxJIU7R+cxp4VmRBqRqg8LSajPfoEXSAfhNO4mlNex6fYKOJTUdz1k4GHQ9QXNCRmbuIq3MZzI+RAzVnYQelYr94/Qp+qRtm+7laVjNChZxKW4i7CvhsV1Up2YOB6k+TSyR1nr37ZhtNrIioYyBCccO635UvcPY4q7UgYZ5CHACMUVZjklejAJa94kAChRO31x2Tvm2v0QKRYtTP8Ul7KdGrdN2TO4EckSe/9F/YtkJrXhWaRKDMUy6sNH4r1XhloEERPZQEYF+UZjrUC7vS9tckWHTqXUFwdE4meK9BXA90fjRjWnWOUGPo1lpf1IlvJGeBxo7OBAVhUtkCBiRRmJB5MaWjXUQNqvJ72PuC3RltrxavBpooPK09zmZ2U7QWox1DFPflO26eeGqLgr0o5UV6MOPBqXCaLWYR8ikc616a7vehVlO7fKQK47WWrX5iK4mwpboStPHMMDSgcLXv/71ZetRs5nhI0g61R2wFMOKj+bimJQfyg1KOksPPB9hAKpy3FNm7GJQVybqPvpCZFYg8FyjMgxvHuLatWfO3nE2iPv3d/43+sStV/63I7gVS9nHrv/kA2S6MPN+6+/6nZHR80/84JI52+mQwRpQrJo8i1qx6moTYWkkm+7QixHWZSNh3WqNOBorImG6RYq9XeOCLhXx+oJ8Ooio4tr5HCYpJ8UPuflFcEwfpmGiFdtyDW2dHjcBQqGVXHOsaeDKLQhEmMTBlo2ctjYEJpOHilmZyzANs/h2lWGhBtFKaw5gZWYFeREUGlfzKS5EWeG5VdPnN+vzUGTRgphskh4xX+seH1A3DxlGKwwyf5yyMNfulmSvwJ33AV3CemUzbSoLob+2hzVpiLdHnAkkSdR4HVGXVcJ1J0fxIwueIHiiZFAof+8gt8HBmxnXVA3RITZPQssiEvvTIBB0H8EkLD4lQOnFrjJYNm3xToaunAyLC0xURV2UX8WQj80kaX/Ix4IXnIlvZMtr/KagTszoSp0XnT595vnnr996661E5NPgBgVXq05un41TWgtcWTJQpxQoExoMH1f6jebGtvMLuyrjfu5xV9FV79Ia9y7xMDJkpmYpYDP8+hgGWDQNFBIR56ZHFM4mfE9rLLY2vvW+D711gfYOe9qwLZdp+YPhC8XwgLyQyxBoo5JX4mK6kHuX3akyayQfu3b16tmzZ+OldMV3vkme/uptJlXZSIeB+qyX85PZlXGRg/g1DY+nmQBTKL4WRWgIAiUvm2MCix7ZOG6m5tviNZf23GA68gryRZhoF3sAAhSIGJWiB627Kp6RUjcu0brgUQ9zSgzkz485wGMxZUDgzoACk+0OVkgjWL5FXjnPlexMXJjMO6K0cTejsQIGFFRWOe082ZYQrjLivybBjq9IO+hgRiVgq5tR9h5vrgkFGk5YbRNuCcCVeLVmkJT5I9ZcNeWSLaH82BYcVeYsX4iIuiPaZL7K1a4WsSwLQbCVbs6eJH7mjQjqgWTTa456Se/jbo0BlHMpFhERIJLDe9wcIuyktl69sRhJCDcMDZTPx/XEf1RYZD4TtWZzqmyFx5EVGcrLBQMOs4xdzFyUMQmADqHTww6uF4VCUbXORcLGG4jnFr276GTCHf039y81UykpJwmPKB6OERJHmuzaVDWVhkwkhA2nIQx0sn9SEV3dQle0zCYpzy2WAIv44CCZhSMd5PKtGyxAPSXmpH8J5ZfBrY9tgEUwUBh3AmNFl7r7DHc88hlcrLhnFeJ97R4jr12uoSMVqMIdQCPSCFSnMjIIc5klCoUksN25SZu5EwcqcvXa03ecvS1RoJvc3mVzLcecssMNikQZaYdHY/FaGNxcDrbE784cU1TV4dkGRfZes+6TzOx2azuNQDr2JTU9ki1QfJ7nY7mRYiiB8SnSHDrgAwI7FeQxGE2C5gByV5UmIscxsYkXWnNCuwAIwDUzTRuaZnEIJbGhaGvc2s5zaDDvKh4unkaparf+dq3R/ud/cFkB6Mo3w1Kc+Im8WR1jxRir8ll/NZwa9BDpoKHFt2BgcUSTlWPrBCpmq9nFbOTUGImrBMxuQPMTCipdjny4DACB/s4eEPPJrA4WKvgM2hbwhVhB/LqFctgXoy2259giwPNvbj/VMxF5F4WZ/Ui7PjDqptJJTTDRB63vdywfhNHRWPgqWQ8qy0QFHEJWclAgVyBvNhcIjNK/MDeSztx6zGYh3WBJTO96HqgVmzBLP8Dk+fyu5fbiIajFsOCvy9YAdhFs70meCb4VbC+7c2VXc2MfqYlQ9S8R8ZqxZZIdNHhrOp4bLadiLzVr7Ouq7T34sAs8g+txlazoaqDp8M2PeYCFA4UlLmTHPIvtckGFida3BtApIjUuIuaJVx2Z2qkbuNxI7XHZn1eDNBKWorpbBxEWAOu+eDAADRPztWvXXvPpr2Einzdr4tuufu1BQzfQn/HeYIijq2qLR9Hh62/7IfpT38RC9Ge/84DFdlMY218dMQeLVQkbkbiaRUxrz7wjCD6hVQWDa4AgYjAxeqVEOTjQJQhl0p5v15kYC5iGTnqzxtPFnHKO52zggBNMudmSZAP5TqI+DVMf8H3bK8CiCd61Zm74Ez/5L/7iv/+GmbiAsEQGbXVWiu5lFmLMrDvJhcQy+xhidBCjyxiboNpODQUeLWO0mwkaC/BHa+gNhzdAi212NhjcTacypdqyMOmnYiyUnJH2DcSGD2Q9iQTUcEBvcd23cdXy4cOJoyBnTm/8CTlN2GnxNfHSbUx5d1OBqAnN3NSribGIhEmDpRK/0ujvAz8dwKZUJQH3XI1f169jRUIdQvn8bY1kYYg6R1fQazCLrS/ZY8fDkFfIW5gyKChXLx1gHxHBVnxcpXHxKOLUqPEQL/SsZHqljO5tADLXYmN2rO1XXQ0XEA/7qmI/XYCZfV9AVeqdzwjkdGvu88Okg/fPCyLqveNK2wYvez2X0/+LOPGGNfuYB1i0MVBI7IODxnWi5H3aWQ96W4SWmMmGkMR9PKFESowheppEgezEr0ay13JjQ3biMQBZWiW0NAPF/gsJX7t67fSvPx33b73yv+avx6YgXoIz3r2YK2s64yifmJj+zHfSYSfhr7tW0BSpntOI5GCTmxIsIUCBoEXk+EmZbFGTAWY5hmBYvGlWW7GLiBA19+XpjE9CVwP9y4d5muM5POD2xkBLghWvZJ4cDPYjLEVEGkZo5cVZAzXf4qGUXeCLG0rLmhw/sYj03hs34vKKF1pwIcUx1PY7Y6MMVv7EBD6seSBtcCpLBOP9WmJK/tBxbTpmmzmrzuSvYbgVgVEqCyXinGirqYaQELStiGkvxQkch4wGwAUC36HhSmILsbjNPLrEw1zHABXenEhVsZTUGo8SkWOxeHkukbP57GsKZXZ9Y5fdqWh/slK4bFk9IpNCGIKRABZV42EvZSKpwqB1gwAwsuVEy484ezQ+cMH1eaym2L5o3tbDwytf0Ijo+vXnb731kwD+LlyGRfB6RP1Vwjw4CqYIc9CNYNj6Tv6iKXWMZoq/0XyqO2vMxZWY3RTU1YVe8YPQc7q/3YP6eABYRHTx4sWHH374Pe95j34Vkn/zby4//ta3fu0f+sZ933exE3L6fh97uwcjrDMh2sMg94U2X2RtZBedhnQi1lwiPtTFcOSFdt9jUotQHvRGAAJKZ13TM89cveOO2451DWMqmhYoE+ceRs3qW+HOZVKV4OEAE9VUFct1iLIcsAu2xH12dEI4zSgwRjCdDB9I4Cd/3bKCnxoCLH2gNRZpGtlSVngPqR0m3tOJCLJMzNpAqBLoO3S+2a4sO/gawaod4jByg0gzw6//o1+gP0JERN+4cjkBX3KPhphIyJyi2Frr+xtDwJ8ZmaZ37K+CuWhNzjkQu4GG09//JiK6/rvXUwkDW+MFKOAW8xMABRilitE3XtxKc1SJiEgHQk1aiGPAl8tun1sZ3kz/6KVMFUC4rqxIPZHPLxFBKy4B6EEYtHjQ/nWUkl+Z6jTEATmxIxWd/qzFDfj1UMWd7LQnXEczCcYrAqOY02Gi3rudkSBiXgiOnjWEFkAwciBA4VtJ4AFccsvbvcfME0zKAJKWZl+GO/7MDFW52l6EiSVnQ8Is0Hw6SYqDtuyxcvoIvwMm0R/HNdhAZKArJltsKNk9XKFq/HoAXdHHDcB64IEH7r///oceeujRRx8Vke+69F1vfetbX//g72rNx4yYPJBlwAJ0IBybwHBGDzCOa/qixFk0oVsvjZuYFwgDsXeVyVB5FEe1W1MBihV07drVc+fO0iIdY6EZdSAcM6XnkXBF8NZuUMWqlgvJk9yuwufKyCaF2PnLSFMNPnlB0XCGMwJVRFaOq5rI3jeCj3yUngaPZRE6q4m59S4ReWYLC6EerhMgudk0a2pVcgiuuWzKJbZyPWdcWgPthloHXdF8YCwy3B2U30KXDlfBjb5z0rsKAZ50D2q3Qhi7IlyGDbavtdYiXhucj2BbpNNf88V6cev7/tX1P/umLQ6jUFHYNTfF23Wzx8CuktNcn1u08jLn2UPHEs5d1ZT4EK2laMjKvsV2iFSlJV+DfsWgBdtlzUlKBXmHOAskGbPC67Hz+R8pMQwuh0BS+tdggg5mzxlsbp9BIMYgGIT1clhD25XNIqslxxJcCvP8dbLutkEB9v5Jmss4lGiiGRCnK8Nm0vx4vLV93RydhOUn+LuS2LwTjpYcOUXBSHxqdH2eBtQY5iS+oYSCJcyu6eCtdJq1chiXX5MPevau84J26pn9wLHQuzVnl/q1vPlxArCI6NFHH73vvvsee+yxy5cvv/Wtb33rW9/6Kffeu993EXWcEivJe+8eZQmJ8c2WbO0nASIZrmk0TGNiHnGS3tf+d/cAVUxeGSSvi7TYaTPyvHr16rlzZ1vjlXDPxCwXshFKc8pa+sjhlebeOmFHVHDIeZAtzc2hDM69GB7z8gBlaqjJCRCiOBPUhvOC7Il15sJ7J5zv4bErOJBCwj+xiPgQoe+QniN04eS2mjtsBHmAfw5tlhzAjkdTxmQ13RCR52rqtWt++m9EmUDqYNSODNUw1yX0piC28BZwQw5zJ/+TSqektRZYKlwOYG4o+GTKcl2S59ClbwMQNNn2FGLlgSFcqdieIbdMOm826x5TVQJeCWWMfJClwTu6l1KnPuqZNwHF7rtGwFCT4eZxSfxjr8uiu1USg/D/RwFaYDO4Yiz9OZpyatObq7tme8899/zbf6s7uA7oahAPmr6K9cAPuYU8D7HUzyBD845HnJCmK65sI1O0M0QES0Y8z8HGE+I0q8mKNsgz/wwT1fHvRt1MMWNipRDx6dOnn3/+ed+pIWhK0+RVsL/eLR98Sq++jInYp6lzhdeAiUZnxGFsRfbSWx/NlNGGRmxZx0Xmh7pPRB9PAIuI9Pyc8+fPv/Wtb7333ns1ilGXEOpq2cbcqyMUBxNc15Zr2tfuGvvNwlP06GQjfYJQ3f52Ej/JWVywSxfNjnou6ZlrV8+dvQMPljuYtnoY5D1+9c0Y/8CH3TUQ+a5CCvhKziCL+bpHhnSj+QFibpOb6ISIYmpqvGYhYoQdtVCzCI6udhEHc3o0rLX3RokXRURaa7td6710Z+cg2UbK9XHQORsSA0QQuChmWqxL25AAHyIcYtto+DTDmFsqoewzqttKGM9jZpHeYX1FWB9xM+05q5DEGNyISmEVYQ2P1RX+zYX9+W9789bcoqAw69Qa2LfC7fntIq2ErTDYx8N9J38EC2vND0Ak7OUDH2brPMYkpqIVSvt9x4hR5AkbdB6TZLgaTRnXyUlUhMQb+Agylv2NE2maAys5ttA7xzm+pX+4sfWX9Nq4gnOWmSBGJX04jmel/jM0d4jDNqDnljwfBjCRyzsccqud1DqGWu2HAfGKsTxChqfRB2Fb/B47uWEEB/vgXKrINUwNjXLruZoJasCWufhDwoDqE9WsZTXTeq8GHEzCuGQt6GQmZvE4ViogTDiBd4Q6dmZiocfSgB63NPLjB2Bdvnz50qVL58+fv//++3/5L//lIhoN0N3DWEGVBbGo6zI/Ll0i8hExcjSNaslVtTzkgLcyKMz+lT1+00T2ujmTTxAqs5QUYCgW4dZ0Q1QM/Dj4OwZdxUvudLE3k135ROy0CHIMelLcD76F+hCimGEGmZVkkbB/lvauEBOOKmNvWNVAVLtdzIOWuG8ct+BlWCsLbvnmUtookud9zhq4oJy8pfRB3I8guIfoisFgRSY5Smi5tHDcTEIM21+RAyYwx9k0lVFoUDZrUcC9yST7tqItth4FaUF0RWCOh4WECbCUUdEEg2N+4a/+/WzmTQrtwn1SU25tvLHEWASscO9XQrN0lIpNiMHteCIqItJtsqc5jrJdCoO0sJMcQBBrcNhP3WxCOzaYOL8qEWhH4f0oIk7gZimQ1/eVAF80w03P9asBNu8abZXBhf32cCJIMGvQ/VpWAHGwPzEgUfcsC1pqnva8ibdGsCpHdAqBnp/EA8bKjE4CsZknwCQy21KIiTjQGl0d7YDYnx1sRcJKoGpfCADOeOExqaDbmuCWJ4ANCMk12xEzESxwCadnT+/3JLIP10GsewoWLIb55/U0D3WLER8nAOvSpUuPPfbYhQsXLl68eN999+mKQmZprfXeW+PeSa8DxJB0aP4ATNzsZF9eaRiqlgxxV9QoB1XmWsi3cZLepTXxU9VBwWxpjP7gk1fS7r/3p9772s98bZw9cnLK02DQMLslaihr7gNQS4sfpaFjQWaM2kLE02FTfGbiJhdRTcDIc1O28GRRaBgyAEwU6MrvSFCikUvEXleuXLv77rvU64uUng2amC1PUeEaSe8j+QWUBroa8mj+lxSRxqYM/vwOxwenFqEwiETkC/rKpKgDiSGAqjckO/2lXRBdJUwxLjVoHfEq4MREw1i+YBPb94QUakLe4iZXmE9l6Uy8P1XNIvNq/flJjgR7LEQewSrcdkEq4goQSjaKGyhfk3G0nzsxYXG+EtIaN1bvDsWx3lUBuJkA1Xb5J6W5vhsIdZlw4vP8JHPzTh3natMtQmiEm7Sog4MHlFt/ENXKSmrcbPOYcui4OHSzMzqZ7BRO7I56HTapBQo5DC+Xhs47CFldbPWBI6cZZOWZ+fr152+99VYEcBDJAzYVM2JEVts71IrD8y7MFPLW1vQ2W0vodRUhtdPND1gl8vOYZrQWOQO6ouX9Vfp4AFiKri5evHjhwgUieuSRRx5++OF3v/vdOD5oHWgy896lM+/UkYh034hMVxDwBLFpUAmafi+RMCYqs3P0etf7XkjRVVffQzg1XsehKSdie25MRNeuXXvta1/bdrvjbBLOqq7SbGLECeqjE1+8XslhnqE1Yx1kRcAX6T78M1nI6ZXlT+IKEABrUS6gq2QdkqHwpXepo4ciIq3tFMjEwlLYwKk4wZnLXjr57qYsZg2LZJBHH4HykkHQrplQRKxKlUdv7Uh0Zl28EptvHbICEMFK4ex7qo3O2r1GXIXjngGwiKhOYmMsAuDvyYxdEWnXIiRDwOuIliogJ8UYVODIFL5HMZ/PCYkiPCKSHjXGnri1OAMOcdXsKrZSaxRnPB5L8FEphCe1O4WnWCMaNit/+aVRL9BhB9h14Uy1AgC2qFdA/MjWkFktzrTJp3kkzHKBIXUNPv9ae+Ox+NSQlj5pEVDx/qEqEeLadZxtxRBkR/IkTpVkn4GqzWtOaZjYviFxFYGHx5F4gZl1Xw/3rdnTQKvlfGA3bi9KwMLl+NxHZiHp64F1INM3xGIiIZZdA4nY6H2dSN7HA8C6//77L1y4cP78ef36wAMP3HvvvQ8//PAjjzwiQp2tP607rNteQ70JdR/L202aQ97qiP0tpU4dQAmMN83NM+tuDZ0MRZl6Z7bE0sSnY5fMr155+pN+wwMnzMGCRaoTTBku0IYW4EUe46oAi+tFNb41eZW7SBOGQCHypTwcyryuVQCsBqECLDo4H757CFOJ9N77btfQwTvA4t1u17sq/zz3n4GMkYeUjt833+I2dukDjQDHBp6F7XUxtH3bAabsiKTu0XDAJQ9ViI0rB+KzKb2nQd4WDFNAsMUZN/oLYdRtZny6qL0Chz2H/Ps8996x/In+RUJoZa+N0dzlfKx1ZlGuM6o29/G4JRs0XpegwylUd9XyDW61xDEgARQsqsQnLXE6RC/g3XVliIjsPF2GnYGGomIHio8+RUeUqDO1k+oUc6RK67tYoF7YLzBAvzSJiYewuosEtjfsjVNyY/2CSPhvX/QKOSjUcHU25CHdVke4SWQ/YoHGPmRIzonLOaPugyPIIJYDEbcYRmwblKEcuzmqSeAanG+ecNbvpJgpsiTKue1oQLApXMMCDRXTN3SD0fpBblHBrPv+RpeWaHW3g671go1eu5tJHw8A64EHHhjuPPHEE/fdd9+TTz51//3376RFw9y4YXKpOzK77GaIS2fwEJELt757Kru98auAUmMSeIztWtFS3wvvWu8UawkhQwoQhhs1Rbp69SqdjJexm4mAgPEixLe4fSIS+qQzv1Ev//0LTw1MUAsVz074A4iwzlYT3ditZX93Ths1kvzX6wIz3Nv0Ig5vKXgiylgg68x3HJYl99a73a61nW+tFM5yxHDVQmVZnONrFHuMTXUpIbHqWbNny9Y9bYpV6qSrkrxRZjaaxccm9geWg8sGNDWw581NUaLyL1aSetjVflXAp6zklptyaYpAIHDVtMyCT+CxDqcABIGPdTS2vD4J0qaySDBKR/ey0TffOgi5vOtPROSHzaE7YfsvYmZjP2F0Y4f3EeXVbrE3lQ6aEXEp1Qs0g+WxY3Dorb/0dUT07z/he+afbrn1i5WW6z//NoC82ATL/NGs+VVOJMrYyUoNt5LVBUKDW88JaD0S1XD2+kSwUMa6CLWM/FQcJmpMXYRhAN1BYQezFktxEegYaJ5VwB9QiDfXrQEkdQsfgR+iWknFKNu8AZuml7feeub69etnzpzxnwiYQGGmPPMgg4Iko8Eob44UGc2sX3D2YaqT0sv61Uarct8GIriwL8HRLGsMBJ6shh8PAGuZdKDwySffbT1mERLZNTL72m2yOcdkXu8ZOE9jZkYJY7qgdwNYh+GBDRWr4+xM6uNzCwNABqo2HQYGS9ZXrlx57Wtfe2zleTdYIkDulvnYazfDbVeffOvv+vfXnwDdKy5hSWHWHsJIw246A2rcSMBWAXlfzcHCQrdo0APSxSaJBvwKRMuKqhF+ga4WGGcF+Q79PO7Qw9LrML5VISNP7KjCW4QRXSkqZZ/ARImDG3Jgm/+RM4NpOGHwq676Zj9S3vAC2xE6uhdrj1WNLhJdK8AtywpD6RuNFjnXIvPvgp7xfrQaMwAsHAc/Gqslk6K2HLw6OFB4QHIj9AuBDVaOMKW7cq/AkJb1PZxCNl7KJLpwedC1IG1V+ZNU+ZM+8tl68cn9i37+E98+/NraB7TYWz/525//+T+qNw9Cq/rLCK3L/ljlee6HAWu8wky73frJ2n9r1cSNBIE6D1NReTi5CLpVNswiErgqVqk3ki6cwA6WQs+zkWihCGAy6g8tOLOyKkcOmhegw8zEu8hQbRdk2NzDqk2YCQR7pf+2wFXBNGHuRHEk66EBFk8x9od0j75sv98TNeYds3QPQH806Io+jgHWAw88cO+959/4xoe/67seqb/siUhIo0RdhNjEOtQmUQVNMiniY3xdp92syoaGsxyJhJv6qejQVBVVeJcngWB6+umn77zzzpuY4V5pSAkpa8jBuHutY8E8lU3DI5eVCatJfCdJdavuCdYuczuV7iG4pCRjoIHrsh01Um651CQxACx7VscNfUnBmO0SXTGTQ2SJcmMpNesqlEXagRdPdEWkS47Ysb6ZJNyUodadOONSoxVBshtr0ERoEX4ADgv5OVHRvWZf/0ex3ahux+chK6WneTm2PyozMQx+xRAhwlmj0I4RPBYlaIY4SigioserpWzXeuE3nu74P22cn74tlicTGzm4iikYbYixiHUN1DDD6WYSjL2+tImT8kPbhpFv+3QCDUljo4FgEcm1RDL4YEZLNaaKZ7C/hEPhZeHCcaOZkmeSLpJLIE7txw1f9viw97xjfoJNnDJewGBIZBtZJcTUQUs9O9Uapmk2IiTdhwUW2r0hTosIFtMIGo7IByrqNfLOSdNhOKyIubt4xV2DhIclYrK97NMlMXvM1yofve5Auh2skFLe2TbLDSO5WKzjdTOr27vEY7vdLnZwBPIW6XidfbkDrEuXLt1///3zIOAx6YknHr/vvvueeuqp+++/X/m+32uL9RjhbuYdhlV70UJFz12vWHfTmgfy5hQmQOfQu4KJbsQAD9i+DEuAde3atbvvvvs4q+qCWOOlQ10KuqIEWNd/4f9L/WuJmdqb1TmC+6Etj17rG7UW5pZrucGhhmU5VAUIqQTAckpOmJKM3c1oMo1jee/TfmGdTd7KmKyb+MrPgWztelYHzhw7eNFgDoJ1wEbVcBfFHGHIHRnA/ZN/4itjuVh9K0i/JMCdrLALpgEkYo9hUGvaA8lZU6213kWDWBC+Ch+W0Ap7rnpUFLsv9NGNbKCtFlylLM7yYfwp0klnG0u5Shib7X4zs90LASr6AKQiZ8BYzGSxrfUCwyWpQ2HykgewrDyVLiLirqczAfTEtBvn/awCS82Bzc+/8u8Plktgk7znf/6Pc05/TNXebASQnQA6BJMEoCcTcO2YxK3xbrfsjURZMRGKvOdmdSXZJ1k+ko4jemnT3cyEAK8e895XcsFERbXHjq2Px2pFNuo3Xx3PHEzY2PFxaWdfL2VP9ejWQgZadXXE2gnZkW0c7JqSb3Q9fzkq6zsWpUy5OdXIGYpQOEEd0rHOrRLUBQK2prBKsB7swb3LbufqvIpYHJNe1gDrscceu3TpEhF98IMffHE5+EDhk3oa4G6n0tC6SO/NFZsolshCkKAicVsmRkQiOxGW3qUALHTJmQxwmFaeIhLiTiyx06kIEXU4olg8npxJXdpNRrAYbE0aLJNdrlKC3frdX/EZ7sIZllg7ngl9EmW/jaTv3UCU8OoRAipJVT2GBfXh0PsQNdFTj3a7XYLd5LNNckdQO5GHO0GwyF7i9JX0rGw9MwNMaMIEzEFMZQN0Yr3VyFJnuMPBDtwCkQV5CNZmmpNB4gI4WtLwRjmTDAeziHsgSGbWpYX7fYclljBNTcbJTOwIK1jHeE5zD9h3Exa+uh8CC8vTxYFcyheGcVgq8PfAW1MKI1zZXEAnLlWb5qutiZ9dJxHZyU4veQQLGYsQcBHFVypOzPH50z+x9aiIfOT5nxALcmtXh3Qfcz0VigruXANQcaPtyotuctE9PiEJNaZDq4h8o10RIopJBdobjP16Uq2ISE9AyCHCsVvBYm8r/bqLkKtGbnkKs3W9TtnByHxpyJ2INvob0Qnfemudpn6RxPIj/er/5gyq55+/rpu5x4vW2Al69JW9SRp0HRxmpbtiIr8TZLA/i5v9ziZR1+12B2FqGzu37LsSiUjvnRxd5XjxzU5sx/TyBVixcejly5df//rXP/HEE0Skm10dn4muKPyu7/quN77xjXBbaN81lsGmNswwGh0n/JqWEhPtzAKJiHTpJG1aL6ZDMuNdzq47N6K9dkt0NyzpugGKmokeg+tDJj/xE//7r/k1//ejI1iUvYrcSClILBuFJJWuEvFU9knA1MZvK5Eb+m077WaJLB8+nLSInBwfyCpcOIEK7T/5M/Vi9+/+lXHBwJBaw1O9730zzwQe4ssadHVhKbqmaBFvyK7WT01eghIzEONgPQz/N+AzwAIu4RjfZRQgSyw2ypZCrEZUw5OMNIAwBUCxRiliFmBLKxIRLBGhiGC5ASoLBhVMDQDLQ4OITR1gjdOnTk5AjA5ZLp0Kn5xdRS0oV5QSNeEaQEjrPPWJEb3VqB4VXpGL4iEQsAZY/5GGCCnUCigvAGsgdbJ1dvekMmKgrXRQG+9cm+YlJgTO2P91eXcEEyHJsNs5k9IKWnLa1fH8+Xs/8IEP3Hvvvdu0m7MwKWTqFrfircmmoUHe0xEEPaYXpEEvImKAVRZLE4sBJ7yLms4ZTuw6ODxayC5p2bLQHGHBAmOh6g2YT5lAVpbumECk4aswnl4dKMuxVAI4M20RmBw92ZagwpPOKxFmPYiQYx8lItrtFPaFHWsvbupVpJcvwNKhPT1h8KmnntJQ1otITzzxxD333HP//ffff//9RKSL+Igb+3gwszAIYgCsVHKPQpFZDxYuWq3vue1O2SrhK4deLLvcT7ztSR22KeEwhmLpypUrv/bX/tojrKoMMsfciDPIH3WJR1JcCg7i7MvPU8vnmF3WF/1oF2moHyemlVab3CMlVi9K+nszatqrvkr+3f9by3SXbCNc0ccNJ62l6Tk5B50C19bhvq9K54bOOk+L+u7Gp+Grdp78ZFcZeD65/4BWFFbJHSHeJ5tkQCI97R17T80jskgHiYhv6UTSMYJFveuUGi0FB4+sSrB1LYWPbi3mscb+PSRCggzh8s9WAqBG4eOmF9Vh7Ourg1fAy1z8uOHULf1fn/lGIvplP/Fda+KyCoDTuTlPElqRagM07s1FWTTnxm1jLvYinYB2Fi+YyA2cWeLLiDdslLL007AWL6M7TKTHxYoHzjVtxeoigkMgFU68uUalKsiWjDNZ3pidVai13W4BSqIiIYfi0MdnQSQyirLS5gfCqwzB0JR286VFhqm21h/Kk6YGH7GCocck5uHQKvjl2CyiKhv5jLRp7y1dlW5SxZmDvxKGrvgQZvZdQxd2EkuEfLRFMrhFFFDZhgka73RKg26LqI/ombatZW/1ZlWVXrYAS8NXjzzyCBE98sgjDz744KVLly5cuPDoo4++iNwef/xxHyhUP8GkO2IJ+KQwgo5IhgYL9EDEQrVfUgIGBECHrMdOJEI678qXaKmj31E6ni7EfRx5JCJ6+srVW2/9pJsbF7AaCByUxoXQta0pTkuz8IVjzo3Zr8XLbi/cm7KwrB+9mZo4MVuOkCOw3ITFJlbHFDf9MNGpwUkrClSTKttxNhGJdUPaOuT7aDg4isZqcqg3yUBz9ztWNbupHT3fwz2Pytn2/ZwpmonDqROx78yVxprZ5xGmNXdqjGk9rJNOvW8tMNaOiH0BRAhVGSIMUckvyXDVh+ioln8OJPRwKl3wU+Wz4CZbhVXJhlCCDPGiUy8vf+gzP0svbvu1b/xl/+pRoKlkHJY8MkmeIBFs25wBbj5Y8ykdjmC9CB9AVHqFVIk3CmeAxVs5wD0pDR1RpJhyyr41CSnAIm62CZNs12OhC1FQYekAsOoIrmAcyInb7XZbvK0SSDYXSiWxRoKxOOtr9hC7cqZtFh65pXZgHCjCVxPAWhV9OKFzeZHSku+PS/OGgs6cOeNHPkcntmeDrMkYrlWBuOzjIF17KlhaGFjMDUyQGJS1rw0oscZS27e/sd/tdp1tW6yPBl3RyxZgafhK57afP39eBwovX7784nKbBgqFyGJZ5Mip9jK9XdghhW/abJ61xfBTXX9OCdM9czL3zDq0oaEC7+UQiXTd7lxEjyDE+UDRr+Ldqd3u1M1t7ufwXEg2eufMHiLGKpgtCCaEjJ4kYDlXyfBi795n5Phz80nwaBFQGI6dVH7Zz78vw0hNMYRNzmBmkRt2CiScCe2wKac6LelzFBWDU7veiaylvAhi8RXI22edZhF+gf0z13nZK3wJltcqIxNjtc7wcRitv9r8Lm1li1pFryB8TMqw3WnRI5fkPBFxa6IrFGORKSXACmhFVFYRStTX3AO5px0rdSgNGIvKWAxHKba6rfjNpGpoFl7u3SplF9O283f2uRpubW2LKZAcCoRXJuwC5RLhKrOtUraiLB9tAozlRCZWLv0ImpGx1PidP+VmlTzeQ64yZChf7WGW0pwtHj0NtLGs8lgkcEzGtoYOaug1oVmTQdfWOYu5A+nd5FD6vjYcU/Q2jZsxmIjorQgwB37iQE44mGjgXa25Ln+nQn3meWIafdaLThtm00uxvyHpaiGZt0rX+6FiZcWD90nIoWeBy9E6AKc4Oz0ZSRkwPxGxdOokzH3PTNR3u517v5vkxiq9HAGWhq8ef/xx8mNwHn/88Yceeuj/397ZxUh2XPf9nGrmTQ53SAnCcrdJyC8B/JgAO+4OYjsvspQA+SAHLcFKHhgbfhCcsIkGDAQODOTrwcq2p5M4BmIgNvySYNszCB0giCI/xFHCbo8Z20EgRIAROObeIS1CEXcp6iWI9lYeTp2qcz/7Y7qnp3v+PxDLmZ7b99atW/fUv06dOjWfz1eNwYrYicJneU7sKyOV9IS4aPi4k5biM7P3HfI1fqYS1vTL+COmCyfTz4ny8iS79MTlbNJhhPP//u//wS/8wldWveUUnE4SPVppL4V0WWQMhI5iVWDp1339eaJITUE87L3PqegZulJ7Ldp6cqyDJ1sesdVskpJ775mf8/77Et5onFgpuigmHK+9sDlYvv2MPMf1RBzy0cm/Io7FLBYsaczOUGhXZfPEcgem5qU11oljit9lm9bBXCWVPlquqKgk7QJzcDFWn6kd3+vPaem7c6ZVhD3cgv/MFkPzX4QTJj1X9fMtbhtMaTCTFKEZq8TdEayar6s26+1Qw23uhWPVlr78iW/+EnXK3Xbx5Fz6Nb1Bur0pcwhyJ60uc6HkXpOv1PJyt7soVGgtOBVAHmixrS5MB+BL/5dDKjaSWabVuMPFjUTj6+DYEXsXXK+6xZC8cTXX0JPqn/Tn0t5fRIXBcMHuxSwDdoaoFh1dh4lUHanJ0Ci2yXRw9HXJsZXzmTw+drTjiYoqJE4OyME552Zyz2rbxS9SMNENT28p0ncb60ptY3yyz+KePHXl9ObDZBWLBrM08nfhe7F7sWdPW/Emn728c3qjORE9yyWts56NvKzviOfJc68LPtbsvW6iwJLUDPJDlmUXFxdENBqN1lZXwtnZ2Xg87vX+fMcxUa5ttUwwsAXDF3Nlsfa1jitr/aoUxtw6giczBNd4edZkmL6q295///2XXnrpuefWeFKs7bJpUOaKA684WEz9dKkPaG5mBVspqcKcK1bRlQcEsR9idiE2q1QmzZygQjYqhPQgyFgr78m5TvsUoVFXPs+fOee8biVp9IeE5ckV/xTXNCzmNPXsmKszIHHUGwbu6aWWFQbGwWB+EOtT9WDFE4XGbMw3eZ/C1Zur2maUNsubPTGT3a1RLsWJcLcS0FB4BXRatiJEaMnGUSpw8WlqbxfEdTp1DamerQWXxyh3nDb9vP+N/0Gqxkhdg5UHXGdJ1AkUrqItU9crp7qSM+j+M2YY02BhriHOndKEb2F8pdRWrC/8qI8gWoZo3Nh1THB0aYKvNJyILnY2Q4X41AoZWwqtwxOlBShpwi78aqy3Y59SATt2Kn/L92amFQqjBa9n1LIVzX7yS/k0UWj1RO1kItkDUnMQUyNdCcci+dIJWzD7uBdZ0zjXN1AfA/OJvvu9j59//k973zGPsqnj9KV0oObJBktfMPZh2iLKsrpyBWFNYT8kss/Aqz+MrfEkEleIY2ZJ07C2uqIbKLCyLJvP56enp7KEMAZd9fv99bJhRfr9/nj8izpR6OyUfGypxScajCJHx4yGTlNhu80WV5bpgD3FJEyU9kV38p5ohmrWly2cmIg++OBP7t27GxNyLE1sGY7qBpJERGw9N17f/GDZRcqXes3WkZIuhPHe+04Irl5hZFWyjpV7SX/zjQcn0WzHHFwa0JBavSx73O12Td2kXSksMTqbSBbTOU1jpnEkJC6K56I3S6PCJKQixO2yc0zemaTntjxadbkmeikcZoapNYNv0g7bmgk9LgqtOGsibSOooqbGy5wGFXoJ50M+RjIXZSLSaFGSXH+sqwil1nJPzOL0Je9debZpLfMVh8hajfKhRpUZK63CtyAR0hyqKMjkpYv1U1lAZ9tdQ89if9ZYq/goSZ2R2veX5u6Tpm67Bplq3wKsUiNOBJPUXCEGtHpxX/406Qzt5OJ/dd1hdKv4WOvi+CMjN40jLS4HcVTcJKahZth7T660dJFEU0WHpWNqtrRmDCnzm+TzZyoXCtYmditEOmyWBADEJL4uLYNpupKGzpEuarPFCIaCZSdkMRQ18fXp4Fp8zEbUdIep5FUbuFBe2/PIHXnyJE5B76Ny4rplj7E2uHpys6QpaixJiNNJz9rb480ZYocW7FC4GWIOwTPOsfHoy88h+orja+rLp12aGyewxuPx/fv3x+Nxv98fjUabPflkcnp8fNzr9X74h3+42IJqVLDtWpzpTeXAYgtsfydtP5o+lPGKd6wbIYThTukUnU6HmVePurCNrHZpG5mAAE/R9MfvGFI33zZSqsRgSWDjss3SvtuFvtAKLA4T+JwKqw4AEtNTJ3fNYpkkoL3MD0bRyBTHT0Xz55lJU5l3fP592TjcHsPc8V4iuuxeEOHiUae6jmiO/2c7SDPJxbL0koJNSWEiFYKaYKfdYVitRky+4eEUKyk075yZK4rE1LmuCLGlLSgG1hQSadFZEuXpE0+5D2nnvC9K5CvohKIHSzu+wobBHAfTFFxE+rQLgqkgnWRslbSjVl1YS7FAApnO23U4BquZakzDlfiD6aSN5PLlS+ilZbXT0tW07IHxC8zsOp3YSK0WNCWpPLnaXpnjAyKv+1YJd/7P3yOip5/8R+RK47AkRu3Han5LAivIloX9XyyMGiiiMC7QDKtxVNB+Er0XcYHIrmmSZ9EWV/WQiSIIK1usC6doM8nLCKFuxB7OGfsILiQ6zktHthReC2FeBEpDHh2uWPeBfJ4+aKkfeyExNC547M0Xa06Q3r66jPPlr8XVf0SFUUl9G4gy15zGS/YAJuaciDuhtSerFY2c94VR66rcLIGVZdl0Ou12u2dnZ91ud+PnF5fY6en4N37jrGa81dg1Rf1hLHfl6Fo/VjwsesG996F79iT7vnnW8X3ZN0NE9Hu/93vHx8crTRHavj+oC9OAtWQ2hinZrHicUVfpmKZ2Fjs5itbHd5aYRCVTzsa7KQtfIg5pyXzqAPT6xefCavtiAJbaKc0lnaaxtM9QJ6W6lZm9lyTmlOe5c51nz74f64FDHrUOs5M3MezemqbYfLTdHBaQPRezdMbqIqI893EAZ6VV1AfFOvBRBcQaMI+y8KRiyzQXDQ4bNktpiE0bLjzoQqswu1B7I7AK6orIpy3zxBuay9wKeU9+ud1LFlJ8oBT8f5pHm4hkRbD2R8Zw6x6h4QW1ek/ch0W92N74ix1G+sV1ilvixAcaqiVeNTxKdQOSuVa9bthwnHvlLdWymGB82wKLRSqM720nZn6KD4hVbx390Y/S/31MRC9+5988/aH/bfp1jkVQi6jn9l7rSo+Q+vKFlt9+o3KJmNIz7o4j/8q8dvupvAZV5SG7jtDR/CBJoMR7l5XjXtuRySRiIys497EXEFIqrHTasMFLXhy7cuWHGrQt6dKX9LkLN1Y+Mr0Z6UaXMOrxaUZTYAXbAntfq92JNF+P/NeRFU7xZam8OAXM5GzCccc571yYcFc6unmatNjQSBbechM3S2DJtOCW1JUwGAwePXp0evqLo9HI1zWpEmVvbXNVt4hcXxj/pRWIee4dk/hR7ctq+ZP337t3795zSw9YQ4HNNg6+yfqYwFUOw3Y5RfKg2GK3qXjpm5MH3uW595QvX3vN1H7Hm0i5aF45/mD9hUQdrxtZ6OcsP8eBi17HTDnlOZHGaZoREjvmvLxiSKyf0wkm6QnsYhmx45qfPUVVW++LxAVK7jsKc3+pUaXEC7ZmUlB5VFqFb8Vih1oLXZQMAXOVmKlLYFew+PG7Rk+mPQeLAqvQYOT/as9lN2jOdaXIgvyHDVRfD2Pzvebp7VBcPqItwayHKNan/kRUVgYuuQZTrTbJHfO9wk/OFeYHo58g9nN6vNZYIf1efA1rcDarxNUxUjx8wDbHBOtIpvQi2040DvbLZ5Rj1EWvq7CZHXt24nfxybilCevgivTBcZg6yKDsKTVLzdLSZqCS/8LHNb/kPYXp7uAAZufIucZqNychHxYscx68R6VxYEqxK4/Re8rjvljWURdFj6xH9pRzTp7Dml+1Lz54uOVKLHu7SV5quZx9MG2VEGKR2I6aZKbMWg01eqkXCW+u7BG3nFNUbvvOnee/972Pf+AHCvncW75U8GD92g+FH17/n3EemZmYvazhruT9l5/TjwX1bwog1pgdOUedjnOOO068kUyeSRNQE7VMGS/FzRJY/X5/vUxXKyHJS0tbHNarm1bZ1ELpbCV3dxzGscnzq8scyrz//uXnP//jzz0XV7wvJI0Fw7+FPfLKBxsPCNnGyoUJxPRDqUKityzKFK/GIi9tYF4pgnVZl/6y+C5N32/uITqBdM41dMOFaGvSYSiz131ySn2DV6nhxQDp37x0Otpty6OVtQKysFGMGBsz6olCZnYZIcmaUSN6ohMr5kiLGsWIm5pMj0xpGo5Dw1rcYqX8uSzyI01PFbJOWKWgq9ZtEzEjRQr5x6I3q7htAHPYcNqHfRup43UCN7bG1d6tcnhcbOTM7H0nqKzQFDVzqw5mouAr+ZNqnLsxZq6maVWqN3X9hVGyahSOsiyKUVKHTPHufFGQFXwM5Ypgbp/JugKhsrT49sbDxSm0cuNcqhQvKVZtt97z8z94L/dMRE//V9Zxue6NQzLMIfNA1feT5qhF5DHVjB+M8G20G7HK5VHkqvYcs6xsEB35yisvZ1n28suF4b0vn8SHesmDeoo20F6Qgu734pTyaU2JpzRhFY1AaBk+TSY6omfezPjbwVj8V/9YM0VYNyDRFL1qGDkEseW6CjipZHM5H3srIufpmcYjLIHmslmlueqZ/8vfTWv+mFN7Y5FHpO00Pfpqa6yxmUSkCxq1pnL5dqfT6XTYOep0ZFfKK/muhJslsK6ySHB5ZKJQwrzih6bDW6p3b6f6pNNpC6PYuJbVNV6XPTtKvfkigmYnidsNDoPi25iOJRUo8e4LgivdTct1C/XmPZF0eM5xKVKt/hw1QeW2hK2XTnEYsaCUeq7oH5JP7LYtQdNISk/NMZM8Nz7PNXjCzuVJHK6JDU9lE0cQU9ASMZg0dlfJEU30LG6JpbYyeLB0KrNG2ZhmY1SpHmXMBTdVdPhOyhMmyo/svuMcshOlXrZYjKAvY82nz10n/RxK4+Iz4diERAKti1XkPn8mdR0fk8/Ju9DayeTRpqRYKcmsqsCytZRq1QqjQti7ftv+7st/K9ehuWRpDMYxeXoaOdSpaiKiTqezlVRYAU/atZjsjoVieJV/KoWI0t6U4YbiwTLvdfQjx97nTOyJOx3++M/MiciHLFE6uNSzORkjEYkG8pSHOUorkc3bV/y14a5CTlAvvjHdnUb1uHnILfFtSQIGdUZ57h1xKS2LMTUctJCj/FmM1UhThKQihuxgO/217siafNRFs1AusP6snwQPnFamjgSsWCmv/Yzj0/aFTrWX5vXGA84Tq3BUoa3vFDkOS31LDbP0/4haK69/9c6x61DHkXPc6YT/4s8yBl7YqBZyswTWtSEThePxeONx9E1ULJTIICYKLu6mfud3fmf+K7/yL1e6FCVVQeyjSig1cetiiTKrsOx5ybuIf/KaNtD45xaWlOq8a/HNdNVXxZTZaby2DSIOporU9cQsuwvraMjFtAtxvzw5o7pXgu2JrpFwxdidizFSW+9iSdiIEq3StP7FhQTtzlrDqGzyPJeQC1lHXfSdEKfLGf3EnIpj53O5aF/Y/hjmR9IRYYowFEN1SbD1Mb+Wnj+t2LK9KbOjNGelYkayy5T1OnN9svuliLfvYzqi5Dti78h7DbZLSU+SMygKLNFM1foxV4kykYh0lqpgcNP7a79qqz7MB7vUdRVenxqBpa9h7A4aBtApvm3zJH+V2oRyyWPf7GNMVam5mtr13juxDDL1IheQF4jJlWe000pk8p5kftB7qUKiwhNYtvNTO6dCPITXhEYjUo61bRkJXjhDLJ+LZiG+I1RqQ0ykwzkzMUqeO3EUXUi8p0c+kw2zPLF3sYg1ItLrUuWot0yIfaF9apX6woXURPuwYsXHlb/6drMdXnqvLh5S1b+855nZe//xd797dHS07FciP/oV+tZF+DnqMx35OO7E3HtUbQyL+h1mZuc7HedYZgM7EnuVNnjekJP4+gSWpA/Nsqzf7w8Gg1KUlYS3l6bttkrtRCHpe7jtq8cG4b1GZtS12izL7t+7v6w/Npw6nDi+jS+8/oCIP/xXF/WHly3XUsPB0l0owfOhL3DFVNlD1SCYjiyexPZ/jc+iqEKCTLSnit57H9w25oyaF8U5E9/AUXtJBGsQoHqbzJQzO3bekZONAFilROyNOKSJMv2k8Qsyk809FluarDUjIu+fJY0Su7fYRRQqVLuFFLBl/lKyt/o5pzgzZun0dONqDjvBxUC6wq2VNUeq86AFzG2GyneuE7QhM4fUc97xgiDiZtKoWkcCUnKR9eGmrLoiCpHIUoZSRLPWasPFVFOlqixucZ2EWw2eiNh1KrFctuNLdSXo6gH79/qKYi5E+F2FyiusLwkTS7RN+fW0ZS41b5ISezJ1pnX10ey/3bn/KSZ68vhbzj6F+DX9MMqgdPGqzvOFummzV+kbaegY1INq5uSM9lQz/1VQxV5HO/FNKR8k2ii2Saag8mUQ5Sk3DhlKglLnGfK0itDepPWKlQSWt1ZS23TqX7QjCLVass+isWwW0NgDqmeNTEqIthqOFR0bkfy+/pqMn/ivpQ+8imDHxOb5FRtASxx9bHmirkjUlT1Cft3UFPx1CKwsy4bD4eXlZa/Xu7y8HI/HkqjdKpvpdHrFPKKrUjtRKFyPxorXqn4Yr355eblyvH+Ua0xE9MLnPikne/EvffrJf/x2XcMreFOugjmD6e0WFzb50il2bGnEsqChc+FlLpckjsPI+NhZA4NkCYlaE+tTiPOAMS5bPpTYcMkU6s1qYa9h7GEnQQohNakXj2WggtPOqaSLkqscka1uzjS0MnfZYYqBU8WqbulxtK8KFe7EjEp/zlo/LDZXBRZFb2Kxf/XRm6hSj6Macx2XrhYfwOrqSiuHzZNKNVbqesOEb9JeLMkbnW69TOFpNAmrdFn913bM5V1umu6GdcqPjDBWMWGEqfm+C3G7XLxEDTECd4MU7yOK6VirNQWON1VufynuSo0RMxF99N63gyurViclp6ptn1xob14PWN1WqbPTRkHoIGGR2ja3zKr8QjBQnYULjya2Ulm44kTfkCvq6vJkHHP6oqc8yh7S+vQmoYP+6VlKu0CFIlXenTxoLCOn9N80YGCTYIKIfC5exMLdmXK1ohMFi46rosWJtjGI7WAbZb9Wompih0KZSs9H21O0xhLJHtxXm1VXtG2BJX6p6XR6enoadcxwOJQPrbIZDAbXNltnL9o0UVgwENeO1QdEjXa2Ca+TXvJv7HoaTlMZolKxVa5hy4rlbykkp5m4FKmqMyPtAVgrF4Z05EcaRaExWOkT78l7jmFJqnXEAnvyIU+BFs9pqIoMqiSYnZ1jkwMplYE1DY+83lbY+bBuiH0uaQKCRkmaRjc+Mvci42DmENCtvUXRJVCt81T5zMzO53ns91VayWYmkmqS03VZhbv1UYQOT/9RNdHpPOdcSoQsbknpPtZ4iKFFx36HJALD3lRscnbULjcVb9Y4KtqbVhKUpsKdiy49ivVMvulsbBxmRq+YvdmKD4mZKFVgTeM3vze9y4tpqn2u+60uUq3wSWxItRbD3oK+7yQ6SatmcYELYurK9qBuVnfFMxSrvrGn4ORnUje57d3tgc5773Q+UVNIiBxMxtm+AkFgGQ+42VOI2eRbYR3oBmnImjw7zOxqYzTSiuzl5GdHlEbLtS2lDj38zp07H3/88fPPP998aBUpUS7vug83yerB8mJrOb5j1vTVlaLmAswdx52O63TYqqtowTbCFgWWqCsikr1uIpPJZD6fz+dz++H28jK0EycKu93ufD4vudB2K7OIaDabya5BK2Hbx9Ovfefosy8S0ZOvfWfJVuNLUVEtd3+FdlhsxMzJa5jkWd2Ry9L01FTMURIGNtrAc57nmi+0WiRyrpPnuUsbVHnWVUgirTodWTHInNZhxeuGcqlfn733MSSCiH1OnY7zYWk6E0kMSvg+ifJSuZOyDySfuDGKdXUmQ/+K/uAkncKyJRmku8oMl0nOmUaVRComoseLiJhC6ExSFj5ETSyWWMUnbhyc3nuf5+S9xNWR1gOVjw+uhfQQo2rh6FY01WL0fbH2Cm4ZZyYZw3Oo87DGvs2475Kiihe1P4cq00JqCYrSjdMPa/lw6lX3ukTJTa0mQlnjLd5gP7dtqkWNA0h2MRIrVlO5eadRgZdNGCUdVm5FqFPXZzxbbh1UNg68MJRKs+fMkvxZ9qugwjAhvEemiJL/Tw2FXqWqUJfCU+PSAaO87SdiLDqkIyoyVoGZnes43SbQOBHqL22xBrnjYmB7UlebXZ+7LYElEVfdbrfWL9Xr9bIs29KlVyJOFBJRU4aI6jhsv3jyte+sdPxCu+btC1f+8kqXarvcFc1r/WimODsTXs9iNyY74Ujwu2QN1W9JmJSXP+U5i7RyLoR+y8sp6kr+XxoMSe/pOaV+FUmn+WycT5vwGO1EyYOlXXUMeHLpoOAkqn0qxUrQYUPwqOUuyBdTWHYh5EhdKupTKQuseLydT2TSbOM6RvbqZqv57mI4biEVxHGe+9Cj1KorcStpqg7Nwh8jqEIn0dbAjOPATF05ddSZYa6vczWZBmb0VnS+aWWaI83PSbKUzuzND/tnhm4AR3/0Yvz5yQ+uZhVXJQ3OffCHVo2jmb8jq5x0hCs+Wo5Hk5lPjNvX6t+0mRlfFxnHPFFwTqvYsho9ySrHYRs3Ng3yikJXbMYyKfI52CVdMy+vj+Z5kQOjkWHmpLGo/k2k5jfFOe5UirTx7CdbEVgSdNWy102WZV/4whe2cek16PV6Mku4jBftmsXWfD7/6Z/+6W1fZVWaXji1JkueZdnTbhBOTqkkHdgEUjBTnktgVs4sIfD6LfUhicHSnRbUQ2PmByUXsFUbpPaOyDM578RKhjN7L6In984sL4q1If2yCjbjUvKkcdfRc+XzxU4KTUgRYlyIn8XaIA0xoSDpkpgoagW2p9PaNO4rJo4xXHovTLoJ9TrP2Wnvo+7GlA6+0m+FG4whdzEHdLqPBY0tCSwyd20kWrwjLp3KF78SfolCymkrosIkIItoMgp3mToBN532ZhbNkSZPSeHndXOOock9f/Yvnrz6ZRfWZOoaHcpNqy1FK5KaLPlMXTjxn9J1gkeoSQ6uYKijVqMlBFZ4Q6wPTWxbQWAlN7lMEUajY8cqVlU1ebDkF8cxLwNtI/XJVgSWbHfTpK5k3vA649lbmM1m8/n87OwsThQu/93y+HIPnVubpX4A0VQttp+9xu6kqLGSAIhDQxfy0bP3LhZfZ52S3vK5lw43CinnHAd1FeUKxzphNlqN0kVFseV57thphvM4cNS0LcG9VHIpEWn6eK8xTtSadziaXbKZteWqek6dwiRicq4gTeQcNsWXrdWg/LRiNbeO+mb0nGvIaB+mVMMCrjwPjsR48fIX0tOkOH631cZcXXlUPkPxzMUGY+IF5d+oPo1CqmndJiO8frxKNBI4POJLZxYnumgi7IHSjO98/tNE9OKv/cMn//5bkg1LHVEd4+siOafXrFqSEzUmL00nXdjsuKJQViF+9aOPPnrxxRfrj0mzmZLLXoqsaYzDcCiN4yi8huTYpfyo1v1OSaZZZVa+M2ZmkjAs2kRO0fqrbFwWZFl2cnJSirsq/XWrm+GsRJZlUpLxeDybzc7Pzzd+iavU8L17977xjW9ssDA7p7Y2uPGX7fLuu+++/PLL8Vcvm/sIuX/2LM/zKLCIwoCMiCh/Jl6fKCOYQ6ar9LoWx1VyEpVBBTd+0AGyPDvsMkZkXOQy7CzMwVkPVpp4S1Vb3+SKYlFNcP6MOE0IRIHF7jkVoCmtKPlyciYOxq8wHUbksyx7+eWX49fTwWsZ7FhyHdy3pViLf4qimZJpjiVpv2CN6NHwfm8PoSRNlz95PNuavPvuu6+88sraXwft7LB62zoLJu/90Y9/SpLo+7/8Nz/88j8h6/KRg9J5OJoy4xLzxkwsfAmCRVjrVgLy5Y8++qilSuN7GlYShV2x40RmwYbEPzmWtdVVS5uWQ5bcWaUxleNgrsWSX+U2m9i8B2s6nd6/f7/2TzdNXZEJrh+NRrPZbBupIlbz6xii+Dskat1+hboIno74hW2VpM6MhsiDPCdy7FLvLEUNFifPc0lTLsnbrb+qxneVMiBoaHkhiElcGeIWChvQGoGlo1rvJd6ACl4362bReT0yn1VIBpNNwIfMoKl+8LrHjN4IqQnzwdoVnDfphqLSU8lJ5uuU/rf6E/XJ2xem0ii1mro5jmI9BN9Z5TVc3ZcWhFq1g9L6iVeFP2qXrOElLX291kxdAwtLzuHdpQ//9tilib/CIT55WNl7zoPQkk9ym2ehpqGGgZv+ugn3FdXtPVCq0hiZkOee1Q2vNoTj0uXowZKf4xaolKrOc0yTEWbkG4whpatsLW3vFgRWlmXz+bwqDsbj8XQ6vVHqqoRdUbjta7W8SLHlXV5ebrsYO6fi4NGfiz+VZ2yujq+zHdJPBvPkOx0XpxPV98ThBXbsQ+4rLoVGWTFh16vZARbpbJHX4IjgogpufL3VYFlI1hSxS/6kwm00Ko16NKGoprCPyjEO+NRnb24nXaAopOJfy2jym+LE2TJUc0sV9JnmS2y9YduWqmsGly9LrXzj8gfpWEir7XFF2bTtS1+DCGPmp1/7Tpzt86a5FV+aMCqT0WunE0O7PJX2h23SWNEcrF7lafhhPjw6Ovrud797586d8sFmflAup9EETJpckHxe2tw82CVOYzlzxejQSkPZ8uPz6Ty0tclBYfMCS9TJcDiM021xRWHTvOENQeLGbMl3gm0N9+/fb5Igh0fViqXXT/+3jtKqvPGl+T5TAuueCe9eiofQAHAfUj9XY8CNb6n6oHzpEumuvW4xlOdeE0gmXUYknjVzRl8M+qmrjVJT4brcuVqQYvCpVSbGTaXut3QLhTIUCh2/UvmsWOf1/VblhrzGb5Gt4QUw1b0vG+6kFwbLg1XY68q8NhHWMLDh0iVkyaAP23AFLVI9vvF3ZYNdTqdTLiSZHWPlXw77Tcet5D27DodtytKpwmIRl4I7w+nMEFdMQE0ilaJW29z91bB5gSVzbfP5XLxBWZZdXl7aRKM3GSn8bDa7CaWdz+fVbXyaDj5I7dV0v9HfXWMVSrPulT+14QvqIQyqwvurKc71/bUuq7KuWqgh4l3EwZb3ROwcWUmZvpncSOljrovfjF+pua6WXCNqVYKUWk60gYWT6P2mMxX1k3j4Gsw0xxQFDe6udlY1gvFdqNGem5VEe6wH1mevZdBuaa+6zcqvaIV0s4oln5o9zNNG23inE8erpR0SKUVH+LClPBExeyZHIaQ92T3SKCs2+4TbUZ+dODDf2gFbWUV4fn4u2w4S0Wg0ugliZXlkovDi4uLGTmXWcqu0l73ZWntQWxcL/RnGTW1fS11KbdSLT9vhGWnVEOvTfhc+jNfY+Mabv2LvdEXbx/pvoYT6c6WJVM9d8lclO97gRUsj5mtugFAAa4Oq2yFrDyRazsaaYqZw7NImaqXytPP06dMXX3zBuJbTJrBxqBmXGhOxp9xxUFeV0AhOJjoW1USexYM2WP712Fai0evf92ZT3JCJQiKazWZf+tKXrn6eFj/Q1U++c5a/h+rcXNMBUfQ0HZnkinFZrfc+F8RidSKv4ZQbtxzLnZCJKk6g3Ruxm87RfwgL1J98frvJLZu4CT0N2DhLGvboJt8tLu5XGuVU2kIjfS4hE+TTIpswTbA4d90N0lWR69jsee/Y7UShrBKQn7/+9a9///vf7/V6n/jEJzZ+oVvl9FqJha9oWvm/6Xf5RlmHem58AW8UR1//cwuPWfWhx5g/AKqs1zY2ZfNrr15YdBJlFhHpTB+p/54lHCMGNMSFQssGX94sNpwY/mAYjUYnJye72s8nyzKRWZ/85Cf/8A//8KOPPrrmAnAd11yGmwwqBJSofWXMKLywHuKKb9Yrr7zy7rvvbuMuwK2luQGvRvvJS5/E3S/Ev+WcrJUmx6Q7ObM9/joqYqNsPtHowbC91KPLIDnDvvrVr+7k6suzv+0H2Rq3yqFW7zpW/ut/lYjoR35zg8U41OrdIUf/+AX54b//jT9A3W6Jo6Mj+2tT97GPWqoWeLAakTCy2Wy264LcaDY1KAfgBrKZhv0jv7lZdQXAYXDw3QcEVhsyUbiTS2dZ1pQQfy844HcGHCpotIAwAws2BwRWG/1+fzQavfbaa9d/6WoSrH3n4Acr4JppalFrc/TP/+mu7wnsjCc/9+GTu3/hyc99uOuCHCxPnz7ddRGuGwisBWxyovDXP0O//pkNnOew2F/JtfEOfttc8dZuWnVdsTwljj71Av2Dv3/0qRc2e1qwT/wtzOSCTQKBtZjNTBT+279IH/8xffzH9EtLdQyz2ewzn7mlamzbferN7OCvgSve2iFX19/5mV2XAABwaEBgLWZXE4XbyH2171yxj489PRZhgQL/7Jd2XQIADpw7d+48efJk16W4ViCwlmIDE4V//T+tdPjl5eVLL720/uUAAKvw5Nsfyn+7LggA4EBAJvdlGY1Gb7755sXFxfqn+JllU0ZJgtN79+6tdPqjf/dn5Ycnf+X3V/oiAAAAADYLPFjL0u/3e73ecDjcdUGakRivj/941+UAAAAAbjsQWCswmUzm83mcKByPx8fHx9u40L4nwQIAAABK3LZMDRBYq3F6evrmm29mWTYej6fT6ZVmDJuZz+fdbncbZwYAAADANQCBtRoyUShZG7akroQ1BNaTL30o/22jPOAAOPqxF45+DHmeAFgAkrmDjQCBtRqZ0uv1tneV25wEC2yJo58IayCgsQAAO+G2ZWqAwFqBLMuGw2G/3z87O3vzzTe3ei0kwQIAgPU4+msvxP92XRZwe4HAWpbpdHpycjKZTEaj0bZXFCIJFtg4T/51SN7x5LcxiQwAAFsHAmtZBoPB2dlZDI0qrSjcIOslwQJgIU9++0OoKwDADrlVCwmRaHQFSoHnsqJwq6HuAAAAVuXJWxhIgN0DD9b69Pv9+/fvb3yiEEmwwL6DrR4BAAACq0CWZdPpVCbpluH8/HzjE4WXl5dIggUAAADsNRBYAckdenJyMhwOp9Pp8l+UicLNlgQCCwAAwOFxqzI1QGARaf4FIrq4uOj1eivluJKJwvF4vKnCIAnWtsEEFgAAgG2DIHfKsuzk5ERWCMpkX7/fX+kM5+fnL730Uq/XW/WLTSAJFgAA7BBJ5o6RGLgKt92DNZ1Ox+PxxcWFzMpNp9PRaCR/Wj4Si4g2mHoUSbAAAO1gLxewv9yeTA23WmBNp9PZbDaZTORX676SvZyXP9WmJgqRBAsAAAA4AG7vFKFEtccsVrJ+cDQaZVk2n8+JKLqylmTjE4UAAAAA2FNurwdrOp2enZ3FX0VUyQ9Zlq2qroSrTxQiCRYAAIAD5vYsJLy9Ams0GsVsCFmWzWaz0Wg0HA57vd566oo2MVGIJFgAAADAAXB7pwgt4rUaDoeTyeSK+uaKE4VIggUAAAAcALfXgxWRYKx+v39+fr4RcTOZTNZ2YkFgAQAAAAcABBbN5/PBYLD2tGCVwWBAROtprCzL7ty5s6mSAAAAADeNW5Kp4VZPEYq7qNfriSTaIJPJ5Pj4eI2JQiTBAgAAAA6Aw/dgTafT4XA4HA5LWzJL0NVsNtvGlFy3211johBJsAAAAIDD4JAFlpVQ0+n05OTEaizJxbC9nFV2onClnKUAAAB2DtLlb49bkqnhYKcIRdnEXAyDweD4+Hg6nUZFdQ3pQGWikFRsLQRJsAAAAIDD4AA9WJKTnYqZrrrd7mAwuP4FeoPBYPlZSCTBAgAAAA6DQxNYstFNbSr2LMt6vd51FmY6ncpGh0sGYyFHwzXw7rvvvvLKK7suBQAA3Gpuw0LCQxNY0XdV/bzb7V7zLoFSDIl2L4XY1wKBBQAAABwGByWwptNplmXVgCdJJSrOpOtn+RWFSIIFAAAAHAYHJbAePXpUq65OTk4uLi52UiRBSrVwLSGSYAEAAACHweGsIpToq8vLS/uh+I12q66EmHq0ZRIwyzIkwQIAAHDwSKaGo6OjXRdkixyOB0uEy3g8lnSdMi1IdfFYO6Hb7Y5Go+Fw2HQAArDARjh69dVdFwEAAMABCSwimkwmWZYdHx8fHx+Px+PN7jB4daQwTROFSIIFrs7Riy/Qf/7toxdf2HVBAADgtnM4U4RENBgMer1elmXXvFpweVomCpEEC1yVr3xl1yUA4KCQZO5I7LIlnj59iinCfeL6czGsRMtEIaYIwVX52Z/ddQkAAAAEDk1g3XyaJgohsMDVefKdD+W/XRcEAABuOxBYO2AymQyHQwnGjyAJFgAAgNvDwW/5DIG1A2onCpEECwCwPBIetOtSAAAagcDaDTJRaPfPQRKsa+C999774IMPdl2KAweVfD2gnq8BVDK4ChBYO2M0Gp2cnMSsXQjAugY++9nP/vzP//yuS3HgvPPOO6+//vqv/uqv7rogB85P/uRPvv766++9996uC3LIvP/++6+//vpP/dRP7bogYC+BwNoZ/X4/ThQiCdY1gK7oekA9Xw+wGNeAhG2UNggBV+e3fuu35IenT5/utCDbBQJrl8SJwr17gd97773vfe97uy7FOuxXt/TNb35z10U4fPa3MRPR+++/v+siLMs+1rOEbZQWJN1wbn49v/POO8Ph8HOf+9zB+7khsHZMnCi8yem7qvzyL//yfD7fdSlWY4+6osibb74Jh9C2uXfv3snJya5LsTKf/vSnd12E1XjnnXdk+7L9Yu+CN956660bbpx/93d/l3Q7uy9+8Yv72CqWBAJrx8hE4Xg83q/X+IMPPtjTpBL7Vc8AHAz37t3bL1eQZY/GOffu3bPLp244IrNkd7tdl2XzsPd+12UA9OUvf/mtt97adSkAAACA3dDr9SaTyUGNgT0Aq/PgwYPHjx/vuhSr8fDhw7t37z58+HDXBVmBu3fv7roIK4N6vh7eeOONu3fvPnr0aNcFWYEHDx7suggrs3f1/Pjx4xtez48ePbpb5MGDB/tlMZbkoDZ7BtfJQY0zwKZB89g2+1jD+zhFuHf13O1296ieu93uYDAYDAZ7V8/LAIEF1kHWP+4XYnT26zWeTCa7LsKtYH/reY+6UtrPehaLgXreIIPBQCKuer3eaDTaL5u8EhBYYB0Gg8Gui7Am+5WmYX/reb9APV8P+1vP+yWwbn49n52d0b4Nd9cAAgvcFvbLRALQzsF3TjeE/RqS7Qu3pPViFSG4LWRZtnf5xvYRqedut3tLbOiuQD1fG5L1AKYDrAoEFgAAAADAhkGiUQAAAACADQOBBQAAAACwYSCwAAAAAAA2DAQWAAAAAMCGQZoGcCBkWTadTmez2eXlJRHdv39fNtJu+Yocn2XZ8l+55WRZNp/PHz16JDVGROtlYc6y7OTk5PT0FCuzmqit6mUaZ+mLaNULWa9Vw3qAhWAVITgExuPxeDzudru9Xk/M4mw2m8/nvV7v/Py8enyWZcPhcD6f269Mp9Msy5q+AmTf++l0KjUmlSYZmc/OzpaXSlmWHR8fr/qtW4UIUCLq9XqkSYOWqWr5oqRvkMckL8LCL95aalu1mILJZNKUsbNqcGSA1+12Ly4urvUGwE1mx3shAnBl3n777drdhZs+F954442333679KHsQrpHG7teJ2+88caDBw+qlfbqq6/evXu3+nktUsMPHjxY/iu3kFdffbV2P/X2qn78+LF8sdTmHz9+/PDhQ7TqWh49elS707Ds8dxU1Xfv3n3jjTdKH8ouy9XPwa0FAgvsN9KpNBk1sZIrnRAmspbHjx+3SM8lK03U1cOHD0X7QmDVsnZVS/WiVleipT5Frdb+qekBrWFwwAGDIHew30j8RJMnX+ZElt8kB9nem5Dpj6Z67vV60+l04RmGw+FoNEKcSjtSk01VPRqNmqr60aNHvV4PrXd55H1vqeosyySNewmZe639HIn1QQQCC+w3EkfV1KnIPmJLCiyJX2mREbeZ2WzWsinbQiELdbUSLZ10S5Oez+dQVyvRbhn6/X63262Vs6enp9PpdDweS5y7IJ9I2BwAhFWEYN9p7/iXH03GsGLEqDax9tBcIoKhrpakvdeXpyDjiuq3RBDMZrMoC2TAgJpfjya1JAsGZdlB6fjJZLL1YoE9AQILHDIr+a4I6qqZy8vLhW6VWqCuNkvTU5DPHz16JNprMBj0+31p/+JowdrYKlJpMTtDLbIGs4RMHcoqwui+FSfWdDqFCxwIEFhg71noWWk/AOpqGVokFGkXVa1nmTQhzYtR+qssj8eIv0TTtJTQMmbodruXl5dVLdvr9U5OTobDIaq6xNpOWQn9rGa+6Pf7w+Ew5m4AtxzEYIH9ptvttnQ5MppvMXZQV0vSXs+SeKn2T71er9frZUWiV0B+3UqJ95aYV6nlmFq9K/Vc9RT2+/3BYLBwFcLtpNfr1YarC01PQUYU1Yg38V3VOr3ALQQCC+w33W63yZxJCsGWmFPJeNnr9aCuFtLv9+fzeW1/I9MltfU8GAzO6zg9PSWi0Wh0fn6OsX4J6aSb9JAs56wNZpcvNq1u22gZD4cvfOELkla06YAW323tt5oWGIJbCAQW2G+kU6lGm8bEyk2hP6KuBoMB5k2WQeq5Os1HRNPp9PLyEnEnG0QCqKv9tLTqlshrmQ0sfTEGDG2ruPuMbInT1LDn83mtAWnyVIlHFlUNBMRggf1GJNR4PJZ8NnGNlewsNhqNrLGLG2JE35Wkuimd8LrvYU84Ozs7OTkRVSrVOJ/PZcHaaDSyPhXp4JEyYG1Go9FsNjs5ORmNRrHFzudzcWvZLr+UB+78/Py11147OTmJu+nN53MZfojXEFQ5PT0tNWypVfF/22Zsa3s0Gg2HQ9lcK5qduH/Ozm4G3Ch2nekUgA3w8OHDu0WqO41I9nBJzXy3mabczcB7//bbb8suN7a6qtuMyJ+qO73Y8yDn+EJKrVpyjpdqVbK3l3KRV7+Iqm7n8ePHkoS9vWHLMTGHu2yzs/Bb4NaCzZ7B4RAjppt8JzKUF69VS9QFXC/txNprWkAQ67nlJLPZDPW8DO2tOk6FV6do43QVnLLL017b0V9rq3Th6wBuLRBYAAAAAAAbBkHuAAAAAAAbBgILAAAAAGDDQGABAAAAAGwYCCwAAAAAgA0DgQUAAAAAsGEgsAAAAAAANgwyuQMAAACASDOrUXMeu2Wy3AEBebAAAAAAEHjppZeIqNfrnZ+fl/40nU5l38azszMkCl4IpggBAAAAEDg7OyPdWtF+nmWZfNLtdqGulgECCwAAAACBfr8vM4Dj8VimC4XpdCqbAmF+cEkwRQgAAACAAq+99tp8PiedDcyy7Pj4mBqmDkEt8GABAAAAoMD5+Xmv1yOik5OTGHrV7XbhvloeeLAAAAAAUCbLspOTE5kWFAaDwWQy2V2J9gwILAAAAADUEGcGiajb7Z6dnXW73d0WaY/AFCEAAAAAauh2uzJRSERZlkFdrQQEFgAAAABqmM1mEuouvPbaazsszN4BgQUAAACAMjbx1WAwIKL5fC7R7mAZILAAAAAAUGY+n4v7qtfrTSYT0VjT6dQmxwItIMgdAAAAAAVieHu32724uJAPS8mxdlm+fQAeLAAAAAAUiPvknJ6exg9tcqzZbLabku0P8GABAAAAIBHdV7WJr8SPZT1boBZ4sAAAAACQkOSiTXnbJ5NJt9vNsgxOrHbgwQIAAABAAWS9ujoQWAAAAAAAGwZThAAAAAAAGwYCCwAAAABgw0BgAQAAAABsGAgsAAAAAIANA4EFAAAAALBhILAAAAAAADYMBBYAAAAAwIaBwAIAAAAA2DAQWAAAAAAAGwYCCwAAAABgw/x/2PUS6mjWMf8AAAAASUVORK5CYII=", "text/plain": [ "" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -54,18 +36,17 @@ "apts.pointdata['scals'] = scals\n", "\n", "vol = apts.tovolume(kernel='shepard', radius=0.2, dims=(90,90,90))\n", - "vol.c([\"tomato\", \"g\", \"b\"]) # set color transfer functions\n", + "vol.cmap([\"tomato\", \"g\", \"b\"]) # set color transfer functions\n", "\n", "# this produces a hole in the histogram in the range [0.3, 0.4]'\n", "vol.threshold(above=0.3, below=0.4, replace=0.9) # replace voxel value in [vmin,vmax]\n", - "print_histogram(vol, bins=25, c='b')\n", "\n", "show(apts, vol, axes=1, elevation=-30)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -74,14 +55,14 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - "vedo.pointcloud.Points\n", + " Points:   vedo.pointcloud.Points\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", @@ -89,10 +70,10 @@ "
bounds
(x/y/z)
4.784e-4 ... 0.9984
1.643e-3 ... 0.9978
3.092e-4 ... 0.9992
center of mass (0.505, 0.507, 0.505)
average size 0.473
bounds
(x/y/z)
9.911e-4 ... 0.9972
3.396e-3 ... 0.9964
2.581e-4 ... 0.9976
center of mass (0.510, 0.515, 0.494)
average size 0.491
nr. points 500
point data array scals
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -125,7 +106,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/examples/notebooks/legosurface.ipynb b/examples/notebooks/legosurface.ipynb index c20a12de..7cc5d315 100644 --- a/examples/notebooks/legosurface.ipynb +++ b/examples/notebooks/legosurface.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -17,28 +17,17 @@ "\u001b[1m\u001b[34mmemory size : \u001b[0m\u001b[34m1 MB\u001b[0m\n", "\u001b[1m\u001b[34mscalar #bytes : \u001b[0m\u001b[34m1\u001b[0m\n", "\u001b[1m\u001b[34mbounds : \u001b[0m\u001b[34mx=(0, 1.290e+4)\u001b[0m\u001b[34m y=(0, 8219)\u001b[0m\u001b[34m z=(0, 1.103e+4)\u001b[0m\n", - "\u001b[1m\u001b[34mscalar range : \u001b[0m\u001b[34m(0.0, 150.0)\u001b[0m\n", - "\u001b[1m\u001b[34mhistogram : entries=100000 (logscale)\n", - " 4.91\n", - "0.00 | ██████████████████████████████\n", - "17.88 | ██████████████████████\n", - "35.75 | ██████████████████████\n", - "53.62 | ██████████████████████\n", - "71.50 | █████████████████████\n", - "89.38 | ██████████████████\n", - "107.25| █████████████\n", - "125.12| █████████\n", - "\u001b[0m\n" + "\u001b[1m\u001b[34mscalar range : \u001b[0m\u001b[34m(0.0, 150.0)\u001b[0m\n" ] }, { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4QAAAJYCAIAAAC1p7+MAAEAAElEQVR4nOzdeXhT1fbw8e/J0BkKtNCUFARFJhUKahFBhCJSQVTAgSlQnPVSGZVyHe7vOlyLoqKtIyKFMukVUBEtooAoaqtCQQWZBXoghZZS6Nwk5/3juPsGGeSqEMD1efaDJTk52SeJYXXtvdfWFvy8ByGEEEIIIQLBEugOCCGEEEKIvy8JRoUQQgghRMBIMCqEEEIIIQLGpgW6B0IIIYQQ4m/LBkag+yCEEEIIIf6mZJheCCGEEEIEjASjQgghhBAiYCQYFUIIIYQQASPBqBBCCCGECBgJRoUQQgghRMBIMCqEEEIIIQJGglEhhBBCCBEwUvReCCGEEEIEjGRGhRBCCCFEwEgwKoQQQgghAkaCUSGEEEIIETCyN70QQgghhAgYyYwKIYQQQoiAkWBUCCGEEEIEjASjQgghhBAiYKTOqBBCCCGECBjJjAohhBBCiICRYFQIIYQQQgSMBKNCCCGEECJgJBgVQgghhBABI8GoEEIIIYQIGAlGhRBCCCFEwEgwKoQQQgghAkb2phdCCCGEEAEjRe+FEEIIIUTAyDC9EEIIIYQIGAlGhRBCCCFEwEgwKoQQQgghAkaCUSGEEEIIETASjAohhBBCiICRYFQIIYQQQgSMBKNCCCGEECJgpM6oEEIIIYQIGMmMCiGEEEKIgJFgVAghhBBCBIzsTS+EEEIIIQJGMqN/mSL33n8OvqnIvTfQHRFCCCGEOGtIMPqXyZz8eJF773Nj79uctybQfRFCCCGEODtIMPrX2Jy3xoxBi9x7Myc/LvGoEEIIIcTJOCOC0c15a/45+KajA7gi916zBaRX/5PFM6fV/iz5USGEEEKIkxT4OqOLM6ctnvkm8PXSD1vFdzRvNPOLm/LWRDlizWA0yhF7Ze++/ZLvCmRfj2OTSov6y5z8+NPz3gtEd4QQQgghzhq2AD53kXvvV9kfLp75Zr8RdxYV7PW/fcrY+4Cn570X5Yg1bwEWz5w2afBNyRMfq41ZzbsWz5y2KW9NkXtvlCM22hHbsn3H0xyzbs77/nQ+nRBCCCHEOSOQwSiwed2afiPu7Jd811fZSzInP5488TGg0L23yL13/AuvmpEoYP6QPPEx87AJ6q4i995Jg2+KcsQmT3ws2hFrPnZz3vd39+hkntb/uczYd/O6NeYJo2Jir0y6vvYp/nJX9u57is4shBBCCHHOCGQwGuWIHf/Cq7U/A2Z208yDRh8rTLwyqe/XSz9cPHOaGbZ+lf1hlCPWfzQ8yhHbKr7jlUnXZ05+/Lmx99WevzZs7TfiLnXLHjP/+ptUq3nwprw1Re495l9bxl/6mwN+w4x6zckGnNkzCoQQQgghzihnxAImwIz2NuX9mrY8wZGde1//VfYSM2AtKth7zJjVzJVuyluzSU3lzJz8uBm2XpnU12z9ku96et57/Ubc9dzY+zb5zfg0w9bFM6fVzhz4cOa0SYNvWpw57egnqtUv+a43VuQ8Pe+9VvEd+424SyJRIYQQQoiTcaYEo0Cr+I6b131v/hDliN10nNXoVyb1rb03Kua4h0U5Yq9M6vuhWuRe6N57zOzmlUl9kyc+9tzY+2pvyZz8eKv4jk/Pey954mP9ku/ql3zX+BdenfDCq5vXrfE/7HhPeurG/YUQQgghzj0WMM6QpkJMA4xW8R2/Xvrh8Q9m87rvzYcARe49xzysZfuOarTdUAnUYxx2ZVKfKEfs4sxp5l835a3p3LvvUX1zjH/hFSBz8uMnvoqW7c2QOvCvpzRp0qRJkyZN2pnfLGicIa1lfMci917z5+TURzFnYR7ryF8jS40rr+sb5YjdtG7NMQ9r1aEjYN7761TU4zx1q/iO//+5OG4Pr0++86vsJcd7OrNFxZ7oiaRJkyZNmjRp0qT5tzNomP7KpL7AV9lLzL8mpz76VfaSxZlv/uYwc3VRSzXmnpz6aGbaE79bGL9lvJklPfZhLf1G8GtXUB3NnD/wteqhv015axZnvrk4883NeWtqf85Me+KrYx0shBBCCCFMgS96769f8p3RjlizS9GO2AenvrI6e8nd3a8w18ijItF+yXd2Sfq1cFLr+I5XJvWdMub+kamP/mZWqFmI3jxhl6S+X2cvWZz55sjUR49+XvMZD7j3mk9U5N57vJflePdqfmE0R/5c21UhhBBCCPEb2oebdga6D7/PjEHNn2sDU3+b8tbMSHsClV7l16qiS/ol33lD8p21t6QO6u9/S60ZaU9syluTNn9R7WETpr5yzAVPH2S++VX2EvPI45mR9kSr+I5XSgwqhBBCCPF7zo5g9CQVufeuzl6C2rHpyqS+RxcQnZH2RKF7r/9d5qi6f5BqRpwPTn3l6KXxU8bcD0yY+soJuvFB5pvA0SGvEEIIIYT4jXMqGD1JZsy6+chU628SmR9kvmlGqK3iO9bOEFitBvpPnPX8KnvJprw1x5wPIIQQQggh/P0dg9GTVBuz+s8QuDKp7++mPM2B/mkrvzn1fRRCCCGEOLsFeG/6M1mUI/aPDbVL3XshhBBCiJN0BpV2OpecoD6UEEIIIYSoJcHoKdEqvuPx9ikVQgghhBC1/kid0Tu7X4EajI52xEY5Ys0tkWp/OGZRpL8VMxiVCqNCCCGEECdmA+N/fczI1Ec25a01h6EL/SqA1royqe/tqY/8NR08Wxl+fwohhBBCiGPTlmz65c+fpdC9F/gqe8kHmdOBG5LvkCqbd3bv/ObKrwPdCyHE38uni969pv/Nge6FEEL8D/6aOaPm6LxEov6iHLGFsoZJCHG6FOj5c9KnvpD67e2JiT/kSmk5IcRZ468JRgvde58d8w/gZMpw/k3IGiYhxGlToOdPct01N6MBjCrQn051ZcxJnxroTgkhxEn5C4LRQvfeGWlPFrn3Rjli//ZTRY8g1Z2EEKeamRC9PXFigf4k9ACgMTw9N8OS6hpWoOcHuH9CCPF7/mwwakaim/LWRDliH5z68l/Sp3NDq/gOhW53oHshhDjHzU2fOjcjCP4NdaEKqqEaaqDfD7kP3Z74oAzZCyHOcH82GDX3YTcj0WjZechPtCNWhumFEKfaD7k/wzMwE0IgGIIgCOywHe6FfEmOCiHOcH+kzmit9zPf/CBzerQj9vbURxpKJHqk1vEdi9x7/8zLK4QQJ0GDwZANn8NEaAfATHgTLoeQTxe+2y7hihhnXIC7KYQQx/HHM6OrVSGnVvEdpcr9MUXLgnohxClnhYYwGBrCP2A6PAxZ0A/awJYfcpuNTLxD1jMJIc5Ytj/8yNXZH6kflqzOXlK7CRO/bsvk6JLU928+cG8uqI+WfZiEEKdQbU6hC5wPC8AOw6EKVsGd0Ar6zsl4f33uoMlZ8wPZUyGEOBbtoz9R9H5T3ppC914z+Vfkdqsffr0l2hE7ef7Cv6ifZ6XV2Us25a2VCgNCnB4Fev7zqROGpoxpl3BFoPty+vRp1RVuABuUQxi8DU1Bg1BIPjLjsC3G+dnYtH/8rV4fIcSZ749nRjEH6I9zV6F77988LSqEOJ3W537zQmp6gX5Lqmv60FHfDE0ZAxTo+ef8XMmho0bMyVgKV0IYAAZsg5tUmSd/FxTo56e6XrskYeq4tCnn/CsjhDhbaB9t2hHoPpzL7uh+5fSVXwW6F0Kcywr0/E8XLpiTsQNuggy4BfbHOBePTfv3iw9P8XkL07Jmn9uB1/rcb1Jdo6EbNIa54IMyaA73QpTfgVvhRWgON8Q4Px2acpNsHCqEOBNIMHpqTRw08MGpGZIkFuIUKdDzU133Fug3wk7YCHfDHGgK3WFORETT0NCkQ4em3nzXlUNTRge6s6dQgZ7/fOqDP+T64BcwoD+shO2QDFcDsADeg1vgBvWgBZckuCdnzQtIh4UQopYEo6fWM2P+0SWpb5ekPoHuiBDnpomuwT/kboDLoDHU5vmWwudwoG7d+mVlB6Oi0isqPm3WJu+cD7w+XfTu86nPgwEDANgGK6AFhMAuuBMuOvIRm2Ocn41NS5FZpEKIALJoIO3UtWhHbMD7IE3aud2gHlyjItFyKIer4G6b7cKoqM6XXvpMTc3TVmsD945Rd107bE76i8c7zz49/4XUBwN+OX+m9ep/c+byd2KcDdU3/AUwFA7BL+CCC9X+TFVQBR44v0C/PNWV8kPuNwHvvDRp0v627S/Ym16cQOv4jj/LPkxCnDL79uwHDULUDWGqeT2eDXv3rtu8+fkOHV6qX3/f/v3D7VrDnOzCia7BR59ndvqLyYkPLFvUODnxxvVn8/6ZMc44sIAPfFABoVAX4iADXoAqCIJgCAYbzIR0aHpuz6kVQpzhJBg9taIcDql7L8QppGlhYQ1gHHzgd+s8GF+v3g3R0ZNCQ+//7rtJ9eq1v/zy6cXFm+rUOS/Mcuv9/W5btujd2ekv3p3Uz/xhToYO/4B2Bfq9E12vzE5/MWBX9Kdd078HfAZVEAqAF6wwBMpgLJhLKvNhDHwHN0BFAHsrhBDaxzJn9BS7vfuVb8mCeiFOjYnDXe4dV1RX7zx06EOf7zwYB6/bbHuioiZWVa0/eDAvJMRwODKKi187dGhOixY3a5qlqGhT584v/Pjj1MrKg2Fhjbdv/wKGwQVHnjgnxrlqctabtSnDAj1/fe43vc6S5ecFev7zqQ+vzw2ClvARRIO5T94W+ALawk9wAXSGavg+c/l0SY4KIQJFMqOnnGwKKsSp5AOCgs6Ljr4vJMQC90VGXtSo0eSqqnUHD1bCpMrK6/PzR4WGXu5wvOZ2r4uN7dq69eAvv7zXMIx9+1br+kdQFxofddrIAl1/PvX/zL8U6PkTXbc/n7o5ObH/WTGIH+OMm5w1c+ioi2E5eMCq7mkOw2AHdIPOYEAQeALZVyHE354Eo6dcq/gOm/LWBroXQpyjDJ/5H8OoiYi4CrwlJVl79z5+8GBz6A9AO48n1e1esnfvvSEhHX/88TNdX9m9e4bF4nU4uvTsOTsuLhYegjy/k74DUyyWrjHO+vw6nfT+Av0O6FSg3zPR9drZMog/LGX05Kx/wQG1v0kl2CAIqiAEasALqD+FECIwJBg95SQzKsSpc82AgaWlK8CracEWSx3QYIhhPAbNoUotHq+B4fB/JSW59er1NIwrli27S9PsbvdXX345tnnzmzp0eMBieR3mQyH8H6y2WgdbLOcV6Pmz01+ck7ETRkM0AHZwzcmoSE7sc1akSNslXJG5fOnQUZfDKr8t9wywgg0Oxzjzho7qL2P0QogAkjmjp9zq7I9+zltzh+xQL8SpUaDnT0q+t+JQ66Cg5vv2PadKvg858qjFMAeuhZKYmNbR0QN0farN5mnRYszWrVOjo8+Pi+v1448vu93fWCwtLZbeAPgM43WvtwUMhXpHnq0K3o5xFmcu//j0XOOfV6DnT3TdWaCfB81gOvSFwhhn/uSsORKJCiECSzKjp1yXpD6rsz8KdC+EOGfFOOPeWvZh05Z6aekq0JzOEUFBq2EsbAPAA1NhEYyCYfCPggJt06Y7QkKal5T8tG7dA07nzR5PvdWrR+/fn9ekyT2GcQhqoBq0yMjW553XEh6FXLCrtgUettmKLBbbiTt2RolxxmUuzx46qi2sBh8UDh2VkLn88z8fiRbo+X9JD4UQf1ta9qbtge7DuW9k9y7Pzn9XNgUV4pRatmjB85MmnXfeKE2zHTiwoqTke3DBe9AGkiHS71g3TK9b9/wGDYbt3z+1YcO2UVHd9ux5X9Pq16vXZefO1yornT7fJqvVfdllT1RXH/zpp+eqqhrD3fAhLAsK6m63t6vb4LMZny4O0LX+cetzv3ku9eFe/W8Y9kf3Ry3Q89fn5vTqP9D8+SHXHVDxTNZcybAKIf4YCUZPhwcH3TxxaroEo0Kcas+lPrh5TWOLJRiorMx3u981jIsgGeqDAag/ga0wy+EYUbdunwMH5hw+/G519YH69W+vqfm2desMXX+jsPCTli3fcrunh4SUX3jh7Tt3Lty+/V1Ns4eE3GCxNARrRUVm2syX/24baZrRZ4E+NMa5vF1Cw2WLfgYXVMDbw0b1/sMBrhDi70yG6U+H1vEdfpYF9UKcJl7D8Hi9ZSEhcRZLcGSkFx6C1RDkt/nQO/Afm621z1fp9ZZERl7fqNHj4eFXGYanbt17Nm6cEBHRrkGD7lu3pkRGdrfZrsrJSd2x451GjW60WEIMw2MY5vJzbdrjC59LfdB81mWLFgTwmk+P2ekvjkgcV6A/AT0L9KeWLQqFSIiGJjBhdkb+Q8fa3UoIIU5MgtHTQao7CXF6DEsZXT/2p/LybVZrOABaZGSbuLg+FstMSIMy2AsPadqXQUFDNC3IYgmxWiOt1sjS0i9KS1eUltYcOPB6TMyUffu+37dvVWjof3R9xaFDX5x33uTo6Fvs9kZt2rwWHLynpub7mpocn+9AUFDd8n2X3tt3wHOpDz6X+t2IxG7n6gRKs7DA7IwieAGc6uZ7YBC8BuvhMHRdn5s4InHs2VL6SghxhpBg9DSR6k5CnAYxzri0mTOuvfX8oqJPwadpmmH4IiIubNHi7vDwwzAaJlmtDYKD77JYokADamoK8vNHl5SsDgl51W6/1+cbvnt3SlhYp8jIpEOHxgUF9aip6bJt28Siovfd7k1btkxs1GhwTEyCz7f2yivfqKys2bLlv5e0eXTXhiCbrX6B/u8RiQ+ckynSh1wjZ2c0gHuOuice0mADrIc6sKtA/2h2xvqHXIPP1bhcCPGXkzmjp8nI7l1mrFwd6F4I8XexPvebR+4Y7fNVORw9IyIuMAyvpll37363srK+3d7d3K7d690SHFxaVva11donKGi8GZsC4KmunurxfGa1PuvzLQkJiQ4J6VdRMcPrjbbZ+lZXT23Y8PygoIZFRe82bpzYoMElW7bMOHRoS/36Vx04sNXrTYH1vfofGp/2bAAv/y+X1KoL7Ier4CGI8LtnLTwCTSABtsNqGAZXwM4Y5xfDUm401zkJIcQJSGb0NJHS90KcTu0SrpiWvaBHv14eT5nXW65pVsBisZkLmMxJnz5ffmnp53b7Y0FBE/wiUcAWFDQhKGikzzfDap1YVdW0pGR8dXVuTU1uZeV4m+22Awfq79o11ee7e9cutm6ddfnlU5o1u6VOndYdO06JiloE1csW1Utq1ercSpHaYSTshIGwQt34BjwA7SAOFsJOeBjMFV3nFejDnkv9QmaRCiF+l2RGT5PpaU+1iu/QNalPoDsixN/L+txv/u+eh2JiEoODG+3dm11aarHbE30+t8+Xa7cH1dQUejyFdvswu/0+vwd5q6qe8Hq/t1gutFieBwyjyOebahgO6Amv2+0Xa1oLjyfLZutss10KmV7vNo+nid3uadHivvLybdu3vw6T4Yt2CTufyZoXqGv/CyW16gXXA7ABlkN3OAAboS844QcIgmtVTO//Z1GMc/X4tDv/bmUHhBAnz6KBtNPQoh2OIvfegHdDmrS/W2ufcMVrH86t03BTcfH3mqYBHs96TVsdHd0zJKS5z1fRsGEyfFJRMdTn2wD4fHkVFTf6fOtsttsM45D5RalpYeCDj+ERuKemxlJd/U+f77Lq6sNVVW9aLP8xjOus1ktttimbNi2uri668MIxdns63L0+96YRibf+kPtNwF+HP9P26fl+W4m2heGwEdwwEmIAqIGl8BWEQRiEQiiEgA8WFei5+3Q94FchTZq0M7bJMP1pEu2ILXS7A90LIf6OYpxxz2bN63VLu5qaw40aR/boVx+0qqrdxcVbfb6bSko+a9hweFhYdGXlXdXVr1ZW/kPTWlitt9Z+PRrGtx7PAMOogmdgPEyFcngNdsFVXu8N5eWTvN6fqqvfLS+fYLf3KyyM27r1+dBQK1TChQX6gw+6PsxKnxbQ1+DPs4MBNVAOdSEIHGBX99ZAJ8iGNNijbsyBR6AY2sY4ncc+qxBCSDB62kipUSFOv/W539T+7EoZ/eriWeP+c58rZXS3PpcXF4fCm3B3dfUDBQUfhoSc16jRSI9nttV6q8XSFawQBPt9vpe83jFwEzwAEeCEf4IP7oc9sB9a+3zjvV4ndPX5xpSX/9fnc4eFvVleHgwHoR4cgC/nvjI9QK/BXyDGGTdsVE/4HKwQBoAHIsAHNvgCfoJLYDAEw+PwGSyEGdASOkNVgC9ACHFmO5v2Vj6ryQImIU6nAj3/k4ULZmd81C6hwbNq1qa5X+WDrjsL9NvgGnVsgtcbX1T0UkTERkDTosy19oZRAobPtx3+A42gHDQANOgNHWAW7FcnscPHEAd3Vld/VV19j83WFArgU8i02y/z+fad1uv/q7lSRl87YOCDrvsK9BbQDLxghwPwBXihgTrwKjgf3gcNekA98EJN4DouhDgL2Pw2xxOnVrTDUejeI5uCCnGqFej5U1IfWp8bBD3X5+rDE/tNSHu4XUKn9bk5D7oeg3/C+eDz2yDUCmNLS18BCxjgMYwtXu+3UAE/QSmkQH2/Z9gNL0M5AIfgVdgIV0AU+KAzdPB43oDpsC0kpL/V6qysfP9s/7KNcTpnLf8gK/3F2RmrwAP2GOdXvfr3n50xF0LAA1aogXrQGKwQDQZo4AHO9ssXQpw6Mkx/+shIvRCnQVb6i8MTb12f2xQuAsBZoHd90PWfrF+3BQqC22EeWMAKVrDBVhgGq8AHPp/vK6/3AAwFG1wDXhgDtXWC34dJUBdaw3oYAwdhIFRDEVhgKzwIxZqmh4XdYbU2VRMuzwWulNHPZj0InmGj4mct/8yVMnrW8gXtElrARtAgCMLBAzbwggZbYpzlMmdUCHEC2tJN2wLdh7+LL7M/+jlv7Z2pDwe6I0Kcs7LSX5ud8Q1cCKhR9dofimKc2wr0GmgFn0ITeBSckAkz4CK4FGY54roZxq4C/RLYZ7fj8WwxjB5QCp9BAvjge+gCTWErfAWdoSVUwy9wCRTA+9ARIhs1OnTgQEVQUHdNC66s/O9HGz4PxEtyShTo+each1rLFi2YkvoSXAH14EOIhSYxzoJe/Tu5UkYHqJtCiLODZEaFEOeOZYvehS9gEwSBXTUbbILFBfpe8EFjGA4GuGAczIHecDnYYpxxz8x64tmsmTHOtWFhF9et+3y9em8EBbnhIAyDX2Aj3ASN1TzIGGgJBgQBsBCyIQnag9GsWVJCwhDDWFxRMSs0tP7wxKvPmR0yfxOJAr36D5y1fE67hHz4CTwQHOPcPCFttESiQojfpX0imdHTaET3rjNXfhnoXghxznIl9izQw2AzNIRrIByAlbAJWsIhqKOWLvlgNyyD28AO1RDULmHjg2lpE5PHlR4cZrcn1J62snJ+WdkiMKuNXgk+sMA22Ao9wQNF8DWUwwAIBwN2h4ZWOBzR8fGj1qyZWlMT16BBj127pt79z9uuPad3yMxKfzErY36MM3pK1qtHx6xCCHE0CUZPq/GDbp40NV3WMAlxikxwudbnAj7YCgehO3wNXrgYguAXCIerwAvhoEM2DFXrbPLhs9DQW0NDR4DtN1WZDWP/4cP/8XgOQSewwnewD0KgJ6yFH+B2OB/mQyw4YX10dJLFUqeycm54eJjb/X1QkLN58wmHD6+Pcq6bkjU3sC/UKXX0IL4QQpyADNOfVrKGSQh/n/z1u7eb64Qs0BLOh88gEi6HELCC9mzWv2Oc30AxoOaS1kAlrGmXUNIu4bKKiv8ePvwoeDQtRNOCNS1I0+wez/cHD470eA5CNZTAR7ALzgcbfAyH4WloDHPgnxAG78C+wsL15eWr6tWbcvhwg+DgfmFhz27fPs8wPDWHb7+779BzZsj+aBKJCiH+JxKMniaF7r1fZn9U6HZvzFv7ZfZHge6OEAFWoOdnpb84JfUTV2L/dbk5f+m5DbVXUDRY1H6VXsCMPrOWL26XUAC5qpATMc5NrlHdpmTNdTjj4JqaGr24eGB19SrzdOXlLx46NM4wWkE9sMFncDFEQy4cgitgLHwL2XAVPAWt4AFoDZ1KS+N1/X6bzen1fldTk1enzjMlJeEbN95z6EDlX3rJQghxFpNg9DSJdsRGO2Jbx3codLulAL74myvQ8ye47s3KqIZbC/S7HnRlqLpLf5YrJQXWw2G/nSoNVUl0i2vUgPYJnYApWXMnpN0K30BQjHPVlKwXzHU2MU4nGNDFMFofPvzP0tL/FBffWlGxGHqrFfqHoTuEQCtoARWwHl4GA3rAdzAUVsNiWAWbIcHrffzgwW2GYQePYVQGB/evX/+/ZWV2t67/JZcshBBnO9mB6fRpHd8B+DlvrfmDEH9D5sZIWRmr4U6oA0AwJGdlrF6XO2JK1sw/ef72CZ2yln/0bOpD63PzIQ408MLBGGfltf1v9V/ZfW3/ge0TOq3LzTnOcqLzIbqqajU0gP6qZCbm2aCeOnMw+OA6CIIP4DqYDj2gCgqhEmrABi6PJ9PrLdK0EI9n4+HDj1qtIQV6PnT6k9crhBDnAMmMnlYyZ1T8zT2b+lBWxkG4R0Witbqsz+3pSux3ghRpgZ4/wTXkd8f0Y5xxU7LmTkgbBRvAAjXtEsKnZE0/usZQjDPuWJGoAR6ohLpggXoA+Mz7XKOGtUsAaqd7HoYQyIOvYQLEw0OwCTZABewCO6yC+2Ev+CoqZpSU3Gm3N7bbL5j6yDt/VT5YCCHOahKMnm7RDoeM0Yu/rQK9AObAjKPu+RD+XaA3y8rYMcE15OgHrsvNmeAasz63w4OuF04mhru2/8Cs5e9f2/8G16hrp2TNPcklNdcOGNguoQS2Qwigxo7MSPRr16iurpTRU7Jmu0b1gHUA1IXt0AzuVBMDguEOuBQMKIU3IAM6QJvq6qUVFVkREf1DQ7sZhtdm6/3fN0MnuEacwyuZhBDiZGifbNoa6D78vUxL+0+b+A5dk64LdEeECIAJrmHrc8+HT8EDd0ILKIMZkA9DoC0AW2Kcn09IG2/O7yzQ8z9ZuDArIxduVKdZE+P8fkrWW6do1fYnixZMSX0R4uE7cEL9GKc+Ie0xsz+mdbk5D7ruBB8MhO4AWI88zXxYCT64HhrAQU1bXLfu3WDVNFtV1dqIiIMlJR3t9u71ohcn9ot1pTxwKq5FCCHOfNoyCUZPr0WZbwH9k28PdEeECIBnUx/6ZFEUWOEbyIMB8BHEw20Q7HegD95xjYrvPWDAeNftBfrlEH/kmYrhgwfTRp6iAvIFev6zqQ+vy90Cse0TQqZkzTnmMcMS+4EFIuAuaK7u2Q3PQ324CbZALlwBhIUV+HyVNltzm+28iopV7dsnWSzWtWuzamo8Mc6wWZ8uORUXIoQQZz4Zpj/doh2xhW53oHshRAB5ALgC+sMH0AL6gAZVUAUe8IAPOmVlvDcssW+BHg1twQM1fq0+RD+b+vBfXRbqVzHOuClZM12jBrlGXX3MSJT/X02zJ4TC/8HHACyBR6Ed3AnR0BkGwRZYYxiVTmeGzRZSUvK6xWL8/POPhw/n9+79QuPGF7jzd5+KqxBCiLOCBKOn21VJ132R/XGgeyHEKXES0x+tqsg8EANWqIbHYS0EQzDYwAYfwbPQFDywC56BnX57zZfCNPgWznc4nafucoanPDD8hKPnMU5zN7V2cBUsgn/DZzAEuqvYuhrqw63QpqLCs3NnSmhoR4fj35oWGhHRq7DwvBUrJhqGz2LxyMxRIcTflgSjgSHJUXHuKdDzx7v+MSzx2hNkK4en/KN9whbYom6wQQu4GubAW+CFQ/A8rIRrIQq8kAjN4E34DIDV8DxUQjeVZA04L0RDL9gNJVCpAutgCIIg0ECHbR5P7717Pzl4cF55+eo9exaVl+dERU0pKbGHhcUE+hIACvR8iYmFEKefBKMBEO1wBLoLQvyVCvT8WekvDUucUKCPKNCHT3A9NSv9pWMeGeOMm5I1xzXqUvgEKsACXrgABkE+TIJ/gRduAyfY1Ur29tAbVsML8BG0hdZQA5bAlo53OB2wx9xoFILAA5fD+/CWyv4COyANCsFMow6tqLgKmkPXw4db5OenhIZe6vE0/GTRwoBdBvDr7xLDhiUOPQV7tAohxIlIMBoAbeI7bJRqo+JcUaDnP5uampVRACMgFKLgvqyM7RNcQ4/3kOEpD8xe/laM8yuwquxmMNwADeAC6K5iUKvaax5oAH2hBBLAATYIAktgM3lTst5yjUqANWq7UaAe9IEymAwbYCm8AY2gDXggGoBoqIIPoIvHk7p//6rq6j3rck7J5NeTtC43Z7xrXIGeBCOfTf3gBO+dEEL85SQYDQApfS/OGZ8sWjAsccK63G5wKVRAJZRCGXRdl9tlWGLy8YbsY5xxs5d/fG3/RCiDSlUXyeYX1QHbwYBfAJV69IEPvOCBshin/RRVdzp5w1MemJL1FCyHAnVbMHSBC2E2rIaO0BS8YEAhfAiPQX2oBqA+jPV6O/+0xjL8mpGnaD3WCZhZ7Qmu5wv0PmAO2vRYl3vhsMSBp78zQoi/JwlGA2O/zBkV54R1OTnwHWyCUAiFEKgDEVAD7xXo2ya43jzekD3wYNozU7JS4GPYD0AIeMEHNTHODa5RnZdt2uoadRl8qUa9NZU03Rfj3P1c1sv+tT8DpX1Cp9nLF7dPMFO8mtrDqRnUh/MgEiwq2l4I78HVcJFK+h6EJ+FTw6gsPZj2zzsWn+Dl+ssV6PnjXaOyMnZBIlRBOZRDBcQU6NdMcM0+nZ0RQvxtaZ9KndFAcHW/KmvlF4HuhRB/1jOpD32yqApWQgwkQ33QYCW8D91gOFjgyxjnp89lTXccJ4vp1vOfTZ24LtcCNVAEF8Q4d/gf79bzx7vuLNBj4XtoA4XDR9144nXuATE0MbFAL4N4aADASqgHjcECO2EnhMO1EAwarIGuMAsawaX167traqw+3yDDKIuMemv2Z6ej7Oi63JzxrnshFPqpKa21cuAz6BLjPPBQ2j/PhKBfCHGuksxoYEQ7HLKgXpwDHM440OBW0OAJWAOzYDHcAcnqG6ZrgX7/sMTRxxv2dTjjnsuaM3zU5VAE2vBRbecsX+ofuTqccXOWZ1/bvyFoMU7PmRmJAg5nLATDZ7DJ7+YayIPdEAc+qFRD9r/AG3AxJAB2e/327SfXr/9VRcVEw4g+jb1uAhEwHb72u3ExfAG3wLUF+sDxrhckRSqEOHVsfusDxOnTJr7Dxrw1V8mmoOIsFxPnhE2gwdWwDWZCe5gK4Uce2AgmjHdltU946bms2cc81fCUFLe+f13uquEpKcf8XnoobXL7Tp3aJ3RyOJ1n8BdXHETDJjXxwALfQj24HH4BF3wGEZAPMWCB86EGDMPweL1lTZokR0V127r1ebeef0pLqCoGWKEdNIYvYSPcAAshAu6D+gDY4YZZGT8tXdT3obRHT0OK1K3r63JzevcfcKqfSAhxhpDMaGBEOxwybVScK2rAgEpoAtGgw79h25HHuOEx2LIut+fQxMFHp0jduj4r/aVPFtkKdNfQxOuOl0Pt3X/AaQnR/iBVZyoSEsAHRbAbmkELtTCrIdwPDrDAg9AGVoAddlRX77dawysr92zdmlZTU3EaqwSYk1mj4ToIgdehHQyHemCoBlxUoA8a73r6VKdI3bo+3nX/s6nfDU3sJyuohPibkGA0MBrKML04J7RP6NQ+oRK2QggEgRVaQAz8Gz5SR30EqdAK/g/aFOijxrum+8c0bl0f7xo7K8MJt0PvAv3f410vLQ103c0/QAXK5hKr8yECYtVGU3YwVDWAa+AqyIA+4IKvYEdwcKyuZ61bd7vP18Bma3J6OuzWdbCojlVDGzDgS8iEw6D5HbsHngPfrIw9QxN7n6IwcVb6S8MS7yvQ+0KbAv3G8a4pMj1AiL8DCUYDQ0qNinODw+l8Lmvm8FHxsBp8qm5oZ7gBFsGT8DJ8CP+A2tKVVrh9Vkb1eNft63JzZqW/NCzxyQL9Cagd/20Mk59N3fxM6sSAXNSfo6tUok1Fpb8u/4ciOAgazIGFUAPl4ISx0P3gwZ927pweEXF9WNjVp21nqfYJndonBMNOsECQSt/2A2Aq5KkDV8Fr0AmGQccC/ea/PEVqpsZnZfwIt0AoYJaenZWhD03sG9itDYQQp5oEo4EhC5jEuWR4ygPPZT0KH0Ao1ADQGIaAF36G+yAeaqBatSq4fF1uo/Gu4bMysuEmCDrygGq4/JNFa4cm3nq2jdWWwXdwwO8WA7bDVmgEFfAv2ArXQg2EQShshqXV1QciI0fabOcBhnGaZsQ6nM7nsmYNH3UVfAdV4AUrWOEK6AQfwCx4F74GFySqx0XCkFkZO8e7hv9VPRnvun1Wxj646qh7Li7Q+w5LvFfiUSHOYRKMBozEo+JsdLyYoH1Cp9nLF7ZPaKCWildCEDSC+jAF3ga72qg9CIrgSfgMmkIYjIKFRx4wH+6FlgW6a7zr1bNqrLYZNIafYAdoYIX1cAA6ggemQ0PoosqRAm/D63Ch1Vq3omKlx5MPXsMoP509Hp7ywOzls2Ocm6DY7x+FJtAXDsMOuAUuBK/absBsHdflRl3Tqu1f8u4U6CXwDiw6ctcDYC1kQHlgt9oSQpxSFg2kBaSZI/UB74Y0aSfZCnR9VvpLwxJHz0p/6XjHFBYYNtth+FjlR+3ggYHwPTwE2wH4EB6GELgFPNAAboBMeAD2Qyk8Au/BPXAdWOCWWRkHhyUmFeh6wF+E332JAGgEl8AB8MJuqAvt1NamHeAisIAdiuEx+AaugIYWS1CTJq9aLJ7i4mmGUehwxp3Onsc6nXOXL+3dvykEgwE1UAmhUBdiYBYsUEvvbWADCyyAVTBkVsaW8a5hf+bdKdB1sEFn2A3Pwxb1L9QnsBjagPU0vyDSpEk7nU0yowHTJj5+Y15eoHshxElx6/p41z2zMg7B8FkZu8a5hv3m3pnpL911/bO+6rSGDWeHh18Ob8MWsIEHIuEmiIJ/QQYshB7QGVBzTBvDcKgEFwyGSngI2qjTV8JFbv3WoYljzvBVTTH/f6V/CFwEGjjhAggCOwBW8IEFdCiHIOgGEWDz+SrA17Dh6JiYByHk9CcC3boe43RCa1gM+yAEAA/Y4DrQYTJsBiAfJoMH7ocLoMu63EvHuyb+sQkVSxd9sHThArBBKFwKsTAPlsJMWAtdoLH63UYIcW6SYFQIcSJmoDk08QG3PhjaAdBtXe4VtRWa3Lo+fnjyB7PDIyP/CcFA3brj6td/xGL5BtxQpc6UANfDd3AbNAMNUNEqYEBPuBTKwaqWsJhC1DahBbPSp52my/7jSqBa/bZvgKZGtw9CKQAGbIA1EAWxavvTaoslxGIJs1hCq6p2VFfvy8s5rTNl3bo+3pUyK8MGd8MA+ArMFZZVYIUw6AHNYSYsglehEwyGMHUCh1vvO841439ac2Z+tJ5JzZqV8T3Y1M3N4QrYCIcgESLBKsGoEOc2CUYDplvSdV9kfxzoXghxIm5dfyZ18qwMN9wKNqiASqiEKLd+wzjXu8+kTryz73PeqqeCg3sYRplhlBlGuWFUBAd3jY7OCg42N6kvhDKwQCgYEKoWyhQ7nHWgDIpVtUsfOGELPAW/+HVkGUyBMLd+4Jj9PJMUwHaoANSsUA32wo8QARb4CtxwM5Sp4ali+AbsXu8hXX+wuPhdq7WPI+7YW6eeCjPTXxqaOM6t366y0d3g32CHj8DrFya2huthPTigGXigRv1pumDpoqU9W3U/mQS2W9eXLlwwK2Mz9IHmKnNcA1VqxwRzG1WPOW3gTK4vK4T4kyQYDSQpfS/OcAV6/rrcLyFXzSAMVXnKcFgN7y1ddLCiYtnhw69ZLBGaFq5p4ZoWpmmhPt+hgwcfra4usFiGwHuqBr5/taOfHc6c57Kmzln+UvuEPX4HeKEH1IOpsBxqYAYshcuh1dnwlXURhMGPsA8ADTaCDh3AgE3QEG5Uu99psAPWQnuf7/COHbeUl++32W4/baWd3Lo+znXHrIwiGAE+KIVSKINwuBNug2IAaqBC/TpRAw1gOnwBdtWAz+ENuALueib1w99M5PiNdbk5410pszJK4FIASmAH/ASYyXXwqtOWwypoNDTx+rOtroIQ4mSd+d/s5zKpNirOKGrY9P+PtMY446AR2CBNjdsC5fAW5MBI6AWjKyv379s3sKbmx1/vLn93//7BHk8rq3WOxTLcas3QtL2wTD3c43BuGz4qfs7y5Q6n0+F0Pp/11vBRrWG1mlIJXAJXwVJ4FLbDNaob1tP1YvwRKnt3AbSBfLCAG2xwhRrRrg+d1QImAwpAh17g9HoPwCVW6/UA+J5JnTbztNQQWJe7Cd6HrVAHIiACwiEcfoA50Akq4QuoBNSGTE3havgOXoY9YMB/IQeGqtpMPdflthqaePMxw8d1uTnjXA+5dXMyqLkLgAFtwAdfQwGgMrK74Uu4FG516zeMcz17el4TIcRpZvHb8E1aQBqB7oA0aQYYbj3/mdSHZmUELV0UPzSx37rcb8BwOM21I12hM8yF+bABnoIgGAMtAagHI7zedoWF95SVzSspebKk5DVNS7VYxpvfMprWwWqdrWntYYGm1XM4fxqe0nfErxvQ/9pGpKQ8n/UQbFCVfQyIgs5QDT0gSCULLW49P+Cv1fFbrUi4BCrBBm3BolKhcbAULLALfOCBG6EBBEEdn2+LYRyEIDDgslkZVeNcrlPf5yBoAenwX7/+L4LpMADuhkegG3wKm9S7YIP60BPC4VV4CargXrgQqlRzuvU+41yvzkx/6ehPGgTDa/A1WMACGtigPbSEDbBRpWm3wG1wNQChcOOsjN1DE687sz8D0qRJ+5+bZEYDSTKj4gwxMz19aOLo9d/+Q9MGaFrPgj3/Ged6Vc38qwbgfLgJ8mE23AoD1Zi7mdYCesA9hw7NrqjYZrXOs1iuPfIZbFbrRItliGGUDE8Z0Lv/gKP70D6h05zl77RPaA1b1WTKYHVyA4Jgm8NpqZ076Nb1M21xvVvXoRpq4DDshuvhIvgeyqAUquAKuAE+g5XQC+ywBTxQBcHwhNe7zut9x+v9DBpBn3W5Q4Ym3neKh6et0ByugW/hEdgCGbAGHoHe6pgB8DAUwdeAmkXqg3bQCQ5BmUqdBh/ZDs3KmD408cajLiESOkMuTId9UKLO2Ri6QjV4wAK3QxMohwo1X7mlW+87NPGxM+2tF0L8GRKMBpLsUC8Czq3rM9PTZ2UUa9qr0ELdHKNpzz6Tuv2Z1FSHM1oFnUFwEdhhFuSA1S+tBSyD18GpaZrXO9gwPvd/FsPY4/Xe5fOtgsefSZ0zMz39mJ1xOJ3PZ01/KG0I5EClGrrxQJnDuXv4qMQ5y1fUdvuZ1InPpH584rmJp5nD6YQf4Sfwwg0QBRfCdVAA30MohEMs3AE9wAIjIAI+g6UQC7HwmGH01DRzamYNxLr15uNco09lPGr+KxAB3aE+PAsOeApaHPnLRmtIg3ZggXy/B1ZBJGjwCnzrd9p98DyUw0i33meca8qRb7qZW+0BIfAm5PvNJzZzyT7YCF9CiNqnqna+8reQsy5Hfo0X4twhRe8D2drGx2/Mywt4N6T9ndus9FdmZSzTtCv9ajDVCl266MN9e4thFVRDMNjBB91hKUwDc6OgUpgBX0FfACItlm5e78M+38vmWXy+d7zeIYbRRIU4/5yVsWe8a9jxupTUf8Dc5bMdzk1qU81qh/OX57OeS05JMQ9Yl5sz3jV6XW5ziF+Xe4G5ZehJXu+63JxZ6emn6MUEoC50gMtUNFkDIdAdEqBY7S9VDjvUJNru0A/q+x1/lWG0hE1gh1dhBsSeupLvqhq/AZXQBmzwDTwO+pG/bByGZ+BHSIEdkKsqBpiTOy+BjvAJZMIh+Bpeg4vgFqgDdrhuVsauoYl91+XmFOTrfiv020A32AG7VG7VqmYG3wh74Hm1uA2ohvnwHVzmcDYK1P8y0qRJ+8ubZEYDrKEsqBcB5XA6INww7jeMRX43G4bxhKa9GRLyz/DwLLv9IngPdoMdasABN0A1PAs58Cx4YDBEmwdYLJdYrcmG8anX6/L5nvD5Xod7Idnv/Dfn5V4zJPHWvOMk/BxO59zlH/fu74SQEaPazF2ebY7Om3ncca5n3XoPcADQyK1fPc419XjZ1lrqsVNmZvx8KvOpxeDxW2Ze28zA2gzjpkIl1FW7azaBFrAN7LASUmAflMIdkAM9j/V7wl/D4XSOGJUEG0FTVe590BWC4WHIVgf+CBOgLvwbLoEn4UL4DHZBhYodG0IiVMFLsAZuhARVCMxszd36NeNcGetyc0FTVZwsqqZsEHylcq4e0KAOJEELmAPLYCO8BCVw9VFbhgohzm4SjAaY7MMkAsit6444JzSEATDNMEbBQVhvGDfYbIfDw2fZ7b0gOCTk4ZCQ0bASdvgtYekKreE96ASJoIEdbIZRA2halNU6RNMa+nzL4S64TK1rqVQ7m7dx683Hue46QRA5MS3t+axpI1JSans7znX/zIydYOZxq1WrgU4zM9xDEm92/7oh5zGu9JnUiTMztkE/6JSXe/GQxEHHC4WPd4aZ6ekn8ZD28D18pBKHwAGYD3vhPPgCPoALoJUqtloN78AaCINp8DJcBK3hW6gLvfzGr0+JESkpz2c9CqvgIAAGWOFS6AHvwuPwNkyGG2Gk+ifDDi64A7ZAmUpzGmCBthAMByBPBbj+bSt8l5dbBd+p1C/qE3UpdIZtsE5t+1T7et4AW+C/4IBLwQI1jjgpOyrEuUOC0QCLdjhkDZMIiKWLFg5JvH1y6pNQBXFwOxwwjFshNTh4UEjI/0GkYVSYzWbrFhb2ms1WH2wqp1WuVtOfZ7MFqXVOFqiBaigHm6Y1gkh4HaaAD4IhBGxwEB6HL+CWmRlbhiT2PF4QGZ/QqfZnt57v1vPhCyiGYDXkbe60uQc+cOt7jnmSmenpQxKH5OW2h47qtsZqrffv5FPVU5ux7P5xrqdO8JAC3SzndCUY8F/YAevhfagPl4IHfoHLIQY0MGAdpEMRtIYaWA7XQHO1B1V7QC2uP4XiEzrNXb4gPqEctqhgFIiBfqDBZ3Av9FCbRXlV6wBDoQoOQgFoqrc+uATK4BX42e95PoHl0B2ugNvACqtgH9So0DMW+kAI5EIQeNWM4WBoD0HQGnyyIZMQ5x4JRgOsoSM20F0Qfztmkm9y6mfwMIxUcaQV+kA9wygxjDKzdr1fq+/1fu/xfAH9YSHoEKYmFNZ4PNXgg4+tVndQkMPrzTKMIgDs4IEhcBhSYB0A2TAe6sCd4IR4t957nOuh3006Opxxqhbm235FT4HP4T2IU/XSf2tmxltqT8vfKJ+Z8caQxBtP/NR5uTnjXA/l5SZCdxgzM+OX443yxzjj1PSntnAhrIQ10Baaq5VAMRDuF1y+Dw44X93bC+qomA+VQt4Mu92neKt6h9P5fNbsEaMS1ZRNc4G/DaKgLkyHF1Tde6tq78Fr0B16wY+wQV2XR9VpuhA+gMVwGObCLhgIFwIQAb3hUvgedh9ZPvYySAAvfA3VYIMQqFafJQ/shJ9jZEMmIc4hEowGWLekpFXZ2b9/nBB/Ebeuj3PdOzPDA7cB4IRy2KvG2YOCgq70eD4sKxvp8+1SD6qoqHi4quq/8G+4Cx6DzfAt+MACVbAdFoaGXhoVlRUZ+Z/w8KFe79s+X47aUSkIroU2kAavwRzoDf61n6Ldes9xrldOnKd0OJ3ggxYQD1/Du3AIZsMGaA+NzOScW9fHuZL940uHMw6s8LLa4wfYBy9BJUxy6yOPN+VUTTOd5tbvgGbq5r55uV2OM8pfO2DthUNwATSHMr9FObX35kE5NINGgFpFpIEVylUFJQO+hW3QwuE8HbuDjkhJmbv80/gEHX5Rkb0HrHADlMJE+A6ACngRvodR0BkSYDxEwCooVMlLoDF0AR1eh1i4Aer4rdPyQCsYogo1HIRKsKrppPXBB++rXWGrIAhssBl+9nsvhBDnAglGA0/WMInTJi83Z0jiALd+E7RXu4pHwi2wXuUaww2jOjR0pMUSXFY2oqbmY683t7R0gMdjwDToDEBXeB0c8DHYYK+mfVm37vg6dSaa0VhY2OD69V/TtN0+3/d+O1vGw63wOUTDsQcEZma89nv1I82UYX3oAtUwC6xwOYSbS7+fSZ04JPEfebl9xrn+43cqAxLgUngf3oevYBpcCQ9AI4iAO2Zm7Ds637kuN2dmxqtw3lHdaOTWi8e5/jU5NfXI2z2wHvbALmgO/WEANIN18ItanXMAvoU6qiKSGdDvgTIwYBd8Ck4IgeVgh35+009POYfT+XzWrBGjOsNXaoKvDezQBeLhDZgGqWCHcX6vTANIhl7wLRiqwj9ggYvBCzmw5sgVXeZc2C9g38S0h0eMauu3ar4GgqA7XA5fwddQCsGwGg5AV6go0PWTnGIhhDjzSTB6RpBqo+IU+U1l+PiEThAFk+EjFWTYoQwKYD18DHbDqAKCg3uHhPSuqnqhvPxJwxgFo0FTG5eXQQhMhPuhKjg4rEGDOcHBPQyj0jCqDKPaMKptttZRUTNDQi6GatgNgAXCAQiGt+AHv26WwTvwPVz8exdkqHi0BtqAF84H1I1aXm4VjAMHjJ+c+pUKFs17m6qSn1/DKLjhyDNfnZfbY0jiDUeFOFfAfHjDb0n7KvgXXAhPL10UNyTx+iNTpK1gD1ymAnfgchVQNgIvrIc20E6F6eZA/AFoBDvgO7ganHAAWkOCKvZ5Wo1ISZm7fKbDud5vsTzQFG6ATRCk9pT3HNniIR4i4QcoAdTWWVaIh60wD/aqs+2BOVAKcTFO54iUlOezHoYVcADKIQiAC2AAVMIOKIG6cCloUDw59b8zMzadUVVmhRB/mNQZDXxrEx9f6HYHvBvSzq5WoOu/e2+Brs9KT5+cunVI4m21lTihCgbCSngKCuE9eAqawEAohG1QZZbOsVia2O2dIAIyYbear2luXB4G78JkuKGqauOhQ08YRpmmhWhasKYFaVqQYRQXF/+joiIPJsBK+ApQo9itoQNkwwfgg3XwOpRDN/Nb6XhXNCs9HSJgOwBB6ndpn1pzsxuKYIDfjpQ9li5qOiTR5dZ18EENaNAMIiAdlh75ZbgEJrv1DjMz9oxTNVABMGAQ7IVJ8JPaE/UOuAOALm597DjXS2bt0gI9Hw5DMjQ/8uQOGAqRsB+uhiaq8xbYACHQBSpAh+shFqzQAKrBamYZT/8HLNbpnLc8O3lUL7Xk3xxDD4EaOA+mwVKw+bVd8CxUQzK0h2/VO+VRE3bbQQS8D9/Bd/ABNIQ2UGM+Y4eETvOWL4hPKFOZUfOxZpXWGIhR+9fvhp6QDP3ycq8Ykjj45KvMSpMm7QxtKzZt+jPB7BnOHP5u6HAEuiMnsio7e0Ne3r2/He8T4rjycnMnp77kcGovZGX95i63ri9duDDr1bWu+zpkL1rj1m+Fi6AUXkoedRGQmbFQJQWXww6wQk+IASssgRaaZrHZKoOCugIez49VVT9DNHwH98JAAErhWfgZkuFi8EGWpuXUrftocHB3oKJiQWnpy4ZxLYwGYA+8BDuhK7wHPSEMKuF7qIByuAjiwAMHk0d1rq3l5C970aLJqanQDeJgMbSCOrACOoIB2+EQDFP7mNdaAB9DJ1gLl4ETdsNWuAhywQG3q2hbh/shHoA1DufiiWkTgLGuV+Ei80b4HjrCSDXCjt936RdJ/feBL3vRN1AEfdRKHdMueF8tom+nxr6/glJoBo3BCrnQB3xgg2KoglhYCnWTR113zNfk9HDr+ljXvW7dAY0BWAQJaickO9wKzeATWAbd4XL1uD2wDDxwHmxSLyxQqraebw11AMh/Ievp+ISE2mecmZ6emZENLaGhuu1DaATR8DMMhIuPrDCwKHlU2wC+REKIP8n2+4ecnfa73auys2vXBu13uxs6HN2SkgYmJwe0X8cQLXNGxUkzY83MjJ2a9kzBnnWDE4dMTBtT+w+5W9fHj0gtLLjOYmmVmbEb/q0eFwH/zMxYCAuhrpqn2Anc0AkaqyRcENgM45Kamh0+33+Dg6/RtCCogO5wPsyEr+FW+A+0gydVmXQLjDCMC0pK/hUWdothHKqo+BTGQC/17I0hDWapKZ5mYaBgNSMwHmLURMPjThxyOJ2q+uZWuAG+UHUxPbAdqqALzIc1cB+EwCF4C/bBA3A+nA/vQiFEgRei4Dr4Dv4NwdABXlCzCIDWbr35WNespP4R6pYqaAXbYSc8C6OOnEj6Fnzh1q9yOMOgETSC96EjJAKwCnLgIgiHfWoB07dQCheCQ43CG2r70/3wNVwPt8LF8Er7Tp0IHIfTOW/54pnp6ZkZn0K8CpfrQk/4AV6GdrADbj3yNWkMI9S111XLs2ogAqKhEuqpz+FvK9iPSEnpPWDA5NTUvNz90BZQq/t3wxh1Nn/9MzN+zl7Ub97yxafudRBCnDrncjC6IDPzxfnza9OiZng6etCge1JT28bHmzcuyMzckJdnlp1v6HBEOxxt4+NPc8DaNj7+Sal7L06CW9fHuu5064M1zcyjX16wp+1Y17PJo3J6DxiwdOHC2a/tDAqaDJ/W1CyBB446gd1i8fp8e2ApdINwNQJrRgPLoBRWQCl09nqDy8tnBQf3UoWfmsLd8DE8DHfDFUedvCucV14+DTR4RcUlhoobDBgKVpgF+dBCxb7mhEiP+afDWRET1+T4L4APEmEdzIc+8BnYoRi6wCoIgj7wNTwEd8A0aA8PqW+5TnA+zINNqks+uAy2ww+gqcDaFAYGFGcv+hEK4TBcoVaXt4P98BCMhCTYBy/AXrgGilX1qKYQBWtgO0RAAXSBKDB/5yyAdRAHXtBUQLYNSsEHW+B7VanUB63g32NdL7+QhX/u8PQbkZLSvlOnsa4HVDAKeOFiaAJfQD2/UN6fHexJ/XtmL1oJzf02eTLfeg22JI+69ehLczidL2RlzUxPz8x4Dy4Hj6p49TgM8asXa1oC2XDZX3vJQojT5pxdwGSGm/4Zx4YOx8Dk5IHJybXpUjN12jY+fu7KlXNXrnxx/nxzrHz0oEEbjowO97vdr6WlPTFmjNkWZGb+tblMWVAvfldebu7gxH8U7HlO0/r43Ryuaf+XmVEwODFxzuuWoKAHVXatOTwMs/yOfA4yfL72UAkh8A5sh1Cohj3wXzgPpsIUKIRFEAY1VVV7oFrFizUqJnsDjl7z/gH8C6IhDO6EDwHQ1P7mB2EcfAwTIBqWQwGgEmM2KHQ4d76Q9VJS/5uOefmqrhPQHtrBEoiArtAO7CqqC4KroQWkQ0+4TZ3fLNXeAIZBGJjV3WunnDrhZ7gDfqx9seFeqAfTYBrY4T3Yr+7tCn1gLjwME8EHfcCuSu6bw/fh0BXqwiHoBfXUY8sgF+IhQVVprYTvYB9EwvfwI1wP0eqly4Z7oOj3Px9/kZnp6Xm5uce8Kz4hYd7yBUn9zTJPtWWYzDclGGbAmiMf8SF8Dc17Dxgwb/mC+IQg9aZXmRWsHM79yaNuPcHw+oiUlHnLZ8Un7FVTFy6AjjALMtXvSMBbsByuV0umhBBnn3M2Mwo8MnXqk2PGDExObhMfj5o5WpsHBT7Pzo52OPzzoGbA2iY+/skxYx6ZOtWMaDfk5Znn6ZaUZJ5kVXb2a2lphW73I1On+k9I3e92b8zL26DyrObEgJPpqrkpaMOTO1j8fWQvWpTUv3/tX0NCfJWVQ+FfmtZV3bbBMB6z2TSPB693hte7Mjj4CU1rDDXQDxbBtzAK/gVV0FdtbHMtbIJlcAEcgq/hbjA/fs1hCrwFcwDwRkS0Ky2dA9dArNp7sz+sgB/hHoiBCngTfoIkKIJK6AOvwJdqEHwxvA4JMBoscCFcAHPgQrCDDzarkd8Tq02jNoZN0BSCoVptZW5uEBoELWA9rII8cKkt7IHPYTF0gG7wMRRBPGhgQE9YD4/BYCiH92EU3ARAHDwDWTAT6qtTOWE4/BcugWYqu4lb36u2pwoGDepCqZqZAOyDQ+bOAup3BtTU1cvgE6iCoWBXS85fhWy49PRsxa5mgKwl49PkUdccM0Z0OJ0T09J6D8gd6xoH7SFSzX9tA41gFfwM10M1vAseuNy8FofT+ULWzJnp6ZkZ88EHIQ5n0QtZsxy/V7u+9oFAZsZmcIIDVsMjMBzmgwH9IMThjD4VL4sQ4jSwBHoB1SlsDWMdDR2OVdnZCzIzF2Rmjh40aPSgQauysx95ceqvx5gR6lEPbNshfmBy8oLMTPOvCzIz28THDxyZ3LZDfMNYR8NYx8CRyY++OPWeSalPjhmzv8BtHra/wP3kmDELMjPbdog3j9zvdg/p3r32PCfqqpkZDfQrJu3Mae49+syM9Gf/uW5w4nXuPToajjinpgXVqdMVJhrGNMAw3jCMu0JCGtep01/TrPXr3xYUVF1RMcgwdkMVRMHNYMAoaAQDIFKNI1dCW3BBEZTBVBWJ1hoJN1utDeLiBjdpMqVhw34wB9ao0dX6cDMEwSOwFB6EfTAIGqnNQpuBC/bCYHgeMmAwDPcbiukOj6mcazU0grpuffPSRYuP+Wrk5eYOThwJQK5KiWlqvLjQ4dw+b8Xi5JRLYS1Uq2fpDDZ4RhWQnwdLoC/0gmZwNzSCZaCpoLAd9IKF8C28oSLRWi6YDB4ohiK/IvZWFYmud+vb83ILYC/kQjHgNx+gFD6HQ2a+WQWXBmyFS6AD4LdXqgV8sABWwjUQ92v28RR/3ianTsrM2Ac3wR2ZGTvGulzHOzi+U8K8FW/HJxyCrWqxPBAF3cEHb8IsqAPtzc2cHHFO84EjHkh5IesFh7NBcsrAeSs+q739Ny170aLf3DLigRQ01BL7MOgFbeANiIX+EA4aeAP+v600adL+WDtnh+kBMwP64tvzH31x6qMvTp37+coX354/MDn5ydFjzANOsMp+4MjkjXl5tUPnxzyybXx8m/j4155OM/+66uNs8+m6JSWZbeDI5LmfrwRG3zboxF01I9f/7fLEucut62OHjc56xWmxjNrvfmpI4vi8nFyH0+nzVYSGtmvQYLjV+p5h3Kpp79Spc3NYWFdNC9K0YMOorFv3+rp1u1VXT4YaMKBMza7rAF6wQDHY4RBUQANoAx6YAMv9nv9nGFWnjvv882fWqXM1EB09smnTF+z2DbACUDuDd4Me8A60gevApraJN+8NgX5wCSyDwXDZUTUpHRAPlVAOe+BHuPQ3e47n5eT2aHnV5NTUsa7pMBEmQEdYBbtBM7uanNJl3opPHE7niJSUeSsyHc6f1NRMA9rBpbAA/gP7IRlaQjmUQxV0hz6wVT2bGb43hQgYdVThp9dgIkTNW/F8fMJev0eZD1wFO2E4XAAtIAa+9DtmD6yChtAMukAhrINlUAbt4TwVs4ZCJ/gQvoUvwArXqWL+hlvX/8gn6eTk5eQO7jEsL7ez31r47nm5nQf3cOXlHHvI3uF0vjA7KznlKtgJdkCN17cBBzSCCyFYbcH1/8V3Snhh9lsjUu485mnVRrXzB/fo9ZunzsvJVU9kfmbagKEq6mtw4JS+REKIU+pcDkY5cs4o5ij8yORoh8OMINt2iD/BVpwNHY7ahU3HO+beSam1MeuGvLw2al2UP/9nPB5zmP6ElyL+Fsx/jIckPlVYkKZp3QBNa2q1ZowfkT0zPd3nqzAMj83WqH79obAnMnKw3d7EMGoATQvz+SrACApqUadOIuyDT9SidVQOchN8CMGqwjwQDAZcDq/CC2DAkqCgNxyOwbGxD2ma1es9ZLaQkDbNmr0WFdUBLFCmKsA3A4taq2TGkRVQA4ehHKzQCILgfXgOSvxqUlbBq7ACboBOcBAuAWttPGG+DmNdU8CVvbAEauOM/nA37ACbw2lNTknyH012OJ3zViyJT6gGzW8v+M5QCHvgENghTLVQ2Ao+CIVPoBQADWxwNUyFJ6EaDsBo+BCug2qH0/nC7OnJKa3hC3X8xxAJY6Ax5AEQDz3gF9ivCql2hJZqyU5faAVlEASamjK7HqrgIrgLPNDQb0rrftj5u8PZf1j2wkVjXdNU//3FufVbxrpeO2qXqf9vRErKvBWzHc6GsEdNgbWpKaFmzYQCh9P2m84f71rcuj52WHJm+ka4wq13Get6+KgNCN6HLRACYSpBbn6AN8NHbv3SscNcf+AVEEIE3Llc9P7qpKS28fFPjh7zm9vbxsdvzMurPWDBjMxjPhzYv9etqZj1eM9ixqwaNHI4jnfMfZNSV2VnH13ZvtDtNpsG+9XPUgD/79zW5eTOzFhmsQyGcKiubZrWIeuVpV5vUWnp54DFEqppdp+v0kyqHT78gddLScn7lZU/WyyhmhYCoVAHPoDtasn8l7AW+oIN+sEv8C4EQQ3EwXWwAf4BMz2egsOHV2tasNUaabXWVa3OwYNLiormwjBY6LfJu1VlYT3wERTAlTBX7bpkBw/cCAY8Amau6wdIBS+MhKZwIbigxNwtU4OCX4OSrXANAB2gE0yFDVADbaEPeOI7xSWnpBz9Gk6dnZWalgZr4TBoKp12PsyHVarbZulTL/wDXNABlsHPgFr+NQg2wSAYAWVwrTnDwXyK5JSUqVmpYFEzZUdALryt9gcCGkFf8EAFXA3RftuiAhfDYAiGKjgMK6FI9TMMBkNz8IIBO+ALiD6FH7ncHFiragL4Owwvw+7shY7BPW5dl5N7zIfHOp3zV3yQnNIdflTXWPsr0C/JKdfMX/HZSX7yB/e4za13UvVZI6FPZvqascNc2q+vqQU6w1r4AirA/JXDolZ9PQRD83J7De4x9HhdlSZN2hnbzvHM6KMvTm0THz/46u4P3DbotafTzLYgM7N2XZGZ2nx3RuZvHrjf7d7vdrftEI+KWT8/fg51/1430KbDcY8xFzNtOCr3ud/tfuC2QWYDan8+cRpVnEvcup6Wmuo/wqhpdbzeO32+xRBkNp/vJa93QkhIKzB8Pndx8WyPp0DTggyjvKZme0nJrJqaJvCSYYw+dGhFaelyiyUEKqAbXAWrwQ7fggVug0gIgSoYDPXgU7XfUihcBWXgCQlp5fHs37p1QFmZmT3F56vIz//n/v2L4Bm4C6ZBCWTDYbBDNeyAhdARpsN9MAm+gc/BrkZpu0ACvAmvwItqQbpdXXQ43ATN3Pl6Znr6oB4ut94TLvILx+tDb8iBj2EGZMMt2QtrxhwnE5Y04Kb5K96NT6iEX0ADA86DLrAGpsMXkAlXwFBVd/1quB12wyE1aB4M/aA+NIErIcIMsGrfqfhOCfNXvBuf0BKWQAZUwZ1Qo8oOFMJGiIf+sA6KwQaHVAdXwTQ1hL0KGsA1EAlANcyC1RAEa2ATdD71X9SXQzC8oNK9wCaYDLEwDlq59RFjXK9nHn8v+OSUlPkrZjucO2Ef+MDucBYlp9yUfHKF6DPT08e4MuB6iPD/HQza5OU2H9TDlZmeDnZoDNeDAR/AfgiFVWCDp9X2pO3c+oQxrrkn6KoQ4gx0Lq+mN908MvnmkclmcGmOp3e7Lqm2zmhDh+PRF6e+OyPzgdsGNXQ4zHH2Qrf78+zshg5H7WH3Tko148Wrj1zwXntO864FMzI35OW1PdZgfUOHw4xZ/bWNj3/0xanmz6s+zo52OK6+ThbU/424dX3MsAfdep+8nIdT0+6P75TgcDoh2God6PVmGMaXFsv9Xu9DFkt5nTpDNC3Y56tu2nTo/v3LDxzIslob+HwlZWUr4R61/OgqaFle/mpNzTdqGP08uBk+gubQGgA7BKl7r4ZmsEyNI9vBgLaGUVW//oDDh7/cteuBRo3uDQlppev/8novV6tSgNaQCVNhAYRBMayFsXCturKroS28CB/5TRk8D2JhEURB7LFeDyMvNy8vNw+iVZwa5HdvNRTDemgOYyAMWufl7h7UY2hq2uj4TscoVDl19qzM9PTM9PdUfFkXusJm+AZugYtU38xotSncAu/APtgGFwBqzbsHDNjmcGr+Q8zq5zpwFcTBZ1AMOuwCoI96zZvBB/CDKh3wLmyBVlAMGyEBnGo67w7IgjrQAz6CMEhUZfBPKQtcAg7IhvXQDFbCzdDV74CbM9PzshfeMHX2q8ccZ3c4nfNXfJSWmpq9cKvDqU2d/fLJTy3Iy/kOcsB7VK1QH+S69YOZ6aGQB0lggytgF+RCGHSC3qBBGQAaAAMy03/JXnhXatpdR38whBBnoHM/GDWZucnj3VsbsG7Iy9u/192mQ7x/wGo+/KW35y+YkblgRma3pCRznf5+t3vBjMyGDsfNI5PNw+6dlPrE6DGPvjj1N/GoGbO2OdZT1x653+3euDbvDN+5VPxV3LqevXBhZvpGGAc2t37xGNebySk5AJRrWnOb7U6v9yOvd0RwcPvQ0ERV1cjweisbNkwMCztv797FZWUF8JZfDUsgBv6vpuZ1WKoiqjpgVcPlBrihEIIgFqKhDvjgICyFy8AGHp/PC9Sp0zUkpHlR0dterw8eAvMf9UpARW/3Qhf4J5TAHIhUcyLNgKAhPAnT4G3YAc3BAiFgQDjMgp5+pct9sAS2wEWwGbzwFiRBK3XALlgMIRClQt5y0CDarV8/xpWVnLI2OeWeo1/n5JSU+IROY1zDoQI0CIEY2AeLIA8GqahXg8/gcxgK9WC6mm9gV8Xnc5MGXJqaNu9Yb2YVVMFyiIWLYR3sg/4qcAfqwjD4ElbAJxAE7UCDAxACTaAGLHAAXoML1VXb4FLwgfWoDYf+cuZy+IaQCD/D13C72ujVUG83cIlbrzuox23zV7x9vEAzOSUlLyc3aUDP/2mSq1t3Q3vYADugB5hFmvbDR9AM7oRgNTPErF3ggI6atsMwFkMcHL1D1Uq3ngd3nXwfhBABZDv1X3NnjYaOmKuTevvdYPzm3nsnTdzvdn/+cfb+vXs3rs0DBo4ccXVSUu2RbePbP/riC689ndYtqXfbDvG1keXnH2cDV1/X+4SvtuH3pziXuXV9zLCxbr0rDFdLy4Fhmenf2GyfGoYZHhlW6zUez5uhoYlmKUefr0TTgjyew0B4+AURES0OHz4AE+BBlYEDdsILUAw++BL2QBewQxVYYC2shwFQAvOhBzQBD3SHH2A5NAKvYVQZhk/TNIslsk6dLiUlOYbxFDwKVx15HbNgGvSGnXA/PAkt/O49AM9APqTCW5APCRAMFmgM0fA5bIUboRDeU9uTVoEP2kABLIE90AM+h+8gDhrBHjBUgSpTDqzMTC/NXrg4Ne3RozNh8Z0uX7l5Y2Z6Rmb6x9BSxcq9IRemwK0QB+9CMTymtqFvDW/BQogCDVZBfPbCvfBoUv/rj3qKhvA19INY+AVyIQlC1Iqu2qkITcEOVmitIjyzG19DM9gJHrhSzS417zU3ptrrcFY64hof/eXg1vXshYuyFy6aOvv3C3Yejzt/L0RCDfggGOpBOcyES9TE1lofwqfQym9jrd/2Z8ywsW49MTP9p7wc19TZs44+5jhsEAEdYDu8C50B+BquVp+6g1AOP6k3KAg8mhZps3WsqXkRroR7VW4lH54CQ73O8o0qxFlAW7n550D34RxkTkLdmLfOHMRvGx8/cOSI3816Dr66x7zPV5yG7onAykzPyEx/De6Bbn43e+FlyLNY7IZRz2rtBaEez0uRkf8Aamo2l5cvt1rDvN7DUVFdGjTovG/fspKSCrDCRrgD+sG7MBeawcXwAQyBz6EM6kAD2AvBcJsaIv8J3oGmsAFuAisUQA7EgD0kJDgyspemBVdVbT948HNNu8zn+wSGwL0AVMBTsA4GqeDgI/gYHoAbAFgCr0EnSFbLpzLhW7gCvoL2UA88sB5KoQrOg/PBCxWwVo0OV8AGNQXzAggFC+yFQhisnvc9+AYGQ2c4CO8kp1ydnDLqmC97Xk7uGNcYaAV5cB0AG2EjREF7GOQXeGlQBV/AAgiG3vAL5MC1UJac0r72KcYMG56Xa6izAb/AV/ALnAdDIVTd/hl8Cu1hO1wIPqiAXZACdeEDWA810B3CQIMNsBOudTj3JQ3odMwrcuv6mGEj3XoU1IUfU9MmJA3of8LP3bG5dT1t4qS83FI1M+EXKISO8D2UwDA1eTcLNkFX2LJy87KjT5K9cFFm+gpIUjNc9zmcPx5zBsXRBvW4wa03VH8rga1ghVsgRuXaD8GHUAxBEA/1YZ3VGmS3JxnGoerqJYZRAilQAHOgKSTAd/NXvHLqqhAIIf5CEoyeQR64bfCjL74gI/XnvOyFi9JSs+FL6Ar3A/ATTIUQ6Gi15tpsjauqNlutvb3eD+vWHVlR8aXHsyMy8obDh1dGR3crKloRHBwVGhpXWLgTrgQ3fAmxsAcuBwdo8B70h3qQAz9AQ2gPPf0qxgMVsAq+hUS10uhnKIVD0NxiKYqM7KZp9gMHPrTZ7jGMQp9viWHUg/vhX9ACboNwv8zTBpgHLcABH8HtcPWR170cMiEUWqstiLywFhpCnEoWVkAudFOnrYGvoS0Eq/HZArDAbrgadoIPhh5Zk+jT+IS9x8vJuXU9beI/83LXQR8woBRyoAFo8MCR5ymDDKt1H0R6vQdhL9yvVvd/FJ+QZz7FmGHD83J/BjvcBE74BVaBFcqgGG6FVvA2bIT2EAI/QCtww26IgcHQAAAdFkALCIb15v6lDmdccsqIY4aYmekZmelzoD1EqNs2Jw24KDXt6eN+7E4oe+GitNSpcDHsgkpVcHQ75MEV8KPaatWAnJWbj/idWYWz4cfaHX510oCY3+1V95adoQ1oqjKDDh4ohN5qZdJBWArtIA+2QTs4bLVG2e3dzTPU1Hzt9a4GDTpDEzAgd/6K6RKMCnFWOMdX059d2sbHH73iXpyjKqE//AjjIQseh2aQBHbDqIyISIqIuMbrXQLB5eXLNa06Kup2m62R1Rrh81U0aXIH2A8cyFEL4WOgH+jQG2LVoL+5SsmAjtAJSlToFgEREA7h8CN8DQZkw04IhTCwQTPY6POFFxe/W129y4xfNS3aah1hsdSFcdAXRkLYkWOgbWEMlMPn8AhcpSpN1rZuMAS8sB+qQAObypsCXqiCTRAKP6vpp2YlTnPmogWKoBhaQndVH2A4NFJTHWqgBq7Oy60zqMcNx6zW7nA64ztdDqHwPRyGrXAnjIfzYbxf5f/1kBIS0igqalZISAKEwfMqEgX65OUOGdTjnuyFiwBoDXVgutrq6ZDaecgJWZAG2+FqaKiuZQuYUyTNMqh2WANvgQbBsBoiobPDGTl19svHiURfzUxfBp0gSK06r4Hm2Qv3Deox8Hhl6k8saUD/+SvmxieUg1dNIQXOg96QB064Rq1+8/zmsZnpr+Tl7lFTPvwbcH72wlWZ6a+e+NmTU4bCJqhWT2FOGLgYlkEWlEKJmvAQD91gC5RoWog5E9owqi2WKGgJl8FhsJhTUyQSFeJscS7XGT3rGoHugLTT0Ap0ffZr70AlRMB1UB+WwfVwKXggxOerAIKD29arl2yx2ENCmtWr199iCbNYQiyWEK+3ErSGDftERSXCAfgRNJU4rFbR4bfghU8hH+xq2/dieAq2AOCD2fARXAIaXAmbIEetc2oKncwcZGnpNrWCp8owyiyWBDDgHZh51JfJp/AEeKAePA6L1Z6ZZquEl+BDiIFbYDvsMb+C1M49xZALjeEWCIfv1I6ampr5twsKIQE0qAMhYIWnIEcV0rfDPngcitz6+DGuOZnpGb955TPTMzLT98GjanuqMdAcMPfAhLnwAsyGp+rUubtu3Ue93gNlZfOhFzihxq/kUGO3Hp2WOikv14z8WsPl8Cl8A7dCExgIEdAYPHCVX3hn7gWQoEL5YvgA3oOWYJiTU6E9EN8pIdbpPOZHKHvhByqiDVLNDNS2uHV9jOvptNRJtZd88p/MWKfzxdkzklP6gAUqVe36cAAa1pascjgb/OaB7vzdEAKzYJ3fvgY2+AZmQwx4T/zUI1NGvb3infgEm6obUAV2iIIuUAkZsN2vtEIU9AHN693g9f4Imtf7XU1NNbwOU+BKWA45DmdIwP9nlyZN2kk2yYyeQdp2aL9h7bpA90KcKm5dn5GecU//DLv2Tzisak+aQ4rmhLlg2AFGZeWPgNXaQNOCLJZgw6gxjOrq6l01NQeqqvZWVbk1zWKz1QUb6LACSsEGlbAXPgUvREMHWKo2lK+GS6ARvAYfwr9hC1wKESoRdQ14YKNKaNWFKyEI9oWEXO/xvGwYv2hauAoIzJr5j8MvAHhhBiyBThAJHugNH8PjcACAL2AcFEAPqIZQuB0iYKOqdrQdNsJVcBWEQC/oAOtgp9r8/WcIgU6wCgoB0CACroIF8ApUwzJIg17wfxAD92Wm227r0desDOrW9dHDHshMNzOsb0EiDDnyC7AdTIJCTVtZr156aOjN6vYW8BY8AZUq8iuDp+z272Njp9nt5jzLCiiGLnCdmniqQQ+1ar4CDDgMP0EUtAWLWm3zOqyBTuoD0FPlF4+77Mat62CBC2A9fK+qUxXCcoiEAdAle2HJbT36PJ066bYeE2/rcdP/lCsdmTLq7RXT4hMOq/cO8IENNNjlcG56cfYrx3pce+gGq2GuKqf6EXwFHcAWexIZSsevofC1sFXtSgVYoC20UoWfytSNQJVhdKqpWVVVNcPjaQ+T1O1D4AmwgnbyVy2ECCwJRs8gxyyML84Nbl2feNcznyxoGhV1l8USAV74GHaqZdc1cAiyYSuEVVR8efjwYp+vUtOCfL4KTbOVl685eHCBxXJeVZW2Z8/sQ4fyrNZQqIIBEAEfgR3K1AzLrqoe0I2wDbaqELM5XAarIAougzCVN60BK1wGbeAwbAcNqiyWunXrpoWHj4+IeNDn+8TnW+m3NvxaiILn4CN4BHbAdeBQu0E2hP5QAw/CbHhDDaGahYqCIRguhWIogwqohFv8CjkB7dSqfxvsUjWkbobbYTOsVynVxtAPiuBR2Az/hH5wCA7DYbjMrY8ePWz606mTbuvxnFu/ED6BQ7ARZsIHR75F38Dj4eGtIyNvP3gwpaxsurr9ANwNlXAP5MJ3cH9ExHmNG2cFB7e1WutCKfwMV0B78Kg5CWYprpYwAnbCNvgaQqCOOqAIDkEodIVw9X7VBrLH/qXUreujhw1363ugAcRDKXwKm+AbuBSuVl/p57v1ztkL8+Bit/7UaNf0GekZJ/9ZdTidL86elpxyKawHVDD6Q3JK57dXfHassW8LaBAD14MN3oTXYTt0gajf7E1/YiNTRr2Y9SxUqGDUA9XQCKxQCCtUQh21/L+DYUyC66EUyqAMSsABU9z6LU+nTjn5pxZCBJAEo2eQtvHxtSX0xTnAf18ld76+Z1dOcfFs8FmtdTWtGq6GlbAVDCiHxVAHbgUtIqIfGAcPzrBaG3i9pcXF/y0v/yE0dIim1QFvaOjAoqIvSkq+VSm0q6ALlMNWuA4uAKuaM9pQjXrXqERXHQhSIZEHiqACDsIhsKjwVIcvg4OD6tXLtNu7AMHB10VGzrBYKr3e+Wr/T6AjJMInEAfXQBBY1a5Cps5wJXwKiXC+Sgda4SCsglegK4yAUmgBEUdNRqwPdcEDd8FAdWNHeAQioVQFfEFQF5rDz7Ad6kJdqAN1IAK+cutzl70fBB/BQXDBFXAXnA9fw9MquFkIc+rXT2nQYFKdOrfGxEyvrv7iwIGh5eXz4AL4L3SAS+E/FssL0dEP1q9/j8932OstAcCcVvsu6OoCrWABC+yHuVAOe6GnWqRlgXzYADEQCV6ogcNQCT4ogOVgN2M+M5tupjbduj562Di3fpNatGSH1hAH2yAB2qj31Gx2iIdF8A+4PzPdMnrY8P/p0zsyZdSLWY/BcjAcztLklGtHHqdMwZFpyARVoPQqCFLL1P4H8Z0S3l6RnZySCFvAppLxXmgFF8E3KlL3gg7rYA5U+c2EjoRI2AGv5OV89z89tRAiUCQYPbOYtfQD3QvxF5iRnjGy7wO1EUB8p4SwsDi7vWrHjtvKyr622epCWxgCOmjwPlwF3c1ZeoZRUafODWFhnaqqfqqq2mIY9cPC7tK0BpoWahgVNlvziIg7y8vLwAJlUAkOiIbzob76t9+sLVoN5XAJeGE9bAfAoipZ7oYfoBtEwGpwm3t7WiznR0Q8EB7+ENh8vmKf76DPV2Kx1K9b99nw8MHgg3JV/d5MhTYC1NTPg1CjYlyrqoRfT62FPwQeWAy5cA9cD2Zlom9hyZHBaD7MVjMZWqjksbnUqR5EQwX8AD/Cj9AChsMoWAkPgvl/UBWkadoKm+1Rn+97GAqJ6uSNYQS0g0pIg3S7fVdMzFsRETeZdwcFtY6OftrnO1xREQzXwUj4CUrgQp/vgoMH3/J691mtkVZrJAAtIAxi4T21hsn0HcyDSIiGZmoZlhd+hH3QXa3iMnN+G9QC/K/gQmjKr9HnyMz0faNdL40eNvy2Hg+69dugGZRDKVSDRWVVN8B7cNBvvuYGWATt4AZ4CELzcq+7rUf//ylFGt8p4cWslxxOx6S0+48Xibp1PS/3W9ipPlpAjcqg++AQuNfm/m9rqhxO58iUUS9m/Qe+g4PqVEHQHHpDMSxVQ/nd4SAMBv9qU7PgAbgcyv+n5xVCBIoEo2cWWVB/DjCzWR/OO3D++W8cKrxjeNLteTm5bl33eMri4vrFxHTW9QmGUQoeiIKbIQRuhJYqjjTXMBnBwReHh/eC0ODgXuDVNLumhRhGmbn3d2hoH9DgHdgG4RAG5l2l8DHsg/3wMZSr5U1XwwHIU1Wc1kEljIB4uBZ6wreggxfclZXvGUaJpoVbLPUtlnoWS6Sm1a2sXFRa+ixcD9/BejWv0a5qs9fAKtgPfeFj2Ab47R7khZ2wGgrBgElwMQANwAfxUAVzVEzzNXwI9cEJGkyGfWqddTE8C9tgCkyAfXAF9ACgCYyFRioqvdNiCbdah3k87xrGbWoOgP88wiToBQ0tlgKLpYHNFld7R0nJ9L17J/l8t8MlANSBodAEQiDN47lqz56Rhw69e/Dg9MrKHSpaioX2sB7mQhFkwzdwCbRQkxPMcWc3hEN3CFIlArZCKPQHYA1cAU4gLyd39LBJbn0ANIOyvNym0B+qoQzs8JNa62NG+ZdDOCyCHwFYBevhFrgaGoELvoJ/u/XemenFJ58idev606n/cuu9nk596ZgTT2ekZ9zWYwJMhF/ga6gAwKPe9wL4Bi7PXhhyW49+/+sy//hOCW+veC8+wQ47VDAKhENXuFBNww2C7nAFpMH/QTk8BbOgP7R2OKP+p2cUQgSK9rnUGT2TvDsjc7+74L5JEwPdEfEHuXV9/MixFt+QunV/3a/IMGr27Hnm0KHvgoMbNGt2vWH4qquLt22bAedDTwiDt+AqaAIafAk7oCw8vGdISIeqqk3l5V+Eho40jEqvd0tV1XJoZbWWhoT0slgalJamG0YirITGUAcOQgzkQGuIhL1mOXToAqvhWgiGdZAPkdASrlC9NkO0A7ASdtlsLTUtuKbm5zp1Hg4K6gUYRmVp6RPV1XmQDO3gIGTBNugEuXAFHIbvoRMMBQ22wUywQSdYAP3UWqW28AWEQgGMUPHoo2oHqX2wHepBKTSBUNBgJ3SC5TAYwmEmJMK98CNkggtCjnwHDHPXTau1l832sNe71ON5GewwEOL8jgE+gO8hzmIps1ga+HwFDRr8KzS0c0nJ7EOHflHbn+K3fz1QDN/BTbAfXoE2sAcugQ1wnjp+OxRACHQAuyrUby4v2wFt/Y7MhXCoD7GwCg7DtaCpAqjb1RYD5fAaWGAwnA/A09BcvaSN4Rf1VhbDT2qcOtFvP1Kz83vhFxgAXofz3UlpKScuR5+Xkzva9X8wWGW+308aEDlJVQx16/rHCxdlpuswAoBqmAYroSPsh2qwQQHcorYnOASLk1O6HX+s/7iyFy56OvVh6KsG/YOhAj6GUOirJi1UwOdwEILhZqgDNTA9OeWOP/CMQojTzKLKpkg7I1rDWEfA+yDtD7e8nJzkPg+EBT1Sp86VhuE1DI9heICGDe8ID29bWbmtsDBX0yzBwVFqfHY2/AJBUAEF8LamHYC2dvtlZWVflpZmWyyhhlEDvqqqT6uqvodx8JjX2668fFZNzQZVZ/EW8MA2OAxroQdcCkFQDp3VvpcWVU78YmgOJVBzZGEgO+SDDl0NoyokpHdo6LWHDz9RVvZiTc13xcUDqqvL4HFoB0A9SIFesAyCYBd8A4NgmIp7LoB/Q3NYDMCPKn1rfufUh3h4HT4ETY3v+6ARtIMSaOlXxNQC7eFeWA7vwkQYARWQD9WQBpv8vtDKYQasg0e93sKqqv6GkQ/nQQS8Dl+pwwrhJfgJekAlGKGhNwUFJRQWTigpeePQoXnwOegQAiFqJmIYBMFKWA/rYR40gwNwoyoOZfa2Rs2ONQv1G+oZt0MRNAVNRbe74QBcBHZYolKw5uTLUlgHFrXYCwiCUHgVPgNAg7rQCcLgZ/UaGlAXOkAR7IRCCFMtFEJhO6yFr6G1W5802rVwRnr6MT/Gbj1/Rnr6aNc0GK0iUeDG7IUNb+sxMC8nx63njx52e2a6XUWiZg//AaPgR6hRBQQeUJEoUBeGZqbnjx424n/93yppwE3xCQmwGLarF6QagqCJyvqbn5NuUKGGGqqhAtpnpu8cPWx4wL8ZpEmTduKmrdq88X+IXcWpd9vViW9/vvz3jxNnhpkvv97usg4dOiUAbl2/d+ADxcWbnc7UevV+3SKysPDtgoJX69bteOjQt1ZreFiYIzb22i1bpvl8N8E+WAlNoTF8A52gI6y12Q4FBfWoqvoIDvp8NZoW6vO1gJF+ua6v4XWLpY7P1wZaqeJHP0Fv0MAGbvgWbgMfeOBd0KA9NICtUAKlYId+qqjQR7Ad+oPHal0VFjYM8PkOVlUt9XgK4Q64SNWDw++HnfAmWCFF7ST0G0vgSxgDu2AuxKjC+x2gGD6HcCiCOIgBoBLWQVswQIMDUAV3wxvghAawBh6EdrAccsGAHLgGesEmmAsJcIca0n0f5sPF0ASKYC3EQWv4FBzqWXIsFi08/E7A59tXXr7IMGzggI1wDfRUF/ILzIYwaA6boSVY1Lbpu2E+xJkTPQHIgQ4QoTK7uyEaOsNX0AicsFHtwBQDGyARwuFdSIJ8+BEuBHP122CIghnQHEphGzSESrhEDdAXwc9QH1qCDSrgO+gE30AbuEEVDX0PdOgFreBaMOApWPvOioVHr45/YFhyXu75folzf2UwG/JhrPrNpJYBwAbIAB8MhCZ+t6OKrWbHJ1S/NHvGsU5+XLf26OvWHbAW6kJ7qIQ8uBQ2Qif12auGOZACgBuWwvnghLYO56pJafd3OImNSYUQASFzRs84sobpbGHODV08r+TRf7xprgtxOJ2G4Wne/DpdT9u7d6phePPz/11Q8EpUVK+IiPaG4WvWbIRhaNu2zbBaQ6ACLoFboRg2wk1wCdRAiGFUaFpoSMhAq7W1YZT6fH3gAb9I1IBOMNHn88AeOAAWtRrdDhqUwU9QBmvBovYxagqrYTvYoQauUKPe6+EV8MJoaAofGIYFDMPwaFpwUFBnsMDL8I1fDtVcM/4J/AfCwAqPw09HvjzlkA6fQhxEQQd4GMKhUNU/qg9NoB54IQq2qejKUNv8lMElcBU8Cz3hBXgUhsFj8F9oBF5oA/3gG3ge3oLBcJ+KRCvgWhiugqEo6AEVsBQuUtX+bSqw9hlGlddbHBHhtNlCoRlcCavhZSiCZfA6xMClalFOA+gKhlrR3xQOwE9HrpiphvWQD639sqdW+Ar2wdVQCUUwCOLUip9NauPQCGgKTWA6rFahfwS0U6/MHvXt7VMTFXKgUO1c1QxugAKYCj+q6HCoWgG2FQbBFog75h5Fbn0//BdeVXNAa/0Mj0MVRMOTkA747Wtgg1nwGNSFZvA6LFMzfYNUqn46rPlDFUDNGvjXQDAsU7NFW6m5zuZnr0oVmfoJ/gu3wn+gISx06z1Gu55Y+4f2phJCnAYSjJ6JJBg987l1fcLtqSsWt2jU6M6mTdOWvF31dOo/Z6Rn1NRU1q/f6qKLkisqVv38c5/S0m8bNx4ZHt7KZgvXNJvHU9a48Q0NGnSuqTFrYVZBOLSEOhALVrNcqGEc9vkKDaPUbjezU/PhaRVJAJoqw94I7PAebIZgqAYf7IYl0AYehgLIViXx60NP2AZFat16a+gAy+AicKmV7yE2W5Py8rmGcUDTQjUtGDzQE+bCa35D6q/BIugKwRABl8CL8KHq4VcwCYrgGr96QxFqn6Gd8AOsg2bwENwLG6Eh7FHRTxnshoNwAD79f+zdd5gc9Zkt/k91T0/WaJRnNMoSEkigAJIAEYTIOSebnLw2IGcbG3udjbG9Tghs7DXRGGMwGZNBBBMkgQJBAaGs0SjHyR3q90fdr+6w9r3r3Wd3wffX56lHz2imuru6Qvep9z3nvFzLP4VnPoMZvMIvQ9G3J6fQGnrZu5H0prOBjHaSZhAl9A/EN0tUVtbQ3Pyr9vZne/RI77vvLSUlCenvzmHgZ7zMZEaE/ZbmWe4LfvbkU3QSFSxgQ9hFc0lzENkQPoD36c6UoA2dGuqF7aTYzpQuNea9mMobFELee0SGSt5nEXliStiXkbzD+rA9lRzNAB5iOMcQk+MVrmIw53TZqn+DFEewnW/xdvjlo/yK0ZRTwhks5JKQRdrCd3mak0LR/Xje4iesBnP5F1o48D8a9oT1jZvDj+OYxGIqgzL1ZAo8SzslvMJcvsvp4Gyu5r6/nmJaRBFFfHRQJKMfOYweP27T+g0f9lYU8X/E/xqkdPrPqyt+VF09GYVCS+/eZ7/7xuQ/3jIziiriOM5kqoYPPzmfb66v/3gqVVooZOM4l05X5/MthUK2pmZUZeUQ5vAcaWppI8cuHmJZodDa1nZHPr881JwOZh2fZTGruJrXOCwQmsN4lWUhv+lNLuI8BvFNRnA/JXRSzykh9Wk77fQmw3J+ysJ0+qHa2q/X1v60vPyYlpY7s9kFoUg5kDNYxZd4g8+zlJNCtFOWPTmB57meP3J7SLlP4pySSuqdPMN0PsUaDiWZcjSR75ChjSbSbOBoBvI2n+cAOmgPyx4cw3aWsSbwswKH8Rtu7NIXvpM/UMPbwcwehb/m2cTL9Ghry8Rx27Bhp4wc+SUQB5KXZFtm2IfeXTIvcSAt/Jpl1IRfjmI0K5OIeAYH8o0NvMA2hrBXiFyNg9xzCU+QYV9KQnm4QGewNyXhTRuREGjG0cHswKoxkEPCjUcbbSEB/kRaaaSUDbzGCRyM/zM/S3JqJzGSW3iQ3/IS0xgSCvDVnMgwvsG/8kk2cTIVYZhnLcfRk5t4nD8yNKgL/sNXXDjEyduvTQIHuIs14RSq5iVKw+DZ/bo8wShmcMD82bO7Rv8WUUQRHx0UyehHDmMmjH933vwPeyuK+D+iaW3jbTNuymT6plKJl0IqVZVKVXV0LO/oWNHWtnrx4t+3t28tLe0eRal8viWVKu3oaFq37s44zq9Zc++2bW+k05WZTDeGE3M3FXTSxL104wg6OaWjY2Zn5zNRlHDHg+nDt/kq3TiS8pBsP4Qz2EQJvbiWsYGONHMKn0iGy9NJjj3JMzvkcaaSFMzy8qaePW8oLT0QVVVX1Nb+qLPzzc7O2YGZVXA8g/klAziO0jARPsnA7x2Y7stMY1jgYTtZHqY1/pxW5vBdxgfbDXrwGfZnOwM5khpq6cEP+SaCnSjD9en0fQMHfqt//0+nUrNJeq+JIezjLONzvMf3Wcyv+SE/YSlbQoO4wCrmMSUws+NWrfr9li2v5vNtdXWHkWSMpEOSfxyKeet4O7zW3gzmgbABgt4gqfyNYxAVof8+mQO6sM+I5SETajavMjXsxpgmFrI+VEOT2ueerAmBWYnAYI+gbU1qqwlHHEHMA7zKAo6lP0exmjuqq0v79buEeRRCYf5vIh1+GMxU5rOK4+lJmlxg9hjH6TzNEA4LxyjXZVLXeE7gRSYzKClm1w/4G9qAfw+bWUAnGZJqfVUYD/tCsuuiaHDQkJT8rWcovW3GLU1ri2S0iCI+iiiS0Y8c+tT1K7bpP8qYsP/ksrI9Nm/+0/Lln8zltiKf37lq1TWbNt05YMBpuVxbz579Fy26a/Pmt1Op0ny+Zfv21zduvL+iYkwm06+6+vBt295tbHyotLRHEDXuy2O08SRTOYRKcgzmsmx2Y5gsH7MHI+nDWOIg32wPIssj6eTlZKBoaFJX08SdDKCVl4KJPum8r2EB6XS6vVu3y6urPxfH+UJhR6Gwo1DYWVKyT48evy4pSZw6bbTTygSEzM5c+DcXapYl1IeqWEKhthNzIxdxddjgd/kxG4LCDy38nAX8nA7epIM0eS5nAx9jHu9yTrduhWHD7qyuPqh792OGDr2jqqqax0LoTzWnM4BvMZ5bQm2yLugcthLzNhu5sIvXe0RHx1HvvHPzpk0zBw++aNy4L/Mq2z545BexgfNClhD6M5EldLIzeOHTYX5mok9oppUeHMDl7GAzb7KGnrxMEycH3WfMMhr4PlN4kaWBwvZgP2I2h9IpejKYZl4PQoWkUDqUARwVvOeYzKGdnTurq/cdPvzLZWXPcicHnT3tsr9WUq5v3EQuUNVuZMJhzdNR19Ad4XxI6vop+ge+vpoOWsLDU2EbakEJq/7vjPC2Gb/+9PkXdf1N09pGBpBlJk0I6bnDOJ1m7qGZsijqG0VtXMqLH3zWn/CHLnFdRRRRxEcLRTL6kcPo8eMXzl/wYW9FEf839K2v7t37E4VC9r33zt227dElS86M4/XDhl1cWtojikr69x+/996nrF37fElJRXPzwl273u7d++OVleNTqapCobVHj0uz2fTWrW8EfeQYziLmHIaFzJqIVio5N44rmc2qIBZsDwO7l/IuO3maDiqCQvFufhPIyv38MARzfp4xPM4W8vTmpCRVKp9fnM2+k0rVJvn2qVT3VKomlappb3+6re1+zuCPLKMSRKGGl+M5djKCh0IGe0lop+ZYwUwy7M0drKEb5exNFd/kFfA2X6Y/d7Afd7Inj4RJURWczWi+lE5/va7u4vr6r0RROp/fmc/vSqdrGhq+26/fealUlnwI9NmfNA/xWXYEvlvHN9gQuN3ZVAT7UZ485Ry0ZMnvly//5erVd5WXl5eVLQ0zqyLmkCJJSEgFuWpnmEKZuObXffA0idjIIk6mgSy9uYAaWplIO9WhtZ1w9xUhVeBpjuBTbKQ51FPTjKJX0NQKvf4KynmFlWHDNtPrr07b3p2dLRs23Fpdvd+oUf/aq9cJ1G5Y9+PPXPDovxnLdO/MP4yfnJDmBIWwhdvqGhZ+9frP3DvzJ3UNb4YBs8IwpAILeJHz2M4L4RmyYftbmE12/uxBZ087+2+R4MbbZtx424xn58+uOHvaSR9cIcMERjKXt8kHyUQFR7APa0lTHkUnR9Hh/IQf0sFGLmEO57L1P1WULaKIIv7bUSSjH0UUDfUfcRQKraipObGycmJj4/V9+x7Y0HBSKlWWSpVmMtWdnS29e4+YNOmSTCYTx1G/fldkMn1SqbJ0urJQaCXVrdvxlZVT2RScxTXh6xwRT5PiMbYk36+M4R3mU0qeiDdZzuTAoh5kZYilPJ5lfI2f8Saf4+iw4WdwIXNAJxH7UJ1Oj+/omL9168dzufeS9eK4bceOa1ta7udazuabrOTFYAPqZBVPsA/f5TLOYyZzKSFHzFzmcyDf4UqO5Ws8QF9yHMI07uAGfsan+FoooZXzNa7i+cAUMSKKhhYKvXbseLZQaE+na9LpmnS6WzrdraPjvc2bb+/R46Cysnd4MbSYo1TqtCjq4GP8ArzKed27T+3V6yKygRynQpxnmnf4PSUbNvy5srI2iqo6Og4NlG4tU5gSysApFrOli4Q0kXsWWNRFiLmUvnwh+MyS5Rn+wtEsDt38pIy6jQxHsZwayriJwUGcujloDKIwuGtQCEzIkmIYY1gWXPa9eIrXu5yz7/FHyogKhc44ztfWHlFa+lQcXxxFh902o/7saWfu1lPWNTTccNctl0w/kLfCISjh/fGT22646+YJ+0+ua2i4d+ZDl0zfgzeSC4JSXmIjX+MgvsjBPM3CsIVtzGYQZ9KwvvHwz1zw864keH1j46fPv/S2GQsYz8D1jft+5oJvd1kh6fsP4BC2s4tyYrJ0MIpucfx+4mCLotGp1OVRtIwL+DS1nJ1U5Z944MH/2KVeRBFF/I+gSEY/ihg9flyxOPpRRt/62s7O5fn8rsrKSUSVlYPiOB9F6ebmpfl8x/bta9vatpeX15SV1SQUs1DIZrMbOzrW5XJNHR2LSafTCctZxFNhUnwLq/hTSOLsw528TQ2dHEMriwJbLQ9N2CxTmMzMICFNakVJnujRDCUXZrtnGcIIBvEyb9LIp+K4I5M5L457bd16SVvbQ52db2zefHpHR46fhr783vyEATxIhq3M5pIumefT+B67WEAJL7CO87giNKCP5Ss8zc2Brg3hcLbTk5F/tY8LlJaUJK/4fCq1obT016Wlv+/s3GPZso/t3Pl8stLGjb9etWr6gAEX7LHHt8eO/V3v3kO5m9VJtnwUHRra9yfy1X79pvfrdw0YxHAe6ULXnudl9qZHHJc2Ni5vazuCQUxiKFtYGNKLSsL4zU4S7p7cReRJM5R5YAMbeI8t4SV28htW8QnGcxl78BY53mA2LTzNeYxjMifwG57gAPZjFctCQHQUePDi8F/UhoOVULR9eJ972cgsXmDvxD+USpVu2vS7Zcuu7uw8kmvi+C4Wrm886uxpZ3Y9AJdMv/oXv/sOLyXnzyXTD7rhrju6RkFdMv3qX/zuCzxGgdeDYW5I+PtJfJkNJDa4Vzg4BBQkOPS2GavPnnbqvFmzb5tx49nTzlnfOLbLw0uZctuMeZ8+/9L5s2cH2UNMOfuS4iXmBQkpOtgzxCnkqIyiM6OoN3UcQSnltN02o+nfaACKKKKIjwKil4uh9x893HfbHTjrkuKH5kcF6xsb582afdzppyX/ve4r1z754CMVFROqqw/btGnGwIGnlpX13rz5tW3b5ldVjUmlWvL5baNGHbtt26oNGzbX1h7f2rpgx46Z5eUHdHQsj+NNlZX7l5eP3br1X7mAl0Lv+CCeY3+GM5MxlPI0e7OVSeBd3mM8A8J38+N8jBJ28AJ9kioRK1nFFvbh4kCYXuRBDgpEZwzH8LNUKi4pORmFwrJ8/pk4LuFixv1VxH3EPGYwjvPo9sEVkp9/zwK2c1HYZkEzEDOLh0JCZAs1XMBjPMCnOSus/6Moerqq6ppMZuyOHZ9KpT6WTp+z+1jk80/mcj/q2fPUzs41udzq4cO/2q3b+N1/3bDh/hUrfkpZFB0Ux+9zMv3YEEWP9+17Ti63YcuWx2mgDzuZT1VQPkyiiq3MozsnhHEAr5BlKe0cTh3PhCjNLbxLFeWspw+fJMcNHEI1r7GCU6jkPsZxwgfPrNk8C3ozkBPZzlyWcQRDeZbtjKWV2Wyhiu4sYyijeDo8NgmUXUQNA1jAXqxmPWUcSA/i6upVJSU9tm+fz3TGhc34M7fWNRx638yb//rMv3XGTXUN/S/9PwzVXN/YOP38i9Y3TuGYv/X3HLewgCMZ/ld/jdnIM3SyP/26JCEItZK3WEgtw+gd/vQsh/EGJUymD7/nEDalUmNC2L44/mMcD2IMJcznVU5gbF3Di9de/0/FDPwiivjooFgZ/SiiT32xTf8RwvrGxunnf/r6azd2rakMH35+obB6+/Y/plIV+Xzb6tV/3Llzeb9+F5MuL+9TU7PPvHl/yGTKC4W2HTue2bnz1erqU0tKBtCWyVzQ1ra0ufkZYjo5LEyUeZOT2IMSymhnOOezmfbgvB5OgQEhPj0RDq6kle5B0/k0q8OI0RNZwzdYxu95gIs4gB9yZmAPPelIjO1R1C+dnkIlv6OxyyTMxA71JD+jD0v4ZXDMlAYLcws/4XXGMIDbmRGkkEmH+nfcm8l8Lp0+jVcZzwXgRL7I3XyGlVycyTR27357JjN227Z/SqU+E8fNXQ9HOn1MJvPNbdueyueb9tzzx9XV+yRjV+M4G8fZPn1OHjTok1FUiOM2Lg8SzL5xfPGGDX/ZsmUmBwXGU8UhxFQzjcou3DrNHXTtTkygjsdZQC3v8ibVTGILWzmATr7NanoGk9OBHMyTPMzpHBGcXkmyQSfj+QR1lHEUm7idDCcwi6c5hHJeCBGkY9nBRiayV9Ak7M06NrOaUVzK0ZzM8kCUx4X6+q6Wlne2b8/wfYbTQgutTONH6xtLnnjg4X9z8tc1NFx7/XX/JyaarFDf0MBjXNdFZiqcmV9mEzU8zcNdklmTZQ73UkUvZvJ6CL0qCSLUF3mfUvrxRihFC5rRY+jJ47xNjkHsWyj8JY7nhNVaQzf/ad7ju/TgT+sbz//0BXfe+kGlbBFFFPEhIvWhDyQtLn+9jBk/9oUnn/rQN6O4rG9ce+uMG88+/Lub1v8glTrrrTcvPvvwi+bNmjVh8qRcrnnEiAurqmrz+V2bNr1UVrZHXd0lqVRpOl2Vy7X07j15yJAzV6x4LZvdnM12dO9+eUnJoFSqWxy3RVHfTOaSXK6CFM10Moge7EUP8hSS6HvawmT2Np5nZZfB3O3MZg0XspxZtFFJOZOZxUaylHEE9fyEHNcxiWGU8SPmsIUthUIhl3ssjtujqJpSsvTn6zwePihy/Ix7OYI0+5DnS7wZVniRL7CNaWH9JG3qGpawmi+kUrnS0jviuCOff5dvMoHWEEGVxFVWclFV1Qnduv0oleobRT0p5HI35POvZrP/mwxls1/LZq/t3//Smpqp8+d/bOPGR6KoJIpKoiiTz7e8995XVq/+TRyfw7FdDmWCo5nCIzTTFszvlYHSJeLItWAYe/Ic93XJnxrKfixgMRMZzDx2UEV/IkYznFvZEOrWWfqyJ5U8QlMIPyoLPL6Dh8jSjx9yH8cyiqUcQRk/poOraWE+SygN01NztIS3MIGVTOS4QKlH8U9Ukw0Cgw08H8dn8lRg0rtvNiqZyatPPHD/f+pKSXEKBb4eTGl4ku/RP0S0JmkPt/F+WOEJ3mQ87aTZl83cH/zym3mIVsbSSR8OZhOvh4iGRKgwgcNZElJgqzkmjgtxfD/b4jhxmD1ILf/CGE7ncm5gFj70T5jiUlyKS7L8zTy2Ij5k9Kmr+7A3oQjrGxuvu+baBW8cmE5fl/wmisZtWn/dZy784fhJ27PZXsR1dYfFcT6bzXTrdgBSqYpUqjKbXUdcWdl/wICTVq16qKrqJHJdwiDb4ziVTh8Wx6vi+DHGMYFKdlJgK69Rxk7WMY0K8hzMa2wjFaI6RwY7/Age4VGG0MkQevJKkIrG7MEa3qKZz4QAoCncxuAo+gzjCoUfx/Ft6fRxQYe6PwO4mzc5kt+S4XTSLCfLVN7j55xEO8+wH0OIaKIH5RzLm/wwivqnUuem0ycijlfyKgUu++D+/m0UvVNW9tmWlp/GcXNZ2fHt7Y/TO+ntFgrbOzsvTKdPzOcfjOPqTGZAefmw6uozKivHrF37w23bXh458rqdO+cvXfqNfL47k7iL4zjwgy/xRJgOv5W1jAn+pDgM+Xwr2MaFKKUlrGUcMVlq6Ecn3cF43uyS4h5TR3dm8zST6RVGDJTRlzuYxtSw/jyeYDTHggG8xgaW0sYiTqc/83mHC3iVB7tUcDfzFpN4jIF8hm7Bup6skByyPXmGTTTxDQ5hLD/nNb5ALTv4Ge8zbd7sLWdNu+Ta6z/1H2xhJ98jB7CG34Xd+BoH08CiUB2fxGoeZ2yY0TAhBI0l3YB9WM1zjOQ96kLDvRDGih7MoqD0LQs5Vt05iGf5LYeyN2PjuE8c306a1zgk1OAT7MF1/H7+rNmmX/UfeZtFFFHEfxeKbfqPKIqG+g8dt864af6cLVH0b76V0+Tnz1nc2Pjkli3z0umykpLKXG5HHGfjuHPXrlk7drzS3r5l1aqHCoVsaWn3OM4ijgudnQt37fodJ3Z2/iqO34+iSko5lBU8RxXNLOEpBjOMCvryR7bSQQPHs4PyoMA7kTg0fI/lWJaE0KVEI9jJQ6yjkhImsovPs5gKdnJUFP2GSZRG0dfi+JO53P1xvD7MHW3gHHbwUwZzUojZ351yP5KTeZ6/cBTDgtN/OauCC34odXFcKBReQxTVRtEQjuI9vsYqsIrPl5TEVVW3ZzJnVFbe0t7+3Pbtl7W1vdVFZVgbx3vkcg/EMcZks/suW3b9+vW31NRM2WOP30RRz7lzT1u8+Av5/B6cxkRO4RVuo42IXfwrb3IIOeoZwByWhZlMa3mdAWGIfFINjRhJgUZWhlJcFAJQsZSBDAr+7oQCJsFPezOL3Yr8iGEcyix+w9bQtp4WmChGcDZNbOQg9uVBWujkXn5Hb75ID9p5jwWcwNEcTAu/oylIJtJheY4/EpPhVxwCJnELA7mSJ7iKnZxBB5vWN57+6QvuuHXGTX//ldLUuDH8mMhe1zKPY0luqnNdUugbOJyV1LA/VSG+NN3lGfZjGSMZTBzsbplwXPbiIDK8SKLfKA1sdSqv8SQtYWBBP4ZzYhBFdNIRpnmdM292zafPv+Tvf5tFFFHEfx+KZPQjijHjx71bNNR/qKhraIjjqnz+0kLh6eQ3cfxGLndqaen6dHpcTc34DRteaWx8sqysV6HQHMeFzZsf2rVrQXX1qYVCZ6GQef/9Ozo6thDHcVtb27Otra/E8ee4nM/lcjPz+ZnBOnMKaVbRzNscw1jKaOZgjuHlkKBZwVQyIV+9LCxJw3d16LC/QJ5u4CDmMJcyOjiaEfyALRwRRV8kCo3ytig6PIpuyud35252kmciafYj24UWJKGeLfRiCLUh5T4TVIOjeZRX2MB3+Zc4ru3sPLtQeBW8x6n04ts8yrfLyk6vqPiXKEr0nW2Fws443je4Vbq2cvYKkZ9lHLhhw5vLll0dRSUdHWsLhRxHc1A4egM4lzJ+ypv8ghyHhgzXmMFMppFWsixmXwYSMSDk2KfJEFFPDfNDNCw6WUA9EzmCg3kntPgT1DCelbwUSq2o5UhKuIl1XMieYf+3h/kFR7MfTxJxHItYTi178TKzmMIWVnF5cCD1Yii9+C0vh9fKczevcTiVzKB/l80r54ucyy3swWEhon88t9By24zfPvHAQ3/3tVISGF6i0exOLdXEYRxARGtox1eSp3t4xU20BqaIiDLyVBGTZt2EyfuHAffJF1aODOU8GZr+nZTTwGnhjW9PnPXp9BauZFa4TJJLZitf5N26AfV/93ssoogi/htRJKMfUYyeMG7hvCIZ/TBR39BAPYcXCt8tFG4qFG7I5z+TyYxPpY5J5IkDB17e0dG8efMc4vXrf0Nt9+6XpVJVhUJ7374ndO8+ZdWqB6Io3dr6VGdnLb8IVOlgfprPNwfpZ46D2Zc8Z9KTiHI6yDGEC0NY0vbApcbwKH8KW7qOH9PMdK5kAI/TREQvTmEL7XSSZRQDwmD63c6kZOkRx2+E7urdNIVplkkVMEMbjwfS8FSoj1aRD3GP7zGTY9hEHybzeWrI8Ck+ls1+KZe7k6E8xmSOYmYmc2wmc9bu8KlCIZEMvhSmle626reELrbATUc2N/dauPCi1tYNhcKZ7PHBA5jhCMbwECOZEGKAosAOuzMlROsfFNJekzLqLpZ0seOUUpLJ9MxkEsdYigWcRA1P8hAdXEIH74aSagtzGcogVoXUd2TZi1LWMIdM2PnlYXmfx+jOAhZRxUguZUhw5d/NIXyK51gRcvtXMY7DeJnfsJh/oYlplLOZS7qUaZHn21H0IKXsheCHa+bH1NKtrqEref2/YcZdv5gwuZE1wUKXo5wC23iK3tTy0l+F5EesnTC58rjTT2In7wSXXi4c92RYV+v4/Sfe8LsvM4udYR9m2I8kCfXVQEZRwkFM4vkoqiFVVnZyaekRzOCnYSjUM3yZciZ2TaoqoogiPkQUyWgRRfxt1DX0p4WRnFcoPBrHfy4r+3hJyT5x3BlFVdnsjlSqol+/MysqRmazOyorj6msPJpCFFUhn2+tqRnfv//5qVRFNtuLK4OdOWkU9uToOE7KmWuJqOgymnwzs0nzMnHoDvfhaZZTTpZDWc0NvMDNTOJieoJTOIGXQ72qgsNI8T6LmMseTOX2OJ7OrvB2m+P4yzzGtVzOhTzLG+HV21nGI0ziu3yD/XmY90MAZJo3WMvVHMlFVHxw9PkmtrM/F7A/R/Icq/hONru5peVj+fw7iek+laqnPIQTLQkPX8lrlDA0uHYilvB8HJeR4+4wt303mnmIhcnBDJR6Rxh02Y6w51OBG6VZzxbGchgxK5KqXiazvqJiVDbbhzQbGc9CNnI2p7KKuXRjO2+RYSbdWB50jbsCF9ydi7kPG7iJlV22+UUe5TBO4iRW052zAtPCeK5kHRGfZgWPlpburKn5Sir1BjiJMu6mLlSCS6ilO9O5F7zHuVH0Xjp9XijHbuQR+jOcf+J8rrptxr/++xdJsnMbGm646/ZLph/Aq7TTRoaVPM/BnMopnMg7IUU/R0ldw7ZLpp9ww113hL0xlIWsDmQ0ZiE17FHf0DBh/8n3zfzjhMmdrCQbdkg9xxPzRpCQIks9o+M4F0WbUVIyuqLi8lRqJVdwJ79iX6bQPv+vpkAVUUQRHwpSUZfKQ3H56CzTjj3mhSef+tA34//PS/2ABraxgx5MiKLaVKof6SgqLRSacrldra3LUVMznlwmswd5Mh0d89DcvAhlZXWpVIZNXMnCLo3CX3MTddTyCnNDKbTAUp5kfz5LCfeygTIGcGhYszO45mt5mbOZ1mWsZeILOZqYlWzlVa7kdDZyNSeESt7OOD6LOXE8K47PIOJH7AMO5wds5znwPm9yFReGj47z+Cxzw7T3JxjAV0J5shuX0cG3wSauJ88R4eED+RgVPMeVcXxMa+vVnZ13xXFLZ+c9FOjFXqznFd5mCfXUdxlnP4d3QrxRGQN5qouV+11+T2uI009Koat5hTK28GYYPV8aDEztIV4goj8xo6hJhg9FUenOnRmuppw9eJUaDgsvN41a3mMg+aDZHUSaucT0ppKX2YHAjMfRj3tClOn9LObCkM96D1ODyrMrenIyr/AUH2d8HLen00Nqa39TVlbBG4wiYiivs5VtxEzmeO7kk1yVSg1Np88Jm7GLxzmJr3ACX2cG325qbPkPXS+XTb/qvpm31DW8FZIEFnEBU8Jmj+NKKphJoa4h97Xrv3DZ9Kui//XXDEM5mB0spZR5jGTvpBIfUd/QMOOuOy6dfjjrwj1Schc0keGsZU5yDQZRSlUU1STPHkXV5eVnl5YeyKOcyJDESjhvdvTp8y9d39j4oX/aFJfi8v/zpVgZ/eii6GH6n0dTY+Puidj1DQ2Vla3cxxqq4riZXKGwqaPj96yJ4/YNGx7ctu0v6XQ14rilUGhubn6ws3N+aenglpbFTU1/yGa3pNPV9GE03+RB3uMSZnMsGZo5gybmkmMOK/gnjqSKi9ifB4IjeyAn0EYr20hTR8wD/KnLWMsW7mQBX6KNbfyYVaSZwXDW0EEJJzImjj/L9Xyci8nTSis76cG1YXpNDT9g/AcFjuP5MaW083HOCS3vfOgdH8HRfIvrOCO0g3cjxQls5ldM4csdHY+3tp5bVrbbz14eQpE2MILuofS1i8fYwCR6BMNQb8bwHvfwEi/Qn8FdYpveZhH7gZ4ht3IFiNnCbMoYEl49xxIa6U99Z2dSqkzQyXnsEaQFSWrBcC4iohv7hqTMNHvQn07KGM788KIRGMpEZnMzPbmQviGItMDvePGvTtJt3MLSoLncL5ut2bbtnLa2P1RXf726+pwoSkqk73ExOV5mf3L05Vw2p9MnpVJTycdxUoN8mX/m3PD8Q/gmH+syO+rvRX1Dw59mPnbc6VPo5CqGBkFFgu6cywF1DXUz7vrpbsP++rWNweFUw0H0p8Ak6sP81f+NS6dfde31X2BnmH8bkaadYezkURrDMSonnc9vjuNE6ZuKou5kSMrbMTs4YN7sI6ef/715xRJpEUV8qCiS0Y8uih6m/2HcOuOms6Z9afoF/3rrjJsef+Ah9OnXo1evA3iQXXTk8ys7Ou4uK2uoqTkjjuOGhgtbWpZu2PBAFGXy+e3NzfeUlJT27n0xamrGZzK9GxvvLCmpoZ09OYZ7+DJ9OD4IBNup5QxqiBjM5xgY9J1JgtJVtLOTVrqFeYmzWBticY5kDT9jHbP5GQ18j5mczhcop5HbuDcUETsCsRvLWNp4KbhGktTJGmp4hjup5gWe7aIxTTa+mV8GZ8lvmd2FgSWR5s/yC1qJ+TXLP7i/m7mb+eyiG2+zqqRkSmtrEkqVEIiIiuCMRppttNGTyZQGOpLQnQr2ooxF7Emv8B4jFtLKodSG9QcwjjVsC1R1CIMDR8zzBqsZxyriD7p/1vEc7SHMP8ktaueJIGlN6PimoJJMnnMp7ezDlrDBuzn3PrTxZpBhlAdt60ReD+77BG9wU0ifTW48fsZ7fKGtbePOnVdnMvuWlU3hAL5AA+fxMWaGULAUHQkVi+PWQuHPpaVDGcWQD2oqMGp9467vf+Xav/vq+d+YMHkyO7kxiGWjLn98mFfrG4bUB7FmU2MjGVrDBqSoJkOP8MCt82Z/gCnWN/SngQW8EcQtbZSG2a0vMJdWygqFAzo6nszl3koeGMdtoZu/mZcYxUBq1zeeNP2CF6aff+V/4s0WUUQR/yUoktGPNDY2FSuj//Voamz8N9+yTY2Nt8646dYZb/BVPnbrjD9d95W2M6cdl8vvqqnZt77+nHR6Xhy3Z7PPdO9+emXlIalUeRSVYcCAS6KojLitbWZ19cE1NUeTCrn3R/Xpc1xLy6IgT+zGFKoYTyEIOjuDxm4qEc/xfDDIJ0TnJX4Zcu+fYzNldHIQi4KVOMWhdOcmZnMxZ9LGCm5nNd0oSacviKJH+DSlUbQ1lNwqQ3ZmB59lftglHfyMhzmJHMfzKtewLqzwDJ+jhSnkOZwHuS3UsfLczpMcTCndGMk9/CU8fB43086BxPwsnX63svJ7qVTfOB5Af5YEBpYKbfR8mDNUTd/wKnnaydMWpvtUkQpxoWk2E9ONAygjE54QNUwEnexNd3JEYbdnOJDyUHv75xBv2YtBFLiji6T1be5E4KwpVochlrvopJYOlrKa/uRoDKXHTCjfDufPPBC651GwWMXcyHye4DHGMp6YV/km9XyO/hyZzY7bvv0T7e3pLmVOHMBnWMg8JBrWOH4/n7+7d++pe+55W69e/YPffDdu51uMeuKBudP/45Pc1zc2Mow67uCF8Osd/JrF7F83oE/yq6bGxunnXzlvdm9eCgVjZENa0y5ep88TD2z+q80o5QSyPMW6YGnCYKayjhbKqeKYbDbX0XFfobAljtuoCPrjy5kaeP97/L6pcZ0iiijiQ0KRjH50MWbCuE3rN3zYW/H/Gm6dcdNZ077/xAP7nTnt5HmzZjc1Nj7+wEPTz//SbTfeV1s7mqv5QxT9KoqO3bDuu42rN69Y8eiuXe80NFwYRSU9elycyQxOokPT6W75fAt69z68tLRPVdX4iooxSS0nlarM51tRUTG4V6+j2MYzwWKclH9yLGAeEb8LFpYMk5nDL9hGlt/xEqdyKKeyD08GX3wDxwUrT2JvH0nfEIReRRXdGMoXeJB+5NPpK1IpfDmV6llaOoJ72BTY7RFM4Ic8wCtMZw2nUxNUqmdRwZd5mX/lFvYLiY/5kKqzju8yn2+wkuPpHVI5hzGVN7iDp3mCEexNiuWlpYOqqn6Uy73a3r6Ew5jCYTQGd1dCRlfQyTiyoeTZEmpjidklMWPtLm3GrGYDpdQF/UB7KDknTrIkMj2dtHTJsIUOBjEmPFXEwRzEbdwSzqORjOBpnuZFnmcwA4Nd6S2aGB1EjWnepoOxjOH9QEC7BdNVYsDvxb6s5ees7PLhPJoxPMICptE/VF7HMZKasNpW7o3jCzn0r876vkyngsco0FkoPD5w4Bf79/90FGUGDLhm0KBr0ukb+SmdfI9HOZKI/vNm9zhz2ln/8S52mpFMCQqE+dwU9mRCtc2bNfusaZ9c33gK+zOdiFfYHkZGbWQWkzmZQ+fN3uPMaed02YxEfn0Q+/A6nZSGg17N/kS8xFtEjMrnJ7W3/z6Ot1HNixwW3H54mN8wsb6hpyKKKOJDQnEC00cXferq3p1/54e9Ff/voKmx8bprrp03e0oUfR8b1nX//le+vWXj6Gz2zxUVk/r1++ft22/lTDpKS6/t6EiMF4fzqebmp3O5+ygUCs2pVEUct27f/lAqlV2//k+9eh1eU7NvOl2Ry22N4zz57dsfLxS25/Md+Xxz795Hp9OVFKjlsVBE7ORFspzCHzmBp9kSXBcH8xY/JsNALkniEsGB9GNmaLJXcgh/5jnGM5hK+rGca/mn8GyDuZ0eTCEXRQdH0Y58fhVl6XSvVGpmNjs60NnRwbO/g/GhaojSsMJUBvAryjmJKjrJhGpoGcfwFrexJ2MDMysJPfceHBEs1QfSjRypKOpZWnpcc/O3C4VRjAkvOoK+vMB6UsHANDD0mgusYTnDKGELw1hGS0g8jVlKxGjeDlXSjbxDb2pYRn2XpKfE4r2BqoSEhY3frZscSh9eZFuI4u9LNxbTyVjKA83aThWjutR0EwNTNUtYzuFsYAozWc0ORgbiW8rerOauIAhO1Ld9WU0/ugfm2k5vLuc5fsGn6KQfN3AiR33w3N+QFK2jqDmO81VVm/v1+1Vp6cB8PklKimpqplRU3LJp011bt15IWVDHbmcHO9Y39p9+wWdm/O4X/5GxTMk3S3emspiHGM3A3RrQW2fcdOuMuVwa1u/Lpczk2TDH6z3O6hLXNWR94+DpF8y4dPoBdQ0NXQxMQ6jnWVaQDiO1EtXERBaynv2pRS7XQS/G8gTzuIgHWcRUKrskeRVRRBH/0yjpoi4v4qOFMePHblq/vniA/ktw64ybbp3xWhR9IoqG08oLqdQjO7ddGUWLamsvLy8fv3799xhGc/fuHbW131uz5tOFwuV8DBzd3j6cH3V2rsjlNrS0PN+z5z6FQrZHj302bXqls3NjaWnfjo7tuVzTjh1PlJT0rKk5cMeON3K5QmPjbX36HE87h9GfmWR4nOFMCgW5Ss7jyZAQXmAsS1lGzy5MNMEOdjKSZ5lIz1Af+gvbqaSDk3mdb5MEevfnbO4pFGanUp3M7937qlSqbNu2G/v2/TyptWu/QFXog3djErOY2GVwTiYUI9sZzgIGJd/uZELMUHMokY5lQTD3FCijLUxRT95vLzbSjZgSNsXxtubmX/4t23gNJ/IS77MntaEgmmIHTUykO42B7XVjKc1EvE0/+gf3fYH3WcbY4C4/lqfYGUSELawJQbCJtjVmZaDChaC2rA1xpMlSQS3NJLccaZqDC2o3GtknFL8PYAkPcAR/YCP7UmBO2NVxoMIlrGc+o0J4ZxTS4NMhAul02jmIQfyBfqQ4kRd4mwvD1ICXeYRBDCov718obNq586mqqrF9++7ddV9v2fLw1q1/5iReD2a4HJPIcB+VdQP6/52fRaHfnaNAKQ2sYmA44lufeGAO53JMl0jRhIsfxl7cR9Qlqmw3Io65dcYcbmY03ahGaDgM4XX2CPkJSabBFBbxMJPJMZEe4Aqe4TtUBSthS92AhuKHbRFFfFgotuk/0uhT169oqP8vwRMP/pk2+rIzjv+QyayqrLy5vX1GZWUqjtvXr58ZRd9Pp5f16zeqrGzUqlV/KBR+wiQ6gnl8ADNaW7u3ts4cNOj4+vpDS0qqstnmUaMuj+Pmlpal+XzL1q331dRM7tv39FSqPI7bunc/pbx8YlPTvUEzOpzzKTCVA7p4btoo5wz6sCiIMivowQLu6hIF+iQvcgYXMZFnWEaaTk5hF01BBjCJI6KolZdpKi2d26/fb8rK6srKttXXz4jj1mz2rYEDf1NRsU9JSR9KqOcRdgS5alIHjdjKQ9SwNDDpZNtaAo14i2e5IAQF7KZNueQLnqcoZSgzQ5UxHcqQWd6nOvSm7/sr+/YGfs8OolDvTIWg0HYOoXuXQinKGE0PcoxgQHieiHU0chD9AjfdSAs72UzEJtp4PxRKY95idSA997KUeVzAMFpYuLvdjKT3zRp2UBO2J3mJ3rwZNgOj2I+X2RXKw8n9Rh3vhecsIUs1aWbRFF4lIcR/YU2IBUjcThmWspk0fTmbUq5jNvdxPxOZTKFQ2Fpd/Y1u3b7e1HT70qVXdHYmxnOrV3+/qekOPslxXMx8XmAFpYzks+w1b9b8f+8i+19Yv3Ytr4SEJkn9O8gk5tNEDb/nlb9yvL3Pb0Al/9pFwbwbT/ISVWzn+XCxJMXjARzMel5jZ5gHhr0Yx9xwayQItZPss4PCl2Bz/d8d8l9EEUX8l6Mk+vfXKeJDw5jx49+dv2DasXUf9ob8w2PC5AnbNi9tbz+PIeXl52QyR5BPp0dv3/4nPhdF62pr/1JdfUM63W3Hjnt4kDRXdHmCjfwLK7t1G96t29AoSmcyVR0d29LpisGDT920ac6WLQv69Tu/pKR7Pt+WTlcVCi2oqJhQVjZky5Y7eZkDqSJNSTAwzWEns0kxkCpGsIid9KaDSSzmllAg7MlnQ7nrSBr4U6iGVnI0T7CFxbSk070zmX/p6PhOdfWI2tpfb9781erq4ysrDyZqa3ujtXVmNru2V69PNjZ+n8sZFiYJHUSfUPZbyiucyQW08CvuCw3NhEo+TwnfYjjD+C0zOYB0IJpzOYajwSDuYxv9KASCOI7TeTlEUD3AwSEB6k3epD+92QQKbGA1PenbZUB8S6japoMLe11oZ6fYToEsh4UCZ1KHe5rJjGIp85lCK28yiwxzKWFiqEcOJsuPyPEnBtLCfIaHiuYOljOuiye9KeQSDKEHS6imlRS9yIQo01RgVGXUsow+9Awl0qF0ZzHbg9LgRfpy0AedZH/mPA7h5+GXhzCQeyjlOKqTCa4dHZuz2dMLhR1MaG2tWrz44wMGXLNly8OtrVm+GnrcQ/ks9/Mug6hiNbOfeKBwwukn/N0X3BG8wSuMDiX2fJihsA/LOJRXWMhZJH6mZ5nJ3mykln48zUJOC/ds97GJA3mBY1jDq4xgTwQV6aG8y8tE4UJL0SPkEtzOtHCCdRIHerqUJfUNxxW/DYso4sNCsTL6kcaYCWPfnffWh70V/4+gomJSdfWhLGlv/35Hxw0dHfdks+VR9MsomhzH72/bdntHx4J0unsmM7C6+vh0+nmuZiN4iEto5dxUqqRQyG3fvnjduvdbWxu3b383ikqqqwcXCp2lpX1SqdIoKtm5c3YcVzQ3vxRF6XS6dxSlaOFPrA9fq9t4hBzf4AgeYS7d6eAEmlkeSo97MogHmcDlgYkiZk/Ooo0trOQdjuQyXi0tnVpaenWhcGuvXp+pqbmoUNiZz6/fsuX6trZZqVRFRcXEioojWlrmrFz502z2YoaBY/kEb7GIfIiUv5YLQBVf5EweDUPDH2E0PwgCyuFcxx48GlrMy7giMFHsxxfIsZgUi/kUp4e/5tmT8bzKczzNAkYzJEiJEg3oeg7oovJsZzY7ybMghNjvZhQF1rGMSgbQ1mVs6UqOZTg5KkIBL9Hg9iEbIveTbvUmJvAdcvwgFDL7cwiNdBCxkYmhFFdgOb0oo4Us3ammpctAy2Q7syyghePYRCODaAphUskb6ck4WmjjPfZiH3Khsn4Xf+FrnIHAjLO0M4SejA5pVomMcnyh8E8MYhvnxPEVa9b8uLW1kqvoxRZeC/v2NA7kPh7j1+wT6uV/D1JUcxj9eJ2dlPIi/Tk2zGfqydFkuIE53MPLTKYuWOPrOJJ2bmIevyLHoWG3lLEHp7AtDBvbfdDHhCmvC8K9QTqE4Y/nOZ6hk9agTH2FRUyoL44GLaKIDw9FMlrE/+Noamy8ZcZNLzz5XqGws7x8bGnpUM7t7Hyxs/NXPM9WahjMSRs3/mjz5l+UlNQXCs21tReXlaW5jB9xM4cl87W3bXt/7dqn16xp5Yu53Ilr1z65fv0LmUx1HGfjONvevnL9+jtbWwdE0R2trbZtuzuf3xJF5YxlKA8FMvoI+/N56pjGNSxnfZgXf3T4Sk6c3QNCu/aXH6Qyj3Mbp7MXb3EqZen0/PLyX8bxzra273V2rtm16644lkrVxHG2uvrwTZu+sW3br9DWtqRQOImTaaclBN0P5XP0JcMQrmcvdrKLZpo5ip+wjY1M52Nd0qk6yHI+nwpRSl9m1AdFeH2YzkjK2NxlDGbvUOPsw8FsCWLKbmFYfKKSLAtZSymywW3dI5Dp0axieRfb0PtsYXxQr1awM4xoGkDfkA+atHTbg5piKKgPRbWE4N7Bpfycy8L9QBxKpwmnGRO2E9sZyw6WkQvz1lHFYBbwXqiJvkkfTqae0+nL2/ShiV2BdSXt5uFk2JOhQUpRCPczPw4t+42s4Lku0zILQcOQZjZLeIsFXEk1t/M7aljHV5nFb0jzcyJu5QnW8CIHUls/4O/naunwwxgOYTXNHBSOxe4YJoxnMo+znEPpESLPkhUy7MtInqQ/40KRuyTsnG4cE26HEqVv8o2WC4O1Xg8l5GxQrx7NVn7HWmQyU9Pp4UF6UUQRRXxoKJLRjzSSoaAf9lb8A6OpsfH713ztqQcqevU6LZvdkMuty+W20MKZ9GBoHF8dx/dFUX3imdix44XNm39cKOxCdfWxJSU9eYbT2MEQPkvVzp0Hh5LeQXxu8+Y1q1c/TNzevnbTpgfz+Sui6Fv0i6KfZbOHb916ZypVRitTOCkUwL7CcV2S7Qfzz/SimS20MSbEFa0FJYwl5l9C0/ZfWc4XyJPin1nOjnz+xc7OW7PZLN/mlx0dfZqazm5vn5VK9SwrG9Ojx4XNzX/etu3mOF7JupAAVRUaypW8zgJKeYx5Ifo+cYpUh9fdQRW/ZGkgRuXhh0f4Ob1YyK/Y+sHA8038lEX04kBu4F42cjsdoYhVRgXVlHQpTOZoYGyIX00qze+GpKSEffZkElmWUMLCECafDissZw4jqA5urRzPs5x9eCbk1e/e4Jg1vEOaPZnE5UEUO79LRGg+pOsnksedjGFhiEeo4/3AkyL6MYFNlLCC/Tg4nAZ5JnNgl1mXCeGOwgmQHOhks9eyhDZ6dCmWC5n/D4RXTGjoTp6gnG9wOTV8ka3M5Qh2MYFBJCG7J3M5P0uKhXRyJH3+Q98U6xs3hz3cHmJZ+zAoFGizodqd3MbUhdlUCW/eHoKrsiGffzAxQ4K4pSmU3pObhxTd6EYjrweBdZL0NILhLOHdMJApOcEOYFAUvV5W9oNM5oKysp9kMkeEyN4iiijiw0GRjH7U0aeu38aih+k/hXmz5lx04jUdzV/v3fv00tL6QuHt1taFVVVnhyrIIHpxKDfF8R3sojsf7+zsmc2uaG+f39r6ei53LN/mFY4jzb1cyaguUzH78dm2tqFRlNq8uT2Kbo2iI9mZFBSj6II4/kkuV0pz+GLelzZuC/mXGTJs4pusZyrPsIoMEcfSzHxK6GR/9uA2fsUovsIbrOQlfkJ/DmVUoXBKCAEo4XNxfMGmTZ+P4+Y47kyletTUnBnHHYxgPtez+9Rq5Te8yDTaOInb+GGYcIOHmR40fznG8iMe7vLwn/Ikx4PRlPKjLh6Ul/lJyFItsBdnMZNrGEYVc7oMi88Gk9PCEH1f30UhmqWFQ+kXzDFJ/TXDXjSQpT/DAp2N2MZKDmRASGbdxqPUcAmHcibLmR/IX4FFNDIxbMl+QSmLocz7IH1pY16g6UvoCGn5NQxjRwi3iqkIO3B3KW73aZChNSQqtAf6tSy88TioXZeE1IJhLOKqLtn7aY7iUF7mtUCRn2J/PhsCEKbyDcoZE+z5SxnKd0m06XvwI45iDeWB165uWtv4719yYMZdN06YvIUNgf/lgnyzvb7h3QmTa9jKiyGXHvngZGridSLeYX7wge2203Uyl01U8DwLwnHvoIIT6clLrKQlNO57MoF23gtvNmZTKhWXlf02nf5fAQ6ZzHnl5TOuu/aOebPm/J3vsYgiivivRZGMftTRt66uOBT0P43Ozm3Lll21c+erzc1zS0pO7dXrpnS6L0/zGGijH8fQxlrWkGZAFBVaWha3tZ1Bmvn8gD1ZyzMs/OBUzBLu5Z04PpUn4/hluu8uKMbx23ydSt7nKfJUhlHv3w8t46f4NntxGQdyKat4LfQrj6JX4Cgx9XSjkoVBPFDHCL5PH37EpYwJhcaOkCp1ZKGwqaVlZqGwpb39tfr6a4Khp4wfM4fZfIddnEIlJVRwASv4BIv4ObdzMPsFr/doTuIJvssrfJ4twSuTrHAgk7mLR7iHRxjP+FBNLIRe6hkcx7lMZQ4rKSMOLLwixC0lnqcmZlFF3xAIWsIO4kBS06FS2Ds8ZCdZWjmc2sBNE5HDZE4OZcgRXEYVL1HCu6TYN/SLd/FdFoT/VjGJjbwZppzPp5yRFBhESejOJ938gaRZGVrGiYRxBLN5sosW8wXmM5QSKumknmG8H54tzetk2I82UpxDf77KQ2EFjOK8QOJXczEnBilFsvTiEwxlIX04inO6iDFaaOEsLmIke/I86+fNHnzmtDP/HrpW39Bw412/uXT6RBK9e5KBtbG+4e0Zd/34sulXMYx6XmQpQuN+MYs4lnZOpYoXWEs2FE3nkGJvqjiXVh4OkobkIE7iMJayPZDRQojf78NWFtKYyQwrL78xleobx21x3B7HHXHcEUXDt2/55ucvm//4Aw//9Tsqoogi/rtRJKMfdfSpK1rp/5OYsP+kKMpEUb+VK7+6YcOt6XQdSksnRFEvzuVQNrGTChpSqQL38QabcrnDuJFBPMELbKCaARzLY9wcajZL+QYx1zKNT/NQHH8yqfDF8U/5IhPoFYLW/xg0o+M5kLuYwZOc08XoM4Qr6RFyfDCcvixiJo18iokM4StsYgVfoR970ZNruJ+ysCzhih494j32+GkUtcfx1sGDb8xmN4YK33gmcDe/ZySHhfpceWhrnsZgrmEOpzMw8Ibk4X04myw3M5zDwrimkuC+GsoJzGMhR7IHnZSwmsdYwMWMDW/8YK5gCzvAO4xifBAIJgW8hewb6sQJnZ3NBiYx94N99qRm1sRiyqkPkVJ5WtjBxUz64PlSwamMIxcMTCWBvI5ib27jvrByNZMpZyfrGNRleH2OwUEIm+RGpcLuWhtC8hPsQyv3soZ7aAzyDEGtu5SIkawLsoEUi1gSaFay387kPm4O4aCJZvdEUqxle5d597uXUpayhp08HyJmEzHGbvHGC2HWwGcZwLqmxmOuvuAnt8y46e+4+Fw2/aobf/cNZibnzITJu/4089H6hoamxkZK2Y+jw2TOAmvZxLGBVia++IN5m+WUMTOcY22UhTe4D8/SGUzxqOM0IlrY3CU8oY1ampifzf6xo+OrcZyNooooKo+isigqi6LSzs5fZbO/mT+naBgtoogPAUUy+pHGvbfduWn9+heeePre2+4s1kf/E+hbX1lVNa2iYn/G7djxs61bP7Nx44/j+JccRF8KvMgGKuK4paTkJF7hXZYTU8to+nMNj9GXVs5kK9fxMDdyNJfRDezBV0jH8TlxfCZPcgYjqaSVo5jKk3SE+ZnHs5CqUMyLwr9tbKaOv/Ay27iMA5jCF3mYaq4I7KqZS5gX7NLn8zBfYju38tUBAy5qaPjU6tW/6NXror59P1UotDY3vxL6lXn6MII6xoVA9QIZOohp5UAq2Z/qoPlroxBqbK3sS4rxoYvd2eWvbXSnjl5UBRqxhog9uTRkCe3GED5JLW1hdlTSoU7kmNs4POgXC8FG3Yfz2Jez2M7CQOYSA9N6JoT1Y3byEu2UchfvfPDVO/hTyATtGwqrWwOxHsBhzOO5sH4+CAx6hhjUBHH4t4Q+rA43FRHD6Awz4hPDU3Kn8QzVjA1iyuRjuZ4G3mEXw4gZHqrLr9Dc5dO7niuCtGBFOJHKaeMAHue6D2a4LucrbAu6kSxX8mqXFVZzBUvYF3SnL7No5dhbZ6y4+vzL/+bl9m8wYf9Jf5p534TJDZdOn3bjXbd3+Usm7OTT6B5OuVOCnHe3P2koZwa/2sGMDCfYbuo5ljPZQiHkf6UCR29gBcvDfWMiFdiTkrKyK9ja1nZGPv9ieJ5sR8c1+fyjFRWn/fn+N64+/+K/590VUUQR/4VIReHOsbh8BJdpxx097bijMe24o/ceP+5D355/uKVQaI7jfFnZaJr5eEfHct7n86xgb7BvICgtqdTITOZiIrZwYWgyDudwbuFZWsPQywZe4mKmhgmHuVA1nEgN2zgv9IUr2EWe0VxAltdC1n2BCn7FW4HEvMYNjOByGjiYi7idvTmVAr14gm+yg37UMYWv8wcqqeMKclzevfu6kSN/2avXiYVCZ0fH6s2b7yoU2tPp7plMXVnZcF6ng1Kqghckz0YeZQgzeTX4dcroDFR1Dn/hWO5mFVVBDoiIzTxKPVU8TTMooT3EKi1gEWcwl1uCknI35vDjsBu7ByP5WmLKmRbKrilyvM4BHBXIR3/Op443wPuk2Y+yICpdxWsMpJ4Ue/IEj4aXXs3NbOwyfzJmNQvJhGypyjD0fAWNIdY0QVJzXUaWFeGNC0Xi3WrLiP706eJdE3L4+wVV6HbyQT5bSQ+Ws5nSkCrVj6nsYmdIJEjqfzGjeY6XuryFFIfTwdd5HYGbNnBgKFQfxyH8lFvCCl+mP+fQSsydvMxuN33/ebOXfv8rX/97LsD+DQ033XX75dOv2v2b9Y1NoYfeSRsTiIM2Nx3eaUf4awWDqKQhPMHO4GBLTtreZCjjGRaHLcyGyWQFFoR59yWIom5RVJHJnJrJHNzR8fXOzp8VCu+3tZ0Rx0urqi6O43YGzJs9+cxpV8ybNedD//gqLsXl/z9LKnzOFpeP4tK3rt+0Y49+d/6CvnX9PvSN+Udc+tX33LnznubmR0pKIqr5GN0o44u8QDl7cxLvxXFzEiQURTVMoYEvsI1W6jmRzWxiY3D4prmLPwTvRQkZHuO3TOESHqWJlbxAJU/RQTU5ynkm+IL7sw/38xQP8jwXcAQ/4RymBlbxa+4lRR+OJuKzbAhN/49zD+uCDfkIoh07Xm1unp9OV5eXD85keqVS6WXLPr5r1wvIZEZXVh4RRUnwTSak3L/PkxzHF7iOTh5kW9CA7uIx8lzP2Xyet3g1ELJOFvIMp/JJpnMMT7M4jMps52VSXMGe/BPV/EtQDeIxHmIvehCTo5N3WRTyJteQpzMZmM7HGfdBLpviyJBz1JvRQXUQsY33OKjLyPg+HMAafs3L3E234PhOdvgimkKIwauh4V4azExlHxzCtIsVZJlAA8uDi/8d6hhb39ArGOFz1JBmI8to7UJnd/EutUxmGatAmrIgkG0NDKyMckp5mFnhGTpJcSYbuJv1wcCE8ezNrdzIIxzK2ODNT3jhaC7kDf6JW5kaqGqO21nJQaHOPZ/bg1L231+aGtf+rd88FwLwKwIjT3bsfN6ihLtZGsj3znDbtiPc4bRxX5fY/8RHeAJLeDGskDDUCQxlcRcTVfJ+pdP7lJVdWijMaW+/tKRkYFXVx4niuJX+VDc1vn/LjJs/9I+v4lJc/v+zFNv0/wDoW9dv4/oNH/ZW/OOhqbERlZVDR4y4KZVKAnFaaGMs+3ED68lTzXDGZrO35fPPxXEFHezDocxnI22hNhPzeMhR7+B8VvADNrKVGSziS4xnH65mJc9yET+mnrvYEJra+/KXUASq5xDms56vMolelPNTXgSDOIM3+BaltHEsU7g5CBDT9I2ig/g16xKbVP/+J23c+If33rsyl9teKLT37Hlcbe20tWu/ls02xnFHKtW3svKcKFoQBmzOZhVf4xRQzz+zL3+knDyPcADfCOLIifyASp4Ec1nP17uIX0/ky6xkM3iasZxLDSjhZA7jdmbyU+YxlYGBNMTMIcdZDAtV4bd5kT7sxT1dKmEJOnmEBZQEAxN2BjnB0fTqUkQUyEoPXmNYl9FQQjL/PoG7jOJ13gMRBXqwlTeDBmBn8OmjP2PZxg72oh9p0vfPvLu+IR+OV0wDVSxiEzF5ljCWIxjFmaR5l5g0a+nOki6jQWMiDuNdHuwyoqkbJzOA+4kDGY3pz5G8zfHhTBYoWiIzreEUOjmBkaRCrEEP9g1bOJNn6E+3ZHhmcon9Xy7Aq8//whnTjvmr1ZKMs8fZRGdwdP2FlexPFSfyDs/TEsq3jTzLUCoZykE8GyyA7ZTTwMep5PEwjVYYE3ooqeRCjqKK5JsvjtvIlJRMiaKS8vJpxFFUGsfNLORn9KkfUBTrF1HE/xyKZPQfAGPGjysKRv8TuGXGrzatO3zo0B+VltaXlvbgYRYF9pB8N2/nzzzPGPaO4/6FwqcYyFY66EcPNvMC24L080he4e3QWziXnvyA79LAlSzkdl6ggis4li1kmM7p3B/EnaM4njTbaaWa/pTxvaAprOQYHuFXxJRyOhU8HMpj/ahnB3+Konnp9LXp9NdSqU/wJ2aTyefbhw27Iora3n33nORKr6zcs0+fs9ra3u3sfKNQ2NDWdl8cnxNY1Ci+zbAQgL8zmOu/SDtbuYbTQqBVYs2u4jOcFpI4v83QMIK8QIHRXE9vdnBeqPJ2xUQ+zstUcDTdwozyiGcYxolBj4sD2YsMU5jK8bzA0+Gva7ktBM7nA9laxwK6UU8mNNO3kmUHHWFWJKoQYk1RG5IvEwNTX6axjllEdPISI9g7CBgG00JEG1m60Ytu1FJgK4X6hoYb7/r1hMl1Qb4ZMYARoYm/imMZTyedYYfsyRqy7M0JnExf5tIe6qC1HEGKu7rUQTGJs4hZSXtgyciHKmMJb7GFuUHFG5HchpV0kWQsYVig73nmswc9k+dqamy8+vxLzpj28bl/y2J/y4xfnjHtc02NJzc1nnbGtE8+/sBDXf5YxnHU8RRrqeApyjk9KGEGcB6lPBhkG69zGGNpDblUF7CJ+8gHFWnEoRxLni1h+GoUdCblLCkUdnR2/r5QWB9FFVFUFcetUVQeJlY83dGxgvnsQ+/iqPoiivifRJGM/gOgb12/TU3rP+yt+MdD09rGtWt/uGHD7Sgtre/W7fxUagnbeINcaB9XcGkIJvwOQ+nDm8wnRzW11PEEOdoYztmhw95MzLhQ7WvmTvpwAY3cSyuLeY3P8S4ncSURG2ihLzVBQroldCon8lseoYP+wZ/xZpBXphnFC0mbMoq+x2FRNDad/mUU7YNU6sx0+ldRtIKyfL49ilL19SdUVNR1dq5rbp7T2dm0adO7cXxTNlva2vp6ofAZDuVjVPIM73dJv6+hG5v4HaVs43dsCYFWu63Z93APtTzBb4mCAz3hlMtDvnoFv+e1vzpET3I3PQK/Sbre62njcPZHlz5OgWEcGsJNR3Eh7dzJq9xPr1DSS4qXS1jF5C4zmXbwfKi0zQ2zXhOilsgbVoZEpNpQJd0SvFw9OIoKOpkdBldWB5fSMrYRdTH1C0+7nrUJ2a1vaLjprtsum3524MpJPXJM6JgnKA1LJpyWKdaFat8+HBMUxrs/vcczkRZ2BpVniu5B1fBi6GgXwr/NzGQ1tanUWB7lL+Gp8sG+9meWsSel7GIOLQwMyaDtTY3rrj7/mqbG85oaL7/6gt/eMuOX//u6a2y8ZcYvb5mxkHMppx+Xfu8rz33vK19PrspQttyXo1lFO8ODMGC3PynNEUxlOc2cHKrmu1foztmMCK6mlvCo3sQ0J8kYCNXo/oykuVBo7ux8MJdL5A2tUVQZx51tbfdns0vZyDQGB9daEUUU8T+EIhn9B0Cf+rpim/4/hKbGxqvOv2Te7J2cs379PcuWXV1RMTqOO2tqLk6lysnwHHP5GFfTmw3cEQSg/cLgwWeooZX9mcZsWoPmb3/68DBP8hZXcDB5zmUIOIoGvkUDX+Uy7uI6fs0pZHmGzVRTwd7MokArwziev4TubSe1TAmi0n34OpM5LYqui+MbU6nqdPqLCLrPXBSNTqU+QWdLy7KdOxdt2TIrisb26fOtnTvnbtqU5VrmMoDP0CPkSg5lIj/j3i578SGupQd19KCKr3Yxx2zmn3kxBEMewyq+0iUK/iG+wzCGkecQXuF3gVXv4BbeDhn4+fD2X2QnaWbyPD4ocH+Fx8iGsahJS7qOuYxmYOBbKVaGLnZ3ItpZzcsMYBAx+4UBS1HYe8uIGN6lj7+GpmBgQidjyLB3oHpZ0rwXZMSYzAYWBUa4hE2Mr2uo3b1bL5t+5WXTPxnyAYQEg0E8ye4SY3Novp8dhM53sSK864GBZuUC00qyq97nMZoC+RaCQhfwTpitmmMmGY6hPYp6p9MXRdEa7mVTKK8+QMTZ7GQTb9Iv0OKYRtY+/sDqpsaLGE4pF9wyo+WMaSc1NTY2NTZeff6nb5mxKQyXSpZmJj/+QM0Z065c37g57PNOujGaqrBjy8PwJMHANIJaRlFFJxvJhusiOZEmgL+E9oVQCZ7MqDB8NRtuUapD1H9bLveXzs4/FQrboqi6tfXefH4geY6le/IkxcpoEUX8T6JIRv8BMGb8uJlPPv3vr1cEmDtrzhnTLp83+3QG08pFzc1bmppmFAo7oyhdWron4xjDav7Aq5TSmyk8zZepoJVp7MH8QEAHcTYpHuNVNnEuwxnDedzDAI6jEL59s+zF9JAW2Y/P050DmMzFHMBj1NDOnhwZRpnHVHM0ndzNXA7mAgZyGVfyCU6Noo+Rpy6Ob8/nP01zIkykpFC4IZ//xl57XVRXd/T69c9G0eHdu39869Y/FgrTOYFreYy3aOuSK5lhACfxLF9nM7/gAY4Iwe9Jts6h/IabeZYvEHNGKJFmOYl+fJdnmMFjHME+XWZmHkWWG3kzaA8mhfGe7azjJfpxIDFT2MA9gXU18wCLQ8hRgkZ+HYaO1gTR5IYQFDop1BcTMvouh7B34Jo9OIgU80mzmF4M6PKRuIZaDiPLbJaGwadRoHq7eIMW+oXx6KjlUErZSHsYPlm+vnG31nM3RrKaNeG/fdiXxdzPau6jH6fTgwxHMIUneI0/s5yj6c9fukxyihlKHY8zv0sqVh0Hsp05lPEQI9k/6FVKoqh3On1hKlXH3ZTyEKM5OmQqLWYfBoTefWLtP5FPBINRggObGi+7+vzrv3fN15sal4RKf2nINK2iivVNjbOaGjfyR1Z0MTCVhdmhT7OGdTzAtvD8uXAcV4d7oceYGRhte7BtdeNPLAzRXRjCNHbwzm7fEjGDGUGmUGjJ55fn87vieFJYoYSY1cy9ZcYdf1N+UEQRRfx3oEhG/wHQt64fisXRvxP77j8plcoyg17sIsVJhUJDa+uTzc0Ptrdvo4W9g439YW6jF20cQSs30EqeMRwVvsWjQER2MDKMCzqFw6liGw8FZ3ppl+/OXxExmz+T50z684Mw+fMSlofRSmX0ZASPsZ0KUiF3cyg/5joOJR9F9Xwpjm9J5Izp9NE05nJnx/GcOF6bz3+qqurtAw64raNj8/r1S/r1+3F7+9y1a7+ayy3gCb7DkZxDT74RUpCwjk56cgb4PIs5PaQgZUL5bRhn8h63sn/whWS6xODvz7Hcx/ucTr8QqZM0PZOspRE8wYgk9JEMadp4i0MDPS1QziRquJ83uYeOEGKQsJBX+CNDQ1s28aovp4laegXr+nZ20cGxIdZ0d+EzxRj2IseQMGJemIHZlz0pC4LaLLOCzDRmVRj7OZw+Xbq6ifVqTAgkGt3Fnv9vUMFE2rsM86xiIuU8xcF/JbEdwxksYhuH0ZM+HMoiloWXSDGISSzi2fAek9faj/5kmRomRQkGJkilpqXTF4WrYN/wotlgpyuhtL4hPv70o+nDsNAc74reTY3RvNlvcSCzuTl41xI8wnNMBuN5PXQDmsPAqj9TGtS6fXgwzJJNAsjmMIuD6OQisvyOZcE4j4M5mjm8Fcho8sYPpj+FD85EyAdp7M447ovgo0rUHQu4sKnxvKsv+EVX+UERRRTx34ciGf3HQMJHi/h3kejVCoV9o+jOKDqIF1hAmpqSkqps9jhOZjvtocY2kfd5NGRh7sdQVrOYiG5k2cSfeYtJXMEoljCLRymjgm704LYuOTtPcSdHcx6nUcEN/JEHOJLHWUMiYO3BE7zDx7icw3iKNxnHtxlBr1Qq4hKeIU17Wdlp3B3Hn6Amn385js8nlc9/NpX61ODB+/Tte/jq1fcuX764o+PdzZt/xd7kQ5nwKBaxk8M4gn/lfn7BpqCMbOMQCkwNThfk6CAXqlB7U8UI8qTYRQktwbQ+gG6MDDQuQyP58BJphiIMKBJ0Ap2h4Z7vEhuEEUzkDfoEE1JCRh/kDUbTPXCImEW0h+5wgTSNvEoPaiglDqmfnUEwmgrWpapQWN0YusPb2e0ajMmyOchem9nBkPCQNLt4nwoWhLeZDw9sZU5dw9+8fssYH0Ye7AqEPrkBeImnPqhcnMOf2I+RPMIyUlSH3KvZXVSk3ZkSfm4OkfspakiF0ICSpBIfx40hXioVRYn0uSGs8C6baCHP6vqG7vfPfLC+oT8DuYHHu3A+dHATr9OXEqZSwo28wS5uYiFHB03qAI5iB4+SpYY/M5Txoa45iWN5myfIs5YVHEcZaUo5jgN5IkzYSjCQs4OiYz3tQb5cSjVbeD+Y/5Jq6wgG8TaL6KSSeWznM4ylGxfcMmPDVedf9reOXRFFFPFfiWLo/T/GMmb8uIXzF3zom/EPsdwy45f0p4IJmcyeUTSHR6jK5W7mRPqE7M/2wBvGUsUK1hFRSxmL+AvlxEylO3N5jfepol+Y7vjPrKQ7g9mbp7mP21nBpzk4XGj7cxzLOYcDuJy5vE0PurEXXwhx68dyFavZxRW8Sz25dPogrmdGHNfmcu+XlJwWRSt5M46/z+ncyuR8fteGDc9v2LBl69ZtpEtLj+re/bdlZad07/61dLot2Iym8hfWshfHMpMcP6WFt0JjNN2Fz73KQvYL0ZVVIfEHeVbwMOPYxbPh9+WBweR4LoxHnxtKgGl0mTWfEM1uVJKhJKhOm0IZsjY8ZyHoSltpYQLVgRCX8AZ92T+U+mLms4SDu2RFbeeZ8NL5LlFNwtSoxjCINaaEjbxAxA5aKGUnbWwJ+ydBIyuYyln05dVQhCthU7JhkfTu83N9Y+P6xnV0hN01ACzl/SCIjJjMZu5gLXiGdziV/ZjCySzkebK8x/JQPozDnYOQmbqryxSiQui8Z5mbUMlCYV4+/1AcJ9Q84b5Jnfsl3uRLiST3sunHPjDz6eh/vd++HM2rfC9EAazga2zksHBzgn3Ylz/zc8o5MTTlS8MBncIQlrKKKQwn3WWFOs4KHfxWTqMqvM0Ee3FOiKrY0iWBtVuY5PReuKVJfGD7hOt6Mx2hnto7nL3LKNCTz1Pf5StyyrzZh50x7VOPP/DQh/7JVlyKy//DS7Ey+o+BvSeMe2fegg97K/4BUN/QQH/+EMdX01IolFVVXZpKtbKI77CVfUOpbB7r2E5EFbXM490wPv5EOniMElqZzAiG8xS3M5hOxpLheyHfp5aJrCLPedSHL/6kodmP/XiIrWyjlv05m/VMJGIjX+d2RnEEVTTwz3yrUFgbxxWp1AgeLSkZXFr6z1FUFcfHcB2vciv9+EmhcA6junU7J5drqq6eVlHxsW3bzmltvaWkZM/a2pvLy0vZjwO4nhbuYhkj6c9V7Mdwnqc90JHNPEJ3fsilXMLzvNElJH8Br/JJLuHbTORBllFBjk08Sn++wni+TGnwJ0UhVnMZh1AeytLtgbyey3oWd6nqJaxiO6upoTKQ2nRwmu/HnuEsKGEtnRxDz8DAVvIig0NFcxR1zOkyGbWRlpC7tJMWhoS6aZYGhgey3p8JwU60lY4w9xWHcCjvBi6+iHEM3d2mb2psvOr8y//8wC62sSiY33FYoNSJL6eUcfTjYf5AJx+nPiiSG0Km2MO8yVD2YASrwiR3gXOPZghzknipQBPn0zd0zM+I4z75/J2Fwrw4zoZ99Rgx32M8F3PJ4w88M3fWnKvO//TjDzxECT04lnK+x+P8kL5MICIXatsFejCOFPsHfp8oRONgQmqgByPoF06AzsCqO2gL/rZJYeM3h7MlKcP3ZFhIgFqE8LSlTKQ7L7EphENhSMjSag+7okCGkdSwk57hvOqKvk2NnbfMuOXv+wQqoogi/jMoktF/GBQ1o38n6hu6JXNo4vhjhcK2KKqoqrowzPW5jNdpYSr7Ucu7rKGUZo5kI2+HEtFh9CdHK9lQyhpDEz8PgrmkILqMJHsrQzVZfsr8oKdM2NvveYKBLOZu+jGF3lzMazzIbVzAEL7CM6wuKZlEN+q4JI7fiePW0tIvZDIXtLd/MZtdxSl8PpUakEr15FNkObKtbdWGDVek03ulUrU7dnyntPQHuVz5jh2fiOPOdHpQFL3EJ9hIDQdxI2Np40J+zqu08UIQcT7BsXwh+IsP4zq28wYFXqKTH3No2PEXchWvEhHzNMdxfuAByUZO4oWQ+pTjOPqEvJ5tPE4vLqSeC6njdTaFJ1zHFkYEtV8clKaJwKBPl3z4nXRnKqVh0HkH73Aoo0MPfRfzqQxe+NWkQohmzE76so3GMNy1I9CUAbzPW+Hw9eXMoEZNMJKz2UYzB1NHpqlxHebOmnPV+V9uajyQPTiFocwNwsqICezJwmAtihnIPjQHsl7aZUkEEjF70CNY+zcEifPOUAdNtJJDWMsuSnmKpqCpRQmHcWqh8JdC4WUq+SPj+WrQD+DApsZPX3XBjXNn793UWOhC1yZwNI8wkb3CL/O8GIY7lAYOmtRrF7Bp38l1vEJzMITlwxmyndnU8jSzgr0puRspDXMZFlHCLSwJs2p3UMqhvMfjbKeDGl7nXSaFEIzdBqbujCdPM1uDyz6inb14gx93cZWhhZtZFF6uiCKK+G9BkYz+YyAZCvphb8U/BuobupPiGAbF8epc7r1sdmFgBvvy9WBtGUs7k2kK3uduHEkFEbvoZDR9eIXngn60hBGU0hpGg/YINZu3wjTtPHtyH4+AN7iOrRxEK8s5jbouwTdHhCHvidHkEwyibz7/GhdxHgfH8ZXU5fOz2tp+wPUsi6Ib0ukfRdG4VOr0dHp6FH2GS2pqDu7d+7u53PzW1tllZd+IoopM5rx0+ort2y9ta7ujX7+v1NV9Poo+xxDOZAEXsz9PcDLdmU4HO9nBtziaVtpC1n0d32I0MdP4ZvDu5EI200H8nF7s4JouPHU3TuBU0JcjKAu5pHiSA8KkU2G251TeCiPLE79RJVFIkn+bPmEoaNKhfpdG+lMTYo+2soGIY0OaaUSaZxgdSsWFkPS5KtQpe9LINg7hCPqxMESQYgx4iVKW8CC7urzHhdzLUPbkHXIsa2pc/dsZv7zqgh83NR64OzQ+vN+1Yftj+ofteYvWIIctJeLOLhOnFnMHuSDMTbGBxYygG0NZxHYyvMV6enIky8PohIn8mdfCrsBgLovjNC2cz/l/deCS/vVK1gc5ZnKMEorWO9wJJIKBT9LAQnTZyLfYyL5zZ6c4liWhtJx4iZazlvPozeFs5kGagq8oy/OsYxSVHMUbPBmUyhl6cgSlPBAkyEs5kX7EtbWjaQvHKAocvSfLWNllGFUZR1DNz3kBrOR62jmqvqHmr/ZJEUUU8V+Gkr9l8yzio4i+df02rl9fdDL9u6gfUG/2UvoznvltbY9ydhgKvwd9eZjnQ620OwfxNnk6iNibDTwZEqDKqGUqPbiXXXSjJ+tZSjPDKGEwW5nHHnTSi32DUHIj+wRfSCO1H8zESbCKJh5nPwZyLi/HcTWN/ITJHBLHn8nnb2ccs1KpqVF0Uhw/XijMSqWOTqWOT6d/mM/fTGbbtltLSj4ZRcPb2z8bx7VlZRenUqNLS/8ll/tDS8tLu3Z18nM2p9MzoqgtlzucP3Mek3iP+7mKX7OKe/h8lwFICW5mDqXczg4+9sG/zuPnDCDNT/gYEz+4wp1h/HofhCirpGh3OoNCRTAKMscxZHmFXgmxCGQiy3ImdDFCdfJGYMmvh67uauYzkpZQn25nMZ1BB9xJqr6hvqmxg/6sDWmjG6kKEgKMpydvdjlwg4LQcCjbuIdpjOAV3uHgoADuy2sJ0bllxi//am8IPH4PXmafwFNL6MabSQJRMI2t5xlWUcNsRlIfch7eI8cJ9Atm8GyIuNrEJBawmTiImIfRh1lkaAuVywr2YhW/ZCUf/+B2FriBxVRRwyz2pVsor1axi0WsoYo0JzOK39BAObMYRCNPUccEzuD1MH4ix9ucF/TBGQ5kGU8xPkz47MlBvEcZDZzJX7ibvqFynxymZJ9UcNbu/Nrq6vGVlaO2bHmyo6OVfuFsyTCGVbzNELLhWI+lnqd5k3Xsyd5dztUiiijivwXFyug/DIpDQf9O1DX0j6L5zGE7tXyXq2nlL2TpHhRp+9M7WEb2IuYxGiknkVcu4TkizmFwoGVL2RyC0MeznbcppZO92JP36AjhRGPZwWQGJ+E4VLKMm0N8JtbxU9L8iK+yklfD3KbNvMq32MxvyNPCg3H8c9rz+a8UCjV8vVBYms//LI7Xx/FrLS3vZrNz8/n57e3XxfE1XNfR8VIu96d8/oVc7qH29h48y2/Ly1+trf1xJjORl/kCk8BIvsjL1dW9GEo7n+3iKF/NVczlVDo5jef5apc3cgfXMS70rCdxNw90efg/s5SD6AgMcgtPU0MZD4QWfyr8G/M4r4Qo00So2sZ2SjmIHiHPPMMr9OXwLo+dzbscHGJQC2ziOSrDgCKU8m6Xc2dAiMTvxUHBvlYII873o52WkBe2mwP1p47neIi1nMzgoBXuxwkMoJPBLOSBkNiPOTzHFE5kIrNYFgj3noxlBVtC8bKOA1nLXCbQP/x+A905JdCsURxNHyZwKr15iUFBZpB84CdUbD9ifsPbXRI9SziOV/lyqFwmx246KziESmZTxgpWkAuCgdcDMd2Ln/Mgo/hquAGo4k2GMJQst7KcA2iglBZG8DteYHNoqQ/nEFbRwnD2DqXuxMCUZioHBK9YR2jo9yPdJephIVFb24ooyvTrd0737gNYGsxnyfW4B71ZHCqjKNCHY9nBQWG6bLsiiijivxNFMvqPhI1NRdnov4/6hoZU6rAoSvEo9aGwMZ40DzOX47mC/lTxIptDNPdkFjA/eJiOppNd3MJaIirZg7U0hurduDAvMSGg9UymI5Tf0pQE7pVjZQjDj/lX3uFFfsvxfIU+pPgkA7mXM7iMy/gG+zKZKynht5xQKLzHZ8N35HlxPCyf/6dM5sTS0i+VlByfy8V8PtjSL89mu2ezvy0r+05JyWmp1Ijq6sMqKi5qbr6+ra2DL4fh7AkyXNncPIxODmMfruchHuFa+nFaiNeJOJOIzzKLr/McJ4ZiXpZBHMtbXM/T/ISeTA7Zoom552XGMZA8k3mXu9kB1vGvrGNIKJem2cESaslRHvhEUhfcN3hlSsIEpuwHDUwreIW9GBxqZtt4ge377j+pvqFXaOPWENHEk2HCZ4oUbzMrlM2WdqHgwlTPoWwM3fbSLnJhbKcfEQeS5o8s5Wne46wwQ2g/zmUzK4JQoU+YkJkPotVK+lFNJXmaaKM7h4TEgGSpYQoLeJFJ7MdbNJPhT13S+xPqeSxv8hjNgdnXcAxVfJ0neYp/pg9TwwrJObCUiMWU8RKjmEzEKI7nFb5FO2fSyfYQ4lvC/ozmMV4GExnFnhzKm2wOF0s7ZQymhsHhFqU91HHbwriyTLAe7qb4ybmRT6XeLC3NpVIV27bN3Lr16VxuZ/fuU3r2PJBFXbxcCfVMPiLeZ3v4TkyHcfZo55WmxlwxA7+IIv77UCSj/zDYe8LYoofp30VT47p5s+fE8c50+rQo6kkL5zGHOvZlPG/zNCuDI3ss7/B+sNFMC8E97SEuMUUt9zGPLLXsTUv4uooZTgObWIlgFh7PGraRCSPs3yUK5bRBDOQBmvgeJ4TSTvK60/gJ81jCMD7Fn2nkh1RyPYM5j5ks4doQgPqTXG5Ve/vXc7lDOZavUeAa3uYwftbZeVdn55e7d/9eJjOpufk7FRVHptPP8f1QUkrQyFVVVeuDPWsvTuBB7uMwDggVzdIQSzSVKfyUTs6mB+kuIfnVHEEPnmQ/RgWalWhA3+cERgaxUFVgM3fwOn+kPIRuJiK/laxlz5AJmnhQXg8spEeQfq7w/7F333F2FXT6+N/33qnJpNeZSSMFCCQhjQSQkoTeAgQbEFQEAqgR14Zlxa5g2V2JShV0CSIKUZogvUN6SCFAIH1m0tsk0++9vz/OfvK7CtZ1v8ruPK/z4kVm7px72r3nOZ/P8zwfW+jNuygKA1PCfSeHpiKxKD0X/NicJ+8ZO6FXhI9KXEc8xpu08CybOJ7BHMoxbGcl3VnL7oJybIb7wtmNjdzDAE6MnxzC8HBxfShynRJU8iF6kI34oZpI/loQIUrJY0Apa1lNF+q5i7o4UGlWcQ+9OZTHKGdo2KQOYQEv0Bpizb68mxyzC6qDGMskfsHtjI+02ra4ZRzFsSwiRSvHxiNWJs7F6XTgK3wryrTZ33e1T2E1S4IUtlIe1qK5bKSM8khlylHPQnKs5wH2hFy1ja6cyJI47FlK0unnS0uri4uHpdPllZUzUqmSurrb9u17JZWSSvXNZI5ie1wwqbDEFfFEwTzbNkqo4THG1NV88KMX/vQbn/tX7WhHO/4H0J4z+o5ZRow+bEV71OifXH47594rL/rm808cmVS5UqlR4SP5ZCR3JorMQdzOIwyhiHexlSKaKI/+72Y2RFGtkiE8G9nvJRwc5pUdpCiN+PSlIEWeQbwaWZjPsY3tYRDO0okebOQ29kYnOilZPccXGcIi7qOIi9nHl1hEH27i+3TkFM7j1zzLl/P5+nz+YL7Ejfwrp/JlHuRaPl5aOqK4eMyuXR9obPxx167XlpRM7N79P8vKevHRcMY8yGd69jy5uvoLtEb9qUMEsw8IQ/dWitkTPeuhlMZI90TouYlmNtNIhmrQM+7928IU9R66kQoqkOBgRvIi1fQiFcdzZ+Q3dQvat4uXop+eiqLgYpbFaW0K0eRaSjgtngSSFz8f7vWiuo21KX48+9YvXTOTdfGmfRnAEn5HZ46jIgxnHRKHGeM4jG3UxfZXMpB5MWj+EU7gVGpoDcNNH0rZwu0RwpBgBzfTwLEs52U6cwKHMpUdLArCt4RtHB35UwP4HYvAPJ5nAuOp5gTWs5F30Rbkexf3x3wBpDmOCTwW1DA59Z0ZQh8GxGixPSFyzdOPs1nPtJC7tEZSQaJtGMlg+jM8znJbPAlkI32pmQW8SXGoKYoZyz4WxVjdIjazhFMZyUH04aH4rGUp47Gw7T9LaWX1sr5VJalUWS7XmMlUpFLp7t1P69bt5B07Hm1sXJ1KdchkjiouPiOVqoknmVZSHMIEXuPFiNxq5HnOZSqY9uCcHtMmv2fx3Pn/8O+69qV9+V+2tFdG3zHo3bdPe2X0T+AnP/zpv319bdO+LxQXj8nnX2truy2XW08Dw5gS7fiG4JGjYshNIxW8iwrq2Eo6Qm3mR5RMjk4kntzXg2MlVaXXWB+Vwiq6sDCqoYsLNI5pJtDGJl4J1WkZFdTzSRbu3w9u4Uo+y1eo4rvcwHNcTE8aOJAPs5VH6RJjRftzJZ04lY/zEtfRmX9lSFHRIeXl78tmV3fsOKNjx480NPxqz55vplIdO3f+WkXFhXyZH2cyc/r3/0r37uds2XIrG3iJnZFyn1RPk/riA0zmNZ6NL5Ck7Z6jgQdCxvdUjKnc75LM8SYL6UlfUtF/T/rsCZ9LUQE6hHpyTzSjD4tIo+QJYTHjGBEWnyRRaCdnRoG5jHU8S7/gwaLAluJYetJGatG8hUkH9vRpZ/36yV9VVlfFBhdRRlfWsicylVp5jqIIFk2a6cWsjzPYiWHs5XWmM4Rn2EEPFrArXtafTtzJYvAytzOMqVRRwbiCsZw9OYc+vMk+yjk2avApqhnLa9xLHSczMDrdWcYxijeiKlnEoVTyJCXx/NBKNeMi0ms35XSIwQfJo8KiMOw/HPeOdIFZvo4XyPJ4XPBlIVTN0cIydrGNV8jE8xsmkmMejZF430QTp7E0nFXzOSSiQJMP7+SQOmR5gWJOpcslM997ycyLf/3kPXOemDP5lHw2uzGT+S/PWXn50L59L8nlmvP5xlxudSrVpbj4g+l0KTXxhIkeTCbFY6R5mZkcUfA1M6qu5oMfufD6W9rHhLajHX9XtJPRdxLa+eifwAP33Nfc/Fguty2Xq6eVczifndTTm2Fs5b7QdyYFvxy1Ud3sShEv8WbcRw9nHSLHPhPlz1fYHoWc4WxlE62sZA296cRyekdDvyya2sPDMJ5iTWSAH0h/vsM9fIn13MYZsVsXcBm1fJLRfIJ6qsIvUsYN5DiRLlzMJs7gpxRRxaeTsextbV12774sk+lZWvquXbs+vW9f96amg7Ztm5bPt5SUjC8qGlxcvKZjx3GlpQPWrv1mY+PJJSWfZTWLWR5cM88LvMYnOIOv0p972BAFtrXcFy6iNs6hhmcK5IxL2MjJFNNAjt3cR473sIkVBY3gRHy5hc30KJjb1Bgn5XiqgyeVMY8+HB8kCXN5jcl0jOSpWh6nL+gQLHke/T9y4U8TelFZXfXj2bdcMvNU6tjGCEYzmKd5la08HcrR/SiJgHrsimJeBRXMZjYlHMdkjufVgslAQziM57mTpziBdyHqfBVvucYzESV2GEIlkuxsOWPYzk72hD6hLJbN7CyIL0VvDqKRRyIEqowGulLFo1EsT7hmM4+T53JO5Xh+zYaQkCYSlL0cQRmnMC+mWyVUcgdLOJIihjGAZ+JAZeLaGMfGIKPJ88NgzoistCks5c4YFoqenBKd+qREnaWlsrr6kplXJAfrS9d84wOXHZ3PZ5uba7LZvalUUSbTkXQq1a+tbU42+wyKik5NpdJs/P3RpocxOhSrfQtGV7TGoR5wy6zbFs1d8JYT1I52tONvRDsZfSdhxOjDlrcb6v8omtvaOm7f/qHt26/M56/lZA6lhSfYGokzlcxla8wB6kop81hHGY0cxhthE+4Yhpu9rGMvGSo4gDWhGS3n0GBOezkspsJ0ppUO4cZtpZFmqugQyZdbo+LYl9H8mh78e5S1kqWVMVzA90FHPk5X1nMWJ3My1/FNlvFd1vMtTuQMTuU8Ps/FpaUVXbrc2tr66vbt12SzX2ASx+dyX9q+/VM7dny4U6dj+/T5WmPjujVrbs9krs3lXm5p+RUf49N0Yi0Z7qcHXw63RyJ5fDe/o4xtPM8UjqWELD14Nx15mGIW0JEzQqrbxmoe5BDOph8fpCfzonOaZSMNHEIuQg8SWlMZhwIlEck5kjFBwtLsIM/pdA0StooFjKU6OsVbeR6Ucu4ts/aeM/nMgsuplMMpj+ifiaFxLOalUHAmaOQF9jKOHdSFr7yVnpwauaQ4mAuCQKfI042JbA8zVoLOdOH+Aqd/G4/xGsMKVAqJH2seNQVxrQcyl+ei5FnPfeSZzrG8Eqa35AmhA6XcG9wx0U2O40Re47nopz/CgXwwdA6HcBmbWEyaldQynpbg973Yx3PxaLEgcqCyMWR1R6T9lzCPNo7nfGrozSm8zr+zmmEcSg9OozNLE9IZH5whpDkoquObK6urCr8Rxk44vKWly9atdzY0/NeRzOWa6JDJfCiXW9vaekc+v4ksh9M3NN+pOOBd2cU3eP337Wj3cg8HVvb7vfdqRzva8d9BOxl9J+HQMaNWLF76j96Kf1KMnTiGcRxLE5/nJdDMoVHX2cWkGMzzCpuiAX0Yr7OFlhjpuRc0kYqc7Sy1Yc3pxiHhPk6I5gExLycTxadc6Atb6U8br4Y/poSqeFlZ+LIrKGc172VpkKrEfPMN/p2q6Ce2MZEO3A4q6ciVvJ9vUM01vMw1rOBg/pXx6XTfpqZ7s9kj+CZP8Y0kozGX+xxnkd6+/aep1NSSksvb2n7R1raZxMNUylmczm7O5pIYmZON7Z/E1eTZFgFYTZF7lRCyozmaVoaEl7yEIvawmHM4Mk5gEadyFEtiyGcFB4fFJM8GXmdkRKy3sYun2ElZZD+JWecdODpSn1LBfU9gQIwF2sJ8qiMQFOPraqafM/mKW2b9+JZZd3MIm1jJEOaSZSjNpBnIqywjTw0v0IPxdONIOoUJJhej0gvRkVLKWE5t7HiWKh7gxXjZYMawiIfYyi/Zw/FxTW5kLkdwajJsLBzi6MZ4dkTx8gEO5NzQmbybdaGjyIWBbzzzgnommtEkNqGIGnZwKifQwr5Y0pzJCMrYTTH30EpH7qWCk+IBLMV4HotjmJzEEyI6rZRJNPCvvE4fRtCFk+nG44j1NMRT37MsDsrYHEdvJ49SX9mv+i1fDF2Lis7bs2fZtm33tLXtzOUaUqkOqVTPTOYDqVRVa+vsfH4vPZhKNQtoAPvowOlM4BbujbXdygucxq4/IL7taEc7/jtoJ6Pt+F+Cyuoq6hlChkP4Pr+MyuUJLGUfWQ6jlWFsoJ6mqE7tIheTtQ+miBVsiqJLL3qTjqidIqppiuqdmBODRt4gxz42FIwiHEoLr1IWoaS92REj2lFERyr5OL8Ey5jG4vBPlFLE43yeBjZzH7/ji6Gi+ySbuYEUn+dZfplI+hob725svJUMP6cb36WIG2mjZteuRxsbn8nlVjU3fyub7ZnJfCGdvpwbeCy2vBc/4YmowGWCIz7CN8jQgy4UU85rYG3se+JtqoxC7062sjfyOLMFSxujYmZ6ZZD7pNK5j60cQ2WU3/byLL04qaDb+wLLOTTGo2epYRkZTo2ubsJjljOKvuFPT1BeV7P1wTmPk+Fp2phMJZPYzMtR4+zMwdTzDKsYzpDYhTwHcSB1UdD9aUFgZy23UsL5nEUdK+OvOjOCZfyCRtL04Giy3B+TmfLBwlfznojQP4AP05P5iCGcI+jO0xzDcQVpqRVMp4RVBQNO+3I89Wz8/aepcfRhG+vDwNSRCjrSgQ6sjnJ1Yi16gX2MYkXMHhvGKIZyOjWk2c4ZdKGVCt5NT05nOLfHY0wi+R0dYV7zydMhbEan0sbD1ERg6nYep89beL+6mtpUqjydri4uvqS1tWLz5p/mck37Jxek08dlMh+mlfVs4jDOjtCGlrhaRnAeK/gWX2Etp9GBxr/4m6kd7WjHn0c7GX0nYcopJz3x8CP/6K34J0VldTVz2U4J/TiWB4ITVHMWbcxhJ6V05tCC6maaUeTDXZTkRA6kkTepoDlGKDWwKhwPuQLNaBEtbOINBlAZc8NrqIuefo5d8aaoDPFfKy9TGtHo47iej/KRIAp5SlnJzfyckfRhLZVcGXfNRvrymZgemeajdOE8WrmFL/ICRzEJXMpkrshkOpWU/GdR0UXZ7LpUamY6fRbS6XdnMjekUi/zQ+rYw1Hcx/cKAsBv5W5GhXy2jRYe4jVmsjKG3YvaZJr1PBKy2l8wP6htsuzh5ywDZVHq28kuypgck1qTPvUzHMG4IKx5HqOZs0PhmuJ1nmdErArbYtLjeDrGK3eCV/l6PFo0MY5DoxSd+M/GRNwsMvQMP1NrAUdPlvog64mj/D5eYB6/YhynUMQgptM1SGSKDhGVujZ8960MJs0hZGhiB61cwKCCa7+Y0+Ja2hQZYXk+wHJ+HtuTLPNZTke2h/ErTwlj6cJSlpGK4bRNHMpqflAwthRb+C6b6UMZd1BMT05jIGeRY3PIXltjSEGOY2Pl+6LhkBitxtCDHE+EzBo5BnIIz7A+qGcxR3JoTIUo52nGchAtf1CtrKup2U89M5kTMpl353It+fzGfD454+lUqjut7OYultOZc1kWLjG00Zn3BBE/M9E2VFZ3/eNfRe1oRzv+arST0XcY2j1MfxJVzInbW2eOoYl72BwSwy7cSWMQ0MFkeSUCQYsYzG7WhG+jK5topIUXIvgwzZpID22hY0Ge6G7GsyGqYkk5aidFkQQ5gTytbAo7VJrGqKQmhLUbx7KSKYwOc0kpt7OA40hqwKUFU85RHln9a1jEl9jN0VxNip/zJtfRxGe4mLmM48e5XI+2tu/mch0zme+nUn2pZy/7UqnBmcxNqdTBfIdBdI6h4V/kNT7DYt4V7qIGdvIrenAVQ7mKPswJh1OWebzMlJAPHsFCfhH8bzG308agMNqjlnWReY48+3g59KADozWfZgmDOT7+meU51nBSwWSdtTxNwldSZGjmFUZyP9czlENJsYtsXBL7l13soI11wfnGRqDsgnjAaGYBLUyLh4RqJrKSZbyPsVHgRCmnxE8aQtiQbN4CVhf45XPU8SxjOCQmJuzHPu5gG5+hhaU0Mp1+zKCK28KQ9DCL+AADGcBmVge9Tp6mDmc9j4Vyt4VMaA9uContPG6MlKhGTmQ0j4T+Ibm8x1LCBuYFr82HxT7LArbQxp0x8wxt9Ixprq8HSy5mNRPpxOoCWe0BnMBW6jkuKtwtf/B1MHbC4fn8lny+HmTS6UpyudymbPbOfD6RUiTX3mSm8AQPJz8pKxtPXbgMM3HtVcT1Nreyupt2tKMdfz8Updrn7b6j0LtvnxVLXu5zyon/6A35p8O4ieO5m7O4n8cZTTVFHMzDYfUdRB+e4mUGxXie4axlLyU00pVX6cY+1tE9QtQxjG4xe2ZzBIx3ZDBr43a7J+blpFnEQayhJBxRb0RlsSZGyBRRFak3HXiTYVHta41oxjd4mQyTo1aHCfyAtQUD4h/jPzmRK3mF6ziHBbzISTzBbhr4FHv4KVN5hQcrKt67e/eP6JZOn1R4SHO5b6TTz3Xt+vHt239AP8o5ktf5Lv05PCKTimjjbs5mcvx1hvPpz92Us4IWzqKYDWTpynG8zE84iOVUxwCkpPb5Bm1MiHJgnq0s5eDInErIyjz2MjGKhYmsYmcIAVuDWS5jLYdRwaowMG2kLDKJjgq3UyLzWEINR0el89kojCUl2C6Rn9qF8aziOUaylAM5hnp2x3ZWUMkO7uZ4hhcc48d4PexEbwYRT/EulvMih5CihuUF45oGMCdaxuu5l/G8lx0cyhCOKniLk+nHEyyllBl0ZiNdaWIdOxhZEOR0BnN5IEKXEip2ML15kmXUFeQJJJrpgaGKfpTx8YyUZQh5HmJ8HNh6FtI9zPvVPMYIJoZzfyGN1DOXEp6jgUkcyGruZzcllNOZCsroRT3bKqsr/uB2Nm7i+Hseq/rIhf+yZdOh6fSgfL6BFGezNJu9N50el0qNiLywIVTxFHekUqW53B568xCHRcRBE70jeRRd22+d7WjH3xHtldF3GHr37fOP3oR/UlRWV7GHYRzN4SwOgWZHprCAEvZyYJSF1lJDMY10ZF0kpa9jQEThJK32YWyKOmh3xkQ6fVn4dXZFBz/Ha+Hir4iI8tFRUt1ME4czmko2szzEpv0ZxGbWs4imqNthHlsZGbW3DI2spolzeYIvsp2f8BM+xpXgEL7O0zzFTVwaneV3g85cxuJM5unKytu6dftIr15X851c7trkYObzb7S1nV1WtqO6+qddu763U6fT2Bs0+kBSDIh6Z1t00j9awET3ixTfxbm0hK+8jOKC6MochzGEVxhClyiIpqmlE++KQMrWxMyeSh0VpLOZbTzEDnrHlmAZr1AR86KKw/+0gyPoHhLeXaQ4jsMjTr97OLWT8t7hNHI/b/AwAziZFE8xOJio2NqDqGYxIzg6Mq0m83JB/miiRX6Mh8EebmcVB8eDSheWx1TSUsbRmwXx5DOTMTzKv9GRfyHNjfyKMyMV/1YejkJjIdoieHUzjVEqfpk0E0nzdCQrJQdnIkczvyB9KU93jmErRxWEarVFXv0+ukR4wmtxcouoZTcvsomO/JYWhka+/WBOYgP3hnZzB6cxlE104BzG8BN+x3y2xEPF/v3qQDNrx07wmycffNuvhV8/cdfJU1uz2WcL9n0UF+VyG3O5h/b38SnhlCRAI5tdHz6qdfySOhrowCN0Z9LYiYe/9b3a0Y52/M1oJ6PvMIwYc9jyxS//o7finxbb2EgdTZwYfvl9VHMmaTaxnQNIc2A00LezlsMZHG270YyOqTnoGRlPG2LiSxGdKCdLPTs5ItJ5cnSJClYmSnpDopI0Itw/fclzcDQu0SVy1PuzglLaeJRtccvPRuDRfIaF9ep9pPgkDfyII9nDHupp5WN8nOu5lpmMDoN/Iis8MZv94JYt/9rUtLhjxxMqK28tLn4jm70ol5udzX6oW7fTKiv/rbi4L4qK+rI4ckBFNlOy7y+SopgfheFJQSj6bH5H90gFamUPr7AvEqNSdAlRbMLdt9DCAA6JsTpp2ljPSfl834KJ4Ylt5Yzgvm08zkrGBKnNsppnyHNYFPmaKqurKqvrY7NLg61id0GSfxGH0pOFHM74sNG0RNF0P3IsZwcns5Y72Mj7GcGFNLMwzDe9mEgdt3InQgyKBjZwAJsKxgEMZTypGCX/KOs5hN8wl3QQqRY2Mpvz+RAvcmekNOBJHuQULuBwbuS52MFkTw/mQF4uqIPm6M+5pFjFzmjlF4fDL0cxS8lxV0wmK2I441ka3vw3WM9RHBqX9OmU8hsaIimpMyfSIzTHp4V4uiMfojNHcAGLeI0TQxnybFzhHSuray6ZOfn62bf+ie+Fq6/5+kUfGdvW9kRoJ5KP2/n5/BCyvBxXdYp8Pp/JZjOU0YkT6MYc8ixmDMe2u5fa0Y6/O9rJ6DsM7ZrRP4Gqft34BcNpoAsn0Yl1kRM0gGbuZ1uYIQ4iRQNHU0F3Doj6X39OpJhXIqMnQ2dej0ZhS7RQyyJ4aG/U1ZKqz4EUs46tpOIWK6p0K8HaKDHWhg86ea+Ea65iH3to5rUIEkpqovWxndti3OJzzKULnelMJyr4HddwMBv5ZSQrFcfo0We5rq1t5KZNN+3d+9vi4gGVlTd37Dg4n/9Jnz7f6N59RhzXfHFx35gR8DTbg4yuZQFVVJJlPI8wK27VG/gSr8Vc8oTF1vEg1RSzhpeD3CRssjnEuF1JRYDUVtZH+7hDBK3jkahrpuMnD5JmasgNsYyFHBz/zLOlsrr2+tm3jp14OOuYR1MEka7mZfqwl13Ux3yEk1nJw/HKRGqcbHyWPbxEBadRThlHcUIcuh5cwLAI6k9O7mEU0YWBYfnHekbQle5UMJ/6YMnFNHMzOxhMKWPYwFq+w6d4gkVcSjcO4krK+BnX8zNe5WLGgWP5IC8G507HVvXiyJiGtbWAjrcyjPkFE9sTDWs9z9GJj3MeD0dUKnoyKU53E8cFk+7A0WA842LgVmuU/0dEmTyppyZnfGNcS73oGpdNG7sqq4vGTthFa2V16aUzz740gu7/GOpqah+c83g+fzRdWIJ4JkweMNI8EMOxdlHGvgKp8ShOYR9HcVAyVq2qwClVV1P7p9+9He1ox59FOxl9h2HE6FHLlyz9R2/FPyMWzZ2fz3fnq3yYGtbFYM8OPM7rdKSZcSynOcJEO0X5M089a8jyYkxpyjOA1yJMMcdgXg8rwyuRcZjhDSbExMil7ArrQ/ekjRhR8Dk2sidKrQdGno4IeEIzW2njEHoEPcrShWUcyGDeYAc/52VejcjPX/HJ6PPiu9zOl/gIt9I3smkS3M7vmMn7uWrbtmWbN392w4az8vk9ffpctWXLV7Zu/V68MhV2+MMZxAtk2MEaJjA0dq0rR7GTr/Io36NzDLRM+vKLeZYjqKKNRPf8bHD0LGvpwJjgphnWsSxy75MtaeSxUP4NDJaZZiEHRWs+IRlPUMfY8NrnWXvJzGN/8+SDldVVldVVjCbFM6TYyToOoAMpWllKE6fSmzPpFGYsVDCcNl5iMYfGxMil7I4acCFSMTrhjaj+iktuX5yRUZRF0bGEQbzChshySjGBrgXhtf04lG9xD+dyUvyqhX3s5uRQ6B4auba5iNnP0AvsDE99KnheTx7hldjCHAM5g60sYF9s9kuM4UN05GA+EcqWHC20MZx8UMzkaimhgSYa6UcnNvEYu0MAk5zH3fyObXyMxSwo+FAkbr9ll8w8+jdPPnz97FsumXn+9bO/fvq0s95ywOHBOfdeMf3DWDR3/tmTP1JXcw5juTxy/pOPSSPFVEVU6koaIyLqlZBEp+KzX0WGrbx086zrEw5686zrz5780bMnvzuZKNuOdrTjb0M7GX3nob04+ra44sKP19UcFAE3/VjIUjqwh5NZFN7boZwa2tAtkXufp47lEcye4km2RO/4AF6hA028SortNLCb0ZHvg9bQDjaHILUDbfRjL7W0siruypsopon+rA/z02uk2csOmqmLqtIhFAcVaKM7B7KHw/k4VzCaNzibPXyAxVzCLm7jEG6lE1/nPXyf5/gmTXw7Qj3xvsbGcel0RXX1dzt3PmXAgFubm1ds3HhJW9tmNDTMi30cwpHk2MMkOqNAA5rhMPrzICNjXFBCyjexmrMYHAXgIiZyIPNJ8zqDGIqC6fObmBI27Rw1PBbW6WwMVn2WHRzCwVH0TWxkGcbs14xWVu++ZObpv19CS9jSYBpZBTaSLWDe4yK5KRv1vCfiD9MMDMFAPiKHKqjmnhi4gCz3sZgD6chAFrEbFLGNraHNQGtldf3p08ZHfFg/9lAbAxdq41GnJHS3a9hMOb+I66qEZ7iLkxhEJ86kjVujDrqO+ziRzqSpYFmBqjVHJZN5ladDslJET86hG89TzDOcy2kFR7Kc93MsT9EUCpNEbNDEAraR4iE2hLQg0UlX8TQrQ8aQ5YlI283wXQZxF1topKyy+o1LZp6y/yReOvOKP5Y8f/Os67/2uXsWzTv47MnnX3Hhd7msIHriWM7lPlayh048E5kVib+wlQFXXzO9snpZDAhoirrvazzA1LqaS86ePPNrn/vSLbPmM62u5pQrLvy3m2dd/7Yb0452tOPPop2MvvPQXhx9W1RW9+BBPsceGpjKZt5gXwjgthdkJ50QM5l20xLdydZIIa2KEmAZzSyKUMk95BkZdCopwg0Lr/2+qC11opRtYYhZyAGggi0MpBNvRnJkLeNopjw8RmuD2yWd4qTjOYh+ISrYSx3ncTZI8X4m8hjHMpTPcgrf5yG+yBt8HHyATzCHgXwmLDu5UKOOb22dsmbNeXv2/La0dPDAgbeVlw9fv/78TZs+39S0mH1RS+5JWYwASLAx4uWRpjd5egZZ3BrRV++hU5QJkx3MMpgp5BlFn4JK5+bofXcKVcAq5nMEI4LjbokSV1+a4kAtYhEZhkZZrqmyuur62d/+fSaaimprH0ZQzmEMjWz2XSGLLFwSElnC2sg8EtOYHg7q1pnRLODnbOImtjApqHzT2AkHjZ2QyBKcPm1cQa88W1m9+/rZ/3bpzCvoQCdWhv08xWA2Rqo8dvMUHZnGMRzFL7iT59jBGZQFjW5kBOO5kwd4mUkRsNpIOSNjLkBzVG17cjoZHkCQsCxHciJ5JjCiYGLt/mU0h/AC6yOcNccCMvShlKN4jZeC8BUxkAkRRlbObxjGCFpC+jyVy3mM1srqfdfP/t5f0pG/edb1t8x6nakMrqs5iw48+vuv6hafl0TxcmjMpNhOZaI5rqyu+s2Td4+d0MDyIKOJ6uPKGOV11YNzsqGWKeW0W2atuWL6jLfZpna0ox1/Du1k9J2H3n37bKnb9I/ein86jJ04hnexh4/Qm3LODntQovI8iTZ+GU7tDAewi1K2cAgjeYoSmhjAOHazmgPpTx8GxV12KD2izdpCZaxkXQyqKWMo+yKCvgstMR1xOTkOoIhVVLCbXCST7+B4UvRgJ71poZ6WSPTcFVq9EdGWTdxIE7koiG+G23g/a3gvxzGEC/kcP+VLpPhUKATSEdV+I/e0tn5o06ZX6uq+ks+3dup0QlFRj8bGBZ07n9yv37+Er18cojyNzC8ubisvP4zVLA3/tWgKr2YFAwrkiQ08T1eWBFvtSC6ktxk2sJMBER2VCVqzNrJFSyL182GqYyhAIjl9hDVRXi0lx/qxEzpcP/sn+0toQVZeYj6rw8ezfw3JIT2IpTwaJLKFx6nlZE6iitdDYojR5Lkv2GqnqDffQW8mBsMuumTmEdfPvvX62bdeMvO8S2ZOvfqar//myTvHTkhTVFm9/frZ1xfU+aoYEtm0yQkaQibCU19kJCdE7uaBnEstT7CR+3gjCHQ55ZEnuoLlUW5vjK5358hdml8gIchxOEeSipZ9JlJCU6zj2kif2L9s5rvspBuvRybok1RySKioe4Y245GC0aNdOJJyWjmC/iGTGBrS56XUj50w/PrZ3/mzEzjramqvmH75LbO2Rx6TUBt34nsx3QAP8hsOYQ8H0cbToco4gC77JztcP/vWq685n5V0YDNfZGTBG57NSfyadWQ5dNG8cWdPvry9Zd+Odvy1aCej7zz0ruzb3qZ/Kyqrq2hgPNUsYhuNHEeGX/E6HShhIk+xjDL6chxNMd9vEJNCTpr8cDBlIbMrZidtbKeVvqTZElaMDF3oFWtuiuLTHvAME+hLJ3bQl800UEo9mxhHNnJPt1Ef1or1jIrsUtHyXshDBU3bxI30Ov8eN9ESunJsWEZwMGewmSs5im9wEl/gGbCGj9LKDzmCS+vrR69d+6ENGz7SsePZvXr9aNeuBzZu/CmzQvhYSpYtqdSKrl3/LZcrbmmp5ShSvBS73MZSNsfonTZybOJ+KrmMTjzB1iBA2Yig38JQmsKjXcsCijkz4guSo/0SkxgVzn38lkzY3vM0VlbXXzLz9Otn31rIRB+Yc+8ts9ZxBpeyjyUF2U8rGEnniHZqZQ51/JoyTo1W7ziOiMnyCYZSxTqaQv7YHxyShMlXVmcumXlWYX85+f/K6qrrZ9989TVf/s2TDxQwrVSM7jw0qu8p0JeBkR02miy7mBvj4EeH/PGbdClINniU+RHmfxAP8wJ7C4qyGBbpp4lnKBMToZJng/vjISRxj72LftwUs+PxHD+iikMpjaeIFkbSLy6GhHqmGcPYmEa2XyramZJ4wNvM5ug2fJ8H0ukzxk48/C+ZBX/25DPrakYxNIq1rbEczCiu4VFm8xKTaaSCfTwbWV0ZGniE2v3hTadPO+v6269lH8eG679w5cM4lGcjdf+Bupplf3Y729GOdvwBilL/6C1ox1+L40858bpvf+/Kz3/6H70h/1yoqq7iOTpwEOt5kiGRdX8sT7Azci7PjApoA0M5jefYTje6U82OSL4sjc5+ouCsQLT2BlFEN1KsjGJhYi7ZRobXOJ4Vwaua2EoRxbxO1zBD9GQvq6Iml2IJR7CcMvYU9KwbIuBpOG9yDR+MxKh7eJYJtPEC3ZlGp4IxmOjEFH7Ei3yWDzGU74RAcDrncwdP8Q0mt7YOyWRuS6e7NjY+m8udyvv5BdnQaxaxp6xsWnPzM506TW5r27x3bz2HsZ7FpFhGBROjVrqXV5nH6eHsPoeXeCR4Uiuv0pNjWBnG81d4jUk8DYrYGfayd1EZK0+zkmH0jNJ1qrJ6yw2zf1jIYBbOnf+1z/1HXc34mOqecOLfsoQMazmVnjFyPc3BrOGxaECLGicGBiHey16K2cZpLKWWoQUMezNvVFaPnPHH+8tnFFhwqqqrzph23ANzXgg2lqeCrfSKIm4vVrGBiayrqJiWSnXfu/ff8vlN0dTGxbzAbeyMxnoDKfrRlZdTqeZ8PhVzvEqDemIt6xgbEo4M5/I8D3I43SKP6VAqeY6V9OdFjmAAuyPgrDt76BF9iV1B97uHrTBRaW/gELpGeFmedaykktk8S2s6/cF8vq6quuovu1V14REWce7vO8l+w5tcwBZeCcFrYlKcy0gqgvQ/Qt/K6t5vebtB/IqXmEG3gp/fwstUUcc9SR5CVb/q9htrO9rxV6G9Mvr22LJp8xMPP3rnbbffedvt/5wCzfbi6NuhlvkRyzKR7TxEKXs5n11hD+rF2ZTEXMfO9KOFZ+KfrYzg1cgkamAF+SCgvegRkr5WNoeys5ktHBU5UDm2RBm1hEUMpyLkhokvajBr2E0TR3AQQ6JnPT4azYn9ZTh9C0oyR1LK91nAtSzgFAZRwnZSXM+rBRPJ07zITYygExewgcM5LoYGHcxtbOXDfJ2lDMhmy3fs+PGePbfTnV/QzHUMpjtH0b+paU5j4635fJLOk9Qs+3E0aQZEQzNx2+xjDZcEE01wBB8Ma84rHBQFv+TAJurDUyOINMtqHqYv5WEPb+MJ1tObPlHAbqis7v4HTLSupvaKCz9RV5McxpaQyWYZwwDKeA99o1OfCBZbaOBdvMkjweeS5eVg//1ZwRbew3Dex4EsilD9OvYypa6m7i+/iK++5uqrr7mCNRFSm1S+32RjKtWvqOg/U6mTac1kVnbp8qnS0jOLiganUnlmBhNNcBTfYTSDwgyefNtXFIwS2MXyUBckzq1J9OBxVtEWMoB3cSYreC0KnOjOSZSxgJMjIaG1QA1cHB+BxZF49UZERiTq3gn0Yj5r472W8wZHUZ9KPUwunb4oRlH8edTVJBfSJHL8iKRCuZefsZuLOYCJfIhX2BUf2COpIktHfslBTHi7dyzjTFr4QhjUdvMNljKJLaHKGN6eQtqOdvwNaCejf4gtmzbfedvtX7zyM5vrNvWp7Nunsu+yxS9f+r4P3Hnb7YX87x/LVtvnML0V4yYeTg+68jSdqedcukVmZAnvph+vspZi+lHM47wZtveDeCGqm7vZExPkV4Rj4yWKaWENaYojQ3QYDRSR4lV2Uxqp4OOoCO1jC8MYHAwV3cJMPSIoY3L7TzrUQyinim7k6RyO/qS5mYhcf04pZ9OFDKVjJ4wOn/iveRLkmMMCLmASI3k33+f9PM+NDOVbdOFsKvk0D/E+WrmNS7iZAXwEzOQk7ikqau3Y8afl5d/avfuXvXt3pjaGoHYIJWhC5belUjtoZDS9C/qbCfrQM/SCB8Qc1Aw7KGNa7Fee15jPkRwcFqhNPEyePsFNc5XVuy+decq9Tz70dl3dztzN45SETPYlbqFz1FO3cR9TGMzLbOTIGJhewQNsoI1n2MiZ9CPNKM6jZ7zLsZzJhpihdWAYv/4KnDHtrHufvKuyem8iOThj2hGXzpyRTk/LZL6dz+9LpXqVlBzZpcttRUUjsHfvtbncURz/+43pVio4MZXaST17gtW10BRtgUH0ZjkbCtjqCN7FSlYVUM9+nBfhCZuDqyWXaye6hO52BXVsDDf9elYxMtjnKRQXDHbCMMazPqJ/93BEIsYYM+ajw4efkcv9ik2p1IK/pEePCE84jBHcxxx+TA8ujI1HJefF9TM02h3b2Mckhsdn/A9QTpojGMdtXMeXaGVKBK+OYDApmv/irW1HO9rxXygqaDy1A7Zs2vTEw49+8wffKSR85100fcumzaFFc+dts594+NEpp5zYp7IPli1++Qff/t6UU04876Lpb1nb5v0UdsToUX+vjRwxetTyJS9PaZ9QX4DK6kr2cRw9mRuFmUkxRKc0Rj7u40lG04kWjuZFDmQfA+gU83JeYSyd2c3rtDCcNdSxJihUjt3soBsjWUUrDYyN6J/54YbpzOs0k6Ub/djF6wyJsfUiOT9RIq6gF/3DSJ6PEaBt9KQ5nCJ9eTXkiVnaKqv3nTHtrEXzrqOaLiyIyusArqBjHK3ETZJs9pdp4PP0KDic74ua37280iCvnAABAABJREFUxPUMZF+IF49jYC53X3PzTRUVG0eP/mF5ec+Wlj11dS9ms4PoFa38NGvS6b1lZWc3NNzNc7zOewqm4KzlV3SOGnAuMp7W0JWjC0h88uKTgxMkP3yOYVSHfbupsnr31dd8YdzE8W/9WqusriTP8cxnDdN4ieUcSzGvsoWlXEAJOzmIg+OvUxxKV+ZRSh+Oi2ymRQVemf0ojbjQA6mrrN5yw+wb/9pv2srqynufvO9rn/sSFs5durluXDp9PNiUSj1RVvYvqVRxPv9fnD6VmpvPP8dVISdIcAtzKiqOqa9/jb7s4SkOYUAqlU6luuZyaSoj26G+oDbRixNYATbSg3JK6MY+XmBolL3bogmwM8JHZ3Aze6MwfFhET/yaoxjNKp4rkDF05RgWxTiAPKmyss6DB5+Nnj0PW7jwO7lcItX9MwewdmNNPMtl6UtPXqIzh0S9tnAlY3gjhk1soJWeVNPG65XVPQvfbtG8+RHjlWUAlTxKdcTNNkWIRJZ1ldUd2++q7WjHX4v2yugfYtnipb379nlr6XH/D7ds2vyLn86+8vOfOu+i6VNOOTHhoDff9bORY0Zd+r4P7q+Sbtm0+YtXfvaLV3728YceXbZ46eMPPfrFKz97522z37a9XshZ/xKMHDNq2eJ/RvHAPxaV1V3IMYBjqOVJsnSIPMVH6cRu3s1q1rOXfpxKXbREu3AUOY6IuMSEKiXBN/3oTueCjnA2qphpBpPloNicPREO2kJ3urOB18lEnP5QVkWyUo4V7OYYMhxILjy8idg0oadnMZLmyur1bARFNJNje2X10quvueKMaVMrqxNa2YFJcaccG7vTxjZmU8XZDOECukbQZiFaWc6T4S9BRzrEsiGXe7Fnz0x9/Rv79q2fP//zZWVHjR37QCaTOKnT5NjA6Fzu6IaGG0tKyphCCz+MXu0T/CdVDIuMyRZeitGsido1y1p+SzHHRqRrYqNJnhYSyWyaXGX1phtm/3DcxPF//ALJ0ZFJVHATb3ImVTSRYhvn05E3eS7EkfuRHOdmOrIj7OHoxwLuLCh/Ps+vokj25qUzx9/75P1/c6ns6mu+vnDu8s11Y9LpY2mlJZ+vKykZvGfPlY2Nt6dSxalUMeni4vMzmUF8mntAC19Lpx/q3v38XK6RbXSimLG8znP5/N4C41cFI8MpvzmofzHdKeeBGFkk1LHTI1tqV6iHa3iM0/kIw/kuE2jlcDqGGDSRdD/O85xNijfCKZU84XSJBIbFTU1eeeUn6NNn4pQpN1VVjVg07y/0p29nc6w2KXD2YXbQ30x4/9dzM4OZQZ499At1zRJWVvX7vfM1dsLhrGV3rLkkyGueZlZECXnVpTNPuPfJh/62c92OdvxfRtGff8n/MfSp7POLny794pWfTdhhkjA/5ZQTjz/1xISMFv63ECNGjzrvoul33jb7mz/4Dh5/6NEtmzbffNfPCl+zZdPmS9/3wW/+4Dv7q6RJkXX/Cv/gvf4E2jWjb4d9PMBRkRbUyt1MZh8fCB9xA714P4+Er6iEo3kgrCq9kl4bHdgVKffrqGcIFRFC2cY6GmhjMYOjsthCEbWspxNr2caBMV+nNV7cFtbd18FSxrKWVygOylXKDkpZz+EMAz3pfsPs6x6Yc+/Nsx4Kovz6GdP6X33N3clROGPalJtn/ZZDQVKnuYMpEUu+lovDH4NyPsDj3MqH44c/Zx6f5Hj+nQ/xrxwev72Be4YN+3RV1TnNzdvXrn30gAO+RWrNmh9ks+dQyl3s5qP0opkDWlp+TJrxvMYdDGY9h9ElkkdzPEsfTmBdDFZdxqucwCMhpd3KPIqopHNUvBounXn+n02gpI09YY0awYYYw7OIrmyknu4UM4BX2RyDskQ+wxkcwLPczbEkH9IjWMmtnMqrrGYExZXVvc+YduxfsFV/Fulc7sV8fkE6fXUqlXjeSyoqpjc03N3S8mKnTl9LOGUmc1wqNbit7ec8w9bi4rJu3S7O57O5XGPk1felA/2YyIB8/ieR54ASurCHuQyMyREJ0TyHp9nEMUHBu/F+nuYJBpFhMZ8suDwyXMJB3M2B8ezRhU6RZdaLDuxgLgdH8Fny5LaUgUx95ZV5W7d+7LjjflhW1iOXa5l9y51/ScIoA1jMwAgHyMZ40oW8ztn04lme5oxI4DqHQTxMf37HXiYVxi9UVleNmzj+3iev/+pVVy+atzWCwxIh+BaWcwAtldWbz5h25t/jdLejHf8X0V4Z/UNMOeXEpAh6810/u/mun33zB9+5+a6fHX/qiT/49vd/8O3vJ6/p3bfP2+pEp5xy4pZNm5NfLV+y9K1t9GS1+5luUmSdcsqJyRsVvtedt83+0xv5z2mr+sdi3MTDOJhH2EkzpzOIX9NAhqkMoTlSn06mjd+wIby0BzAvIhKbwhjeja50oZFlURRpYmXIOpNa7Go2xuig16nlwHA7ZVkYSYqJ+yexQ71INWPpx+4YtLOHFDX0YRRdGBSO+4R4zb905vGV1VWXzrzi+tuvpq2yuvTSmROvvubr+4/DpTMvu/72L/Ei+0IOO5rn+RELmUT3tyTUDGITt7OVb7OF6xlJik9yMV/gTnbxuQ4dFo4Zc0v37kds3PjL8vJDBw/+ci7X/NprX922bQ5bOYVP8yn6UxZTTFtjZPxBHMNaJtK1IKppJSM5ImKA0jzLWk4Jwpoc2KeopLwgv6n20plT/xISkMmU8gQv0ZeJnMZKnuEkzqIvt7AiXNiHRXDp1pDevi+GFxzDibzA4lj3cIaEqHRcMt+osrrH34mapDk/n++VzV6Sy92NVCqdyfTt1OnSVCq1c+f52ex/uYLS6eri4gtSqa1FRcXdu5+XShU3N69ubGzjXziKfazmfanUxyP+9g3WF0TAZpjETp4kkfkW0YWpdONX4XlPcBxnUUsx32XcW3rTx/BldsUDgPh09OBHFHMU3ZnHupjINZexTKOIo7ZuHfXgg5c+9NB7tm6df8CQ4YWrfttx8HU1NZQzhV28EIXbErpyPOXcxP3M54MFs8cwhsvjszA1Jgv8VxDY5dMvTijpDbNvuXTm4RHmkKN17ITs9bdfx7rK6h43zP5uOxNtRzv+ZrST0bfBlZ//1BMPP1rI9nr37fPNH3xn+ZKlSRVzxOg/2iUfMXrU4w/9V6XzbYuXvfv2mXLKiQnXTF7wB0rT/e/1p+lm+1DQt6Kyuop+nMhCUuzhWM4gxQr2chQZ7mFZOJCOjZk9pZQzljdDNbiO4VQFAR1CGW9GS71nmOuTWJwD2U5xjBofGqnjrQyjD29G1mZvDooUxj5k6UcJC6lmRISEp3k65gB1S9JPK6uXXDpzyv573riJ4+998s6rr7nsrXfBcRPH3/vkHWMnNMY2dOJwmunOz3ikIK48cXH9mO68zH9wJN+jlG/zaXZzHN/nmUzm0v79h48e/eOiog7Lln1u48Z79+yZv2nTncuX39Dc/FVuYDWfp09MP9/BV8vLVxUXd2NBGF+Svu3+tswyWhjBwZSEOK+eIs6mc/jx17OCcQwkTQtbWXjpzAv/QhKQy9XTk9MYSj2v0oFz6AuOZAoPsTDi3w+mDy9wEGfHyPIEB/K+6NfvoTmGDA2KqKmaPykY+KuQfEtP4txc7vpc7rb9gssOHU4tLh6YSjW0tT1DUT5f39b2QFHRZ7h427af1tc/vWdPM1fSnVOpTKWuTqWmIp+vIxcRV0sLJk6V8y568ExBLj2O4ERWkachxnENpA9tfCbiWguxks/SyIE0sCMePPpyUKx5eBJQFc6/qRxXsIb+jY2n79vXr2fPIevWrHlgzn3JT+tqai+f/tnLp1/8dseqhI4cS09eRGTi5hnNsaxkQGx2a8i10Y2B7OAJGiurq+tqai+fftnNs7Yumjfq8ulfXDh3AS6decW9T95YWb2Usktnjrph9k/GTRx/75O/vGH2rHbTUjva8d9Ben9USfuyfxk5etQtd/3sB9/+/i9um7110+bkh1uTWmbd5hSfCLb61r/dEq8fOWbUEw8/+vbrj18lbPJtX3P8qSd+8crP/umNfNsN+L+8VFVXhwz0fXRkIXsZTAeW8WSMQDyNdTwYCUGnsYVimunGEaTYw5iomJaEkK6aA2iOCUxJvSdhe2UMj+j7gZQG1UukqH05mEY2kgoHz36zxeoY1Z2YbMooZQ3jOZAXydJUWb3oxtnfmzHzit/f5arxE8f/kaNRdePsm8ZNKAsLVCqGNp3IfK6LUai38VTU8xI3xiru5Dou50SuZi0v8kZJyRF1dfe++easlSv/beDAbx1wwLVtbfs2bSrlK3RmENdzKJ9gfjI7sUePoQce+LPS0irKo+GbuOPb2MnCiKVsC2awhHkUc0S4oLaRYTNHRz5rws/WUvUXXhubamrz+UYOogtZXqWIE35fGzqEE1hfMPu0ihQvc3cM/EywlJ9TRBur2VHwq0ZeSWj33+Wq3j8vlIGcl0rtbG5e2Na2Npfb29T0Qq9e48aMua1Ll1Rr663Z7MLi4n9Lpyel0+Nzub4NDQfxXvA6P0ylPh2Gm1ZymUxSCj0kgvQbguMKjriBFI000kA/erOHn7M1TOhtVHIY3+XOgoPwG77GoWFv6sxm6kiRoSKEGXm6hQAg93bFkVJy69YtaWjY+/XPP/u1z33p5lnXnzX5M3U15y2aN+6syecvmrtg/4GKaKfECXcox1HGYpr/60D+V4DUPn7AKooL2PYcFnAF72V9XU3N5dM/W1dzcvI4Wldz2hUX3vK1z30p+Vjd9+Svv3zNF/d/Equqq5IY1PalfWlf/ualvTL69ujdt88td/1sxJhRd942+5L3ffCS933wC1d+9vgCv3zCVv+gmZ706EeMGYXjTzlxxOhRf6zbnkhCjz/lRCx7uwpo8qu31j5/8O3vTz3ulKnHnfL4w4/u///9+oF28BQbwvyLn7M+YjtLuIMy9nIeJXGXLecUOkXETHFE1aTIsSckjOtJhSE9UdrlqQs2uRsFdqIcm9gSA0VzcZvsx2thKmpmO68yjA5BW5t5I5xSG3ieKVTTemPBTMu/HDfM/smXr/k0r0S+aStdOJk81/INNnAM3SmNQaaraGMG5RzM5dyZTj/Rs+fNnTpdkskcks93HzLkB6RXr765sfGDnMbuCMPaw4f4JNdnMj8cMOCzlZVX1NfP3bt3FYczmvmsA00sZSgTSNFAK4/wBpMKEgZW8UjMw0x4ZAN7qeGA0MX+hejNAh6J8t5yfvP7FHMBDzOWQayMsUMpDqGF21kDnubpSLYvYhhreS1W8iplldUdziyIsv/v4Ixpk3mEFPVlZYuHDftx377v27fv7oaGe/v3P+6AA2aSqqg4NJ1+V3HxrFRqIFpb/yWfP4wjC+p/Vfn8jHz+9qiFpwu+/CsZQz2pggENPelNI79mazw+tcWY1vui7thEMcM4k2e5ivXcxD0cz5CIdC1hdKgvmtnHxlBjp+Jxbji/4b6CXW/hTmr5l3z+M/n8ugd/XXvzrNe4hA4Mr6v5wOUX3nDTrOuTV4+bcDgLYk6EyJEdxiI2IITgxzCaX/Aw2Met7OUTDGUQI2+e9VRdzWmhCU5w/ANzOkyd/L6kRHrGtKl/l5Pbjna0I0Fq/usv/6O34R2MO2+bvWzJ0kKrUyFh3bJp8398+/sjR4/6g0b8D779/WVLlt5y18/2r+FbP/jOW1d+yfs+eN5F04//feHpfnq6bMnSxx969BOf/1Tyz/bkUdTV1E6d/FmWxVj5HlTwOAdQyVEs4CkO53CyvBhRoMMiunwzQ8Nve2iEJvZjI4ewlgG8xhBa2cKQ4L6botvbTDVraGFg/LaZwazgaN4Mw+8BNNEx2FUZnajjFBp5kXQED6V59cvXnPU33wLramq/etXXFs7bQw1Twu2+hD0xmzFNNmwu04JGJEiBl8rLc+l0Ta9ep1VUjNu69ZebNy9iCR/j7N9/t118OZ1uJVdaqqJi/NatWyLTqjRGKNVTzAR6kOZlyiMz62h28jvezUts5FheYjjd2RyK2+MYysZLZw78E8ON9u/+FR/4WM2GBibyArvpxQGsYjvHM5BH2cLkmAy5lqfozDZG0YFNrKYrDRxKGevJsi2Zu8PGxFN16cxz/+wm/VWoq6mdOvncbt2O6d//C6lU0d69i7dsuWXw4I9UVByK9et/UlOzoqjo06lUYqHLt7TMyOe30ItL6Jo46DmA39EvlfpaPv9b7mBkpPuVsJYctYyMsLB5VFLGfEYwnl9zOAezlUcpZw/jYuYn5rKKDpxMR9I8xja605963qSFXnQluSpG0IXfcQKtvEyaqWS4k+FcQJod3MpRjEVckwkWj5uw5cvXfgaXTb+4rmYXBzCETSxnCq8gDHD7OAbsCT7dwGG8J9b2Jj/huHij/O/XzueMm1Bxw+yb/26nth3taAfa3fT/TZx30fTz/vhve/ft860ffOfO22Z/4crPbtm0eeToUdi8afOWTZv3s8/zLpq+7MrP/uDb378yaGWCJOzpbROmkv8ZOXrUnbfNbueghaisroqs+0eipXgMPbg3KpqHkuOlGFvfmQEsDebazEheiwnUSb1zMOXUUEo3Xosw8720sI2ycDJtoANZVtI5+FxrDMlcQYpV7GIsa1jHYWxiY8Ta7+b9LOVFxlBHKa2sr6ze8t/RIFZWV90w+4bLp1+8cF4RLzCecrpEfznHbt4kH6by0qj+JtjE3MbGPdRnMhob39y8eTsf4xVuYy7fiCbvfL5RVDS5pOSqfH5zU9PljY0duZQbaKOUTkzmfiaHuSpNhleYGGraInrwLI0cXzDR6k02Uk0Fg/CXBDounLvgE5f+oFevr/NJijmO5axkEKOo4WG60pOzKItA/mrOYR7bwizVmwqWc1TIHpIjcwA9SfFmZXXPM6Yd/XdnovfPubey8oO9e09HS0vdmjWfHjr0c+Xlg/fnjKbTe1taLigq+kImkzy7Jna95/kKH4i2eG8u5PF8/nyOogMLGMgAkKWMI5nHTkaGqWgwPXmBzTFXCb04nyeoIUU++uwTWcsxlNFCM41UsT3eoogRrKQnE1jFS5GGlpRsj+RVfkpHJnNcpNu+Gldm2VuO0I6F855fOHfyTbPurKuZym9Yww5604F5DGEH68lEFliiHDiel9heMLAgwWCe5RXOKZgpuptf0laQkvsX4YE597WXUdvRjj+L9sro/yMkFc3NmzZj5FvS75P6aJ+CKNNlS5Ye/3Yp+oWYetwp9z398P/YJr8jMXXy+XU1x9LKk9RzGh1Yk0rNy+dLOYVNLA3GM4q5TOKZmBQ6Nkm9Zjedo0SE1+jJFg5mM410pQ+vRcezH3lqIrOwW9g1ljM+Ri++EQW5BIlqrYlxtLKCzqSo5QT2sYgzWHTpzOP+XvzmplnX3zzrDkoYTgsrOIr1bI0JqH1YzkkFtaLH+FWSaJNKlefz65nO/mt4L//JJr7I0/yypORTRUXTstnFzc23xZgi/IS5TGAg+BWTqKCNheyjF8cEyXuT5zmooAv/JJ1ZxwTO4ClW0i+ZyXTpzMOS47Nw7su07mftCY375X9u7dnzk21tdevWXcJo0mxiW0zfybKD5XTjpJBCJtjCQyE07ENf9rGMibSxgR104QDaqK+sbr5x9o1/dyPL1z7/tSd/t6Zfv8+UlPRFS0vdunVfbWpa26XL6OHDv5VOl61f/5Nt25pzuV3NzQ9nMtOKij7R0nJxPp8chNXxYFPOaJDlNZ6iB2N4iSKGsoHOHEYT89kTof2DY0MWsioSKlrI0YEbyTOQCfE0cienhsjkWaaEZ78jPaLMvJnS6CTsZBk5jicVU7vWsJVefCAGwT9MKwvozIUFwWSzeTke6j4UJrMHeD4U4X1poJ6T+A2jaSu4eh/jQJbQkwvozpu8wEAWUcvpjGI5v6UvB54xrcOXC5Ir/gSSy+/mWSsqq2u+fM0X/36Gtna0438h2jWj/4+QxEWNHD3qrUwU5100/Vs/+M55F00fMWZU78o+I8aMSkL1/+w62w31b8EeXqWYUTGWem0ybj6T6cntFLOb8+jGEzRRzsl0DzVbPjLnq8OiVA+aOZxOHEh3WihlJJ1oikim7ojbZ4ZNpNhInq6hRs2RZTO7KONoyuhMFVvIcT69KSPHC39HJooZM6+478lfjptwEItoIMsqWhgT0oIMR/I832AbP+OXHMlYWvL5znyKIeyjgQbSXMQkPpfJ1JWV3ZzJnJDP1+dy8yLcsSMdqWIs8yJBPR115adimkBzqBvnswgcGoQ+Yf/rOIszwCROYBUf49KbZ+2+fPrFN826/vILf3T5hbcmIsK6mtrLpl98x09e7tLl/du3/2jduh9xEU/xIjkG8wJrww6VdKt/weo4VIuZQ1dyDKKRN+JXOVbSla7xky1sqKo+4H/CUp3Pt+Zyra+99oFdu55KpUpSqZJUKlNZeUljY+38+dN2714IMkVFwzt0uCiff7al5fx8flv89UDOYhVb2QQaUqm1paX/QYbunEYXFhWM6CzjGIaxK3a2JR6ZinmUx2LoK7K8h1buj/VnybCcJzifc7mKKTSyJnxLzdGUa6OCw0jxGHXJSFtaGESeb8XFgBKmUso1vMQuvs6rnM5ephfEHZzBBaQika00xsqnqec1Hg+Rd+JovIASrmVBJPumGMdYHuQX/IYDOIyWv/AU19XU3jTr+ptn1XJcXc2Zl1/43f3a1na0ox1vRZHUn+9zteP/DXpX9u5d2Tvm7PmzLciRY0YtW/Ly8af+YZrp/2WMmzjmgTmPsJnxNDCVBxmXz+8tLj4pna5ubb03GqyTOIAHeIOhjOI1ljCA/qQi4nszWyKyO00bu9hGG3VU0pWtrKc33cK91BgdzCKaeIUDwlyPN9lNVUxvyrGe1ZRxUtzOG8myb9zE8X/fD2llv8ob7vjx5dMvWTg3YVe7GclCulJFKx05khX8K6WcEakCW6lhVNTY9mMlv6FjNvsi5aWlX0Yq1Z8jmcPLJBKUUiazgCcpooV5DGcg62IM1RPs43geiESe13iFXlxOpzA2pRjCR5nDBs5aOG/Qwnm/YCpDb571wqJ5l9RuzNXVDKBiw4YL8vkPpVLfyOd/Ql+6MJwjGMOv2E1/8gxjC49yGA28wSAqwsa0mxx7KWIRObbFw/wq9jJKqul/6Ou0Y8ejSkoGrl//jfr6eX37XpxKZdLp8l693rd793PLl3+8a9dxqdQopFKdysvPb2ycnc/vYxXDwrpeQjn3MCiT6VNS8h+pVM8C7/xE+jKPPjHNIceBvMFKahgX1DPHVBYxO4S2iTnpDF7mUUaTZx3ruYoh8RbnMpS7qGc1xSylD8MjfLSEYbzMTg4pGEWxhjt4ha5RtD6Sau6miL5MjtldbZEakeBATuIRhkRWWjMZ9nIqWR5hNM2Uk2IKA/kV3WJ8aJpq+vIYR9A9CbXAnz3LdTW1l03/ZF3NxGitdOLdN8+av2jexTfMvuXvckm0ox3/y9BeGX0HY8TokcuXLPtHb8U/Fyqrqzib7TxKit58IAkHzed3ZzKHlJZeQorHwRBSLOOFUC4mPcTXwuG7hp0cGNZ71ERUYYb1vBmvHMyuKA418QadOCg6vJ1YQRnNkQA/kkzo4RazmlFBVdt4nrl0p/Vt873/+7hh9i2Xznw/nchUVr95w+zvjZtYRVvYn5ujRf6ugkFHaYbxw9+3PN/D9yPhf3Q2u7Cx8YJcLqG5WU5kC58MrtCR48LRtYIJ0cRPwp7m0JGTQ5jYxitkGEgrd7AjArMybOeHbGYZ32Ygk/gZv+WohXPH1dWspQNz8/kPpFIn5fM/YTZFHM8RYBD/Qj+WBYnpzWG8ytoIgUoY2xo6M4qqUEYmBrjdNJJizNtpGf9uSKXSZWUH9+r14b17l7z55seT7+18vq1z56N69nzP7t0rW1oW5vP1+fzelpaXcrnRfIxVPB9XVCvdOKioaGJp6b+lUj3z+TrSBd75gfRkB4+Fly45/kdQwkOsR2SRnsgo7mMu4mQdxrtZSxkVfIo+7IulgWF8imPYyYZIvX2BHSEm7sdk9vB8cFwcwJms5ekoprbSh3dFCb84Jpm9EarTZHmIX9M1JtluZz4dOD6m2mZYRhvl8dgzmAvZxXK2xyNrhiYqknCxyuqaM8/9MwLQhXMXTJ10SV3NaQW+rgSHL5x7xNRJ77npuhv+5iuhHe3434r2nNF39uIfvQH/bEtVvyr28F66kwpn0nlUtLTcmcvVpFJdKaKRn7OZEhKN6cNhXhkdN6dNlHJwEKBGVrCVsXSkhbE0hO+nJKYxpXiTofSLXP0WBjOMHWylB6NIxc31GTIcQ0lMP3+AtRzPFtJ1G2v/h47VZR+//MbZ354x8933P/Xg+Injb5z943ETO/MmL4c+oSiMKfU8FZn5R/Ao11DPLB7nWPrHi0/M50uamj6cyy2Nkafvojf3RnZVCwfRgWGhakAjOxjNuLD2p1hEE4eQoRed+HEMPXqJH9GV0QyiA1dxO8eyhy/zO06kLyfxaD7/TebShffSP0J/EoZ9KgfRRkL6O9AxHD9ZaslSTb8QjxbFsKJD6EJp5Mu21v7PnKnkizqfb0unO3XtekYu19rU9ObevYtTqaKWlpo9e17v1eu2kpLBjY23tbQ809p6EBcyim/Tl/upI8eykpL3l5R8vODLvwMPsimoZ5ZDGcLjrEIYmI5mAi+xKEYV5DmUs2OSbcLXW+jESTTzIm9SEQqNhPx1YDkL4p9FjKY/C2kIRtuBo+nFrrCsJdru5BP6NCsoDldfaeh95zGAB/kVaOU2FjMteu6reJL+ERmxk4dpYirTmBeJqqlwYh3DdlbGfiWf7lUzZh5+/1MP/tlI0bqaWtr4URzG/djAzXU1FTfPWnb59Ev+4V+V7Uv78k+1tFdG38E4/tQTk2lP7fh97KCJI+nKr5hLGcX5/PiWll9ks0tSqQ4cwhDuogP7mEIlDTST5sAgJfvrdkU0UMYRdIgbYWKB6kgqblpVZBhcoA1NRy8+cboUUxm32MRXMSCcyyWUcBddI4y9M/na/5nKaIJxE8fP+Pjl+/954+xbZsycMWPmeZXViaUpQwtreIQxMbemM8ckc0HZwCl0D76e9NDHcmRb24M00UYjh9CZXSyhiLKgBbkofya1sQFBd96I8KYS7iNDllFM4D7u5OGYwJmgByPpliQPMIgjydJKitHU0ZUh/BvzyMSylu/RRIYtvBqnBlnWUE+GEjLsDqnochri+zOp6dZXVm+d8fFL//tn5A9O9/1z7nv0wbW7dv0mm92Zy9Xv3Dmne/crevf+an39ks2bf7ZvX3OPHj/OZPpVVExPpfq3tb2HKfGnHfgI5/I4edItLV9rbf1xwbrLOYUFIcpsjYFk08LknguiOZipbI+DloqZXpNJczOvUkKHOCCH8VNu/f09u5s7IsipYxzk/oynljSNUaY9hBKW8kyMk0ikzEfTxJPsi2iwTSwIZeq/sIPvci3bOIuONLObJRwb7sMneYSDEVqR3SwuiHlKo7K66xnTDoo8h3Rl9Z4ZMycVflL+BOo21tKfIfyK/d/PL/EzjuJkjlk4d+iZky5IIkvb0Y52aCej73S0e5j+AFXVVbzJw2TpzFEs4rcJsePc1tanU6nO1DOJM9kTY99HMIg1EQFTHuK5HHXRfz8oBkUmXbx6WhhCMasL7tZJCXAfr0R15xVaKI6CXGLHSRqR/WKdq2hiNKOiMNkYIsX/WdTW1N503Q0L5y5ImNBNs5bQmyUU05hOr0qne/Ni9EPboirczIQodjZSH/S6iX70YHeMj0KabhzGs+yMoNMdzGdsFJVbaa6sXj9j5pFnTJtKOWcwjtcjXKmSU3md8sjq2o9iUjzNhvhaK46y9IscwXgmcha/4zZy/I6bGR6n4AiKY6xlitei2p0iz3rW8S6m0J8l7P/cbRk3sezGO3505t+U4FPIPpMTMXXyuxOactN1N/zbNxZWVl5fXj5l27b/rK9/vm/f73XqdHJJycDy8rEdOkzv0uUzaGlZvGXLp3K5GQyLR6D9yxQuiMehs1pbH2ps/GAutwYUcTAXsZdHog6KAVxEWYH+Mrl0J5Pl9oLyZJ5ipvB0GNGSV1Yzhdf4YvQNbuApJsWJS7EtJARd6E6aJ9hSUKadREl0CVpC07KKNI/QTCklfDKUxF04mmy4spKHwCwrOZpNHMvn+TC9KInHoYcZy79yHHMSP1Nldc2Z08Z85dqv3ffU7eMm1ldWDzhz2oi/kIkGSqnmKFZyPY/wFOcwMV4wqK7m9Mum/6i9Zd+OdiRoJ6PvbIwcM2rZ4qX/6K34J8K4iePpTEd+QV/28GEaYjjQAXwwl8uxhe1UMj4UaSm60IudrKQDzeRZzR6GRtkvsZ8nIsLXWRdUsj972Bgitq2sojrRfXJUhIq30crGyM3J08QultKL4jDRt7CAfsGJ/wdRW1N7+fSP/vy23h+76Mc3XXfDTbPq+VBdzQzexa4ZMyekUp3Ly88vLh7AurATJQWzxHpSxA7m0pk9LCKxcpdSxjiWxP4m3q+mkOS2sYlKlkTtM19Z/eaMj5854+OXk6KRVirpFoNDs9ElL2M+dbET9TxPKadHyPmTSW+aFclYdlpooZr3keebPMfkULsmkVIjGMomdtKX6viG3E4zp0Qk52EcHYn3bTNmnnDj7Fuq/iYf/U3X3TB10mcvm35JciKuuPBfn3j45N07v/mRD173lauuvvuOsh49PtvWVpdKFVdUnFRV9ePS0gOxZcs16fTB5eVn5fMt+XxLPt8cQoXHoza5f7mF3/IlyujK1Hw+09T0wdbWOUE9u3ABQ2L8aeLR2UZ3JvIgiykJBUsRJ7OEJyP9IOHr57GbOwss+eUcQxeu5SpWcTJdQvXRzOuspBnhIjqMZSERSRoFx3AEL7KOch5hBKOpYA1tnBgl+SIe5T/jakl68Q+S4ljWchIfBEfxXZDiLs7lLDCMj/Iy4gpMBurecuMdP/6rmOjCeQuCUpdxON1ZyPHxHbJ/yTL5plkvnjnp3e0l0na0o52MtuN/Gyqrk6imibwUswGnMZTVrKArB9HAnWylE52iBpP09caQiTymV+jIwaFpa2Qxe5hIisG0soRS2hiGuJdvYkTwy1ZqqQ//zTKm0YWFpGlIpV5NpTrSMyba1/FsGGhydTX/g5Xv++fcd+6Jn2/Y+810unc2m39gzggmIwKb3r9w3oKkrlZSMrm8/L1hdpnHriCjK1nNaXQjxThWsYwysuyqrC49Y1pVktczY+aIG2f/iCxdeIMxldX5L1/7YeZRVFm98MY7/i3qi3l+yW9YwEV8lG48HjXpnjEK6xXWMZ+DOY5SqjiNoiiqJRdASSxJsOtmWjmWHoh1JuyqF32poHuIZXN05ZSwwiToz0nspXzhvL+FSSRF0JtmreYjC+eOO3PS2dNO+Pbund/IZEaTSafNf/6Ezp3fg7a2TQ0NT3XuPBX5fGs+39rauq2+/ufbt1+Ry21LpUpSqdLIYfgF14TTbiv/yj6+z5ioT+NIjmtruyu0JQ3sYxJl6fST/I56HqYXR/NBtvEou0MBXM27yXJ30FN05AwGcX/BdHgcyOHBGvc3DRK6PAG8xBbawhp/HI08GTJNoRDYEQMs+odeYgyVXBtZB3fwImdGKv56HmYwad7kwxxDYyylXMklDI9+/X4cysCvXvXz++f8/xa9v/YxY9yE8ayKPU2uvc48y2z2FLDnfdxMY13N6ZdN/357ibQd/8fRTkbf2Rg5euSydkP9H2IvOQ7jXLbyJKm4jf2O5+jEXo5mDq3UcxwjeT5KNcMYSDODIm00RTnL6cNYiiihhRF0ZXf0HAfSi2yk4aTDlrSBKRzDOLCENziMrrycyZyeSnXlcYrZzkaOZz11jFw493+k8l1bU3vzD2d/5ytrKiq+mUp12bv3mlyurCDh/L+wcO7ibFZz8yNk0+leSKXWUkptdE5b2M5T4fjZUlmdmTHzmGTm+4yZY+9/6sGvXPu1L1976YyZx834+OXjJo6/76nbx03sTtG4iXX3P3X3mdOm3vfUnV++9nP3P/Xb/Tf+quqqSFz/EN0o4T0cw7PRN+/CQTGk/kRGFrSVyzguziBuL4gIXcgv6BorybOA15jCc9QEYU2wg7UUs5aH2FNwYF7nQYZy8sK5Xc6cdM5fVdyqram97IIZN81qiuSHjdu3Hltefk0q1QXNzV8oLu5RWnpQPt+Mtra6VKp/be1Hd+/+ZSpVnEoVp1KZ4uKLstnM1q0XNDU9hqCJ72UH/8LLfJ5RfC3GC+XYHdGwA+idyWzidnaE4CHXufM5xcUt/I6pDAe9uJABPMCOODJJa34Mj0QhP0+Ww5gURf0WhKctoZVZ3mRBzNNKcTCDWV4w2KmUsTGQaf1/5SjZQnfOZCX1vMBJfIrPcirf59us5Qw60MAmnmVCTDRYy3bKf38pYzNruL/gXCeajc9S9d8pVc74+OX3PXXjuIktbAH7KI0G/S1J8ZW1/IThvJuOnHPTrDWXTf87aI7b0Y53KNrJ6Dsbvfv22VLXrhn9PYybOIqfxKDwplRqK7+gE/Wcz6usYB+H8T7mR/b7cE6jmTdD4JinU1Cc9SEPHUQKlAbXGcgQtoeIsKSgsb6VFWAy5SAVfe3zGMJJdM3lluXztUVF789khqRSa+nNPBroVVm9fcbMD/5Vu19bU3vmpLMLSztv+5rLLrj8xh/c1do6n3w63ZViXufLBb3v/+Q3fI4ft7X1amz8WS63HUVF52QyldSFQnE1h3EQS0nNmDn2/qd+O+Pjl984+2szZp6yv7955rSp+/+/qrrqxtk3f/naL94YmYtV1VV/ILhcOG8hB3Eygu7kOJKTyLMnDDfdKeUx1sR5QZan2UQFQxnEb3mex3iBEQyIFz9Biks4nA+FXiI5TRvYxqHk6UOe37IWLGAhR3M4GFhXM+Gy6V/9CxnM/XPumzrpY3U153EYzaziwVSq2/4X5PP51ta1NTXTm5sTQ7dUqqJDh/fv2PGfNTUfyWZ3Jq3woqJTMpkTd+782r59dxfIZJPcpe9xPpfGccvRkV+zen9YfVHR0JKSUfyCeclBbmpa1dpawfvDCpYsDRzO1HApJR+HFgbyLpp5MMzvZdTTgzKeiHSChmjcr+CVkG20xGntzQTa2BkjQ9N0jCDSp5hLmo9xIlN5kXM4Pw7VVL5KF46kghZ2MZJpvBkrPIkf85140wTX8rt0Oqnif4sVzGFmdEUuemBO9ZmT3v03ewerqqtunP3jGTOP5LWQt+JgDuUR7uIXTOaEgj8at3Du6DMnXfqnP7ntaMf/VrST0Xc2Ro4ZtWxJu2b0rZjAPawlX1Q0NZPpHoK2TnyAPM000IfzaOGhCIHKs5dlZKN1u5fXyVJBc+g+l4RfJ6ELRZRTz9owledYxxpG/P9Z2V6PKYWHhCW5lt2pVEVx8fnpdN9M5phUqpq1lNKxsnrrjXf8+5/VqyUN36Q4d9N1N0yddEVdzSlfverhr1x19du+fuHcBVMnfbSu5r18vK2t465d729tnZfJdOcUOvA15vFttnADk+nIl3K5cxobf55MTspkTi4qOpkVrGQKg+g6buKoL1/7if1b+wc+/bfiL7D7JGE9+fCtp/gVz3MiZayOlNY8I3mJ+WAbv6YHn4mhkb05jOW8yUR6UUSaxQzn/ZGm3o/LqGJTZCMMj4pdnr705UUeoImzIv20NaIAJl02/fqvXPXlP7dTHphzH3U0UJrQlJKSKS0tNzc2XpnP70Mqle7c+dySksGbNn109+6fJz/JZPpVVFza1ta0fv17c7n6ZFXp9IFFRe9tanqJbVGHy8S82V/zmUjmTzrjZ7OSJ2lK7ErFxYeXl78/lVrEb8g2Nb3MJvZGeThZklSmREfbgzlsihT9NrrRmV/xKsLAlKRBLWJ55GE9x2ZOp4Eu7GNtnNOS6GjPYx3iMSNprB/Ke8EOXuKbHEVLwZEfyjWkWMZTTGckB8cEpgwHcQlr+TBL2MTFrCgqujif384JNLGET1DYjh9TV3Pp1Elfvem6//yzJ/SPYcbHL79x9tXspjQeqHryLmroWjD1fj961dXkv3rVNxINcTva8X8K7WT0HY92Q/0fYNzE8XThXJ6jNJ/fk8mcXFR0PCnqaOQMUlzPq3QlQw8eYEPM6S7nZYppZjU9GUQx+9gVs2rOZRrdWBTV0EMoimFCq6L4Wk4RzczjjYgraiTFXF6IcS+ttGSzz+Zyb9CV7IyZk+9/6v4/q1erram97IJP3TQrX1dz2mXTP3PTrCUxYnvSA3PSl02//A9efNN1N1w2/ad8hD7g3fn8iXv2/Es+v48sEziCWxjHD38/tft8PkIml1udzzek04ekUpUMjPnyr9Vu3PC32cnfFpXVlZxCLddRSy3fpZ6pVDKJEbwZhpjeHEkt9/IwU/gQZWxjIyKoK2n3J/3iBkoiYbQtjGVZekS0+5AQRO4vuHZkIPVsjpSAhK4lEsClLHxgTuOZk977F5RIR/AjHgTdU6lUhw6X5PO79u07N5udn7xjhw7HdO78vl27bt216yfxRZ0qLz8zleqaze7KZl9CPr83m32Od3MwD/Ia4jnqQnAFz7GFIqqYTjG/3p9glU7369BhRiaTSDwT793PopW8H/fxCudxNqP5bdSP91HCJE7keZ6mLej7YM5kN9uop0PIRpPz1Y3tLE20HDF6dxxvsCQ6+y9wHpNiG3awly+xooArF5Hhx7zAGj5IdcHJmkbf+P/3cyhX86l0undR0XTy8e6NEQFRiHJ603L/nDl/cOb+dLn0D347buL4GTM/wOtsjAspE7a8u2P0RoI8d7OWixbOHX7mpAvbXU3t+D+F9tD7d/ySGOr/4ZvxT7Wwh/5cTMdc7pV8fk86fWgq1SmVepTnyFPOWTzBU5QzkCN5OoYkJb3dFjYxlJ6kKKaBpRzB0fFWx3EYS0MzekDUVyoYFfK4EpbFi8sopZ5fs4X3k8rnG/P5ltbWOdnsaxzNXurPPHfqn93Nm667Yeqkz9XVXEAf7uG4gphJHLJw7qipkz68aO6C5PU3X3fDTbOWcHpBE7aFcRzd1lbDIrIMoIzf8bHwxSf4Fr/IZL6dyzW3tf06n99Kh0SQUFW9ccbMYx546rd/75OYZhLduYHbGMYxZGijiWGcGHwiOaGHxp92i23uzg5W0ERxiESXso3OlHIbLwebLOZhngoKno/KdysbInU1HWmyrfyKDfHKJ1jLBYytqznlsunfvem6G/7YflVVVzGEU3iK77I30RaXlZ1dVDSyoeET+fzOfL6NXHFx/y5dzstmG5ub57a1rc7l6pubX8hmx/O9bHZTW9udbW2P5vPv52im8lFW8Fyk2+IkjuN73BW98gwn8S72JRdAPr83m61LpxNtaIpBDONx7o3u+S208YE4LBM4n9U8FiVMDOY89rI+8stydOJEOlLFUZHO2xpRsqMpZxGbIlWqB8eQY3m40W/k3oIrsA+juJY74yc7+TxLOIrK31fIJNgfUNXGaI5OpTql0yclBf74zPZnH59kYcEf1vIv7KzqV1l47upqai+/4Mqpk6bu/0y95bdXTZ10QeFvwVlsYymNUXSv5Ahe4UZq2MkNpLiYXgysqznrsuk3/omrqH1pX/6XLen4gm5f3qlLn769t2za/A/fjH+epaq6kidZRkc6p9NtbW3/mcutoay4+IhMppE7KKOBC1lHGfsYwhmk2UsTfegcAd1J1lIz9ZwcWsn9gY6HcEjcwARz7R6ThDbQRF/GxfyeUlaGTThFeT6/p7X1tny+JxdHY7Rj3caaP7GPtTU1X7nqmptmbeQCnuNuUm8ZP4h0bc3mr1z19fhDrODf2R61pU1cSz1fpIIH2RbjhZq4iLm8wftSqeZM5qep1JGZzPdSqRNbW29PpzuiqnrFjXd8/bKPX/b3Po8iHbNftNG3FZQhyyijjl0M4EXeYAsfYhr38POgiRPpEKW+NHPDTZKnG2N4lHvYxQ9ZGbKKPDt5jR6UMDCY1n4MpZpHWcyvKOFDMYi8A+fcNOvVr1x19R85d7Wk6MHZ4Lb4HlZUdGBR0fBstmzv3gdyuYbW1g27dr2Yz1+by01rbJzT1PRQS8s4LucAJuZyvfL5jxck/4/kS3TikYKW18GcxyJa2R5G+4Mpa25e0NT063x+R3Pzs62tUzg9/qpbjAm4gZ8ylGmheE5QzYfpEbNwk8PVgZPozFJWxqqKaKFjePkXURNz5DGYg1iNmB2QYQT92UUR43mJb5F8FpJK9lSe5rO8yCdJ8R72Ucvtv28yW8JafsYaiuhIY+K4yufr2tp+m8/vYSHlTGYsPwia+zRfpTcTgz3nyS+cO//MSTNqa46trZkyY/o3brzu+sLTev+ce8+c9MnamrNqa94zY/oN+39bV1NLF86jJ/Pio5dIYydSwc+4g4M5i3xkkLUw+aZZW8+cNL225k99FbQv7cv/jqW9Tf+OR+++fTa3t+kLMG7ieIbyDE/QN5UqKik5uq3tnlSqdy5XX1r67qKi/uygni58gDJWUUcPupJmLXvpELeiejYymCIeZmmBDm8bd7GJFHtYFbK55Haygs30CY9UjqVsoRfjKKacvfn8Fk7kWBrpQJ4dX7nq+3+iT1e3sfb+OXexmycp4xuM5sYC2zgWcHPkfSZHZhyDyPAfLOJxZjGJS+nIh5nE78IEPZFD+SJfS6ffl8l8IZUqYjd70unzMplvZLMbq6rzN95x3d8WsfkX4Hc8z6uczFTy3M0O0Mrj1PJhTqAPfTmfzgznEuq4NrjXIRzMZrYxiOHxKJ4PDd9WbqSoQ4fJYfRuYz3D6EsKDKOUNQWb14uRLKMnJ4UAIBtN//H3z9n0RyIk08HGkrJ0p+bmR1tans3nd7e0PN7Wdga3tLQM2LXrlj17dvFd+jGO4dnslZwKHmMLl4cbSXyhd+CSCBZ4hX1gVRTsf1mw/W0cm83ubWxckc9/jtFR+k2kjUUcFKrQsrc7NanIY1rF3DieyRGYzGqeiqJ1NuQuj9PG5/gCvdlAns6MBK/EmU262D2CPo4jxTW8FDagbpxGJ/6DAzk6gks/wMHcFBKCp/ktB9GHh3kO7E6lOudyr2ezT/NlZtEhdvBAzmEun+IWDmNClE7hxutumDH9PziXCrpw1k2zls+Yfilqa2pvvO6Gr1z1MBdSTjHn3DRr+5mTptXW1NbW1MVpmswJvEk5+Tg4AyMhbn3IHgqX3bU1y8+c9Okb24Of2vG/He1k9B2PE0494fGHHvtHb8U/F6qqy/kANdTmcnuKikaXlb0vn38zn69HcfExxcXHMpeXwAC68DtW0osmJrIqBtDvpI7OdKOFkSzlt+RYyP10CUXpgKh6JjfUpRQzlhQt7OMZdjMkUht38utIzDkosqJepIgRtTVTZky/9o9Zayv7VTGUxRzKB8ClXMwveQE8xKMcxsG1NdsL/jTxfBzIL3iVT3AcTTTTwiSuIkcTLVQxht35fLJVXehCZ0pyuYcoqa3pUrfxb3Qc/wUYSR9OphMdOIEh3Mcq7qYLl1HB3RzFcQW+lgqmM4iN0Y/uzgA6xbClnTTF/Mk8w2nlgIaGHbSxh1SEdmViY/JUMRDUszOpasdUqht5M6I0kwjJn1JbW3P0jOnffQuTyPErXqckEXJ07HhyNruqoeHRbPZznMxmivL5i5gJNvMZPsCBoaxYzHy+Rk2sM6GD2/lXGvgyr/A4z9GDqZzA+SzgyXguWs9x/Eu44FvYw5rgSYkcYhDzuIP6gu1v5C7W0IPeLGVOKDpa/H/s3XecVPW9P/7nmdleYOnLLr2IVKmCHQt2UdHYIAk2UBNNTLlGE2OJuTfGRA0kEbBGUaNRVMQWETFWFFDpKB126X377sz8/ph8+K5pNzc395rrb1+P8wfMzM6cNnPe5/1+FVmMI4/nWR/UXa/Sg+/QhtZ8nUEsDazcGD1Zz2qE6X9m+LjuDGJ+uIGsJ4OexBhKBjvDPdgYLmYuTzCPobQPWfP7eIIaCpLJTH5BIbmcEG7/kM+J1DCSLiTZs2De7jNGXjF10gPTJq/kKGrDN6WavgvmdT9j5ISbr/vJtMl7gxbqwAv6lpedO3Hs3QvmLaUq+BIUB0O3t8IIIs0g70CcqZ9l6/6euZzF6dMmr50wbsL/aDJwE5rw+aKpGP2CoKk5+llUUMhFNE8mtyeTZbFYq+zsE6Joc03N46lUZRTlxmIdo2gFsyikkpNYSAV1oblSQ5yNnEGKd0iSyyAqeJzF9KKUeNrUnW50oppNoeeRIIsq3qSEw0LfdCszaBcStxtYyaOUBp5ALmfefN1Lf1Gg/fzTM8nmpxwRzCOrOYofsZFJrGAkJWk2ZPoyVlJaQiVVtKZdEJ7XBFl3Jh/yCw6ijjdDl7cgldqWSFyYSn2EVGpRQ8M5qVRWFP0min45Ydyrxww66tLzLn7swUf/icevvGwLLYJ30gEMYhjvchBnsTGYhv6OdZ/VtbzAQo5nAWvDU+n2YTkLyWM784OYTIgnXRZKzIwQT4+NoULNQqO0rTRa05UZvAFWcx8lnE0zTpo2edmEP7WQPJWPgwqqvq5uVTJ5CL8MFpuPs50RofSsp4gbeJRMsogznFxuCz0/vM2tHMENHMwNVNKfw8ILevE1In5Lkk/4A+WNch86BSVWetidIs5Q6rkvqKPKAov02JC3GVHDU4208xGjOIa3SfAxJwVBVeM9cCnr2BtYCpVsZ0EQV2UEf4BYyPLdw0vBQK02pHat4nlahPyCbsHjqTRMOdJNx2XspSyZLOaSRoaj/djEQgT6Rw05IZ73Q1qUl304bfJ03mNr+KZkhT9fXl728YJ5S3iKpYERnh36mnPKy96mBQ+zKPgSVFHECD7mU6QzSBnMYF7iKWp5ik8ZG6I0Dlkwb8DEsTc3qZqa8EVFUzH6RUC7JrfRz2LI8P7hIj0klaqurn68oWF5FDVLpepyc1vV1j4SRdmp1N6cnIvj8STvs58SxrCT/WRyOiM4OVxrjwjkvPTosxf19KBZ6CNGoaYsohWFtAn9qgr2MZTOJMimmlc4kZHBmnslLzOcflSQCjPfQ5+fsa5xPZqeCU6b/DQRRQgXufTVcQPl1HF8yOxOHGjvDRk+9Pm59wwZns0esmlOHbcFM9Rnmc5JocPUN7AP6zg8lWqbSHwtmbw/kbiSC6Po1rRZehR9o6LiGzt37l784aJ0PZpew//mVXPzpi28+VlNCf7AUk5nJ3eygDEczWE8wZtgN/eyg7PpyhgSIewq4hPWMJSIdrTjg1Df7GE1XcPcNhmcNU/kUMrZElYjRTV7Qn0mRCF8xP38jiM5ptFqD1wwr+MZIy8O+ySiExfRkBbU19evorjRQLye3VzFB6GMjnEyv+fq0A2NMZjD+C338QyPcGlok89lChfTOZwDiXArdT7DgmaokB8yK3xunCM4mOWU0RAuEAfRled5mcfoGPr9DawNrxnImtDUbCBJL8aTpGX4vjSWzaEXndhMDu/QJiRF1ZFHbxpCyzN9F3EEg3mNhcG8czlvcgJ1gcN6G20YQ2cWsCSQfa/lMI7mDzzT6NA8ygbqeZHdYefnsIDmdOBjupBLB54Js5T06TGTFXQO4rnneDxsWi0Pspw+4a54NbPYzT4K6McFVPFBSENFCaPYyWSyuYDCkBpVQ1552WETxj07ddJv/sqXpglN+D+MpmL0i4B+g/pv3bLt816LfzWs5yliJHJyzquvf6+hYXEiUVVUdEJR0bG1tc+mUvujKJ6dfXpm5sFUsCnItxPhap3ujqSCCCnNolvOxtCBS1949rKMHKpZES5mu1jNfhYFJVOrMNJdTJKxdKKeWiIWcAH9ySWPiDhbua+RC33ayOnqaZMr+AYxrmhUD2EK93NaYKyigrnUHBiml5SWTJv+qyHDswOXoD/dmcI9LOIqRoR3O5nzmB88j/oxKpn8DadG0XmNC4soOmzjhh47d+167aXZr8x6ZeLYy6dNXjBh3C3/KdFt6qQpQ3qe8Rdf1r5DO45lHc9TwR6eJhEs2SMGNyr4enMOi3iIqbTh1CB7KuRUOvEpNVRxKDmBM9qJAWE6vIH+4c2xiM4cRTadOZEkZWSwOlBUTw0VZJqvOZCK0Cb/E2SWl62cOvlehPfP4VT6so+uvMwVjbqtQxnMf/BQ+JPmnEyKK9kcfrpLOYly3uU2jm/0ievCeD0j8AfSROdXmMOZxEJc52+5hfXhpqUHx7InfAXSLNK2DGUZh9I7pH3W0zV4ecaDedb8RquXG6bq/8FbjbxLs9jLz1hJgmr6hPTOJAdRzRJ60pGFgSSQTW/GUMYSMvmY42hNLbO5m6HBUGIQJ9FAxFWspgU38Gs28H12cwUL+RJ1tOAdVpDiE1oxn9UcGaicaebuIh5jFw+wgxFUkUM7jqKcn/IJd7Kf00Pp2Z6LacGTVIQzsyXn0SPcytaHEI0R1LCI+Z+NjMphN6/NmvHCX/1GNaEJ/2fRVIx+EdB/YJP1/WcwZPgQhpCfnmxGUVZu7vhEYjtRQ8Oe/Px+rVt/idZ1da+lUrGMjLS2eg5LyCdFDfW8zad0oYx3Q8e0R6g+s6hnE2vpQR5xilhCNt/heJZRTIdgr7iJd2kPYmSwht+SH7zl64LB/n7e4XFa0rO8bCumTppyxshvlpedywCyuIjDuZ5X2cIVvMv5tG7kkPoWXek4YdzVjWu+m2+/5YwxB2TjLenAJgqDS/wBVAWVyTtUU0SSeanUV1gbCovFqdSF6diqg/r0uvE7t5eX9aErh02b/PZfM4EP/d13OHba5Pl/NsVGikKOJ59nmclBnEwmc8jh4NDwSy8t6cJ2cij9M4ufvDD5HUgOmUShomrGEOIMDgcxXcofQ59GbcV8jqcDDRzCMcRCpZvLeiIyQkcwLb06gIU8SeeS0uLwSFrYXkUDhxFxOrgseE/G6M5p/J6bww91gqEcyzLKgjVmHm1pxQ8a9TiF8e7kwDlBA4+ykkvoF0rPFhzDNiaF9U+fEseRyUZ2heo5iyQF4TXv0pbNZKQld5QFy/2FIYAgRZI+jOQZ7g6qpvncTIKTEU68BJvZxx5KaB9a3QfxYcgpSE8exgRnrnMoDaOGWZzBYIQj2IJzacNz9ODi8Fnf47gg2jubGDUUcgx7acYWPiAv3JjVBnpGIcPJYTrNGEiqUcBSFoPpyMO05wjqqQ6lJ47nvHBntTfMWIaRYgkLGo1N4pzJGh5odC/6IY/RqX2H5prQhC8cmnxGvyDLts1bP/d1+JdaqOC4tDlLMrkrirJzcs6KxZpt2/bozp0v7Nixg7sbGrJrax9OpXaTGTouc4K5/WySnAk6U8Rs8qhlMFlUspf9DApu6jVkMJJrgo/gN8NQMsV6VnAEHYLG5S3mRNFocqkmxge8Thv28gH90+L3BfM+njbpkWmTP+XLgRKXXobxVV7g27Tm4mBFlMNWPuE4+pHF8dMmV0wYd3nE5rLyaZOmPj9jBRW8zTqKOY0kPw2Jl3iWFzmJCynm1dDxGkxOKnVJKvVCKjUtlbqGbgxcMG/xk49+kEgcE+gBDfR8fsbOM0ZesLmsvPGh2VxWPnHsVdMmL2cg6LNgXou0V3yjwxcFdVE/ikN3OU3FK2AHT7Iz9PwaeJkVtKSUV1jS6FfuLebRNYyq9/M++WxhWRCPp+vyOpYHQcmbaSFR+Ig4H7CBkbzHH8KbFwZjhMXUkCKLQ/mEx9nNHN6lb5pTEf2RgTCD91hGb87/4xYbwQh+ynIiEjQL/l/bWBO6m0WB+fp2mCynyc2nhx5nJduI0Zc+zOBFtnAncS6jOAR4poU76Z2cx+Lw0cL9zAA+baTBTxGxmzfoznWMJ4N1xBlJGStoRQ3Ph45mJsWcwR6+z8vcRw8OD++ZLos3sDZ8F96hnqFhzt6cHF4LWU2pcCOUZrO8FvbJAfH7ATV6DVlcxhFUUBm+tkcxif5sYye7g31bD05ieFqBBHaXlKZXqTJ0LjuS4iAidgRX/z3p6ymdSAXL2/Vs5FM+AXE6kIjHd/N0YMTuTweQUsQcNlBFHkWcQTHTeZ83mU1vWpWUlnzuv65NS9PyT1+aOqNfBJxwygmLP1r8ea/FvxDal5awjW30pbSu7vXa2teiKJ+MeDyvuvpovkEe30smj62pmR5FuVRwQWhyzKcPx5FBHtUMZyhbgtlTmu6W5JAgd0iQydGcEhS1tZRwCa2JsYOjQu52LoujaFMsdlEUtY2iPGpCdPg4UkHznq7qdpGYOvlu6j4rj0iXZSvZTiYnBLfzdLNqO6NpF6bGbTl2wbzjTx85fsLYbz4/oyXjQix4Hw4mzpH0YirvMZX1jKM3OJ5jeCt0pwZyGD/hcY6hZ+A17gu13YFle3nZytNHTjhgCzB10n2nj7ywvGxwUKanUVxe1m/CuBsP6IVLStvzMmuCOWsnlvG70E/qQzNmsIxVPEZN8OJJMYTFzKIy+BmlG2YpdjOfnhzLmRQynwpQz1JaMYqhDOLtUNRW8Ar1jKYbZ7EvuJMm+D2b6M1HobzLYxhZPMYqhqUzSNNb175DCWewg1GhNRiFNm1HRlPOa+wLv89xOrIg6GzSrxxNKbNZHebpJYylgq+xJfxtMYfzCQ8wktNCzZ1gHwtCdny663kYaapuRdhdRZwWpsaV4dPf5kTGg4F8n1LWhiz4YlawhyIeJwq1ZoxjGMCzHMchNFBHPP11YAuHUUMf+vIh6+jMpqDiKmYG64ioJJ9KZtGWaxnLXF5pdFLV82w4E9JflnzygynE67zCMl7kDBqYE6rnmsBP2DRkeMasuTNnzZ0yZHiMvaAu7NsNfML59OD9YEObZt1ksIRP+SGnMSt0eStJ5eSckZ19FC/xdpjaR5zIKBZRRmHYhGGczLvM59B02kJJaXtNaMIXDk3F6BcE7ZrcRhth6PChVPMcayiKxw9OJndUV9+fTPZsaLieI9jHPvZzJjekUtnsJ8lRtKJXiI9HkkpqKGEYO/mEFNnByjvBBlaxnyjUiweqxgMjvx4htr6c6igqiKKv0Jpc8llAa84PpWpRuE5vZinFtOQjJoVmGHYyiUUcHXo2DXzM7ziZ1qFU2s8y0rVgz/Kyy8rLWoXL6ijODOqlNPoyklnkMjYolFOheTYKbKaSUkroEByvVoZr8Iuh5VPHm2zhZI696brf3XTdTVMnTZk6eSH9mPlZD/nlzKSg/DNGUaP4hIWhMjgCPEIFSbrTj7eYTXFwD40FXsFhJHiKHIaFuXyCZYwMHdkMjmZACGFaTN9G+v1unEgZs3mZDpyU1mzRjFMo4SkeYw9H06yktMupo0dRG9rhvYjRO9zhlIV3TlLB9+lKJWVs5F0aQgs2QTEvBrV1uh14Nrt4NVSKMY7kVJZQ1chk/sSwW+pDxmkm3UkwiyXhNiZNKcnmnTAIbgjt1WbMZkMQOaU3tj0fgbeZGGpoYW9cwWjeI5O9fI8zWU+zIM8XDFxbkEGHoHP/AzEqiTiCKHQ9OzKy0ei/kKNpTm82MY86ipjFoXyVOEO4jjgPUM52HqKakXzCWD5stM4/ZiZHspWvczxf40ReZ0Xop26YePWx906/FyWlJfdOnzLx6qMaGQmvYh8T6MtxfJWtfEwNrVlALT9hICdzJ3t4nP1RlEssI2NAXt7Fsdhm3m0UUt+NrwYD1y2BhlFMMe1pRl1JaVVJhxJNaMIXDk3F6BcE/Qf1X/xhU3P0/6GktDlH8goFqdS+nJyxNOc9lgezzGYUsoa7ac4SXg2t0D0k2MtMkrTnBfaSH0a6CwNnNMkKttKdw3k0BI6nMYN7OS7M92N8ylI6hmjEulRqLmUUc0wIpUyPpGtZyhZGhv8OI8GdLOdd7iSbM8gMazKHRdzAWdxKxHu8SD++HPQidWznfR4IoZrnsDAoyj9gLs3ZyEPBPDI9Rfk9b4d56AeBnZkgXlJaXlCwJh7HELrwBp/wEnmcTmsw8PkZe6ZOnsnpnMZZ/CG4Kr7HQoYeiPmZOmnK8zPepYCzaAiJkdJ9bjZSRR2F9KCArqQCa6I6+HP1pj54IKT5iPUcnh6VNoqk70VPErSjc6NgrQSFlLCTbNr92SmWGxgRR4RD4LqbrvvFtCuCyZGw9xIlpTsnXn1iurIhxWu8Hhp1pXSlgVlsCb3VwzmRhbwXzocCTqdtaP6lf7o7cBER1WwJjMxDiLOOxSQCEzQj2CM8HtYtzsH0ZinLw2swgsNZGB5JExiGcRKZ9OPgz0rj08shtKBlqIB78E1OoZTdvBT6punCOn04XqJjIHcODM9GoSQt4EiyaB4a2zUsJDeIfpZzPqeBXfycJXyFkfyOJ2hOG7I5ho58j+ls4yt8xHns5SIGhCN1Etexk7UlpR0nXn3cxGuuaHy8J15zxbTpNwe+RAFXUBJuWXtwDR34kGpKuSOww9GZn3AEj0ZRQdptIIpa5OaOy8hoG4xjBRFYJjmsY1n48xoK2F9SunHao3ecMWb0n52KTWjC/3k0FaNfEDTlMP0ZKjmYs1mcSu0jmZFxMIOYzh3hNb/hhwyiLW2DG3kx+ynjeQZzKWMYxWuhyhlASxYRsZgcRlBIFefwHpPYw09ZwPmUBn/B99jBsUTsoSaZfIo1mZlDqaCBnTwZZoU7QlBhVih80ZuuPMRzDGNEED0kmUUL7uCQsHWXMSrETnbhEl7jelpwBYfzELt4kXXsDmPx/iRpTQbTWc5OprGaAYF22YK56YSqktLFt/3sqh49e7QrThedPTiSxRRzKBrVdulm6jRq6csV7OEpyjg+zShYMG/+1ElTpk7ewfBgWjmKbuwO49o022EDnzZqhabYwoccTikLg3tl+tN38hFdOCWwcuOBRVDBDMqDz+WLwYo8HpxlN3I8fZgTpuRpvM38UMck2VFSuuauqbdh4JCBT8yaOnhYItT3Skq33nz7NQcqm5LS9hzOXL4f7KIijqc3s1kT6pvOXEBN2JYGkgznFKLgURoPnfVWzGyUv5VkFEW8y1aSRLTkUHbwSz4J+6ctI9jbqGxFB84izuvsCeuTbm2WcyNrGknjM3mf2xjCjXThJ8wLHxcPZpmvhnuhLMp5lcEhOzePVAgw+yqLQvv/QLs3yR7WUswSYgxkbxgIrOI3nMNmnqaKTFrQjarQlu7PiTzFRJozBtTQ4rO5WZ24lKybb//On1SiaQwdPnTa9LtIhDy2+kAhSLNTepMZViD+Z3/dnCiZjNfWvpBKVaXL7lSqKjisPR/sXfelnV9LSnfwIruoJKektGza/2DaWROa8DnjwE950/J/e2lKqP+TZcjwfuyiGSemUrtrah6LogKqOIUVXMMNvMw59KaQCs6gK++yjw8Yz4nhm3Ikl7EyXHi6cwj1lAanmxwqacWFVHEbBVxMG3LIZxMtOSqM8vckkw9mZLTLy7skitLDzaU8RWcGsJGcYEKeFS54NdTTmrZ0pSvS80RwGN9uxDZDihM4nWnhlV9hVOh1HcwFvMwOerGAJH2DZCdBF7ryEtPJZ1Dg/1WwmoPZXVIan/bonTu27+g/qP/Nt98QfKCaBxHYC+xuVNu9yVKqA4dhP5tp4PggY98zdfJDUycXBrfFl1gP8mnGClZyLJ05jebMD2zL1ZRzIYcxijNYGULP0y20IzmGrlxABjPYyXKeJ4cuoCMtw6B2J7PIYBQt6coJwWcqzVPcwImhjik7Y0zx4zN/U9y+OL3fi9sX3zXl5xdPHE52SWnlbT+/oVfvgw6cmSWl7cNUuoHrWBiqrr6cEggPSVIhIqiQlY3Kx9xAQX4yTNjTnNFzWMzsIPxKK4qOYAm7QtczI9xK/T68W/qVA0gyOxAD4oHVUMrLwT6sngyOoiN38XI4zZ7jEc5jDDEuYixP8jDvBIuxkZzHJ6wjkzc5hd5B25dBOSu4kPZBybc6fGgem6ngpxQwODBBD+M5buVtxtOcE+nGe2mGLqnwlUl/d/LCPj8mdLI3s6hRblYGb/LvRCUd2v/Nn5f2vMEDwWEjE7zOdDrRhyVMaNTaxMPcz7VMbmjoWl39YEPDCqRSaZOKqolXnzhk+AqWp1m8E68ePGvurFlzHxgyvIzEGWO6zZo7s6T0b69V09K0/B9emjqjXxA0jen/BLfcfsvEq1uwiJapVENWVnFt7TOhaXEs2M34cN0qYG/gjJ4ZDHd6NJpCooiW4KMwW4xRGL5Ln7CHLWynJjd3QoguTF/ztlIQSr1sqlOpbfF494yMbqlU+mqd1mR04BjyGcoEdrCOP1Bxy+0/PGNMazaTFbqw6XnovOAS9Ry3NU7TJuJXPB06Lmnk8AkfhKLwIoYGJ8WugZ15oN/TnG5k0YMoZITWcijFdC8v21FSWnLCKSfMfml2dlb2rLn3DxleFVLOS2nBS3zKdp6hOkim8CLTOSGQGvcyh1xG8jP+QCsODr73DeynBycGgl2MwzgkzJezuTxM5GvpyfjAYd3MmEam6xEn0J/fM48SSoIffooSDmIFbzKAgcGDvY58RlIceKhnBIfRzIsnDvnO97/z52fg+AnjfzHt3x+feW/3nt2xf9/+zx4a9KMvj4T/1tOM44h4NHiOZhHRj8X8IfAx0nqXHjzLx4EB0oHxxHiSVOjM9WRMeEFDOvCJDhSxKdAJDpBDDmMRbwe+acQwTmQJbwdSaXq1j+Nlfsp9vMe3AqM3jcO4gV080chytYTLyCPJuWG31wVeRDkVgRVdwDco4oOgFtrBKp5mcyDv1hCjC4NoPLY+mKtoQQ0bGcLskI2UE9KVEpTxMgfzHv8eethP81sGUP2fNSCzOZwEkwKV9jne4Cj2k8dptOcHPA3u4m1+wtFkclUqdWVt7Zy6utmp1P6S0qKJVx8+8ZqJ907/9cSruxFNvHrQxGsm+iNX9d5bbr/+ltu//zfXpwlN+D+PpmL0C4ImAdOfY+I1E2+5/SxeJyM7e0BBwUnsZCERxeF6lmQpL9DAY2wPipx3uK9RTPZb3BWCtgv4gJ3B/mY380Nn5ZV4fHVh4aTs7LH5+d+KohdYyDMUUhMkzG+yk7pEok9Nzcra2pdqa9cylpEcxO9IBVufr6RHe+mUyFtuv+WW27/CMjJD2lO6vzWCbEayg2+HltJ6rmQRRwShFX7HDA6hIphpr+MNtof5+74wga0Lyph4eGoHH5Mf5O0NwSEcfvKLn3zvG997/fevX/PtiUOGJwIvsCeH8AGv0I6+wXf91yzkNFoRsYs/MITxHMfFzAzhQ4exjlVUhTuBP0FWqGYywyPZgbewg57soqbRQDkPbCAKopAEu0tK2wfhUXYgAn7M3kbGBZl8wnIyGQSqS0qrLp44evyE8X/tDBw4ZGDj/6blWeVl5VSHGrc97SnjxXBQMogYykuN5PMxvkQDzwUfSvTnZD5sVCZmcHLQYJUHJ6OiYHeQZolkhluOEhLMC8zgFHkcT3VwZUq/ZwnnkOS9YLeJFpxOxBK+HDivDeEGqZ6WnE/HoMQXSt7CQNdOsJ4PQkJEH4bwFq05kgQjOIO2FHIBvXk63ADk0or11NC90Uc3hG9oP6o4mu/xAFm8ym5qAx3zZQZQyunEuJlpzGEILUtKW/y1A4rNZZtDhd2XPjzHJJZxNPmhBYshnMoM/o0KbqOYvUE6OYTb6+tbpFJVZ4zpki49MfGaibPm/u7Af9M4Y8wZf2N9mtCELwaafEa/OEu74nbbtjS5jX5mGT3mjHunXx+P5yWT+7KzD47F8qhkDnnUBNHPO5xDHZ15gs2kGEI1P2ctv+MFDqILObTmYBaFonAR3ehFRXb26YWF98Tj3ZGZeXhh4d3xeDV9yaOB3bxFHi35Gj3ITSRKOTlc5vtxeFCopBuuJ3EI69IenKPHnHHv9B+Rlpw/xyFs4pWwJqfRlu/zPNdTxMhgz7mG20Nce374+r/EY/QIg/u9fEpxCPUuZnnIHy9nVRCGp6uohdTRLL2fBwzq/+CTD0TMfnl2n759Ro85lmpqacbB5NONFHtCOOp5tAk58h9wYWh31dKVq0IRnM9wMmjD+591kn+f+XQNlIBfhpk+3uEBhnI2p/Ay74anNvEI1cE2K8Z2tpV06PyLaV8PhIf0NrXmjUYBV++xkr7hNmB9SenSu6be/Dcq0T9HYbPCzZvKN5eVs4wloZRPd2SbMzMkfsXoyxg+5eUg+sniRPrySigT06KrU9jHhkBLqGQN41nOW+EjEmQxgtWBV5re9h50YDFrQjM1g0PpxmvhU9IcgOMYRBUr0hcOIuK0ZDLPNTLzygyD+NspoDdv8XLoiNcFhugK3qMdGbQjCoXmfu5nZdD7j6IvD7OdCOwKGrX0akwNlvgHltd5gnYcQz25XEcJr4Q8pD1kkxO4EIdyFB9xFG3S/dq/8ZNSvmlzuPNJ0ooh7GQUhdRSTRYp6ilgFKtYytJgKdUsSCf3MY/jF7w/v/H7lzbZiDYt/79cmjqjXxw0Ter/IoYOH/rDf//2/v3P1tYuz8xsx6m04i1qeJFqvkIb8ukVEsCzqGEArZnCEoaGgX42NXRkOLWUMSKdYZ2ff11u7jcbf3Qs1r6gYFJWVmt2Ust8SujEBHJ5mn4cElqP6UtjMWODXGMvD7CQqgMGnEOHD31h7mO33H5tSelBdGI0+6gLRdIwzmA6Q4OSKV0fTCWLU8kjk23cxwIGURQ0IlvpwWqqSdCegykjxTa6hjDMdDutA8cGJiK0K2439uKx37r+2m9df+2Q4UPZx8LQxktv2mY+YgQH8XYQDHUP7WfkhL5mfRiz7gxlcYqD2Mos9vAK6+gf1nwA7XiEeTzPO5wbBscDuIRNPMk8nqFdIIliNfvoS2LgkIFPzJpWUro3PNWa7izlDWaxnUOC3n/PxRP7PD7z0QMk0b8TWzZvmTnj+fnzlgdlz1tsazQQPzKUvBFoy4Vks7eRQX1vDiKbOdRTxRzOYBDP8zRvcSFduJJinmYNlcFx/RTqWBBKXrShXzDJj4VP6cThxJkd4hiQoDXreTPI9tMd2eHM47ZG3lVPMoMR1PE2x3Axj7CBCrKZx3sMCmm0i4IdWJK2dOTF4EqxkYcCE3ogp/I66xhJLb0Yyis8HMRMTzGPoSG5IJO1XEEUlPVp9nYXZgfLUqEjHqeipHT9GWMOMMX/Aq64ZsLEq4cGCm96RJBJgq0lpatfmPu7iVd35U2S5JEgh2O4hzvCSuI5vs+ZjJs/77TTRl45f978v/MsOvBT0IQmfJHQVIx+cTBgYP9FTdb3fwklpe1btBhaWfn7hoatVDCCI0jRkS+FlkyzQEz8CjlsC85HeaH91sAO9rGZbSHsJ5/m6WKrsvJ7tbUzGn9uQ8OCffvOysjIbNFiHEmKOZgzgvBlL88HiU8sdJu28CCVfMAk6hhB9fx5LS4PmZklpSWjx5wR+HaZHEXz0N+K0ZYorFWc5WykBUNJkcm+ICQaTkG6n3TL7TeTQz192U8dm2KxWjqSoC0Hc34IbDySAcTJ/IuXxpLS9hTSnvlhPVexlS8xhJH05BkO4Ua+zEPMCX/9FpMoooZ1oWJIBb/MDF4gmQ6CCkQLdGcwc0My6kGNVqdtiB6YTy/ahd+9/eSGihaK2xc/PvORwcOKSIViog8VIXc+g4aS0pKLJx70X2qIprFl85ZHH5g+dfLGQMAdSC8WkgolUUdOZw8Z4daihi6U8Afms59FFPNVCpkRZHaH0IdhdGRso873aZzOH4KLO3I5jg5Uh9ckAic4yauhoMwI4vqIZ0MoVxUZnEEur7AxRI7lcygx/p23uJv3QmR8PWfzNTpzKx9TT04ohdOrVMyxrGFVOGNb0Id1TOUlOoew1m9wIrdSwVvhxW04lr3cxd2sZgi5gTz9HN/mIArCZq6mFxP5Kst4n0QwFt1XUrr+3kfvvOKzU/I/xxXXTLx3+g94n73BH2Dz0OENL8x9tqS05IprJr4wd1JJ6QchTik/KOfWcCkf8gCPcHWwa+1eXnbV5eNmTJk09T89i8rLyqdOmnr5uMubStImfMHQVIw24YuPocOHNjTs69z5K1FUw/tUhLKmQ7jozg3eRqtoSTNqWMDeQAzNYBNL6UIBC1hPQUiA3MR+Tq6unlRVdVv6Q2tqplRUXNO8+fhWrW4qKDi7bdtfRdFu3uU+akMsUwG/DWmBmMeTtKE1S+gVMsSzGTF/Xq/TRp7fqINSy/MhfqmQUt5mHsgIvdK32MBh4dpcz0reJ5suoSbeXVKaZrntz8sbRHk6zjEra0xOzrR4vIQ8Tg7tt+voxUoSrAyEgT9FSYeSoMcfyCoyKAxa6Sqq6ML57OMPHMetLGIqM5hF/2CdM4y1bKcqOF61R4hkTLCBVMirbEEzcH9Q/6Sxg2nsJCPU6OVsJ0k3UFW+afOBV9815a7rb7mWDSSIwv5PUVlSuvOrE776j1Wi1068eeaMlsEy84/7iSOCLGw/NeTTnwQP8QlL2MHFTGAzs+jEMCoppDeXhx0ylW4hhSsZOB44hKupDSKwaqo5JJgwrA5nS1o+35WPSN/Qpmm4Q+jPG3zQqIF9OIeGMi4etqUHA3gyxBw0D4r1ZSFQvhe/4lj6sZIjeC2Qd9M3A23DvA5xulFPL3ZyDBeED+rKjxkYUipSZDA0GMEOD24DddzLNEYxjGpymcGJnBP2zHUU8hL7yRk9pu0Lc5/7O72T0gOKocOT1FIw8ephwUQWSkpLXpj75Ogx+ZSFczKXM+jFLazkJvpSTU1gp5wzdXL700Ze8TdapOVl5ZePvXrmjFbz5x1++dib//5mahOa8K+PpmL0i4O0qPnzXot/UbRuk5ud3ap16yNpxkzWk8d+dvMYDdzCZfyed2hBHu15n0KqwyTxcLKpDBGL+8Lldi1tacY5dXXv798/vqLiuw0Nr7dt++vCwvPTK5CdPbB58yvoThV3hxjuXvQOpMYX+IA+dCCbIkpDAzViD93Ky069fNzt6YvQ0OGD6MArfEoBtZzORl4KblBzacaFwTM/yQd8ygmkAmuwfOjw7Ftuv2HBvPnNm3+zefPvNms2LopqsrN/kZFxQX3944nEdm4InuRowzfpz4ssC/ndf4qS0pKgyC5kIDVspzZIiNLLOhYEL6Hu3EQBH3NkoBLGeD8ePyoj40ga2BeGuenyZS+L6cCF1Aaz8Ygi2vEwC8B8HqCATiDFGvZyamjIlZeU7rlr6s8ar//Jp5/8xKx7Bw/LDxVwih1Dh+fcNfUnJ59+8n/13HvsocfOP/3G8rJT6RgeW0M9cZqFM+pltofPyuBo3qQlafHKcjK4IDgGbKSCc0JjOD0LfoJ5oct+oKrbwBQaSPF7tgamQYqBxFgUfCQiWoa49j80EkV14jg2sT1UjQk6cxa1VLA3dF5bEw9OZw2sZRu7Gcv7YcMTPMCpjGIc6/lDuClqUVLadejwbLamm+7Us57RHN3ICjQtkDqfg5kXnCIOcFiTVIXwp2c4l27EqaaByxgWboeqwi49jZ0Trx59y+23/JcOa1rqPvHq4yZefeZfbKbecvstQ4e3JM7OICYbQmu2Mi0YCecEdso+JpWX1V0+7v6/2CItLyu/fOz3y8vOpDcdysu+dPm4x2667qb/0jo3oQn/smgqRr9QaNLU/zXUN+zduvXVzMzm5HIMr5FPBY8ynG/RmuH8gA3UhozsoZSxk1yODpeNWtpyfChGGzieNlSRy1mJREYqtapFi3/LyuqVStWkUtWpVH0qVR+L5VJHH1pxX8jkLGY4H1PG4NBHyWzEs3yPFuFKnEPR5eOuDpvVgeHMp5JaCjmdLGpZzFCOpCaIf+cQ5xQKyKGhpHT3xKtPmnj1xB/94MF3/jA6O/vQ/fvvr6xclJPzUDw+OJH4sL7+Db5MUSOLq7R66Sjapyebnw3w/CPKy8pLOxSF6O20niObRxo5L77IewwMupaP+GYQO2ezMt1szsgYHo/3icWK4/GR7CIZNEYVrOAwTqAF59KJ98N+68MIXuMJXg0OSul65ROaM5q2tOcksideM+HP2Z/F7YvvmvKzwcNagOjiiUf//Nd3/ldJomlMnfxAKD0PoJo3g4wdRfTnrUbp9us4n0HUsod3w6w5fRrsZSP/wbow747Rm9dDBmYab/FAyKFtRU8WflahP5BurGRXuBZk05ccPmoUv1TI0cRC7G3643KJyGZ+ow1JsyliLGc5pZzIIG7gN/wHz3NJaA9n0oJRvEFWSemGex+ddO/0e2+5fSJr2MPB3MRr/Ji9jQRSFfyAhuAXsR5UkcNe1oWxe7q8ruUFNrCJt0LEWnrJJZVmNv+no/m/hiuumfjX/nbKpKnz5xUwMDB30/SJ/SFs7EZeC69dwQ8YxFVcOnVy5eXjrviTtzpt5HfLy8Y0SnWq4diZM1qeNvKyphZpE74AaCpGv1Bo0jD9NQwe2r+2duvOne+wn4M5lyo+5UZODbaa9ZRwE0VUUEkLBhGnX2hZ7aCazcHqMsFgItrxFpuIaJ1IZG7ffs3+/TOiKCeKcqMoM4oyq6vfCi7fXRkUImdQEJS26TFoXRStDXTPTzmWnBAX9DAr6VheVt6+tIRa2nFsWKt0ZTyI5vQLeTC5IcSlK0eEkiirpDS699HbY7G8b06cU1t9fTxekkrVVlQ8EI/3i6JCpFKbs7PzuCX4BqSXLN7mx3l5h7dsOSkejz0/4/k/2dVTJk0dffytu3belpl5GR+ygyQ9OZiXeYNprGNEuDw/zh3BjL2WdfRkLGcmEvPIamh4+7Krun346cKJV48JbdEKzqZXmHLWMJwT2B2K+DaMYj1Hkq4g06qs/kHYVB96w0fcdN3sxx56/C+eNndNueviiedePPGkf2A03wjZ7GJyI71/H7oEa/c0Z7QTx7KRpdRQHlyK0jcSebzN08F5HqUUMZU3QEQhh7CXX7CK53md4XQiGW4J0jZVsxsZkXbiUHY10kiltWul7Oaj4AsWD6r/+SGhNL0P03Ly1SwLDIEM3mETx4S+8kGM4WkWcxldiXidBXyVflxOx1tuvyE9Ih895ozRY46mB7fRm8l057uBgrKC73EQ36Qrd5LiIxqCVdk+mjEw3Jk8Ry3ZDGcvtwRDAGzgx1SVlB7oWP9zUF5WPmXS1KmT93E5X+JG1vIqVdQHlu1IfstPeIn/4AzOD29w9Px5p5028hsHqsypkx9lf/AQSCPdUi0qLyubP+/jf+76N6EJ//toKkab8P8XdOhwSnZ2czbzKe2CjP1edgQjybTM/EesopbX2ZEOvaQhiIrSs9T5fEI2UUh5WUo9b/AxaQOpU/buvW/79m+lUqn6+jXl5WdXVy8kN1QkBaAlC4LTUJp+uicWW5ud3TXYXp5OK3KYwxQyGJmewA4dnvaUqSaP3lQzgy2h5bM/dNFms5oLKAuaj09KSrPuffTfS0pLXnju+dra95PJilisKCOjS8uWPVOp+2trv0UyitpHUW5+/ijuZWbYi49F0TPNmn2/oOBrGRkHt2p1/+9fbLh83IT0c+lr8ANT9mdn3xVFxZmZX87O/nkU7QQJWnEoS2jG4WQS8R6vMip4VUYcxnFgWCo1tq7uidPP6pBuPl1xzcR7p/+UiE2hXZ0TlogVZLOd9wMlIBl+4pYHYu47bAjHOt1pW8oHC95f+tdOm/ETxv/3KtE0utOcRxqZTKWrwPWNBEz5HBtYraU8TWPWzcHs575AkI3Rgd78nqmNptU9ac10ljGSNsEka2OoFCtOaxkNKsijjkToRh8MPgxyurRcr4BS3gnnfPrkOZI9vMC20O5tw9E0MI8kK4IVVDZVbCSD9RxEB+7mHeaQamRWX8SFl4+bftN1N6VPoZkzWvC18GzEFVzJNO7jx5zGRY32zLUcQzVb2EsfjqaWfB6mLSeFevRIujCFl3iTX9CGPp+Nivjvorys/PKxE6dOzuGs8Fg/fk43ngzCOJRyJrU8wZWc8Nm3aV9e9uXLxz0RtErNyeAuPmj0mve5h9ZhvNCEJvwfRlMx+oVCk6D+r2HI8KH19ftKS0+Ox7OZ3YgMmsePSHcgXuFmMhgccoY+Zkuo6j4gL1RRx7KTd8igmreIcTwt2BTckdoxpqZm7ZYt523denEi0ZJzQ9tyWShB8ujCgsDy3JKTU5STM6iubjEZHEdOCKZfTj/6gaz58xYMHT703unf4AP2hdcMYi5LyKOWfcygDTdxPOOZV1K6fOLVw1+YOyvdhUolEy1bFu7YcXFNzRwkErUDB16cl7epuvoiqlOpuqysvs2afTkWe4s7uDMjY0vLlg/k5Bzwvslo1uwHK5YedtrI0TNnPH/52KsenNouM/NAGSEeH5GT82A8fhgfpCO2Q95VigrmcRBtacUydvB1ulEbltZcPnPGtjSLbuuWrSuXrSwqyqUP7/BM6NuV8xB1FNOGXOaylYgk77OZEaAHbzeiML7B4hC19T+NEg7iDZYHf4DmHBVsXMvD+LsFcfI5mA+ZFtLhIzrTkhmhAY98DmEfCSpooI4ScuhLNg1sY1teXibbCuLRRW1qvl1aemfXrv/WYXOgomaHQrOUT9mI0ExFNe/zCXUhnHYw7Xg1VLfIYhDdSNKCYekma6tWfTp2jHieQo7nWE4NPqmHBzuzRFiOmDljz2kjz5k6eSnHhxOgJnz7juTUEJp1UCPeSJo6chz9qeUkBoD97OdQDgsuvOkecx9OYF4wVjuIeEmHVv/Ew3zTdbeWl50SwsYOkFyTjOcIMlkRvLGyaU9bpvDkn73TFJbOn3fc5WOvJ48hDONZplPDbJ5mAFlDhw/5J65/E5rwuSAWSTUtX5ilXXHbbZu3fu6r8a+57Nr1cXX11sLCdrHYOD5lJTUMZiC/5j6eYjCHUEBEC44LUYHv0ZtDAuesmhOCb/YSejCUGDm04IB8J5tRDQ31qdRQDgtz0tbU8CGZVPNhu3bDcnK2k8rJaZNM7q6ufqOo6ORwDdvDbHaQQwcidrApvUXDhg95ce4jQ4dXspcEXTmRlUFKP4NRTAyalV58u7wsPmz4kP93wrRv1bnzqK5dj9+9+4f799+bSBRkZOT263dhu3Ztamu/l0rVIh5v3bz55RkZdfF4RWHht2Kx9o2JsKlUfU7Osdu3tbztB1O3bumRkTEyRIb+cYmi1lGUVmItZHNgIm5hPodxLr2YGcqOeCO30ezg6rp16uTHtm3Z8r1rrl/84eKrrr2SJEPYy8O8z+/oEIKRkozgEOYRsYx8Tgj1X2sGsp7n+B3l9CWrfNPm/7kTL3x0ilwOpp532I1QZaalcitxINQqNCzreTRU1angsbWRzSEqMx5IwMvYFirIVHDB3Mh7nFpV1T0eq4jHqj+qrNzd0JAVi53ZqtVTvYuax99nV9DFt6IPe1gRytP3acGhbAiPpPdw55CHuY3K9KWEtA69ayhSP9q9e/G2bR8yggPVUi/a8x4Psiesf1rL/zSruI4GrmJpsKbPIMXtfMANDOHHvNWIOhIxKRh/5oRv6wraBUn+h6TYGqrbFiGrtk06SGzooYP+iYd7/rzV/Jab2d0oBWAv32cNzdnJa0GNt5s8TudDfhja3nv5IQ38gN7lZSeHZmoJp7CV/2AOR1JC5eay8puuu+nycZd/7r+xTUvT8g8vTZ3RLw62btnarn3bRR8tbtIw/TlKSksqKwvWrJleV7eb3FhsfBSlQiepM6fwDsfTljoqyKGCQo4hi6F0pCEkrFSQ4JBQeqY1zrVUs598jmcmawNrc28wcl/IOs5JW4JnZJR17z62ZcuBJSUnkkokdrCvbdvxsVh+kAq9RnOGhebKWt5r5NmupLTkvulTRo8pCSvQmtOI2Md1nPLZ3VDAVZeNe2hmIHqWlLZPJGpbterTt+9XamufamgoT6VSaNduQMuW3Roayqur56alP/F4mxYt2uzefUVNzXONibC1ta/u3DkuL69rp07TcnPrqqvHJpPrD5SSqVRVbe03Gho+5F5uYWPaWpx1jOUo9gTu4G304s5GoUeYz13kUHDnv989/IhDL73qkn1794X5e19a8T6H0gON1OXdOIOIDgwLDdRUCLI/JGiqBgSebvRPPd3+HItDwOYBpuaC4N+ZLhyPZkOgY2aEv0pQQmt2syWsZFZ4akmoaFPBuHRnaGGm33MBm7iMQxmVSF7UkMyv5KIVK+bs2YOHt25tyE5277yDmvDmOfQmi11spyddQgu/qmNuebDHj8gP1rmrQl11YFhcwYL27Vvl55fW1ubStlFWJ2o5jBhTQlLoDiZTwPfpwCWcya08BjaQ5oH8gBLO5Ju8wp1UUcb17OR06sjh92wPuV9pivNarmYfb1MT1iGTOEtHj+n/D6uX/hzlZeXkcgr1XMub4F2+Sw7tKeJLHMTvWcI+8mnGybTgP/g9N9Gbb4Ya9JNw0BtIhsbzYcHJdfuUSQ/NnNFm/rwBp44cO3/egn/WtjShCf+baCpGvzjYunnbqy+91q643aMPPraoScb0WQwdPoTazMzTqqrK2ERNFJ1NxEw2BAYnMtjG67TiHZYGzUea0LmTN8lmfSD/5QTXpB28TgltmUMNB/MmH9IquA69QQbHspmPoyi3V6+LsrNbxWIZNTXbqMnJaduq1QVRlBWP5xLjOYZzDPkkWMaaNBHwTzTsV1wzIYoyWEwtWcGG83be+uxuWMt32HIgJL28rLyqansiUZNKJbKyCrp0OWLBgik7diz/9NM5OTmXdeo0NYrqKyqeSib3x2LNEom6nj3Pq6qaum/fjWkJS0XFr/ft+3GbNle1a/dv8XiLkpLbW7Q4qabm4oaGl5BIfFBdfUEiUcxD9OA47qMNuJyeoe/7b4wMD36Zh5gLXuJphjKY+JEjjzj+pOOKS4qPPu6owcMK2RmMnNJypRRrSkr3XjLxOBaGaikt60mynfdI8WFQ1eSEwKEqloZq9X8IMTqyii3hkRIGs4FFwc20iOOJkxajLAsORxkhdKCK1aGWQkc68CmbQou0kKFkhaDRNHv4SrqGP+ldmbhifVWXgS1a3LR+/TdWr17ZosUDP//5w5MmnXpcx0Z1fD3tyaUk7Ngaav/t8stbdGpRkPdpUN2l91genfiYT4MgrIF32JqXV5xKpXfvg2wIDF2hJO1DP2bxHPdxBFeEkgsjuZH3+Dbf5jCuCLcN6MetFHE9P6GEUSRpxtvk8iX2kM9zZHENHZnIIGazijoK+JBhM2es/uF1N/9TD3d6EDGMIdzDT7mbnoygMvzUHB1s8KtDxZm+uT2DZ+nO6Y0q+G18EkLj0gzpuqCKm0tGedk59KVfednYy8ZN+XvM85vQhH81NBWjXxwMGNR/3MUXDRjUr//A/gMG9f+8V+dfDqnUvoyMgzMzD08m302lXkk7MWVknM4HLCGTKhbzEaeQywC28G7gnK1mIf0ppEXowbSkknW8y7Gczikcy5uh+7KHXVTxPFsYyIe8wpGpVHUyWZ9KJcvLXysv/4Bv19ZuSKWSqVTd7t0vR1EPjgpzxrSKto5TaUF2ednmxptWUlrSsmW3vLw9vMjWQBYcySM8EV71Ij+mlJ7lZZvLy8onfPnqHVtPW736tXXrXt2x48OTTrr5uONuKC7uV1a2o127uwsKjszK6tix46/z8wfv2/ebKMpKJmsLCjr17XtZPL5y586xe/f+W339Gx07TikqOvvAmrRufXn79j+qr/95be3ttbXf5DKua7SmnbiXw/klT/IhNwTn+TRGcRuLuIv3OY3uZBEv21RWXFKM4vbFd0/5+SUTj2gUzpQsKd1+ycQRv5352PgJX5007Wp+H7Q4CVawhaGgJUuCV3+KXSynbeNc0/8BpAfx/dkZ5GsRzQNzoyZM4TGYPtTRjx2sDRahEf0o4NNG8/30VH03FY06uz1DnFIHxocgzQMoZOy8Xb36NW/+cXV1IpGoTyRwyYUXksESKsJYORWK9X18RLRz9+5Va9dmUVCwgwWhLK7mQ8ZxEMvI5vc00CcWi4gzMKRtpX2+Hgn96RTtOJrVtA0mXw2NmKDFDGQ1ucEPoTFyaEVEb46gnnL2UsqosGLpzu6lodrDSVzG2kaunzn0mTmj7tSRX/6nZBqVb9pMbtjAjpwZlGQDiKikWTjW7fgyST5hTeiap5+t5XvMDxX8Ls6kOa8G46oUGfyBzlwTCBLIY+yUybsu+6wzVBOa8K+PpmL0i4a2xe0WN2mY/hJOP2t4ff1HUVRIz1Qqnkz+Jopyqc3M/HIUbSYn+MJcSDsKqOLUkM24nQ2MpB05VHM4fVlEFeVc0ogYN5RxrKGOzTQnn2NI8TYrOY9i4vX1FWvXPrF7dw6/5sS6uu9t2/bStm0PJxJDsrLui8ebs4gVvMC51ITU0KUzZ7z+J/O4hobqQYMubt26E6+xmzo6cgbzuY37mMmR9CevvKz8mst/3qzwtoKCAS1bntC6deezzpqcn9/6gw/ur6zs2aHDnZmZ7Q68c9u2327b9uqqqt8nErXJZEMsln3QQRe2bl2cSKxo0+aqnJyDD5BHU6n6VKouP394YeExicRLDGZ4II82RhFxlqV3wl86VpXs4qzA6quh/k/q7/ETvjpp2ndZQ6qkdPP4CSeNn/DV9FMDhwx8ctavBw/bTqykNPuSiYcNHtaW3aGH2o1NQTSzLsjP/xdQyODgf9kQnOEPIpuFrEKoKbPJY3Aw7EyFH+rO9AiJnekqPIc+wXozrXmPhd7zfH7Fzs+uQzUPsjhFZkZGfkbG+G9+88XX0m6XmXRldajU00SILSF1rOGRZ589vn//gqysPi1bsqu0ZAM5bKE9D5MI/vxZHEKUlZVXXb2XMjpyOIt4gDry+TicEpnU0YyfpJt8jZigjzCXSziFx/klO5jJdezgfl6hC9kk+IT3yQoj7GWsI8WwYBqQCMVud4aTZCTNiLOPueVl5X9n9tLfQHlZ+Q+v+wXL+bhRlFQNrajnVTJZzotUk0EO+6LoKOYzL5gbJDmaY3iAaSGvNZtjOI5FLAmJrLm0atQwPoDe8+dtnTLp/v/m5jShCf+baCpGv2hoV9z2816Ff1Hcevv3b7ztyERiHRWcwIBUansqtS+KWmVmXhJFhYHOVUg2BVST4gh6Uc8oCoKndxUJenJcUA79yZUsCkZFJ9OVfiHAJsmltCGL/I0bZ9XUjOJHoR7qlUzekUqNiKK+yMi4PiPjSBbyHUZxMe/wEjlMvGzcHY3r0dZtmiWTDQcddFq3bsczP5Q7eZwKPuYU2rKXT9av6dys8MexWM6uXQ/26lVy5JHXNjTUbtjw3vz5j+bk9P3zXZdM1hJvaIg2bHg5PZ/NyWmVmVmwefONO3ZMTZNHA4V09dq159fXr42iWEZGLRczPwiZ07iZ6RxKV2Zxc1DApPEsP6BfKCCwi+c5aOaMjXNnz228VgOHDHxy1pTBwwbfPfV7J59+UuOnitsX3z3lzksmnve9m84aP+Grd0/5+amjO4Qn84JBaT39KCKjvGyL/zGUlKZJn/XBTzTF6kYOUymGsIEPqA190IgYB9ORXaH0RDP6EeOTwP0QNEwrg/xF8LKtYVLgZWIjd7KXnslUKiszc9TQoacOH/7TX/3qF/fdR4xiBrOPVaSoYx29aBmP+crRR1fV1WVmZBzdrdv5Awdu21JON3rSh8HM4QmyGZYuEFesmJlIpAnWaSOFg4lzPj+gL+8GaWCSbhzLc/ycSvbzM7YxgS705Wvs4yYSnMUv+ZiL2EUub7CUk0NhuoC3+QoHczfvh6Zjusv4NG80aiSvYjatSkr/u4L6mTOeP3XkteVlp5LuSs5mZ+hiZvJ7uvMfTKaUB4N/XCKKusRil0VRglnsIpsMenAB6/hu2FHoyHkkqWc4XVnJzwP5OI11/Iy8Jr+nJvzfQlMx+kXDqFNOePWl1z7vtfgXxegxZ0z9zbfYS0WaxZVIzE8k/kAsFmsbrO/TVk0L2c0fQmJ42vqngaUspZJn2U4+tSzj/uD1iLk8ErIf00PYVSwhn75BuTyXhtra2jA+PoAcMhoa7kyl1lIbi52ZmTk1iuayk158hx4cSj4XXjbuoQP8sOtv/saKFTPr66tbtOhGjGxepZIYpUFHFYuit7t1G9uhw7Xp4mbnzrdWr349Hs/MyWkWj2fn5Q0vL79+584HG6/Q1q2379p1X8+eNw8Y8FAsVrp8+cNVVZvj8axEorq0dHxl5ez16y+tr9+KXbumb9hwWW5u1xYtRsVi2ZmZ/bOzj+Z7/Aas4Ww+4vxQrI+himtDMtOv+R0j6UAsRK2+wjlcyfU/vO7Dn/34543XLV10/rVgpPETvjpwyMD0v79303U33HI9axpp9tN9uPqS0v2XTLzgv3Ie/dfw25n3XTJxROg4ppFm0SymDkQcR8RcUiSCt0A9bSliJ6uCr2ea3FnA8hB9lG6d9mdXaNWnghVUKU/yIm8xhVbpM3Dpvn3xeBzdS0ouOe201atXhxZ1PkOCt+42BtKKjEQykRmP1zc0ZMXjyVSqQ1FRu2bNaBsKoyIGUU/fYKe/JzMzxuEcyZfYx26+yyHgfMaynJUkyaQdo6niem6kGeNpHurydGX8JQbRnvH0Y0mIn9jHV6gMhelGrqQ3J3AJf2BqyP/8JUs4gn28xCIW0IX2/53SLe2N+sPrZnERubTgIgYyh/XkM4tj+XbQ+1/DJbzAu6HrmR9F50TRMObQPMQHFHAm6ZuoNJM4beXRgpZkUcBoipnMHPAWv6IrOUOHD/1rK9yEJvwLoqkY/QKiKRT0b2Do8CElpVk8wTbyaZ1IrG1oeJo2IXDyBdZxcvBmejlEgDbwHpsZSYK+zGEzKfrSwBTW8CTv0ZeiQDZ9h3UcHWzA9/A4tXyDI/kWL4a1W8tYPqRL2uEomXy1vv6qVKoyEOly6MjzbKaaI6dM3n/ZuO+kt+vRZ36Rkb20pmYPydzcS2KxeAhCTFNIE2xIpRJr1tywY8ezRFlZ7fPyWldV7X3ssQu3bl3arFn7VKq2qGjc7t1PbNr09WSyqr5+8/r1l6ZSG/r3v79Vq+NisdyePW9t2/a8lSsfbWioTibrMzNblJZ+NTMzvm7d2C1bbtu5895WrUY3a3ZEFGXGYtmpVF1GxoDc3HFR9BgTuIx2QeSeEYrCY+nMLXyNBYymU6gUy1jFDzgt7J+LZs7o9q2rrv/HDv3Jp5/05Kz7Bg8rCNmSKepKSvd+76YrDoz4/4cQSAXLAl+wsqQ0OWnaD0pKyxq1QodwUGhkLmEdGaFGLCYtUNvTKLGpJ5tYH3rwOfQLQ/8Dk/2Wwa/0ZfrSJV3oxMhNpV54991EMlmYl5eXnR1mxGkPh55EdA8j4K3Nci1Yu/aDFSuqd+yYuXRpZV3dBQMHFma/y6qQy5UMDN30vdm2mprTgi3uMjpxOYVUhGyzfvwbbYMFFWIcSnuqQjQXUszhScY0NpHgRLpQRwNfJkZ1oBZ8jQMkk558g0L+g59Sy1HBHKAFn9Cb1sRKOrT5x45seVn5zKd/P2XyJo5rlAeWJqRezG6y+RrnUEkV1VRzFL8kEdyO66mJoj5RdBi1vMgeBDJxLkWNHtxLIdsCIXgYpzGHn/MMh9L7s9OGJjTh/wBiUfghbFq+MAu2bd72ua/Gv+xCHd14OegYxiaTmcnkOyR5gLacRz41HBaKzhhv0zzYi2ZQzEg+Ihau3+15nHKGhko0OxC8Tg2mibt5jP5cQhEjGc+93MNTfI0iTiCeSm1paLi7oeF2jgnvlq53Z1NKLrls4dn585ZsLiuPKC0t+eFt380tWEOUSiVycsbG4315g53Us4nt1MTj527cOHnt2lsQRYV9+pxdVNT56acnbNmyJJmszcgobtny0vr6XevWXbBu3bgWLfr16fOrnJxOB34ySku/0qvXT8vL56VStalUQyqVbNPmlJYtD9u/f067dl/NzGybStUhirLSdlSxWHFu7uVRtIWjOYKsYAaZCKPn/pxANWPCU2ntUQt+TM9G/ue1DJk/78sXjL516+Yt/8Chb9+++BdTfnbq6D5Bw774F1P/o31J8WMPPfbp8k/+R8+6QUMG/m7WlMHDYmQOHV7zxMzfDBoy8BdTf1JSmiYUJqijiDxSHEkDH7M/VJYH04VP2PHHs/iPifb1VIXSM0Vneod9mO725dCaPNoQpQNXT+7e/YFTT+0Qiz340kvrt26trkvPBBay/7NOpVjPxuq6aMfatdNatnykVau+lZUPvf/+pzt2ZMbjh3VN8j5VQUqfZDnZXExJcFddzgeUUxCWfPJZxUIuCA6jUSAt9OEj7gkSrtWcTUEwyU8GCkcvzmYfZWzl/TDuiD4rhMqmN8kQEJBkV9CkZ5Af7BRS//CRnTJ5Om+wtVEeWD55LGYb2dzFwvBgbkgOe5INHJ9M/iqV+pgccqmgiGHMCuOCPbRj6xVXnzZ0+LpgmF/Ep+SHb1ArTgg2CB1JlZTml3Zo/7n/0jYtTcvfvzR1Rr+AGDCoX1Nn9G9g6PBBtGYQC4NQfVQqNYI9jAp1QNpcqYJeIby+JwNDZyuXqjBbzKWMWkrJCtb02EAFnRgRKGvZbORyRoYWVLos/iaLeYDhYY6Z3dBwayLxImPpSS4zg5/iqUTs4XUeplOwkoGS0pL7p0+74urLE4lPUqmq7OxRUZTPNjLZQaKktH0Utc/IuGTPnkXLl3+5vn4vunQZ2bv32e+/f18qldZPZDRrdmYs1jKVqsnN7fqXdmEylWpGasuWpxoa9iI7uz2peLxZPF6YSjVs3/5kKtW6pub5+vp5iKLMKIoFyQ7m8Q5deCasW7zRnHQtL3IUb/FgIw/89D928O/lZSu3lP+DLM8tm7d8tGAjPdM59Y888OgjDzw6ZfLWS8fd/+hDj/1j7/l3orh98S+m/Oz7t3znrl//PL0mr70yp7ysM5tYQCVlfJ1OZDGEtixulBfankHsCjp3ZNA9hKBuDb/q6fOhmNUh6ScZwlF3xaMPbzlq0PcPPzw/M/PmI4+8pE+f373+eiKRoIhuQfojTNtXsJ2BBamaB1q16haPx/i3wsJr8/JmLVnSkEyu27lztJ2DvJUeIxSbf/Qf6dSPNlqftLHrL3mh0c6YwZN8l69yK2uDgqeKLE4ml8ksIskvWRTUe7HAAf0Dz9Ca7TzDGC5nLr+hoZEQ6mUeC7lcKcr4mI7UkUU1KygZeugQ/zjyacVvGjmppfgtn9KVZhzKXfwiPFvNTWzm3/kSN6VSK1Kp56hgN+1KStdecfW4K64+mNeoKCktuuLq4VdeM/H+6VOuuLo39VdcffjHn35wxdXFpFnjNSzn24xmbknpotFjDv3v67Ga0IT/TTQVo19ANIWC/h2oooChRPyO/Y0McbCP3xHxMuW0CE2UJBW8TpK5wYw6g4iPQ+BKWr27lH10YD8J9vF76sliVrjippc9PMAOcsOnb2Z1KlXLhKCWbeBdOjE0qGtf4V0G0Y7MP1HWX3nNxCkPXlRb+2wyuZMc2jC4pDTziqtPHjp8CDUUxOMX1Na2ra7eXFm5va6usqCguFu347Oydu7d+1QyuTeKsuLxvFhs8Nq1d69e/aPGb75+/aSVK7/XqtXQRKK6WbMWZWWPVFV9GotlkUil6qurV23b9mg8PqJFi1+3bHlfIlFWWzuTWuIhufF5KvkBExjFi6wM0q4ki3iPr3Im17OPf+OAjv733EA27fbs3vMPHPVHH3rsS6ffUl52EkdxJEfNnJE5c8Z79OC0KZO3XXvVd/6Bt/0vIa212rJ5yzcmfmfK5M0czaVEVPN1SkPpiZ4MobqR7VFWyJH/iN1EYY7fhjLWhN2IIrqGTmqSiC3F+WtnfunsE7p0ObAy5/XuPeXkkysqKojRniHsJP3rsYZYWtRfEo9LeyWkUnWp1InZ2VcVFtbU1rbbt+88bpc4xdJT7HlM8kjoTHGw7kImfTmTN/gpO7mPJdzNcWA4U+jIizSE1uwwRvARrenPSzwTNg3PMo+hVHAlE1hIX35IS27nE/Bb3mYgNeTxKdl0ZAXVZLKUbo1shv/LKN+0mWy6MYi3eYA9/IItjGA/eXTlTBZzJcu5kubcSlo11Y+7UqnOyeSDqdT+ktL6+x+97cprJl55zcT7p3+3pLTl6DFdrgy2/FdeM/GluY9cec349L/vn/51nmAt36UlQ7iuvKz5P7w5TWjC54WmYvQLiHbF7bZu3vZ5r8W/Ln50+82jx3RgPVmh1/Jbyomxl2XMoF34cZ/LcnKiqI5NzA0B6IewLATW59CJ5eQ1ivrsH3qr2/g9PTmHc2nHnawAbzGJJO2pI8lK3ozHD2/k4zgzFltMNn3IYB9r2cXhaSX4X/wWDx0+5IU5U/sdsjyKcqkvKV13/6N3XHnNxGHDhycS77CfjCjql0jUf/TRb7Zs+TgrKz8jI5uodetmu3c/XFe3OhZrRm1m5iU7dny0aNFXa2o2JhL7V6z49rZtzxcXX5CdXYouXUZ263bc1q3PVVauTKUStbXlu3Y9n59/dWHht5CR0btVq4cyMrpWVT0URWnzxafpxfdoD07hGywN8u132cN1QdTVimvoyXd4l4d4gH4M+CuGUP8JHpz2mymT53EG8UYz3+4cysPMo9/8eYPOH33z+aPHf7L8k3/gI/5OfLTgo29M/HF52Qn0ZS8fMoTzaaCW3awKJ0DLdPoRH4f0rwPipFVsQhip96WeJeEP97E0VK61ZBQV7SgoLLzg2Wc/2Pz/TLIeX7bsipdfbpafH3ZpAYMDZbMwTPwTy+vr36yry4yirCjKiqLb9+9/PDPz5z/6Ue+zzvoqb3ADN1DLdMikD4fzHk9TH0y1zieTW+nIHXQI/NFKMvgW1zbq+zbQho5k0pYjKGMyG/gVqzmcPIrA8UzgXqq4hLN4kDtYyUBygwAxff95PIPZRQWHpMN7Szv8g33E8rLyUD035zCS/IpmHBZ8nfLDR59IW27gRK7+7NtkMJGxVFx5zZkHmppDhw95ae7TV342IOrAs+Vl5R/Mm8+RXN7oBqYZE6dM3n/puAn/2BY1oQmfC2KB1tO0fHGWAYP6Lfpo8ee+Gv/Ky49uv4ndweu+JT14njzKeJejOJg86jiJZeSlUttZxJH0CfXB6ewJso9i+rKLrcEPMhGCQ+dxGkeFL91xHM2DPMUsutCVLBpYyJqMjAtisXbUUcXvMjLqCgrOCLTCNcwN9kAZ1LOYssabVl5Wds+kqaRKStvfP/2Xg4e1u+LqY1+a+2xJaXtSo8ec/OLr/zFwyNJUam0U5aRSiU6dvrxly7IVK2bG4zkNDbW9e5/cq9cx+/Y9Q4raKCrMzBxXW5u7aNFXPvzwvLq6naWll2VltY3FMokaGuratu03YMCXq6uXRVHOvn3Liop+lZMzKpWqSqWqU6nqVKqhsPC7BQWXJpO72Mj5nNWoBKmkO9+jJXEGcA3Ng9QjrfY4hSv4Da9zXGBB/MM/XBu5nx2NZr5zeJlj2c8LlJWXvVde1vzScXfMnf06qS2bN/9zz72XZ71y9YRHy8uOpxV17GQ2FQcyVMNN0aLAIUkELuDHlAeZTjsOSRt1Bf5rnO60YjlRKHBL6MzOrl2bN2vWvFtx8bBevb45e/bDS5bg5/Pm3fPhh+eOGFFZW8ueoHqJByOIjqTQtm3FCSeecWtV9S8rKnYkk1fu3r39oIPu+9nPBvfv//WLL775u9/9RX7+j1nBhSQ79AiCpJaByNjAFmqC5uYYXmbaZ/mjebzNz/gSW3grZHumgogqbRrVlkfI4eigmkr7f33I99gSeo2dKKKaoWRTQza9OJocMtlIBl1pQT2bP5g3/x87miWl7YMqK+2c2oVEcEtYw07KQ2s/zsGkeInvByeEA3icB7jyxuueS39//9OlfFP5lMnT/kpeQ/v581bNnDHz8/2ZbVqalr9/aeqMfjHRrrjt1i1NzdG/hZLSdiFlu4bS4I+9jlPTs2/yqKQVp5NkP6dQHGyS0mO+dLdjX1BFdCWHYmLUUk4tR9A9qC7SS0e68AEDaBHEK6lYLCMr6/JYLC03yeY3ubn9CwrGRFEeSVaxlKMpDbGNC2mgf9mmP/a6ysvKLx17/ZTJSy8d98duyv3Tp155zSWf3fCS+6ffPWjoumRyMeLx/M6dL66pSa1a9VJDQx1KSgYMHTq2oeGjVKqOFOLxY6NoSEZGizZtTkcUxWtrN8dimXV1FalUIju7eb9+F6VSNYnE1igSRXlRlBdFuWGJ19UtSKXibGXZZ0uQdBXyDgtI8TzLGz2eF/i4D5LJQcH1poINz82Y9Q8d9j40Txu/U8MTbOIqDuEkejGbEaQ4/8br5tzx459/6fSbzx996T+xUfrhgo9YGCzQs4Kp5Mf8JOSFtuR42vAe5aSIhQ7uRraEXng+A0NWbZQ+UrSlFzEOoxmo7NCh8zHHnNjQ0JARiw3u1u2io456ZNmyMTNmvLJ+/fmHH96qoCAWRad0yexY8Glwzk9Xtwkqi4o2nn76CV/96lV33HHvxsGHf2XfviHnnHPLd76TmZGxd9++vfv3Dx048P6f/Sxj1KhrcvKOHj2hujqPJaHcX80wxvICH1HGwVzATexkAqvDXnmUO5jIVTzAUF5mI3G2NwpN6AZ6kEony9OHp/gJQwJZdk5ouwpypUXB4Ay7eYQq4mSynwV0mDmj7pSRY/6BEKahw4e8NPdXQ4dHIRkrzUhJsYJyJtKD2UGNVEkmXyLJNSG5Hr/mdW7mKL43ZfL+A9/fv4HysnIO5S1uDVEIabzKnRzcRBttwv8hNBWjX0wMGNS/KZ7+b6OkQwuGU8QGyimieYgyr2dlcCZPy+E7kyKXBlayhJ28h+Ajs4Idgd+ZZHugu6V4ixeD6iLOIh4Oc8P0bHQrq8mMx49MP5hIzKW2oODUrKwBqVRtMrmfiJ2cRttgi/1eqKEz0xfReyZNO2XkdeVlx3Po/Hmlp4w8929cXO+fPnXC13oRTyZroyjevv3pBQUDGhqqd+xYXVtbkZ1dePDBJ8bj++rrH0ilNqct+pPJaqRSif37F23Z8tv8/IuXLn1mw4Y3MzJyMjPzoiiWkTFg9+6vVVc/deBTGhqW79gxpra2jJ50Zg03NrpwppiSDkcNGZgP8Wyj1XyRO+kUTLLSO3YOrefP2/IP8TuTDGAYL/EQrZlAy9Cs7cblVJKkjsNmzmhFVF721UvHTfpn1aPF7dsxjI3cG/zMI0aSwx18EEaugziMFaTCI605KtQ6teEepjPZrA8+plF4cXqgv4kl7dq137t3T2VlRW1Dw459+z5YtWrs0UdvrawcP3Jku+bNy3fvrqipiRjdrfPhxbtYTYIYNW3bbr/jjl+ceeYFBQXNFi58b/78txNZ2Y889dQ78+cXNW/evFmz5oWFzQoKnnnlldfffru2rmbmzHk7d17MCbzDO4yMouujaEwU3c4mjg4k0bZ8i/5cxQvczbPczllhE67l23xAJtuD6a/gwJBPJfOpZRfPMJz0MOEpfsdghL9dziFs51VW8DRF9AmmrQsYyrH0Li879pSRX/8T+vXfg5LSkvun33PF1UfzCbXkhfL3KrpwLJeznrmNXKvSzhK/YhK3sZ4fBVIEzpo/b/QpI6/885UpLys/8GDZps0UcAo53Mob4Cme4kT2lnRo/1/dliY04fNCUzH6xUS74rZNgvq/jZLSdtQwhEKWsYrm7CeHD1jO4WTxCc+EuXyK91nOYcFS8aXASOtHeTBRKmcVPWhNgsPZxkPs4lVep5S2QdPzKVsZQZRKVaVSW+vrH4minVGUG0WZUZRVX796//5HuSiE3cf5OIQ3dkr715SXbb5n0rQpk1dyShjb9SgvO+7SsTf/jYvrmeecXlLaa/v212trt9XUlO/cuSWV+u6iRa+tXz8vO7sgIyM7lUo0a9a3vv7RZHJRFGWnUvWpVHLXrjl79ixs2fKOgoKvtGnzwPbtlcuXP1Vbuz+K4vF455ycc/fv/9W+fTehqmr6rl2XJZOdOCno5U+ikB8xj418l085NqSHt+ZI3uan7OFBXmIIpcE/azXvMZTWNJ8/r+X5o7/+99eI7UuKgxioJYdSy0Yqgn94uiO7jsXkkcUOfkcVbbj50nHP3/Hjn48d8+3/alW6ZfOfC/8jDiWPh1gdysdDGMxjbAy25yWcTpwd7ALZlJDJArYGDVyKbuzj05AnGZFkNasYsGvXjuee++25556zZv/+h15f/+nmk3771nLEouiD1aufX7DgunPO2Z2d/fSqVd2Lik7pksFqMqLo48MPP6Zt2/a45547Hn102qhRpyaTiVNPPfWOe+659c4701vy/Z/85JkXX+zaqVMyeTxXkstAWvONKPoK+DCVSgvnewR/rjpqOIWbeJaVPMjgsNXpFu9JPBG649+lhnXhFq6G9dxKd97jRDqTxWb+wBG0oZaItQwiK9R5r9GVgxo1L09tlOJbxNmXjnvgxutu/i8d3zSuvGbC/dNvCjGk7ZhA8/BkN66lPX8I5qAJunAeK9ke7ogSQanWQPfysgsuHXfzgZW5Z9K0eyZNO2XkDZeOm3HPpGn+2BlNl7ZDOYon+QlvcDLt2N/UGW3C/yFEH386//Nehyb88/HqS68t+mjxt6//5ue9Iv+6KC8rv/G6W+fPS7GeriylIPQ18xnBDt6iDy15OxgBZjA0eOOfx0esIslhNPAJe8mnV7DMfDcoLZazmTgHhXnikmC62ZdM3svIOLKh4YXs7CE5OSMqKp7OyTm0vn51Xd1GvskIlvArdtCBM3mJFAmW046TKWqkYzjwj1d+dPuXRo854082/55J06ZMnsdYXuSN0L/BDqYVFe3p1ev4999/rGPHa6qqVu3cOSsWGxCLrc/IKEomWxcVfS8Wa3vgrfbt+3lt7YvIzDwrFuuQSlXW1DwbRbFEYisn0DEYtq/naLCet4nRKThlZvJ86A7iY3aQwaEhzH0F9exiJM3ZzRZSLKbDFVefOnb8hX/PQf9owcdXT7iNQVSzkLZs5FwGgOeZR/90Ziaz6U81XyPF7MLCFs2afWX37tu/cmmPseMvnDt77sgTRvqjSdPrM2e8cP+j9xQUFm7ZvGXF0hUHnnrkgUfLyzbf9euf+aOI/lvlZV1CGbGNJfSkd6hF9vEBhQwJ1cwLdOQT+tGRzayhFx9TSHc+pBPNWM9uOrGDAvYwmNpY7KNrrrlm7969Dz64mJNAkhc7tNqYSCZvvvDCfp074/5XX31g9uxRHTu+sXXb4Ycf265dyezZswoLC/PzC9atW3366WOqqirfemvOpZdcsn///pnPP58RRbV1ddU1NYUFBeVbjgsHt4Z/47tRNAqkUqnfMIO2QUV+ABu4K7A893ATAxs9u4rvhjnAEq5iF6+xj2bcwM2BIXMEtbzDLk4I9OuPqeQQMqnkk/DVPpQUq6imkJGhOhTu4rYx64qrL7zymgn+WPD5+6u6mTOev/G62zk27I3GeJtXRo85e+aMJYwID86iG+9xAWc3evEc7udcOpaUPjd0+EEzZ6ylLd8Fs0tKnynp0Hr+vI5he9P3Hmm31+HsKCld9tLcx/7O1W5CEz53NJnefzGXQwb1f/Wl1z731fhXXkpLSx6YPuXMMWn9QT7DiNhHV46mkuWMZCQDOJ0UrTiMiGwiqhkYrjo7SNGDiF5BYJsm/G2hlt7Ew1A1ER5sz8AwrM9KJN4sKDgrN/fIKMqKxXLr6pbW1eUwOVy6+nE7/TicAr5EW1bzZbJ4KrAJY2ET0/S47eWbNjfe8M1l5VMmTZsyeRMTqaWM8aESRWtu2LOn/4IFj6VS9cjL69G+/cUZGduTyWRW1tlFRTeTm0xWJJMVqVRlKlVVWHhVYeFNDQ01yWRlOuw0J2dMMpkmFXQNja7dVFNJLe0YTj79gwXmOlLsC/72h9AQ9kw9e9hNkjMpCmyHT1nFEQyZMvnta6/6zt9z0AcNOeSpWZMHD9sdcjgHMogneYV7WchA8tnN64ykPxF7+UXLloOKiq6KxQpatfrR4w/Hzx990Y3XLTl/9IS5s+fOeeX1KZO3lpedc+nYm+fOnnv7j3724NSaC878ytbNW66/9j/27z6pRbMrLh/3/bmz5/701jv79hnAtqB5b0sLtvJG0DDFyKI1rzay/CzlaJazJG0ES0uOIsZHoRWKznRifSBZHpG2Fz3ssMNWrlz54IPloRJFjNM37RzeunnzbsXF1bW11XV1Fx1zzO3jx6+sqcnKyu7Ro3dhYdE553wlOzt3x45tX/7yZQUFhVVVlXl5ealUqrCw8ILzz8/OyysoKDj80BHlW7Y0sonNicdbRdHdqdR3qA2GFceAG4LZE17n3zmIBnpzENfyeHh2Jl8L36bmnM69bOBmzuZcrqMT2eSxj9foHrZrN2+FL1dW8LSvDy3SiI/J43JKmM6qEFuPxTxJ82HDh6S/KTOfnnXKyCunTJr2d/6qlJSmFWNv8OtALUjjJWbR+aprxt0//RvMJM3pr6IFZzGL74cHn2YqV3IRR5WXXT5zxkf0DZUoTigv+8H8eauZwVIy+IRm/IARPMHrJR1afe6/sU1L0/L3L01j+i8m2hW3/c9f1AR+dPvNP7r9+yEApgsJDmYxH3I8fcILO3JeCOyu5UNizGZnkDRtYB2ZYaCcCK3QFuwN7vpZYc64lpoQUZOkkneoy87ul5HRNZWqq6tbXl+/ob6+lguD4De95NKPZ1jJ64zgIhal53o8waJQ/H3Eo+TSqzFztLys/JKx194zGaezk0e4mBP/bMd8uaHhNFKVlcsSif1RFGvR4rhEomLfvl/W1y+KxQpjsYJYrCCK8qMor7r6xd27f8hptbXv19a+HEUZUZRLVjCrquApIg7nOcpC+E0yyLkWsYoCPgkOl4iRIINtzAsdsjiJQL/L4Bhagx7z52WdN/qSiv37/9MjXty+eNKUOwYPqw87qoQTWMAuhgdr9DpGBOV+Q2bmw8XFP8nNPS6ZrE2lalOpusLC8xMNP8rIKNtc/s0br/v1PZNTjKB9edmXbrzu5fVritu2Hd1QP/Tqy+/u2+e2tm0Ht2zZZ0D/nzw4dUGP7gePH3/58OFt87MWh3TH9DoUMZf1QSx/GMewkA8Dg7MDZ1DFOiKQweBG2rj0/mxGFzLoG16z4+23333ppebBMKsxBi9ed9RX7pqam52dm5WVm5W1duvWDdu3d+o06KmnHtq2bTOysrJyc3Px8ccL3nxzTu/evafde++GDRvi8XgsFsvPy9u7bw8n8Cx3pyvsKMoqLLw0I2NPKnUu74MsTmAEv+ZpnuZRjmUIVWRzJOcznWu4l7sYyaHUBF3gV1nHD2jg14xIN33J5lWG0DXNc2UeJUQ0YycLaMaYUOu/x0GMI4+TOYc3eAW8wxy6p3dveVn5JWOvvGfyJ4y6Z/IHl/wdiiJ/7KRmcwxJ7gzF9xO8yyj2lpSWDBs+5OW5DwwdvpnFVFNAMeOIcS338SK3MCq862+4gHGfpTG0J5vTWMssenAVOI6b6TTs0P5/zwo3oQn/ImgqRr+waBLU/504c8wpP7r90nDZSFHBcrqEQucAMmjgA95kZJiQvsZqskMhu4jM4LjUELK5W9OSeSHjfgmpYABZyTbepT3tk8k9qKmZV1U1l46cxHeC7Dq93M3DdOUlDuY3PEGSLIYyirnMZQ6v05u+ZDfehkvGXlNe1j54UjajjB/yzme3tIKfMJto5843d++eG0U5sVg2DanUobt2XVdR8fCBl+7de+fevZO4jAu4raGhWXX1w8nklihKNzXX8zRD+CajuZKPWBiK0RTvsSP4FQwmh7fYHqxAF7OCw8gOpe1y3qEvLT67aW3Ly7qfPHL8XyJo/gVMmnLnpRPP513qyCeL5o2O/pfTxAleaNGiS15eux07vt3QsCkWy46i7CjKqql5f9u2rycSO1KpB5lIM2bzIKsZvX179OGHXyoocPTRd+bkpMfQoig+bNj1ixZljh177rAo9ZtzTxtUUs6GoE/qzzAWUR5qzS6cHbprEUlyOImOVLAp9FY7EaOM9eEsTYVSvjrcBTXn8Uba7QN4g0cqa9PeSe6YMeOh198cO/anF17478OGXTBz5uOLFy+or6/Pzy+cPfulHds3T5s69Zabbrp4/Pgnf/e7ee+/39DQkJOdvXTFCjI5j718n/fTuyg//6ycnP6p1LW8FQYFvTmXd5nDuRwU7ljSx7EdlxHxFF+iF5mh3Gwgm7PpzzOcQfegaVvHqQwMyZ9/YADdAy11Md05jgQ17OIoTgsN+Fp6cBlxHmAh/dL3fuVl5ZeM/U552UC6gEPmz2t98sixH/xn8qbyTZsD1WQA/XiKn/EJx5JTUvpHlkJJackD06deefUgEuSF78JxnMybHEHvRregW/g5DxEPcw9spZBcijmP8xutRQk33DN5z43X/ewf8AdoQhM+FzQVo19YNAnq/36UlJZQyALi7CaLxTwTXAyxgd+QoCiK2vASBUSMYCGZ1NGb5tSynjYcFEautRxMX3ayg9JgQ5jFXtIEsj5kJ5N7Kyqerq3dRD++x3H8kMf5d9byZRbQixTfpQ09OZpxoeHakbNZw0qOoF06F7GsbPP/29IOrfiY29lNJkV04Jc8EV6yjG+yjaOJM6qqqmbLlocTiYrAQzhr//7f7Np1TTK5a9eub1RVfcCtHA5y+HoyeVx19XQyqOL3fIVzw5sP5kZqWEGM14NzVmboeg6jD/OJsZn9HE9LYjTwHp8yggJ2hK1OYw1zSC5bvPzvTArdsnkrFUEJlC7ItrGBPI7kYo7Iysrp2vW27t1/1rr1qK1bx1dWvog9e6bu2PFvHEOMT7mfebTkcj7iIWYVFY3buPHj1167oqZm14FPfPfdm3aUzfjllVfOWrPmR6+/ftuoUZcMKWwkli9mJDuDL1h98MIsYTbrws91Dm1YEZICkOIQMljGvmB7VMdCCoKL7UnM5yEONI+f412OqajZdeP06dfef/9763dPnHhvr15HpFKOOmrcxRdPWrFiRU1N1d69uzt0aH/ffff17NED55933j2//vX69evr6uq2bNtW2qFTuFM6mZ48EEVZ6eoqO/vwgoKxwVkibRrVio6U0IoG5sRiBbzDpjArb0dLWlPDq8R5mU8D/6QFGbSmntejaDsj6Qw+pYHDKU3P3KNodUZGK3oTsZxVgZKrkaVrNgXspIAcCtM1643XTS8v60ezRrG9LcrLDrl03L3PzXjxPzuzMgKZuxXD2cNJ5LCd6savu/KaCS/PnTl0+CesCedAAwWs5DKWhx3bjPG8xUQ+DX99DwWsCpz1P0f2czOeOWD61oQm/IujqRj9wuKQgf0/bgoF/fswbPiQwF1L8BYRo6njMXbwNs/Rk37kRNGJUdSWLVRTzLEhU7uWjrSikGJQQw372EsrDg5ZTRE1VPr/2LvvOKvqc2vg31OmD71NAekdpIvYQESwa4i9xRJ71CRqTNQkxlhiLIkSMWrsWGKLXUFU7CLSpCnSZQq9DNNPef84+fGOmuR6b+57Te7L+uyPH5mz55zf2Wef2Ws/z7PWEmE8RcTITSY3JRL57MePgq6iN9dRw4W0ogedOS2TzEQ3RgWF8oekaUZnCigMBG5muM5BaWkx/UhxXRg3bE0fXuZqnuTXlDIsGDE2cGAi0X3duowYopH2nFhfX7F+/Qn19T24gjbBoL6WOiZwVSqFKq5jWHA+T5DMzKTSi2oGMzIwqqxA/buEUlaMA8gLVLWaOsZQEGYhXg/O4QtYQAdirdq0Liop+iZ8dN26jbRkP1aACLmMpZaf8Db7NDT8eOHCnzY0VJSUnN2t27Xbtv1u06afV1U9EY0eG4l0D6vNjLdmBjRPpn9OTs8WLY7s0uWhxsYuL798fEXFBzt2rH355eNL89f+6eKLh3Tv/uAll3Ts2PG4xx4b0KHDeSN7sSG8kQh5DORxVgVfp9OCVG5WOKmiHE6C99gWSqED6MKywGLfDxmVCWK04Uji3MnSEGK0H3mFhfmfbtq0YnPdd77zs5YtS5LJxmSyMZFo6NRp4JFH/nTr1tpo1DFHH41EItHY2NjY2Ni3T5/DDj1069btdQ2NdXWZk7yBGkqj0bbJ5I6amufT6eqGhoU7diziNrrwYjjOO4JS8Ll4vFl+/p9yco7gifDutoUbgxdowV38kpm8Gd57LmleicWqIpEs8qjjGTZTSHPq+JDaVq2OTiQ2ks17rOMWJrGRu9gUzoJKbqc5h7M/n5eUbiwpbcNyVpPTJLY3l80s/scGt+dddPZ5Fw5gIULdN9MEWDV8ZOOrM577yv4lpSX3TZl05MTckGu/kVYcTT+u4nHW05zWnEJ7LuZZzgyDJVUcxGP8OvDsDB5lCr1Ld7k77cK/CXaR0V3YBSgpbUFrOrI7pdQFQ/s/s5C92C1DGdPp1ZHI/pHIaL7gcwrpFFrzNRRQT5otLCKfNDPZGBqOKTYwm0IaySfJQj5Op1twzJdFtSjkEvZhC4MZR5rPWcAy8silC9t5gS2hOptiI+9TWL52y5efsJEedOHuoHTJoz/reZ696BN4YeZqmmB3jiLKiiBCmpBO7+DxEIiaseDJLGYFvws5N3eynaxQ94pRz+3MI0q3IMeZRQOLqSBKS3JoS4IGVrKEOINC2W89ubTkPd5lNbtRsJN2fxM+2qFDW2p5gQEU0ZJ2vEB7DuQD7uDahoa/Njpzc7tEowWp1PZIJFN+q02nt7Gd07/8xGPq6/dcufKkHTvea9fuolatznv77Uvfe+vcI4f3+PUpp+Tl5NQ2NFTV1p536KEXHHHE1TNmPDd//hU9m/drtoAPWcNpjOUwZtKBjA1CX84lxdQwVJoX8qg+aFJb7chQNrKVPegKUk3SU0cyjKfIZ2wY3k3m5uSkUp3uvPP0jz56OhbLisWy4vHst966/4EHLs7JadW2bfcLfvCDJ598Mh6PZ2VlZWVl3XLrrXfdfU+LFh22bq1etepAFmcEWFlZq1u1uqNNm4fj8X7bt/+ptjbCtbTmAs7jDT6kkZY8npW1V17erZFIq+zsE/Pz74hGV/EC9RTwIHvzm5DYdB/NmEIdzXg8K6uooODYdLqWHJ6iMDhe1fMBrXNyukYimXb5x7Tl9/Ske5AD3sF8PuZu+jIm8zeAI8vLmhFhdxbwMjXh0H3CdDqN2GPwPz6vzrvo7FdnTC4pXc6mEAe67LwL97xvyl1/c/87b797xus7unX7Pk9RHaIK9glhAVeFnyTYlxN5hBQD6cBy2nI8tVwcJnTvYCpHl5RGd7k77cK/C3aR0f+1OPDgA1575fVvexX/NhgxMqNb6skgBEnyHhTSj1ak2EZ5Ov0GleRRwHLmkEuSEhaGlM5KVtI1lGoGhRZq5qHP6B/SIFO8zza+Ty438MGXl7aaH7KBKu5jGhHahOvlH0LjdV+KeD5DL6hkNj3pVV62sw6UGUjIdLfbM4zNrAly7DZkhUnZLOZRyxusIUpbYizkzSCBx2Du/2sg+V/xNDfQnVyKifEL5oVHP+enbGREIFXbmUqUn3IYH/ApmgiYPmVRMKEUQgfW0oP29GAL3YIOfaem+6989D+ipF0o5vXQWn2dwewBhobqcjNs3PiXJUtOy8+fUFR0W7NmRanU06nUVLawhad4iWXhOV/l4cbG3cvLH92y5bFEYj2at26xYPXqhkQioxNqVVjYqrBwzvLlOZFIPDf3mYqKIc2b04MTyWMrszmOUU2W2oKT6ceScHBSDGG/IPNqCLsV05Yi0mxkGZtDezdG1/DfzPGfv317YtPmzZFIVknJsVOn3v3AAxc3NNQ89dSv3nvvz0OHfq++viorK3fcuBMfnvLYeRdcsHnLlnPPP3/662+NHn1MRcWOxsZLGMk1ZOXmJlu1uisW65hMrotG23IqFzRZ/zgmhQr6gpycM3JzL9n5WCw2uKDg4aysXiE84ky+HyJhMzd4v+AYZlCZmzsqL28s0XQ6xlT6sC+15PMWxXSMx9ulUlUUMJJLQRVV7OAEruIdpjKO/qG3UE+SPcvLMuPUI0jzDKv4gHn0aULr/xFKSkvue+R3w0cm2VFSWnrehXtnjKK+jvKy8j/+4d5oNL9ZsxF9+/6xsDCX5qFX0I5TqKMs/GGJUUyK7ZTRnKJwG3wAI/g9P2YeR5Ef4mR3YRf+DRAP5/0u/C9Exvp+l7L+m6CktH2o4WVRxGLKgnSmijTlLGBf2qVSz0QiY6jjMN5lJfWUkMdnwaV8QMjFbqA9ezKfJBWMIjdkwLxFNw4CDZHIQen0HZSFOcuX+DP9GMgSjuEVlnE0dRzNG9xMP+rYhw68QYxP2ZPmRMja+TU/76KzysvKn3tmAZ2CcKSRT+kcfJQS7GBekGa35k22MIws+lLGM4whRj578T6fcRFPMJu9aBVm+Eaygj+EcJ1n6UXfTPwpVbzGPuHN7k0pDzEzrPktGhjP1qAWX0o5rfiCTuF2Ok1jSWns4MOOGjJs951vtqikAyrLK4pKiv7WZ57ZrYgC5pPHYRQ2GRTejQ58vHbtpK1b327b9srCwoPRuvUFOTm9Nm68Pp3uSgsOAdP4iFQY+OvJ3ps2vZWd/fqtt07u06f/739/47E33PDrU0/do1ev8s2bL7nnnuK8vHuPOaamoeH0J1/5tGxfugRN0huhQPh1ZNZWwRxGUM1KJjKLufSleRPT+7V8wmG052k2skdQhsWoYR7tOHbbtrlZWXN32+3Mzp3Prqh47qabjoxEsoYMOSkrKz+VaozHs9q2LTnssLNmzZp2zDHHtGhZ3LVr/zfeWMKVmbSCSGRaQcEReXkHp9M7UFv7XE3N25wfPuWdOrNO9GQ1yUik+dfeWlYIR81UdvO/tkMlzbOzu2Rn96O+oWEhdexFl6CjL2MondiYSGysrv6wb98Dlyx5kQEhk2kn3g/k9X3GhqGaDLaHTyFCbzYwgywGks3WEKX9H6CktPi+KX/MuNOfd9FZf/NXMo926jR469a5n356/G67/bx79z+sXXvmpk3PMo5mYfB6L1ZQxgHUkM2pdOEptjGT0TzDEA7lFU4nwdqSji12Xd934d8F8ch/vM8u/Lti0JCBn8xdMP7gA77thfwboLRjCT2Zxkiy2Y3tvEIvtrKY9RxLD9AmnX6OTJdwDPP5LPQQB7CAIaF5upVEuLgO4d0wjhllLQ3sxvhAMuKRSJ9IpHUq9Wywsn+PcXQLF5V8TuQl7g7Nu7HMZg7tQBd6sylMjv5V4lNRVlFS+tfpsWtv/OWIkS9edflkehKhIxv5jM6kqOcdOtCFFSQYziK2BD+Bwaxmasg+bcGeLOJycjiAONFwHUU3mvNyiAbI1INjZPMyxwbxk7D+n/EI80jTgmFh/wizGMXWUKj+nI4Ze6yS0uSku24oKv4bpLO4pKiivLL4a3y0qLgkk0tOM9qR5HX2C0cSm3mDVjt2LC8tfSwrqzSdTkciEeTkDMjLG1VTU8iIsPN4FjCNc2kWEoBGNTQU33jjXZdeetall175XM/eP7rjd+cecsiD06cf3qfPxfvsg4ZksrYxxUscw24gSi53c3iTfCA8wXoupQWP8hdKOZgoE5jDR/QiRR7LQtO/N7iIZ3k5DOmmmMmQ4B+0V2NjyapVj7ZtO7Sk5Jjly28ZMeKEnJxm5eXztm+vWLduTX5+YZs2JcOHj3vyyYV9S7rNnbuRc/mrUCkafbumpjErq3dW1iBEIpnbucv5frgJQYLrI5HPadms2ciqqhsTiY/z8n4RHm2sqbkylVociRSl0915mZn8MkTMN/JzPo1EukejhZFIdm3tWw0NZcToTiMfUsbuZLrSaxsbvzj88Gt79dq/uPipN964ipM4CdRwLcsoDgGzz7NnSD1YxjvksI5WZNOOL4KPUk1JaWPGgvQb4vy/WxCtePbpF+6cVE80L2/53nt///PPZ3z++dkdOpzavHlq3Lixb789vaKiLz1pIDsra2PnzkOXLXuQ9lwUkgKOoxtv0IMf8WeqKQh3RHMry7t+PHP2iJHD/uYaduHbRTqdnvLA40cf/53PP1v2zBP/d5i4uLT4nAvOqK6uefKxZ8rWVnQoanfYkQcXFXf4Fpf6P4Ndbfpd2AUoKS2mgWHMZjXV7MlgFrKVON+nR2jnNedkBvESjcG8fQ7rgsAiSSNL2USEOSxlC5Egzp3NVo6hjIcC32pFNa2j0TMikYwvz3FhIDUS6qxRjqAblWGCcxiteIM3mE8nzqaeVVTx/tfFtkdOPOy+Kb8OCdpJSukW+vVv0itUm2JB3rsH1dTSSJLdGEuEjdRST3+SDAvalC2sZkPwG2pLD1rRIXQbP6YZPYKFTUOT1WXRjGgYJBBsB4Q41ihpVpGf8fkfMbLVk88/9DeZaAYZPlrx5ZZ9cUm7WGwwZcHvM5sOTOUz8Cmv0oH8VEpFxZm1tbMyTDSRqKiouKGmpjsDgmYrs/XiNF6lrIn25f1162ouu+xXDzxw96GHHnXWWRf8adq0EaWl3xs2rCGRqE8kWuflEaOA+5gZVteZ/rzM02ATtxHnpyFHoCv9Gdfkb/hQDqWMRmqp4vzARIXbmL2ZToyZHNDEyRJdksmT161buX37AtLRaGzFihkbNsxu27ZtYax2+vTHV6xY2NjYgLq6ajZyKYszJ0k0mp+V1XXLlvNrah5DMllJdw7nYa6gmi84IxIpj8dPZkc0Wtiq1Zl8Ul19fDK5OJVavWPH0anU6ljse2wjh5PJ4jReYzXHRSJfRKOnsiUSKdix4/GGhrUcGCZSppIxVMqmkXfy8raceOLdvXrtjyFDjj755HvbtZvJD1nJ96lkTPD97UJ/PuYF5vMGxfQqKa1hZZj6aCSLLSWlm+9/5PZ/ntuVl1VMvv3uOyc153iOra294t13X27VqvOwYcfv2P6XvLz83Ny8CRMOHTp0MzPIi0Zf69VrTH39DrpwTmCimVNuIN9jGps4n91D134W+1Vt73nO6deWNzHT2IV/HUy+7e6/PPVC9Y4dK1esHj5y6I8uvzCznXrGiY2NjVf95Fc9enU/67zTho0Ycv2vbtqwfuO3vd7/59hFRv83Y/fBAz6Zt/DbXsW/B0o7llBHa/ZkO9U00pkx1AULGE0cYapZRx0vs4Uow6gInuT1LCbGULLpxyYyPj51fEQb2rOAY2nGHXxBVSr1eEjC7EM2zYlRxVOkeSq4wBSTxZssAnn0ZAN9GUWM79CZj9mNZmVrv2o3OGLksKkzHh0xcnConjZnABEG0aaJZ1Bj4Na9KGQxXxChIHOFZk5QQcWC3qiCd9iDg5gdBkbzgzf7Zt6kLWeTw7UsDz6UaOBO5tCduqDBn80yStmX5lRRTo+Mv0FJafHvJ9/0H36+xSVFGUr65R/nxeOnRiJbw5vtyVDm8iaz6U83RKM5WVl7rlv3423bpmDLlruSyUW8GYREuWHL4jXWMBtsYTJtOY6+jz76/CmnfPfZJ6b87owz8lu1Ov7RRxdUVubE45trM3Y/nejFNJ4gQYTWDGcVk7iT4ZwbmtcPU93ExD4dtlIOoYYE36Vlk6zzjGPlXuxLTuCyybAlQpJktw0b3sOqVe/t2LHixBNPqaqq2r1XryNG7zd3zvSFC9/PySlZt241PenJrbzARrJzc/crKDiuuvrerVsvTKeryaKUk9nMmVwai3XMypoYicTT6YZIJCcabday5Uk5OR1qas6qqTk7EimJxSYSSafrg0/nOMZxA+dGIqWRyHeIptO1jY0Lk8mWfI8aCnmeHA4KjqRv9e8/4tRTH2jVqmNDQ3VDQ01jY23r1l1OOOGuMWMOikR+TMvQsq8Pc8/NGEaSj+hBByKlHYumzri3pLSSzZmuxXkXjpk647md7YX/MsrLKk4/6fLnntmHnQ2rAXV1v503r7a8fMEePbv2aJ772GN3ff75IowdorhN/gkH7LV48dNffDGfreGuTJOzri0byZhdTOBHrGIc26uqpnbsVPLPr3kX/tvx4L2PNG/RfNiIIZl/5uXltWjRPLPl5eW+9ca7o8fuu89+o9p3aDdk2KBTTjvhxede+XYX/D+AXWT0fzM6FLWfv8tq9JuhpLSYLawhjy5s4Tk2h8v/Wu5tciWYxT2hH7pf8KVPMpJGcllOR/qG+uIGvsswDmYBg9hGa3J4lsGM4HFW0j2VeiSdXhSJ5Ickp2U8RVGwLXyNWeRSx3dYzTQaSXFmEFBnsA/HZdb8N6sjmbG28y4cSxnRcG2OZCKISko3nnfh4VNn3FVSupbakOtYQlXIScqomloxk/JARufzOccF4+4z2cZbQde1kbcZyUSyOJzR3E5GabeKn7ORMcF2oJG3WM/AYO3UgxYU0ZoEZU1GPP9j7OSjlRWV9939UCq1KJ1eGYudEolk7jRStGQfKtmDdkSpSafT8fiQvLwTtm59oKLirOrqTGO0lkmh9Iv1/C7EyS7iQX7H0JCEuR8HbtoUiSgsbt3658cdd/r48Rc9//yj8+YtrKgIWvgW7E4ZS5rYXQ0MTLFdk/exjXeZHv4ZYTaf8BpP0p8e3M7MYGIQD0rzu1nOUSS5g7UhWzWzz3u8QD/Gbd5cOXbsuJycnEQimRWP9+zc+YyjjkrUrG9oqMjPz+zcnTFM5Q+RSA7i8U7Nmp2dSlXV17/bZFRxHC1jsV6x2AHpdCKVWkZjOt2QTjem03X5+SPz80fSNho9gGQ6vTR8yg1UU8oBkUheJHIA6XR6CesSia4cEEzsq+nIXsRIM3f33fdbterD1167MRbLzs4uyM7Oz8rKy8rKnTXrkXfeuScSyRhgpVl83oVHjxjZgc3hG9qSHFpQW1K6bfgeQ0tKi6fOeHLEyDxi5124799ruP9jfP17N2HMMeVlB9In9Fjqwql+ckVF8tMvNo0fMuTsCePff/+NfbuVLFmzvWLTAYtXrSpt35PWJLmej5s830ZuoJoW4FNuJkprtvfte8X2bfH/0Kh/F/7nMfbA0aecfkLm/yMR7779wcP3P/bUn59d/vkKrFq5unefnjt37t2v14plK7+dhf4PYhcZ/d+MQUMG7gph+uYoKS1mBZ+SS0MIWNpAgj2Jcw8reJnpdKGUbHrzffLYQYT+xNiNUmr4nO58l9agG8ewmq60oz2bmcNCGkK59PB0elo6XUY9S3mT0SGdqJ6D+JQ5NNCSo4myIdNQ/tp7qmJzU43513H+RWffN+VXwZ8yM0WwqaR0w/2P3Hz+RWeXlBbf/8itI0amqQzWVKVU8j7ZJOlKX5YEx6UkZ7LzL2kbzqSEuTQyj+PZp8nr78GpTOdWfksxewSFTYKpFLInsTCWkBN4bYwVlJP3n/qUi0uKPpm38MJzbiwvOzudHpFMPp1KzY1Ge0WjEeYFEVsqOJsuYmAkkk1tJNImHu9TX58diXQnzR6UcD8fhpuT1uxOKhYbwUZOCZmcGfTihPXbWh/72zt31NYeOnz45HPOeWvt2hvffZfG4LQQpytJ3g9RTJlh2cE8wf3hqaKMZhOPsZqP6cfP2IdWDGEIh/Em94VPfzW30owjKGQcg3mYD8NzPsfHHJCxKWhsHPfss3P//OfHmhUWfLJ06cYtW5oVFIwaNCg7O7t58+aB/LViX7Ykk5WNjctSqapIJCsvb3QkgoeYTVaYWmmGVGphIvECV27d+kp19euRSFYkkpdK1WTEaqnU/GTyFX7Ecl4MyVhbySOVTs9Op9+mGd2IMS9MNvcmwSLqDjzw5O985+fnnfdQTk72XXcdtXbtvMwbmzbthg8/fLhdu8NTqUbSJaXl5114wPkXnX3flFvOu3Bf1oDMMupKSrff/8itO6nnfVP+eO2NV/zXmOjk2++eMObXk2+/e+dPyssqKOYhfspWcoK71hrOo3vFlt/94M65L3700XXf//5tT82v2PQDDp/7+XFl67eSzzAG8xhTSDGXm2hFL3oxndvZnSxW81m7dqP797/6yste+MfeqLvwP49Ou3Xc+f/7H7Df4Ucd0n9gv5KSogfufWTqy9MbGhqzsrN27pCTnZ1KfXXU6n8fdpHR/+XYFQr6zVHasXVITFlKgo6MYE7wqN+dLjzOYgbQOtjCv8b9FLAhNM2j1JBmCYPYj494JtT/WnEEa/mUJUxgEPkMZwI19OLUdHo5jcxlIl3Cdb2e1hwaBL81IUWwJTPD7OlOvMqrHMgJV13+XNOL4lcwYuSwqTOmlJRuz/iAnnfh6Kkz/rKzu5cpoB45sXvGfKOkdMWDj03qtFtesMJJ0Tr44CT5bhCkN+3/jqIzCcY1yVLfuUNHerOCUQwM4qeMfUGfoFCJshvVfBj+as2jmr5/J37mS2iaETrlgcfOO/Oh8rIf0IvDuTyVmpNOr02no1lZEyORNYGdNPA5N/OTROKqmpqPGhqmNzaWcmU63SU8WR/2Yjov0ZdeGeaXTM4ij5ZfW0h+xkWoMC+vMDf3xdmz127ZMqxfP7L4LPjep9G69QSWszSIjaIczAp+FcYkchhFM95kXLAjOIaLeZVyOnIMKW7ibf7IoFCmzWAQR/IRU3iICiawUycRY9S6dR1Li4uLOnX689Spy7/4ojGRiMVigwYNjsdnsIZa1nB0MnlUTc0LDQ3zkE43EG/f/qR4/HNeCeMuuYnEa8nkkkjkjkjkkEjkobq6Nlu2PJBIrE2lqiORFqnUtFTqc25kNL9hGI+yhHry0+k30ul5nEgV2UxlVpC3ZzGXpV26DN1rrxNRUND62GOv32efE//85wtmzXrk8cfPW7z4rdLSk1OpenJKSldde+N5O8nl+Redfd+Uq1iUySorKd08dcbTX+lrHznxsP/wBPsKwlRoJSfdOWnbGSef1+TBZnyPCGcHJ/+P+BET+SnF3LRqXccr7lnAVcFnrU063TzcanbkAFZwDQ+GXINaPuEvjKBVxhosN3f3+vr1s2ad1tCwclen/l8ZzZo3Gzp80NDhg/bad8+rr7ti6suvd+jQrrJi3c4dysoqdgmYduHfHoOGDNzVqf+GKCntQDSo6VFLW8aQy2qq6E4zSoKx6JagQx9OPu3J5sPgZr+CRqbyItXsQz7P8ikPUhfilzIX1yFhhmwTVeQykTRHkOnXbwkTY5tpZDQxHmcZESLsQxV/pIwaprCCUxgADrxz0sozTj7X32/Z3//IpCMnTjjvwjF/sw507Y2/vPbG08+78NCHHv/Tow890a9/3zPPOZpyyoJ7VDa13MnK0PzN9H8XclfmYs80HkOTHTJLXRJylTL+Te9REdrxGcHTWlpxGEVsZiN59CZaXrbu66ttisqKyofue/SYI87+bMnSKQ88eeekRs4nHtwl+3BDKpVLYySSk5V1QizWJrDDX+w0/UmnGxKJ0XwPHEUiWJrn045+1BAhI3xJkeAPrGqykHVMYhvZm6qqvj9pUsWOHX+6+uofnnRSExehpVSWlJzVpcsvdtvtcjYyJ9gy5DKW5vyG6nCqZHHTl+0IhnItGyknhwPpzCuMYRCpL28dOJBNbGYwOU3uHzK94x6LPk2uLS+/8Jxznn3zzbL16wsLCx9//LFDDz191KgOfMhRHMJYfltfv6G6+sl0uj4azc3OLi4q+n5+fj5PUM/GVConErmHwaBVJHJ9Mnn81q2Pp9MN6XRtKpXDTU3kVmfwY96jPp1OpNNbOTVcrd6jLMyf5DKNMoZ37jwonf6/NkZ77XXSOefc99FHD69fX96p05nRaF4qVVNS2u7+R274igJpxMhhU2c8PGJkx/MuPG7qjOf/8bn0TVBeVnH6SefeOak+fKP3mjVz7IQxP5g1c3bZ2vIwej6eA/gd13A1P+aM8ASvsBvnIkw73M2K8EcpSRYjiTCUvqCSyuA0nOn+j2to2PjRR6cUFraPROKlHUv++fe1C/+PsPzzFTuv0Z8uXtqmTavRY/d97ukXq6trkGhMPPLgnw886IB/+Bz/GxD/thewC/9v0aGo/SfzFu5yd/omGDFy2HPPPEoxA9jCO/QPwUs7mMVg8kLA9Logo1lLZeBVOxjBTPJonbE8pJRS0J3mfEAeQyimkdlkhx1aUMUUDgsmmrW0DI4zmTnFdxlIV7IYxVshZT6joFrKfeTQk4lBSpUZSew/a2b5hDFnrKuM/+r6I75e7ykpLb72xl/+g+Nz5MTD1lWuv+n633ft3mXchP1xyOHj586ef+0v76UnUXIo5XEOCIbtr/MBfWnGGsYxizv5LsXM5xXasQ8zgwfWzJBgvoQUVayhd5PWPwroFB5t/GzJ0t59e/3NNVdWVF54zi/Ky/bgsDNOvqmktJZy0owPu1RzK6l0eu+Ghjvi8YNisb2SyY/oyg+5kJHcwKkZMRNox8XczjLacDrZvM37xCORa9Lp2xjBQqYwjj35mNcopivzTrz55gNGjfrJaaehYuPGIAjrEY0u79z50latxqJt2yPy83uvXn1dbe3yYCAQYSD1bGUB2zmN0p0GXgG5jOYeRrKAWg5nBss46Mt/8+fxIUOIMp1BX54rqOU9qtu12WPc6NED+/W7adKk+vrED394Wzqdfu651/hVsFLCbtyYSDyQTD4Tj2fmF7VqNSE3d+mWLVOTye6RyMVNY2kRiZzMgMbGn9Cen4aG/k7l3F6041pKQzbvZmLU8d0gBKwliwPYsGHDqozXwV/f2LwXX3rplkTieDZv3fphLFaQk7v4/kfu+ps1wpLS4vum3Pk3z5//LMrLKk4/6abysokUh7xftCwvO+qMk186cmI2haHU3YOuPEwPdgsqwBxeYSmL+AGtQJR9eZciBgVWWkMBCeZRSXuas50F9CeSTm+ORvNKS/dZvvz5XZXRf00UFOZnZWW1bd/2L0+9cP/dD0eikVatWl54yXmtWrU86XvHXX3FdclkCocddVCffr02rN94+613/vo3P/8HT/h0zxH/5JK++/msf/IZ/svY5TP6vxxFRe3XVa7f9Sl/Exw18TBcdfntZDqnPfiUanLJp5CZ9GQLy6miP1FacQm3h4JlqxBTWUULRpEXuucRWjKGt3ifA2hHcxLcy1H0oJEB/Jlxoda4lIXsGVJAD+RttoVe9hHMCBfmbLqSz6fkhQthTpO3uKG87NNYbNAvr3j645mz/zH1/Doeuv+xaa+8fszx3+nTr9dO287iw4qKi4suOPsqmpGkYwjCWUmclYzI6EJCbtNeLORP7M27DAi0O0qCN9md3qwJkapLODIUm2cEx/tUiBcqY8gZJ//q2hvPHjtu9FcWPOWBxyZPms4RQd5xUnnZdFI8wmdcyFJuYRjng86JxB9jscxYSw9KuIuP2M4vOL9JDXI5axnG/uEn+1HM8+n0zpGAAXTgbZZQRt+MIiqVamzRvPlh++3XmEigsTFDJatyc1Ndu96Vl9cDFRX3FhYObdZsSN++D61Z89uNG59jI31ZRT/244F4vCCRyDgPXPplnnc/f2FoJr6Sg4hyDG8zhQlkqMk7fMZ+wcuzNTOpYB9y2cBbFNA1Ho8X5Of/6eGHK774olXz5nfccVlDA06h3Zd5cJpR6fTCZHLDtm3vtGixbyQSz8/vt2XLdKan0/MjkWvo9H/3Tj/GHyhiA6dzKcOavJFneCATp0SKlbxFNmNJsoYyeocoqfrFiz9+/vkbjjjiZ3j77fvffPNP/CQTprp164slpY9M+++oen4Fk2+/j0TTTsJzT79QXvYu8WBIvBNbeOe5Z7qykrXsH0aTd8RirZLJCziPE0EWx/I2l3E2e1BDNzowI3xBisNM7cfswXbasCFMD7diXSwWy83tsGXLZ1VVa3a5jf5r4keXXpD5n8t+dvFXHhoydPchQ3dv+pN27dpc/OPz/vGl/J/vdH+LVGFXm/6/H+sq11960RX/Is3x8QcfMG1XKOg3xoiRw2jF3GDqOYqNpGighL4sD5r6wcFLsjnTiXBwqGS04RAaWRsSU7LDfFsWn9NIG15gGYW0ZwBPBflzf8YzI4wHLGMCReTQhw2RSBaLgj66JUeRxTusCSnwzVnCI6GIm8GrvEX3ZHJeMtnz2WdqTj/53G94WNZVrs8w0auvu6IpE81gyLBBT794z7ARxUHYXsgQNlDGPiEFKhJa8GkGMIp3wyxpZugzxhL2CVfxjHAnI1SawwaeZHPw/0+yli2Mpgf7XHX5E7+97tadS6qoqJzywGOTJ83nlMBEMxjHKFqwhB/yK44MTBQj+U0yWR8sBYo5hlXE2JPf8wh4jvs4hFFUh8jKWjpyJs+yLsiGWnIQ6xlGG5Jsb5WTc2jr1mf96lcvvv12Vjy+W3Fxhzap7Owt+fk9cnI6NTRUVFTcm043rl//eEXFvcjKahuLZbOZ1xnBEbTkFKL5+WdGo8s5r0kY6Y28wsTge7rTiDSbcQzhOT7hFcqYEJgo2nEIhbzAEl6jNV1I19TUfOfUU5cuXty/U6eCvLy9hgymiClcHzw4s8Lw9M8pTqWKq6pWrl//WGPjRqTTScYRSadPSaenZV4snb6NyRzMdvrSj1/xeFjM3TzEflSTwxxeYSRxUizkXVrShhjLs7OLmzd/5JNPVt9558kvvHDjm28+xe8yTBQcVl52/fgxl//36son33735EmzJ0/6rOn3qLysgoOZx29YG368ghsZxgVcTSFTwuRPPCtrdHb28ZHIw5zPBrYSY3/25A6mhFvZAg6lBzPD138u26kJR2km+1JPeSy2pKTke1lZ1WvWvLH33r+9/ldvXnX5r/4b3/su/M8jEom0a9/2H+8T/ae3bxGRhZ9/9K0u4H8V1lWun/rK69NeeaOoqH2H4vZNb3cyl/N1FetRWbl+/MFji4o6jD947P/Aqk4+9qxbbr9uVyjoN8SAnhMZxlTa0IcIn7GVLuSyg+UMCm3T8tCsH/7lp0nzEdl8yiAyTeR6ZlJPjAFsYAkdaUU3NvFhmBbNSKam0iKoy6NsoZJD+ZQX2YulDKKYd+jOO7SimE8ZzVy2ciTNeSJIo3LYwRFgdUnp3Psfubn073fxbrrhtkGDBz50/2Oj9h6Rac1/PcpoJ+67++E/3TWVzmAVSQbTyFZWsJ0choSK2quhaFfLPNqwhYG0Dgcqw+nrmMZyWgW7761UBdVU07rvFyNGJm+b/BvMnT3/grN/zMFNEpJ24lNeIGPrs4Nzvyzr2cj1tGApo9kCNnEAW5lOS9aSRxuO+1po58vMZV/eZDhdwNMMo4BKll85ZMAhnTp9sG7d9fPm9enbt23Llksru+6228Fz5964ffuGvLwuLVrs06bNoaiouG/LltcbGsqKi4eXla3mpGDd9RKfxeN5OTkT0NDwZmPjbM7nCRo5hBgfMSwjYw/1jsx/1wePgtF/a0wrzTyWhNws1MXjy/oUFx+4++7vffZZQ3b2iIED7/nzxwzhQ7byYwbyAC8zjm1UMYE3IpGFLVuO37LlVU4in+W8xUTWM5OxtOBJDqIFm3iHjuSxhL0p5DWG8jHjQ5m8iKXsx1vsG41uz84elJt7WsYIYseOKxOJ2fw8ODakm/x3NTfcP+WSf75GWFZW8dzTL06etCrMoiwrKZ193Y0/HDFy2OknnztrZmaEZg5LOZoUz3AME5o8x+s8xshIZGlOzpmZRTY2vpxMrqCIA4PtazVvUsCQYL+a5AV2ZxEH8DmLiBDlQNrzWjxeV1JyajJZk5v78X77Hf/KKw/37n1uQ8O2ynWP/OKaC5u+/bKyin/w3d+Ffzs833OPf/IZjvj2COGuyuh/G6a98sZN19+GKU/c85UZzXWV6y+56MoORe1vvv26m2+/bsoT90w4+IDKynUnH3vW/LkLm+520w23XXrRlZdedOVD9z/20P2P/Xetremr7MI/RklpCwr4LpV8ToS2JFnAZnJCa7KBpWylORt4ldomupxPgg/RMBYxk3W8QjMOpyWNtGMYG6iijkL2pYpXqAqDAZn5sERoU0appyuns5xCprKUZqQ4LLTyMyscEiY4HyIeps2iYSUNFJeXjTn9pN/+g4pRh6L2N91wW1FR+3ET9s/4xv+DQ3fG2afccfdlLKGBnKCSWUsVe4OefMhyYuEYruNd+nEW51LJMqaHgnEe7wc7zHZEqGYz9bT9MhNFwayZn/z2uknhn914jWe+vM90nqBvKNYO4I88GB6dzyX04VK+yxu0ZS/qqSafw1nPgRSR4HaWh99t4BHWcAETOJmFzG3y0ivow2U3Ltgwo6Kif+vW148YMWfhovIdo/v2/X5BQenQoT+Lx3M6dDgxw0RRXHxGaen5ublFdXVb6c48KvgL2/kiEskcw0R29n45OYdwJ7kcSyF5JFke6h2RwEQX8yzZJEIFtylSvM3qME8SYRtL9+jWbf/+/ZOp1Nbq6lg0mk6nQwF+H7pwDdfyOkdRGj56jE2nD9myZTrCK3blWGYwl6NoRZpEiBVtxVHUsZwJtAgxZsv5Li3C9PMaxpBPIhqtys4elJt7JrFUas22bccmEo18n5v5WXjdbHJ4mbMpLPmnpTxlZRWnn3T+5EmbAxNFj/KyI08/efLk2+8Jlq6CxewrTOdH7NckrKueffg12yKRFjSk00ka4/H94/GBbOGDkKnbjCzy+JBl5JBPDt2CRdfuHEGEo+hITTSaysoaunnz65WVj9fWtv3ii8VnnHH1qlV/jMez+vS++rqrX3/h2WmZdzH59nuOmHDD5Nvv+ScPyC786+DfujK6i4z+N2Bd5foMfbzsiotPDU620155Y+cOlRXr11Wu3/kQOhS1P/X0Ey772cU33XDbzic5+dizdhLWCQcfMGjwwMzTfuW1pr3yxk033JZhq9+EZQ4aMuC/4U3+f4P7H7meqZTTPJiAZjyV+rKSDUE8sYQ89iaLLjTjRcpp4E0+p5R6WjGKzbzH3uxBBZtZECQIRezgLaqD0jaf51kTIs6xiNkMI0UODbwYrmp7M5MN1JPN6BAfWkOC3YLvaVfSxNjINrrxKLXUlpfNnTzpga8fh9Caf+POe383cHD/zZu2fJOjN2TYoKdfvHPYiGhIJyojzga2EaE9e7GcT0ANszkiVGqbczqtKaAV9dzPp8G/Kc1mKhnBAYGdJ8Mrf8Yb7JHpjxeVFJFiP9YymXWk+DMfhyneytCLH8O7XM4TXM/RnMRG5nJcUH8neILVQW+eqbQNpxcP8x7l3EYBF4WJzAFcFKZgkQzBP9d3796xd4sW1Y2NVy8qH7XvHzt1Go8lS+6dPXtK166/yc3tmkzuSCS2JBJbE4ltBQUDuna9NRbrz2i68UcKOYSLEon1jY0ziafTO5LJ1ZxNUQh/+oBa5jC9if/8TN6mPwk60InXWRIe3cZzbKdHODLr9hpQ0KZ5YbO8vKra2kfffbe0TZvWsdhjL7wQ7iXS9GE8CzmO1oG/RsNkSyknEOXZkFJWSA6diLOVl8ELrA0Xo5wQBruFN0kwlly2sSz0r7Myor10ekk8PgiJxIfbt5+RTg/jTAZyFQ1MDOlfd3ErB7H9ny8EXnX59eVlQ+n7ZXuyOIdMnvTWrJnz+Dw4rxVTSkvuYlmTsK4ccvgLO1Kp/nV1k1OpJWRHIvmp1LqCgqHx+GaeJTO7vINSOvIxb1JLlCdD2kJG0RWnGeW8lZXVtWXLa2KxA3Nymg0ZcnVlZdvf/Oa4RKK2Q4e9Gxp2rFkz7dlnXiwrq7jz9nsefbiodetbHn4g+s3HdXbhXxy7yOj/73jo/scqK9fjputvy9DEysp1mvDRDB38ut/noCEDBg0ZkOGj8+cuHDR4wE7C2qGo/aAhA26+/boM0838cP7chZdcdGVl5brxBx0waPDAQYMHzp+34Cvl1a8js9t/5xv+X43S0uL7p1xbUvoZGE6cOSRpyeAgXf+cHgwMnju1DKYHb/AsNQyhkArWkyKXXrzDByxnLMXMyUQpkqKYt/mCGN0YwHTyqWcGa9mL5lSzjHvIZ2yYZD2QbSykLAwApFnNypBRmWFsGdlHe0Yyl8OYxhSKy9Z+pUL211r+usr1k/90azKZ/M7Rh/cf2PebHL2KinWvT31z9qxqGqjPhOhwFJ8GiVKbkLCazRecTT+qw1bDaA6igo9JMCRU9TbQwDi60JYJ5PIKC5nNIsaxW5O1pIIZZwF/4vdUMprCQLa2N8nQyuYFLiYzOfMuy8MiWxJjGO+H7PjGwPC6sg9v8SAHcHiIBcpMkeZxGnuTm5nKiMdf3mef4xKJhj99uvy0Dz8bOPyGFi16ptPJdDpZU1O+ceOz27Z9EIsVxmKF8XireLxlPN4iHm+xcePT69e/wmL248esZAWt0+kLGxrW19U9XVs7NZHIdIGvoCePsoLBwRj/cdYznQUMpkWY+ujIIBbyOsuYRnP6kSTSPG8z5VmxWDKVyo7HH33vvYOHDr32xBOvPu64M8eOZRGvZ0YeSRInQoZCtSHKfazL+NUTpwPPsjgcvULKeJXuRBnIu6GKnKlAVzIj2BfEWMFLFAbtWiVzOTCd7rxjx8W1tXfs2HEJEzkqfPSFnMVYLuRanozHv0PRl0eo/4uYNfNzXmMKdU38y7YxmRzOpJwPqAJVtGF3buPZ8BxbuQpcy6lc1Nj4XmPjNJLpdFUs1rxly5Py8rrwfLhlrWI+R7GDv4TRnffJCJ930IxKXo7FBmVl9UN+/tEFBde9++6VhYVd9977/travPnzb5sx47yWLYcUF7c985SfvPPWgXl5B6Gw8NQVy8489MCLdgU1/S/ALjL6/zsu+9nFU564Z8oT92Qqo4MGDywq6tChqP20V17fWfgcNHjA36SMgwYP/MdU8rKfXVxZuT6zz7RXXy8qan/q6SdkWOygIQNOPf2EW26/7uF/WCLtUNQ+M6u6C98EZWUVV17++/Ky4WG0sW+gODvIDgR0ALuFvMoEO6ijC0OJ0ZsI+bTmE8oZTx9aN4nGHshgFtFIHZ0ZyPyM7Tyd2S8MBmSzX8gZWs9TDAxPkilBNQtUeAZLAjPoSJS5QbSbZB1d2Mo8OvISezCQuvKyjU2PwLrK9Tddf9uovUcc8Z1DKsor/3Fr/iuoLK+cPOlPlHAUB9MHNGPfMHHbSIrBgVVsp5CCsGW6kJ9QQ7sQgZgkRnvGBll9hg72pRlFrOZouuzMuC8u7hB8gpL0pB9R9g45BZvCBOqiYNTamqwmjCFCf54POQUZMdOYTAEvGp3PdjaFDILB5PAmG5q8i3zy+Jg3otHdeC4/f8G4cefHYvHNm8tfXTt8x459XnvtuDVrXolEYpFIjGhx8XfLym5fufIXTWqZ6RUrrli37rlo9IjQ0S7hmEDBa+iYTBak01exU3h7HBeHG6QMF2/LM5SxJ63C+ZD5y9+SESGWvVM4pVPFrVofvXfPyeeeu3zt2ngs9v7SpT8+/PBzJ/x15PG4vfe+8+yzO7VJRaPTWBUcZKt4kZGcwRlM4Gk+poEshrM/H/EW9UTDTG1r4uzG/qxlOo3kMTPw5ihlzGBEaOhnuPjBFNCfQ+vr/0y/UPHNbJkzZA8G8RonJBIlVJWUNvvmZ/LfRFlZBXlMoJE/kLllXcndDOIYijmf7rzKSuopoA9H8Ba/ZiW/ZCCXhy/1SG5KJnPr6x9Ip6uj0eYoKBjTosWx0ejC4Fh8GDm5uYUDBvyYQrpxJJt4mc00Z2o8fnhItYV4vFdDQ86CBb9t3rz7qFF3NTYmCgt7RiLRV1/eVl93ZTzeK5XankpVpVI7srJ61tddc/H5i77Ssp81c/buvb+/q4//b4RdZHQX/ooORe0zFc3xB48dNGRAUw3TKaef8DdnQHfqisYfPHb+vIV/My1p0JAB0179qyK+Q/FXdUgditpfdsXFl1585d9b1aAhA+bP2zUz+o3w7DMvTRjzi/KyPWlDiqXUhdjPRXwRUrzrSLON98lhO0vYTm6TidJMT38Y+7CRD+gfij2Zi2VH9mNL4GdtGBVyLzP1oRGk6R/Ywxpq2D88SXXIjVxNBXUcyRI+JE49a6gL18svGMkitjKa9gxhBi2oaRpi9ND9j11y0ZX7jtnrmwyJfh1FJUW05Q3eD+oZfMRzdGMus0mTS4QRPMErTZ6gPGRtH813iISefh+Ws6mJKUED7zOG/TmeGWwtKV3Utt1fBadPv3hjSekyqsgKWv4cEixgDf3DsV3Lx6FWujevcUOYediTBdxLAzuIszuJVGoU+wb39QxidOSPvNfkvTzHy+yZSi3Nzm4YNWpiIlG1cOFbW7Ycz/c4iavmzPnD7Nm/zuydm1uy225n1tYuWbTohJqaz+rq1ixY8J1t25ZEo98jQYQ407iSFpTyMa35KVlsZztV7KAP15NHOehNFn1Db335SSed0KFDMmizsighTvuMYqa41aabzzj15DFjBnXtOrBLl0bxhsbGDi1bNv2UO7dv365Fi2gUHwZ3/ac5Loxb4AAu4XPmhjuE0lDbq2MBY+kYiCyaM5Y8NrCSPWlPghjvMIpWNJDKjX3azlbeYjtCabaaX7MwfD2zqOTa8AZzWFFS+sH9j9z0nzqZ/w5yiTGSfvyZl3mY8YwPJfw0B3E0C8IXGa05igJ+wzGcHiZPMjcerbgknR5PI8l0uiGVqonF2jVvfjQRDiKHZfn5rSoqpodhnkIOpohPqYrHj4tGd0unt8XjxUin6zZvvjiRmJOb2wazZ1+1fv17eXnFVVXLGhrmbtt2Cw3RaPNotFk0WhiJFNTWTt2+/Y4F87IPn3BypkT67DMvnnnqE1lZd9w1uXFXH//fBbF/jonGvtXF7yKj/68w/qADmtYjBw0ZcNnPLj752LOaUtJ1lesfvv+xoiZ89O8R1sxTDRo88G++VoYEN51SzWCnHAonH3tWZtuVDvoPUL62nE9YSBYdiTA7tOZ7BD1vNjv4go/pSwkp9mI+O0jSEEqeY0JEynzqmqSoZwUJyDaqac7cYBSaw1bepSZMKCLFfFbTjjnMYhFL2Isi8riaOoo5LlRwF9OFPRhMW1rwHMXsGWS5uYyigmzqysoqdg6JXn3dz77u3/SfQZLeLOEpqnmNuQyhZYgpn8X6wBsOZA53UMW7TKIXEwKDyRzAVuwZfEkzrd71zOF7IV+qNyfz8VETB51x9imZRRQXd5h01zXDRtSF/ExUM4s0BbwTGOoBRJgDmjOGKl4nTT6jwufyJiv5hO9xEAdwIWVNJEq7B8FKxovnLuYwjmZt25Ykk411ddVvvTV906YfMi78yp7cvmbN+unTT25o2EokFisoLT0xN7f9p5+e+dlnZyUSRdnZp4d14kEeY3TwjfqY55lNC5rTnGYUBnumt5vkP6WJkszPX8mavLz8G2/81e67xwJbTREjxYZmeSsnnXNGl/bta+vrz/rDH5ZtT//4x38af+i5P7r//odmzMg81+Ivvjjh1lsbcnMTiUSfPhlBd4LLvhwEhe78nGZEQhUZo0gyktbgM2Jh0rqOwWTTm2YkWE2MsbQjlZ2NhYOaN+/AkTbEZeqyGW+KUQzinlDYfpdb6ELrjD/aURNj02Y8nRkYLftbCWQ78Y8fLV9bTl6TIY1DmEdnuoaK7M7qbG/6jxg5oKR0UxCKxehFhEf4A6kmwjI8zF+4buvWD6qqXiQRjeal0zVkk2R+ly496us3p1KZZsJW6mjMuDTE43tEo+1TqY3p9PwdO/6cTK5dv/441rdseXDLlv3efvuUbdsWtGrVZ+vWBbW1ZS1aHBeJ1K9ff1xd3V+vFzt23Ltt2y0HHfTzYcNOPGDsjdf+8tGrLr/ml1csycq6lmg8fta8OadM2P+8XX38f31E/jkyGvmPX+H/5eIX7bJ2+p9Fhm5muuqVlesnHDy2qbDpofsfW1e5/pTTT9jJUCsr1990/W2ZjjxOOvasn/zs4q9rki656Mqd++xEZeX6DIt96P7HBg0ZkOGyu/RM/wDPPvPilZf/mVW0pTtrSbOSNhSyG0uoohlVjKIlO3iT3aikA2vJ4nzuoZb96cD7IcxzFDtr23NYxQAW0ZNl9GNDYGmrGMocxvIRKfqyllIWk8dw5jOBg9jAzUwgzVbeJtVE7fspKxjeJC+nKRbzxcOPTbrlt38YtfeIA/8j/6Z/gIqKdTf8+uZZM5cGr9DVoTA5PFj0vw86UQl2Dz6XM1lPlL2CM1SGb2X+PG5kflC1zwg5lqc0eeXMbg0888CUH3wljeneux/+011vsrW0tEVRSZvZs7LJZy2f0yfMVHzOUvrRluVkszRkzXdiMe3ZyqnhGGYqqdU8xgriIdKpnndDPWxsRjTWrt0HmzatTaUmcGKTMIJ0Ey7yOE926nR6PN6MZGPjtnXrXmhszIpExkQiHZFOv5lOl1HFWPKZTx9eZ39e4fCQU5o5bjexiEN4kVwG8h7DW7fedMEFN27ZUvnYY9d37Fj8k5/88sILz9i8OYuWrKTDqFEDli//pLQw69yDDrrsgQf6DzrghBN+mnnSlSsXPvro9UV5kbEDBtz+8st9ew8aMXzA/Q8/PG7cjzduXDFv3oes48TgmZDBJv4YeFs5u4dZgkcZT5KZFFJHWxoYRISXGAaWUsQX7Mc2ZudE648uLp6zbVtsx46FtIhEImxNd6MiVGS38W6w0MrlMMqzsr4469yDLrjorMyaysoqTj/pB2Rdd+NlX/d4KiurOP2kK0led+NFf88B6tlnXrzy8nubpKc+R3dWckQYnkEjj7GpY6cW195w+R2T7pk1M8JAypjFEbxGHRfRD8GW4ZoQiPr7SOTFwsLx6XTjjh0rIpF4Ts6WZLK2X7+xiUTDokWfsoY9g8/X4/H4UdQkEi9nZXVtbBwaiTyfl9e7RYsD6utXbt36UvPm3UpK9l29+pVRo/aePv3Jtm0vIVJfv6iqalpBwcR0OpFMTu/WbZ8JE67C9u0Vixe/+/HH9bHYxMw7SaU+SKVWxeNHJxJ/Ouf8NjuP5C78C+LNf9raaf9vjxDuIqP/cqisXD/tldfXVa6vDKakTQlrZeX6Sy668tTTT5jQxKM088O/SVIzyDDgr1DVXfg6Zs2cfdrJN1ISSput6MxWPqV9EBqXs4kx4Ua0kvfpyAhSbGIhv+QmclnOSGpJUM1qBlPMe9TRlwKW8n0+Zjrd2EEvNoW6UU5Iv0xTyUYOZD2z6cE5bOYZevFyCC89gs95hyHMJZchvEi/L4dq1jObKiK9+3QaO26/Ayfs/18uiFZUrLvwnOvKyobzPpspIov5jAwl4QVsoXmo3lXQiW6h7JdpvO7VZPxxJ95jEV0ppRPPUUCS4+gAInzBFLocNbHb5Vf+6Cu/P3f2/PvvffT2yTe+/OK0X//yzxSTyxI2UUQ+EQbxYlCAjWUxL3EkY7iCNpwVWq7pJs9dx92sY/fQ6U7zF44Op8fc7t3zV6yYn07H2JvLvvbu7opGp3XvftWKFTc0a9a3RYuhZWVvJpM/oiSdvjESyY1EKtLp1el0AeNCJ+1DVtCC77OZF2nGJST4FXG+Q3lpaXlZ2dzWrYs2b97erFmbc8+9pnnzNkQSicaPPnpxxoxHxo8/rUOH3e6++7qWLdsMGzbq0EPPTCaTr702Zdq0KSeddNWQIfsT2Yl0OvXEE7fMnPnSwQce2Ltnz23btt3/yGMHHvij2tpt77wznaKQl3sGmMVj4dhW041ZtGAkzzCB14Nx73r68wG57M677MEsRrKBLfSMxz9uHYse2qFDQTT67Lp11bW1W4yidcy751x47ORJT7J/8MPfznt8lza8UlqafeTEPb/MRH9eVnY0zbj/uhuPOqpJKG5ZWcX4MT/jAuLce/6Fg/4e8Sorq7jy8t/MmolmTOcY1jKTvkxkK/eRz5Dc3MXNmw86+rgiTJ40lY6s5VAwkzmcwALSXBuqxRlM5+bc3G7pdG2LFrlVVRWRiHHjLps796kvvhjICt6nB8N4NB7/biLxdGHhd2prZySTWziJD5o1K6munpWX16pNm0EbNsxt1uyUVOrRZDK7vr60rm5LYWH/eLxlVdXUWGxbs2a9CwtHNTa+M378ldOmXbd27apotHdW1nXkJhL3JpOrKI5GF9M8na4oKWm87saf7Mpz+tfE2/80Gd1vFxndhW+Opmy1qLg95s1d+JUK61cw9ZU3Ppm34OuZY7vwFZSVVYwfc04gnSvYzG60CUn0efSiipUcTJLP2UYZ48kjyidUcjV3U8xmFlEU7Iq28TkxWtIzDIPOJfPRrOQvFAYjzAZm05XWYc8yujIEYdRyNeO5gHX8kZygB0cZz9Ca48BaniOLPYmwlk8ooCOrzr/whHHjx/yXmejDDzw+edK7HBra6zOYQx8WBDn8IlqwLpRFcyikIQhNWvIGfZhNKQeGJ25kOlUcTPugIB4Shhk+5TsM4j2mZujgURNzv05Gm6KiYt2F51xZVtYqNKm3MIy92cbjjGF3tvJ+CIhaxX0UUcHpwaxA+LzuYncG8TDFDKMhkNG63NxF7dplV1Ss7Ne29SeVA8ONwU/C1G8DN+Tnb+zR4+r8/B51dWuXLPlhfX2nSOSqYO8vnb6LKbSmFx1Js4iV9KUiBEhiGp+SRXf2JklZLPZaJHJEIvF0nz4jzznn1p1H4M03H5s27U/ptPr6uu9854IhQ/bfvLmyZ88hePrp22fOfKmxsbGhof7ww8898MD/W36+776fL18+V7rxtJNOKq+sfOW113r2HPH55wt69tx3/vzFDKSWj4ixF88ykC58SjrcYMxq4mw6gE4hbncTCVqyjXSb1m1/9bMf3/vwo3M/2UID5W3blgyLNPZt1uyV9es/21HPmBArmuL9oyb2KisrnzUTpUF1Xhpe5cXzL+yT4ZTPPvPilZc/w/lNErmePmpiw3U3/gJ33H7P5EmfNsniwosjRi55YMof/96JdNrJ586aWc0XIeqpjvepIU0JI6jo2LFbx45nbtjw4ooVt6fTl3E3LRmdsSxgMy/Tk1+HiIGdU6SZhszPevYcum3bFz16HBmJxGbOvDkabdbQcDDYwdsk2BaJxAoKjojFirdvvzOdPoQKfsqUNm0+Hz780hkzrmjX7sr8/CH19cvWr7+5tna3SOTSdPqWnJyVubnpaLR5797XxGIFO3YsWbbst7W1B0YiB6dSt6bTH0ejo1KpQk4CS7gvK+vcSKRzInHruRcM3FUi/RfEu/80Gd1nFxndhf8aMpZSRf9RulJl5fqTjz1r+tvP/Y8s6t8b/XuODYNrW6hgG53JZxWj+ZDOLOQIZrGN7/IYe5LDLCKUMJFHaU+cBubTknbEqGFFKKNmCqsrODZcQXfwBuvpST6z6ExzUpSFEuNQSlnCbE7mYNbxC0aFrt9ONPAsw0Lvu44XKKOEpZTSJtOkHjGyz+2T/4a8o6Ji3YXnXHrdjT//Su+76Q7Tp745edJnIfNmJxbyShAJzacfg3iKCaxmAdl0pY41jGAVXenJa9RzIElepgvjm8zWL2U+pWTqQzMYylxGsxsVR03M+sdkNLPm63510+xZlSQZxW7U8ACHMID5fBa81usoowVbyOZjDg8d+dd5lqPCPzfzCBsYwSscEYu92bv3gMWLP7hi9OjKHTvum92adnzMMi6iO79o02Zojx5XRSLZ9fUVGza8vHbt9kjkq4tPp2dwEwMo4j12UEQuX3BCmClM8B61HBJ+7/V4vCQ7++pk8uOGhht69drtzDN/k5WV8/TTt37wwbPf+c7Ep59++rDDjn399Rc6duxzzjk35Obm3333FUuXzjr88CNffPGlvfc+/L33ni8u7vH9719fX197220XpNPJgQP3XLDgnTH77PPsiy9+97s/Gj366GnTHnrxxbvoG7xgsYKF7BHqxPPIC93nnW2EfYMD1Fw2cThp3mB7PB5JJKp/dMEFRx955A8uu2z+ggV9+owoK1u2f17WB1u2rKsvYHQI3d2Jz0aMrCtfW15W1pzjyQ82n5kRiCUjRq4bsceAyZOWcDyRML2a2WF5aemcIyf2mzxpM/s3+TkSVJaWzrjuxmP/XiHwjtvvmTzpWfYlTiIMohQwPJNl1a/fxc2bD0Ft7arly+/bseNgfkmPJvO1j8RiHZPJ5fy0yW0knmcSHXJzq/bZ55fFxXtg3bp506ZdG6acM9uCSGRxs2YnRKPNk8l1VVWPMyHc2eLl7OxXS0quzc7utPN5N2784+bNWZHImen0Tzt0aNGjx8+avqNVqyZVVORHIoekUjen0wOanE4Z3BOLFcfjZyaTDw0ZNusfMPVd+Fbw/j9NRvfalcC0C/81FBW1/w+ZqG/AVndhJ0pLO4Q0vxzqMxUONtPAVraGoMv38vIGZ2V14THyqeV1OnA0uWwmFthqTshnX0JdE+PPNMupCLbhswKdXU0x89hEjEaqWU53qlgXpNNl/JYDaORhGvh6XTOjpnoy/DOXY+jG53SnbSAQ6Vkz1150/lc7yBUV6y485/qysrGnnfzHhx94/G8errmz50+e9ADtvvZIfVA6r2QMw4JsK8FgDgiGU30ZxMfBhTSXwynhaV5mOAeEJJ7GkOKzH9tZym4cz1yODGqzdV9bxt9AcXGHP/zx5sOOGMRmPmM2bzOR17mLTXyPY3mRRk4IBlXdGcc0budxXuWcwETRmgsZyjRy4vG38vPjm79YeOeRRx7aJ/PrGYoznL25PRa7snPnE7p2vSSZrEsktq9b9+zatfMjkaPCO925NUQiezGaJUwjymFUsY0TuJMFYZAjo5BLUMVTsVhJdvbViMWG5+Y+sGxZ4XXXHTt58oVz5rx63HEn5Obmx2Kx4uKOxx///erqjVdffdyVV05cs2bBKaec1tDQEIvF27UrOfzwsxoba6655thbbz2rZcvWBx98ckNDvXR66uszzjnnptGjj8bw4Qc2a1bCpywOKohWxCgiGbhmBfPD288NYVqNzCKbE2lGczpQV1jYevfdj550159+9LOfzZ0/f+TIo3r1GtrQUP/R1q3r6uNkN1EB7kSrWTM/KyvbxA5qwqvkBm/5+KyZsyZPeoCFVIQv406918qysvcnT3qS51j5ZWeu5rxfVvbh3zuLysoqnnvm41AGXkVWRguYkVvl5HzeseO+hYX9U6mGVKohJ6e4e/cz8vL+EM7zZ9gAamKxYVlZB3Att4fnfpBbOCg3N3XAAbe0bt27vn57Q8P23NxW4e9MVTieyVisTTTarLFx+Y4dLzCwCRP9c17e2506/aEpE0XbtucWFZVEIie3aRPp1u2HpDJOt5mtc+fzOnaMpVInpNPZjM6cgcEzuJ5TksnPE4k7YrGJ8+acP2Hslf9Y77UL/8P4Z9RL0W+bDkZDX2DX9r9861DUvrJy3be+jH/9raRjKwbSifnU05JR1GU0rRzJdxlCOp1O5+ZOyM3dL6js9wsFj3yeYQ09mB/6+zF6soRqUiSCZv9IOrInSX7POo5mLHsF5X6CdfTiI9J0DyY+W7meTWRRTDPuZGmTb/cqbqc2dACxnt+zkRHBlijB5ySJzppZevQR53+2ZGnmODz8wGMTD/t1Wdk4OjBu8qTlF51/2d85aH14mnebvPQ0pjGYjG6jmDoWU8MattEuZNgIsUxVwS6+jqH0DpfADKXIDv4DWVSwinnsIJdkyGh9jWVlZeXf8IM+5LADac0KUiGdcjf24lC28iHfZR/qeZY0aMVh1DOPi9g9RJ7u3A5nTEFB65yc3IbaqotGjerdtm1dIrF22zaqwhW9LXtEo3kbNkxLJLbF483j8ebRaHYs1phOn5FOvxlYe2bblk5fxEy2UsQ+rKRLJDI5Ejk5EvkdC3g1MPsoG3kmK+uAnJwrdnKISCQrK+uM2tpuK1d+cvrpZ7Ro0bKioiwez2poqI/F4gceeGTHjru1aJF/3HFnk1679otYLF5bW51KJUeMOLBVq/YtW7YdPnxsfX3NmjWrGhrT55//+/7998KmTRW3335NVdUhnBoyxmpozNyERCKrsrIOyMm5NhLJZQczgotZ5v7qI1o0KUa+xnIO2bq152efvdW794Q58xfuv/9xnTp1XrduTV1ddXldKZmWxZN80eRMy4z2dqY52dz65QjWqTzMUFpTxFW81uTR+3iWUTRjCNc18aXH73iLjIHJV0+eWTNnjx/zi7Kyi/gel7KEj0lTR0Ek8nYyubxFi+HRaHZm27z5jQULzqitHcoPKCebt1lIIhJpHov1y8k5PRJ5n5P5HQ9xKG3q6srWrHk7J6dFTk7z7OzmdXWb6U4znudzUBOJFDQ0LKmufjE3d58mU6ePsKy2Nn/lyok7drzd9JK/ZctjlZXXFhRMrK7O++ijo7Zs+SDjdJvZVqy4ed26Z/bY4/aioizOY2GTSNV6rmFdNLoXhanUMxXlH5ev/aZft13b/8D230FGv83F78L/Fxg85G+77u/C30IDndmDNGWkgtT3YJrTSHO2JxJLksmKeLxPPN6bkqANWs8nbGIQOYxgBQnq6c4erCHOInowPmhi0JcxwWcHAzgsRLG3YhYd6RUMxtcEJdD5fEQHOmfUDMHqcgYPsBt9yWIrM7mHTuxNZ/ZhTci1LyBNoqxsj9NOvvGN6W8//MDjkyct5ZAm/fF+s2Z2OfqIH1ZV7Wh6pIqLO5Bgf2bxCHU8zEJGUxBodxazWMNNdGYaG8Mk7nLqqeQgevEXNmVcSLOydo9EVvAY1U1ecAYzGBOLteXZEIrYyEs0MHDEHkP9J5DmQIZTy2vsHhqsc4Kraw417GABi4gSD1ZZv2XGl/+S1/IH5tTUrBszZv8LLrrmuvc+uPmdd3Lj8Y4tWrCcGSGZKR2N5pP/ySenbdo0HTk5xfF4z+zs8VybTt8Rljc3nT6Zeg4Pk8Sf0DESuSW0qveIRB6kLQ+SIouXaZlIPFZff12w2MxJJF6rqzsjGl2RSIz+y1+e+eijmTPff+/0g8Y/8MCkRYvmZmdnx2KxWCyalVU/bdqrO7ZtPfGoQ//ylzuXL1+Qk5MXiURycwvq6mpef/2paGpbp0673XLL999888+vvHLvr371882bD6QV7fkeJcG1PicS+Sw391ek6usvTqdbUcp+fEQV+bxFA4v5nBqeoo7DaMtu9fX7L1o0N5Goz83N/+STdz/44KV0egADiDKEfrwWrLhm8WEYoc5hD/bgCZ4HT/IOh1NDPqM5isf4DfXcwoecxDbyGczRvMQv2MxFfMoxbCvpWPyVk+aO2+857eSn+GUYP92T32UkUxTG4xuKiiYXFJyyaNH55eWPoLx8yrJl16ZSp3ICQ7mV3ahmLfFIJItUJNI8J+ekeLwzr3A0pWxq2bLDqlUvvvTSadu3r8KGDQsoZG/G8BHvsy0eb19TM6Og4JhUahuz+T5/YAvHc3IqdVR5+VUbNvwhs/INGyZv3PjHFi1uyMub2Lz5L/Lzz1u8+PLVq+/MPLpkyeXV1UtGjryzVavdBw++pm/fs/g1j4I1oebainRj40/4MCuraMTI/9TXbRf+3+LfujIaWfT5zG91AbvwP4Spr7zxybyFl/3som97If/qKCuruPLy62bNbKAdM8iiOQN4lzGU8hGL2T0eTyQSn+blHZJKba+v/4xD+Yx3OJr+3EYR3ahhPglGE6GOt2jL6J2JQQGNfEg9B4c2XCNTWU9vCkCET0hSzLF8wjT2I0k31vMmnVnJ4BAX/hkFfMqIoPzIIMks8tnEVrqyL29TRh2HhPb0TnzCm7S57sZzxo7bL/Ojiop1Ew+7moHBgX87LdiTNA1MZwjL6c2Pw8X7We5keFA17eBcjgRP83v2pDoeT+fkHFRX92IyuYLDKeZF1nEgLXJyNmVlDdux43qyyaVtxojgqIkt/8OZ0QxefnHar395M0PCrN6DbGIEhzIn5JH2pJ5TqeVB4owIKQNdmcVAziDKCu6kLcN79vzs17++C+vXV9x992/Kly/aXFvKID5jESNJ5eZubN16Ym3tki1bXikpOTEazd6woSoW65xKba6vfyGdbs3+/JHhDCfC/XTi8Ehk5xhf3U5nwHR6Gn9iGG14r02b8du3v5FIxHJyrk4m325sfLB5827bt+/JBBZkxR+4/MRDDh45ctann94wZUqLdiXRaDQnJ/bFF18MGdD/Fz/+cTwe/3j+/Btuuy03v21dXXVJSZdPPvlg9949Y9Fonaz27YvffPPNVGowI8IJufPsXclHNOTm3tHY+FgyOZ3jeS/4Yh7ENt4mc/JUsogCdmMojV82OlzeuvW6zZvLGP61+ZOtzCPKDkZQyEqSYT07+CAMhh5MPnPIDTPN9bwQbniOJs6btGJ45kDyZpgA2Ys406fNmNQ00f6O2/80eVIjhzQZ3Ny57Cd4vLj4qYzzfH39/M2bf5OTk1ddvZIfB8sqTXZ+knGRyAfx+EGxWFckEh8kEss5kmWRyBtjx34/P7/FJ59M++KLxSNHXvbRR7ckk+PDSEwt77A5Eonk5U2Mx5vV1s5obOzMOxzB3qSDAdk6Hs3OTuXm9q2unt28+bVZWf13LiKRWLF9+w3Z2XWxWH5eXstBg34Vi+XufHT79s8XLbph27YdbKUb+/BaJLI5Fou3anVCbt60V19/4G9+uXbhW8GcniPT/8SvRxj67RHCaOTLX6ld2//izbe9gH+LrWNp8YNT/jBiZIzVZNGNBB+SRQ0vsZIjyaY+J2d8be3zJKhhJvO5hCPpwRkhmz6f/tQync3khmHKZ8NUaGbbyDNUh0ZnjM08QSuGsZ0odSykG8XBiXN3TuBDqkjSkqNYETQiSerZxjLGNWGi6eC5PZRtbKcHa3mMOr7LAbz65Tyht3gtk/5y5eV333jd75qcV5WsDTLq+nBdb2Q2ST5jPL8KB7CG8VzPhhDw+JvARPFdbg85ignk5h6WlTWcp7mXGo6lBbFUqiI7e0x+/qkk6UxnkplA8G/4QRcXZ8rJS3mQraQ5gE+5I9Riu9GSS2lPZ66klFfDl6k941jNNbzGzWGeNdqmTfuqqm07dmxvbKzv02f3zbWnsA8R9mEcs9ieeZK8vL7t239v/fqXKiufzBQmotEWeXmnxOPNuYdDGEx98IRfwRfkha0VLWlJNh+EmcWXycrKKmrT5sS8vPZ1dWcmElPi8Tbbtx/BBDCwMXH1tQ8tevnDD0f06fPgFVeUFmSXla1evXr14eMOuOYnP4nH4xg+aNCDkyZ179Rm27aNn3/+yf4jR+w1ZEhjIpGVlVVUVJJKJSgn2iQQK4t81rM9FsuuqzsnmXwnzINupBvf40xOom+YWMijGXWUU0VemPXMJZuKzZs3/51cmLwQGLE3LagN59ImaokzjuowerGBz1nXpNR9JLUcSw6f8SlrWRb+QI6iMRimzj1q4u4dS4ubnjazPprDI9xG+stO4ffyF364YcO19fVzkZMzKDu7Z3X152FOtCk2UMalXJlOf7+x8elE4j2k0zvIZ0kk8mZhYZvc3MJ0OjVw4LihQw/58MPf5ORkBh7qA9UeT31BwTFZWe0SiTWNjWv4hCMZFYZGkqRox4WNjW2rql4vLDwvHu+ZTjek0/XpdH06XReLlTRvfnldXXVt7Yr27feORGKpVGNmzjWVaigs7FxScnA8vpU4+7KF9dnZLVu1Op5kUXHet/7netfWdIs2uZz8F7bot734Xfj/AhMOHjv1axFNu/D38OCUOy+4cDRZ1DGQltSwgGaclLn0plLb4vF+eXknNTTMBXn8kr5BYNQj6K9XhyDKHrwX2vSt6cCLYfZrHi/Rnl40hJ88zZ4cz2EM4hMWhJ/0DcnU21jNniSCk3ZOqEoKFkUl9Gdak2G7zHd/E6+QzSDWUEwniiikBxNZyp+p5y8soB1DGULBs8/MufD8n/grpWvGLBYTI0ING5kRZFtVIfMpv8m2hi84gjvoHfhWRqK0Ow/TNp2uT6eracjKGpSTkzGNOhTEWZJMLtm+/dyammfCkY+y4qxzhvz0m5VFA9IMJ8b9pMlnDLlM5wv6fdlaP8b3OITZ4SdZ7EN7nmNMKA835uTkNmvWora2+je/uemppzpzcJMqZneOYVM6nU6lGtLphmi0oFWrw5LJNg0NzyaTyzIXhVisC1l0ITsjSKI5g3kjnT41DCdksDSdPpZttGQ6e5K1ceP9yeSOgoKh0WhhOt0pkTgiqN9e5i9EOOO6h1PXPfxks/z83Tp0SCYTW7duafXlzM/CgoLsrKxUKrX34AF9unXbsHnz8tWrt23bunHjBoqp4W7WNvmN5/iE7vn5B4RbmmbMjESqQkhpA634ITWUs4bDGEx1kyFIbOcpGtmHXrz/5UnorbwRJkBirOcDDmV8+NRyg5o+i095pXfvC3v2nMgzZOaUaogQZ2Ys9mHPnr/t0uXESGRaSGSoztDf0tJlF1w4/Pobf9H0mJSVVZSv3crJrOBcFoVHbuFjrmRIInHh+vVPbN06ef36C2pqFpNiKLfwcNh5A9dwZDifj+LuRGJjQ8OT6fQW2nfpsqlVqw7duvV4++2Ht25dV1tb9emn715wwXWxWBaLeS1w9zpS0WhBff3cmprXacMOnmYS1U1ar9v5bTq9KZ3uvm3bTdu2XUJNJJITieREIrn19W9s3nxWKjU6kfjxwoX3zp59STJZu3PUddmy+5csuS2ROJfzeJ6nCgqOSadb1NTM2bz58U0b2t6xK7n+Xwn/1m36XWT0/yMUFbWv3JUF+o1xwUVnPTDlxpCm3ZmOFLAXdWSzNpXamkwui0Ra5uZODG6jqSZy3WY0sDufshx0ZBQLyKOengziXWYwn93pQowspjGfE5ooPEZyLB0YDPamZSy2nUfYjSM5k/68lBlEo4HVzGYk+7IHY5nZ5PK5mBn0ZAgl7MkmOrE1mCsVciRtuZetlDIszBX0pP2smWXfPeLHFRXrSLAvX/Ah0ZAa35EudOQcXuLyQBHwB/7EEF7m2q9JlMo4OSdHXt6+NTV3JxIrIpGCSCQehP8JPujYsf/w4S+1aNGZnhm389LSirPO2ffMs5tyx2+CzOx8H7qzJcRLNqct679sQr4T9WSzLowtRmhHlN2IU8m0srJVX3yx8sILr9iwYR4raclWPggC6nV0rK8fsW7dnXV1K6ur52zY8Fk6/at0+vT6+ucaGzOUKBXK558zlVpqifEd4un0qen0a0inn0mnz2Y3xoRPoZiqROLKjRunbd78bCr1A25kFa8znSTtmUSat1/+cNuBl9zwzHsLe/XoMXjw2Dvuf/DHP/95Q0MDtm3ffuHPfvbBnE+aNWvdmIwsW7Pmzy+/vPd+p3ftuu/Uqc8SZxhFPMbHbOcuytif2mi0GSmyeTEnZyWRWCyXi3mDbDqwG1GOojnDM3MXfMDbLOd5OjCCOF3Zmy94lzpW8g5FtA+3PbO5iO9zEjdTEXr0cVbGYnMGDbq5tPQ7nTodO2zYXfn55TxPDVm8m5u7vm/fP7ZsuXe7dkf0739/fn41f6GG9qWly46a2P8rVpplZRV33H5PWVmmeDmRrvycv3AV2/h5MFCLc2ZVVU59/XLGEKc7h/Mul/AGD/FLeoe71iqKuDWVOjCV2ti69eqqqk1nnnnJZZfdMmHCd95995FFi6b98Ic3Dh06OienHcdQwgsspioSyW5sXFpX9x7Hs4Y89qWKq/kErOZ6mhGjBac1NFRt3HhMff07qKl5dPv26zid4xnKbZs2NXvrraPXr38XCxfeuGLF81zDngzjOkaRbtnyD/Ro1qzZ6NG/nDu79fixR+/S1P+LIPbPMdGv9yD+JxFZvGtm9P8b/PaG2wcNHkzK5DQAAQAASURBVNA0umkX/kOUlVVccfkNs2bWU8s6DmEzC6PRolTqY2JZWcOys/eurv4dHVnPD4Ki4gWeZyR1LKKOjNx1Ox+TRz9SNPI+e5IdSoNLyOV7Ide76RTQZ8xgfzryYiRSn04fFhI1M/iIP1NIEesZ++V5u428TlZIvhnSJJs0g7lsomMgwfP4kJZ0CY6kAimMZATy19944RWX/yFzlWIOG8mmf2Byc7iQRp6lgl/wAGUcRTk1LCKba+gOnuP2wsKjmzW7AHV1r23den08PiQW61hX9yrfycmZ17bt8I4dz0AkEvniiz+VlT1aWtrnD3f9tLi4w3/2w50ze/75Z98QfHzG8mdqGEBXFjOf8U1GCPAQHzOQQpaQDMq2dziOz6LRZG7uzXV1Z6dSu3EJy7mFlrSlkiV0ZvdI5HKk049zB4c38a5fyR2xWE48PrC+fnqQu21gO/tSzwCwnLc4nOcYT3diPB18pp7nERLcTiuOBa/yKpk61kJup1MkcjNb0unftm2zqHOX4aWlPT/44Nl4tPGXl156+a9/3bxF0ciRE6ZOnbL3kIHT3//w2GN/OWDAGLz11pSpU18Pn9dm5hCjLf1Jsyg7u1lDw6f0KCxMlpQctHTpnTk5F6RSZY2NLzGUPLazx5c/ilreppJa+oegywwy/p2fsZYEfenAduaTz8/DqGgGNfyO90nl5xcNGHBtYeH/fap0Ov3ZZzeVl79KdsuWA7t1+2UsVth0EV98Mamy8snS0u4PPPLbpnOiMulNJ1+5adOxtbUPhsCLCJt4kS5cGJSIqZ2vxmweo5ajww8/4jNwWpME1wwq+FkksrW4uOUPfnDNbrv1wNtvv/z6689177774MF7tW1b9JOfXMp+NOMLplISi21PJus4mmQ0+pdUqn2QUZaxmL2YSW925w2GBMPXhbyRl3dEbe1LXPq1z2Iad3fosPe6dau57GsDu69lZc1u1er2hoaZ6fTDe+11Zm5uq1WrHrz4ku/ssUvM9G1j8T89M9rvW5wZ/bZeeBe+FeyqjP5nUVpa/OCU20eMjIbe92beoDISKQXHNDYura9/gSw60ZNbeYU/8hTpUKTZnWzmsZHmdCXNe1STFwa8sJWP2ZM+TGL1l5no6zzCfpQxlfbp9BkUh8mwTJFvDy4iRi3Hf+1C0jaEJG1iL9qF4dGdW++g1scMZtGHmlBtzWzZoYq5nFoMG9GTdTTSnyj9aEEihLzXk+JIBnFR4Nktg1X7UTTnLKZzBze3bHlZhokiN/fAtm3vTac3NzbOI56V9W6/fld36nRWsKH5TUXFM6Wlbf9rTBTFJUVHTRxJd04hnwEcEAKrMIb3+S3b2MaNfMJYUjRwIJ15i61geVbW7jk5P21sfDiV2ovLiNKTO+jAu6FUfGiGiVLBU5zdhImiKzclk7s1NEwlh2WspDdRCpvcmXTmZF7kGAbSGHxthfuczDG/kG78GhzE+VzJJwzgdnJ5mVaRyA0bN01cs2ZRdnbuvvse076o77mXXVZU3GvPPQ+OxeJYVl575pm3d+06uLp6a3X1th49RhQWxthGQxgeSIWMpfXxeH1h4TBirVrld+x4eObEjkRyYrEe2dkZvd3Mr7nWIy8kcn0d8WBPG6F3OGnXEuVCBn/ZCDPKGbSNRtMlJYfn53dsOgGZTjcWFx+Sm9s6Ho/k5HT8ChNFbm7HSEQsrmztl0p9H82cM37/0zZvviAeH5ubezzTQ2JFu9AK+FEY3thZZprKHSET4ZXMN4U9iEWjJ/M854UMMCzg+/F4cV5e8rLLbs4w0WeeuffZZ59bv75s2rSy3/72lueeu49cXuIxWnA6kWQym9MpZGNWViRj1ABKGc1H7MEQdgTTAKTpxVm1ta/Qg9ZfO+x70mv9+vdJN+lm7ETHxsYVdXUvZWcPz8r69fTpU5LJxn79Lpl8+5L77nn6b318u/A/h11t+l3498CgwQPW7SKj/yU8OOXOoyb2RGnpfI5k32TyueC9d3wikYxEotRRxB48ySzacyyfUxEa0CW8zcrwi334iAri1LOaxZzG8ZzGkdwbrnAp/sxCLuMATqKRt0KWetPR8zeZRBuqeTLwpJ1YyKM0BBHx2jA8mtnW8gYdQ7jlSvaiA+1I8G4gqdjBm1TRs2xt+R1/vO6sc/qznNzAG9KsoBPnhC78h7zOBGbzGlm0oRHswxiuyc7+tF27B3Nz90+n69LpunS6Jp2ujcVK2ra9KyenP5HGxlXbtn2MxsaNCxeeuXHjO4WFp5Z0LP6vMdGKinU/OOc3zz7TnP2o4Wnas28TZt+M/WnkV1xDkjHhb2Z54CL5zI9ECrOy+mVlnVlX96PGxi6c0OR1YvyIgWzknEjkkAy1Tad/w8Hs08RXvCHMzh6WTrdkO6vZg/6kKOQzXqcu3BUkaU49FbzIEF6LRCojkdww9vAMdzRJvyxkNS8whWwuSafnp9M/YHskMnHDhh89//xzmzaVd+26OwYMGLljx5Zp0x7dsWPbsmWzKiqWFhS0LChoWVDQorS098EHHx2JfMi6kDwUJ83KNm2Gtmjxnc2bn4lE8tu337e+fvOaNX+JRKINDU+lUl80Nr7JcRzGO8z48qcxjVWMYwwr+TB40Arywc3h7KqPRhcVFnalNbfwM5LBCDOHpZzVseMeQ4ZMKi9/Ye7cCxsbt+2cgCwvf2H27HP79z/ysMMm89miRafV1f3f6duysj+tWnVzz55XtG/3mx9d+PCzz7yU+fkdt99z2smPpNOn1NT8oL7+nlSqkgKmh3nZOgYzkkk8EZ7scZ7mUiZwIqfzBqtAlKJo9IxIJM5pTOcZLo7FBkSj3aPRyGWXnfDWWy8+88y9Cxdu6Nhxj6qqfTiA0997r5pVnMG5zKQyWGrE+aRjx3UnnfRA27YNLAhfq0ynpT3lvMpEZjCNRrKpDXz6J0xv8kGs4aJ4PD8eb1NQ0JbLQuxwBlMzY/HRaEkisWLTppMSiU1t2vTE55+/ePNv3zpwzHkfzZzzjb5+u/D/ALvI6C78e6CoqP0uq9H/Mq6/8RcPTLnlgovOopqeHB30Ew3sm063ZhkbaEkePTiJwuD+uJSskMP+CZuoYwD7sZgsNtLAL4OMV4j1e42p/J4cfhG6bBgRHPV/14Rx/plXGEWUlhTyJCvDo+/xLp3IJUUX5rIkPLqYuezNPnTmyOBUn0cjI2jNB1Symg9oxeCdU0Znnn3K5Lsv4COiJJnDSj4Nr/4X3ucU9uZc1nM3n7M8TNN2p2NDw8pt225OpxsikdxIJDcSyY9E8iKR3G3brq2peYeeHLpixc3Ll183b96J9fWaNTs9Esn+L/8RqyivLCv7lEXkkc9WnuSRwOwz8udEkK+1ZGgoDG9iC+9Q0bx5L3qm05LJ99PpyqysXK4OPpc7cXM8/glzWUxLWtCCDTzG9YEcZAdG9T4/ZS+upwftyc3U0SORttHoGN6krAlXm8er7Mfb0WheVtYJ6XQbMIlHgoE/3uQy9udnFPITLqEsEjkznb6K5bzb0LD2rbc+X7z4fTQ2NrzxxlNt2nQl0qPHd1966Y7HHvt5MpnAm28+8OSTv+7T53AWZmzbycrK2tymzT6JxMZNmx7gkGi0MZVqXLPm6ZYte0SjOXl50YaGd9Lp4+jGQM6ngSfYEu6a6jiQlnTgIPKZziaqeJN0qIDGmVNY2DeVyujiD6OS48P87lNc3KPH6b16/ahFi/4jR04pKOj24YfHb9jwNlasuGvp0ltHj/7F7ruf0qpV14MPntyt24iFC0/ZuPEVrFr1mw0bnh0wYFK7dgfl5HTo1++mP95RfsXl19xx+z13TNrIT5nALxsanm9oWMcPOJdP+ZgEBfTlGD7kKv7IbH7dZH5gOL+hgZkZPwpEIgdFIhP4DZOysg7Oyto7na4tKirda6/9//Sn36xYkSgvnzdnTn0T/6xxHMOTVHEBtaylPe/suWfP8eOvfOqpn2zcOJiDWcQGaonQyBuczcn8kfY8xGq20ow9mcDD/JIq3uLKeLxnJJKfldW2VasD2rb9bjT6KFcHFd2fOJhNicSSLVvOj0R6FxZmb9v2f9i77zCrynNv/J+1y/QZhjoMQy8iIAhKUcTee4+9JCaamGiKJqZrYjQmOWn2EmOPxoYFe0GxAQoIiPTOzDADAwzTZ8/e6/fHzuIdjueknOR9/eXIfT0X17Cftdd+9nrW2ute9/Mt65588qytW3fjl5WVv7jw3Gm7WE2fVsT+aTb9pxi7MKOfrTj0gJNem/HUpz2Kf+N46snnvn/VT9mfUTwTLYodwjskogXT8UxiHa9zRlSRepqu7EkT79PIOWRo4nX68Q3i0Q7DaE32bR5lEF+KOOkiCN2zVLCMbVwY3dGnkMNqtjGaShZG0MM6BpOkiY2MoIWVFEeiS4d8Yln/LVaTF0kkVvMRAbtFkNB2ln31sjPOu/BMVFfXnHzcFyLGRg37MpsU+ZxGabTbeu7jC2zjTiayF6+TT30sVt+167U5OePQ0bFmy5ZvpNM4kiVMooWHc3P3zMvbNwzb0unNXbu+9/jT9/wPpnLunPmXXnwj28jhHJ5jMLPJYW/eIoexFLIw8oVq4QPiHMo7vXpNGDz4qpqaJ1evfpAiKpPJ/F69DquufiaTmch32cJPR4woKSrq8v77zSymbxBcR88wPIdxzGI7VzAS/JknuZyjQBs3sobVQTAlCCZkE7JM5kYmMJvDcnIaU6kPw7AgHh8Qjx9ArL09u4i8huPpygxG8hhfi3aLj7kjCL7JOJrD8BdRIlXBU0HwZDKZ27//hH79Rk6ffsfo0ZcGQbBq1dM5OeGQIePnzHlu992Pz8srmTfvoZKSU+vrXwyCeCyWyskZ3NKyktPYmpMzo719a0XFITk5XdaufT6TGd4JN7kjXuFtkgxgB9wwFf2xig+J04vBBLwfBLnJpJyc4Y2NH9E3Oi0XsogzguDxUaOu6dXrkM6fUVU1benSX5aVHbF9+wcHHfTTsrIsnEAYwtq109955xcFBXukUnW77/6zvLyKdLopemuwffv8NWsebG4+g9HUcBsTGJHtBc/wGhd1EqiZyeIIP/CXj4r+refnbA+CfYNgaFY2OAyfDYJMTs7RmcyWVGra+PGj1qxZP2LE5+fOndrYuH8nPEMQ/SB08DK7M5HFPNG3b9/x48956qlfc2TkXoEH6c4mWvke+3Y6JM9yG3uyPYKGZxPWLbQkkwcnEqPa218vLOxWUrIPMplUXd3TbW1ZHM5JdOMJ6mKxybHYniUlr2/fvq6j4yS+3OkjXpww6Y37HvzdJ2Z8V/zfjZXDJv2TexiyS2d0V/t/03r37lWzsfZTH8a/b6uoKGdfZvIuJVTQncfplVVaoSVaGO1Chj+xjnUMJIzcOycR8iR1kTF3Mz9gXSdeY4z7eSge3y0np4OrI93TJDkR8wlD6cMdFEd3o+wGWRxYOfvxIU2MJDd6Bs6upOcxijTNHEkv0p1aVmWpkAaqaKOccrpFULk0Kyi95aa3srKjfcrLTj7lsIqKLrRxOEUcQk/6URztdgUv8GPGcTA/ZR2vRaM6OJPpX1f3tebmJ5qbp27e/KV0ujdnkmQhteSTG493J0yllpWWvnXz7Tf8z6ayT5/ehOxFLjexlVz2J58X6U0Ob0bAvjASbC+hF3MGDDh18OCrUFZ2yqhR1+TlhcRjsYKCggEDB34xL28Vn+fLBx+8x7e/fWNOTh4Bx9IUhmeH4bv0Jsa+9OUnPM/NvMkvOqWMuREwo08Yrg/DdTRmMn9iIrODoCAnpzEIEmHYGo8PjcX2DcP2MNzEx9RxPsV0sIpXua7TbjGSX4bhE2F4NwVB8BMu4D5wUhh+i659+uzW0rI9COKxWCwWyx027My8vEHz5r00cuRJ9fXrFy58jGQiUZab2zeRKMjJGdrSUs1F5FOVSm0fNOikoqJ+W7cuymTa6PFf3X2Kooeu5k4vJqOWrUwXU0GadaWl+/Xt+7VUqqWxcRPHkxMlXiM5NC/vzW7dJnXpMjpCiLZlW1nZoSUlo8KwMj+/a15eV4ThXzLRINCt226JRF5+fpBK1XV0bEc8Xhi1gkSisK1tRffur3Mv10SX5DqKKKSFgoEDT+Q+VhOADIP5PbcRiy7GHNZwVUnJfr17/yqRWBaGr9AImmKxPul0ZXv7n8NwW8+evTOZ9IwZ9zY2NvAAdZ/wwn2dhdGx6kNBZeWSmTPvYTvPsCU6eqV0Ic1v2Gfnw348f2QtOTTSHvlxFCaTByUSozOZqkxmRRi2p1J16XRjGKa6dz8hFgs4mj4sYkssNjkWmxSG67dsWdrR8XU+TwutEc7k0Pdnfefwg65/f9bcT/0X+zPV/pmyaDxS5vu0WuxTtCLd1f7ftz3H7TF/3sJPfRj/vm3ipHE0cAFVtNDIUUxhNlvZzAie4l26kEcRU+nG/hzPGiojq/o9eYlVFFJEOT8j+2C6mZ8Ewfzc3IsI4/Fu+fm7c0Pk/76MP9Ia0Tj6kmAAHRFtaB4dzI9u5/mdqL51rKCcxdFCXmFk+b1s59+lZTzKYE5nLauiBCLLl6rnQwZwEpmpT6697NLv3X/vI1OfnFFZ2XdngvNeZLidhogx/aPIRQbD+DndqYzyj704or7+xvr6/wjDKUyJUJLFPMcSgjBMt7S8fe75fZ585v7y8l7/s6ns9MZhDKc+EtsfGD1O7M4wPiBJwNsMZTAqKg4oKzs5k2lNp1symdbCwuGjR9/eo8eUMGxJp5uDINmr12E5OZnCwvigQSN2TgUmM4pvsyR6ZXcO5GGquC0yQ+8cp2RRwmG4IJN5iP24ksuDID+T2dLWtoLfpdO5mczcMFyfSj0c0bQzpHk+mdyN7nwSVptLHo9n/xMEZ3EBN9DI0Pb2K2bMWDNz5iP5+V+YP//muroFyMkpjcdz6us3VFa2plITwzBRV3djW9vQVOqY1tYsxQ0v5eauzc8vy8vrvn79K9u2jeZrfMwfovQrGy/yMkdzFgme2xnf/H5k03A0W1hYVnZYt27HbNjw6zAMmESsoiLDdLZTV1paP2bMXYlEt5kzz9my5YNYLCcWy43Fcltaqt9773M9evQ+/vjbysv3mjr1nJUrX9rxGdXVc5955oK+fQ/db79fDRt28vz5X6yufrxT7+MLFnylT58LBg++pn//vsS5mOP5D55lM0+PGzdmzJgrx437Tjw+g/dAPUWREOll0Sy/xNVdu17Yrds38vLG9OnzYFHRqEzmnjBcFoaNQVCYTL5SWlp69dW/mjHj5bq6rpzHOezJbdEPQjYeZS4VdGMdN9AahgUbNy5iEDk8HF31CRo4kMt3Bn1iJV9nH0bwOGsiu4HGWKwknV7W1vbkxImX9+07sLb2gdbWNfF4QSyWk8lkn7Hfys1dPHnybf37l6fTU9PpaVzEDfwp2smO1Pm3VVUzP/Wf689a+1dgRj+1wQeLl8/8xI/UrvhfGy+98PqHHy666nuXfdoD+TeOEcPO4GRivEYVJ5MbkUhO4z2GMZ0KOjiUZ8hwXLS0PZNaqjmcDl5iJM0cxXJe5TDeiccHJZMHh2GYTs+Jx5uLio5ob1/R0PAsU3iT8UxgGR+xG+8zlt58wDaOojcvUc2eLCdDBZU0MIFyPuZjBhBSTxnLGRPVUd5lIcdGLOlGprGV3myggiUcEolY4R1mUcJe9AEhAWG0wRLmsxdfjrIWUW+cJfyBluhbFDKXOk4FTbzAlqxhN7mDBu992OHdv/gPq4r+55g7Z8FXLr6WInI5iBfZRn/2YF5kWNXIx6QZQTExqpPJ2uHDf1FUNCraU3rp0h80Nn4Uhl07OlZ1775fa+vavff+eiaTmjXr+kmTDgzD8J13NjGUjiiVf4fu7EUSESogzVXstvMwH+F+vsRCtlJOVm1gA3fyOSZHm93Dj4LgKBaH4W9ZnZ9/cHHx9xsbf9fc/DRXdEIkt3M9K+kWBPcjDG/hSYbxHTCHO5PJUSUlv0ul3mts/HnXrn1yc0urqt6N/Dmbmc2p7Am282cq8/IKCguHtbYua2vr6Og4kaHRRD/Jh5zOcB5lPUd1UhabyftMYABv0xZpGGVjaW7uxra29ezDTM6qqJh930P/gQvO+WpHx15Dh34vu93GjU+tXPmrgQM/P3jwF+vqZi5c+P3Roz83YcJfVpBXrXrt7bd/0b//Afvv/8OPPnr4/fdv3nPPrw8b9rlsb03NrDlzfpGT03/EiJ+vX3//hg0PDBlyTbduh2V7m5o+Xr36zpaWg0jyh5wc48f/qEePv6ALGhvXzZt3/datm8gwKgJdvMdcTuKpHj2uLio6ovOkNjY+X1f3yzAsisXa+vXrc+GFlyxfvvhPf1rMoZ22Wslz9OBM/kA9o1nHRF6kG7n0YAP9SVLPcgoYwheJs5CHGMQPyecDruW0SDJiFrfRk315IDf3lPb2pw488Np+/Q7EunXTZ878j0SiX3HxpI0b72ZMcXHD3nv/vLCwL6qqXv3ooz+kUj+igVuIR0qrTVwRBJuDoNuipff9F1fdrvi/FuuH7fO3N/qr0e/TSwh3JaOfrdiVjP7zcfgh525YH+MYamKxaZlMI0dHzICzeZ1DaOdttnE6L1HIWo6K1BmfYTMT2T3SiopxEgEN/CmZPCQe3yMMwyAIOjrei8U2FxWdQED71q23h+HR9KedONOoJ81wVtKdI8iPBvsu7zOIrbRTyPioSooNzKYn2xlDK0uigm4jJ1C+81d/NRKVTJIdQ+dYwqu0secnyntvR8zr7MLx17P1xSge40kmUE0VoxjPUpbzOap5id7U0fNLl+xb3qf3XnuP+Z8x6P9TVFfX3PfHh6c+WctB1EeI2Gxu9zRBlFivoDkyWKphNbuxaPDg7/TqdWJLy5rFi78eBLldukyqq3u7qOjkROKtffb5cVFRPzQ1Vc2c+dPm5tXNzXHymEQRtcyKmM4T6cGbDKWRjzphRvF73uPrUd7/GDPoycVRdfluekROUe/zcBD8JCv4FYa/KCwsKyy8CK2tz2/f/gtO4XzW8QMKOZknguCxMPwx7/A55nMlj/M0++Xmdikq+gHCcMv27T/o6NjAHpGbw3JO31njFi8VF69Jpba1tsY5i+47987iScrJ4YgIA71DV2g975KmJxMI0MlFczsrSLK2oqL8vod+g6lPPPfs02G/fl/o/BlNTcuWL7+eTFPTyv32+/aIESd17m1oqH7zzZ81NdU2NdVOmvTTXr3GB4Hos6RSTYsW3bVhw1vJZPcBA67IyxuIIMj2BqipeXTjxvU9e7aPHHlxXl4vZDKpIMguM6qufnP+/F9wLAOiJ7GmIPhTXt6E7t2vise7dHo2Q1hX95vGxml77DH2oosumzZt2muvte0MSM3+0cpCZpHLMGIsoZ5+lFLLUJZHyqzt1DKMMzt9UDMPs5jP8Ue+EhnDZqOeO5lPU0FB9wMOuK5nzz129LW01M2e/evKyvnpdHuvXnuOG/fTRGLHr4fW1tqPPvpNTc04DuFenuEK/hgERcnkib16vfTK9F3J6P/TqPynk9GKTy8h/HTpU7vi/3XsMgX95yPMtMXjaR4gJ5NpLCw8nhdZGgFGt/AROewT3QbSkYvmNOZEBvRjWMI6urFfLLadR9hEcWSYmaatvX1qLFaTlzd027a70umNQbAD9JlhG4/k5CBOUSRIeSLxTlJB4zmCalrpy2TikSJjGz0j6aI0IbmMJcV2jo8UnTpIRW1slEROjJB8O9ClHfQhYHcWR2Y/qOdJNjOJgMF05YfMiA7nzTzL4cRJcwRreSX6jmt5kn4Mrqgo+tIl+37x4vOOPe7wf1Um+tVLrpv6ZBgZE7xAMZMJyXA83SMjymxyELKaNQzhME5Yteq3K1Zc+9FHX8rJ6dO79+eyNeby8sYDDvh1Tk5pe3tDKtWYk1MyZcrPe/Wawu7k8wLro7LxsezNm6wgJMZEDudW/oNGvs8KbuhUgT6dC1jHDo22Qh6lBkzg22F4M0tpCoKvNTWVbd16LfLyjunW7Y+JxId8jSvpx0nE6AjD0/iAsyihg9t5ngPIj8V6hGELqSAoDsMWGiLU75sMoffOp0eKPRoa1re21lP4X4mJ9iafgLZOWeYOJYF2GulDNfWRfFVe1LaymqKKim6vvvEwvn/VtXff9XxJyZgd8NBMpg2FhbuVlIxpb98Yjydzc0v+0wiKi8sLC3uGYZjJdLS1bU0mCxOJwkSiINtyckoaG9cnkwNbWlY3Ni5MJrsmk10TidJEojSR6JLJtG7e/EJ+fkdt7axVqx5LJouSyaLc3K45OaU5OV2am6sXL75t6NAT8/PfY3qkit8RhmF7e11l5VktLTODICfbwrC9pubKxsZ58Xg8mczJzc197bVXeZ/t0Xp3XrTqvYV5tEf18g1sZxBdo+suQwNz2Mp2xu6ciaKALzCFP3IWh+982RbyDcbHYonhw0/r1m1YR0drR0drJtORyaRyc0v23PNLBQWFiUTYrdu4WCyRybSn023ZlpfXq2fPidzID7mQa7gxHu+TTJ4UhtvDcPs/flHuin8q/hXL9J/i4D9FwOqu9mm03r17bayp/dSH8e/bJk4ak5d3dDI5gIcIE4mKkpLzYrHF5PNqpFX+TlSe3J9NdNCfw5hNIedFwK9n+ZiCMGwtLBzMEywnh+ZMZlN7+0NFRSMHDLivd+8fdet2dn39n9raFgVBPi2s4LGCgiF5eaNJMSDi3wSd7u7Ztimyfd9CEMkx7mgbqKNPRHJCMTncy8IoIUhG/KG7SRLnPZ7qJCSSoIr76aCAkTQxjWW8QFcmRJt1MI79uIM/cRkLOIFuUW+WhhXjA9p5kYkMIaeib+9/aF2+urqmoaHxr21QVVNZuZyPI/QkXuNZAhqIMZoG5pEgYBm50dpxyCAu2rz5ndLSKd26HZDJtLe1bcxk0itWTK2rW5STU5yTU5zNV7ZuXbZ+/XQC9mYMb1FLAPbi5J1T3n6cykIuZhDXUNLJN7KR3bmO2TzKTUzvVIeexcXURIa0ubyRSr2fTq8Lw/Z4vF9e3oFBsIXJHEyaysiK/TySkVXYPA6jlA7iQZBPsqXl0XR6OQN4hy5cwEfcRGMnytEH/IY9uJA017Ou0/F+m1vZjy/SlwciFHI2PuBVjuIs9uHFnf3oP+R9Tub4ysrxF5z71Ysu/EHd5s9363b6Rx99varq0SxCNBbLxZIl329qmnPEEbdPnPjdN9/82Vtv/XLHXtratj/99Jeam7ceffSdhxzyq8WL//j221dkMn/h7zc2rnvhhc+1tfXq1+/Wfv3uqK19afHir6RSm6PehR99dH5+/v69e1/ft++9tbUbpk8/f/v2v3yFtWufeeutS3bf/YyJE79zzDH39+tXxiNU0RiLFeflHZ+TM6W29ntbt96O9vbVlZVntba2MKm4uMuWLXVXXnkJPcjlrkhaOBszeSiC94SspA70pIl17EUR+QxkOeuZwXVs3Plkv593+QLTuZKN0fWYoIlvUp/J/GDevOdfeunSlpZNiUReLJaIxZKbNi184YUvxuOHlJXduGrVS++995WWltp4PDfbli+/56OPfs2lnMYP4vHryS0omJDJVHZ0PJpKHXLBuZd+6j/Xn6n2L0hGP9XB74rPVpSV71Ib/Wcjk2nIyTkwN/cogo6O6lisS0nJubFYklwGcDStvEiCXgzkeTbTlS5s4/6IQX80b7EoDNPFxZO7dj2GVynMZLa0tz/co8cFvXv/IAji6Nbt/PLynzU1vR6LFbKJ17t0Oa6wcHIsVkA7WyMd0GmdhpniKebTnzitvNyJJhLyLus5jH3ZnY/YFCWFY3iZV6KNX+HFyD60nRNo5t7o1vgej9E/MoAJGEoxs9mN3TthQ7OFnD4cz+uUcmIkZp6J1OYxidF0cADd6GBb5Yaav3+Cnpv2yknHfe2Cc65csmT5f7nB/ff9+SsXP0LAZu7m5fz8ZgaygZtzcz9IJJ7lboZyeiQWmx/d45v5M9Xkko7HC8NQXd2M+vqFlObk7DdjxpWLF9+f/aBFi/745pvfKi4eHn3yQA5lQ1T6DenHBdFIamihkEOo51nmRG6lJRRTRBHP8goNvMMJ0VPEA/yYA6IPWhWGpwfBliDoHo/3D4KchoZfNjU9EgS9SJBhBY/n5n4+Hu/KerbyKIdEWVGGRW1tT3d0LG5q+k1z8x30oIMjOIIyvkR3rovI3S/wCIcxhQJOYk9uiWg9z/Ecp0YQiGM4muej3jeYx7mMBwdyLot5nQzvso4vRPDlvWbPmlhVmSDo2fNzQ4fevnHj8wsXXppKbW1vr50796y8vI4jj7yzS5fBgwYddfTR99TVrXjyyQu2bl1TV7f8scfOKikZdNhhv8/L61ZRMfn44+/Lycl74YXTN2+eX1v7wSuvfD4//4jy8p8Q5OfvMWDAA/H4wAULzty2bUZt7ROLF3+ltPT8Hj2+iZycAX363BSPT37jjQvWrXt26dJ758//xaRJ39ljjwuRm9t1//2vGzfuHKZSGwRdkEiMyc+/oKFhWmXl2Rs3fiWd7sdRNBQVlUyefEg6nY5W4cfwCo9HckuvMpiQPFbRxAhCGlhHC4tIk0cvxpJgCriWd0CGm1nNhfThi/Ticl4Da7mMoXyDQVxbVzfgmWfOXbnyOSxZ8vjLL19WWnpJ9+5fzssb2a/f/WE45s03z9mw4XksWvS7Zcv+xPfYj2F8P50+kIbW1qCj44ny8i+Ul1+6qfbsow+/ZJcM/v+z+LeujAaLV+zCjH624hfX3zR23KhdDvX/47j5xj/cetN9ubnHxuNDm5vvCsOOnJzBhYVH1tffk8mUsIbjKOZ9VnIctcR4l73YQndaWE4PTmQbL1Hfq9eFiUS3VGrjtm0vUFxRcW0iURHB0f7SUqnK6uofdHQ0lZYeHYsVB0G8o2PTli0P05NsLrWSPE6ghafJoR+trGEPNrCFiRTzFj3Yh5zom23gvQhCOiECq2ULpRvZL/L7eZFzwSxWMZQVjI2+12wGUEiKhRwa0bo/ooBNDI4oLy9F5PSAhSxnOCvYhx7U8h6Hk6GqoqL2ljt+9Xeuzt9/359vufF5difNkq9efvz5F5yxo7e6uuaVl9+45cbNfJGl3EzliBEnjRp1znvv3VBZubyoaErXrt/OZNq2bv15c3MjEyLoQgmLeS+qai9nb2b36nXE1q3vp1I9qQqCjtLSCzs6qhobp/bsOaKwsPfata+Ulx9HWFm5gAHkk08NC+jgyIgm9RC7s5rB7EYDT3Bg5EF/QTT8NL9kPV+gL/N4mgIqmM2x9ORNDuLBIBgWBAeE4XM9ety8deu30+n1OTnnpFKPZzITqQuC+Xl5P04kDkBb22/a25/kzMin5+EIxdFOFQUcxpsc+Qly1Yc8xyQWcPwnYMSreZEKajmFiuj1NrCZVyJH3GN3BpimaOM9ltCPQ7KqnCCI/phXVlbRu/dFYdixYcOv6uunB0EwePAR48df8Z/Ohw8/vHXx4keCIDZ69HkjRpy5804sX/70nDk3x+PF3btfXFx8cNT1lw2ammZu2nRjGHb06vW9/PzxCMPUjuuxrW3Z5s2/y8lp3W+/q7t0GUyQBZgGQRCGmebm2vfe+1V9fSo393DiYZgKw21tbdMymQznEfBiz57bU6lUeXmvxYtzI2BDBwsjjaSh5FPLNnKjE2MFA9hMP1bRSn96k2EZk0AN8xlHNcWcsnOmsYTnGcf7HM0pOx+w97mvomJ0ZeW7ZWU/KSo6rHNfY+P0zZt/1b37qNralXwzOnt3xHs82qfPGT17/gUqkE43VVb+5uzz+n7t8i/aFf+Xo27oP4sZ7f7pJYS7dEY/c23suFHz5y361Ifx79v6VpSH4cTW1qdSqQ+CII992ts3NzQ8Eotl4Z5DoxrGKLpF4n/5HM0CcmiKCkj1kWH08RTU1T3W3l6dTPYuKBiTyQRVVT9IpSqDICcIkkGQCIJ4U9N7a9deSEEy2TUeLyXT2rp4y5apUTkkq0Q4nIAHeITiqCqZiBCcfenHTN5j90judAeEtBeH0R5V7HKZQDsNHE0JscgRNCsMOYEDWMGUaFU3m2RkFxOzN78Y9bzPAC7mErYxg1ZyaSbGG9TxeY5nX6azKiocZlh28SV7Tn3m/j7lZX9zajZW1zxw359vufFNdgdxRt1y4+s3XPe7HRtcf+1vbrkxj+ytcTj/wb5duw5Lp1Pdu48oLT27a9dvIxbL7d79mi5d9uQ1CuidZc9QQhVVjGEp6uuXpFL9WU0PmsIwnUj07tLl4i1b6tavf3vAgPMLCgYkk12DoJp32ARC4oxjauQelCGf/ZjNzAhCOoiTeYsrqaWSr5Hiqog5NI6vkmQeZ9M3W6zlziDYLwgOyta5N28+KwxTubkXBEFeGHawORbbWFBwezYTRW7ut/Lyvkd2weQgvk8fchhOIQfxFkMYEgENd7TdGMxKuvxXINGyaDztO3N3shCRArYxgGq27owtKaSDjxnHx6yIkvgdeMrNvFlTs27x4rNTqU35+cPS6eaOjsYgSHxiDBKJgjBMJxJ5W7YsTyYLk8nCZLJgR2tp2RyL5SSTJY2NrxOPx0vj8dJ4vEu2tbTMSadjmczArVvv7ejYEosVxeNdow1Ktm9/MgjCIBg2Y8b3tm1bmUwWJBL5iUR+PJ4XhuH77/+6rm5jR0dhc/Pj6fRKWlpbn08mv52b++0geJIn6Ltp0wFduoxes2YdrRGcJkMWezOUAprYTDFDI+GLnuwVyQwPAqvYQCoSvQ8p4xAW0cK+ZHbGfw/hAGbThRGfAP6OZb/KytnJZL94/D/PaWHhlNzc4bW179LcyR94R1SQzgqUptNN6XRTEAR9+175/LPDL7noZ1Ubqj/1X+///zRheP89f25tad26ZdsjDz15w3U3/vY/bl+0cMmO3uenvfKza3592833zP1g/t+5z/g/VxaNf6oHZNcy/WcuevfutXGXQ/0/ERV9y2ni2Pb2mbFYUdZLqaOjNJ2upoVRFPIWrRQVFOwTBGtpoh+nUU9zdL/J6gIupYB4Xt6emzf/qbn541iskJYw7LZu3RcbG9/MfuimTbdUVX0nP/+AWKx7R8eWMEw3Nc3cvv2VZPL4KJVM0BgRiQroEfl5JthMyGY6KKIf7VQT3xk/msNqNjOY99gOukU/cdmF3bc5nydYTCxal89iVTcyiwPoxXaqwTbmcgAnE9CTr1DOixFM8xnK+EJUGNuHM1jMOsKKirqLL9nv74SKVlfXXHrJdTffOIfene6sHfSd+mT11y79SXV1zaWX/HT2rLN2ln/P5dvvvjt/6tTPbdjQt7j49DBMR62juPiskpIJvEItfyDOiVGdaQHlNLa19YuktS4Jw6/X1z+YSq0LgmQiUZaT0zWRKGxuXrt+/fQwvIMDmceCCMwwmhOYw8sg4HEG0oO3ouF14STiXM4VjOFicqPeVor5ClNYTDtvxuObguDwIBhCexguDcMNQVCSTB4bhmEms410MtmvoODWWKyCVlrDsCUMWxOJwwoLr47H/8haevEjhrGNdNYRnlXcyeYIa5hgC3cQcCKl3M2KzhPC3QzifPblj7zfqXc1dzCJS7mAJ3d2SJ/HHRzFZfyYOdzfiXc/m7s5kc+3t1+2ePGPqqp+N3r0NZMm/bGycu5LL13c3Px/EB3vv/+rpUv/fMQRvz3xxPvCsGPq1NO3bFm6o/ett65euXLGqFG3jRlzf2Fh79WrT29q+ktlKAxTGzZcUV+/mhv5XVvb2PXrz21oeDHbm05vWb/+bFL9+9/Zp8/Pi4rOeOWVryxZ8nC2d/v2Nc8+e2ZNTQu59A7DdBC83tLyUm7uDfH4AfH4QXl5t8Tjgyln29q177a0NFHDPJrIiaAyCbZGIPJiYqyhC4dRF22QJM1IalhFPrNppIXVTGQc9zBzZ/z327xOkr7cwPOdgL9J7gyC2XTk5Q2pqrp869Z7dxyujo7a9evPSSRaEomiXr325jqmdpq1hVxL35ycXvF4UdY7IBYr6OjYUln56/XrV1f0/U/qHJ/puOn3f3jisWmNjU3PT3u1V1nPCy783PEnHnHfPY8sXLAY1/30t7U1my/60jn7H7DPu2+/X7d5y9+zz9i/tR3okl3L9J+9OHj/k6e/NfVvb7cr/quo3FB96EHf4QCaeYXuHEnAR5HI6CBWsojd8vKSBQVTtm59NAzHMIwN8fg76XSGo1lICXPZjS1FRSNisaLt26cVF09salpSWPjFVGpRa+sLPXp8ubn5/ZaWj4uKTozFunV0rGlpmZVM9mhrq0omTwqCHu3tt3AQM+mghD6szyZhtLGFUlZE5Nz+NERCSyFTInpEB+9EMNbefMAMhhOjkkN5n2a+wkg+5ja6M4qnOYxl0VLscNqZyhIyFHNC5D4VIPpjLs/TnXHs0enoZrdp4u2Kivpb7/jF30+cnztnwZcv/i5FjCHeqaeJhcSfnnbb6ad8p729isvZIfpYz08rKnInTjzvxRevY0yPHj/PdoRhe13dD1taFkfuMntF/pPZmMmi6INOjrB62bg6P390GLbEYrXFxcNramr4bdT158giPM3poI3X2EQBw6ggxvtB0BSGB5JPBsxiBcdw3H/17e9jEYXJZDoeL2lr2y0IRoThrDCcxRdYHY9XxmIjOjpeiMVOymReiMdH5+ff0Pn9YbippeWHmUxjGF5IVj/1d8ynneEsZ3+Wso5jGcc8XmRMp2OylLfZl/2Yy+scxv4EhKzgKXpyJrN4lTPZsQRcxR9p43QWMp0vd1LcbOEO5nIGK3mLr0bw02w8PHhwryFDLsLixb+urn5+8uQf9et30IwZVzU1VR500HWlpQMQhj788O4PP/zjpElXDhx42Jtvfq+lJT506DXJZNfsXmpqnli9+jfdu19UUnLkhg3fTKWG8v1O59Kb/La4eEqXLqdXVX2zuPjgsrLv7BhBc/PcmpobunbtNXTo8R988Lv29gFMYWpFRbfKyiWx2Kjc3GuDoGfnY55KPZBK3cHI7t0b6uoGsIHVDKEnMxnGcnaLpMTWk+Q4VjA7ItX1Z0mkhLWKrfSgnhImRHiYSp4nh1PownMsZF/eih6P36WMSynml2yOx48Kw2m9en0llaretu3ZRKJvWdk1mUxDVdU3iooG5uaWtbSs6tv3lNbW6srKaalUd77GPB5gP7bycXn5Jb16nY/m5kUrV36ztHTM0GFt9z9063916n4W4567Hw6CYN26yq989cKePf8PQOWF51+rr28YMmTAzHfnXPaNfxjY0PBPL9MXf3oJ4a5k9LMYZ51+yW9vurZ3716f9kD+XWPqE89976rH2Y8VzKIHk2llOgNpog8zKcrJKS0pOTUM09u3P5FK9WBwEDxTVDSpoeEt+jCMOB+QW1AwuKBg/3R60/btT2cyzUVFl5NOp+taWh6Px0uKik7LPvd2dKxpapoWBEMSiaOz1ZFU6t4wDOlKf2rZSCHbKGc1xYxlBrtRTRMDWMtwqtnCvhTzJgM4IrrJhRHgryf1FNKbi9mhlVPPnVRRSx9inB4t1Gbf/jpvkMeZkSBU52R0KktJsRsnfOIAv8c7J59yzPd+8NW/f1Lmzlnw5Yt/TltWYygaamXWs5Tw6Wk3fu7Uq4qKJmzZMi0Mj+FiPuano0cfdMQR38P27RtffvmGqqqt3btfF4atmzZ9K5PJ53huZzIjP6HknwU1nsABnV4M6eAXOTm9c3JSjY37cXb0Ojbxez6gC4dQQpoYj7MnFaSo54OsExL5Ea3nbQKq6MklnQThG/gDNXQpKMgvLT1q8+bHU6m9WBGGdXyJgWAm9yUS34jHTwnD2o6OX1Kdn//TWGwI0un5LS3fYRCJMPwSSX5OI3lsYDhbI87+JhYyhGUc8AkIaR1vEmcTpzNm5yPWzPNspJ2zI2X4HScGXuBNyjk9UuQNOm3zHll49Hn0jrp2/Luqa9cPhgw5sWvXcVVVz3/88S+Kisq7dh24777fSSazheQg6wK6cePcOXNuS6Xai4omDhjwtXS6NbuTLNyztXXdmjU3NTVtCMNTOSHaf0f0KQ3cycyysquKiw+KXtyxspqqq7tr27Yn2CdrQlZR8fT9D/3+0IPOTSROzcm5MPoufylsZzIr29t/kMlsJdbJO2AJxWwlZDAFLKAfbZSRz4podX4DNSQ7KX9tYSX5HBfZDeyIl5hPv0jaNsU8To56Z7KBoiAoicdPyWQWJZMrunY9NdtXX/9ia+vSIEiUlIzs3n2/urq3YrF4r17Zr2/jxpe2bfuYNIdQwWucymMFBd27dz9+w4Zfl5aOLSgYfPKpxbtgozti3drK/gMqfnrNr7PJ6NtvzVqxfHVt7eZ1ayt/9vPvPfrI0xMmjm1pblm/vqpPRe8pUyYFseBv75SmfzoZLfwUMaOfovvTrvZptbHjRn0476NPfRj/vu3kU4+5/6Gv8TwFdDCap2ihhdHx+DaWZVfM0+lNjY0vBEG8uPgY5jIvDNsLCvYuLT0hkv/MZQp57e3rUqkNQVBYUnJyGLY3Nd2TydTF471isa6JRF+SYZhqa5vT2PhiGIaJxNFkSKTTM8Kwkb4MIqAXSbaQpprPcwofZRUlGUxPVkTFtnL68i7vMYmDaeA9VtNKH86I5BKP5BJiNNJEM0m+xkQCRvB5CiPQW3vkdr0n/bi3k6VhSAO3s4pBlFPJH3a2gnyOGUyaPev9f2hSyvv0IqQfhXxAFStZSm96ZVOi8j498vOHlpV9PpmcyVf4zgEHnJ/NRFFS0vu00343Zsz4mprzamsvzmT6clJE8JrFC4QRuqmVaawhw4vcRHu0yrmZ6+jS3r6ksXF9hBNNkhMJNi1lKFN4ko8o7KRCEFLJdEqYxBH042WaaCPGkaS4hsVgNT+lhUNIlZYeHQTxMEyH4ZowTPL9KBPFPvwwnX4rk5kXBL2Syf8IggObmi5MpZ5vb3+4uflSRgbBgaRYyTfAUdGx3ZcYKcJIqKuarlFNvXN0pxupyBMyjCY9G9mLZRvb2LqzmmYuCdZRzlpmUdxJPaCIOO/SwUYeJRa9XkghaR7YurXugw/uqap6vqCgbzyel0x2a2qqSaWadoiJ5uQUJJMFra31DQ2VpaW71dW90dS0LJnsmkyWJpOliUSXRKJLY+PixsZFicQhPMi8aP9d6EIJ03mHs2tqrt++/cVYrDAWK4jF8mOxvFgsb8uW+7Zvf2bkyCvZQH1FxYyTTz08e052dLzY0nJRJrN+RyaaTs9qbf1iItGbDvIioHYxE6Pl1t0pinDVCVKUMJtukVBoGYOIsTJKl7uRZCwDIv3gHW0/xlLFAZFjXCGtpEkxjpFBUBSPn0BDGC4knkptzmRaM5mm4uID8/KGFRb27959SktL5fbtH6dS21tbq9Pp1o6O5l69Ds7N7cZ+DGQpVSzlW83NPdavv6Fnz4O7ddsvldr6qf9o//+q9R/Qp/N/Bw7sO3rMiBEjhhF2pFLt7e2//+1dq1ev6z+gYuWKNT/8/s/DMPP37PafAYzG/rJM/6kdk12Y0c9ilPXutbF6F2z0n4qJk/Z67Y2bKyqySec8+vEhQTz+XM+eFyYSmUSiMBZbFo/nxmJN9fV/CsMUeveuIJnJNOXmDikunsIsVoLSjo6gvv6R9vbl8Xh3gkymX1PTQx0dS2Ox7plMC2Fz86stLbM5jQ7CMGzo6HgsnV5Gr4j30MDC6G7Xwv6RK/2JlEW3q97sRjqCnRXQJ0pBslz47cxkHnksZGMn/8Ydt/8CCniOaZzCa8yMqCc7kGfvMZ98xvIiT4AF3EjAAQR0cBgF3MVymrg3KrkVVVbWfe3S7/6D0xKCMvqxlA0Mogsxguqqmg3r13Z0bIvF8nv2PC2ZbE0m87p1G/CfdhEEQV5ebhgOy809lhTvETKCbTzGJlbyKO1RgWos9fyEZbzNf9CD/sQ4nhRf4C0e5EpKGMEZjOUi1vASrdkR8jFzolJonOk0sYE3ogJqwD4M5iae4j+oYDwx0mGYamtbn8k0kMtlnRjo2agIwwtSqQczmZlh2BiPn51M/rKt7f62tluD4Pgg2JckKX7NYPYnHiWgAfXMoooUGziHkTy1sxpoK0+T4YscxcO83ql3O7eyJUqpn+C3EQsHtXyXLvyaW6jl21RFveu5jBbyOIBWvhFJSmE1V7IHP+PaRYtWvv/+V4YNu2DffW8tKdnrqafOXbny5R2DWLDgvnfeuX7s2G/tu+91I0acvWjRpdXVj+zoXbfutjVrbsrPvzYv78q8vG/z8074CtzI41zPufystvb+DRu+mcm0Zvs2bvxpa+v0SZNu69//5MmTry0pmfW1y4+PaoHFnBuGXVpbL+zoeBqp1J/a2r6Vl3cQIb3ZFEF+swWwBPnksJUavk4/OlgPqlgRPfw0UUKGhdETXQEf80c2d0IDbuEPUQIaZz4JDuMplpIkl7og6B6GTen0E336TOrX77C6untbWhbEYoWxWH4qVZOT06upaWVV1RNHHPHVvfc+cM2ah+rrP0okCmKxnFRqO134IB5f3qfPLV279uUXvM1RW7Z8uHnzG7W1Lz/+6KxdGk//XfTt12fv8WOOP/GIk0855tVX3hw4qN8xxx56znmn7jt5/IVfOKNLl+L166r+9l7+zaWddiWjn8XoXd6rZheH6Z+Oir7l9z/0y5NPOeb+h34YrVZ3S6fV1T0cjxcPHTpm1Kgp7e11ffueXFDQfdu2B4Mgp7Cw/6BBp2zZ8lBb28pYrJB+rGU+uTRxYGPj601NbwRBkt05vKXl2VisJAybGxr+nEo1cS6lCMP6jo5HMhkcRIJmNrGIYtYzlgpeiogLxZxOa3QzKwBbqOoEeW/kcYroz57U8QfWcykncwjX7UwxuZnpfJX9+TpzuT/KBfE00yNxpa7swyp+z+MMi1Yk4xHHfwJjeIzbwaHkRYs2/0CUl5cdf8K+kfRptqjWhS5k2DRxUv/yPmXl5RUbN/6hqWl+LFYQhpmxYw946qmrZs26P9pH+MwzP1i8+N2BA8cQtrU18BqzQcBQcpnKa3RnSPT7GTCcHtzEnxnNHp1+Wicwmh9zL2WM4/AdQ+ZiinmUMFpjHU8JIUcxkVn8nBvo2umYjORYXmEie5CmhY6WluWbNz+eTn+OVq6NmPs7opLvUUluEBQFQVE6/UwQtAXBiCAYSHsYzgrDVUyOyNorqCWPPzGUE/mYrdFJuD+n8D5Zjt1mHqMf51PEXlzCEu6kgUXcTB6TI9ef06njh6xgMT/hEH4YiZH9ir25grd5gx/Sh/1pj4Qp9uYGnuZ1ruZkLo++5vn8eM2a11paqkeOvGzPPX/0zju/mj3790Hgvfd+vXDhn6ZM+fWgQSdg+PBzDjzwps2bn/j448vS6YaVK3+2cePLBQW3JRKHIJk8prDwnnh8NRezjmv4kN9GGNkJ3N7cnL969SnNzXM2bPh6LLZ+0qQ7unQZgZKS3SZP/uPtty69+cY/TH3yuQhTcQgntrf/rq3tilTqtvz8ExKJYZnMdi5lAqUsYTNophub2ZPf0pNlEf8vwR4UsJjN0dLKUPqwjLWR+kEp90SMsUU8QA8CSphJP67iKL7PZmbQTDPl6fSfBg06aeTI7wwadN748bek02u3bn0qnW5Ipxtycrpu3PjcqadeO378qVOmXHjeeTelUisqK5/u6GjMZNqoTSbr+/S5JT9/bLduF5WX/yiRGExBR8ex9fXbhw8/+pRT7vjNr9753nd+9g9d1J+FePnFN7ZtrUeYCT+c91H/AX0PO3z/1197a9nSlWhqal63rrJ7j65/z65i/8589mDJivc+1QHsik8hNm6sPev0L09/68lPeyD/e6JyQ/X3rrp+9qztVFMRBKsHDBg+duwR77zzWHHxEclkl/r6hRs3vtS//wklJbsRLl9+Tzzet7m5lnJWRiu/p9DAjFgszGQOYjA1PBMEHWG4J/vQTg73B0EsDPtG5bfFbM/65bCdw2jiQ/bjjYiOvYLXIlOoAVlyFRtppoINdGOPTpqj2EhDJIGEZTzKXpzI7yjhrE7IxWYeppozeY7t7E8zK+hLSIYPGUEf0mSYQyvjKCGgmsUcRIYYS9g4cdLuN996/T80Ec9Ne+UnV98VsbgS9Kmo6Dj2uElfvPhcnHrS12tr92xvfyY/f1AqVbPXXuOLi7u9884zPXsOP/TQKx977PJ4PJgy5YylS99bsaKdWooIWJ590iCkkiT9SbOa7fSljByW0IWRtDKHRgYwhgRvU8B+9PwE2BEreJKejI3uCO9QzBkU8SKnMYYF3Mze0TQ9zlHkUcdaTuc+Do+AgPfxEl+Ikqe3eJRycpPJy4KgLJX6ZiwWj8V6dHR0BMEhYfhcGNbQnb4MYR5LKaWaA+jBAsrYf+fjvZ1pbKOBgztJ7u+IaSygnRGMIuAxzopOxfcjLdvzo/d2Piwfcjt1TIm4dPd2giZXR6r4V0SMq6DT25vy86eOGjWxe/e9Wlo2Ll58U1tbVSJRstde3y4q6ofm5o0bNrw+ZMipmUxq+fJH1q59LZ3eIzf34iDo2mkAKYJU6vW2tt9xDGdFwhGdP2g2vxw48ORhwy7xF53RYMcfdXXvz5v3H+n0SPbILmiQ5o8FBafF473S6Q0tLTPD8HLeoYmDuYcWttGTMZzAcn7PIBYzgC2Rf/1WVpGgb4SXaI4kSLNg3FrepydVDKecBSQYyfk7z9GDzCAIgi7Dh5/fr9+pOzrCMLNkya8rK18Iw7aCgtLTTvtZ//478KnS6dSLL/5mwYKX0ukwP39MWdm18fgOTLlMpm3z5t80NNQyiXl9+jSddNLNq1e/tWLlgz+6+isTJ+31iVPlMxe//tXtF33p7JUr1jz0wBOpVCqdzux/wKSzzjkZtTWbf//bu7Zs2ZZMJs6/8HPjJ+xZW7v5d7++8/pffP+v7DA9dN9/7Al+5wiIf3oJ4a7K6GcxstSlXQJP/8Ko6Ft+/0M3TZxURDsVYTiypmbDypVz8/OLNm58sbW1tkuX0fn5fTZufLmq6lWCLl1GtLauJ0WMIeTSRjOFHJnJJFjLeso4Igxj7JMFifIy28NwdwaSppnt1BKSy2kUR3sr5UQyUV7SK5KjX0pAmv50Zw2D2GvnTBS9KeG3LKOFfnyZDfyQfTiHGM0RUjbGOYzj1sjSM5/u7MGHtEU77yDDdt6kP8fyJqvJjUyYmmllFrXEKzds/Ecn4tjjDr/9zh+yOsvEqqho/eLFJ2QzUYRhGI/3zcv7QltbUybTnslkevToc+yxFzU1VT3wwIU9evSeMuVzYZgJgqCib2PkkJ6VoNoaIUSzv5kplkZ/17MkskHK/ncGPUATr0TF2g1Mx85AyRwW8TSHEmMLLcxiAp/naeo5nN8zi2H8gPnRdGfbWubxFQ7hJlazCFzAl7mbp3iaB9iNYaQzmffa28+Px0vz8k4Mw1ZyM5mHw3Ar59NIguks4TjaiNOXD9jMgJ1FRlFCRaQC9n8SkU6RE4lYjciuJh9/wpGsiiZ6LLvRznvkU9oJnVkScfkHM5Q0048/4RBmRseznDGU8AsWUdBJhTSXe1taXk6lticSBclkSUtLTTzef8uWxdu2LUsk8tvatr399s8+/njza699uaFh3bp1r5SWju3omN7R8XoQFAdBcbZyHARdM5mN7e13xePH8SY3dYKp5JPPUn5dUnJ6ZeWsDz74ZkdHYyyWE4slY7FEEMQ3bXp33rzvpdNDg+AwHokMe9EeBF1SqSXNza+G4Wm8Q4yDwecZF5ksHMDr/JJ+FLE37ZFmcIYS9iQdSeKjgMLoQsvQnSMi5llFpGo8sFMmGkZPiWdzHOny8kkVFSdmXekzmVQm0x6GHbvtdnmfPkfF48WjRh3au/fu6XRqRwvDcPLkc7t27R2PFyQSPWKx3DBsC8O27N5jsdyiogODYBGVjK2qGvTkk5eXl++57z7X3vS7OU9NfeEfuaz/d8YV3/5yaWnJ3uPH/Ob3P7np1utvveOGbCaKXmU9rrvhe7fd+Ysbb7lu/IQ90bNn929ccfFf32Hsryo3/c32KS/T/zNF3V3t37f17t3rUx/D/772wEO3VFR0ZzndWlqGLFz4RktLYzrda926hxoalsbj+QMHjkunq9aseTyZLIzFSpPJHqwnRgUhs1hKInLvfI/FFESsoI08SVHkhJShjjnswxhyOYQYOayhlSramEIue1BBO2PoRyaC6/WkhFUs+MSPw0rmUcarvBNJGK5mHM+yYee7ch5v8goH8BGLIl3DLhzK+siGKkureouDOZdJfJMaZhEnJBHBTw/O3iz/B7Ow995jnpl25/gJAysqim+745rjjjt8R1d5eWkmU4ucnKPDsHDp0g/WrPm4ra0ZPXpc0NCwNQhiq1d/uHz5+7HAAw/9x/gJ+VGmNYRkVuWeIDKUyuom7k4hC6Lf87cZQlcC9qE3rxPSnUZuYW2ng/wGz3Eax/A1GpnN4ZxEGd/gQ35OIQPJpyxSsV0BtkdWPdkJzeMLPMVc2pnI71nNS0ykT9ZKIJ1+KJkcm5t7SNagNQzX0I2zIpbMBlo5IXo8iLE+YvH/iXmddEYxjcV8g8/zMn/e+RR6nHn0JEmsomLNxZdM/PHVV9xx5+m8HtHgmhlBDZ+PVPcRcg3zGJT1Jq2omHvxJZN/fPUVz0z7yfgJSyP+1jYKGcvVPBS9t40fBsFHjMvPL9+27eMZM84tLNxr+PBfDR9+/Ycf3vbaaxe98MIVzc1Hskdz87EzZvy6pGTcqFHX7L33XYnEq83NXw7D7Fq5VOqZ5uZL4vEzEonv5OTcG4vh/OgcwJN8p1u3S7p1+2qfPg+kUgNmzDiztvatv1w8K++dO/eqdPoE6tk/CG7mY+bTQDKT2dDa+gpH8yilEUo4G+P4ErvxA/7EngyhJTo4vZhLXXSydVDKcqqpZCjtvMY24iRppZCNzON46vlWhFPPXhMxHuQ1vlFVtebtt09paFgaiyVjsWQslhOGmTlzLtu4sTIn5+65czfceuuZNTXL4/FkttXWrrz77i/EYpN23/2OINiybt25bW2rguAvDK1t2x6urv52MtmfChbySixWlJdXsmbNOwsW/HnD+spP/ef636vFgqCsV4+/sc0/3T7N77h01zL9ZzJuuP6mseP2OOrogz/tgfxvi+9+52dTn3yDHEbyDj3y80fHYgVNTc917bp3cXFqzz2PmDv3uZqadWGYV1T0+fb2hS0tMxnIAiazlrzo8tyd5xjPLM7nMbrQgxrKCFhOL6awlkUcQxPvErKZHAYxgZcoogebI8GXRmbSjT5spIw1BOwVrZ8uoI69KQNL2UiMM+nHuzzNKZ2WZR/kY45mIDWRruEhkUbjbJbRla5UcnbkM56NNh5mFR00swdDiVdUzHvqmdv/5RN0150P/vHuJTk5B7S2PhKPD0+lphcUVPTp873Cwj23b3+rqupX6XSirOxnsVhhMnnXT6497dE/P/PsMy9FMNCtrCdOP7rRzqKsiE+E+MxlJF1oZi7Hgho+oCe9qWIjRzCRp1nHuZH01RYe4DiG7zzk7NG+jWZ+EHkd9eZD8lnHeE5mDO9zHYM4i1Gs4d5sjZk9CFnNpkRiUG7uoWHYnk6vaGt7jclR1a2W5yhnP1I08ywFF19ySnV1zbPPbCZkAX05lQ6mkst5dInG/2e2cBqF3EcD+/Ahwysq6r908XHHHvcXvGx1dc1Pf/KbD94vYimD2I15fMSXmcwVkVfqLLpWVNTfdsc1nRVn77rzwTvvmEszxezNZl6nL9/iuxRwHLMGDBi8bt3Uvn2/VFHxl3Lg2rU3VVcv4vidj/D0QYNGDBp0URiGS5f+qqrq5fz8H2cyK9va/pBIfD8eP3bHdh0df0yn7+arbA6Cx3r0+Glh4f/5CW1oeLau7peDB5+bTjevXTuVE+jCw0Hw/ayiahieQ0EsVpfJpBjF2yQ4PYIZdI6nmc/wqPA8l9JIy7aSOZRQxmL2isr2B0TX41u8Fj1/vsRefMjZ0adM52XOjKR2b2UDl0RX+gs8u9tulw0YcGZLS9WcOV9PpfbIybk6O6ZU6p5U6g+HH375pElnrFjx7qOPfq937y/07n1BNKd/rK6+u3v3y0tLz9iy5Y6tWx8oLj6rqenNTKYvs5i8++6lXbr0nTXrztGjD//Od0/atVL/L4/Y0H3/yT1kPr2EcFcy+hmNF1+Y/uG8j777/cs+7YH8r4rKDdXnnfPtyso022gixai8vML8/AM6Oqqbm1/o2bPr+PEnElRWLpk37+XCwpPi8Z6ZTEtj4yOk2YPFlNFCkpEU8DS5tLIPTWwkEQSFVIbh3mxgM5OYxVE8w0Am8iCf4zVyKCCPJtbRK8qrXo8WoIujHHcZdYxjKfmdEtNsVFHHl6L/ruDP7MYx/JE4R3aCkHbwYqQjM49m9mMxzVz636znPs677ENPMgS8/v6c/yuw5rlzFlz6lVvDMEW8sLCsf/8fJhJZ1J329qrKytuLik7Ozx+HTZt+df6F3dvb0nfe8Qw9yGNdlIym2ExXNtGPHJZFto31rI/47+Mo5F2S0f2+gVXRW06NDtoGnuKSLEHtE/EhL1DHYPbiI87lIVZwJGv5HB/xIBNoiwTqN7OCftQzhrm0MSiZjOXkHNDePjOVms1QBrN7RORv4yC6UlVRseLHV19WXV1z7HGH33Xng3fekdW/7GA+YVRlP/sTQ32W18mlC6OIMZP8k0+Z8P0ffP0/bXrXnQ/eecfTjIkkqDbyJrn0ZGJWT6CiouS2O37wSe+DuXMWXHLxzxge5VhpZkWi8ftlwQaJRNXAgZd37XogCLZsmb5y5dtMJvjkEc7LWzB8+De7dNlj8+b3Vq26o60tkUhcFYsN7lS7QZDJrOro+EU83t6r1/WJRN9IbeAvINF0euumTT9ua1vBaXShkg9ZTR/KWMZ+Ue28nfWMYC5TdnYF+1P0zLM39cxlUCcxUbRG9dEYQ6mKaGc7YjXPRL72BZxD/069KyOMMuJctPOVvpSHunbt19CwnGNzci7v1CWd/iCV+mXv3iVVVYv797+qR48TOvc2NHywbt0v6NLevrKo6KRYrLS+/j5STCLTo8fWLVtWTphwSk3Nimuv++KuZPRfHskoGf2fIUcDUrswo7vi/33swoz+a+OmG/9wyEFXVFYewekMoggk29oq29o+TCTK8/MP3L59y7vv/rm5ub5Hj36kysrWt7V9EI93D4JMEJTGYuvZl1MZGtmxvMyJHM9uzIrHM2zq1m2vINgQi/WmlcPZPWJyPM5E9otUllKcSAGVbGQTB9CX2TSQYCiF1Eb4v6H05wMqmLzz/Ql96M8tVNJCBV9mK79kKMeSyNpLRuKFR7Avz9OVIylhIB38nnU777mRW6NVyPLI1/Q1Rp50whcbGhr/+mGvrq557dUZnf/7N9+y195jpj79k0xmS2FhrwEDro7Hu2TNP8OwI5nsWV5+wdatdzQ3z8xkWrt3v/yxPw+c/+HHz0z7/fgJJTRGv5nNkTHVQRxFXSep1Fo2MZ5GCpgeSRS100qKfIaxjq20ReBRpLlhZ7GkbLzKPUyJcL1ZtMM11HJ8ZAj5KI9wIP1o5QF6ciEHsoYE75DHGTSRbGt7IZVawBfYRiKyRDqEVgKWTZy09aln7tpr7zHZWmZ1dU0nmafdIp3a/p8YKvqRJJ/REd+rhf2mPrnpq58Q6vrSxefeceePqGEzLXRnf1KRnfqiiZN6P/XMjf+lC9dee495ZtpN4ydkeWOIM4Z2DiTkXVZ3dGxvaVkfjxfE4wXxeP6mTc/zPg/TuvPO3uH51taR8+ffvH79nzdtmh6L5RYXl3Z03BSGDZR0UjzNSafvycsrys8fvnHj19vbP45ERnODICcMWzdv/kkqtY3d6MoyptLAlXye1UxhIxP4Bb+ikAEcxkJuoobm6AI5hnqaIhLSsEguNIu6zmGPSI9iKUfsnIliEJfRhSRnRcicHW0gF9FKLYdF8IwsFqidgXxu69Yl6XRePL53p9fbaY/HR8fjR1RXL4vF8hOJLv9pUoqLxxcUDG9rW1xcfHY8XtbaOos2Jmaf2bZtWzNx4mlFRd0bGup2ZaL/N+KfX6b/dAe/Kz6LcdTRB384b9GnPYr/JVG5ofqmG/9w840LOS3KQQ+LmNELwzDe3LyipeXNIChKpdpyc7vNmPHA9u2bUFExsrR0W3Pz00GQH4tNymQSbKaZsZzBas6kC8VZVZcwXEk8k2nKZNLpdJa9hHEcRwvHM4hWasiNTFwmM5YUB5JHL7pFGM0ORtOPFVRG0NU4K5nziW+5gjdIdcKJfsBKRvI2GzvRR7IMkgW8zESWMo84JeRSxG872ZSv4nqamRhxjdcwnYM5u7LyrPPOuW7JkuX/3ZGvrq75yiU/+u5VT2cTnerqmq9c8uPzzrn6r7wlG+XlZdf85NKGhm2LF3+uqWleEMSDIBEEibq6p5Yt+3x7e04Q5MZiefX1j9bU/HzDhu3l5WU/vvrr4yeUREWydZxCV+KURuI7cQKqIjBDDnuyB7MjIdglEUMoi14o2PlQFNCPWyKeUzYe5dWIn3QBu/Ecy4hxBLnE2MYSjqRXZAB7AZPA4ZzHNso4Kjvpmcymjo5WzosqnZv5kFPpGSElcis3bOuc0//46iuu+clhfEwryzmHr/Mat0f6XNmYxj30IYeQNdRyId0ZM3tW75NOuPQ/Tc1ee495ZtqPxk/YSBXJiOuWYd7Fl4y55dYb/vok3nb7jy6+ZChvE9Ia8XveJSDJ5MrKJz/66IttbdUgxnnEuJXV0W5eZianMppTVq9evH374nHj7hw37vY+fca2t5+bTr+S3S4Mq9rbzy4sLOzb99by8mu7dz9348bL6uv/glVtb19VWXlWKtUeBDl0Zz7NDOVbHMAkfswihnAVIkQ1ijmEfG7md+RzbEQd25wtV/EyG4iTIMZmXqUPoynkT7y287Fp5h7q6MudvLRzyrGeG0nRl5uYFmkDZx9i34zF7ovHe1RU7N3WdlUqdWf0eg45bW2/C8MnwzDdrdsBq1b9oLLy5h0fmcm0Ll9+eWvrMuKxWElj47RkMjNixD0FBW28h46O/TZvXrtw4ct5ecXnnfPVvzKzu+J/FruS0V3xbxYbN9be+8c/494//vnFF6b/ze13xV+P71513c03buTA6IUsTXWvaLlwE42trR+3tr6XSjXvvvsRQ4bsP2vWE/F4cu3aD7dure7de0AQBHxMTxYxlTqKott8hpm08cVMZiLpbduy6Mx96MUzbI9Uh7qSZC2vs0fkL5/lg6fJp5WP6MpBNNNOyFAmsjrixCTYk+1Mj5JdzOcjRnZi3D/IB5zBwRzEkzvnr6/wLkczntOo42Vy6GAYo/kTz/IqN9KPiVH6UssiLopcy8srK88975z7Otc+d8TcOQtOOO4blZVDGDB7Vt5JJ3z5hOO+WVl5eGXl0eedc9t99/35k2/5RFSk03uvXPn1zZsfRVXVjZWVv4/Hj85WhTdt+uWWLXcyNltIKy8vu+32Xx5/wngyFPIQG8BLrOZLETmsjLvZElWh+nJwxC7qy2qqohLjCMbyKM+AgH7sxTRuo4M7IkX30dGAD+UCerM/z7GB52mnN7nMZTFfi7w0szGSK8hhA5XUpNP5nEKSejqojKRDU5TxET+urLz6vHNu6Zw4Hnvc4XfceSXL+Br7M5rrKeKnESXrQaaTraUlWUwbx0RVtxQ9KysnnnfO7z45m6edduzFlwxlNu0UMuvkU3b7UqSB8NfjSxefe8edF/MsrRRVVCxkQ0TXy+OoxsaW+fPP2bJleiaDBEczmod5lydZyZmdrKomt7VNmTPn0tbW6qFDLx8x4geZzA0dHb/PZOa3t19YWrp/efm1QRBD165n9et3a2Pjs9XVX21sfHHjxq/QPyfn4DDcRoK5VEVq/KIT+0TOpDFqaKSDdkZFTLjD6eAjihhASP9oyWI2WM6bjGQkXcljAnO5PZIprSWbI8Yp4kjmcyM1YBZ3MZrtFHEQs7iOSvAkzxQUnJRObygqGrDbbhcmEq+2tJyXyaxAW9v3ea1nz5OCIFFcPLpv389v2/baxx+f29y8rL1946JFZ6ZStV267BWPd21qeqGoqO+wYTfl5++2++43l5UdQ28uXLFizNatdSec8IPRe3z17DOu2iWD/6+NHYCS/1km+knwyv/Twe/CjH5mYxeH6V8V3/3Oz6Y++TyTmRy91hbdHS+KbHsa6BmLbdlnn/Nyc4u3b6/58MPHSkqGDBhwFNrbt9fUzK6r+4gD6ca77MlLnMu7rKKCQyjiT4yiNyHZ+26MA3iJU1kW5UC9yOFlejCe6UxhNjkcQFdmJhLVHR1Zwk2M1xhEHe3sRh8WUMOkqJ63J7lUMp7XKI30m7KRzYp6chTP0czhkR4kMrzOuoj7jEbm0cGkSAUpw0v05xR60rYDpQfmnXxK+P0fXJLdXXV1zcsvv3Hzja92ytKQ4kMOjZaPZ558SuEncYo7Yu6cBZdc/CxjWc9zhYXDmppWJZMnU5rJLAiCZR0d9exNXkXFqqeeuSP7ruemvXLN1VPpxTo2UEYXTomsBAJCXmNG5PG4Fz14i0J60sKaCMKbTbibmUeSrlFKlGIBGcZHnpydD0VAG6/Rh7eIk0uKocziVEb8V5ixd3mV7fRmL4ZQzfMEHE13tvMSWwoLT2xqWsrN3BmLPXHiSUdlj+F99/355htncBndd97zUzxGTxoiUdVVBFQzdmeeOFp5jp4TJxVlq5733ffnm298jZKTT+l31FEHX3LxDQSMYt3XLj/4ggvO+O+m7z9FdXXNT3/y6+qq5tvu+BF++pNff/D+fI6KVirWRByy0yOH2y08TxEnfwKRkp2UPw8ceFKfPqelUtvWr3+otvbNsrIrCwsnd8aPkgnDsK7ujm3bnkgkJieTE8i0tv4hDFvI50jOi+ailh+Tz7d3do3/DZWRdOgsEuzHPIqpioTbsmy/9qia28R4KiJv1Y30A0up4VDepowRvMU4+oAPWM2hvMJ4ynieQ6PzdgFr2ScI5hYWnkxuU9NDo0d/IzvEysrX6uo+DIKKeLyxvPzs1tZ127fP6dPnnGxvXd3r27fPzckpy8vr0avXEVu2zKyvX9q16379+++Eyqivf2vt2ns6Oi4m5P7zzrt4wIBxr7568/iJBZft8qz/F0XxP01gavhUMaPhrvZZbTZW137aY/hf045mHo8RsoE76c3VDOQKhlFAfSaT9957d9fWLuvSpTw/v0tRUd9MpqOjo2X9+le2bq2jP4MpZAQvE2NGxLcYyOuR4noWevgWrfQnL3JaWs5AfsYYVkXPukN5n4BZ3MBhPMMaipPJXrm5uZE8e4wciiN/eezBkIibP5nCSNDnWXaPqLhZkdFWekRG9vfQg5PIi7paaWd/9mNLhPArYjDF9I60+l9nPJU0RiMpimQdM7w/9cl5J51w6ZIlywinPfvyzTc+w5BIczHbsryiqdSDfaY+mfvVS3/4301ZeZ8yNlOXFTZqavoomfxCEPRkaybzUUdHGwdmZy3yDQ8Jy8uzS+GtlLM7deRS2ClHQUeUlQ7kPVZH6/LIZfcIJJqKXplEyGZqaYvsxbPHZP7Oh6IwwqG+x2a+RV9qSTCD3vyR5zupL2Xbc0ylD8eSIpflPM6UCAu4gScYmpMzvFu373Tvfm4sdlZe3hv77nv76lV7n3LSl6qrN95840NMpmRnfGE74yijmX0ooIUGGunPUp6OSoAil6ZhfGn2rPEnnXD59df97uYbZ3EE+0x9cutPf/JbSphEGRNuvnH+Vy+96u+8AMvLe912+y9uu+OH5eW9sn9ffMm5rKeJVioYRStP0UCMHhSSyx9YtfNtsYZ76L9mzaqPP/5BTc2LGzdOD8Pkxo0/bWh4PTKjz0JFC7ZsuWfbtpeCoDCRGBeGW9vaHg7DFvbnW8zj22yKjD17U8TlPNfpswpYxruR8GoZ73Ekx/BFupOICtgx+karJW2IrNfyo4MwnHG8Sj9G0UhL1IvxHMYrTKE/GzudrhlGsh/vFxWdG4v1SKUWJhIF7e3bMplUOt1eVjZ5wIAT4vHG8vJzMpmW7dvnBkGyra06k2lNp5tKS/ctLd03kcjt2fPQlpYN9fUfJhKFXbsensm0hmFHGKayraRkn7Kyg+Pxm+nJFQ888NLUqVdPnnzOls2jzjrjO5Ubqj7tH/D/De1fsUz/6Q0+6FTa3dU+U23cuFEbN9Z+6sP4X9D69i2njeNp5g88zPFcFGkxxvgSBxBnW1HR0YsWPbdmzXu5ucVtbVva2uqWLn2wpaUwmRwT5T0LeINjyVDAHJLZ9/IyhTTzehAkI9J9G905mJ68wgLOpCvvR+KdWxnLIwzgPL7BdDoymdaePU8vKhrGbBJ0UMFufMwaYgzu5DaURXMuoxtriEfI0R1Q0SWsZSAfUrlzVx4rmB4pSs6JdPKzqeRa3uAIzuMEboscJrOxkuvpzVcrK88875zfLVmyvE+frLLVm5HXebYt5QN6RcnodJ6v3FD/381an/Jez067avyExVRHtbFUJrM0lXo+DPsRI0NlRUXl7Xdcu+Nde+895tlp142fEItU7ouo6rQGij+zhK9TwgDGR+XqejZFTwil4LXoSGaBgINYGLGdsgyhvXmER3dOle7mLQ6NNjuZPVjCbsQ5iTn8hq3R9vfyLsdl/R4jo4RXOJZBkXHXc+xNr7y8/VBQcHBZ2S25uaPT6baKiiMHDbruO1feTimP8CsynfCF7/ATigjJUMN8BhEjHnGYHmcti3magzgd9Kis7D31yS3RYkIDmysry5hAYTTyIbNn9TzphK8vWbL877wS+5SX7fj74ovPfXbadyoqlmWlPWmnhAlMjVhizQxmb6bybvShC/kTEziKfbZt233dumcYGQTd4vETamp+XV19DWF2040br926dSoHZR+92toez2SyvwNnUcFVEZFoOihkEodxJ9fRzg28zEkU82rkvXQy3WjkJlLsRyVVpKljPyazkndI0T8ybg1AHiEDqWUOIQv4MPpqIYlIN+NDvsgMFhEjQUssVhyLFTc3v1hQUD9+/FeXL7+vpubdeDwnkchvbq5MJErDsKO29un+/cfttdeZGzc+Ul8/Ox4vjMfz29qqc3J6Njevq6x8fOTIL44Yccby5V/fuPG+IEgEQTLbKitvral5MDrzH+T17t37FxR0XbJkxvJlH1dWVn/qP+P/C9o/n4x+uoPfFZ/RGDtu1C4O078kKirK2USK/aMSY59PbLWVDIPCsL209Jw1axYmk/kdHa1Ll/4pCMbn5h4VBAW08g7LOSVavB7CEnJZGlWhatnOqDBsoYh2ujOZb3MVn+fHXBxRi2JUcyVXso1t1LMXN7A1k2kKw3SXLgf06HFqVO7aiwPZI5Gojox8klGd72Ma+Apfpid3U93p273E+xzM3kzgeTqjwd7lDSaxF8cSixhUGVaymC9HpdaD+DrTuQu8yk0cxudAV75y3jmPPP98FicwkFlRWesD1jEuShSmMoeRUfXxv47y8rLbb7/+hBM6mIcw3HTMMRm6RwCDNZdcsvfTz9z7n9jc5eVlt99+3fgJOREp+3BKuT2y68QVDIjy+25Mif7IkujDaE/ZAvbCqPIacDi1LIy26cn+zOU6atnKD6PTIyuAkOIO5tCXvhGb6hRy+DmL+CkrOTrCDWeH9BZnMCB6VnmWIxiarU/U199dW/u1RKKipOSnH300ff786/LyevbseQlx9qOWb0XC74/zB3YjjxgbWcteFJCOisGD6ccrfMzZ7EcLtdxO2EludimrIq2xzlFcWbntphvv/SuT+Dfm944fj5+wjWW0UVJRsXj6Gw9cdnl/3qaVfIZzfJSDzuRljmK/aB8D+AItYdgYiw1NJi9qbFy0evWZra2L1q//yvbt73AhW2Ox0tbWP4ZhDidydKchnMoF3Mq9UZLdl9NYyTnM4wTyaWMkzZ20eG+hF4cwgJMjntkkiujJweTzCjW0U8UcGiIKVzMfREsKg8njFbbQED0WVvJD9uc68niLerbG492bmp4qK+t51FG3Dx163LHH3kvLypUPt7RsamnZnJ8/oLr6gd13P3rKlO/vttuJJ5xwbzLZWF39SHv7plRqa25ur+rqp8aP/+HQoWcOGnTyIYfc29Y2e/HiC1tbV2PNmp9t3vxMefmJ6fQA7mQGYwcM2OvJJ3+0bNmbQ4YMmbSLXP+viH9FZfRTi2DZinf/9la74n9pHLj/qW++9cSnPYp/+3jyiee/e9W9bGcKHzKIdzgrKl/VcSvb2J3tBQWl+fn7kGpsfKWtbVVe3onxeDmJdHp9a+uTDOSwyIP+D+SwG8UUMJNe7E4LH9LC2ZxMTSeRnRe5izSnIqqLXMoxOw/5Xh7v0uXAlpalXbsenUx2r6q6LR5PplI9OZzFOTmLunSZvGnTjIhyu5bBnNqJwPQGr3AUA3iOVqZE+Dxs4m26cxwvsokpUXqdjZksj9j9n48EOHdEPfewlTQnMuwTh3xuVMyrZ3HW+TPST90YLUHuQQ4LPpjzt8/wadNeuevOh4477rAvXXxudXXN8cd9raKi13HH7Zvl0FRX1/yX6kJ33fngHXc8G6XRa5jNOC6I+rfwJ/Low+y8vGRpad+NG7GUCtYyiQ6WRIyfwQwlw3tsoq1TWvMR1RHqdH/a2EwTC8hlALXsSSXjIkzkct5lIPtGqeFrpNnKaRHj7QXWcgpFxHg3kWjo6DiR7onEQ4lEbzb07XtRdfV9AwYc//HHz7AbWM4aDuIt9qIL69nMNvYmzUZqyKcPRcRZQyM9OJ8MDzKU9+jJkQTMoZ6V7N4pQ93OdLpOnNT71r9Kq/+bcdedD95xx4sVFRUPPvSjir7lmDVr7nnnfJ2TI9CkiKV30n91voVMj8WaEomj6UinZ6XTs+jFaeAt5pNgL06P1jHCTm9/jlcZwpDoWs5wP2dGuhOVHMbWrCYrGxnHntHb59HUCWmarZoHbOJj2hkSrQwMoSbyaF3FNsZHmmvLKKOOAr5Br07De4Kn6JlMdu3ff+jkyT/o/M0//PDOhQvvy83tmsnEx449c489zkIYfbm5c29fsODBeDw/Hs8dP/5HZWWTOr930aJbly17uLh4bEvLsr59z2ppWV9T805Uzp/ZvXt7S8u2Qw+9YOHCZ15+9eG/fzZ3xX8XPYZO/tsb/dXY/OklhLsqo5/p6N271y610X8+Jk0aRx7lvEgxjZzOEzzMW/yIBCeSy/rm5vebm2cEQV5u7vAgKIzH+xGmUh+2tk4jw8GRmuCzBIyOcGMbaGQYGyOzmYBH+DEV0UC+w9OcR89IpnQB+3FXVGhEmutzct4dOvT2gQOvLy09vLb2gZaW5bFYsmfPAwoLMzxMbiaTCkNsAZXsw1nk0Ba1fTmLV3mIIg4jr5POaAmHk8t9JDmCkghimN1gHH3Io/gTmSjipChmO0GkxNm5rSdBFfnsQRs9WU8NG8hjLxJsqajo8vfM4HHHHX77Hb/YQd+uqNitsrIsJzcH06a9cvxxv7n0ExqZOPa4w5+ddiOvRQqR51DH7yIH0W58jY0sKivrf9xxtx511M0jRgyhNKqDIsEedGErQaT2P5m9QX2EzhzOAIrZH8T4iPcoicjaMVawkDmRUeTw6N8MHbxGD1oISLCNR6NHixKaeYFNHR0TOY2DOzqubm9vHjDgsh49jhg69Lo1a7Iwxyw2dxD78Cb70TWyR0+SIIx858+K3BM2IeL7t/NL7mESFRxHyMPRNvmMYS0v08QaXqOYXn0ryv+eSfwr8aWLz73jzu88/cwvdmSIkybtNf2NRydOWh2hq2N0oZQneeMTO3iaxWGYBb8m4vFs3fRIYrwX1SMTrOOaTtCLbLufd0mzO7Mikd2m6MSeST3tvEILA6mKFNBEPL8EyyLpq2R0CcRYQ0hf8qmkF8tJMIgculPEe6wnjzGspjs/3jkTxal8j+29e5dNmnQlCMMwE4bpMMzsuedFe+/9tfb27X377rnbbsd3dKTS6fZMpj2dbkun2/bc88JRo87IZNp79hzbteuIHab2mUx7Ot0+ZMgZZWUTm5oW9et3bhim6+vn0xLV9esymfbDDvt8S0tDr7Ju/+T87ops/FtXRnclo5/p2LVS/y+Jir7lNLM3k1hKA/05j4+4L3o9FQETe7a0rNi+/clYrDAMW8i0tr7S3v4OxxPQQjVPUhoZTmbpyasIqeNDJtOHFs6gmi8xl0vI5TSKOZOtvM1ZtHIWb3NFVoGoS5fkbrvdU1g4GuXlX+7b96q6uqeDIJlOt/bte3LXroN5OZNp27z5OY5jb7Z3oht3zghr6KAgkjFK7KwzWsXK6Aa5uZNUYR4dzGUMXyXN1WzsdDhXcA29+Saf44+83qm3idtYzvCKipaoehoymh9QQq8IEV89cVL+08/88e+cxGzt8777Hj3+uJsqK7/I52+6seHEEy685uol/MfsWWefeMKViztJHVVV1fTpU1ZeXnbHnd9lDodzMD+mP9ezlDquIzN06J5HH31bUVEf7LPPN/fb7zxWU8h62klHXK65zI8AVF2JM4cl5ERgiRgdbOFZRnJthCPMAlIrOZO+vBJpcoXE2cJLjOQarqU/lTxBOeMIaOVF4vSnL8000z2T+dnSpR9s2HB3fv7AMWMe6NlzJG9THyWdMZJsZzZlWR1cVlLK2fRiAqezjVURQqCA/tFzC/I4iCFMjZ4u8iM+/gvMooIhUSHwn4299x6DkuKiDRuqt9c3oKJv+YMP3XTKKSXMBNvI42A+5p7oSayF+9jEiDCs7+h4JgxbaIvw3NNoixTp85lMX37Hy6CN/2AxUyJc5hZm8nbE0nuX7bRwNKdSzfwI6/Iur7OcruzPCSxjZlRwbeI1Ajoi66/unMBRkRBsGHkuTKKWj1nFaPL4Bgt2PjavcQNHr1/f/PjjJ1ZVzSIIglgQxIMgNnfurXPm3B2G161eHT722Gk1NXPj8ZxYLCcez43Hc9988+oNG2Ykk8Xbtq17+eUzNm+elzW1j8VyWlo2vv76he3tTbm5vVBVNbVnz71HjPgyL/Ack1pbi9asmf/WW4/Wbe560413/0tm+TMeu5LRXfHvGuPGjZq3Kxn9V8TESQNZRx/2p4qXIy/pAoYRsI6X6UMzR7S3t2/fPo321tbn0+nsymlX8qnjecZG3OQUHzOIA0iynMPpSW6Ucp1IHt9nJAd1GtGRHMJaWunC58gEwRV9+17Qv/+PgyCeybRmMm2ZTHvXrocPH/5gJtPW0dGAHj2m9O17aiaTjkgY/RjMSzy28zd+jJkcw4mU8nRU38rGHN5nj8it8U0WRl2NTGdf9qeA8xjB9RHN4mV+wxGRz+S+XMEs7iDDam4glRU8uuzyi044YTAr+SJnUsq3s7KgFRWtl1xywD+0tltdXXPffY/edGMNl0TMsyMqK89kWXbZtLLy6vPOefDVV98SZaK4775HL7n4dn7QyV78fE7mNm4id9Kk86dM+T6CQBDAsGEnHH/8HXl5XSKTniz6M8MebGQ6jVGJ9ORIwr2BkFw2M40T+C6T+B15kUn9+RTSjyamsYGQDl7lOC4F/fhFhGk+AOTxFOWMJk3Bzq2uru6FuXNPbmlZ26vXcbEYPmBtlBm38gGjIpmhFP04pRP0M/tI1o0WmuhgQkR12tFGsQfb2EKKDvpTTB96kmLNrFkLFv8tF4O/P0qKi5DNRys3VM+atZAWptFKHiUcQh53s4i7CNg/S//KZNZ1dNyfyVQRZzarGMs0SqNzZhQH8gK/4RqaOJpmClnMQfShltl0iyrox9KLXI5ifz5mIAdTSUW0WD+UcyniFSp5m5KIvVTNoKhMO5DTI9ZjEwVRLtvKYE7iNA7iVzwZHY+nuZdzOJjz29uPeO21b82f/5fU8N13r/v44+n8lkn8qL39wpdf/ta8eXcHgfb2hqeeOre+fmVZ2e65ub369j25a9fx77zzzcWL78aWLQtnzPhqUdGAMMzk5ZWvW3d///7HjhnzvcGDz5o8+bri4oFMbmm5bsGCRM+eo4488tp5c4vO3SWD/0/Hv3Uyugsz+pmOF1+YPm/eou99/2uf9kD+N8RNN959043v0T8IptMtDBMcwoOcyTxWchzDuZkjybCKDxnBlAg1+CTtHEBvYsygic9TzX3E2JcuNLM0AhEeykJqOPkT691v8h6FDGN/WvgD+vX7Xrdux+3YaOvWFzds+HVJyVGpVG0ms6p376PCMFyz5j6+TGss9nEmU8kevEc+5xLyEDEO6kR8/pDZ7MsgZrCFPSODGWxjAV3oyVZO/4RW5VyeiBQWz4uWnndEKw9G/pkj2SOrY3XZ5WOefGJWZeXJEZZxR8yoqJj29DP3/kPT99Of/OaZZ/I7wTTD6N9sKeu2aGH99oqKuTf88ooRuw+7775Hb73l9XQ6wWWdoIeYxlOUZJ1RR406bcKEy7OZKBYvfmL27BszmT5R0tnKEFYzjD7RbE5iFueAWSyhgmIW850Ipboj/sAr7EcRb7OBo5hHHQGXRIv7neNVnqUf7zOaXsSip6nvgW18v1u3LiNHXt3WVrdixU1bt35AN8pYTDkN5JBmHzaygJBJTEGUZpWA56ikgS60cuDOJ+ob1LMvC6hnCIUsiISQltKX4XzwwEM/HrH7J9Gc//NYvnz1lVf8obKygrepo4LSTn4B23ibgYwiHmn6ZiloWVZcd7bSwhQWk8fexKKnxLcoYAJYQAFj2MQMdiOX1fRnQnReif6o5322cwRdOrGNs/E+70TevNtYwX4M6vT27L/reYUxER1qGPt2+upVPEUBu/E6F7F7p971PNy9e3F+fvcNG2q5duf5WsavundPNDfXFhSU7LnnyUuWvNLWVtKjx2S0ttZUVT2bn9+1sXF9t27jevactHr1I5lMMGTI5wYPPrvzwV+06Ldr1sQ5g9f79Jl90km/ra1dsnzFvVd++4xdZKb/cfQbOjn821v9txGwfhdmdFd8KnHU0QfvcmD6V8Vll1/0jW9O4eMwbMvNPTMeL+Ex0sxkK59nODiP12lkKAGjyNCQTL4SjzeyJz1ojzThP8/b3MVYcmmjlhnRPawPU0lQxP0sjsYSRvo1V/JdGnk229Gly0nr1/+yuvrW7H83brxr3bpre/T4cq9eV1RU/CIv76C1ax9MpbaRoT0Wey+RKIgABoeQw++5ke4c2ykTxViOYAHPkmEShRFvOk0xk8iwjgMpjXCxO9owRjKLoTtLgmcjj6LI5HosAY2svOnGByorD2cg7RGSNbu3yZWVw8bvffY/Xk57g1/S3Anz9xhPRavSAT/n5crK/PPOuen6635/9x/ipaX35eYO5XudPOXv5yVO44KsHfyiRa8+++wXGhs34v33b5k58zeZzH60U8SBkeLBDhTpaHbn7U4/zpM4KIIM3sKUTvKubbRwLj9kBo9GluWJSNhhDOM6eSC1R20MRSwhGRkoLGVNTs4H/IAlfL5Pn93Hjv1dTk7X4uKhpaVj6MfhjGMytfTgKs5g7imnVDw77T7KI056FS/yLjN4iEZOYRjllPJydKI28zRpDqWEKQxkYXTOJPiI3RhPMQefd85N99336D84oX91sqe/U1n5ARvI5yg2URUhJWIRx2sIIXNoZ09qGMApHEUX2jmMnpSzlVcj8lyMFOUEzI8y0WXR2kiCD6lgAa92QrBkIaHvUU9PHmZNZB6b3eds3uGC6MlhCXvxFusibEwuOTTxNiNZz0zG7pyJog+X0oU3uDACFu9offhqXV3uhg1LuJCuna6vVvrzja1bt3XtWjF69AkNDTVbtqyNxXKyONFksnTAgHNaW+vLyw/p1Wu/+vqlra2be/TYc8CAUzKZjs6I0t13v3TgwEwQPMrBVVVf/dP/x959x0lVnu0D/87M9k5Z2GUBpYmCIoiIigp2UcTegiVq7NHENBONYglEjdEEo7FE7MZeERQUUURFhQUElN7ZxgLb68z8/piczappr5rX5Pdyfc5H2TlnnvPMOWfm3Oe+r/u6npgQDkf2HvrLe/+4cuqr736DZ/n/FP6rM6M7dEb/ry8FBV3KdqiNfhPLguIlb8+ae+KJexCJx2uTk49IShpBmCLODtpW4uRyeqAomUo9a3kpP79/eno3tpOUlPRJJPIpubzAu0GnSCoNVNKTqaRSyIEsIYtdeIn3qOBe0rmGvuTzE4p4kqRIJK9Tp3MqK19dufKSdevGV1ZO7d79zry8ROu9/PzL8vN/tGnTC6SFw+9FIjktLe+FQtgaOBYWBHqNX0Yd9YGyTJhqFrE1kHyvZyvpPBb4BrV1eGzi90GJtpxbA2fCBBr4A5/QJdAlLeP11NTDMzOvDYX+yJ9JCe7ESWzhx9Qy4axxj775xux/8fQhyFhfE3S4/573OYwGtnAJH3IQSZz0/PPV0ehGIllZv8zM/C63kihoLmMcvWgKiJKnVlZ64YVxb7117eLFz3IoHYgzNNA/2oe+gTtAC/nsC+bQDHaiGxv4PbXtNFxTSec9ruZA+gYmBSFeIsZWfsSqz5uPr+an5NEhyOQtoIL8gQN/VFSUx+W77faDfv0uj0Yb6uvXr1nzwJo173FgMNudA5v71fThsuef3/jg5CdJYjBNTOE4LqQTDYwhnTARCulDMW/wMl0Cy9wEBgaymmE2MIwB7a6EwXdOWnrZpdd8U1/YkpJyhvNp4Np6KmlUBqn9JuKk8HFg8v4JW6knHqgEdCCPRayiA418GITajWQyiw10ZSEf0o9W5jGMkYyjmccCiksDjxLnZA5hFK8yO/j4b1HM5Qznp/RkNw7juIBgmsBmnmMgh/IdMnmBF9odxsTF/hgbAo22xz8fkGzh19SlpOzCeH7TrmsqjTf4QWpqel5e0fbtm+bPf2bEiNMLCpLWrJnc0LA5EkmNRNJbW2tSUjpUVs4rLZ01fPit8XjrzJknbdu2MBxObmOUFhdfV1HxbjyeYGLctn37R6mpWa2tDUuXvvz0Uy986z/m/6XL1w9Gv93J78D/aRQU5u+gjX5NlJaWPzj56V9P/MOECT8799zTpkx5cNCg+dHomqSkPUOhNObwTrtvOhaymY9IZntKyuLdd3+1urosLa0LLSkpc/v1u6Zv33tTU7eylsOChvoEZ3QnRrNX0PrQi0SarStDeZ/HOZSzCQVeOInU1Cm0xuN1kUhep07nt7Y21tcvKyr6TXr6nvF4a5tXSk7OUR07fjc7uyAeXx+NLs/OPjc7+8SkpNWsC5rfe/BhoOPdhvd5n704iBzeppSD2JN0ZjM3EM8/gNk8GHjJvMN99AoSonuTy22B0/1abqCOo0ADq5mVkXFFevoVycmHZGXdH4ms5cbA5qeYa9iXK8nk+1ddtXTChN//y2cyzsHswm38nBKOCxLA59PCmCB6izKiqamitnYCsbS0M3Jz7w6FnqeBswOZ0geJB3TPg1pb91m79l2OoTPVRKlgJj15jTQGsoC6wJ8pEcG/GHR3xelFjPN4v92cn2Qi4ziXiexLGq+zL/kcR1+u5bVg+ylcy5BAAD+Z+UTZnZbKyuLNm6efd+yYTz/9VVnZzEgk/bPPfrNmzWK+UDnNZTjTA0H+E59/PodtVJHHDwN1pNGcwgtsDo4DsuhLJSn0aJeQixKlKz2IktKO5tGG/LlzV0+YcOe/fEL/EcrKysloJ4yawmh2Z1tg3JDg49aTXVS0/sQTD2ZQ0EBWHnBM32MznchhL1pZHyjSrw6cdWewhIF0pIm9A5fUXE6gD0+wmEfpxtggOh/AODbwKFPZyI8C49BkzmYwj7Eb3yPGk3zCy+wfpEJryeZY1jMp8FOoZRJV5AbO9auZwDpQzCT6UBMKdczIOD8cXhr0YuIJfltQcFJzc2lqauaCBc8dc8wPR4787qmn3nDkkRds3Pjsli3vtbbWx2Itzc3bq6qWjhjxh65dRwwbNqFfv7M++OCKFSseQmtr3TvvnFVbuyonZ2dSuYxt2dkdm5vrn3rqnOTkTkP3bv8EsgP/AyQe+L7y8i1nRr/Vve/At4/Cgi7/fKMd+PtIRKLFCxZPmPCzaDSa6LC+556JgwevbW39mFSGsZjHAqrZi7zPbuT27t0jL29ZTk76ihXfKyr6SSQyICWlqU+f8VVVs5YvP7u1NS8gjW3nY2LUMo+VDGVnPmA+u7GdErIZQChoeUlv5yS5kCc4Ztu2KbW1cwilpPQIhyPr1n23puaNUCgp4ZUSizVu2vSzrVtfqqkpi8ePDoVSQ6HU1tYN0WhpJFLK/KCt+xAqeJ5aWnmNtRwU9GKnswtDgiPUm0GBhFMrHTiYbfyeF5nB8IBFF6KVPdmLh3mW39KDfQklgrNweHVW1qSUlOMTQ0civbOzH0pJ6cfPeZbbOZMz2p2fE55/vs+ll47/p+dx6NA9KKGRgYwiztGEWRH0iAyjmbXk0cSfWQrCjY0vVFVdHo8PRbtG7A5BNPk+SWQGCpRreIvdmcuunMh3WMZCdgm0eBJx27705bUgexfmAPbiWh4Hk3iCq9vpyF7ImWTSPwj3D+REHuV3PMIjHMnugdJ+I5Ggxy5aXjb9j1dddf7YsTdfdtnmDZOWLv0VIT76vIUBmnidOiJMopQX6UQGF5DdTgKsP+eyITD+2ZzoSWI3inirnbJSJLh0K9iXzkz/vFFnJdNIKer+BW70V8HmzWVBej6VHN6iiXDwUHQ+MTLJIq2oKGXW24kGvlR2pzOvB7pjjexPAxn05iiSaCJCJ9LoRRa9yAuKISM+P5f9OJ53KOIQtOvx6sCJgZ7GScE3qI10MZyhvE4OpzKAORzcTqC0OvgFGE1n7mEud5LB/sHaTA4hj9uZysPsyt5Uh8MdQqHs9PTvJCd343Lu4YGuXY9LTs4Oh+OLF089/fQJe+99fGJPw4effPHFDyQnV5SUvBoOp1RXLxsx4q4OHf5C/u7T5/QDD7yvtPTNOXMumDXrDGK77HJaQ0MFd5PDiGh0y4svfj8np096+o770VfH109PfosIf4tWpDuW/4Rl8JABC4oXf+vT+C9dSkvLrrj8uoyMtEsvOSsabe3WrU1XKH7PPTeff36PUCibBo6kkT9xJ6sZmGB3VVVt6dNnj6SklC5dOixffm5GRv/ddnusvPyxzZv/GIkcQx61bGUeYWJcz/G8SjHZDGQdb9KbLawhmRaS+FW7BvaXeIRzuYBb6+vLqqpeCofT4/HWjh3HlJb+asuW+9HQ8MnatafV11dwPJ35bjR6XnX15Pr6V/Lzf7LTTs9nZHRhIy2kcRDpPMNTRBkZdFZ9Qgd2poWmgKGYx3A20kqcJPanE4s4JFA9rAjUudGdo3mHEexJnHqqwuFwdvYDSUlD2/2CxZGR8YvU1FG8wkUc9HlCagtD5s7tPXbsxf/4VI4Zc9h99x3LmzQGP8sxFtJAhyCU/CgQ2ryHukTjVH39XXV1t3M0B3AqfXiI5cTpTxpLeSUxVTYEze+zOCwIPnbmPEIsJ4PPKAkyBf0CE6Z48MoujOHP/IjPuIGB7VikjRzEj1gaZIuj9ORc1jODk9k5SLtuJJVexKnIyIgcNPL+3z87u3jZsgMHD37w2mu7Zq+srv6UIaxnWjDgVqaQw8FBjP4k/WhgIzWf1/9KoYVlbOUYWlgT5GV7szefMjt40Eqkb4cHGhRDWMBcsJKZdCSte1HB1/zabt5c2q1bl2uvvbyoaBXVdKI7L7IhYAxvZ22CO3HiiXvPevtJ4ps2lZNEjCL2ZgstATOhnhTi5DGaDmRQGjyWNAfsiErW8fHn78LzeZUUqpjM5nYV1xoeYScu4TH+FFRIEsszzAxK/K8znxP4mBcC8/oasoO4dihjeJ1uDKU2MGRKXJZ7MprpHMo+rKMhYGVEk5P3S08/n6cKC09LS+tZXf1JNNpy0knXDBgwKh6Px+OxWCwWj0cLCvpdcME9vXr1CYeTd9vt0vT0ggRDNBptjkabcnL6Dhnyy2i0ISursG/fsbW1G2tqNtKR/dhcX1/ZocOAgoIRjY1bhg8f8q3/sP+XLqFI5Gsu3+Lkd2RG/6+joKBLSWnFtz2L/0o8OPnpKy4fP2LE3kceObJbt64JrZ/2uPDCcePHn0pVoquG9MCwO1GHrauvt3Tph01NdQMGHD5w4MFr1lz12WenVVa+mZx8ZijUIxTKJM4SMujBBPpxCNfwCSEaOIM4K8miD+tpDTSV7uIN7udjJgSV7h78tqmpW23tnGi0LiOjf9euZ1VVPb9+/fc2bLg4Gt2ZQwMjbxwQj98cieyVlNQtFAoXFt6Rl3c4jdTRwkB2oo6OwX2rni1sbKfO3dacsYJSmpge3D7zCAfi3muYw0nMZwEh0ogEXjWVzGBkLDaouvo7ra3t7+WhWKy8uvpMSjp2vCUcfpK7Pk9ITeZ+Xt68uWns2Ms//WzlPzihQ4cOmjLl1mHD1hIiznxqAumlEDNJYQmPBN6e4ZaWuQ0NUzmrnbTTwYzm5cC8fic6spE5pLCefJo4kcHEg1ghjWPpSCpnBZ46idRmF46mka0BZzGLY1hEOU0BhTS9nc7rdubTkeeDuDaTQjqTT5SPmM1BNBOnZMCAkUcd9URmZrek9D1/+Lu7f/Xgg106dPjdlVemJEVIZwgpvMoGptOPfYLPm8eR1NNKFrcGFIsE5vC74JpfA4YHBuXozP7EmcoM8hncrl7XlRFU8yrz6EHX4Jh8dbTJchUWdr333vHDhrWwnnTqeZ+1ZPEgfYuKGi6/4tBbbr0m8cZbbvn58OH1VBAKlHeLqCkqWj98+C7M54Og+hEhOwhA19JKE9Xksx/zeCbQgp3DbAZRx1C68kyQhy7lcUZwGcOYQIRfBofxPhZEImPZiRdYzSn0DBSgHuZdtvAZHwRKYXlE6csWZkUip4dCS/g4uMITgcjOLGLGTjvd2NLyclPTa8RDoRTqwuHUlJTOW7fOisdLDjzwphdfvO2xx34aj0dDoXA4HA6HI7W1lffe+73S0k3Z2QM/+uia4uIJoVA4HE6JRFIikdTKyuJ3370sHI7n5vaqrl67YsWzRUUX5+X15G0+Skvr3LXr8IqKeVVVS4cPbyuq7MD/EElJX3f59rAjGP2/jiE7dO//50iU5qdNe2vChJ8lItG/t+WYMYfRGBT1Et0/MapYQnrnzkM6dTqwtnZLRcXq/Pw+++xzWlNTRUrK90KhDjTHYkuD2uXxQd0w0STUi+uJ0kA8oCFuJzfgojVRxP68RIQ/tAuVEOHKaHTfWKy+pWVLJJLdtetZLS0bOTIwqFwTBNCtFEWjJ2/e/KvW1hJ06vT9SCSHN9lAChl0Ymk7Ge2ObGVWcK9NTOZdSgKvy958wBqSgoakpazihxzGL0lhdtAFlSjpzuLiUOhHodBP4/ELamt/0NT0bGLo1taPamrOTE/fu2PHO1JT9+/c+YGUlCjXBRmpSq5iMWOTkrJqanqdOe4X8+Yt8veR8J0fNmwrUcrYn2ySgtpxorU5i0TCe2MsVhnQIdojEYU3sy4InnoEpdVCMonwAm+1y4GVc0+QlM0K5j8z6OVKCjjHUyghLTBPyueXTP383h/nNwxnPbk8TTGCFnW8xUZu5keczvwBA44YMOD8cDhl4cLfr10x+ZaTjh2Ul3fhzTefcvXVoqEgddGXAcxmdwa0S2kkgum9SGE4+/IYL4GpPM2+dKSSJRSS8nmeaCQQIm39vDxWAmlkBNzoXJqKiiIdOuT+gzP4j9EWibY73TdfdNE+LCazqKj7sGEJOoSiopQTT9r7iivOb9s4IZJ/+RUHsDI4npGiog2PP35bUVEhY4gxlTJqyWdTELKHWEsyaQFNJc7DvMEChhIihTD9A1Wv53ia4zkz2H9HfsQh/IbrWJuUdE7gglHLqXQEKRxJIVlczLV05BVKqSMOZiclfT8p6YLk5EfD4d5MpzxIaa+ORBb16TMpL+/Q/v0fzczs3NDwcDS6IRbbmpKSX1n5ZkZG0lFH/bFnz5FjxjzS2Jj8m98ct3ZtcTyupGTFXXedEwrlNDVVp6R02nnn8ysrl77xxkmVlQuxevVTH3zw4759j66t3RyJpKxa9XLv3td17XpKv36/6d79WJJSU/PKyj6srV3Sp89OX/nk7sCOYHQH/rtRUJC/wxT0X0HiKJWWll9x+fjq6po//enWBEn0n72vhd7MDMKvKpYnRA1ratZkZnZraWmeP3/DunXzU1OzE3XtWGxta+tzsVg9NRTwZ8rIJJOMwGOwnJ48wpt04gRepJLezKKcXHJZzi/Y0m4+2/glH8fjrWVlD9fWzg+H00Oh5CCps4QZ9KSSJB7laron3llZeXc0uoUDWc6i4BMNpYK3g2RefyK8RTmbeJM4g4gQowdDWcYmYhQT45eBtmhHfszuvEmEKlZyeyh0SmICodApodDvGhoeqa+/sbHxodraH+bkXJST86PE2kiksFOnOzMzh3AV7/Jz0jmO5JaWyurqzf8iLeq6664sKkok4aaQy2B2JyEDtC/7sp0VgYpklPvbsRtnB/5GYbqxnI7szcFksiwICPqzgAepYR4Pk082IWaxnd/Si8UBM7WVjgxnTkAgxs7sxUPcHux9Ei9zJEmdO5+Xnd2B5LS0+UynhQxeIo/f0BucwDWrVs0qL/94zpyfqZlz79ln79u799g99/zJyJEFaWk/3r3XkE6r2I4gWFzJmzS164JtYgbJwZTG8DG/ZiZHBI1r6RzDBuYRb8cTXcEyDuIQ1gRrE4gxj0oiZFJTVFRz7703JLyUvgK+EIm24cILx91335VFRTn33nvVPffcfMMN5xcVdRs//uQTTzz6yxtfccX5jz1+TcKl88QTu856+5mi7oWbNpWTykgG8haNQbY1cUBGsjvVwSEKsSe7soxhZFEaaGVEyWMkVXRip3ZqXAnsQ24kkhqJjIzH62KxD2kMvlwtRNnGe0HzU+KUfY+jeYPVZPJacvINkcjJCIVyk5NvSko6j7epJCc1dXnfvndlZQ1FUlKHnXeeUFAwrrHxqWi0JB6PdurU9Ygj7kxN7YD09E4jR07cdddxkyd/f/r0uydPviw3t2+PHgc0Nm5PSemUlJTVo8cZaWm95sy59NNP/7h48aS+fcekpGQTWrlyyi67/LZTpyMTn6ew8Kxdd72ltTW8bduCY445PTMz+aud3B2A5OSvFYkmf5sHP7Ri5Zxvcfc78J+AX0/8w+AhA0ePPvjbnsh/Oq64YnxhQX5x8ZJEaR7/QiRq7NhLN20aFLTPJ+7f/ciilQUFBQeVlr7Dd3muoKBbaemypKQzWlunECaZw8hjPh9xCSNYy6304gzqeIrdAhX0NTwIBvAO/aknlWYq+AWDeId76M7+PJSff9a2ba+kpBS2tm5tbu5HCRs5nOVcxWTmcRyrCwvPqq5+rr7+w3A4JxodQSPvE6YxaLVO8AKz2RmUBG3ghRQG7TILORw0sSCQaTyyXSk8FPzjM+7nwFDokqA5PRRUG0M0xOPXh0LLOnW6Izl5ly/z72trH6qpuZ89GRzcpGcymLn33ffLfxDNbN5cljitY8desmlTRzZRyn58QmZw109gJRVUcSAlrORgKlhKb+JBe/JgerTbwxJWEAmC73XUBbJZXShlE4P4eeBj9AgvkkU1e9CTat4ji80cBppZSBZRqjmKFMo6d94Z6elLDjlk/Natq1955Xoi7MVFX/rcVdzVv2D9b087LbVddiQWi/3x7bcHRqNTN24srswin3kcxKdsZX8KAy2kbFLpT0dClLKBKAfRwFz6059m3mYjg+nAQqo5KDBBaOSDwDEhmQ9Jph8L6HXiif2vueaKv3fi/jHaTuv/9I3VNbU52Vk5uV/IfCesm4pPPOkv0Wq/vkdzVBBr1jA14MW+G+R0V1MQqArsThYbWcPeLCKvHfU2IUTwOvvxLidwYrDbz7gtPf2U9PSz6+pua2qalZl5QkrKoKqqW2KxzhwL3mMwu37+24QtCc3X5OTfhELdE2tDob98ceLxipaWy1NT03r3/l1ycucvfNiGhmWrVv2gS5ddDzroxpSU7Hg8Tjwe/4uj2MaN786ZM6Fr10FFRftu2fLpqlWv9ex5bmpqp4S1fTTauHbtvbvuenJWVreNG98tK1vUt++EvLwDEmn1ePwvDx7RaN2aNTcNHtxhj0Fd22ejd+B/hL77Hvc1R1j5wUvfyEy+AnZkRndAQUGX0pIdtNF/gtLS8iGDBxYXLxkyZODfI4n+TYwZcwBldCYR7g8iKyF1ftFFZx133E6hUAYv06+0tCkczmpt/XOQVDs5YNftxWHcw6P8kv34LnVM5hAOCjpXCrmSNJIYE1jFNLMXO3EdT3I7QzmMTELhcEZ+/jnRaGMs1hx0bxxNBil8n6WcTiapZWU/b2j4JCvrrCCHmsJIOga7iNGX7tQGjR1d6EIe3QM62ioKWUwzqewZZNRWkR20/Sayvxt5iP0ojsd/144QmUE6DfH4z2iMxw+prLy0qWluUML+C6qqfl1f/yToT5xtTAkqwv8oM5rInHXr1rWkpCygjXZjN+bSmSHtIlH0CVqvtlHAYObwGbuREXRi9aFb0FDVVpjuw56soJVuRNiNrmxnA9X0bueoeTbj2RY4cCKTI8ghFCSzk9krSCieRDrJbKqqmrZly+zc3B7JyRkZGZ0yM8M0fN5rpw25dFpWWtPU0pKRktK2CIU2bN365MqVf9h33/P6pbA2OAK7BVZbC3mTDvQgKTgCy6nhYvZnOu9wcOD4kBIo58/lQ1o5qp0dVxqj6Mv7fBCo54ZIuuii/b9OJDp9xnvTZ7yd+LOkpCzh6fqvoL13aHsUdS9si0RBMk+xDGTTSgGl1PIxC+jLoZxFf95lE9WkU5yQkecgfk49HwUp0t6cyBtczxZmMCEz86KMjEtCocysrPGZmZe1tCxPSxuVn/9wWlohk1nFch5mWfBlaWMSv049e7S0XByPfxAKpYVCCTJJcjy+vaXlynh818bGPT/77LTt22e2/6S1tfNWrLgkGj2ypKTDs8+esG7dWwnb+nA4EgpFPvnkkdmzb4rFYvn5u5eWFq9a9dro0b/asuXFsrLXEQ4nR6N14XByVlbhqlXTWlu3H3PMtevX37Rixc9BOBSKhEKRpqZNixd/p7m5bO7ct2a9VTx3bvH/7ATvQBv+q8v0oXZZhR3L/82lsDC/dIfu/T9cykrLfz3xrgULlvzpT7d27ZofiUT++XcrwIUXfueii/ryWdDZGqe5qGjbRRcdceGF4y68cNwrr/xx2LCeiXguFtuVpEDNPtpu2YkhvMVgDg30RLeS2a5tJS3ovm+iI8eTHPgS7cqhPMlYdqOVFYRbWsqJd+hwbCTSgQgHk0YjlTQFotmb+SAWi2dnnxMKpcXjiXaTUsKBTuRcSokEMuybSejmJAes0CqW0JuT6RBYUiUi1D34HTPaHbCp3MoYzuaXVMXjZ7eTwV8Uj59BT27lonj8oq1bf1pX90RiXTxetXXrFY2Nb3fqdDYhmlnNNPYgk5VFRRl/7xGirYZbUlJ20UW/3LQpnU+oJSPgdL4fhJh/mQmbGBWkk7fShx7UsI4YR1HOu7QGQgHF5HIk+zKC5YSIE6KUYvrQlxf4UdC6jjdoJY05LA8EAXcizCzWEAp6thK12gamU9nSkkznxYvXP/vsOW+++etu3cbRj0lB+rwNcSYyJ0PWuPvvn71iReLVFeXlp99zT+PmzaFQCE2xWMgWwkEau5B9WcZOgdVQDTFK6cB3CDOUM8ljezt9A/QkPVA5Tf3SqUgJ6JWJL8Xaiy467cILx/2Tr9nfwebNZTNmvH3npAV3Tlp56aW/KCkpmz797auumjt27OWf/cNuti9g08aSv/fjsGljCdmMZAHvBar4tXwUqCwdxPBgpEM5gWWBx8GeXBCE+D25JiDmJpFGZ84gwlWh0EtZWdelph4bjzcklpSUQ9PSvrd9+2+bmj7u0OHW7OwzmEIGO3E/zwV7jDKJGn7JOZzV0nJDa+vNiXXx+Mrm5rPj8b1DoV+FQj+NxX6ybt2vNmz4y9otW55bteqKeHwcp3FBNPq9d9656f33f51Y+/HHv1+06KFu3Y6Nx1urqzeUlc0/4YQ7+/Y9+IwzHsnP77Ru3UP19eubm7dkZHRZs+aNnJy800//Y//+h51zziOdOsUWLjyxtnYRamsXL116fmZm7+bmylGjzjn11N/ccfurd0564Fv/zf9vXL5+MPptzn/ljjL9DnDggSfPnv3sNzvmxIl/KC2tGDx44HnnnfrNjvy/jNLS8okT7+rdu+e/Xpr/MubNW3Thhb9lC/2LimruvfdXhYV/HWfKlDfGj/89BfRnDkmBBHei2byB14hwNG9SwZ6cyFtM4ezAsGcmz3E8WM1erKOYWobRhZc4iyw+ZAmdwuHa1NSCvLzRNTXv1tZu5CBKeZ9eLOPChHNMOPzLUKg3d4TDLS0tnzGE+QykiBkMZjGd6RQIVy0lTB6VdGMlI2krjs9nDgNYyolsZzZDuJBH+JjvtdsYT/EON7GWuzmfk9qtXcJtqam9MjLGVlXdnJJSkJs7mnB5+aR4/GDeYhR9eP2iiw76ezHN5yPRWzZtGkJninmHnmymP+VsZQjZzCONfQJe4DyaOJYaZpLdrtn8A9axJ6vZ8/OWQlt5k230ZC0Hs50qjuA1tnItD7CecTxPAZ/SnWFs5y32Zj4dGMAKQuzNDDrRhT3YzjKKUlNXdus2cs2axRQxiw5cRVfKuIYwR3b18hmqfs95Bx6Yn5X1+zfe2DUc3i8t7eOkpLy0tLdLSs4oKvp4+/bN4fDWqs4BjfhtBhKnnBZqGcP+XzrAL9AadNctC3KlB/BsQG9oS47O51P6UU6XoqLYmDH7feVIdMGCJQsXLpk0aV3AJFnLa+zJAdTx+i23nHLYYQf+i6PV1NRmZ2flfqlkP3du8bhxdzOIZt6nlgbCgSbXgQElI4FEAnsDT9OD04L8uuDxrJE/UsIQ+hELOiAb09JGZ2Ze1X7XLS3z6uvHp6WdkJ19fnPz/K1bfxqPF9KNBpaRx/ncw85cmghXQAkPhELRpKQftLT8jO+EQt9rN+qGeHxCWlptXt6hpaV/4oefF0Yt4e68vMaOHXdbu/atHj1Obmqq2L79w9TUjGOOublTp95t2xUX//ndd/+QmzsoGq3o3n3gMcfc0H7mH3746OzZ9xQWnl1W9mRW1sAOHYbV17/2k5/8OTikL23ePPOxx37/L56aHUigz2Ff8ZvShlVvPP6NzOQrYEcwugNw4IEnP/PM3QXftAB+IowrKSl/5pk/frMj/69h8uSnp0176/jjj9xrr92/WhjahnnzFl144fjhw4fcffd1iVdKSsoSIemUKW+MHz81EEVqppBqKjmKEK+xG6Op4l12aXe//ySwXKrnAy4McjCzmRG4nO/F2wxiKSfwIVs4jamZmcObmxfF4zWZmUOqqoqDUHgYKcxheChUEg5fFwrtBhqj0QnJyZubmxPH4QMKWMfBtLCQCA1BW89ythImiSM+z5vEWmbQyNigqD2bdDoxNugLDrX77yKeIJ/zGUBru7UhGpnMrIyMvbOzD4zHm0KhSHn5vfF4MscHgc4rU6Zc3/4BIIH2bMKHH3560qR3Et0/wfr1vE4z/cllI+tJYucgwmi7wa+ljE6kBqzZtrXLWcORgd35Fz7aO6znMNJYTh1HEGU+H9KDY6niFXYmM+hn2os5HEKUBdTQgSxWBgqdiSa5j4gzMkhgdw8oiXPYwPnBUd2XcEfP3q2unHtZwhEZGQNTUhrj8XuqqrKTkk7u1i0jHJ6+Zcvy2toePXbesKGBfrzL7oELw6c0cGagG98eM3iDbHbjQ05ulyl8g9cZTj/msJERzKcPjVdcsd8553zFR9kFC5Zcd93tmzYNCz5yAo1Mpy97gPdOPDHrf0oA+EI8Ondu8bhxfwr4DzGWsZJRhJhJM905pV0O+D3eJit4eDuDtoC4jDvYh1P5AxUMYRmnEeGppKRoVtb1kUhvNDY+W1d3R0HBYS0tx7e2rq6quj0S6RmNZtEh6G9bTwnHcnRb7qxdKupNHucnodAJX/6M8fjveJ7vc0AgmyDI4seZlJS0qFu3k5KTM8rL30xKajruuDuys7/45SovX/biiz8oKNj1mGOuT0vLice1606LL1r08uzZf8zNHZGdvXtV1ceFhZFTT70mWBvasmXDokXPX3DBkTuUnv519DnqnK85wqrXHv5GZvIVsIMzugNQUJD/7xm2y6RJNwwZMvCKK8b/O8b/t6K0tHxyoN/09SNRf5GxvKd9JDp58lMTJkxCYWEXmjiAlKB+tytFvMIMDmJkwBs7kqGBiXkru/GzwJbptnb3+AM5g49oZHeOYxnJLCSJs8kmLR5vyMo6KRLpUV39VsBXO4SepBAKh/tGIneHQj2pT8hIRSLXtLQkeKIdAtP2cFBvHUZuwI9EP3oT5UAK2vk9JpYe9CGHZVQT53A28SlV7SikCRZpmA9Io4JXyCSXHHKCzZ7h41AoOTv7QESj1Vu2PJ6bexCZ5AT5qs033fS7zz5bWVPTVv7+HEn04YefnjRpSuCj2BoI5hcyiFYqqaVrEGnVBlqqbYKmNWzjMyrasSZS2UolXXiN7Z9/V4SZbAjMJD/lE6p4nRjDiDCCpbyelNSZEMnsSQYzg1/vCEMpYBNr2Ic9CRHlVdKCdy0MBEcT1NX9OZi76cn+tLJ1q9CHge/kYVTHYqXR6JO1tYdRmJaWHYnMq6pa19CQl9fhiCPGHnTQoMS11KHD9ksu+U1e3upA4Ol+3vn8hf8cH3IT11PKMe2uUhzGeSzhZUoZwXr25iJ+MGnSpsQX5H+KBQuWXHfdg5s2HUrPoBs9Ia0VYTRhXqWBIc8/nzV27LXtr4p/io8/XtT+z7lz57OZ19gW0BgSkhfvkcJAtnNnoA/6Bm+xZ0AOHs4z/ClgztzMkfyI7txMf1byPQrpyhWtrb23bz+nqWlKQ8MDdXV3dO8+Jhqtra9/uarq9pSUEdFoI0uDEx2mOzGmMDkotqQEl9/LPB8KpYdCk+LxH7fr1od4/KYgfX43E2hup37QwHjWpabmp6bmbt78Ynp615ycfR555NRly15vP8jGjfOee+6SUOjk0tIe99134rJlMxNypInlgw8eevfdPxLLzOy7deu7ubm1Z501ITU1I1jSs7M7rlix/O67H/kKZ///Lv6rOaPf4r534D8HQ4YM/Pc51F999feLi5f8d6lHlZaWX375+Orqmhtv/PG/pt/0L6EtM1dSUnbRRROff77z88+HLr30F0OHDioqSjA+d2dnyhM9T6FQl1AoiU3MZzG5PElju5vKBu5gMH24kY3tPwTbCdFAd84klc6MIZSIrqLRbfF4S3r6gZmZY4hyNJ0Tw4ZCB8Rij8diUwM9qXTSY7GH4vH3WM4WQoFi+RwqCVFElA8oIRTIbb4R9N1HgqWOP9PExWQxk0SDSJg9mET7u9parqaOQvqxgYvZEKxtZjxvcjzxeLylqWn51q1Pdu48dqedbthpp++Hw8/wOhXcNXfu2HHjfjJq1EUJsmD70vzkyU9NmvQpXXg80EBNIpk3WMoZFLEkmGcWdbxGFYjxLpvpRme28XKghfQhZZzGcQzk6aDHBfU8w+bA7PQdypnAbeTzFKXEWZzIPbe2NtJEjFZ6sTutrGzHCe5C78C/fi1L6MmuRJlFHTfQmY+Cfq/E82ci513G+3zvdge8z21cyaDGxidrao6JRn/McbW1f1q3bkNLyz2HHvqLPXZ/9blH58x5q3fvnkcccc4vfvHE228/2dDQwna6cxxv8CdaiPEQ5dzCnvTj90Fusj06BZXl/djIENqyoSc8/3zRpZde/69/xTZvLps+/Z3zz5+0aVMNr9PQLghLLEuDhGWiv2fjpk0Lli9f/S+OX1JS9uMf3zFy5Hc/32ezJ114nZU0kM4bgSBGhN7k8Tgv8XGgFRAng64cxjqu4w7O4dxgzCcJBYzSBmqo4VAura19sKHhkaKi4zMyejY3VzU0zExO3ru5eQOHMYpSlgc6xCmMYjk/Znkw8qNM4aDk5M6dOn0vOXljPH5KIEYrHv8pc9mFbI6klEsCb/oSfkgzkczMXuvWPdqp09577XXzbrv9cI89rp058/bp029KDPLJJ8+/8MIVycmXpKV9Lz39xykpV02destrr01IrJ05844PP3x0332Pbm3V2Li6Q4fCrVtr77zz/C1b/vK9Li1dfccd5+Tk5Awd2p7hsAP/DDuC0R34b8e/NRgtLS0vKMj/xjkA/z5Mnvz05f/QWulr4uGHnx4zZsKmTWPYmaFz5+4+duz3b731kmHDqqkghVw+S0oKZ2bel54+IRQqoTs3cTN7cSurwBv8gTO4kl8EovEfgz8zmeFkM5n5pJEcSI6v5UlGNTWl19Q8GottD4USwkCp1PJmKNQ9Erk5ErknFns+Gv1JYtrR6LWx2DOh0P7kBzr2CLM7i1hHUtCTtI5VRGhlBKt5KnAkWs8T9OccsjmeUcxkJSHyGMWL3BN8wF/Tnf2CFOxxZPF93mMN51LCOUTi8VhLS8n27VN79PhFQcEFyMs7tF+/O9LTM7mUPozibgrHjbvp4YefbkcSveH551vpyxD2ZxofUMMTNDOOboziMD4LckiJjqg32MDUgJWbIA8MIYupvEM+RwanfQTHMIv3WcUTZCRiaErpzM30IpUfchTPBFXRvYO3x1jcTrs+mU0sDFLRscDeeRnv05dCkqmmK+Mp4gROCMLo1mBin7KV75PHYVVOniQJx/FrFgWerb+NxXaKxepaWg7o1u3uAw/YO79zNBrNz+8xceLJa9eu69o1UWhOoRtnUsdv+R153EZRsK8IPwj8VBNYzu8Cm80VHMqIIBOfiMD6z5175Nixv/1XWuAT7Uq/+MUrnM/59GZyuwcAvMd0dglcA6Yxl53+6cgJlJSUjRlzzaZNR23aNHbcuD9MmvQANm4sJSOgoi6glno6JdxiaSJKV3ZlMXuRwToibAiUKIYFNfR4u70V8xZzg6C5rVDwfjjc0rnzsJycXuXls+vra8LhjJaWag4A3QJBjAU0kkUq+9GBCUzjHt7lVCojkY7hcEaHDqdnZPSJx78fjz8Wj5/MCsZRFphI7U8RN/Ao4+nMMLbV1CwrKjpm990TffEKCw8bMeLhrVurH330tI8/fnjWrN9mZIxPTT0lsTYl5cjs7IeXLds8efIZ06bdtGTJlMMOG1dVVZGT069jx6KhQ6867LCH0tP3vP32M+fNm7Zo0Zv33vv9Hj36JCenDh++1794anYAkpO/7vLtIbRy5bvf4u534D8E06bNmjZt1qRJ13+dt7f9WVJSjsLCLm3/uPrqy/5NTIBvFqWlFVOnvjVt2qwJE376DSZE2+Phh1+fNGkRQ4MXEjeh2qKipbfeetJTT73y8ssr2JySckJq6uWxWElDww9isTMDRckEnuMehrGMHwcczQTe4Hb25hMOJo+ZqamHNTe/FI/3DGzWs5nNDwOpqT/zVGbm0XV1r3IsMyOR8aFQGyd1ezQ6gdJ4vJaWcPiUeHxbPL6UDObRj9XBrfRjOrGZ/YiylCSqg5l/wjYG8SFj2hVqE3ffFTwXmKbm08QcIlRwAD0I8wlNHASWM4tUdmUkjbTwYEpKt512uj4jY+DnD3ls/fqJ1dV9otGTgj3eyifDh3cZPnzIpEmvsw9p7YKzGj5hK4ODxpc2YujWwFwqkVCs4lMK6RPot8fpS1NQMW+LctpGqOIjPmMgexBnC2u5+fNzLuMm+lD4eQPMMpawM1HWMZTPAmHO1fRiK5uCYncP1tPQbvDE0d7Cg3TmbUahHWcxscG8IUlv/aq1EXXcEQ5/NxaLBPnVPkOHHtazJ15evfrR5Ssjqb0KCw/ftm1haelMTqJjQFh8j3WcG1xmCSRCwE1cTRHpfMRg0vkwyBReHPTtteElpjH6xBP9A37nggVLFy5cMmnSMo5sd8AX8BJ7MZI3WMigoIu/jHXszZopU379ZT7xF/Dww89MmvQeJ7VT+Hr3xBNTN20qmzu3K5mBVsZ0elJEGcsDJklHqlnHcFYRp4FmctgzkF4awfv041oyuYwefEBvvkcqLdwbDleGQklduw6pqloajWanpe29fXtxoJzVdg2HWM9CugbuayGq+ZgUjiOdt7Kyumdk7BWPC4VC0ej2bduejMXyOYbahNgcRcGRrONNdmEQm5ndv/+lvXp958tH6bPP/rB27VMZGVelpCSkr9popojX198YicwdNerkUCg8d+609PRd9977mmg0IVIRqqgoXrz4j3V1pbvttvduuw376KMZjzzyq+7dC//xedmBNvQ548qvOcKqP9/xjczkK+DbzMruwH8ORo8eNXHiXV/57UOGDEwEo/8gnC0trZg8+enS0goMHjzgP7DFvrS04vLLxxcWdvnTn275e2YtXx+TJj1ALkODRuwEZm3atHDu3N7jx185b965lZW/TE4+BA0NP4rFTuXAQFQokXocwYxweGUsth97fp7vtTNFLOKEoLpXRywt7btNTc/HYiGqKOe2dl0dZ9Ctru4OknktErkzFNqFJhAnLRw+ORa7ORTKC4WOoTmQLy1kJB+RTCtdGcmHhAIdokR4VEULyewRuO+cyJ5E27cy0JtRvMFmUkkNJCoPphstlPIZKSyjBztzAMuCWKo5od+UlBRLSen2pUMejsebQqGHA1Vw7Mr7c+dWzZ27kJTA7b3tx3Alm+jAInrR/l74CVtIZwH9yCNMAdFAFT+dj+lOFSuCEKE9lrKOTIYQY10QxP+YH5OYfEXgaNol0O9sQy3VrKJr8PqubOZj8qiikpGBqNYiupDCT/lhu8AixmY2kMu7DP68fuqUrKxl9UkZtjeu5RoK09OX19U9k9o1XHjy2rV3ndfYmJ2Ssra6+rmVK5NSkrp0PbihoXTbtvlHH3377Nm/qalJiBwlITl5t5aW+1nET9pFhwv5FSfyXX5Dd3qwmSR2pYJruTAI9/EoS/gl/Z9//r25cy9+/PHbsrO/EK22RaIlHPX5/OKu5PM691PPMNLYTjEp7EPoC4zJv4mHH35x0qSVHEtzu88y5PnnK/iEhYEbFprIZEPA9xgYHO0MMlhEYcBhGMQy3mI3WsjkeOZwLj+njq4czXvcwHd5NBLJTks7vb7+wfr6jaFQ365dL1m3bhzZ9AqIqm3YRhJ1FDOQNHJJZm/SmRqJFNXXr2lp2ZidfXgolBmJdIjHowyhglc5mHmBPUEamUTpxZpQaBGRVaseLi+fM2TIr1JSOrTtcvHiX5eWzqagvn5Sc/NrmZm/CoXyEqvi8bra2p+Gw9V5eV2Sk9NmzXq6sHC/SCRl+fInBgw4P7FNXV1Jbe0mDgyFmpcunZsUafj/OxKNx+MPPfTs6acfW1/fMG3a22vXbkhPTzvyyJG7775LZeW2L7zyL434rdbZvyZ26Ix+a0tpacW3Pof2S0FB/leeUmFB/tVXX4Yrrrj+b37SByc/ffnl44cMGXj11ZddffVlIU455dL/qCNQWloxceJdB4zY+9JLzizZXFbUreu/aUfdixLN3fexGTTyOAvZP6Fl2L17YWPjtS0tzyEU6pScfC+/DRpikljAhZmZgzt1uispaRW/JBaw4l7jx/SimTglzGSXeLwqFEpPTf1OUlIBVVwe2Aw20UQjIzicjlwYjV4Ui00NIsK0WGxyNPqjcDgRVEXj8XnMoz6g3O1NExvYSpyOdKc46KPvRZy3AopnZ+K8xGufp5Am8SJvkU0Ts6gKSAXRQC1/JqdwLh+zkJTAXLSVdTzFSO6ur+/92Wen19b+lczX3FyybNnZDQ2fJSd3Co7SZCZxFpcG8cHrrAjeMZdi9uEkuvEEnyRG4jmW0YswnfiE8mDVhxRxMmMooJw+bOEhKtv93r7C4kAJIcYSyvkeJ9CRn/ABzdxHiP1YxVvt0l3zWMFp/KBdUT5GIfvQQCOjSCNCM8O5gAvYnWv5ACzhWkZwP+O4la3cTzUxnsjM/PSUU8Zl1lZP56f0zckJ86fcvboOuq+o6DsDB/7uzc11f1iw4Lzp0/v075+W1mXduseqquYed9xdPXoMP/nkh3v37s4zlFIfCqVmZJwfDq/i0oBY8jzXcjEXk8a1HMvs7kVbL74o0W8+ikH8nteJ8gc2cV0Q1u+/adOlZ4773bLPVrb/TpVsLtu4cfOkSZPbEc/iwZJKHjFqGEYG9awlnX0Is6V7UXK3wn/yfX/+uel8wIZ2MvJpgbjBVoayjTcCe4IWVrIPMd4J9CIqgqaildQGvgb96c4iYsET0Uh688sg1RrhIPryh6SkorS0E2KxrTREIgfl5/+0uXkNHQPf2jYiNWazjdP5Ll2ZHdihNZHH80lJu6em3pGW9mg0OqCy8sGmphXE4vFG0nmOsZzFbewaPCIm2NINfJicfHhKSodevS5oba1/++1Ty8v/Qp9YsOCazZs/yc7eMxTqFA5fEI3WVVef0tLyLmKxkurq70QiLUS6des1Y8ajvXodOWrU1Qce+JOCgu5vvHFWXV3J4sX3ffLJPdwcCt28ZMnQZcvm5Xfp9K3fF/6ty+9/P/mZZ16tra175ZU3Cws6n3fuqWPHHjZ58lNLFi//8iv/yoD/3Tqjq3aU6f/XUVJakUhDtlWuCwvyRx99cOG3WsieMPGuIUMGHj161NccpLh4ybPP3N32SuLDDvlSKnTy5KeLFyy9c9L1X2d33xQmT3566rRZZ5w+dsCAvv+mhGgbLrn06rlz+7CIlRzJLHIZQnj48M1/vHvi9TfcsW5dzuLFL0UiJ8bjNUOG9Pz00xdrarK4iVd4Ijf3xxkZJ4Lo9u03NTQs4Hpe55WgF/5BjmIeWxhCcSTSLyXl6Gj00+bmz1jHRRwTzKiEX9MQKMnPZWI4PDocvjwa/WU8/kFS0knx+OZ4vDweD6Wk1HbrNj4Syd68+db6+kTC8kjW8A4FdGQIK5hLb4qYzSCWUERvZnEIH5PNOLKo4XG2cyDzghp3MXuxkj0oo4LvBamyCu6jhV0o5gBe4ceBuiqe4g/du/+kU6cTtm17bePG2zIyenfqdEhFxav19Q9wPZ9xOX1AQshoK+Xswla2cEjg244FfBjoFqWxK1soZzAVfEqILgxmHgcGDWSDmc1A5rOGoynkKeKMpjzIniYijzZ8xkxySaeVXegZ+NTvz6e0cAKdg+0XMotdyAEfMpACGkjUbU9uN/h8nuIgZnIuR33+qnyAWaTl56cfd9wpycnJj9/zu+p4/LCOHbe3tq5PG9Gv3y/bNm1p2b5y5c07F1TuM2jQvU891bPniEMPvT45+a9p/uLiRz788F66paT0T04eiubmmS0txYxlGuMDdmMb5nUvenj48G7PPd9Ez+C8JA5FP85q5xYr+MeMK67o+t1zxgoa0V6Z8sb48XOYx858p12ut5SHKGQVB7GNpfSnhEFsYEP3op1efvlOfx8PPfzMpElT6MVcDmJUsOZZ1tCVXchgMSsR0DQb2UIOC0ljtyCEjfIxGUHS/bMgl/w+A+gF3gyF6uPxDIaSRpxn09PPjce3Nja+mpx8bkvL/R07XpyWtvvmzbfRkUrWsRu78w7pjGknJrWYGezMNjKTkkakpPyV7dDaOqW5+TcZGXvV1y8hyjkc0u7Tz+R++ib8XVNTT4nF1qSnVxUWjsb27YvKymb07n1mRcX7DQ1bunU7a8uW1xoaikKhvRGPL4rHp6emntDSMicpqUtGxsHV1Q/n5WX07Xv8kCFnte2gunrznDm/X7++OBT6TWATgEVF3R6+9dZx/79KO/3pgafCodC69Zsuu+zsLvmd2l5/7bW3a2rrTjn56H/wyt9D7wuu/ZqzWn3/TV9zhK+MHcHofwQSEdvo0aMSsWDiz5KS8sLCLomE5ZeDuW8ckyc/ja+/l8mTny4prbjm6sv8/Ug0gQMOPOXd2c98zd19TZSUVkyb+tbUabMm/ttIol/A9Tfc8fLLETLZykz6sCst1DBv/ryX7rvv8Y/nhZOSUhcufLaxMTZ48HGZmV2WL59aXr4xJaVPVtY5ycn9ghtzCA0NU2tqJsfjcY6mA2EepYGT2RZYwhwRDi9IStqvuXlO0KNzFBcwg/vYiX2YyZ9AGb9nUyjUmpR0Isnx+NrW1jk5Oft063ZNPN6Kysont2yZzVjS2c7LFAURXmKEOeRSyjDCLCaNLYGKZzHbOYaX6cyehPmInvShJHh7F5q5KFAebcOjfBiYPF0XtPi0YS4TOnTYd9u2aZ06HZydPYhwefkr9fWNdOGSL1ESH2Qe1WRySLtoL4F1zKJjQABdU1SUvWlTPsmsJpODqWE1izmQI1jJW4G+/fqgB6UbexOlgiVk0dTOdhxrA8Gmk5hG/4AbuoRF7M1BRKhiKT3owRaeoZBC5jKIJD7mhHYGoYJ/zOA9+nEp2e32G2d5WuoDObmx3Xffs1evPvPnf7hi6SdD0tPjkczSDmd36jSShA3TX1MwW7ZMjzU91angyEGDThO4nLf9t7x86auvXhkK7Z2cnMgOxmKxyoaGJzmF8z9fRo8Hp+BFCoLYOplaEhn6K9qV7BPYyo307V60+fHHb0+U7O+77/F77t1IDu8R5ZQgST+VbnTjfYYwjwOoZDupbOSA4cOr/3j3BH8Lm0vKpk9/Z9KkOYHy2lbeIY+TeYIahrM4qGXH2c6HHEUdS+lMd1qZSw29AmmwWeSzmVwOIfGz08Q7tDCSKamp+0ejq1tbVzGMbKanp5/R0PB4SsrPkpKOi8UWNTffHApVRaMJuioag67B3QIXjAQSvxVVFLMyJeUnkciItvOYOGWx2Jbm5ttisRX8kD5fSlpV87tQaH1q6olktbTM6tgxv0OHvRPnurW1dsOGZ8LhzC5djm9trSovfzkWOyho3kJ9LPZQaupu6ekHtLQsr6ubtt9+VwwadNoXjnM8Hn/33ds//bQPI9tfZvH4a7feknvSSUf8zbPzX4116zbttFPR+OvvaB+MbtxYOvHXd93866tycrL+3iv/AL0vvfFrzmp1oDz4v48d3fT/KSgoyE+Eg5g48a6Cgvxnn7n7zknXX3P1ZXdOun7IkIGXX3F9W8N7SWnF5MlPT5h41+VXXH/5FddPmHhX23u/+gQKu5SUVnzNQXDeeacmIlFMnvx0QUH+34xEi4uXfOstTSWlFZdfPr66uvamG3/0vxOJ4vrxV44dG2UlnUgO7kObeZ99x469rHjBksrK1aFQeLfdRqekZK9a9eb27et22eXotLRwc3NxLFYWDueFw7nhcG44nBONbqitfZRcRpBHNW+Ew4kwaAXpHEYSy2KxvZub59NED87gPa7gTvZmv0BsP9G3+wlrqU5OPisUyonH17e2zohEMmOx+lAoNRqtrqx8csuWTzktiERfZLd2kSi6Mppo0AKfxt4kWjVbiTOY3jwT2JxGA+/4FuIUcmxQo7+MvGCD1mAZy640czm70xjURhPLXhyybdvrXbuemJ09OBZraWhY19S0iSTOChpBmoOliaNIJc7udPi8HmqUbvSgle3di7ZefNHhr7x857Bh9SymkIMDS6ESepO4a3aknE000o3hJAcHORFKHsphDOeFwOn0Q16lX8LCNBTCuyylARzEp0yhnmdJZxbrmJ6e3istLYWVQVT3EfvyDG+2EzNK4QmW8xuK+BFL2619nZv22K1LbW3NzJkdHn742ZJVy+87/fRYx47vVm5dvfr27dvnJiVlRSJZkUhmJJIRiaSXl7+6cuWt3Xsd88knf54586akpNRIJCUSSQ6Hk8LhyMqV06dM+cG++57Yq1drQ8NjsVhlgssYCkWSkt7kAjZ/fm4TeScUupvDeI0NgY1tGrszkdfaXVqruJrh/GLjpp+OG/e7dq6eCW7JweRzH7N4gV0CRmYKCziY7jQEzqX7B2yHv4HNJWUPTn5q0qRF7BwwvDtyLOncRZR9idA0bFhFu2mn0tS9aMNJJw6hilDACtiXcubTQCuZJLqFurab/0iKmE5NOJybmnpMaurBiVawUCi7oeGp1NRfJyUdh3B4UFraIwxlM9UgLeEUwAJWfV7sNpX1rCCtufnmaPTdUCg7FMoKhRLt+RmtrU/FYqvoyEQ+CETZkgOS+l2UJyUNDoU6trRMCYfztm3bunHj8y0tVYSSkrJjseasrD2bmsrLyp7JzBwbiSyOx58PZpVBU0pK/6amT1pb305NTV+0aPJLL11SV7el/aF+443r1q9/ly50IC8QEl4XDj/ywovT/+6P6X8zdtqp6AuvlJdXTvz1Xddde0Vb3PnlV/4Jdkg77cDXQVvV/s47b/jLKyXlXyiXJ9iWl19xfSJeLC5eMnXarESceuek688779SCwi7to9XEsIloNRGq/tNo9d+h7lRaWjFkyMAvv56Y27fbw5TQbzpgxN5HHnnQv0O/6R/g+vFXXnzR7hSTSgOfsJoT2HvjpoPnzi1Zs2blvHmPfvbZusLCe5OSjl6y5LktWz6LRFKysw/fvv3Wmpq/yOLU1T2xZcuF7EoGDZTxYjicFQ6PAuv5KNhnEjPYjRjLSeJ4tnBEwDFdwhYe5h5uj0SOoCker49GP4hGZ3TqdF3Xrg+0tlq9+uyysj9s2ZLoHErEak8S/VI2UdBLkahRbgX9CfEmGwgFicadiNHAbPKo4F2aE4xVqrgmMGSPBPKfa7iWelL5NX8M2LSJ4KaBnyZ67SORVNTVfVZW9nxy8qUpKSP4KcVBDJRYPuDn9OQMFjGjHZk1Qg1PE+IM0oYP73PhheM2l5SVbE5U6ofyMWUcyWFEeITWQDtpHauD4xAiyipmEA8Sk7lgFjOZzyDKGcvV8fjR4XC/UGgDb9ObY7iCZv7MKHpxLItTU1N79Phjz5735ubuFYgPnEVfjuUj/kA927mZdH5LL77Pd5nIy+ChcPiJI0eNWrR0RX39iRzS2vrz0ureS0pKbh07Nis1KxYbvmzZDevWtSkxWbfunjVrfjdmzA3Dho0788zJ0Wjts8+es337XwiLCxY8PnPmTUcdddnhh18ybtxvDjzwqIaGR1pbl8TjTeFwWufOZ2VkZHEBbyJgMNeFQvfRLxQ6h9tYxns0kcEgxvAst9DMTG7kBC4EPTdu+ul3xk176OFnihe0/+3ag6OYyTC6EwpkyI6mR1CFiHIQKVR3Lyr48pd0c0nZxReNf+75WjrxISuZDyKkMDKhPNW9aNPFFx137z03X3zRHhRTTVb3omW//e2Vt956za23nMXM4Bkvm/1J5YOA7Fv/pd6phNrANuKhUA7RpKQB6ennRCJ1pKSlPRCJ7E80aNtPSk29MSXlYlYF9OVEBN+L6UxrN+y7vEN/unBYc/MtTU03tK1rarq2tfUtdqIzB3M/k4IAfRs/TjDCQ6HOTU1PJCUNzMn5bW7ufbHYvmvXPlxdvRTRaEMkklVe/kxOzvkdOlxUVPRoVtbgWOyhePwzqojGYg3Nze8MGjQyP7/rGWdcmJnZ/OSTp69ePQuxWPTVV68sK1uYm9stHr8xHp+bmFU8PiUev7xjx72HDRvw5bPz/x+2bau64cbf//yqS9pyNF9+5Z/jvzkY3VGm/zbRViM+77xT20eff4++OWHiXbjm6ssmTLyr8G9lHC+/4vrzzj1lyJCBiZxf27CJHRUvWNrGBPib+Mbr5n+TGNq+dl9SWlFcvCQRBP/NT/TvwP9+af5vYt68Ty648BayaebogPmXuAdMz8jIKSy8LbFlbe2M8vIbO3TYuampMC1tl23bnktK6pOU1LO+fkokckwo1D0Wmx2LhSjgVCaEQsnx+FoObKdOPywwWOoQCBYewhMMojdvs53LWMKLkcipoVBha+udkcj+odD6Tp2uT0n5S+v99u2Tamufi8fTyOE0MnmUrYQYGURXqGQmXdmHVRQHMjGz2YNP6MkApjKSGhawXyDbNIWV7E9CQCqZTxkXKAS9zjMMIpf5HM1MOvFrurCUn5Gf+HQFBaMbGtZUV69MTx8fieyDlpapjY0TOYUTwHM8y9FBH3Q9L1PJ4eSxnjcYEkwMC4YP37ppY93GTTvxFp3b+YImsIZN5NDEQvoE5q7L6RfwEOo5nkqmBWJYyQymnGPacXnncgdHBiSEGSzjkHZEQHyWnl5TUHDNxo0/aGnZKXCkFFxI77KROIdx8eevviXcQXZ62oYjR42a/vbi+oZaBgaZP7x89IDVxRvrS6pHsZ03s7N77LrrxHXr7m1omDdmzI3duu3RNtbbb/+huPjZgw++rqzsk08/fem0027s3/+vrNClS2e9+OKvo9H+bO7UaRwaGz/dvn0apzGNA0KhX3x+bpXx+C0sIyPgtjYnzNnZxg84mHoEBegabuAQnqeg3al8lWNoDBrnQxzMdt4mif50ZCMrrrhi3HfPOeXzc0jQaWaxJ2WcSwoPs5VODGQkm3ni1lvOanO3nzfvkwsuvKl7Ued77h3frbDrihVr5rz38aRJK+nFOwEROc4SunEss3iHke14CHNZEFgYvJOaekRS0h5oanq9tTXGqpSUq5KS/lqzbmn5c0tLglrTn/Wk0kxfmllJMkfzCUs5IKC3DqOW10OhpNTU65qbb4vFSjidF4J6RT0zwPe5lU7sw/PhcFFKyvDMzB+07b25+c3a2ltzc/tWVy8j3rHjj7Oy/sprrK19vbLyVgawNCnJqFGnr1mzMCMjsu++o7Bs2eJ33nl9jz1OX736rUgkadCgE4uL36yt3ZcHOJcs7uzS5ciWluqhQzNzc5JvvfUa/z8iUabPSE+7+prbrrj8nL59d068Xltb94VX/hX0/tntX3M+q2/90dcc4StjR2b0W0Nx8ZJEQvTZZ+7+QoB49OhR7WU72zBkyMDSoJL+N0vqo0ePmjptVmLwwsIubcMm4rw7J10/bdqsf5D+LCjI/0Yq9W1IBJcnn3JpcfGSktKKBLvg8svHn3fuKaOPPjjx79KS8qNHj2q/5Tc4gS+jrTT/wJ9u+RYjUQwduscNN3yXGg4hneYg5xFll/r6pXV1b8diNbFYbUbGfkVFk2trI7FYXSTSoXPn86msr58ZiZwVCvUmOR5vYU9+yk7cHY8XBRnEGB2op4leHEoDWZzECyTRzCtkM4EBnMIlsdh78Xg5qRkZPbt2vTcpqUc83hSPN8fjLbm5l2ZmjqEvUe5lPblBavbVoJ/3M6bRl+GE6MtBbGAFISLsS0VgBVTPfI5pF/CNYThvBK0eO7E3T/IEj/Mc+9GbZGJkBgX9s3iaS+jN4Yl2+8bG9bW1tRkZ9yciUSQnH52RcV84/D4TuIepjAvCF2RwOrvyHPN4jYPbTQyD587tt3FTDal0Yw/60hjoEjTRjQGUkcqBgQzWckJ8RG/6EudTXg500VPIZg3nt4tEMTzB3GU1M5jLkMBHIBZcJ/0aGurXrDm1pSWJXu2oBa2E6Bi02Hf70tVXmIi29xs69MXXttY3pPEzfkoOt9HA4VOXji6pbqKUPE6qqWmcP/87eXmNp5wyqVOnXk1NdQ0N2xoatjc0VA0ffvbYsRM++GBSZeXCiy/+U69eQ5qb65ubG1paGltaGvv2Hf797z+6007hcDg1QThOS9stP//CSORV+oRC57VjTSSOYWYodCFZVLEmoU3WTme3IThTGaRTw0ROYDg/J5U32U5TwPr4gE4UkEUlrzOIOpJYzRIG7rH7rl86PsrKKsihmivZiUK+Rx37BW1n3fjJz65696GH//IAX9ity/DhfYu653Ur7Iq33npv0qQXySeDg1hDGWvZJYj4R3E6H/MGcd5mMWOo5Hv8oKnpvebmGYjHt9GZUc3Nv2pu/n1id83N97a03MXhgah+FZVBk34KA0jjcZZxEFnUBo+L6Rwfjxc0Nl4ci23nDJqoDux80xhDb66lMPi2RjMyzsjI+F48Xh+PN8TjDfF4Y3Lyfnl5j9fX58Tjrfn5t2RmHh6Pt7YlbrOyjuze/YXU1HhGRuqoUacnJSVv3Vqak5MXj8fRv//u48ZdvGHD9NTUjD33PGn79g0NDRUcyG/5kDu7dh2TkdG3ubni7DPP3GuvEWed/eONG0v+5g/pfzUyMzNSkpNvv+OBjRtKfnv7A5dceu0ll1773nvzvvxKeXnlz666+Z8M99+cGf0vVqX6b0ci6ioprbj8iusLCvITrfSJnvohQwaOLq24/Irrr776svYt9m2B2nnnnXrKKZe2UTPbMGTIwIkT7/ry620479xTLr/i+i+kP0tKK0oDdfppU99KFNb/Znn9K+DOSddPnvz05AefKSkpHzJk4JAhA5995u62TO2dd97Q9gHPO+/UIUMGTph4V/tm/G8WxcVLJj/4TKI0/+9TEv3XceyYw8aPf5THOTqg/IeYzUf0i8XqwuFstLaWb9lye0tLczxeu23b0zk5o9PSBrS0fBQKZcbjZbHY9Hg83K4LNUHzaiGHzoEx0ofUsAeFlPMUP+MOPmV/zmo3qQPi8YJo9IGUlINqa1+JRjd16vSrtnXbt/+xtvZFdmcAa3iE7oERZRZv058V7EuPdmN25VA+IEI04M8tJkwFZ9I5CDISR2AI+UwNFNQ7cSAf0cKhgVt9DTFaSOJAVnInRwV12C2oq+uZkfGDdl3YEIkMyMi4v6HhV9HoQs4OCAbxdsTBg2llHgczMNCcb1tbwK5MIUSnv2Xe8wklgYn8EbxPC/UMDtiBNcxh9yBGjJBOd/oHjMP2xy2bBxnBcF5mL9YyiF2oZxqpxJKTk1paXuAQugTv/YilXEgGDzOf8cGh+Izrh+++89zFTaXl5US4KnAHPYWd+R1n8Dh5gehVATm9e/dbvvz1Ll12GT78bAR9M+rrt73zzh979Ojd0FD74os3n3HGxOzsv9A2QiHxuGefvb6urnL//fedNeuu3Nyj0tL6RyJZ8Xg8I6Oxvv47jA+F/hrxx+Ov8pu0tLMikX719b+Ox3swAjRyHA+xhB8Tppw/cCaJOnsel/IK09mbDN6lF8OZHQjLj6Qn77OVNYyk7EtnMIF0+jOOEE1s4UkuoSuN7ToIj500aePzz110xRVnTpr01MZNRxAbO/bKW2+9bHNJOZk8x4EM5kBeYH/2DHR8Q+zMebzFI+AIsoOAcii9W1oejEYficfryKUXBa2tU6PRjyKRQa2tUzmBajKYxRjmsYlwcGn1oIK9yOJD8phBTeC4MZx5HMo2XucgnmN48EvSi/fZk3W8z1G1tTdnZtampZ3R/hjV19/V0rI4Pb1nWdkPOnb8QU7OX0tbsVhjRcU1sVh5nz67JyUlv/vuc4MH77d+/Yo1a1YccMBhubkdMjIyGxsb+vU7eMuWVWtWvxGNHksmz7ApI2PnzMx+paUvdO7Y2qdPn1gstmzZmueen/aDK877OyfrvxU/++lFuO7aK77w+v77D/3CK/F4/Cc/vuCfDPffrDOaFPrn2+zAvwXnf74knUhJlpaUdyvIxzGjR+01ZODUqW+1T4WWlpTfeecNIboV5P9h0vWXX3H9HyZd336QspLywoL8EMeMHjVx4l2lpRVfkIvaa8jAwoL8L7xeVlI++cFnEnufVlKe2GPom4tHv/xJE2X6L0w+Mb0QC4qXfFO7br/ThLXSD35wbudOHb71MLQdWhnAq2xnGFNYwyCiLS2lqKmZtmXL7fQOhweEQp9EInlbtz6WmzuaFhqi0afpQ4fgnrqRn9HCPkHLxU6ks4b11JBGPi1cx2ieatc/0YYWytkzO/v+urrrysou7Nz5N5FIbmXlLxsa3k9N3b+pqZI4vcjnYzJJphO5FFNEt8/7BkXIIIftrAGd2Z3ZrGG3z0euiLOAGFtZwB6k0Zl6smllGWto5XEOoC/dQW/CLGdGJJIfi71RX78iPf03oVBG29DR6NKGhp/E493I4L7ANT4UhBeNPEmEC3iWVZz4eU346awK+uJXUsIRAdUPs1jL7qwP0m/78QZDyaOVFbQyrJ0e0x5cwJ+4kOvbtSE38StW0zkwrMrgA77DAl6jjO7syxM5OSfU17/d0DCFEfQPtFp/ys7gGh7lEq5iCfcPG7jrLjvtNHfx4qUrunHl5w/+MHZmEh05B7zCzCFDRu2zz0UDB5741lu/Wrfuo+OPvyUlJQNlZcuee+7KwYMPOuOMn+Opp26dNOmMU0+9sV+//VBVVf7gg1d067bzj398f0pKWvfu/Z544tctLeXZ2QfG401ZWYNTU7tv2/aLePy8UOh8xOOPcG9GxlUpKWORnb1Lff3Nra0vc1BgpnAWU7mMPajgNNKCXpnEGTyYnjxLI/uwG2EaqGQ03QJb2o0cRBKNoS88r4BNG0uoYnNQXq+hlD9zzud9EDbzp42b9vvZVc+zT6JZfuOmHt8Zdytl9GY33mcFddRT8fnnDcSopoXRpLGI3WkiRDqXxWIfcX/wrlzOiMc/am19LVCwWkSMowPr18Eso5adSaGVLGbTk/NZz2OUBZxvpPA8R3My+3Mf5RwQqA2U8z7jGETPuro/NzXNycn5i5R9be345uaPw+E+qalpOTl7lZffW18/Oz9/QiSS09paXlJyYXJy52i0ITc3f9asJ0aOHHvqqd/Hk09Oeu65hw888PA+fXZraKgPhyNLl04Zc/jhU2Z04Y98TK+MjI6bNz/VIbulU373+cXFv7j66oKC/vsOH/J/OVwJhUJdu3T6Jxt97WD0WzzCodUrZ397e9+BfxUlXwor/SXAmlW8YMmQwQNRWlpRXLxk9OhR5593CoqLlzzw4DNfCPhKSitOPuWyP0wa/zejvanTZhUXL73m6kv/TZ+ibS9Tp836ciT6T6f3lZE4UNOmzZo44SfRaKxbty7//D3/Wzh27OUbN/WkmkWBcXwiM9HIJx06nLVt20Ph8CHh8KB4fCNv5Od/r75+fnX1TDKpZx+K2EIJZzKBwnbuSm2oYiUZ1NKBw/iIhfRlLYdzdrDlizzF4SkpyRkZ16C+fmJr6/uhUFI83pKc3KepqYVhvMJuhJhDKsn0JcL7AdFz/3YKSs28TzWp5LKeXenOHHqygmEcGmxcyROkkENjIJezZ1CFPIAP2MpIZnAYMxnAHjzB+XzCR9nZpzU0vJ2ePqypaWlLS116+o2RyAA0Nz/T1HQne5LOeoqYy4hAObKEP9M/YJS28ALrOI6uNPEKjRxDDSsD4cmtHEYur9LAEOpZTZThdOQV9iQ7iLDrAhroIg7mtOCDv8Sz/JAjWMfVZDOSWYzjXSo4JXjGmM+bjKM6FHqiY8cr0dy8qrZ2SjyeSx7f/ZKC1RtMJTZ6xIj+O+306Zo1r7//CRewX7tt2qLqB3iT8cGfH3frtvrYYyehtbXp7bdvLimZd+yxN1VWrn3zzduPOuq7Rx11btsQ7777wtNP33bYYRf16rXXo4/+eNiwI0855a9EtM2bVz/22E0VFS1NTesKCs5NSurQ3Fy2detLra070T8UejUz86akpPZT0tBwd1PTk8Q4J+j9ms0iUjn/8zZXocBYYTadOYw4c1kbuHnV8yEbGJ0whuhetOmVlx/wJQwZ+l26sJgzOYQ5LKOClZxOgvjxGfdzAonn7Ydo4SDeYRV78R6pZLKa0aQzkygnkQgsEl2D/VjAqbzJrp8n+L4ZKNQm0qiHkMR7bA6U0ZrpST9ms53BpPIZlfRiE9n0ZVwwYIwn+YhDmUMVZ3NksDbKZD5gL1ZRzZmBHJXENyIU+iw7e3x9/ePR6JqUlLNbWp7q3Hm/zMxd4vGW8vKpjY0lnTtfv2XLjamp3bOzDy4vv7tDhy6HHHL8Mce0/cL46KOZDz9868479165cmU02njSMces27hx7vw6NnIOj2Vnd8/Pqdpr4MDVW7YUFxcPHnxoRcWGJx77Vffuf6PVbAfa0OvXD33NEdb84rvfwDy+EnYEo/8/oK3O/oUYrqS0YvLkZ1BQkF9YmI+p02YVFnT5B+HmiANPnTP7n/Tdf01MmHh3QUF+ImL+wmynTp1VWlrxzUbDJaUVl19+/YgRQ486ciT+oyJR3HvfE/fc+w7diQWBUZxaltORzZHISaFQIUmx2Ox4vLhTp7MikZzW1u2VlY9wODmE+Ji1JAc3whyGtNvJWlbShf35IFBMzGNLYAg0g078lCd4l1EUJCV9lpV1G5qbpzc03ENjSsqgpqYsDger+TO7sZDBrGMru7CYXSmjiv0opJJ3yaAn68khjZUUsZVuZLKcDpzKMt6kA70ppY4hrGY5AwMPmzj7EGcK36Oa6eSwnn1DoYVZWceFw53r6l5MSxucmrprff2shoZ5aWlXx2Irm5uf5jB6soy17EcVc+jEAF7nkM8L0eMtZnEUs+gV+J4nKLAJNavFLAvi7F2C05fg3n3MXixmT5bQkb2Zwp4sCqKc9pjHvRwUpLKGE+aZoEfq2M9vvJnXqO6Y19rYvHtq6iBi0WhtXd2fo9ECLmxXsk/gIZanpbSefuTI5paWV955p6Y+8SRwDF+ofv6GRXQOHlES6ZIt2dmLR4w4ulu3IYSWLn3xgw/+kJ/f/cgjvztgwH4CJdLE/0tL1z777O0VFRuPO+6ywYNHBRKk2oRIX3tt8ltvPV1YeFE4nJFYtW3b9Pr61ZmZtyYlDW7HmvgLO6Kx8U/Nzc/EYiMD+YUYL9KHDzm+3ZMMHmU+u9PAAUwNhaLxeBXH0BIYrK/gYNaGQusff+xXu+3a1+exuaTsmDE3cDCbeIs9KQw4wet4h/3pxItcEOh5JTCbp8gPolW8Txlj6NBum4WMJcy0gEk8PdB6W80pjEXwfHIc0zmL6WznMOaTzTq6sJWBfEw6UQYFeyllOZkcFHxnm9udzSU8RxanBldX4vUE2/gz/kwOx5DXjpOQ+McG/hwKJaekjIvHa5qb/1xUdHpycqdExFxXt7yi4tWMjMHZ2aMaGz+rqpp20UXXDx58QChA4gJobKy/777rly8rPn706Nzc3NfefHP9pirOopo/796vz+H77Vf86aezPvpojz2O6Nmzz8qVb0179X478A/R6zePfc0R1vz0zG9kJl8BOxqY/n9Agmb65WxiYUH+NVdfet55pxx99KjEK+efe8o/DvUKv+kepi9jyJABX27P+kIkWly85IHJzySWr7OvByY/0xaJduvW5T8tEsVFF37nT/ddxmcB17OZchYyhJPZLR5fR2MsNjUlJRSPR7dseaSu7qOkpI4ggxreYDtpDOPtgNP2ftBxvJTVDCDMXHbmSF4JupWbyOZEGvgBH3E83UhubV1CcmPjA/X1E+Pxg+PxTk1NAzigXU/M+WwJ2kSG05vFhIjRk0LeZQkzyaMnIcLEyGV3KgPBo7Sgp+SPTKUHvYKNE5XE3uzFp1SRHsTrid+uKHmcmqikJyWV5uaeF4kUhELJAT9VevoB2dnHNzb+urn5JU6iFynBTGJkB/HlDM7koHb00FDQgn0Mr9OLo4LcWzUlVNJMP3YnmQFBT9gKNtOVw1lEKPARHRZU/FcwjpHtxFNbaGEQpzCLIRxMC6uopYFjgqalthalLhxK7Oarf7HHrnU1NS/G402hUDwpKblXrw7cRHHwQRq4g+2Mb2z+5VMzVj45fXq3+nqSOIJ3+FGgDbSdy1nEWFrb9Qmls7SmZm5jY1VyckZycnpV1YaMjNzGxsbi4plZWXlZWXmZmbmZmbmZmTkZGTmffvrBxo0rhg078NVX7y8rW9e2NiMjJyMj+8MPp7311lMnn/z9kpJ7amo+TBznSCQ7Pb2otvaypqZHg7MfTghs1dXdGI2+2aPH3enppbwaqD4lenRGM407aSLK71jCiVQl+JqhUFYodErA0ZzCrmSRyurk5H3S06ed8935bR1In0eC2lHEyWxgOhlE6cEJLONFbmAULbQ17hzAr0kJuLbFVDOcLFqoZk1gED+D59mNA6ilmSz6sA8vcROP8QIn0EQH0hjL7jxLHZUUsA8RVnEYadSykkaiFLATIRYFNfdssgMxjQ0Bs/zlwO4hI+DSZPN2cIU/EziXpgXio9t5iqbk5KPi8YqWlqczMk7etOnh7dvfD4UioVA4Pb0n8aysfRsaFlRVTcvPv/zee6+fMePplJS05OTUpKSUpKTkSCTp4Yd/U1Kypm+vXvmdOr08bVpRz/677NKLpTybkXHu9urqeUuXvv3xx71775Kbmztv3mt5eelf/Uf2/w7+mxuYdgSj//+jsCC/sCD/6NGjjh496p+Wv/8daqNfwNGjRxUU5p98ymWJqLektGLqtFmBatWlJaUV37/i+qnT3i4szN9ryACcfMplX2FKJaUVD0x+JlGaT0Si3/gH+aYwdOger075LcWEqGI9xzIMHB6LJbW2PnzsmJ6hUDI4orb2k6qq1wlTy5tE2JndOIF9aKUfaXzAHLYEVelkCjiFYXyf5YG26NvgKFo4JPDRfpW+VVVjGxun8nNGU890Wtp5cxewM3WBUn2/wHW9EUGucSk7U0gs6DpvpJlIoENUSRUt9CFCH7oSYxsbA3ZBI13Yg+Qg49vMO+DFwPz9cEIZGYcmPOvr6l5sbU2urZ3W0PBhKJSUktInOXln+pNHC++Hw/Np4R0aidCLVB4NzkICifzcDKZwNtU82a7RqpBZbA5YChFibGE+/TmC+YQYR4T+9A0syxMaAk9wO6FAPDWZZB7hGdICisKnvM9PSOKOIPSPBJKrc7iP3I4dOtw+fvypx+5TVfVINFoViSQPG3bksGGHci9TAm/3fK6hI4UNjVfHYoOXySNCItUd43JmcDkRjgvc7dvwDO8mGoni8dhrr/1s27bFF1987/e//2A0GrrhhlM2bVrZtukTT/x67txXxo+/6/vfH3/88Wf+/veXvf32X6O9V1655/nnf3/BBTcedtjpP//5/RkZGyorX47FGmOxpkgkraDgjObmx2prL4/H6xCP19XWXp6cvK1nz3tTU3fp0eOuvLz9+TMrg9PUlVOo4Uaup5ZjSaGR8lBop1AokRBN5VUOZhD1oVBhcvK+SUnj4vHG5ORz/3DXxmPHXvlpIJ6/uaTsxpsmsYGFII2uSUlH8iIrgptmmBO5njmBOHyEMNVcS5hcplJJHSuZRwMv8Ra1VAa0zixW8EYkUhBcbzmBbelbnEZXNpAVeKLuxVlsoxv7spYy9qQTR7Abm1gUWMk3kk+ECcxtdzYfDfqZEr1Nv+DdYFUdv6ScGLsR53eBwCrW8gcKE0rAzc3PZGZ+Nyvr0o4dH6ytrSwtfba1dXtLy5ZQKK2paW1t7dzu3X/XocPpPXrcO2XK9AkTLtq6tRyxWPT2269cs2ZRenpG927dHn/uud33HPGDH9x04433jBnTLSmpT3r6edUNv3h/Yckll/zg7rv/lJvbXF5evu/wwXbgnyI5+WtFosnJ3+Lcd5Tpd+BzmDDx7iFDBnxNh/p/BQ9MfqZ4wZLSkgoMGTLwvPNOKSzIT4SP11x9afugubh4yfevuOHZZ+76Mmv276GtNH/euads3lz+nxyJtmFzSdn1N/zuo4+aGEZGu6IYSocPrzjm6H3GX/+HeHwUObwdDjfHYnE6Bf3ga7iKVfyZQpKpZFtQtqtnJd3aFWTreJ7PAjnSkbzKAYSZxUjOZzbT+D4hbiE9YKYmWjqeZBl9WU7XIEx8HaTSkzAL6Z+QFmc9+UTZRm/yWE5G4F2U4OflU0AZq+lBZXB73oOtLOOwwNu9B6uD5v2D6cOfcnLOJlpXNzUaHchPWcktqamdMjOPqql5saUlI2GFGgptTU8/qL5+EZmsYThJzGXXQPG0jUL3DBs5n97EeYxixhJnLZnMDpQEVtOdJYxsx2J8l7SAC9GJhWzqXtR546bNHMgC0rmcHjTzO1Ywirc5mKU0cmVwtJ/gJU4JTugrfMhBrJjz0l/UJ157662Jd96Znp5z9NHnY9u2srlzX62ubuT4gHvQGlxX7/MKO9Mn4CNW8DYD2JvmIBg6iYH8iS0cz9p99x386acvFhX1Oe208cnJf2nEmTHj/lmzHhk37uqhQw+///6f19dX/uhHE7p0STR0++STj/74xwkFBX0vuujWJ56YuGzZxxdccFOfPnsk1ra2tjz22C0ffvh2UlJOcnKHzp2PicdbystfbGqqycy8qb7+hqysvQoKrm3/TamunlZefnsslsPwoKM/zjxqOYQWNvBeKHRwKDSQeDz+YTw+n9EUJJTzk5OPSE5O9Etta2q6LBYr4kpu+80thw4Y2O+iiyZu3HQB6dxGKx2Sk4clJ38vGp3b3DwxHs8ik0vpwof8kb24HKzjBoaT6Hp+jz9xEB1YxTy60zFgd6ylgm68l539q5SU/Wtrf9PUNCdoVltBjON4iVqKqGIg/YhzJyexns9IJYeBZJHEApbTRG+2sBM7s5kFHMBp3MNKxvIyY+jGCl7nYEZzI3nsw9OMIokyljCcbrxITzqGQivi8eqcnJ+npf2VOlJb+/uGhuc7dhxZXb0kHo936/brtLS2L0K8vPy39fVTzz//l08/fVdqatKYMcc/+ujkzh3y9hp26Bln/JUjO3furAcffDQU+lUolFdXd9upp3Y766zzZ8yY+sEHbzz84G124B+i1x9f/JojrLnk+G9gHl8JO4LRHfgc/nd6mP7eridPfubOO6//ctD5PwqRi4uXTJh4938sSfQf4JUpb1w3/nb2a0c4w3pepWPxvMmbS8qOGTOBGHksI5dC4qwHgzic29gaVOg2M4htrGIwuWzkErCR+xnMRwxlA9XsyTucH4iNYyWPcTQvcRAfs4CT+JhWDqSKDZQSZy/epwdl1LMTKwIZ7c30DTKjmaylB4lKceLPrjTQiQZKA4PsDUF3cD27s4S9mc2udGYOY6lkDnuxMDv7lNraZ+Pxk2jrp6nht0lJayORjk1NSaxPTu6QmTm2pWVZXd0ijmUp77AnyxlFHcWJnmWeIpNzgs73BGbwAkMJsSs1vE0q9UQ55EuinkuYwyiWUs3I4cMrCM+dm2AQfkYJF/IESQwnwnR6kcYVn29Cepe7OIAy1jAiIdkz56V7EqtffeON2+65p3s02lTYZ9iwI1NS0kpL1yxaMGN7dYjL24XIW3ichYTpyt4BeeAZTgq6bT6kE2VkkcYxhFgSiRQPH37cmDE//MKlu3jxW88+O6Fr1x4779zr7LN/mJSUhL+QSIVqa6v//Oc/Ll++tFu33scdd1FOTod2ZvdqarbddddPKyoOpTgvLzsnZ1/itbULt259q1OnCzp2PCtBNGzbV2XlA5WV6+nDvewdUB5nkcLefJoI0cLho+kcj0+Nx+uo5lSqEpWE5OSTk5PPicVWNDX9MB4/kJ8EY/+OeVwXKHZt5qaUlOOTkk5IrG5uvqu1dTlXtuv02sJ9VPBdbuE42rPhS3k4cJp4gz0pare2muX0DIfX5+b+JhwubGx8tq7uTvZmVcCxTlQqdmcBdUGv3iOMYD7d+Smv8TwH0C/gnm5jPckMDUS76pkXPI0cQ5ynuCjoh0scmQp6sD8lzGQkMdDESsoYQCEbwuHqnJyfJSXtmni2aaMLt7Qsra39bVJSdmHhTZFITpvLfOIMNjQsKin5ZY8enY86aszGjeunTHnxgguuOvDAI2KxeHtGaVNTwwMP3LZ48ejk5EEtLcX9+s249tqflpWVLVz4Qd/eHU844Ug78HfQ6/4pX3OENReM+UZm8hWwo0y/A59DYUF+SWn5//5+E71WfzMSRUlpeUnJP2eyJkrzEybe3Vaa/y+KRAPsxDxeCv78gBcS+tWbS8pw0on92JXv8TPS2M5n9OQmsnmcGLuwNnBs38ZqRjIkEJqZxLP8jjH8iO/wXqCNv5nr2J9qaqilgCt4j1Ji7MWxvEwWR5JBdqBKk8esQJV9DzoFNp71lAe27wkeZxd2pSQwRcxl14QFItuoZCCZAf00FBjSfEyU9xhCt4D3GWVnRrM8FEqvr389Hr+8XSSKbK5vbT2ouXkZa9LSdsnIODoebwkGxwDGsjygimayPyF+z158L6j5NtFEMwfyC1YEfNZsxpBHM0cEhIS2JcquQVd1mIMT0s6bNlYEG/RnL/5IHvsTT1gvMpCfkR4YPyZwAHeEQuvZyJHk0lzYJbekvBwPPf30xDvv/GEo9HBa2p5la15//aGKig3RaGtKcvLI/QbwK94AW7iDHPZmDxqZwdagChziE97lAOroR0GQOV7H3Gi0OTOzw5ev2szMvFAolJGRsXHj2oaGuvT0jPT0jLS0xJLe2tqydGlx//67Llw4e+3apVlZeVlZfyGYNjbWTZp0fUXFiezF+du351ZWvhYKRbKz9yS+bdujmzb9JB5PHGotLSWVlQ9UVtbxI47jVjbyNi0B+3k+SyORcQl6cTz+bDzezGBSqGcKPZKSMmOxxxobL2tsvDAeP75dJPogG/gdO1FPWSh0Z2rq9yKRw+Lxmni8trX1xdbWBn4YcLsTVNEO/Jx9+BXf/XwkigKuAjODSDQenPo42Qzik1gsrarqwcbGF1JSDs/NnZSSkmDgbCWLPLayiVPZg2LeIJWPGcBN5HMWV7GA9wL5s4MYRgsVlIIM9qGWk6nndQ7k8eA5Npd9aWUf1gTWAO9RRZj0gEvajdVsjMVyq6t/FY2uD4dzwuG/2NyHQsn19Y+Fw3Vs27TpyubmdeFwejicFg6nhkIpTU3LN2/+RTzeMnz4fitXLp8y5cUfX3nl/fff8uKLj6alpaempqWkpCYnpyQnJz/yyKRVqxaHQmnxeFN9/b3l5ZsyM7PKykoeeujR9Rs2/cMfz//zSE7+usu3hx3B6A58DkOGDCwuXvq/v9/SkvKCwvy/GYkWFy8pLan4cvf9/2PvreOjONf3//fMejbuBkkIJLi7O4VSoAVaKKUGpUqdOi1QoNRLnWKlBsWKu7sHCwQCRIi77WZtZn5/bB9OOD3y+R7r6flxvebFi83MPvvsyM49933d1/Vn8Iaz/536Tf9HREdFgBtaiNzVFjgpetJNJ0+ee/TRqatWR4P34TUMXhQuPs+BL4yCLuCEcGgNpYLFOAwaiBaZQOgMBTBa6NHcAa/BFfCFTDgB/uLe4+11WAVnwAE/QC5ECOHSjYJW6AagK7TxWlGDKgJfBWzQGnxBJ+7E3ttwC1CFn5ARGovorbmgYFaAG2ygQJTQn+8sXGSyQYFCcIAPDNY0t6KYRA30z6FpstFYz2zuKkmSohTV1u6FajgONgiFwaDCYbCBDE3ABWvgeJ3uDW8DRyF8ColQATuEaGUABMIaoeQv1+m/2QkXQAftvBPOzcn39Q0KDc2DIpAgAGSIAw0K4QD0he3wvqAh3kgKXoCX9HovRViGUp3uQHCQFhwY+P5XX/38008fmUzD9XoZXjcaWzjtu3f/bLfXmEymDq1ajbr9dqPBy1J9B1pDErhBB50gDHYK96wMOA99RUa2C0yHWtgElZBkNHbcseOn+fOfcjhsN/btwYM/z5//1J13Tnz55S8SE1u++OK448f33Vh74ULKK6881KvXgClTZrz66jurV3+2ZMks76rLl1Nef/35srJ76hy1QTZb15yc753OIqBevYdVNTcz816H44LbnV9Vtam01CzUT4Hm8CXUFwpHTsjV6e6TJD1oqrpT03xhJNSAH/wMTaGZJLljYkZJ0iUIhpbC/GkenIFCqACgGt7RtEK3+2dAkvwkyVdVU2EjfAVGMNahii6DtSbTLElaDu//5tT7AFJhBKTAoTq9WRJUwxYIAH9V3aKqZbIc4PFc8XhOC6e0YDBCB9Fe1g+GQhXooTe8IKjYDmgNsyAMqoX6VUO4DYohBS4BYAMD2GA79ILn4G5YDccAKAd/yIe9MBEeh9vhJGQCYDcaA+ESVMD9cI+qti4vf8xuX+b9kqpaUlo63mis8HhqIiMHWq1h2dkTKypWetdWVW3KyZkcHNxJ05xut2fHji0zp0+/a/jwxfPnnz938LXXJuTnX/91Z33w6vnzRwMDA2U5uKJivJ9faHCweeXKpW+99XJCQptOndr8xav7Fn7FH7mBScq4Vaa/hZsxcvSTn/+VDOW/D6dSUp96evqh36hKLVy0YtPmPa+/9kTbv9l6lV9Q/NTkad26tRv8RyvN10VefuGQoS8K5fYsqICeYAIPpEI5PAH1gTrZMjvMAyM8LaKWVXAVwsEDJyAE+t8wywGgDHZBAkytw0zNh5leMSkIhVfBD+zwEVyBobAC+sIO6AzeG3k5uKAvFEGVsHU5ALkQJrQJj0O0ELXJhmqIhHxIBB8ogEqwQRz4Qw64IR48kAWK0BmNFsmqs0KsOx2qxc2yWChVrYL6cBVeFEb2Xszx5lONxkofnwEuV5rdvg0egHbwCSiiOr8OoiEHWkIYbIWucAy61ZEC3QvL63iEboIz0A1qIAvi4STECaWhalgPmhBz7Q4ZXpdwX9/rffpMuXx506VLF6Eh7IJuUAJpMBZaQjWshBp4URR218N3JlM/Rcn2eKxg9vO7+PLLH27btjr90qn4kuKJBkOkKJeu9HgWuZsES9edWnl4/fojBg1Ckq5mZq7bdhoGiGDlBBiF2mUBnAIVfKEXGMAJWfCG+OLe1m8/kynOaGxfW7vRbC6799634+Nbbdny5YEDyx57bHr79r/u8wMHNixePGfkyIdHjXp406afv/vu0wkTnh427Nd9WFiY//HH06urazt06P/LLxfq6CJJ4l8JbLK8WdPOxsc/A5SV7amsPKHTJSvKfUJDV7p5+xPwqSSF63TDwaNpeYqyFjpCB9DDPjglvJc8ev0mSTK43ZOhEL6AR0XO+xH4ClbBo3AWnoFgeA8OmUwzdbr2DsdkWe6kKOs0TYVnRAD9tSSdNplmynJLTStyud5TlCx4RvT2zQQj3AcmKINVUCAeqIrhADQEL322WpZzDIYYp3Orn1+/6uqd0ABihG1BJZyHziDDGlAgDF642QCsGF6BBDgBHQQr4ySUQRGEQTQUQDHcK5R0gUvwBRjBCjWQA08K5gOQDt+CBk6R/h8jzh8gAzYYjQl+fs+VlU22WkNCQ3tkZn6blPS8JMk2W2Ze3gazubnV2q24eG5o6ACdzuxw7He7Xe/MnNm+bdsb8/70iy9W/fLLpEmvbty4tLKy5N57x3/33WK73ejrW9/Hp0FgYFpa2oXOnUdmZZ1dvnT2LanRv4H4ZXv/yREyx/T6l8zkH8CtYPQW/hwzZ3/Z9j/Sw/Tbz01JSb0RB3vFnjZt3vN3I2NvwOqNRP+gYegNtG43DmqgEbggH3pBJaRApCRVa1oJPCga7YF0mAdJEA+X4DUog/f8/KzV1WWQDAchFCqhv7CNuQjHIAoU+EKMcxI+gAgwQVfYCxUwBeZACPQBFZbAZMiHDRAkzNkzIR+aQqpgm6WABsWivH4OwiAE0iAAeoMFTsJpSBQsAn+4LpRWayAB0sAHYiAVWsJlsEA8pEAvSIEguE1E2AfgBHSFU6I0eQjuhfuhFF6FchgJ5/T6MoMhtrb2ODwtZOeBr+AI9IdNMAyy4CQkwWUYAgocBT94FPbCDrhLRA9eHIeN0A5yoB044aRwND0MFvHwcA1CIR96QxTUwIGoqPDKymy7XQ8l0BRyYdzNZlSb4QA8DZdgs9k8QK9v4HBs9Xj8R41qO2rUhMLC3OnTn2opKXtKS18zGm/X6/M1bZPHs8jdEdqCB3ZFcEkXEdGqadPNu1NhAPiKJ5k94IFYsIAGdjgMd4lk2yHoC6PqTOYyzDcaw0ymfoDTud/lOtqmzW1ZWSlPPPF2gwY3PStmZV2aP/9tk8mYlZX+4oszunWr+2wAsHjx52vXLtM0De78jbArsBaO6HRy/fqPA5rmqaw8WVGRpmkB8PpvPMPSYCpoOt2dkhSuqqmqegAkmARuOAAZkAhNwA57wA1zRKy2Dz6GB2GkGO0t0GBaHVboCvjUYHhCUfbJ8m2Aqu5R1RMwCVJkucxkekeS/sQEdbsXuN2LYRKsggai/lD3mO6GFnAWWtUx3PLirNlsAM3hSIdewub0Bk7CRWgu5JYuwRPQH4Cr8Ba0g1FwEX6CYOgEe8AKZkgVTmljoHudMb18lZ/gIETAnRBZJ9AHFNghrCX6ina3G9l6FU5K0rGAgKTw8D5VVWllZcfi4+/3bqCqrqKi3VVVqRERt1ss8eXlh/18C9+dPTsyIkLV/sQTlSQp/cqV199802Qyjxhx1/Xr2WvXrgkIaBcU1LWi4nhV1bGOHYf7+4dlZOzetnnhb06VW/gT4lce/CdHyBzV7V8yk38Av2dW9hb+OxEVGXYq5cJ/Phh947UnFi5aMXL0k1GRYZFRYQX5xUMG91614ou/8ZYbAes7f9jS/J8hNiYkJzcCLkAiuMABB6ElxMI+vX6ox/MtFMMQ2ALroD90BiAI3oCCevVub9z4hfLylBMnXgUdRIIJNkM3qIBUSAR/SIdT0BZ+gpXQWSQpVegBafA6tBQxTQkAVVAPHhZeix6oB0FwAVqCDrZDJNTCADgKJ8EKGpypI/wEtIMA2AsxoEKYV/cRQkCCMxALUUIxyiK6i1LBDKch4WaR8+4QDFvACqpIsq6BE5AD0TAaVJDBUVubAbNuDvgeh1j4TvwYxoEfHAHEp/eGU/A2RMODEFZH3UmCFhAGG0Av+Aad4SrsgkgIBwVqwQZGuEOUv33htvz8I/7+kiyXqapX2mkSWMSO9d7se0E8LJEku8UyVqfznt6qwVDStGnb8+dPfvDByyOCgyYnNNpXVjbr8uXDipKmkq8NEOlDPQwsJCS28NDW4mKIgmXQRyStJagVHFzvUZPAA2VwHOqB+2Z1pySId7lSYbfR2M1o7CDLvpmZZxs2bF6vXkO326lpAEajCYiLS05IaHzx4kmLxernV7f961fodHpN06A/bISLMKkOZ+wHOAudJk2MW/Ttj6GhA43GMLM5WpJkSSpV1cdgSp1zaRN8BX1gJxhV9biqHtLpBivKIVBhA1SCH1igAnZBPZgmenoKYT68IFLjEqyDOBgjWMLevTQYGrvdX0tSOSggyXIPSWqoKN/KclOzeX6dsBXAYJgoy7FO53uQdHMkqoEGg8AMm6EhNBTEZcQTQjOH4wzkQAKE/2ZtY8iDqxAJXSAavoZz0Btmw0DRd9gEXoVl4G1nCYcI8IczUAH5ommpLsrABulw7jf+bcVwFDxwCqw31xyAS3BUknRhYT0qKk4XFe2uX3/I1avzIiNv8/VtoNOZjcZgkynCx6dhScl2WVYUNfmJyZPfnj69XZs/FdyzsrNfevVVj9vds2fvq1ev7N69W6ezBAZ2Kyvb7/GkJSS08fcPP3JkVdMmsb89kW7hJvyRvelvcUZv4c/h9Wr6XTDh4dGH9i///LNpX3w6bdWKL/6MJ7pp8566L72l+cqq6kUL5vxvRKIAuCAB2sI18MBe6AdtwappdllONhjGwU74EHbAGBGJAjEw0mBIiojoCwQFtenefbHFEgkeiIbGcAguQVMIFtqWM+EjWAv9RNndHzZDNTQFoBkY4Cps1utfgB/gqFAYNUIK2ERezQoyuOCSoJB2giZQDsXQATpCrRDMd0AsDK3TzOEHTcEJNUJq1Fuj94ZHGjSCWKiF9jdHol40hdHggmpwgy8MgWJIhr7esi/keDwOmAARgl/oXTzQFzqDCulQC1bxESeE6Xlb0EEG5NURgbcIOukZsEEZHBWUU+9dMwp0Qio1CYaAWXS9eJcOVVWtrdZAcEGKSACbwResYAUP7JYks9HYSZaDNc1ut//coEG4yeTatOnnmTOffiw6anJCAtAzOPjdpk0PapH52miIF/xgb5NNqxzGWFU9WKAx7KwjORkPDeE4XAaPN16HfRALgeAR5EgjqDAbCuAFlyvabv/J5TrVsKHuwQfnVVQ43njjvsLCHKPR5I1EXS7Hhx8+W1KSN23avDvvfHjq1KfXrl1W92jNnTtz794tDRs2hUgYDmXwDlwHJ8yFi3An2Nq1a/HLqtkx0WdLSrYVFl4EiyzfJst9YBZ8D8BP8Dl0gyDQNO2qqp7Q6cZpmg0CYBUocCfUgEmWt4IeOkKAOPQ7oEBIclrBR5K2wypIFZzpG7TpfTrd5YSE5ooyX9NyQKdp2TBAVX1ra0eralrdb+fxrHY634YHwQdmQ45Y42WLroNdABTCNqiqQy+W4RBUwyCognWif8i7tgo2QjQMAyfkQCyMhKswC8ZDX3Fiu8AA42GA4IkCvhAp3GWfrzMrF7wFWeCxWB6Q5WMwAwrF2gyYIYgiHeAUzIcysfYQ/AytDQafysoLZWVHu3ef267d6y1aPJGbu7qk5CDgdpcbDMGFhRtMJp9OnT5t2/btmNgHnn7uue9++ME7xPkLFyY+9libpk1rbDaz2bx588Y2bbqYTElO5/HmzUxAaGj9AweWNmlU/5bU6N/HH5kzKovHtVvLreXXZcjgXps27/kdJxAVGfrbP+YXFM2c/eXI0U96X55KSRUk0Z55eYXR0WG/+377lyyPThoFBRAMvUCCERALEpyCAEU5Cr4Gw0OQDb4iwXMDHre7PDX1XVV1KYrTaAzu2HGB0VgAhaLDJhgsYINUCNTp6sMhGApFkAGPwQPQHDbCddCDA/ZKUprBMFenu8tg+EaSrsNm0cneBM5DOQAuOAf+0AeK4SK4IQkaQC3UgP7mAM4MWVAkCKBOwV80QDAA5ZAG7eCEaPTxsht31hHovoEjsBwioAy217kB+4AKObBGp4uCEJgGW8EoGpJMkAvPCuX8TDgJKngVNM2wB2408LaCnbCyzuc64Tu4ApGghxA4KlSuABXy4Tq0hytwTIjb68VyEQ5VV8tmsxV6wvo6KgpAFnwky/6SZAFZ0yrt9qXt23eYMOHjJ5/8srzc/lhcXP/Q0Aq3u9LtrvJ47B6PS62BXVArJPSNQm52TTURIEM4dIA0+EVYD0RBe8iGTJGxawONQIVtcBqAXHgOzPAsBMIgVR0lSdd6955ktQbfc897yckDpk178PDhrUBh4fVXXrnH3z9w6tQvg4PDb7vt7tdf/2zduhXTpj3v8Xjcbvf06c/n5Fz75JN51dXe1KMJBkIIfASzwAHDQQYnaNFR4V27tK6tTdTp2kuSBZDl5jrdeEnaBE/BMhgkSMaypp3T68dIkhXsUAk+MNBrRmA0lvn7D4VQ2AzPQjmYQNHr74TPYOavt0O51senG7wES+ociNlW655Bg77o1u3Ndu0eVpTlirJSVRPhFXhH00Y4HBM9njXeTd3uRS7Xh/AK3AUz4HaYKxLtwE9wDFqBAVoKvadrANTCFjBAP/CFPlAfNsAVAPJhMzSH7sKlswgOgRUagS8sgqNgArM47sfgF+gEl+GseET0vlcPz8MeKIEnoQy6S5JelkMtlgf1+gB4Ew7DIfgAEsBHBOUdAfgKzsEu2An9oVKns9TUnO/R4/OwsPZAQsKdffsuVpTS69dXOBxFkqQPCIjr1GmuweALJCSM6dp13o/Ldjz65JMbt2x5+tlnWyQnB/j7+/v7L13645Ah9xQX55uN7oKCQzq93m63p6cfbdIwzmwyderU+nf/ff5vX/4F3fS/2+SljCt/anu8hVvwomuPe1at+Pw/3MP0d5FfUDxy9FNRkWFt2jRNSbnwzqwX/ocSon/C+g07p771M7SELTAKPLAHEuEh+FqSKvX6IW73YoiBHLhbtDhcg5UQBpUDBmwFqqrSUlJeNJvb63S+5eXeNl4XRMIlaAGdhamSl9c4tM4UjsJKsECyLOv0+jck6cZOrnG7Z6rqFZChK+TBYZDBAPFCnv0E2CEIOsA5qIFKb2FaxIjALsiGpnAZgqEAEgDIgRaQC8XQE+pDDuyHYIiDI0J2NATuFOXRbXAR+sA5aArFcAG6CIlTI+w1GAZpmtvjyYLWsAHaw7MAbIclQhh8OwyG01AKHeAA9IAKOA/JcB0aQgCcARPcA274HozQEIqgQoRQshAS9x6gvtBERMmysG0EjkEq9IACsAvLgANghvvhIqzX6drpdJ09no1GY0OHY+egQY/07Xv/jYO0bt0nCVmHH4+L875Mqax86rwG1ZAPg8T+PA97oC34QAlEispvOhRAN6EwClyBfOgMQSALBYBLMBZWQW+44+bztCIwcOsdd4yJi2sDXLiwa/36Wf363bV79y/9+985duyT/ElnlJqa6gUL5uTkpGualpzc+NVXp8uyPHBgf2gtZFlluArZgqebLctHpr81ubRM+eJLp14/yuP5SVFOS1JTSQoADfB45sEdEAB2r32lXv8YSJp2VVG2QSPoCG44azAUJyQsd7vzMzLegt6wUzhEHDEY4kH2eNZqmgGeMBgW+voO93gKbLZ1qhoPs2BWcHB5nz5zfHzCgZqa/LNnF1292uhmNu1hmKPTtZWkQI9nC7whjqYXR4RcVDGUQhcogWzRJFQGlyEGCiCuDh0ccTkchTDIgW7wZ02cGXASQqEWYuAENIcHQA87YC30gWTwwD7IAqOwvAey4RAEQgj0g2uyfMZiuc+7zuO55HRuAgXaQxxchArBslWhFFJBB70hCA5FRTVq3vxRg8GvjiKsJEnS9evbz5//vEGDexs0uPeGsqymqd7NMjJWXLr0df8ePZokJR0+ceJ06oWBA+/09Q04sn9zrJ9PXFjYjnPnSqqre3Tu3KJJk90HDkx968nOt7rp/ybid178J0fI7NfkXzKTfwC3yvS38BcQFRn2f9H1/A8jKjLs80/fAjZt3jvh4dH/k5EocMfQfgu+mQxHQAfVsA56wjPgDy9pWiOP53tJMkMstBCeQHvhJ4jzGq87nSVZWT8fPToxIGBkTMy0yMgX69V7GWrBAxeghyju+4AeesIQ8XjqRSe4FxRZ9jMYPq0TiQJWvf5NWY6HGiiHMHF7a+5tVYZ0cMAo0GCHsPPuDBqshhKohmWQB+2EKGkyJMFV0TufBQ4YKlp/vAV9N3iLoTK0hhpYAgXCGbIv+Ai7+d7QFw4Iu9TDRuMoWW4o1sbA/XAVXoCl8A20EjqUXrSGRDggPOgjoZPQYtSEzo4BvoKF4Cviby+SRKPxVZCgEEaA98c9GO6BEFgJ+bAbLkMPCIQKCAdJZPLM8BGs1+sH63TdwACqy3Xy7rtf79p1pNNpv7EMGjTJ3nHcQ6dPez97W3ExyNAYmsEGOAFHYDf0gFbCITZDlH0TQIWrkCP6UbzcgCjwwDGoBT0ME4pIA+uwC7wcAGtFRafvv5+emXlSUTzJyT0GDXpmx46VycktBwwY6XY7XS6Hw+Fwuz1ut9tsNg8efLfD4ayqquzYsavH43G5XLIcLkkX4ATowARO75eFNEk64+fXuF27FnM/XaCqJyVJp2kFmqYoyjJNywQfMIMCBiiGjRApSWZQVfWMoqyDekIwaz9ctVhaAW53gbCb7wfdYQYckySrJPkaDON0ulB4VZZ9Ab0+MiBgotGowpjk5Jh+/d7X6UxOZ2VFxbXt2ydfvdofht3sR98ZlilKucezBd69ORIFOsPn4IRK4XCWD7KgRAdCBygFf2gISp39rAqCjVeewss/VupsUw+C4TJYIRy6QS7MhLWwAQaL8FEPfSECfOGocN+tD13AA70gA7Zrmux0bvB6+er1yQZDa4gS3YRZ4ISLgnsdBgHQEiJgP4Tm5586d+4zo9HfaAw0GgOMxgCj0b+6Ois1dQmQnv59aupHer1Fp7PodGa93kens1y7tuzKle/8fH2bJCXtOXToSlZ5w4YDrl/P2LVzbXygX9fk5Jjg4MbR0RFhYW2aN997+LDL47wVif59/MHL9LdwC3+ONm2aFhT81wWj+QXFCxev6NatXUJCvZmzvzx0+NTvPaN/F9q3a7Fpw0exMVFwAR6BoaKjogru0rSRmubtbUqG3rAZDkEriPYWgg8dGnft2o8xMdODg8eoaq2q1prNSfHxH4IbRghTeC+8Ud3Jmztkd8JPMFZVy1yuCZp2gyKGql50uUarqgXGww7IBANIYBDmn97Kux5ugxg4L9pxWkIwrIV1YIXegAgQgShoC8XC1Ps28BXsUgcYoD/EiiYhDZqAP/wECgwBK+hBFrfwRnAvVEtSscl0vyzHSpIRqsSN3AJ3QxSsgz6imSkXNLADECemVwFuMENHkKAAKsAFiRAKgSJcLofrgvnaXvwxFEZDcB2arAO6QW/YBkXQD/zAJpidKVAKbugIVp2unywngOLx7DKZ7Kpapigus9lqMvnUXUpKsi/bnENP5D59/vy+wkIhvHANOkEKXIThEAceqAQgWRwRBSRB6vVG+d7YrhaOQCw8Cg3gCEhQDjMhV1T/vcth+AjqBQZG63T6PXu+2bz5w4ceeiswMPbll+87f/6EyWQ2mcx6vV6vN+zcuWbGjCfuvHPsc89N/frrz955Z1p5eSmYDIaHZNkIG6AQ3LJshVRZPhcXd5fLVZaXV2gyNZXlktrauzWtQpJ6SNJtirJFVfeKHjINtkCyl2KrqmdVdS8Mh1LwgfVe33aDIULTPJrmhnzIARvEQ2ODIcbj2aaqReCS5XZ6vZ+qXrXbd3rPTFn2jYkZdOnSqitXNppMAW63fffumTU1/eB52HyzH70bXjAYNB+fMfAkbLz5ar4Cj4EN6oEKJyAK2sExKBR8UC/LczNcq8PikOEUXAQNDPALXAId6MRHb4cC0AlJ/2swDhLEE0i9Os4LR6EBvAbhsF1QQksgAHJhi9H4qsXyHcTb7YsVJRNQ1WKIgFQogVkwFxLhmNBhtUEQbIZEeAs+LijwbN48vKzsnPc7Z2dvPHDg6aioNppmDAh4qKDg9J4991ZW/kquvXjx8/T0RUFBncKCg3cdOFBSYbzzzi/79n09OLh3dVX5oUuXUq9fB/IrKoIDAzft3FlUVBQaFvR/+OH8/z3+yMGoXvr729zC/+/Qtk2zlJTU2wf3+r0n8icsWLRi0+a93bu1Gzyo58SHRv3w07qFi1dGRYV379r2957avwUxUeGPTho99a2PwCUKu4AJbHAKDKIa3hLqgwP8wQFp4O/xeKBU05yy/GvbrCxbNM0hSWZNWyOKd14EQwysgFLRirsc0uBVaA1DNO0bl+teg+E9WW7p8SxTlM9hvOgRjob3oRoM4IED4Af3wA+QDZHQDiLgIORAuHAorYBGUAMeSPNmwqA+BEArOAml4AK/m7U+iiAdJKEJFQH1IQ+aCymiI6CIaLg/hEC4LPuDSVVtirJTUWygg4UwCOJEd1EYuOEc5AOwzxumiBRaFeRCM+GEZIaTwhHRm0XWoAiuQ1sIgvMQBVchCuxw+jetx/mwF3yhKeihFE5AQxHZ7IHO3mYRSZJB5/H8EhIS2rHjNxUV6evXz8zKOjd69Os3xvrpp7fOn08NCPha0sWdq3kngH1ghTdBgU/BAkGwDQaAWSgnHIR2sB+SRO5WgtZwAMLACLthqKggd4AIWAVJUAQfwFjwKr9sgK0wzKumvnbtjJycM88//1V8fNPWrXvHxjb88MOXRo+eNHz4A8Dy5fPWr/9+ypQZ3bv3Az76qNEXX8x59dXnIAj0ev1wRTmuKNshXlXCqyH3AAEAAElEQVTR69NjY+81GoMiI/0kkCSLr+/I2to9DsdhWe4qSY0lKVxV12taEVhgJfSCODgHkqoegSHiMSYT8DKYNc0jSXpFKfH1TaqpWevNCFosjf38plRXf1Bbu1yn62UyZbZt+4nRGHDu3HtlZd/r9VHR0e0TEh6KjBx08eKs7Oy9DoefzfYCxEJDmAuH4F0ACuAZk6mpr+90QK9Prql5R1WPwnSQYDt8Cc3gCoTCEWgpND5jhZRsQ/BAJATCKSiCLqKZKUcwsxtAIByGPOgLTvgFdBAPFyADnDAeZLgNomEjpMMgcMIliIEhANwH8bAUmkEFxMM2k+ldna47YDRO9XhWOhwfG43dVLUcfKEWZkEoAFNgLSyGRFGp6ACPAl4bKqdz1d69j7VoMRnkc+fm1q8/UFGcOl2ULAf4+Y2z23cfODChWbPnq6uv5uRsjo19oLz8QIBVsjlDhw2bpdMZgGbNRkRENDt68MOtZ87klZdX2Gz1QkPLKyr6de0akRB6K1b5+/ino8nfcSdLmbc4o7fwG5xKubBw8YovPn3r954IQH5B8cZNezZt3jvnZpLo2XOXQkOC/icr9V6cOHluwqSv4DoMEbrr6fARBIseoEwIhmC4Bk1EqDRAWOZkh4beFxb2CFBTczQ393VV1UMinIG20AGyYQt0EgGZtwdcgmeg7l5dDz/odKMUZQ1MEeGIFyXwLlwHHdSDHiDDaqPR6XKFQw+4DgfBBSHQFK5DPjSHSrgETeAc1BN+oQY4CqFQDn3quHinwnHhcdoUzkIkxMNR6AkqHIVoUCEUiqAGBsExnc5Hr+/hci3XNCO0gnPQGHZATwiFDTAM9oMN7oLvoKfQr2kJOyAJ8qEWmsMlqAcSXII40asuQyV0EHdrDU6BUwiRXgI73C0KUGfgIHSFc9AE3HAKBkM6+At27AloAVl6fXdFOVy/fucOHd7w7gKbLe/o0ekWi3v8+NlGo/n771/LyTH6+b0lSb9mjGprF9vtGfAKACp8CCUgwUloDPeAGXJgmeASXIdwGAxADeyHchgH8aAJlgLCiSocTLAduoETTsHtEAo7EhJCNK120qTZAQGhN06LzMwL3333dnBwSHh49NmzR19++e0mTVrWPbfff//Nw4erdbru3s9S1UJFWWOxhMXEDNM01eksLizcOPvtyW9OP2UytQCqqpZr2nCRhpc07aCmHYOBQnhhD9hhAOihGHZAAjQEDa7pdEXR0bPt9pOKUquqturqzT4+91utD3tnUlPzucl0rm3bWWZzKFBbm5+SMiMiYnB09K/0yry89Wlp2+DVOs4RZfAZ5MFUeN5sHmy1Pnvjq6lqqc32nsuVAbfDN9AbYmEFWKA9DKizG6phNWSBDboIVvclAAxQA83ADtnCUcItEqVu8IcmkANXoQ3czk0ogXVQCmHQ7TdKrjnwHVRJkq/J9KYst9A0m1glaVq6y/WFql6FtvAYGIXKFSBBNqyGNBgF/etEL94CiHfky/Hxt/v7x+fm7rXZ/M3mTl62qMeTW1OzXpaJiholSXJ+/prmzW/r0GFiXSKpF+fP/5J2emG53d4gLu6Ovn3PXbp027Ceo0YO5hb+JuJO5v+TI2S1i/qXzOQfwK0y/S38BbRt0/TU72EK+lvkFxQ/OXl6VVXN4gXv/BlJtGWL5Ojo8Ly8ot9xev9WREd7RYjawQ6YDRtgBkRDW7CDHe7xdnuAAoehu7jVWWAktCwp+Tkr65ni4gXXrz+vqr29+ULoAqmwGjZBOFSDFTpBLtjhKQiuow3kgr7QR1G2wHARud5Y/KG1LBugLfTy9otAvsvlA2NgIxhAgT5QK9iBHiiHVGgmSuTtIBlOQhVo0ABiYTt4z8CjcAKSRWONDrpAJVwU9c29kATNRdF/CESLe7/O6VyoaVEwWqxtDXfDcUgHPRwAH7hXZGEt0BMk2A8SlIED6ov4AAiB1lAEtWL/9BKRKCBBOwiFVACSIRwWQAkcgoPQXbiTu+EMDBWR3xWQIAH6whXQFOV448YjbkSigNUa3bfvPIul+Ucf3ffBB+Py8ur7+39yIxIFLJaH/Pz6SdJUAGSYAh0gDzrBAyK57k1CPw+READ9BQHRDBXQGaLBJSJRb5xhgiDYA2fgPkiD83Av1INaqIyOjp4y5Zu6kSgQH9/0tde+UxT51KkDU6e+17hxC01TVVVVFEVVFUVRBg68Q6/PdLtXaloNyLIcBSZ//yaAzZZZULDOz88697PvIiIcHk++qtYoSrWqfqZpZ8WsQsBXGDpsgCqRYM6CXaAIe6SLBkOYJDW+fv1Jm+0QqE7nVV/f525Eok7n0qCg8g4dPtTrfTye2tra/CNHnvX1bRwe3sfjqfF4ajIyFqalpcMboAOnYMv4wqvQGx61WidYrU/X4VsjyyF+fu9aLL3hG+gPDSEHnNDr5kgU8IMHhEavHVTQQVPwCgI0BwXyACgHDwBNQA9+kAwVkA1mwcSou4QKSYTCv6QqGguRUA0VmlYESJJVLD6SFKFphdAdTsIFMEOAWPyhFtLBCCvgotAgs4q1x6AwKKhxYGBSVtZWp1OF6zbbBlV1gqzX15Nla1BQF0mSi4rWgv3ChbVbtrwGmtHoYzBYDAazXm86c2b50aML6oeEIEmDe/Y8lZq64+ChuZ+vP3I05Tdf5BZuxi1v+lv430NUZFj+700bXbBoxZOTp3f/Vb+p6C8mQf+H49HoqHBwiYRKMayALtBAyIXmggR3QDw4YLRIn3ihQV9IttuvlpQsgwnQDjTIBiN0gkoIhFC4AhcgG3pAIrwIp+toA+XD8+CEaXAM3hQMNu/yiU630ccnXqijHzUYLiQnfxoTcxt8ARPgnJCr7AH+Qs8yHbpCHOhBAgWaQjdBXlQhQiR6t8IVaA1hwrBeBR/oCkZQIBW6QIJg7ykAdIeecF5Vr4j/IyJXoD6MhyohdzoA3EJs0tuP0gaSQAMnNBD6R07xdgu0AhU80Fp00tRdGoAsqJmR0Ba2wAUYDAlgBg3OQFPhR58NVZAqgvtu4LRazdHR3RXFpSguRXF6F8Dfv4Hb7bLbK3S6er89YWQ5DNLhJ/GHACiDArgKmrBOnSgibxXWQoVgKFohBRaLNrIb8ehqOA9vwD2wBYAosIq0eu3Bg0feeefBkpK8ujMpLc1/6627AwP9hw4d9/zzD2/atFqSZFmWdTqdLOt0Ot1PPy0ICmrt7+/vdn+nqlcATXPIsrGyMjU/f0PLlkMrKqqMxqAvP3uwSeNUtzsDzDBY0/Zq2nYAaoVBwGYIAgn0kA77oSVIoINTen2gXt/eYOhoMt3tcOTb7cddriuy7OVgYLMthNMlJcft9ly93sftrjh6dFptben168FnzkzR632vX/85I6MKtsP7YBbCSSYwwlr43mx+xW7/rrr61T8rb9ps79XWboI5cBkOwl54Aw7BQhFT3sAPkAGTIAOuicctTcj3pkMs9Idrgp/tfboLgArhjjsUtsIvdcimetgGx8AEbeE7WFHnE1X4HK6Bpmk9nc5pLtfnf1qnXq6tfVDTesIr8DR8AN/Vee8amAVtIAzawjt1TjbgC9gN9X19o69dWyNJIU2bftqq1fdBQclVVYvd7quAqlYajaF5ecsaNmwuy/KgQRPc7tLvv78rJ+eEd4ijR+cdOfJ1aGhns8Hg7+ubnpl57OyFhx/+7JFH5n36xeEXX3rnt6f9LfwJf2TO6K0y/S38Zcyc/WWbNs1+L9roXyvN/zX8tVD1j468/KLBQ5+GZHBBGvSFwzAUmkI+LIeGEANrwQUDoLV4ayWsAQOUQxKch9GQCtmghxZwBIKgAJpABgwTzoQpsB7Gi5vcEhghSKJu+AKy4HUww6t6vSs8fFxl5X6bTYYyf/+whIQ3jMZwoKxsx7Vr8zVtOOyGcGHFVATnoCeYQBZxcAeoDxqosA4iIUIEqWdE+VKGa1AEPtDASzeEfdAGQkGFTLgMimAgAAehBoaJ0udh0Akf0QAogJ9hIgDX4AB4wAUtBT1gC8SBEWohDwzgAis0BAtcFcZUbYS0lhc1cAgs4A8NhPyqt2+6P+hgr1DFKoAMcIMDOgqJn55wFkbCNdjaocPrcXF/Kk2mps6/ePFbeBTC4WuDIcHf/4Mb2kwOx2qbbS4kQ1u4H5bBQhgDreAH6ArXIA3cMBF2gRtyoRB6QEPYBL3hCOTDPdAI3KJF7Bkh8loMC0GFeDgId8P3MBxSDYYrDz00rVWrnsDVq2e//PLF3r1vv+++Z4Bz545+882sxMTkqVPfByoqyl5//Smz2VBb29TPL6my8lx+/ladrquinIiI6FVSsqdVq+Fms9+5c4ebN/N/8/XHo6PD35r+yZp1V2CAECPTSVKUppVDhvDCPQAt4KQ4/zNiY+pNf2vMvPlLU06H6PWJDscRTXsWpklSS03bbLHcIcshAQGGyMj78/MX5ucvatz48fT0nZrmUtUHoTVcNhp/cLnqwxNQDJ8K53fvsV4IGyyWt/X6bppW7HC8p2m5fn7TdLokoLr6dZcrE2ZBLJTBBxALD0MVfAqn4H6IBxd8CwZ4GCxQI6QhEiELgiEXWkAPAGywE4qhIaRCI7gAwwUhpBI2QQXcBRGwDtJgCKyBEeCEI2CGh8Ef3gUjNIMTMAHKYJMk+ZlM0zWt1OmcAmNhvDjpsuA9b4cW7IUVXmdd8IcWUAa7IAyehx/hDIyHn0JC6kNko0bTb5y6RUVrMzLeN5k6uVyn9Xrf5OQWOp0+Pz+9W7dRwIULB9PSDnfqNMluL0tNXZuQcG9JybFonwobVNVq9947JyqqkdffKzV196mT3y1eMPOWQ/1fRNzlmn9yhKwk33/JTP4B3ApGb+EvY8GiFcDEmz2Q/jPILyieOftLYPbbz//fo0xvfvR/LyTNyy96a/pnx467IFWYW4aJlU5YASY4DX1hL7SF3nAedkAMNIWr0AcuwD5IhHi4DEVggFgoBhPcKaINL7JgtSidP3WzkzWwDNaD1ccnNjCwryTpq6r2V1dfDQ/vFRc3pe52dvulq1dnORwFotTbTNgUDQa38P88AUFC/skXlkEQOKAhmOG48Ea6DG4wQCSkQWOoB4egKcSKxuR4UKEIIqA3nIRyuAMOw2kYAEcgGq7B7WCFn+AhOA+HYQSsgQ5wAhpAMmyFOHBAHsRCKSTBGbBCfVE29YVsaCBigmw4CwEQAm4IhRQIAD3cATvgOkRBL6EklQsHoIPY+QVwGh4Sdp1n4Kfk5FEtWjwBnDgxOzPzADwptKLsMF+nK/Tze1una1Rb+43dvkSoqTeBatgCD4tWJOAXuArJkAWXIAzqgQ7KIB0agV0c6HQ4CYPgKDSGJ37T1fAjHBJl4gwYI5gJ22+/faLV6r98+Udjxz55++333nhDZWXpggVziovznn/+zbfeeq53794hITG7dpX4+NQHHI7CvLz1LleV0Whp12602exbU1N65cq15CTnvC9n5eUVITF46HsiLAMOwkXQQ3PwUty2gg7aeZ++YmPK5s97OzoqHHjksdeOHTfDK2CCH2XZBDWquiEu7pmQkKHe4TIy3qqpqVIUbyQaLz5FgS8hEsYBsARWwLNwVpbPmc2zdLomN76g07nA5frW1/dlh2Orx2OAaXUIpsC3kAMvAvAzLBJk5YZwf53NJNgCG8AEOmgD7W/e80fhiCgRjBDnyQ3shf0QD0UwEGphNwwXa09BBlghBLpBOpTACLF2B1wACzwouAR1D/oKWAs2GA5R8CO0r+Ope1jIS42FWkn6ISbmgcjIMZKEqrq9NFDA5SrOy/uhtHRn69b9o6OTL148oNPpmzXzHlO1qqr08OE1Lpe7fv2Rsqyvrj5gqylo0KBd7z6P+vuHaJoEv47mcFTnXD/QpVPAyLsGcQs3I+6a458cIauB+e9v9O/B75mVvYX/ZkRFhaekpP7nP9cbiSY2qP83SvN/Ed4t//dSpNFR4fO/fvuRx147drzzzdL0gAnuFTW4YLgddsF1KIA2Qvbc25rQFPxhKwSDHwTCOdHr0wsCbq4eRkOCMMhuzp/DAB6dzhMUNFDT3Dbb+erqE4DJFPubLTWPp9RiaVdbexmawFFo4pWbkaSLkqSoaktIgaaQBVuhq5DAzIfz4l7rgfPgCy0gFWRoC2eFmbgGe8ANXSEHVBgIh2E1NAY37IJMuBNqQYUBcBZWQR/Q4BycghEipgmBPnBMDO6EfIgHPygHM9SHYMgXt2p/0VZVClFwAeoJEfJCyIAIIX1vEOF1lzr7JwbugGOgQhhEQk/YCkBDaAWRly59X1Jy2mDwLSgohLfqPIf4wDOKsqqi4mGTabDTuRU6gj+UwU5Q4IU6HWDAnXAUNsFQCId9IhsdBK0hDcKEimQjiITt0AIeA4Sc1o2WpjFen1JRMs4CI1yEsRs3rvLz015++aOGDZs7HHavzrkkSSaT5amnZmzatHTKlEeefPLpYcOGv/fenJKS1NBQjMYQozEoLm7s1asLunR5QK83VFYWXLy4E/zBPy+/aPrMuZ07tXn80Z5fzfOeKkboBkUQDuFC/9IDXcAIRXB+/rxF0VHh23ccyMktOHY8EF4WYkY7NC1OkjJiYh4AuajoO5MpsbY2y2azud0KxEMY2EWWuitMEhSF1+BuaAvv63RBFss88NM0p6YVud1bDYbbTKaH9PpONttzmtYS3vvNhfAgHIGp8DbcA83gDWgI9924UsR+HgAm+AXioLWgndzYoB244Ao0gLjfrO0AJXBV+IUeBwnSBRukGZihGDpDLpwEHzgOTcEAPaEargs5sD9DPjhFn/5aaAjbobMwDe4Cl6A/lMMGTRuTk7PYaAwPDx+m0/1piIKCleXl+4ODo2Jimpw5s93t1mRZf/DgyjZt+vv6BgcGRvj5BStKmCwbKiq2uVw1UdHJV66e8ijzxo59R5LQNLz/ZmWdXbN2cWzM3b+Z5C3c8qa/hf9F/C49TF6SaOdOrQcP6hkdHf4PhJX/qxTSO4b2g4swX9j6eVEA74ER7hPJocFQBd2hHnjgFNjgAigQAcFCJqYI/KA1DIN1cKAO26wCPgcTvAMN4HlB5fTiK9gGMxRlakHBuvLy7S7XoTfeeG/27C/s9uXp6S/f2K6oaGVq6iNW66jQ0Hf8/PrBVp3OB06DXpYzAgM/CApaZjBcEbJQHaGVKGGr0AAaCS2nixAJTYVauwoh0EU4HmULYtwNzqgOukOocOasgfGCFaAC0BLugsOgCYehMBFcauAv7OyBQkgSlADgDNSH5jBAaD956bNJYICLkChynNVggwSIFb+xW+E6dBJshBuLWXhKFYuXDWAJ/CAi1AdLS4sKCq7AAxB4c2OZEwZBW6dzC3QVTxQ5UAz9IOLmjhY3tIY42A8JMFpQSCUwQQA4YK2QuPIDHWTDy5BVxzldBwp8COfADI0EtfEiPAR7Ic5uD/rii2lZWelms4/ZbDGZLEaj2Wz22bp1+apVCx9/fMo333w9d+7HsiybzfHZ2ctraq7IslHTVFV1y7JUVHTl5MkV/v7JgwclvzX1mUcenXnk6PBPPlVTTh+9/75Y2Cs6u91CXPMMtAJABzlwLjz8helvz128ZOVLr25Ys64gMNAOm+Fdi+VFHx+lceMhRqMuN3epzbY9OLhAp9ucn7/GbJYDAspbtAiG2VADXzdtGqDTTYET8H54eBOT6R1Igc+hoaL42u2TNa1A08rc7m0mU6Db/ZnLtcZufyEkZISfnwRj4erNl+9yeFM0Em2Fl2A8hMLrwgtUEjzXDbAGHgQzLIaiOsKietgKOXA/1MLnQmTUu7YaFgraMbAb2sB0qIXD4AITlEMg5MIeeFgc3G3CjLda2Jg9CJfrTP5NOAkeCBa8oA/gQ8iAvYJvrUEwrIL74GF4+9q1b9LSXtS0Xx9xMzM/zc1dExzcMjAw4sSJDbJsHT167tixX9ev33XHju+ys1OByspiH5/6mZnLmibHWyxBjz469/nnl2ia+6OPRubkXAA0jUOHli5d+mpgYPtbPvV/GX9wzuje3/Hjb+G/GV16jDm8f9l/5rPyC4o3btorSKLKP5nd/N/Lj544eW7CpJWQBy4YBxFwFDbCYLgLgHOwAHrDXkiGMDgM0XA/bBWJOj8YBGaRGmwMQCGshgAYB5dhFQwRpUm8uk7wOLSBT0CGZ4XwUzl88uyzt/fpMxgoKyuZO3fm5ctVSUnvFhQsLSxcERz8lo9Pf+8oNTXrq6q+Mxq71tauMZvvsFpfBJzODTU170I70ftcBdsgAUJBAwVOip50D1SJwLSe8I4/DYHCTKgaLoAMLSAMZMiDDJHmqRCxaSvRyOWAH+FxUMABh+A6WKAleFvUN0KCCCAywALF0EukGwvhGLjFZLxZpRagQh5UinK5ArlQC40hTTiP+9U5sNmCdec9ZFmQAongAzXQCZZDMpjhBNx/czt2PrwnSu3ezNYViIA8sEFreLjOxqXwJQB2uAtSIAIugQPi4RoYwCLaxRrDKtGMnwWPiBJ5AcwS+zwFFGgNAfCEWDtXp6vW6eq5XHsfeOC5AQNGeT/7u+8+PnBg05Qpb7dt2zknJ+vjj2dcv54RHT3J4cgtKFgfGNgsMLBVVtaPbduOPHHi5/j4293umscmtZ33zd6c3AcgznusY2OWjxrZ8ZNP10B32AEt4QxEQCvYBI0l6VpMzHs+Pm0djtTCwrmRkdGdO08Djh9/Ny/vstnsiYt7JjCwrdtdnZ7+bkCAZ/jwOcDRo98dO/bTsGHLjUb/3Nz9R47MSUycHBl5m82WeeHC20Zj09jYF1TVmZPzbnn5VfgUgEXwiyzX8/ObYDL1Baqr39fpcuPjPwEKC78pLv4OXhayWQvgBxgBNRAHC+BlUeL4Eb6GUdALJFgqYkHvV94piLytwA3rwAQjBcfjAOyB26A95MGPQsfXBbkwuI5h6Y+wHdrDJUiGY/BsHQLAYtgPA2Ez3AWhcADOwjPQH56GMrgdNkIQtILnxRtt8BEcgc6CEvOC+MreK+4To/FSo0bTi4s3lZZuT0y8Lzt7fVRUtMEQdMcdM2+cl5cv79q+/b3o6MSsrDS93rdrp6Z6nS44vGuHDkO8G2zfvnjr1gVDhjxbW1u1e/eimJhRFRWnt26cdYs2+lvEFRv/yRGywlz/kpn8A5CybgWjt/BXcOfoyV9+9uZ/wKE+v6D4ickzundrN/Ghkbl5RTH/ijjyXzXOfwny8otuG/oBdIVDcBk6wSGYeHPZtwC+hlLR39C9zg3pC/DAYCiA3TCiTsEXcMFaKIJyeKyOVLsdJDgLnwmveS/FzZs4dIAE68aMCbvzzrsAh8Oxfv3PmzdvVpQG/v4PGwz1bxhVA2731bKyDwyGNi7XGUnyMxrb2O2LAwP7y7KlrOwEdK5ToCyCRmCEI9AK/CAXygHwAQdEQzicAl9IgCLIhHjIgwjQoBVkwhW4A3LhFHSEnTAS9sMAkOFbeAGuwCHoDSsgATKgDdSHjRAPesiAWOgHubALYqGj12gUgCKoDzLkCoauA+KgAJJFhilUdFnlQkkd26cUSIEGgiNbBuehlbAYLYUTECfihnw4CI1FNHAAfgAfCIBs6Az7IRHMkAuN4CL4wiMQCVfgSwiCGEgDDYYJFfTvhfGsH8SJiD8arkNX8BNM1kGQAN9DBHSE66BAJgwUzW038I3BUKTTRTsc67t06fHkk9M/+2zq9evpL788Kz4+8cZGDz00IijoAcDjqS4oWCfLkttdoqpagwbDLZbwoqKThYUlMO3mwL0Svvjw3X4ff7okJ7cCdBASG2PMyS0Gl05nqlfvc6PRG8ahaa7Cwnfr1Ytu3nyCzZZ/4MCMhg1ftlrjb4yVnf2dj8/12257HcjIOHLw4OLOnadZrVF2e+HRo+9GRo4PCmoDXL78idvtFxk5ASguXpaXtwfehUJZnhYQMMVgaHNjQIdjnaJsS0j4HKiq2pubO0dRuoAJNsMQkCAVMuDtm0nYJ2AOBIEZCuChOkphwGX4GQKgHOJ+U0C/BhsgFLKhETSHg1AKo4SBxQ0choWiDf+Jmz3YgH2wABSYJIoAWbAd/MEMQyEHDsIwGFvnXd7Lfy8sAB94TOgYUOffg7BAr3fGx98tSVy9+n3XrhNathzuZZEKOqnkdFYdPvzt+fMbB/btk9So0Z59+xomD2rTZsANvmlhYcaaNXPz8q5ERQ03GPwl6eDeHQu4hd+gfrnPPzlCdpD9XzKTfwC3yvS38Ffxn6nUL1i00huJDh7U418YQcZEh+fmFeX+r5Tso6PCY2P0YIeO0BeOwMPQXlRsvUXbUOgIHkiFu+E2sEEBbIQa6A+HYQOE3ByJAkbQ63QmMIi8oBc+YPFaNep0PnAd9GARkvuBUAU7ly07+fbbU8xmi81WvXv3lnZtmzgcx9zuTFkOkGV/WfaXZT9Z9qupWa/TVdfWnjQYGul0wXb7ktDQUVZrC4MhSK93wHYoAQP4QDichkqQwANX4SpEg1G4zpyHDJBEhFcMoWAGFepBeh1z+TzYBTL4gAYmKIKlUAoa5MNa0aUEhEMzSBESpxpchqZC3DsWRoIddov9EwcJkAW1IAtLeq8ogVfdyQrdQIEakKAxJMJ2OAcH4AwkQ6AQ8UkT0l1ehEBfqBB8xyi4HQrhNdgA8yAYYkEDvegougIlIIMBWoIGs2A3fASRIgSxwUMiEi0BK5i8mqwA+EN7qBSert590h0Ow5cQL+TD7HABHoUhYAM71Arj0/vd7mFu9xUfn4ePHk19+eVxBoP01lsfhoSEVldX5eRk5uRk1dRUx8YmuN2VgF7vFxs7zmJJAENy8jhf33oej72qKgseujkSBQLgtRdePjVq5MCOHRqCFhvj99zTI594dIjV2iIubpFeH6ooFYpSqSiVquoIC3umrCxuz54XTpxY0LjxTLM5XFFqFcXh8dgVpTYm5m6z+Z5ly14qLc2MjW11111zMjJ+zs8/ajD49egxS1FSMjMXK4qjQYNJMTHtLl261+nMDgkZkZQ0xWKZo9PNCA7+WK9vpmluTfN4FcHM5jvM5tcyMqa6XLl+fj2SkpZbrYWwAUZCMGRAJnz6m3bA9vAdaHAVxkPIzSyORJgINjCIS9tTR+U3DrrCdWgjnr7yIESwpesu7aAreMAHftsu3Ryagh/sghJwQRwMhmq4DTJhM/jBMagCi1iCIBByQAYHrAAP+IEf+IIvWGCXJHliYgapqisjY3lIyN0HDsw7e3aN2exvNvubzX4mk6/JZE1N3Xzp0o6I8LAmyckbtmzJLzIfPHj44MFVVmuAj4+/j4//yZNba2tLAgPbG43BknT4x29n/uYr3ALwxy7T3wpGb+Gv4t8djOYXFC9YtHLj5r3vznph8KAeMdHh/9pcpnfA/414dNGSlTm51bARsiEEFPgeVoJRLCZYAjvhbRgNO4Qv4pfgARPMh0T4ABzwXR3uaQV8ZTT6BQUt8PN7Ft4RPTReLJCkXwID54SELDKZQuBxyBartsGz0BNePH/+tgceuOfZZx8cNLD/O7Nnv/fuuy7XZxUV3rowilJaWDjB5ToaHNwZOjgcVqfzMAy02y84HOnFxcsaNRoaGtoAdoAMrsaNuw8atNRqLQcZbFAGj0OG0CVNgSFCKlyDYqgGCTJBgj1Cuz4N9MJvaQCsBSOsgmEQLIqeP0Ev0OCoCF7DoIO4xeZAd+hYZ29YYSgEwzbxl1BoBpVCETZWEAyqoD60Fr+xF0EDDSKgHZyGDGgueu1d4mkhQmzmbUkxQGe4JjiIFugHPrAcEiEUJKjW6VobDJMkqQrQ65sLHXsgEZrDCmgmKr/50B/aggcKYR7sgNthKESJI6uDZgCcEfvBFxJFD5kKKYJz/CnkglU8tHifUjLgbVWtkCSrxTImNzfzyJG9ly6l+vkF1Nbapk9/cdq0H9evX15QUJGdvaCs7IDYjbLR6G8w+FZXZ6WnL6+ttcC8OmeaFxrMhDOrf9n7wrMT7r9vQOdOMVOn/7zvYIXNdqSqaqssW3W6QJ0uQKcL0On8FaWiqGhus2ZBinL60qVZkmTQ6Sw6nVmv99HpLC5XyfnzL+t09pCQeIPBsm/fF1lZu2XZaDD4XLmy5uzZhTU1QcePP1pUtP3s2VcTE9tVVn5ps53JyXk3IsKelNSgrOxhj+eiJBkkSe8l1CpKTnn5ZI/nqtEYo2nOjIyn9HpDTMw4SIE9Ol2VyTQRnoCVN3+pAhgH4TAM3ocDghvtXdIFMSAIFsIp0NdR+d0Pu0APQZAGZ+AZaAdT4UCdzQzwGVwUvxKvQV0JnWx4VejkW2C1cFLNhyAohC3wILwNMTAe9tR577uwFSzQGxR4AA6JVVUwQacr17Qqg8E3M3N5aOi46OgnGzWad+LEtqVLH6upKfZut3fvZ4cPr4iNbRMVEbF248ZaR71OneZ27PhRRgZfffUU8OOPb6Wl7TOZTCZThKbu/PHbGbcK9H8Vt4LRW7iF/1d4S/P5BcXfLpjtUZR/X0n9jx6P5uUXLVqy8pNPL8M4mAxpcAWAcXAKZkMtlMMMsMOX0BYehvtgCiyC/hANpfAMjIFo+AgS4Csogmswz8enX2Dgh7IcZLGMCAz8RJZ/gSVQC7P1+szg4PlGYw8wBQTMtFoHwXNwDL6Hz+ERwS5tW1ExxWJp3LVLF6Bb167zv/kmMuJoUdETdvuugoJxJpPWoMGDkuRNv7WH++Gy3R5bWrqxffsXWrZ8rF+/rxo2vAuq6tePa9JkwoUL82trSwIDm+n1RdAXfgwO7lWv3v1GozM+frrReAKuwiNghQpoAw2gG9RCODwF7YWVVGt4DsbAW6DC3dAUJkIr8EAYRMBgCAEDFEItGKCtaCgJ+UvHxNspVQhZAFihHsgQDhJUCgmnRqDCVRFUnRTNQH7gDyFCxDQVnCK2qBS9LJL4rONwHWrEy32QCXoIAEWSbOCU5eaS5KPX3wV4PLtBguNQAghybRh44DTUwAG4BhUwF+pBIHwL16AbNIU0Id0PtINCuAiAR3SAHYIKqAc+EAPPCSV8LzbCS9BV08oV5ZqmOQBZvu2jj97+6qv3p02bFhY2NTHxtSNH/IqLq+De8vJL+fm/KIpNVR06ncluL7h6dbXH0xpckhQML9QJm8rgSSiCpm7PQw898qPdXrtjV1mLFt0HDXptzJivFGV9Ts7Tqlrr3dpuT8nKenj48CHPPPPGJ59826SJ5dixu6uqfn20rqw8e/LkQ5GR0S5XraZpq1dPyc4+Uq9eY+D06a9TUr6Ojn4nMHBERMTs7OydiYk9und/YdiwOWbzPqvVMXbs3BEjZvTqdW95+RO1tV4hC9zuc2VlD/v6xuh0Vpcr/8qV+319GzRp8km9eo8lJY3X66tMphlG430+Pp/I8jJ4QTwKpsFD0AmehhHwJhyAb8TafTAfWkMVBEEb2AU/ibVb4DB0ETnpTJgCLWA4TIaV8CFoYINXRCteALSHLrAAvgLgMMwUZNNgGAiDYDccgEoIgA3wtLCNGA/3w9vivW/CXhgPhRAKQ6EnvAWLIA8m6HQhen0Hg8EvI2N5VNTkiIgHAB+f5snJPzidDRYtGpuevnfbtndPn/6lS5fRpaUZtQ6HW2navv273l+JpKQJISH3zZgx9tKlQ2PG3Fde7rT6ZP303Zxbkejfwh85GL3FGb2Fv4XOPcYc+Tf0MOUXFL89+6vEBvUHD+oB/AfInX9QCmleftHER1/Lye0gWoa9+AXShL7jGrCBDQbA0ze/+wx8Bu3gODwvmujDwcsKWgvLZdnXap1oNt92I/rRNIeqltpsC12u8xbLAB+f+8Ujq5e+Jblch6urP1fVGLgbor2r6vz77cMPxd9z992SJGkwd+7cTZs3BwV1CAnpJMuGioozRUWZMF4IJ+2EOKs1rWPHR8PDvRS95Skpc63WGJerOjZ2lMEQkJOz2m6vjowc5b2ZeaEoldnZM6uqrkER9BPySfuhCYwVVkne+ZyCXHgWgHJYDhEiTXgS9kJriAUbHAcnmKABBMAhoeLUB5Lr7NXtkAthEA4nhbi9XQiwF4NNdLI3g1SogKFwGIIEj7MxXAADhMIlkeDUieandoJR6oJDYIN4MEMS7AIVgiAXmsjyVU2L1OtfVZQFshwlSeFu99e+vn1qarz0gEyoBxFwAnrCCbBCOLggHRKgH8iwDcIgBRrBUKiEH6ERnIZOcBrMQt61BIxgBSOYwQZdIQt2whB4DL6HpTAAGhgMJ3W6WI/niseT5uPzrKJk6fXnkpLeNpmiAaczPyXlBSFyuVmny7FaGxoMWmnpOegLsbBblu/RtDRN2wQjoCtMg1gYCMdiY+8zGCLz86d37dq/TZtfWdFud+22be9euXIqKmqm03m5qOjjCROeHjbsnhuHbfnyJT/++E2jRlNAu3Ll4/j4DvHxbVJS1quqx2DQ9ew5OiVlh6qG5+aeiY6eZbG0uPHG4uLPGzSwtG8/Abh4cV1m5rZx4z4HMjOPb9w42+FIMJl6VVd/6OfXLjCwXWHhGo+nOiLi9ri4P12MTmfetWsL3O47dLo2mlblcLzn8ZyHl+BVGC0aEL2wwTxIhU6wHdpCEOyEnkJ34iy4hVpwZ1DgKITD5Ju5N5XwvZBk8oH+cAaqRZrfDgdBhhJoAc1gHzSFlgBUwAZwgxluNJDduKAKYRkUgAL3Cq3+Z2/sLdgK1TpdA6Oxv6Kc93gO1qv3mp9fB5A0zX3jZ8RmO5uT86kklbdtO1rTtBMnljVs+GB8/OgbG2iaCpKqutPSvgwIyDp//uytWOXvor4W/U+OkC3l/Utm8g/gVmb0Fv4W/h2moF6SaN9enf4dpfm/hj9ofvS2oU/m5PYU5VFVZK16gj9cgAoYAIHggTa/ebcfVIWFXQULhEERvA2vgQ/4QKGPT4CqVmqaQ5J8JMniXWQ5yO1OcToPJCZ2cji2qmrBDd6nJPlpms1mW2y1JhoMubBGkMOsola7DA4sWpwz99NPrVbrvHnzdu/ZO2bMw4piA6m4eG919cnOnbsJWe8NkApGm01OTV3stbsMDm5iNPrZ7dUREYN0Omtp6VGnM0eSqi2WxLpfTKfzkyQdSBAN9SAP9shyKNhBFpRWE5igBE6DdyfUwik4IYgNJcIX/ghchjbQE2yQJhSOAiEJ9sBRAOzwM+RBB/BAAgwBFc6LeRVAFbQFN0hwAoB7IQoihXO9VyJAAwnOQz1IEC8bQGM4KULY7QA0Aw1KYZ1gxGogQ1rbtmNDQ/Vu9zM63VhVzVDVi5Ikm0wNRZarCRRBBhjhNARAU1DBDo1gBARBFeggFHpCPiyGK2CDi2CCQugCPlAOmeCEWGGDfkr0dMfB3XAIJsFKuBMaeRWgrNYpJtMg0NzuQ1ZrYfPmX92IRHNyFoFZ7LTBitK5qupsRUUmDIOGoHkfJySpsSzfD4fgFUgSzF2Hx5NfWvpG//6jmjUb4nLZXS57Sck1YODAl7t3H1tc/LJOt2LKlBm9ew+qqqqsrq6srq6qqakaMuSuN9/8sKrqx/T0D5o1G9CoUReHo7qiIicgILBHj5GSJNXW1pSVKfXqfWo0xilKlaJUq2qNqtpCQh4qKGixefNMl8vWsGH/Tp2eX7nyzeLiq9HRzR98cGGjRv7V1e+FhPQPDu7mcOS5XPnx8Y/Xq/eoqrq8jFJNU0ymyCZNpgYEHHS7N0mSn8Uy02QaAVPgwZsjUcAKz0MP2AmdIQwyQYZaUECCVhAlIlEjpIEEgyEAnHWUvKxwu5Aq6wM5cF7k7F2gg56gQCdoBRegHM7BZbCBD9wNNVAgrO0tdZjiQeCAShgDRcKjeCHkABAG3UE1Gvt4PCdk+YjZHFBQMN/lytXprHp9oF7/K4mitHSt212WlNTH43GdOrXCah17+fKSixc/0+stN9gUer3l2rUfcnJ2nj9/duIDD9wz7pn/px/P/z/ij5wZvRWM3sLfwr+WNlqXJNq0acP/cKryjxiPxsaEwXI4KjhkOqiGDTARzLASqiDUbG4M0292oF4LjzdpMqxXry/i4xvCIzAfXoNu8Ao8X69e5dixC0eP/hJWVFb+SR+0puZTm+3zXr3e6t79jVatRpeVPeJ07vSucrlOlJbeFxjYvkGDjxo1WuDrq8IrUAmAB96FUzAZBm7aHHj7HcNOnjrz3nvzxo6dMHHi6MzMhT4+7vHj5/fs+djgwYNgKmRBS1gFJTZbuU5nunRp6c6dj7lct2vam4WFl3JzVylK9tix3wwc+GJGxsvFxT95p+F0Xr9w4a7KylqYAQNgJWwzGl8ymRbqdBHwPtx4fPoejkJbADbDK9AEPOCEH+ESGIVXTWtIhgRIgvZCW0qDYGgJF2AV/AxG6HDDgRPC4Q4Ig8vCy74zGECDaoiA0cKJp0oU35tBMJRBOTSBaMF89aadQqEN5MFeCIT6oIAb8iBAqEp59HqDTqeazQHJyUPr12/hdj8tSRGSdBh0ilIFMmhghiYggxvChYOADXxhCGhCIVISfV1dIAR2Qbywb40Gt/CjUqAdhEIlXAYD1MAlEf3fAQVwJ0SCTZYP6PVdAL2+sSQFu90nFaX2xgnmdBYUF28zGGJgs6g4t4BwRWkJYVAKa6FC09K9O0SWu4IReoBiMJzw94/2eNZWVaXZbGVGo4/R6HPixNIlS77ZufMjg8FSXp5j1qvu2prdu7f4+wf6+wf4+QX4+fn7+vr7+vqdOnXY6bBFRiZFRjYqKck8dmx5q1YP19bWOJ21e/f+HBISLcupxcVf6HR+Op2/Tucny76ybFVVe0nJZw5HntFoNRh8Tp5cXFR0rra2ymi0HDny46VLBzp0mGSzpdbUpBYXrx0x4pWsrI+zsz+XZaOXUSpJOpAzMz8tKtqgqvkgOZ3znM6F4eGzdbp1MKuOdr0Xn8BRMEMAXIRKmAhXBe1YB27wE5L1sfAArIYvQKqjFnwR3gd/iBAqEPfDPXAKzovntBrwh5OQB2/DKNgkHjO8zwN94Dv4WjCYgQJ4HYzC7+AXeBDehFGwTDx95chyiMdzRpZT/P2jg4Ja+PqGXr78cGnpau8QqmpPT59QU5MPbovF/9Sp5VbrwwEBkyIivi0szN23b3x1tZchzfnzH2RnbzEYmg/s2/ehcePuGXHPyLufPnL09N/4wfwDQdO0BYtX1tY6gBqb/ev5P78xbe4XX/2Ul//rTWr7zkPvvDf/zemfrVy9TVXV/9OgBsM/u/x+uBWM3sJ/CF6SaGVVzawZz/5bSaJ/A3+4Fvv27ZLhDtgPawHYAgfhaYiBe6APrAAfVbUHBo6RpG9Fu8PXkvRFx46vN2v2iM2W7+MTAf3hEdBBB7jLaPR06vSQn194TEyrsWPnh4c7ysomqGpZZeUrBsPhoUO/SUjoD7Rq9WCvXm9WVU2z25fYbEsqKp6Jjp4UE/M8YDCEJSZ+GhLSXKjiPw0ueEZYGbWtqLjPbjdXVVUCvXoNfOeduVarqaqqCGjR4vZ77/3U3z8Y3OALPVVVS0n55PTpefA03A4RbveU2trEdu3uiYho3Lz50DFjvqyuXpmRMaW6+ujlyw+63R3gGTBDX3hKkhJ1uraS5GcyzTEYBsBHcAFmQybcDSqshHnQXjh8fgHl0BgU2Ad3QBRUQxo0gXEwHoZADbjACC2hFiKEg1QJ2EWu2gBNwQdCoKNoqMqFWmhQJ1MFnIYKABLAH8IgCDxwBSrguuhSskICyCL0LIUc0IOXKlcYFhZrtUbrdHJBwTm3uzYqqm3r1vdp2vZBgx647bb7q6t3QhVcAwVkCAYdxIAGqVAKlyAFDHAMroEGRwQnNQh04As+YIez4BBhhwFMcB3OQCjEwTW4DKfBR2xjgmLYYjDE+viMczjWVFU9oWlNZTmipqb09OlxNpuXfope39XjOS/LLlneLpLQ3qJwoSTt8jbbadpFTTsEaFotmMEDWzTtcmho1ZQpb02ZMvf06aWrV79w6NCCw4eLYVJqar2vvx5RWXT0y9deWzxtmtljf+SRUdeupd+4lD744K39+7YlNWxoNPqUlGSeOvVL+/ZPt2w5oWXLZ/bu/SU8PO6RR95/8cXFCQnytWujHI5L3nc5HJczM+/39fVzu+0ej2PDhqdLSs4GBITVr99mw4aZFy7sGTbs87ZtH+jT57na2lP9+z/atu0djz++SJLOnz8/0eXyyiBw5cqMoqJ1/v499Pq2Dsf7irI+MvJzH59e0dHf+vgEwpNCAkyFWcKWwgqpoIPHIRGehSg4AuVQA4GisH4vNIJnQAcviXG2w1zoBcVggb3wFPSGTjADDLBDtNwVgR1mQgL0hQ+hFFZAKZghDkbBVXhZdNG9A2FghghYAC/ASADuhg/gEqyHMknyhWMdOoyrqLhuMoVFRfWJi7srL+/zrKzX3e6itLR7a2trdbruRqPx9Ok1AQEv+vndCxgM9cPDP5Wkbvv2PXD9+vrTp9/Ozt5iMo1UlKptu+o99eLLHdu1m/3m9IUL13786eJ/9Af1vwgfzf325xWbq2vsbrf7+SnvNk5KeOrxcR07tpw67dPCotLVa7anX8l66IE7n3pinM1mX/L9mv/ToH/kzKiUfYuHcQt/HRs37z2ZcuHN1x7/J8eZv2jlxs17e3Rr5y3N/0vm9s/gj0IhnTp97pp13nhiEyjQ7TcKginwvV4fERg4TlVrqqpWa1qwv7/WuvWzAQENnc7KvXvn2O1thaH5DXKnA5b17dsvKamfl6R16tSyY8dWtWo1MilpuE5n4lfqlgRSTU3egQOza2pq4uKmmc2JQlDp17XFxcsLCubB7dDjZvIoYI+I2Dlz5tPh4VFARUXZq68+0br1/c2bDwEqK/N++GGyzeYDXWEzRMPdEFxnEAlSOnWiffsRkiS5XPbt29/LyDgJT0HTOu6UEjgl6RejcagstwRJUQ67XFMhAbqABsfhCvSFEMgVZNAYUCANQmCIcKBZCoNgDAC/wBoIhQjwg/MQCdGQBzV1jkIKnBGBYxJchytCmn4HdIXOAGyBGsiCRIiGcxAMUXAe3EJfqQyMkAR2ISmVC2UQBzmQpNeXBgRE2u15rVoljx078eOPp1dXS40a3eZwVJ4/v+yOOx5LTz+VmnpY0+KgBsqFH2wmdIYzoEA4tIJ9oEIS9AJgHxyHlmCAFEiGSxAMKlRCA1CgHGIhE5IhEyIhUXQXmaAnLIOxsAZ6WSzRkiTb7QtgIDhkucBoHOZ271GUEw0avGI2x6anr9PpWrrdmxUlXaeLVZR4OAbdZPmEwdDb6TQJn8yPJCkTYjUtS/AXLyYlnXnllS+A7OzL8+ZNy8/vAYPEsciOCFkxdcLANo0bAwvWrPl2/frJk1/r0aPf1KnP5OVmjh8zZuvOnTpD/cuX9/fq9Xa9et6vT21tyeHDc0aMGNewYRtgy5aFW7cuioh4VZLkoqKPAwISoqJ6lpTst9kKfHx8OnUacfjwqqCg+IqK4kGD5vj6Rvx6rtvL9u17t2/fMQkJbYANGz48cWJTo0Zv5ecvt9muhIePr6k5abc7Zbk8PPwdg+EGEZOKiu8qKubBBFgLMgyCY1AM0TDu5oTRftgAfiBDh5sdEIC9sEkI1PeGGFgK/vCYuPxvYCVsAD00hxeFs8MNLIbNEF7nJD8G58EI8dAEzkEpPCt0vhA/KW5YBbssFlObNkM9HuexY983bfqMLBs0zaMozry8bTZbiabF6PWDFOWspp0MDn7TZGpW53qXALc7vazsI0XJt1rvUdUqu303zIDqqIhNH895MDI8/PCxY1t3b/lu0Xv8YfHNwuWSJGdl5z795PiTp1Kra2x3j/x1bx86cvrM2TS32zOwf9fGyQ2AnNzCxd/9MvXVx/7usPUCm/2TE7tekfpPjvAP41Zm9Bb+Kk6lXMjLLz6VcmH+opX/MHM0v6DYG4m+J/Sb/rWT/MfwhyrZe0vA3jRew9+sdYHe45Fttl2SZDQaG0ZHR9hs+ZKkdzor9+17324/BSU36/9Z4TikZGVlnj69wmz2u3x594kTP91554jTp7/Nzz9lMgWYTAEmk7/R6AfqkSMfWizm2Nj469ff93gqZdksyz6ybJFlc2HhtwUFX4eGvipJO2DbzW3g2fBuZWVZUVEBkJp6+oknxprN7dPTrxw8uPDcuY0LF94XEtIvNrYNrIYmcBFSwL/OVK/Btxcv7jWb/U0mv8OHF1+/fjEiYjh8BVfAJEhsHvhS09I0rViSTB7PisDAz/T6UEgGj5C4Gg1X4RIcEZ1DtXBZ2IQuE1qekbAP3oYaofFUAflQLH4qc+AKxIrveAjOQQtQIBCuQD7cBY2hMdwNF2CFqMMGQmPIgiuC93kKZEHl9FbwdXBKBNnXoQKSQRVqr5WVlZf79+/56qvvxMcnfvzxt61aNUpJWaKqHkmS09NPXb9+deDA50CGxlAf0sEBRkgRvqOKSPS2E5Eo0BMGw1koBwOkQhTUB0AH5WKQiyCJnKsBfOA2of5zBMxwAO4Dk8u1127/FoZDPDglyQQYDL0NhhHXrn2Qm7vESxg1GAYbDL0V5ZpOlwXodEUm01hNc9RplEnXtJ6adhokeABCocfly0NfemnywYObPv/8tfz8O+pEokD9wtIXnnrv2MK1a4GJI0bMeuKJZT989dhj99hqyh8cN85oNNrs9tLSggED5kZFdfR4aj2eWoejXJJ0Xbu+cehQ6q5dy2y2ih49Rk2Y8K7LtaigYFZUVJfY2IFOZ0VJycWQkMjOne/0eFx2e5WPT73Bgz8wGCxOZ5XTWe1y1ej1pr5938zIyE9J2exy1Q4c+MR9982+enWazXYlPPx+SdK7XPk6XW1k5Dy93vsgpHoPdGDg/VFR83W61eAHA6AS8iEU7hFnnSZcZLsJpdtY6C40vG6Ij3aF/rAZBkE9OAkyJEHCzeqkbugFrcAIfr+JRIHm4tnspNi+DTSAUGgKlyFXsDXq0kkDIQCuQk3jxsMcjqqUlJX+/qPT0r6srEyTJL1ebw0P76YoNr2+n6Ic1+mOQ3hp6VSn85yXDuH9VZEkQ1XVQo+nxGTqqSjlirIJvDyNlcWl5/V6/dnU1Hc+/thkMv9m2n8kDOzf/ZGHf+29u3rtetPGf+LEN2uSmH4la/CgHu9/vPizL3/84uuf3pz+2fA7+v6fxv0jZ0ZvBaO38FfRtk3TRx4elV9Q/MjDo/4xH6b8guLHJ8+oqqpZ8m/Wb/oH8IeIRzu0aw7lQl40Fj6HY3XWb4Kl8CR8UVurlJd/m5CQ2KPH7CZNxu7aNWnr1s89nlkGw9eSdEiU7734Qa/f1LnznJYtn7Pb/RYvHr1z57uPPfbiffc9NmXKzMOH55w+vRDQNEpKUletGhMeXn/cuK9HjfqgWbM2ly6Nr6k56R0lO/ut0tKtkZFf+freHhX1jcFwFeaJwGs/fO7j08JgiCgqyl+9+sfXXnsyMfHBtm1fbNXqabs9aPPm2Q0bPtuw4RNJSc83ajQJquEzOA5zhIP8GngP+oDsctlXrXr26tVLTZt+U7/+c3FxT8C7sAMQijZur6K7y/WR2z3P5eqraQ5QYT20h4/gcRgJp4VyuALp0Bj8oCPEwC/CJbwLVMNrUACaEFC8DoAbaiHZqxwJmyETWohenEJwwWiRJQXC4R4wwrdC3ckfWkAVeKAYgqGhoHh6I7AGEAOpoIEHGgtGqR5GeDydQ0MDJ0581ju6LMvPPPPGmDHjz55dKklyWVnF/ffPMxjM4lc9BlpAHjggBBqKlPZ6CIZmdZTqvYyC+6EWnJAo2q1UaA6hUAh66ABmKINS8IiIuSMMgExoIBJ1FxUlB+6Gel6XVE1zq2qRpjl0uvom0+OVledUNUfTyjStVpYbmUwTFeWqyTTQaOypqmVu92VoArnwvlDmegUeggAhkhBfUuK7cOFnJSVVwof9z+Dz/abd3v+FBgWpqupw2EcNH66o6ubt262+gSUlaVVVWXq9xbuYzUFmc5DZHFhamnr06EarNdBqDcjMTLXZKn194wIDm1ZVXcvIWB4XN0bT1Kqq4v37f+7Ro3dq6oqUlO9MJn+Tyd9k8jMafY1Ga0nJ5ePHF5w7t8NotFRWFqxaNSM+flBgYAOnM7O4eFlERKPQ0NC8vPvc7mteaVLvQXc4UgoKJquqAslQClthCNSD2ULEzfuMJ8NuWAWjwADvCuVdvRAf/QWOgwQRsAcqwAfy4BXIqKM5WgDTwC3LCZKUDpMFP8SLtfAOxENLyIFtUCMowuGQCjmgQUdYB08ItwigDCaBU5I8Fot6+vQqX9+JwcHPBge/lpu7Mz9/N+BwlEhSkKKck+Uzfn5xklRPlruUlLxYWbnQO4SiVBYU3O9wlEO1LPvW1q5u06Y7JMNcgyEjKjLi+MmTz77ySteuXZs2SfhLh/4Pg/i4P7W9u1wug/FPZE2Tyaiqaq3D6efr07xZw+bNGgWHBNTaHf+ncf/gwah2a7m1/I0lKjIsv6DoH3jjqZTUxyfP6NGt7eBB3XPzCv+rIlEvYqLDc/MKf+9Z/F1oghbmhLawFDYD8D2cgo9gGNSC1LHj5FatHrPZ8lXVrdONNxhmgUWWmxkMC2TZDG9DBXwcEJDbu/f8qKgeQGLi3U2bPtOoUat+/W4HunTpM2fON0VFO7Zte+7ChZ83bJjUqdOYIUNe986jX79n+/SZdPXq06Wla9PTH3U4qqOjF5jNLQGjMTEqaqGPTz34ENbCBn//IVZre0kybt++4ccfF3XtOicpaax3nMTEu3r0+CQ/f533Zb16o1u1Gq/XfyQsK1+FhbAWbod6VVVlCxfeXV0d3KzZIpMpFggPH5mc/LFevw7mw3RoAP1B53YvVtXNgYFj9PpwMMBRuBemiN04FD4V/Mts6AItQAOgGXSCI+JlCwiG9aCCCbpDNNihGqKF9nsJ2KAtWMAJNeCGAWAVigeKaH/uBL6gQDE4ASEUFQQxoEIByBACZeCGIEgEGeJBhmqogLvAH4wFBYUPPvjAqVNHXS6Xy+V0uZxt2nSMi0sEoqObKop7//6VkC6iZ6+kQIhoSbkClWCG48KSqm5m6ySUgxUCoRbShPNqOlhAARfEQ5gIjPZBKUgitdYNHLAT7GABP8iEHTBIVUtcruWKcgGMkmQCxWCo73bvVNUcSbKACjpZjlKUDKdzuab1BD3MgZGgwutQCVFgEP37XwgW41CYfbNBAzDPaDxQP7oBsG7v3ifnzGmZmGg0GBRF+WXdOl//0FmzPp869f20tAW7d/+pac/lqt60aUJpabbXdGr58nf37FnaoEFrozGgqupaVtbapk1fSk5+Ijj47gMHfunVq8+TT77y4YeLamrO/PLLJJvNq+dKaurq9esnJyZ28PMLzsxM+frrifHxwzt2fHnQoC+Dg/V+fiFduszo0eO9xo3vyMt7qLp6vfddVVWrCwomm0xDNK0K9LAVHoSH4CV4AObDDR7dBtgDD0NruAf63rx2CeRCWwiE/eCEJAiC2yAWZgqbhqPwDjQCtyQFGQzjdLpImCJ241JYAmPgOgTCXRAMayEdKsAFOTAAXGCFzlADE2EXXIdHwQKRFkvQoUMLgoJeCggYA/j6DoyK+ramxnXt2lKbLQcsknQ0OXlcVVWGJIXpdK0NhvHV1asKCyd6PHkFBfd5PDJ0kSSD3b68d+87y8uLYb5enxMWNqa6Ou/dTz4ZOHBQdXVN506tf/c7479iAbTIyNC8vMIbf8zJLYiOCt+z9+ijE+/u06tjrx7tX3jmgW07D/2fBvwXBKO/2964lRm9hb+Df6Ch3luanzH7a1Gaj4iJjvg3Te+fREx0RG5e4X9nSJqXX1RSWg4t4SWwghMioRvsho9Bhk+gMZyOiPi+X78J0dFdKyszdu6cc/FifZ1urKZVa1q1ptWAQa9/U6+/A15v0qRr9+5zNU0rKDjkdte43TartZ7B0OnVV6empBx1Oh1+vr5JSc18fW2nTs27996vkpP7Hjy4UFUVTVM1TWvXbvSQIW8UFHwCYRERH+l0wTdmK8vmsLAZVmtrOBQUNNZkSgTZ4UhLS7vYqdOMyMguqupWVbequhTFFRraMj5+4NmzL6qqQ1EcgYGtY2I6SdLj8DI0hKNwD9SH61Cs1yfWr/+U972q6lRVp69vy6ioeyXpAPSBLlAFJzWtMCjoYZ0u2G4/qqrl4AudwClCQKAxRAndpSDxx61QDlHQDGrhLHggEXzgDKSBDM3AA2WQBrWgAz34ggrlkAqJEA8/whXQ1VlyYBlIYIL6cA2coBf3ISAH2sHH8DzooEg04wMaFIMVJoI/HIUtML68/Nnp05dcvpxqNJrOn0956aVJAQFhBoPfuXPbvvzy2crKdnA7lMEFuARtBHH2JOjgLhgFZpgnOocAFVbBFZEQVeCS8PU5Dz3hAbBAmtiZ9SENXHAWroJbtHhvghCIEDbrZ+EO+Bki4XGPp8Tt9kY8HlkOggq3e63Hc0jTHKBX1TKXyw3T4Tv4GSaBL9wL3eAdEXLVwNugwKsQAQPgBdgI74uS9wcGw5kGDe5zu6qWbNjw7pIl/du3VxQlMCBg+erVTZu3nzr1fbPZ0r59148+WhwRoaxbN66i4lpVVdbatfe63Wps7O3+/n6LFr2WkrJz4MCHq6pKTKbg3Nxtbdu+Fxs7FIiKGtC168L09Irz51MSEhrOnftt27aNfv55bFbWoZMnvz1w4MMWLQYbDJaKivxFi55q2fLRVq0mefdvx44vNWx4x+7dTwHNm0/s3n1OTc1XxcUzKiuXlJV9aDLdJkkBYIbt8GIdsac74QM4DfNgBZyDSdBIrO0Oj8JRmAfvQQ70gwpx8oyAMggAoBMMhhXwPnwNTaAt1EhSMKDT9dHr74LFMAt+gTshGKohUHxKXzgMLiiBO4QjqDdyaApJMAeegwjoChUulyUsbJaPT3fhy1ql0/lHRLxvMo2orEw3Gl1JSfe5XBVud60khYAiSaEGwwSPx7+g4D5VjYYRXh2xXr1G+PoGFBXlmEz+4eHj7fYLFZUVgwffFR0dfe1a5v/rb+l/Mwb07bJ81dYamx1wuz0Lv119++CeIcGBl69keTe4mHYtOOgvFgF+gz9yN72UfWXP7/jxt/Dfj/mLVuYXlLz52t9nT3uRX1C8YdPejZv3vTfrBY/i+a8NQ/8MuXmF/21TPXHy3EOTXoVJ0A+ACRAGTYRcfAOYDRGwRJJ+6Nbtrfr1+xYWpuzd+6KmDdXrn6s7lMezQlE+nTjhoQULF7ZoMdlTuTYyOLhKd3toaJvU1K/v7ej/6YZNCYldIiMtquowmy2HDx9p0qTVyZMHIyIaJSX1uXLlwNixnwOHD3+3f/+87t2fvXhxQ02Nb0TEh7L8K3nL7c4uKHhaUZKgk8Gw3Ne3Z1XV1latWjdv3v3772c0azapceP7b8zn+PGZeXkHzebADh2Wqqpy/vxrlZUXVDVAUcohHq7BWDgLh5OSplZWnikp2Z2U9J6vr1eUm6tXp1VXH9PpzA5HJ5BhS0TEnQEBPa5f/9jjsev1WrNmM0pK9mdm/gBvCXJkFjwHQVAN4XAeesAlX9+kmpr9Qhy0VijPt4RUaAdnBdtyC4yCNWCAKCgDM1jhKnQVfvTXYD90gE7ebwlHIBncUA7hkA6hYIUCiBTKSnPACD/CTugC5yEA8kWu9G4IhV2QBk9Aa7ELl3boUHn8+MEuXQbo9YZjxw44nVHQRaytgP3QRghLAdlQCMPEyxQ4CrdBfVgKMjQXVk9l4L0QimBYnd6XPXAMfCEUoiEN7JAACuSIVNlhiBR6lqNgtXBF9+K6LB/UtHJZDlCUQm8CWJYlKFHV4TAENsFVuP3m6yANlkMLSIVW8ODNa2tgCeSBx2LRxcffI8v6ixc/l1CGde8eFRp67MKFK/n5/QcMHz/+0T+7vr7/ft6qVT+aTH4WS/3IyL6K4rh8+WurNbBXrzFGo2Xv3mWaFpSUNDkg4Nf4T1G8pVIpK2tlly7W224bAtKJEwfnz/+ktra2VavhgYHR+fkXMjNPd+r0alhYc+/GohEQu73g3LklzZo95OMT4XbbT5x4Ly/vkNk8QqeLcbtTXK7DMFNYf9WFAjMhBR4WZGWtzsNMNSyHWugLFXAAQqAv5MI2iBOWs97t10IHSIbjcEmW43Q6bxEA0Nzub+BusMJGCAE7tAArGKAUNsNIKBGiY0Bj4e+VCZUwBM55icVmc7Pw8NmyfOPcQ9PchYUvOBypCQmDZVnKyFhnNE5wOObpdH10unaAppW53d/Ck3DE3z89ODiqbdte27f/bLNVhYTc43Red7lOBQT4jhw5aunSpWGhATs2L+aPj3f+P/bOOkyKM137v+pq7x53ZRhhYHB3t+DBgwcSEiLEPZAEQogtCQkRPB6COwR3l0EGBhnGZ3rcp72qvj86zbK755w939mzJyvc13vNNd1V9dZb1dVVdz/v89z3xytnzRwX4O97/uK1Vd9u8ug3jRrRb2D/rg6H88NFq4qKyxVFCQzwfe3lmVar7aNFqxd9+PJ/0WFUw55/45AKsn63ivbfM0XgPv4pEBkRYikq+2+ubCkqfWL2u927tlk4/9l/IiaKN0T6DzXgdm2bQxysglJ4CMKgCi543ZiMMBPmQ1h09IDjx+e2alWYkjLZz6+BzXbEZkvXaBYJgg/gdn+mUm1++623+/bpk5mVpa45NeeFF0SV6uO1a8+n/vzqg/3bJCQE+fh8vudo69Y9Hn74MeDnn7/bsGFd48Z9Bg+eAwQERH3zzZSIiGY3bx4aMuQPDRp0btZs1IED72ZlTQwN/VirTbBaT5aWzlGUETATcLkiKys/aNeu3dSpbwEhIdHffvt2Wdnlbt0WORyVJ068XFdXkJw8OTt7e3197qVLs0EfGTnRYvlFkjxJkxmQqtPlJCd/7ePTIiTkAYMhOj39iYYN3/Dz63Tz5jNud1Vc3JS8vPXggD0xMS+GhIwCkpI+zc5eEBf3oK9vE1/fJkZj7PXrb8OjEARfQAy0hwPQCnzhGJiMxnaiGFhdvQMSQIFBcB7OghEUeBAOeyNzOdAcJsPXIIIbCmCA14YKr3XTMSiEALgGzcEXLCBDCcz05qeWgBoGQyq87uXfz0I0tIBVEOSti/oBEqAO5nqdmTyYcO7cUX//m8HBEZcunXA4Er32OcAlKIYuf1oSEOvlGU0hCpqBP5yAo+ADCd6YaAj0gz3gB1MhwBtXFqALxMFGbxprMhTBNYgFEXqDAH0hDXyhGayDPtDyHt2DWFn2g/WSVAWRIMDHspzrZVqrIdergarcM/IkmAqrIRYGeaVJ765ggGEq1WqTyRgb+6AkOSyWo2ZzcIfk6LiIiJu5uedv3AAiIqL4C8THJ2k0GrU6MDS0h8NRVlBwXBTV/ftPlyTX6dPbtFr/4uLr9fWZgYG/nVhRNACy7KyqSjt0qHzs2AnA5cvnNRpNZGSbwMCYrKyzRUWXW7fueObMwh49PggObnbv7q5d+6Gs7KrdXuXr2/DixcXFxRkm01S7fb8khclynr//01VVb8BMGHPPRjZ4C8ohGr6EQdDjnjLBAlgJvtAQyuEA+ENDyIF98BhY4Ufo6M1I8ZTlHYNyWCLLR2T5G1HsL4otFaUcFAiAtdAKXoVlsAW6QyLUgg/UwQHoB61hL5yGFAgBq1cX4jaYoIvdnpafPzok5F2DoT0gSZUWyxNutw/Y9Xq/9PRvjcaXtdoH1eoUq/UDt9uiVvdXlFLwhVM+Phm+vgFhYbG7d/+QkNA2Le2Y211RX381MbG50ej84Yfv27VqZXPW/uWn+c+I119+1PNPuzZN27X5k0J4nU77ZyI2ZpPhlRdn/Ncdulz/uwP8P8X9yOh9/HV07D7hzLE1f3W1Fas37Nx9tHvXNp6p+f+Dgf2v4x+NjzZv+wh0gINe7cnesAOKwA6T4RacggkRERaTKTIra1NMTI+KivSmTcffvLmtsrJGo1nodq+Oicl75+23fXx8du3aJRQVzRg0CFi1e/eV27fnjBsX4udnqaycvWzZ5Eef6t9/0N1dHzq0b82a7ePG/Vb5VFaWuXPngmbNxicn/7F++cyZFRcu/OjvP6Wq6ht47k9jWqWBgasmTRqZlNQaqK+v+fHHd3Ny8pzOaqMxPDb2AUEQs7K2Wq1FBkNCUFAfUFksvzgco6AIdvj7t2jUaK5GEwRIUj1QVXU2M/MzSbKbTFHh4QMEQczNXadShYeHP2QypQB3NaFKSzf4+0eEhHQDob4++/btz2tqrkF3aAxVsBVGggB1sDc4+DGVSitJldXV291uXxgIChTCbmjnnRXNgmMwFPp4d7QGbsFA0P9FKEuGQ1AAbcEAbrgGbpjudf5U4JJXbdQOa8AC0yDZy7GqoRrioBaWQxX09c7elsJyGAlNoA7mq9Uqt7sSukGcdwA/Qvg9sjt3UQtnINYbKr4KZ0GEdiBBDlTCNNgHnsI+XxgNRu/mJfALNIBiECAJ1HAc1BB9T/gTuAiZHp0HSPBaAXnO2w64BUkQC3o4CPO8Ad2FonheknQwxRt78+CYWr3fZApTqfwrK6/DDGh/z9KrsNRsTtJoxMjI3jk5W3x8/AYMmH/u3Cpr5blsi2X+669rNJr3P/mkafO2r7228O5mv/zyzZo1K5s2bWexyP7+TXNyNjZr1uLWrbT+/R85fny9n1/c4MHv5udf3LdvodnctE2bDz1b2e0lZ88+bTD4REWZ58//bMGClzMzb6rVmrCw1tXVJXZ7wauvvt+wYaONG7//6adl7du/mJQ0ClAU6fDhl6uq7hiNof36rTh+/LXiYou//4cqVbjDcaS29g/BwQt0upZ2e2pFxUJJCoV3vPoJz3v91QLAH05DJEwBPaTCFmgMd6AjHITBcBB6w254wRuevwZLwQfawy/QDqrhA/Bk8J+ED1SqGJUqzu0+CQJ0hae8J+kwfArxIEM95MDQeyLlV2EPNIByaAi3YASshWlghitwzN//cZOpd1HRE5IUBkla7VGns9pkekej+U2USlGsNtsfXK5TKlW8JJUajdUjR07buPEbs9k/LCzBYPBJTT0qilKfPlNOn96i16uiIyJioqPjGgY9/8zDf3F53weB4X9rZLSi6HeLjKruqnvdb/fbf9YiwkOKikr/ixWKfrNWOvrxey8OHtg9OjLsdx/z/6xFR4YVFhb/7sP443iifMAfhkMJ3AIXDIVE7+OhK4yEtW631WAIa9RomsVyweWqVxSpUaMhUVFxTudjD42P+fKLL6Kjot56440WRuOEvn1zS0pW7NypVZQPp03zNRrzysre27b9/U+X9ekzwGIp3Lt3l+fW0Lt3/xdffOKHH6bl5qYCwcHxDzzw6qlTn589u/LAgXdlWaquLqittTRs2KWq6jt4FgaAC5zgBAf4VlT0XbJkYUlJntvt0ukMTZp0crsrRFHfoMEQRZHLylJrajJF0ScoqJ8sOysrT7hc1bAT9uh0UYriFkWzZySiaBJFk8NRLEn1KpUQETFIlp35+ZsDA/3q6y84HHlqtb/HaVCt9nM6i0pLN+bnr1erfdRqc2HhjpqafOgKMuTAVhgER0DwpFGWlX1hs6WBWpb9IAZ+hHKIgQBBuOGV5PQIr+yCbd4i6A4A7Pbq2N9FLWwAGZrAbaiBVIiFNvAFXAEBVF7P8SL4HPzhAfgW9np9SkMg0VtR3gReh4vwkUejwMs2vofX/fx6BQQ8DPFwGC55x+CpeT/olbL3oASOQJBXrOAsnPDWSClwAyrADN9DLZi91HYZ5ABwB76DFOgD47129tUAtIJy2Ol9eRIyvDJV7aEQvoNycMDPcAtaQit4Hp6AR+AV+BGAIj+/STqdHyyCdO+wf4WdycmjbLaKgICU6OgBsAI2eZfugc+Cg/vLslOvD8zMXBMW1vDBB78wmYJ79Xo1JnFCUnx83x49enTuvPqLL1y26mefnVZQkAcsX/7punXfDhs2taqqXKcLysr6qW3bDiaTr15vPnZsbUREmxEjPtZo9A0bdpk48RujUTp+fFJt7Z2ampsnTkzT6QyRkV2cTsdjj40uKMgeNWpCfX2d1VqtVte9997Shg0bAaNHT507d1FGxneHD79st1ds2zautrYgOXkicPDgk6Wl7oCApSpVOKDT9QwMXF5bu83hSNXrW4eHf2c0hsB0uAJPQhB0hWowQwgMgjpYBCdhHTT1enSdgD5eo84j8JaXiQJN4WOIgJ2gBzV85WWiQBf4VpZ9JekEOOCBe5go0Au+9l481TD6HibqgGSYBG6wQp43nVQLnq9tCxhdVfW9xfKIJEVCX6hwuRST6VO1ur2iVCtKtaLUgGQwvGA0viLL6WFh+pEjp1osuXa7NTIyOT6+ZXFxlkZD794Tq6pKamrKkxMSunTseP3Gjc4dW/3ud+Z/zOZ2/63tdxz8/Wn6+/hvodBS+p+pO1mKSmfNfrdH1zbfr1z4jxZZ/B/gH2y+3gZ7oRsMhB9hNQyGXpALG6C3Jyevvv5qfn5dWFhXRZHCwnpcvLiyYcO+oOrde+LPa773DwgI8PevsFj+sHbti+PGXc3K8i0o+PL6dUmWJVm+kZYWotG8/PLTzz336pIlf5g5Y/qTT05/++2Fp04d//rrzx6dNi3t2ndAfX1ZWtpPzz770pdfflJTE1NYONloNPXpM+vw4RWJic/k5f3scJyF+feMfBX8olJ1VKvVarVm06bPjhzZEhj4liRVZGSsNRhC6+qy+/b9rLY2/8qVNSqVxuUSQkOXOxwX6+rWNmy4qrBwwcWLE1JSPjYaE4CsrM8KCzdERQ0vLt4vy/bc3HWNGrUdNWpuTs7lTZvm1dWlxsd/AJSVbc7P/zwwsKPDUSJJ9qtX36ioqICvIQq+hl9gJvSDDvAlBEJ8ZGSoxbJVUdrAfDDBOlgD/UDSaju43XckaTv0AKADnINs8EyuGUGGHdDdS90s3hi2J4/CB85BZ2/kLwh2QKlXAukc7ITOXlX8QG/G5EwwwHHYCKNhGADz4R04Aw8C0AcuaTT+wcEv1NbuAgFaw3Uogr4gQCLkwyFoBxGQAdcgDoxghEOQAS2hDkRIBxmaQqZXS/KCV8spHdZAVzgBvcAzk6iCvpAKJwHQQHPIhN3gB1ZoA3ZQgxbawG340SuA1RlaeA8KeADi4BM4Lwh1gqA2mwep1ZH19d/CA1AuipeTksaaTGFut00UDf7+UXp9SG7uFqfzBjSCvcHBQ/X66Lq6S3V1uYmJ3bt3f/7u9de8+ejg4MQZz7w5+9HxrVu0+Oz9979YufLZZ6d07tzrzJnjAweON5l8bLb6+vrUrl0HxMYmpqdfdDisTZuO6Nr1j/nxZnPIgw/+4eTJZSdPPqxS6YODG8fE9LRaSzIy0hs2TOjde6DL5XS5XPHxwePHv6pWq2tqqgUBEJKSUt577+vt29fs3j1Frw+PixvodNZWVWXp9eP9/CaArCj1nqewIASYzS/bbHvd7mKjsW9g4By9fn9FxWvQBNpBPtR4h6OGnpAF26EjRMFNL4mMgDMgwnBo5JXBUrxbTYBar6O96F3qgQmGKMo5cHgLnu5FJMR7nUit97yv817SgAT9oAIOQ2P4CfpABIRDb1k+DD3grFab4XLp7fYvjMZ3RDH+bkeKUmO3rxEEXUpKp/z8rCNHdsfGvnrnzvKCgptOZ5TJ1C8t7XhBwc22bV+7k737+o31VrsQExX+F+O8DwC3+/cewd+A+2T0Pv462rZO+c9E7y+kXp+/cGmPrm0GDez+j8Th/iZ4+Kjnn993JO3bpuQX3Iad0BPU0dFd8vM3QT8wRUW1LCo6KUnVEOzjE+R0VhUW7u/a9RN//2St1nzz5s/jxr3Ztu3gqKhGq1a91737EJNfsM5W8/bKlXNbt+4SHx9pNC44eHBwXNzHnTsDi69c+eKLP8x7a26zlJSUJk0+XLTg6tWr8954o2/PnsCjs2eHhEV/8skKjUYTHh715ZefVFXpxoxZ4OsbPm1am+3b342OnlBRcbKy8klYAIHwPpwQxcmKklFebtm06fPr17NDQ5dptY0Auz26svL9IUNWmEwRYWHtzOboU6c+DApapNHEajQN1eqY7OwnGjZcVVq64tKlGcnJ80pL91ZVnY2NnagoLkFQZWX92LnzqD59HgPi4trMnLlyw4a5N27M8PXtWFT0fXj4QJOpYX5++unTEx2O5vCBN3XyCYiBndAPEmEBfAU3bTanogzypLoCMA6iYLGn7EOvf9DpPOxy7fAu7QDX4APoDUADMMFhaA0inIdW99Q7x4AvpEM0xEASTIHtkOONZQ6CFO/KwTAFfoX3oSPsg8e9c99lcAwi7wl3Aa1crsCcnKk+Pj1BBWZoB9dgM3hKYqPBBGchATIhCXzBBpdA5fVbqgYn6CAeBJCgGZRAuVfgKRFiYD+08JoIKN6c0RZQCnfAAiHeg82GtmCDDFBDFkRDHGihBMJhMDSCem80BC8Z/UYQbimKAzQ6XXONJrKmZoMoCk2aTNZojOXlN2T5N2VTvT64UaNHi4qOlJcfCAsbr9OFW62ZDkdRVFSPLl2e9mg+AKAoCqGhKaoWT76+4K2lf3g7PCxsxuTJ+YWFp08fHT78Ya1Wm5Z2vrq6rkGDBnFxyXl5Gampp0AxGgP5C+j1fmq12mSKiorqWlubn5Gx3WxuFRbmU1FRtn//7oH9++3es7tVqw6dO/e+d6vs7IyTJw/a7bUJCePq64uysna0bDni8uUfFaXGbH7x3jVttk11dV8ZjYNMpgfq6jZUVS0VBI2itII7cAxmwU6440388AGN18fLAgaIgIOgwPPwE1yEF+7Ri8iFeRAJybAcjsBCb/wSWAMrVKqo8PCWRUUrZPm01zLUgw/gIkjQEfZCzj2pOLWwBsyg9ap6DYeOcBQ2QTdoCYXgDxe12tuiaJDljoqSVVs73Wh8RasdAsiypbb2ca023uGo8fERtm37NT7+fX//HiZTSm7uJ+Hh08zm1hUVu/z81jVsOKxhw2EXL35cVbMnOvo+Gf2P8U9NRoW8+zmj9/HXsGP3kYup6X9WUO+pmt+x++jH/1RV8/9f+N3p9dx5n23eZoA8SAVzfHxfQVBlZm5TlIZhYYHBwS0zMzfbbH5abWFwcMe2beeo1Qar1XLt2sLhwx9v0KBZZaXl/PldYWF+ffuOefO1cQHO+rfato0xmSxW6+qbN5sEBY1q2BBYlZ5+IyBgzuuv+/n+JiAiSdL8hQsffOCB8PDwXXv31jvFKVPu0jWs1vpPPnk3IWF8bGxrzzvHjq3MzxccjgqL5RAYwK5WjwKNLKcbjVckqXlg4Nx7q2vd7gK7/as2bcaEhbUG6uuLTp/+SpIG6HRtAEkqqa//2d+/ryCQm/uCRhMQGzsBlJqa66WlR8eNW9C4cY+7RcoebN48/+rVfdHRYwyGqLq6zKKi3bLcEebfU+ni+WcN3AFPHUAevA+T/9TFx4NMeEurbaHRdAKVJFns9p+ghTcUVAi3IMJb3WyF2yBAJy8DEP60BCcVOkKMd8A7IBNG3iOPfy8OeKdoPUmfpbAKBK+iwp8dTjochwgI8xKIfCiGSG8dvQzpkAJGcEIm2KAjCFAGd8AMSSBBAWghAK7AWMiDi9AWAmEn+IHotVwC6mE7GKEEfMAJCVADJdAELkJraA17oArioEwQGopivtvthNfgj4ExAJYbDPtHjZry00/LTKYBHuXampoNQUHB0dFdSkou5+Yeeffllz9btUpSoqOiBgClpaerqu6EhY2tr08vL9/Xtetr+fmnSkuvDh78cWho47v9pqVtOnbsk8SETt8ueau4tPTFuXN9/Pzy8iyDB088d+5wTk5JcvLCioojDsee0lLL5Mlv+/oGrlmz0M8vbvjwj1Sq3yI1J08uO3t2c3x8otNp1uuDMjK2xMU9Gx4+Lifni9LS9RPGj581c+buPXs++PjjBx+cNHHib3JOu3dvWrFiUZ8+g44ePdy48eTr11d37jyzffspZWV39u5dUFGh9vd/T6UKBerrv62vX6HRDDcYgkFVU7PSYBhps+2EPrAPnvdeCSvgBLQHB9yGIK/sQx4YQQvTvVKsa+EiPAtt4CSsgiQog3hIggNQBvOhHayAHzSaSS7XL3FxU9RqY2HhVqvVDa9CM3gLrsIwWA9DwQZnQYChXt8yfzCCDSwwzjshANyBzRAMVghWqzMSEqbfuvWlWv2IIPjL8m23e5dW21unm1RX97RG01CrTYADVqsrIeEDH592dz++/PzPBcEUHv6I3Z5dUbE6JWVkSEjr7OxdOs2eX374w3/03fl3h6D/W3NGFfuR/5WR/A9wX2f03wjzFy4dMfaZFas3/P9uGBEeUvinkVFLUemK1RsvXEr/F2ai3BMi/b0QGREKVkiGHlDvdNb5+DRs3HiKyWR1ueo1Gp/k5KlGY31KyjNt274BSnb29qqqHx9+eF5ERGJJSfbGje91796jW7chx45uH+Bv+rxr1xC9Pru2duGlS+OTkgbFxNglaUdOjrF37wXvvGPQ610ul9vtliRJEIR35sw5dvbs7JdeCo1q5GGi69b9cPVqKmA0ml5//b3c3M3bt7+rKLIsS82aPQBXysuPabVqqFarp8vydUk6Istn6+qqdLpW9zJRQKUKttnsZ8586H1DcbsLrdbtKpVRpTLKcnV9/bmKio35+W/CYFn2cThKy8tP1dWltW//zLp1b168uO0uE7Vaq1aufPTKlVJFebKs7GRlZWph4dY+fV6Ij1dgMhR6JT/VsBDWey3g94NHzH8p/Flx3q/wskbzkCQZbbZvZblYFCNA0Oly4RrI4A8qKIJbIIEJwsEAF6Ae1N7dedpFsECeJ6cL1kMB6OEXuPqn+3XDRiiHsbASvoMK+AwaQDWsh/p7FEzVcBJOwGAIhktQ41Uw9YMcKAHRe5ZEqIV08PGuUwA3Icz7MtdLYTPgEWgDI2AQnIIcEKADGGEtZEAJrAEfaAA6GA4RcNlrE3oWukMP8IExECsIiih+oVI9J4pBWm04PAcH7znqj8PDLyxY8NXo0VPfeOMjUTxbX38AUBSHXu9XVHS+tubylwsX9unW7ZtPP01J1N2585PdXipJdpVKV1d3rarqaL9+HyUlDevde2Fy8sgNGx5JT/8tjH3u3DdHjy6KixvvdFTcuHVr2pNP+vj5+fv7i6Lu9On9BQWOZs2WGo2NoqNnBgQ87e8f27Bh86Skdi+++I2vr/6bb8YVF6cDBw58fPHimn79RtfUlGo0xoyMLYmJb4eHjwMaNHg6Lu7N69dvAYMGDly1fPnlSydeffWx8vLS9eu/XbFiUf/+Q9xul07nn5a2ok+fl9q3nwIEBydMnPhNSkpyeflEp/NYXd2S+vrVGs0YsDkcqTU13xgMYxTFBlo4BXPvKUSbCZPhOFSB6FX9rAI3+MPjXiYKjIcR8CF8B0ugJbSECvAHNQyEZHgeFsMatXos6EHSagNF0RAT81BAQCw8D9MgHabdo1dqgJ4Q4NWCDYB4sEIdTIEm4IQ6qINweBRCoNZoLI2Pn2qzFSqKWhB8QFKp4jWa6W737drax7XaRKOxl9ud73SaGjdebjI1k2WbLNtl2SHLzqioJ/z9O+Tlzdfr4yIj51+/fjw7e1dc3GAfvxcHjXjlv3UD/TfD354z+jtCyLtz+Pfc/33838JiKZ23cKnFUvrWm7Patk756xt40aHbhK3rP4+ICPF0Mmv2uz26tRk0sDv/AHPZf2/8vvHRue98tnlbCTSFE1pthY9PXGzswPLyq2739epqOS5ucHb2Dru9on37eRER3XNzd6Wmftijx0ODBj0BfP31JKdTmDLlpVWrFpSVWZ5MSZmUmAiM27VLazB82LlzlMn03oULu3JzH585c+qkSffu963586+lpk4fOPD9X3559NFnrNa6y5drnM669u0ju3fv++abz7Zo2KBt48brj13v2/fpLVveqq+fIMtX1epLdrsRqtq3HyOKuvPntwYEvFpR8Y5W2yQ4+ANPzy5XZknJc7IcajLJI0asLi6+cOTIa0ZjC5eL4OBFtbVrqqq+gP6wD6bDA1ADXwUE1Pbu/aHJFF5QcOrEiflt2gwZMODpgoLrP/30ks3WDTwPp1OC8MGoUfNjYtoCx459eeHCRpgHjeFVb/zmHMTCDugNl6EZnIUkmAsa+AnWa7Vz1eoHAJdrlcv1rU432OHY2arVo5mZe2pqqqERXIRucBFcEA/1UA8aKIYOXg0mJxwDO0RDAkTCWtBDCBRDHFyCNt7a9kpYC3EwCgQoh/UAdPVSgdNwBwZ7XeN/hVIYAsEApMEBaAgOcEM43PbWuadDC7gCsaCBAoiCLEiBEu90eZ3X73ES+N4Tcs6DnVDqlRGwQBqIEA/NwAJ3vAmgGXAU/KCnd4TABUHQi+I8EBUlVaNZo9N1drluWa07YQRMgvnNmokvvDDP3/+3yfHS0qLFi+fdvl0hy3URESlaMf/911+PibwrnsWyH3/8YcMmf/8mDodLEKr69HkvKOhuVQ25ucdOnFiYnDxQUZS0tC0NGgw3GCJu3VqpUdO0WbPOnTqdOn06N7dQkpIbNZoP4t0NHY6C8vLlw4Y9mJjYGtiz55tff13ZqFGfnJzT3bqN8fEJ2rt3pSRp4+Pn+vndW8uPzZZVX7di5owBrVu3FmD5ypXbd+12uZwPPDAiNDT88uULmZkF3bs/HRXliRoKnoxSIDf33NGjn9fWVms0o1Qqf7f7lCzf0OsniKLe4TjmcpXBGxB4T4GHB0XwMUjQE2rgKETDFO+0+72B89OwBbpBIzjnjXM38nJWB/yi0UwFvdu9Xa0WzOaIgIB2nniwzVZQULAPpkGuNxU4yOscBqRDJTSGPCgGF3T/i+kFG3wPhQkJk+320oKCnaGh40pKNqnVA1WqJoAsZ0vSTj+/x2y2QxpNnkYTVFNTHB//ro/PH0+v3Z5969ZTen1KQsLHBQWLKyt3d+v2gUZjOnJkdlRk9LGDS7mPP4Vd/lsjo3rV7xYZFfLuHPq99n0fvxdWrN64Y9fRrRs+++9vMmLMs2+9+fiK1Rvbtk5ZsXrj+DEDBw3s9i9PQ+/i9+WjW7cffPPt7aAKDTXU1xerVNrQ0LaVlcdCQyMyMjKMxjBZblxX92vz5s9qteb6+tO5uRfDw+MefXTxF19M9DGbbLW1fTt0qD53bndxcfeIiLfbtHlo1y5/lSpDlt/v2PFKebnV13f7pUudunWb/9ZbQFFx8QsvvxxhMs2ZODHAbN6fmvrBL7+0avtk06ZjgYsXV1++/O2EAQOeGDUK2H3q1PvfblFr5opiB8DlWuV2f9OnzzuJif2A7OxjR48u9/f/pKLiXUWpDw7+2GY7XlW1RFGSoCusb9Vq9KVLS319u/v4NC0t3aPVtqur2wi9IBKOw4f3nIZvW7SIaNnyEaC2Nv/o0be0Wrm4+I6izIAp96yW7+u7bMCAcdHRrYG0tG37938IvhAKfUEF34JsNA63WjWwF9qBCKdBC00E4YpON0+lanW3O0na53AsAKlVq0d0Ov+cnINFRamg8j59L0IRRHnri0vhFjSFSDgKRkjyWikWgz8kQQmUQnuoh0tghm6wBdpDP+9uj0AW9PjTtP4bcBq6QwZo4QFvVZAHhbAXNKD20sEMqAEBXJAAflAJFpAgGbSQC2oYAPuhEIJgwp8mD2TCd9AQCqA5mOEO1EA3yPaS6QLoBn5wHAogAEaCFi6pVDGCMMbDvxQlXavdrdW2BmS5or5+s1qt7t+/19ix0z387N6/v/66af3670cM7DfxwQd1Ot1vwvHeNdJv337/iy+1+iYdOz6r1Zq9C3/763TWHz48p7T0RlzcGK3Wv6bmZkHB3n79+qU0aVJRUbF9xw6XK7RRowU6XbiHut3NMbXbC+7ceW/KlMcTElq7XI6ff15w48aZgQMfEQTVtWvHS0tLHA5H48Yfm0yN+VPcvPl6wwa1SxZ/Ciz44INDhw5179E/Pj7pzJnjd+5k6PUGgyFy2LAPNZp7Pyy2b389L++CLHdWq5u7XNvU6kpoqtW2s1o3K0qAIMRI0j6YDa3v2SgX3gUdNAE9HIFeYIUzMOUeQwRgh/eH0FS4AIVQr1LFy3I29IYGUAD7tNpHXK5ffHw6hYQ8U1Lykd1+ITx8oNEYU1JytLLSAu1hE7wKHeBjuAmtvEq6fuCCKrDBQDgBRnjIm8dSCcugiUqV2qDB2Kysn+Pi3gkM7F9RsS8v7yNoIoq9JemYIOSLYqBWWyjLcnR0b7u9KifnYGTkY+Hh04D6+mu3bz8nyy3Dwpq4XCXV1UeNxiYJCZ2vXVul13dsllK27udPuY8/RZ2z19/Yg1l7+H9hHP8j3J+m/3fEzBmjgQv/PyafbVs3uZiaHhkesmL1RuD2ndx/HybK7z1fP2JYn29WPAI1Lpe1WbPJWq0pN3ef3W7r02dgp06damqyRTHE13d8WtrXFssJp9PaufO0ysrSxYun2u1SqMm0Ys6cyOBgmyRNi429VFr66NGjOq12oMnURat97sSJIpvN5nJN69r12oUL02fOPH/x4pTp09s3aLDosccCzGZLRcU3+4726L3Qw0SBNm1mdO/+5rXMTGDXyZMffH9Wq1vmYaKARvOIRjM3PX2L52VcXPehQ+e53R/5+U3XaBoVFU2srPxQUbpCL9CC5vLllcHBD/r5tVOp9IpSU1e3HYZBNNi8KlF3taIGXLly+vbtrZLkNBpDo6I6FxXdUZSIvxDUjK6pUe/b95HnhdvtFARBpTJCLNTCZmgKIVarGa5DtbdUuRP4wWmt9g2Vquk9O3WoVN01mmlqtbmqKtvttkZFdQkPbwOKNybUHJpAkXfvIdASMuGA12UecEE2hEEiCGADQAYDdAY1rIfh0AvcIMElqAZPZZJ8T7irMQyB8+ADD/4pEwUiYbTXTdQFCiR4HZKaQABIUOytXtJBFbg8Pwm80TI/+BIuejs8ASugN4yH1nAaikACNdyBDHgb5kBn2ArZYPUqDa2GAlG8qChHoQb8FcUWELDe6Txitx8HVKpAtTrOaOx28ODOjIx0Hx8/Hx9fs9nXbPYxmXwqKkp37FjXsWPfjTt3bd+3z7PMx2w2m0xmk8lmty/98UdJUVVUpB069IbLVadWG9RqvSjqRFGrKMrRo+9UV5f4+sbrdIEVFamVlScEQUhu1CgvL2/d+vXNmo1u0aLT5csTy8sPCoJGEDQqlVal0tbWXklLe1SWCQmJqakpX7RouiTV6vUmUdScP7+zvl554IGlKSmjrl59pKRk290zLknW69efdrlyFRTg1TffPHf6tAAmk3n//p1FRSWvvfblvHnfhYf7r149urDwimcrl8u2YcPTFRU5oqgRBF+nc51WWycIapXK32pdoyhxGs0StfpVtfop+Ag2e/d2HeZDEtSADvbDIOgHw2EUfA/bvWuuh0Oekke4CAXQSRCCVaqhKlV32A3noUqlCnO5fvH37x8e/oYomiMi5vv7T8rLW1tRcd7hKIEw2ATvwlAIhY9hBByCbKgFN5RBb2+SwFAwwGdwGSzwJcSBr1YbmJ29LiHh48DA/kBgYP/Gjb/R650u1xpZLvYw0S5dxtfXVxqNoeHhbZo2nVRW9svNm7MqKvbcvv2sLCeDqapqX1XVodDQyXZ71pUrX2i1zUTRp1PHVv/hrfLfHP/U0/T3yei/IyyW0v+sOv4/Q0REyIrVG3fsPgpEhId8uOD5v7rJvxh+Xxf79m2bfbPi2eBgnSQ5ExOHNGjQ22az2mzWFi3aNmnSTJKqNJpoP78ZJSU3HI46lUrVrt14p8M+fXC/tx97TC2KLre73u02iOKkmBiHy2Wx2yVFaaHVPuTjsy8vz+p06jWaiR07inV1z77wwutjxz49fLhbks7fvv3Mqh1den8eFdX+rj09kJg4MCb5pQlvvfvB9ze02mWCEHnvUNXqAWVlA3/6aUJ+/llJcvn5xbRoMbCu7m2r9bgsAwHQCBywRRR9RdFXr49xu6uKin6W5aZgAH8ohp3g9OpuauEGvAZ6lUojitqTJ9+7du1Xo3GpTjcEnoR93p2XwaNq9U2VygAcP/7V4cOL9fq3jcZlarWHibaDD2AS/ALl8AUMh4uggFml8nU4XnC5fvbuVAc6p/Mdvf5Az55fuVxSevravLzjRUU+kAjpcA1E0KtUPiZTd0gHN5ihIYje8GQ+1IIeGoACN4cN6zt69HhBOAoVoIIYUMNGuOzNN82Bq3AeVF5ZUw9y4VdvMsCPfyFxmgffgwAmsEAlCKABAQxQB1kQ4k0k9ShHenhkKISDCppCW9gAv8Ie2AljvCX8vWEkXAcJVFAB73kLVqbCk3AYXKCBjhAJv6jVPgaDWZJmyPLq2NiPpkyZ9/DDq3x9S+vrN9jtR/z8uoSGvuTj8+SCBS9u3vzT3WO4cuX8K6882r37sOnTX3/rrZV7jp158vXXa2p/c9y5lZk55ZlnZEHvdDoSE3uq1cLmzZMKCk55ltbXF23cOK6urkar9RNFc1nZ2crKc4MHD9doNDabbfOWLT17PtO16yM9eswaNuytnJwPc3O/8mxYVLQ+Pf05f/++smytq6v6wx+mhYQEm81+JpPf+fO7tNrYAQOWGAzBLVpM7937w4KCZRkZ7wIOR+GlSxMUpTo4uHPTlJTJDz988/r18QMG2ByO3Nwsjcb8xhtfRUQ00OuNs2bNGzp04rp1T1y6tKGmxvLttw/V1VU0bTrMbq+VpDSz2RgXN9blqnW5rkNHjeY9zycuiiM1mhWCcBbmwX5YAI290rDH4SHo6j1tbeEZSIdF8AOcgwegFrRQCeOhwlN5plK1FMUpgnAHMmW5NDBwVEjI7LsnPyBgYnT0kqqqW263AyzwKfS65wJ7BD6AHHCCHYZCzT1JHR6Rsg2wEpKhO5QLgjkp6TOzuYUk1bndlW53lSj6JCR8GBMzCSx+fnXduk2yWG6r1XpR1CiKZDKFtmr1iJ+fITt7viw3hVaQ6XZXhYZOcjiyXa4Sk6mXwdDK6bzSuVNL7uMv8E9NRoX8+9P0/4rYsetoYVGpxfJHxnkv+yy0lA0d3OOxGaP/vzqct3BpRHhIx/bNnp414X9zrP9s+H2n7GfMmlteERMQkHDu3GJBEFq1aldcXFRZWSXLDczmB+z2i6GhWUVFla1ajcjKOl1UdPOFyZNH9+mTeuPGO4sX+2s03YKD95aXD2vRYvnJk0NMpgpJCo2NvVpaqtbpuiUl/Zqe/uDgwV9+//3cSZMeaNcuNSNj/voNshwwYMBHRmPQ3TFcu7b+9OnPRoyYefv2pfT0ap3uI0EIvrvU6fxcljc1bvyWxbKjW7cpBQXnLl78bty418vK8g8ePAJdYT/IanUrg2GuJKU6HB8rSrlKNVKrnS1JF53ODxSlAHrDRYiE12EnrIUeYE5J8Ssuvlhd7afXvyUIAYDbfcBmmw+ToSF8rNXGmEx9a2p+SUxsffv2Vb1+vij+5rNnt3/icplgKgDpsAomQ0soVqmekeUElapAo+ntdG5VqVJ0uk8Updhufy48PK5du7fUaqPVajl/fkF5eRJMgHegIZyBekhUqbI0miSNJlMQDLW1geD2CnneARUEQS60Mxrv9O37gFqt2bx5Wc+eL92+faCw0A7+Xk2oi9AOBsJWMMA10EIfb138ZUj1an8mQikUwyBvZfoFOA4toVSlSlCUekG4Isth4AMZkAJXvVY6HnF7BWqgDppABFggA/qCCDZIBRkm3SMO4CEc1fAdhMGce7SBPLgF70IDj+M8FOn1FYGBIyoqtiYlJQ0d6qkVo6qq8JdfntfpHvH1HeB5x2a7UlT0bkpK1BtvfLxnz+bVqz+bNOn5vn3HeJbKsvTNN+9fuXzs/ddft5SUfLp8eWRUmw4dWm7a9G2LFqN8fcPz8y/fuLGvbdtZERFt9+593mBoEBraq7Bwp8EQYrOljx79UFlZycmTR6urq0eMWNCoUa+7wy0vz9m5c35dHf7+nfPzvwkMHKzTxZaU/KJS2ZOTm7Vq1Sk19VReXk5YWNdOnf6kVsZqLT5+fH51dZksO4zGsIiI/nV1mUWWnVEhIQ/27l1TV/fdzl0dOvSdPPlFT16BF8Lt25fXr/+ysrLaxye8UaP+dXUlFy/+EhCQEhHR12azZGWtV6ufFcUh3lMtKIrs+V+SvpKkTdAFGkA6XIGJ0PxPz78nfP4T3IG+IMEF0MBgsMCvghCsUnW8+7tRkjaKohwa+rLJ1P5u6F0QdEBx8YfV1dvBB96FNn+6lyp4E27BcCiE49AEKqEj+ABwBUphFJzQaG7JsspoTIqPXyiKvvfcHwpv3ZrtdJb36jWppCT7+vUjkZFPFhZ+GRvbMyKiPVBVdefmzV9hEuzU62v1+o6CoK2rO+JyOUJCnqqsXGsyCdcu/lnR4X0AWCp6/Y09RAQe/l8Yx/8I93VG/2WxYvXGmTNGt239x+z+SK9q/d06pAup6Z4y+cjwkKGDe/xnXVkspctXb4wID5EkKSTkP9Dh+7fC76uKv3rpuzMef9NSXCMI4oiB/Q+fvty4cX9f35yiols1Net0uuYul6tJ44ZnzvwUGprYq9eYz39ZaykrG92nT4ROV+t2n7HbPxk9OiYgwKjVLj58+Om2bR9KSXHK8huHD5+0WD6ZNy86IiIyLOydTz8tLC8f1L59SEiYy+XatGlq//4fhIU1B86cWXLt2vqZM99p374fTPvppz8cPjxJr/9IpWoJOBxv6HRZjRsv9/FpFBLS58KFRWVlu5944ouEhNZAUFDU+vXLYJAgXNRqR4JGFDvo9Z/Z7X8QxW6AKLbR679wOt+TJAmAMHgeqmEQhEPZjRvb1eqRev1DIChKNQii2N5k+tpuXy5J3xoM7Q2GLopiB+7cwWhcCmaweR7tOt0TonjSbv8EnocmsAA+hHAIk+XP4VVQRDFCr5/ucGyy2SYrSmlCwuAWLZ4DrFbLsWOzrdaR96R1qqErXILLYA4JqX/ooZWyLG3a9F52tg3w9a1VqXR1dWVutxlEvT5TkqquXTudm5s1ZMjHDRp0adp05Llzq86d2w8qCIHucAHyvIo57SAdtkBvyIEMaOtRPwUVpIAfbIeuXvrYCUxQLMt5ZnN5376jT506WlJSAprQ0PKBA587dWpfRkaZ17urGZRCHoRDBuRDLPwKzSEOAsAJq2EsNPQebwl8DwmgwJPwqlcDH9gNK2EEFMB+aAd+glBZW3uydetOvXr9JglXXW1Zu3aOyfSK0fjHzAqDoUWDBt/eufP+U0+NKysrffLJd9u162Oz1eNNEp006YWYmKSn33wT6Ny5b3Jyi7q6GofDptUagejolmZz8PXr61JTV/r7twoO7iLLTre7Vq+Xhw+fDIrFUmi3y9OmfRMU1FCWpbuppUFBDaZOXfXrrx9evfpDcPBYnS7Kak2XpKqOHfslJKSUlhZmZFzT68MSE4e43XaVSn2Xsel0gc2aTTl16n2jsUFoaBebzVJZfjQkIGBojx4llZU7jx1r3rxlfn5mTU1FWFjMvd9cQRCqqspFUZeY2LuiIis9fafR+JCiXKqry8zL2xkZ+VRh4WJwiOJk7/oAbvfXkvQrmKEBXIJ8GANr4bbXIdYDB3wDDggDEQ5CBARDAeyEZxXFR5IWqVRNVapegKJUud09CwtfCQqaERT0yN1eLJa3rNZLQGBg24qKZ+EJmOhdmA9PQgzooRKOwzPQC1bDTugEcVABYXDEaLQ4nXJY2MiqqnNpaWMbNpzv69sRsNkybt16GlqIYnlNTenNmxcSE78wmVoZDE3y8t6vqytq2LB/dXUehMKuiAhTeXm1KJrLy7clJw+6c+dCVdW68PAwo8HxV+6S/674p9YZvT9N/6+JoYN7LF0yx5Pf2bZ1iqdFRIR4Gt5I54XU6x6Gunz1xuFjnv0Pu7qQen342GeBZUvmrPzq7bPn0hZ/8eP/4aH8I+L3TSFdvey9YYOjVCrx8s3KSZOWx8V1cDqtnTtPCgkx19cfrq+v79Onz4D+fYuKbiiKMnDg1O3HTy9YubLAbm8cF7dywoSYgABLTc32q1c/6N37oZQU4IerV/2TklZ+9FF0RATQq3Pn5R98sPfy5Y/Xr3c47A88MKRZs0bbt8/KyNizf/+bxcXH33hjefv2v3GySZNeGjt2mt3+pNu9y2ab7O8vt2690senkWdpUtKLMTGPnjv3m8Vox47DnnjiXV/fk4rSzGrd4XCsUpRaQfAxGOYryhm3e5ui1IFJp1uo0SSBE05DHfT31jNt1+vbuN0HZfmO1TpTljMFwVcQfF2u/YpyXaXy1es7uFyFNTVrGjXqotGct9sXC4IBDKAXBKPLtcVu/9irslQIT0GJN93ze49IjdudCi6dbpggSAaDKSSknSQ5gPT0b63WAEjxuteUwA2wQ2Nop1a7mjbtbTD4mUyBjzzyRevWSf7+YY8+uiAhoa1GY1ap8nQ6sVOn/j17PpyXd8dkCjKZfvtZ2L79Iw8++AqIIIMeuoIaboIAMiRDLOyFbOgMgWD3siIZIqATnIer0Bn8wQX1oHO7gyRJDg+P1GjsUVEpgiBkZ9/KzMyERhABbrgNsjf7Mx9GQwqEwB24ChLoIAl+gLMA3IGV0BIegEHQDubCbgB+gRUwFfrCVBgAx+Ck01lQW3vS3z/i7nW7Y8d79fUutTrkz65nlcokij7V1TWCgN1uAwwGk8Fg0uuNnlZdXWEw+DRq1DwhIaWsrGjXrrWdOo05fnx5QcFVwN8/Kj6+i1rtExTU0eEozc1dK0nVnTt30+v1J08ey8kpa9LkgR9+eCwz86RKJQqC6m7Actu2t7KyTqvVgVptRF3dBbv9GBAd3TAv786vv27o1OnxFi2G7t79WEbGDpVKrVJpPO3mzQ0HDiwwm/31+mCrtTAnZ31iZJC/j09tff3GAweGjhj70Uefd+zYds6cyefOHbh7jPv2rfvkkxeSktoIgrampjgtbavR+LzZ/JSijMvL2xce/mRIyITExK9FcbvTORvqPVu53R9L0lpoDz5wEcphJrSEp6AAPodyACpgEQggQjDsghZQBb6wE+bAg9AXlsmyVZLWKkoFOCARppSXb8zNfcztLgXy81+sq7uo0/XUaPz9/NpGRDwkij/AM1ALN+BRiAERfOAAvO6dxJ8BT8M5uAB1IOj1uc2ajXS77VptSFjYcH//jhkZLxQVfVtZefDWrdmQLAgmnc549eq5hITPTaZWgNncOjn5B0WJv3JldX19EWji40MbN+7mdkuVlTtbtZpYW2sBV3h4cMOGHYICDf8/98t/I7hcf2v7HXF/mv5fGRdSr8+avWDmjNH3zshbLKXbdx/dsevosiVzPMTUg3nvLbUUlS5dMvfPOpn33tKIiJB7e3j0iXlqterfMG30z/A7xkfPXUib//62UaM+BGpqijZteqVVq6Eajb6w8Pq1a3sffvhhfz+/M2fP2my6hISWiiIf2vfDrA5teyQkCIJwpbBw6/nzj7dpE2IwCIKwNSvLv0OH7h06CIJwt2BZlmWX2/3x0qUZ+QXDho1SqVT5+Xnbt29u06bn5Mkva7X6uxEmD44f3/7jj38ICxuWlPTSX442L29NRcWGxx9fHBAQDpw/v2vLlm/c7groptGY9Po3Xa5NdvsyUWyn070HOJ1L3W6PsNGDsBcioA5ioaFafUyrjbdaU2EIpGq1HWQ5W5JO+fkNrqnZ4+s7rqrq2w4dZrZuPbW2tujQoQUlJQ6D4SNBCHA4Pnc618MYOA8PwaeQAP4wCDZCLbwqCIvAolKFa7WDnM6tvr4RlZUnmjV7KilpYnr6qhs3TkEmvAxt4G3IBh20g0q4DbaEhGZTpy4SBBEoL8/btWtxVVVtt27v5OefOHducfPmfePiWu/c+anJ1LK+/krfvnOTkn4j9EeOfHzt2k5oBSGgwG4IhkBvYbvHRSkMKuEO1EJzKPUahV8BLTSGargEvWE21MFiH5/cIUM+9fOLzs4+dujQAqdziHcu1QGejFVAgfEQBwpkwl5v8VYENIFSOAPxcAv6/2m9dhbsgmZwDR65x3eqQhS/atPmZYejwmg8df788ZYtRwwY8Dzw009P22xSWdnt8PA5Pj697nZUWPi6IKRJkrtDh97Hju3s23f0Qw89c3fpN98sPH/+aEREYmCgOSQkYu/ejX36PNq9+9QbN45t3rwwODgxObnPnTsni4tzw8MH5OSsadeuy9mzBydPnnHw4B61OnLw4Hd1OvO1azv373+/S5cZXbvOACTJuXHjy6WlWRERzfPysnS6GJvt7PDh4zdv/mnEiCmbN383aNA7ycn9gdzcc3v3vufnl9inz8cgXLq0LC3th44dJ165siMoqHde3pbhXbveysvz8/U9k5b25JPPPfjgb3V+Bw7sWbTo/YEDHxo9etbWrau2bl3do8fIoqKcqiprSckNP78FOl1vz5qSlGOzrYyIGGU2t5Zle37+h5WVpzWahbK8WZJOwjg4D2VggglgvOcj2AlnYTxsgghoB7tBhOaQDGtBgDf+1LgL+Bo2gQh3s0V3CkK2Wh0gSTazeZrTmSqKltDQ4YCiuIuLt9hs5SBBErSH/eCCR6GRd3MPuS+GtXA2ICA2JWV4efmdjIwT0dHTPdeY01laWvqr212lUrUVxfZu91GdzhEX955aHQjyvRbltbVnc3LmxsQkt2zZ7/r1o9nZac2ajZQk940bOxo0aJ2Q0Onq1V8njO34wrPT/vI+cx+3cnr9jT00anD4bx/G/wz3I6P/ymjbOmXb+s9WrN64fPVGzzseJmqxlG7b8Nm9TBR4+81ZhZaye9NM777/Z9mlK79+OzgoYMojb/5dB/+Pj9+xpKmwsKSwMO+bb6bV1BT5+0ep1dKhQ8tKSu4EBcW63e5Vq1adPn3aZDLdvJl64sQ2WZbrHY4PDxy4VFBg0GjK6+vPWizr09ONGo1Brd6Snv6H5cuv375tNBgMer1Br9frdBq1+r0lS7KzsjrFNVi9etnt2zctloKGDUdfv35r+fK31WqNKKpFUVSpVIIg7Nz57XfffTBr1rOiePHy5WcVRb53qDdvvp+T86PZ/Op3332ek5O2ffvn27Z9MXr0S61bDxaELJfLXV8/1m5fJIpDFaUWcDjmud1rYTgIEAbjwApR8AAku91hVmsWTIJwGOR03pKko0FB00EAVXX1t337vt269VTAxyd8+PAvkpIS6uun2GxznM5tMAZCoQQWQlvoBAK8C76wCEJB0WgeVhSnw/E9CIqiRERMuH591blzbwHQFDrBAvDIqrcAETzRLxEG37mTvWTJlNLSrPLyvO+/f8HlMg4c+LXZHNm48dh+/T69fftiWtoBRVF8fVsHBg7ct++dc+dWAQcOvHf9+nGj8XNRdEO2N/DZDcrhFgCKt+ToOowAAWJBB+fB5p21r4SzMMrLMMwwp7a26+3be4C4uO6jRq0MCfEEQT3l8B1AD2aYCQ28n1U8TIZwcEAplIAv9IdciIJYcN/TGkI0nAX/e5wnK4zGDV26fBga2lkQBK1WN2bM9OzsY6tWPVxVVahSiXFxA+Lielksc8rLVwGSVJ2dPUkU03v2nOB02n18AoYNe/jcuUPz5z9SXl4EfP75K+fOHenVa0pdXYVOp9+9e92wYa907z4VaNy4+xNPrBIE14ULa91umyiaMjNXt2nTKSqqoaIoJ04c8fVtNnLkpzqdGWjadMiECavS0w/+/POTtbXFy5ePr6oqbt9+it1eDYrbnTp69GSHw2YwmHbuXD9q1GIPEwViY9tPmvSNTqfeunXCmTMfX7/+S7t2Y319Q10uqaho77CuXSODg2ut1tt5ea+//s5dJgr07Tvw66+/uXXrzNy5U3bs+L5Hj5EBAWH19TXV1Y6AgMVabSdFsclypSxXCoKf0fhiUdHFioq9smyPinouNvYFSXpJks6Cp8NS8IWHQedVV/BcJENgAvwCsdABcqAW2kNLuAi10A1ageue5oTREA1qr0dDPfRSlKayrJjNk93uDLv9iMNRVF19TpKssuwMCRlsMARALHSCs5AHBZAPBm/Tgx5MUAnqJk2GlpRcv3Fjp8nUOS9vmd2eKwhqnS7CbE6BYFHs7HbvVqky7fbazMyXHI5clcqoUhlUKr1KpbPZ0vPy3gchObnzlSsH6uoKfHwiBEGdnr5NEMTQ0MQLFzbJcs396qX/DP/UBUz3yei/OCIiQrat/2zYoN/yQS+kpl9Mvf72m7P+s/UL/3tV9gveeXryhCFTHnkzIzP3f2eg/5yIigz7Xabs27dtptdHuFzmb7+dlpNzQa/379y594ULm4uKbgOTxo1LvXTp1q1bERGJbre8b9+PAQFhPXr1eXnr1o2XL0f4+rYMCTmRnz9z165qh6N5cHCXxMTn5s3bunevp/OsvLzRs2Zpnc5Vzz773IgRE7t327Nnp93euXnzZ3r3Xllerp43b2p5ucWz8nfffXDw4LoFCz4dOnTUZ5+tSkkxnj8/xWbLB9zu+itXnququh0bu9xo7ODjs+DHHzempZ2cPn15UlK3IUNe6917iCBclOVuXvvKepttnCSdglFgBNmrYjMcbHAADoADRt+jatRZUQZVV++w269CfZ8+b8fH95JltyS5JMklSc62bWfExLSXpAswGQLgjEolQwtoCgVwWhBkb7wQUECtVo8ShFhJygJFr4+Kjp5RWnr9zp11oEAzeBB+hBwAEiEWzgCggb5lZdqvvpr+9dfTIyN7de/+ridKCkREdBgw4Au7XeVhliZTk4iIKamp69evfzIjo9Bo/FylSjQYPtJqW8J1QBBKBcGtVqvhEiggmc1JQUFvwq8gi6JDEPLUap1GkwsyqOAmvA9jwQZ2cIATJl64ELd9+yuAn1/MqFGfJSS4oASKYTPYQOeNtN1VjzKDBFpoDychB3TgAjV8B1leWykXfO8t59fCQrgCZwICNnXpstDX97coqU6nM5t9R46c4u+vX7FicnV1MRAc3LRp08m1tRvy8p7Kzp4YEqLt2XOCWq1xu506nd7Hx3/o0KkqlThnzuRXXhmTkXG9T5+pGo3O4bDdvHlt8uSP27QZevdb4O8fOWXKopSUboWFafX12d27D05Kam611up0xvDwPj17Putw1DoctQ5HndVa6eMTOmbM53FxXb777hGTKbhFi5GS5KqrK/X3F0aOnKjVajMzb7tc8oMPfhIb+0fddUVR9Hq/oUPfi4pKyc7e26nTRF/fkFu3jrpcdaO7d0qMjLyckVFptboVISTkzydJGjRoGBsbb7Fk9+kzPjw8Li3tVHGx1eHIcrnSBcEgCAaVKkClClCp/FUqg8t1pbj4B7XaX1HksrJ1gqCDPuCCrZAIMiyFaq+6gicYeQbWgghN4BZcBQESvQJMZkG4Do9ABmi8zQKPQxK8ByWwAxxggmqVysftzrRad6jVbwnCJ5WVuWVle0ARRaPTWQGxcAjyQIKu8D3Mh7u5m7nwIph0Ol1lZU5GxuGYmD9ERs4JCZlVVLSxquoU4HJVCkKg271dq7XKsksQ+judQbduTS8v3+LpoqJi5507zxoMndVqbt8+W1tb4O/vHxjY8NKlHxMShrjdtuzs8waDYDb7REfd96b/j3GfjN7HPzTu5okCO3YfmfmfFNHv2HUU+O/bMo0bPeDtNx+fNXvBvzkf5XdKIZWk+pCQgSZT67Vrn6muLk1ObvHAA2Nv3TqqUolqUXx44sSa6mqn09qp08jAwJjCwjuxsQ1GjRqz5PjxvTdv2tzuqU2aSLL88I4dVQ5Ho4iIUR06LFq+fOmPPx47e3bGSy8Nbt16wdSpOo3GUlFx4GpG166fxsePAjQac+fOH+l0bd55Z+qNGxc+/fS54uJbixevaNu2A2AwGObOfX/QoM7nz0+rqDhz9ux4SQqKjV2t0UQBgqCLiFggiv3T039zg+zSZfKoUc9pNMehiyRly3KWouhgLKghE5yQ7T1cMxyEg15V7XuhdbnK1Oranj3fO3r0wxMnFqtUalHUiKKmtPTG+vVTamsrFMUjcrRPqy2Ni1saGJgCe2C3r++LAQHLRfEqzAGXokx1uzcril0U+6pUTaqqTlVVnRYEMTx8rCS54AhkQwiMgVq4CfUQAo2gBi6BHZpKUrzTadNqff5slBqNqaamQBC6WCw/2+05Wm1oRMS00tLLslwKDkEwCoJRp3vaaHxFpYpSqayKYnW7a3S6GFEM9fXtEBDwvNHYKyLiC622sSTtVxSVr++AgIDRKpUdiqENLICb3kiVDrSQCgtraysAu71669Yn7tzJhAzYBUmggAM+h3zvGOvha6iAEGgBk8ACF0CGRGgGW+AUlMIqAJqCAO2gJawQxY2RkX01GrMsO+vqcvLzdxUW5lVVlTsc9k6deiYlNamtLa+svCVJDp3Ov1mzaaJYEhkZ0bp1f5fLeeHCnoYNG964cbGmptJmq2vfvnd8fFNZpk+fh0G4evWQy6Wqqan60/p0AJ3O5HY7RFHTvn232NjEgoKsvXs3hIf3unBhTWnpbZ3OR6fz0enMRmOAwRBQUnLr/PkfnU5b48YD7faaixfXut21zZo1M5nMhw79WlmptG//yLp1s1JT197tXxAESXJt2fJCRcVNo9HfYPBNS9tbV5mhFsXQwMBDqalZ5eWfffblhAkTX3jhia1bN947trlzX0lNvSDLssFgPnZsS0GBHBX1dVTUModjd2Xl04pS51lNlkvLy6c4nS6t1s/hyLl5cwqYJKkGjLAF2sE4mA1J8Bmkebs/AtugLUhQAldhAOjhGJQKQgdBCBGEMYIQAU/CVgCuwRPQCx6FCHgLWsH3kA61anWM1bpHo/lIFAeqVE202h8cjqb5+d9arXdk2QalYIHeoIEQGOCtZ7oOp+AtSACNyRRy69bR2NglZnNnICBgdFzcCqu1sLh4s9NZAhqj0Rge/oAsuyBEEPqoVCPz8z/LyZlbVrYxL2+h0dhHlq1Go5/NZnnooYnFxWVFRVcTE4dKkl2j0el0rt69h+h0xETfJ6P/Me6T0fv4Z4LFUvaXby5fvXH56o3LlszxrlP6l/P1f4m2rVOWLpkza/aCYycu/tWV/7Xxf8xHIyND7fZCqzXT379NdPSU6uqSzMybQUGhEyY8YTAYM7OzFUWZMGZMbW2F02lv2bJfVFRyXV1tTEzslCnTzpWV29xuWVGGNGyY4Od3uqCg3uGICwmZ2qPH7n37Pvzii3cnT57cp0+93b79zJkXf7qY1Oy9gIAmLledy1XnctW73daUlMebN3910aJnWrZs+tFHXwYGBjmdDpfL6Xa73G739OlPzJjxSFrai35+E8LD/zwFOTh41rVrbN36riS5JcnVqFG3nj1HarWn4RQo4LG3uQbnIRYU2AdH4SQMgZFwAn69p7+TsBGaxsc/EB3dfdCgFRbLlW3bnnK57Fevrt269Qk/v7YGQxS4YY+PT2TDhit0uoSwsNnh4WPV6kS9fphanRQYuEqnC4LZ4CvLyPI6RbGAEBnZob4+tbz8oEqlBaFZs1awE26ABoBQSINab+FIHpwECRSIS0399sCBF+5GHMvK0rZvn2K3d9FoPlKpHisuXl9b65FPQlH86+tnut2/SaWKYmuVqrEkZcMj8LjD4QSr0ehx48RuP+dyZUB7cAmCqqpqkyxHwHyYBsPgDdjpPTPrYD608vHxKS/PWLt2YlGRHcLgFrSAUBChI4TDcq+P1BIQoT3YwQYBMN6bxqqGGOgOl+AnCIeOUAdakKEBdDWbY2/eXHrhwusOR/nN9HfefnJo87iIrVt/KirKT0u7aLUG9+37WXFxanb2PkFQiaJOklzBwdGCoDp7dltUlP+XXy6PiQnZu3dtTU2lVqsXBNRqnaIoFy7srKmRevf+ulmzJ3/44aXjx38UBO6S0vXr37p69aDRGKDXG7Oybh45sr1169fatHmzUaPpGzc+k5q67u6FcuHCmi1bXkxI6K0osstlu3x5fUJCoizLRqNpy5Y1Gk2DESOWtGw5fsSIzy9cWLdlywuy7AZqa4u//Xa801nh7x+m05nT0vbU1xR1a9lSp9EcSU2tF1Sff/51UlKjCRMmffzxp2vXfj9nzkuKotTW1sycOSkrK7NHj4EqlXj58tGamqjIyCVqdbBe3ywm5ju9PrSsbKzLddHtvlNePk2SfCFZkuozMp7SaBro9cmgh63QH+5GgkfCeFgHe+FX2AedvUHrVHgIKkErCLUq1UQo8+ROCEIvlWoUfAXz4VkYBfcK802Gp2A/VDoc1zSaJSrVXe1SQa1+VaWaXVy8WVEEKIOJUAn+AGigG4TAHPjUm05a4XIFxsZ+otM1lKRaSaqTpDqtNqJBgy/M5kEuV5XJ5IiM7F9XlwFB4AIZ4lSqR6urLQUFn5jNgzWaWKfzltmsHTNmfFralaqqsujobgZDYFHRxYiIyF69hly8eNLP58+8Hu7jj/jnJqPCvcnD99u/entsxuh5C5deTL1+9x2LpdTjDrpsyZzIiJAdu47Omv3u47MXzFu4tH23iStWb/yvO2zXOmXb+s++XrFu3cY9v/vR/b4tOjKssLD4/2x3sTFRFsuW6upUjSZQluULF46eOXNIq9WKojrPUrxmw4Zjp045ne5ff11qsdw2mwM3btxw8uQJPz//Vq1aVdls36enVzocXSMj9aL4/dGj5zMzg3x8ujRqpFKUr3burKitNen1okqVm7u3oGC/RuOj0Zg1GrNGY1Krjbm5u8+fn9+9+yObNq1btepLnU6v1eo0Gq1arVGr1d9/v3zlyi9ff32Oy/WTxfLnZNRimed0bqqpKRZFtShqduz44PTpH81mAVp5538Pww0YCUYYAk0gDcZ758THQwn8BHbYA6ehy91Zez+/uCFDVuv1IevWTTh5cklExBA/v+aCoFKp1MHB3SMiXlcUpyRVS1K1r2+fyMjZNTXPud1Z4Pb1fc3XdxI8B0mSNMPlOi0IgqIozZtPF8W6wsKfAR+f4E6dxmk0nqph4AHoDtfA5dVakmGv90B7Fxbe3rZtck1Nzs2bG3fvniXLk9XqFwFRHKvRfFpZedEzfQmdoLvNNs/hWKko1Vbrk253NsyEcNDDQ5KUXFQ03Wo9XFPzbWXlh4rSFuJArqs76XSGw+vgUVsbAC/AT/AJLIUfoR34FhZe3Lr1Cbs9GrqBBA29VfOeSIQnEXYbrIAIaA82EL3pgJVwFbrDXsgHf0jxHmwWnIMesAUKwE8UdY0aTa+tzcy6/dInrz7etmnT2VOmvDxj+r59W6zWmK5d5wUFpQwe/K2PT/S1a9/X11tk2aXTGQ4d+rFjx9YffPAHo9H46qtvzJgxfe/etTduXHQ6HSaT/6lTG9XqBr16fWEwhMbHj+zd++sTJ7Z+++2zbrfT7XasWPF4Rsa5Ll2m2O01iiKfOXO4S5dFsbGDgcTE8d26fX727JotW15UFOXEiWXHjn3ZrNkIQKcznzv3Q5MmrRs1amW3Wy9fPh8c3PGBBxZ6bNmjotqOG/eNSqX//vtJxcU3fvxxWmBgSPv2Q2y2WrfbYRLrZg4fXFNfr1GrjaHhX365NDQ01PN5t2/fYeXKbzUa8ZFHJjz66CRJYujQh6zWerVaU1ERHx7+oSB4fsMgCNrQ0LcCA6dVVs6uqnpKURpAH6i32TK02kSzuZfbXQoiTITOYL8n76IlvA6FcAo6gT9YwAxjQYabghAgCCMgW1FSFaUMcsAGkSrVY3AZIqEpuP80i7Qd9AAJwgTB78/5gaqjICSBEQbALTgEApwDT911CkRDDLSHYypVbl3d5YqKdaLoI4o+omgWRbMoBrhcJWVl60AIC+tfVnairOwaDJflzxXlKohghEC1OkKjia+t3azV1rVq1fry5Uvnzl1Uq/Vmc/iNGxtBFRubcPz4vrKyks4dW/3ut/p/2Pa3V9P/joO/Hxn990Lb1ilvvzHr8dkLPKHQd95b+vjsBcD2DZ8Bj89+d8fuI2+/MWv7hs+WLZm7bf1nF1KvPz773f+6z8iIkJVfvX3mXNorc/7dzYL/L+OjkmSNi5tYU3OlvPygIKhGjBjjcNTv3PmLVqsNCwt3upTo2PEGg39SUv8zZ7bW1VV069b/1q1bu3bt0OsNbkWJ1ut/Sk/PrK7WiOKDUVHnb93ad+WKXquVZNlPFKd/8smZGzeAli37ZGevO3Hihbv7vXbtqytXPhk27M1u3WZMnbr8zJnLr7462+39Tf3hh+8cObL/iy+WDhjwwFdfLY+IyM/Le0KWrYDbXZGT84iinBkyZJIgqKzWqtWrZ2ZlnRw2bIrncSsIQAE4YAwYwTOP2QlmwBHvs9MIwyEcVsMt6AX+4Kyv/82QUxDUiiLX1am02kCzOb6u7nZBweaQkMa1tSdk2SGK/qLoJ4p+ouhbW3vIbr9eUfGhy3Xbbt9bU7PIx+dR+BXSYLYk2UBRq/WNG48NCAiXZaeiKEFBsT16TPPzuztp0BpGQZ73ZUMI91YdaaBrdTU7dkw/e3aVWj1XFEeDDWyKUikISRrN5/X1/t77cAI86HSur6+fJEkm8CTSWD3rQ1cYUV7+bnX1augHDT2CPg5HS3jYS1Nc4PaKp+bDXugKQVAIbperLXSEKq9o1GUQoC8cg3rwhQAIg1AohtMwCIALsBb6Q38YB2leiykNFMAdeBKGwkQ4B7dEUVdentqiUcTSd+Y2iIoCLKWlReXlrVs/2abNb9Xxoqjv2nVecvLY69d/kmVXRsaFBx8c9sorb9y9usaOfWjRosVZWVfq62vt9no/v3adOy8UhN/0sIOCWvTv/63D4fP555MWLx5fX1/drdt0lUrtctnOn7/Qo8fXYWGd7nYVEtK2T59vXC7TN9+MvXjxl1atxvn5RTud9XZ7TZs2XZo2bV9VVaYocoMGI7t0edrlsrlcNrfb7nJZRVHTr99brVpN/uWXx2Jiklq27FtbW1FWlhfuqxrcuXNVXd2l27clQTV27DhFwW632+12t9vtdrtMJvOkSVNkWfbzC+rTZ1hpqeX48b1ut06Sav7y+6tWh4Nelv2hC9xQqw9oNOEmU2ebLbWmZi/0ge8hw1sepPO6gu2EYoiCoLueCwBsBRESFSVLlrfA8zBGltcrSqq3h2rwgzfg0D0ppBr4HK6CWpYlp3O6JN39NYWiZDid0xXFAGbIg8PwGLwJ0bAfSr1XaSzs0WorZNnRoMF0h+PKnTsT7Pabnk6s1tTc3NlqdbIoaquqLlVU5AvCEkF4BD5WlIuK8itIUKRWR9bU/JCSkmS11iqKcvr0qaSkDmZz5OXL34SHd7HZym02a1lZUXx84y73q5f+c/xzR0a9pXn3279LGza4+7b1iyPCg0Fp27rJ9g2LH5sxqtBSMm/h0ratmyxbMicyItizZmREsGfifvuuI/91n5ERwau+fsvtll6Z8+nvfoC/b4uKDPWW2P99dxQR7qfXhzdsONXpLBUEjc1mHTlybECAX1VVRU5O+ciRSxITe7lcjrCwpi1bjrdYMu1226hR0+rr7adPn7S73f0iInqFhW3KyNCqVDZJmhYXV1RUdDYjw+F2D0hO7taw4QsrV2YUFrpcjn79pktS3oEDU63WonPn3iouPjB16tKmTQcCwcENH354pdPp98QTU/Pzc158cVZdXfXSpSuaNWsOREVFL1u2ulu38JycabW1h7OzJ0ZEKMOHT9NotIWFaV9/PVGrdY8Y8bBarRFFDZQoigOqYTCIcA3qvIXbDSACtnkfn3a4CaGgByPkwZk7dxwnT75ns5Vv2zYpO7scPnA6J2dnf19aerhz54Xdu38SE9MiM3Nyff15QFGkvLxXKitT4UN4t6pqe23tIn//uWbz1ODgZaJ4AZbB0xZLp9u3t8uyu0GDPlqt4fTptZmZ5/V6n3btHhQEYCnkQhwMBBXcAheEQhBUwVUAmkuSGaqh9G71sSAECEKALN+Q5RPQBX6EAgiC/opSC+lQDUYw3lOwnAYqaAbhkAN7YTBsgH1emqIBNdjgCyiDIDBDZnS0D2AwNIMC2O5lt6EwFZrABLgDJ6E3TAYbnAQZtsMxOATjoTMAzWAW1EEBiFAIz0IyAO3gRSisr8+LC6v7+JVXzCaPZRQLly67Udi0SZNJf/bUadp0Wrdu70qSc/Dg/jNmzJQkSZYlSZIkye12u1u2bPX22/Orq0tcLkNi4lhJckiSXZLssuyWZZdKpW3UaKLDodLpfJo2He1yOS9e3CIITTzx7z/bkVbrryhSbW1Jixaj/PwiCwsv5+Wdi41NiItrkpNza//+DSkpTx87tujGjR0ajUGjMajVeo3GqNEYrl3bevLkZ2q1Jjm5U1lZ3rFj6/RasUlcXHl19dqDB/s9MHTmzCdeeOHZtWt/1uv1er1erVar1Zp9+/Y8++xsf3//0NDI8vKSXbvWazRTw8K+kWVnXt4UpzPr7sAqK78vLn4TmkEA3ISDYWFt1OpAm+1yXV0q/AFmw9Ow2ivmCiiw1EtP/eEo+IIK/OEXaAm1gmBQlO0wD4bAMFiqKIWKshlqQYL20B++g88BcMNcyIDGEAx9oLfbvcDt/hyQpAMu12xIACcEwzF4BlqBBqbBCDgBt6AWyrVaISion0ql1Wh8Y2ImGY0hWVkzKiu3VlXtyM19VhQ7gKTR+JSVWQThC4+NgiB0EYTvFCVIlr9VlCq325KUFB8REatWq/fvP9C37/Ty8vy6usLw8C4mU4QsOwsKch58cGpJSeHvfof/R27/G2T0dxv8/cjovyMiI0KGDe7x2IzRwwb3AAotpY/Pfq9t6yb/oUFoRHjIf9PIftXXbwcH+U9+ZM7/8nD/2RAVGRoVGVpQWPJ33cuwwb0KC3dKkjU6epRabTp58mhBQX6LFq0NhsAuXZ70949yuewmU0BFRZaPT0STJkOt1lqVSjVw4KiIiIYOWXYrSlN//wkNG9Y6nTaPbX2DBiqr1SlJkiw3j4gY07LlhhMnXC67KKq7dx8fHOxz4MCU4GDzxImf+/tH22zVNlu13V7jdjsHDXotJWXUk08+3KVL53ffXWgwGOx2u81mtdttTqfj5ZdfmzBhgMUyp0mT5Natu7ndzuzsm263KyQktHv3IW63OyvrRmmpBUohBurgJpyHyxAOaqiDJVDgtYu7DmsgHnpCSzgIWfAMjL5zx2/TppHV1Y3gLfCFni7X6xpNolbrC7Rq9UKLFo/l5j5bWbklM3NCXZ0MH0M0AE/AdIfjHKDRNAsJWaXXB8CH8FNFRfGNG79YraWyLA8ePDYr68zVq3tBALp08ThxXwbAAMFwDWpBhACIg1NgA6CR273K7f5jxoLb/YPb/R6MgLEwGHbDda/gohlWeLksUAdLoQh8vGL1J2ECdIFZcAQWgcetKg/ehGowGQzhkCuKZX5+sYDNVgwZ0NM7TT/KcwgASDDWG117APqBx23oIkyHpqAAoEAIzIRgkGA6hIIMEpRCakzMdJ0upaSoaOKLL97KyvJ0XVZZd/Lk/CtXVvzZpXvlyvKzZxeKorhz565Zsx4tKytTqURRFEVRrVarN27cMHv2kz4+IZIk7N8/vbDwuCjqRVHvUZ7Pzf31yJGnZDnMYPDVaqXU1M01NTF+fl/Icv+DBx/Oy/tjYM/tth47Nruy8jYooqjLzDxmsVwOD0/W6Yw5ObeOH9/Ztu07CQkPdeny2YULa3bsePGuJNnZsytPnPi8VatBiiI7nfZTp7aM7N+3prZWr9WuPXhw0uSHH3/8qSFDhn/11coDB/Y/88xTtbU1wNq1az766P2hQ4eVlpaaTOadO9f6+r7k6ztZrQ4LCflEp+uSl/dwbe1eoLz8q4qKFTAZSsBPpTreosU0q7VEEPR1dbdgEbQAYBB8BbdgMdTAu1AMXaAOCiEI2oAVzkNnaAoOWT4Bi+Cul14yrFaUxrL8A/iAADEwBm7Dc/As1MKDd53roRFMkqSDTucEt3ueoiRBG6iEUngSGnhzBuzQGZ6HepCNRkdk5Ains1inC1UUSVHcwcHdIyNHFRd/YrG8r9X2UaubyHKJ05kiCEvA5x7BB5MgzIOnoLJZs/hWrbrfvn1FpzP37DmprCy/oOCmn19CYGDj3Ny9ohjcokX7y5dPjxjSoXPHVv/NO+S/If7ZI6P38e+OC6npkRHB/yETLbSUWopK//sl9u+98/SUCUMmPzInIzPvr6/9L42/Nx99cFifjT+/iHLS7a4WBHVcXPymTWt37txps2k2bnzm2rVdGo3e1zciI2NvRsYBozEoK6t8+/Zf6upqmjdvKynK4vT0a9XVUQZDoo/Ptbq67YWFVU6nThSbNZ+5+Nix26WlcQEBnRo0KCu4fu7cTlBateoH7kuXtubkpBqN/gaDn8Hgp9f76vU+ly9v37v300GDZq5cufzXX3d5tEoNBqNeb9Dp9CtWLPvpp5/GjHmztLTQbPa9devqyeO732ra1K+mtKgo78aNS6dP73t3zpvjRg4SBD0kwXVIh1FQBZdhEeigs1dKcx+0B4+fZEPoA4He+1h3WX4K7twzwR1rt7905Mia0tJUIDFxbPv2b5WWfuZ0xsGroL3ndA632cKrqhYqihP0ZvN0URRBgQdra9ulpa0HFIXRox+22UouXdqpKEqzZm0GDRqtVh+FQgB6Qxu4AYAeDgcHJ2s0V71krqMkXXA6pyhKntv9qSR9A4+Bp1ikB8yCK3AbVJAITWATHIJC+BJkaAoyOOAGPAbNAIiGpwCYA8fhffCFJJBttjzIkaSe164dUavNkAXBsB96Qzr8BBJchkPwgJcfeChCMxgBGjDAaq9qlQel8KlXQOBDOAkqqIa98fGdw8MnGgxxbePjwwyGR99889djxwCVqE1JmXr79tb9+59wOms9vZw793F6+s8dO05wueyjR08UBPXDD086ffqkZ+ny5V8vXfplr16Tamoq/PxSwsP7nTnz9rVryz1Lb9788fz5DwyGgbJcYzIFnjr1g8PRycfnfVAbjY+Zze9cuPDBtWtfA/X1Bfv2TbDba8LDBymKXFZ2u6QkvUOHSXV15Waz77lzxzt3/iwqqj8QHNyuZ89vnE7NmjUTy8puHTv2SWrqj507j5Mkl15v2rdv9dBevUICAjRq9cbDh59//pWHHvrNrjM5ucny5d+Fh0dMmTJx5cplS5d+OWTIsPDwCJfLderU4aCghWbz8Lvnzt//iaCguaWlH5SWflRV5TFf8IUqtTotJWW8Xh/gcFRbrXpYCEFQC3VQBxHwEfSHD70FZ5XgKUTrALlgh7bQFM6CE8ZACtjvSQx1w0RIABlugR0E6Adm0EN/uANXIA/SvGpfIxXFDt2hA5yEEiiDCu90/920ATNYVSp9SMgD1dXnKyqOq1SJOTnf2u3FgqA2meL9/FqKYpxaneJwbFaUPEm6qCjPQ8W9gg+KshMWqVSGJk3aHj68ta66OCQktqKi8MKFXTrd/Jqattevf2O1tpKkr/bsKS4rzX7xvtb9f4l/ajJ635v+PriQmh7hta2/F4WW0h27PXpPTf77vY0b3T8hPvrx2QuWLZmTGB/z1zf414WHj0ZFhv79+l+25OW5878oKzNbrbaAgJQGDV69cWOhVjvm0KHPa2osvr7hbduOSkvbc+vWXpVK63L5bNnyY9++wwRBGNmp09YzZ6qdTp1KFWU2Vzkca4trOnZ+Nzy8ndkcsfPkvGq7Xa9WB5lMkrPy4MEfO3YcptFohwwZvGPHR9XVhT16POYZw759iy9f3j59+sIWLXpGRiatXPlORsbtl19+zbP07bffTEvLmDVrWVRUcmBg1MaNC5Ta0qXt26f4+fUPD3837UROff2yxYsbN2rUp0ePqMiti7/6WVE6wSXYDyL8CCnQzJOdD7dgkNc53RPb84UusAUehEbQGMLgHZjqZWxfwc36ektISOubN3++evVLne45OCBJr8EcMHvP5TI4IUlNBEFbX7+upuYzeAyMsAZsISF9ZNnpcjl0OsOwYRNSU09XVOS73e6oqAZjxz58/Pj+vDzBSxn9Yb8g1EVGjjSZ4rTaIItlp6IEgxraKMpNp/NhaAhPQTBYvUfRAGbDAfD0Ewzt4AIcg0ivPZIMvl6NVZd3QzU8BPtgNSRBONigEsJBgD3Q1+2uhho4DQ9CCrSGnfAlJMI1CIIu91xTCpyCMtBDK/gV8mAMXIFdEO3l1l1gM2SLYmli4vO+vu08G+vU6t7NmkUGBr731VdZeXlllfXJoSHNmk3PzNyxY8fE7t0X3LixtqTkfJcuk0DxBEL79h107drl1157+fHHn8jLy9u7d2+3buP8/UOdTrtabTAao/T64Dt3tpSUpAYFNb11a62Pz3BRjLDbLxYWXlOUkSbTo3eHrtX29fNLuHNnXlHRKaezWqcLDwvr73CUi6KmujqvU6epGo3e6azPy6vq0uUzgyHM4aiE30zHWrV6PS9v1+bNTwuC3LbtKB+fwMzMC3ZbzdgHHggLDr5844bD5Zoz552ePfve+wUURfHll99YtuzLNWt+Gj16bFhY2NmzZ2pq3FptK52uhaI47z2xBkN3o7FvTc1WeBhMsAtqmjZ9RKXSpKev02gawXFIhof+9Ft+A9aDEzpDMVwDGRrDDbgFakiEPd6U0A1wEN6CuzfeDHgBIvX6FKczTZbzoCvooQ6CIUsQzglCrCy3h11QBH1ABVXgB7vA8xOiKXwHud5sZiATlkC8RlNZV5dWU5MWGfm5Xt+ssvLH/PyvQ0J6+/u3dTiKRTHJZvs5MDC8rKwQxsFZRZkMcwShH6Aoa+AL6G8wXDh58leN4JQFISAg/MKFvTrdH0Sxsyj2laQmsvytojjhnbz8X8ZMfGHDz5/8hzfD++C+N/19/LNj2OAeO3YfLfxTLScPE92+65g3bfToO+8te3z2gsdnL9i+6+h/3aEn9/Tx2QuO3pd8+jvHR6MiQ1cvnR/gb83P923c+AujMUFR7KIYZzJNTU3defnyJqfT1qnTZIPB6HbboqIGBgZ22bVrvVqtNul0U3r3vmmzWSWpwm636eP6DVgeHt4OaNCgf//+yy4WW0vr6x1u96jWreP9DIcO/SSKGrdbmjhxypUrm9eseVZR5I0bX8vLO/vcc8tatOgJJCe3f+655Zcv35w9+4mioqIZM6YWF7uefHJlVFQyEBfXYubMrxLiWjrk3+ZD5zZrNjokZOO2bZ6XY0aM+HjBS76+lyBJEIxQDGZoAjY4BG6oh4sgeLMkPe0cFMFtALLgPfCFTfA9vAyXPCaWly8vTktbbTB8oNWONRqXajTxMNtr0f4eHIMpQE3NVzU1S2AujIOh8LIoBkRFPZyY+HZWVvNjx/aoVGJKSitFUVavXpyeftnHxy85uZm/vxt+gRKIgQYmU5TRGF1be9ti2TF58kyTqdA7vGRQIB0y/iIr9AJcAgFOQjWYIR7UEAFWSAUb3IRfQPJmiKpBhN1wGgQIhUq4Ai7w8eo37QDPHP1k8MxvaGEktIRU6Axn4BfwPMRqYTmUgtGbbNAJsuBz2ACNoCm4QAOh0EWnK2ja9H0PE3U4LLW1qQrIspwYHj69V69Dx4+Lok5RZEWhYcOhgYFN9u17srz8crt2j2s0hpKSOxqN1m63KYqSktJi3LipP/zw/cGDh/v0meznF5ydfUWSXG63DdDpQhITH5Uk5fbtjb6+D2k08W53rttdYLMlGgyjFMWhKA5FsSuKXVFsohhlND5WW1thMMSFhPR2OqtKSw+oVOq2bccIgio1dbPDEV5ScrmqKl2nC9DpAnQ6f63WX6v102jMpaXnQGjZcmBISOSNG8erq7MbNWwYERJy+tKlK7czZ816+4MPFi5e/PG93z5BEN5/f97x44eNRlN4eMTRo0dSUwvDw79Wq32KiiY6HGmCoPU0EMvKXq2vTwcN+MDmsDBA0GiMN29u0GpbJCR8lJy8VKfbCy/d9aaHffCyVxTWcxk0Ax3kwjVoA75wCMohHvxhOKjgEfBI+R6A5yEJrCpVoJ/fDI1GB5uhAGrBH07qdBNlOReCYTpY4ScoAifchBpoBUaIhO5wDhZ6S9w+g0Rwq1T66uqbkZFL9PpmQEDA5MjIzyor04uKdjkcZbJs8fcPDQhoDDowQE/oDvMUZYmifANfwHAo0+u1WsExvF+/mnr79esX9frPRNGTqYwo9tDrPxTFr+EyPHTqzMROPZ8/debS/87d818O/9Te9PfJ6H3QtnWTx2aMenz2ex6WWWgpXb5647yFy4DtGxYXWkofn73gQmp629ZN3n7j8aGDeixfvclTg/9f97lt/eINW/av3bjn/+IY/oHh4aN/V0qal19kNjcSBC2g0wU4nacEQWs0TnQ41Pn5V+rqypo06ety1bhcdUFBbRITp7rdclV9fZCPz7Q+fYpkwa/Bgz17fqzR+LhcdXZ7pcNR5eMT3a/fkjIaWJ1OSZZ7Jyf3S06yWmsdDkdwcPC0adNdrqJlyx4KCQl+4onP/P3DbLZam63OZqvT642PP/6Jj0/CtGmTmjYdPnbsXBDs9jq7vd7hsOr1piET3/9eFb2r0DO1zYz4+Pjs7FGTJ7vdbpfb3a5Vq0enjtZoTilKAUTDZDgMhyAQTGAGB2zz+qo74VfI91bSHIY/QCcYDEOhBkphDKhu3Pj2zp0zRuPXanV3z371+jd1urHwCsyEHI/XotOZXl9/EhZ5FY5skCxJ716/vq6q6kxgYA94aNu2n5xOBzBm0KDz546dPHkQ0Gh0rVq1hx1wE7Qqlbam5pbFsuO55+aMGTPlyy9/Tkoyw2XwhMoSYRd8d88H+AscgCaggkZwCQpAARWo4CqEghHiwA6Lvf5Png3PQoo3clwGTUCGEqiFBtAOsqA1RIF0j5lnMuhAA92hBlbBba+UfUOQoBY8ZhYtwQ4dIBFuQDFch9ugdjj80tKmVVUddTgsZWW7Bg/usf3ytUPXrokqVYDZHB0YGGq0XbmyrK4uXxBUERGdRVHfrNkAs1nJzDxbUHBZrTasXv3lpUvnBEEIDg4NDAyJjW2i15szMi5ev34GyM/fnZ+/XZadIGi1vqIYLIrBdnuq1XpYrfZ1OksrKye63dcEQScIekHQC4LBZltbW/uSovjpdCFOZ0Ve3tqAgBitVi/L7osXN1qtDUJClgQHL7p2bdXZs6/ePft2e/nBg5NcrjJFcel0xrNnN9fVWUJCQk0Gw+GzZwsr6t5446uOHfvNm7fq6tX0p556tLS0BJBl6dVXX7h06WLzpk31+sCDBw/cvi1ERHyt1TYMDp7r7z+ttHR2be1aQJLKLZZxdnsJpIAf7IiO9k1IaKPT+dy8udls7tugwRzAZGrepMl3gYFhMBWuwBb4CNp6C/VOQXtwgg4uwyCoARFqYAhUgS8AXaAzLIBPYCEkQwuoEMUAUJnNw43GLrAHrHBWp3sI3KAGHzDCGEiAdaAFKwyDam+3JugGKlgA30NjaATVopgQEbFIrQ6W5TpZrpOkSq02MSrqK42mi6K4g4J8YmP7V1dnQjC4QIF4GA97YTUMAz1k+pt1Q/v0OXPpktvtlqReKlUTz68LT7KBIPhrNI8JwhdwGVrn5Qcs+uz7v/WO+S+Kf+pp+vs6o/cbAjw+Y/S8Nx/fsfvo8DHPzZr9nsVS9s4bjz8+Y/SOXUdnzX6vbesm8958fPjgHlERIcMH99ixYTGw/K9JkEZFhHwwb/aZc2mvzFn8ux/g79uiI0OjI0MLCkv+Tv3HRCdnZ39z69Y8QKeLEMVMm20nKIKgN5u1Z86sqakpEgTx5s2lFRWX9fpQrdbvUPrtXRcuaERRLcgZGTtqarK1WrNGY9brA3Q6f53OLz39l7KyyzFJfVYcO1ZcU4MghIe3On787NGjhzUazdix4yorC86d+7WoKMto9DEYfAwGs8FgNpsDzpzZefLk5latJuzc+Xlm5kWDwazXm/V6k05n1GoNe/cuv351T2plpecGtPjmzZU5Oc9NmPDcyy+nXbv26ZdfLl39/ZQpH7Zq1QNKIRCeAj9o6DXmjgcD7IQc2ARu6ORlbOvhwXsmnbvAANgDqXV1tWp1d5WqATjAE0tziGJzQQgEESaBA9aHhTWCQnD8acyywuE4WlFxVBTNvr4tq6vZtm0b0CAyctqoUSWWnBs3rgKNG7fv3v1BUTwFKIrT6Ty3cOGXvXoNBAICgv7wh1V9+nT0uhkJkAI34UMogy8gFdp7F8VBR7jjcfqGM5AA8V7bzxYQDMvhPHwCt6E1yKAGJ5ggE8ZDLJyHCu8Fchl+BIc3npoL34LK61PfHsJgM/hCA7CBDL2gHG6D6F3tHJTB0zAbLJAOZlnuffv26zdvzh46NK5fv3Fz5qyyG4LXnjxZbbU63G6z0dg9JeHWrXUlJRcBRXGr1dpLl7ZbLJa2bbvrdKauXSdcvHjhwIFdsizbbPUmk39a2tGMjNTExAcFQRcW9rDLJWVmfm+zFbrddkHQ2+2XbLaTkZET3O4a6KUobWpqZtvt6z2ft9X6pdW6DMZAhSga8vLWRES0VKu1BoP/uXNrZblTcPBCQRANhk5hYd9UVbkPHZpSW5tdU3Pn8OGpGo0mLq6/2+3Iyko1Ghk3bmJ1dbXb7ZbUPnPmfB0eHgNERsbNm7c6KqrJ9OkTT58+MXnyuCJL/tTJk6uqq9VqR3Z2YFjYElH0aL7i6/tQWNjntbXrSktfKCqaKkn+MAJqwBUXZ27X7gG7vVYQ9D4+gyMiHpVlq6eBHBv7SnT0w2r1PPgSekIcVIEVWoM/lIEK+oMD8kAHPSEPbkE5FIMDomEC7IGe0A7OQb3dft7tLlIUu1bbxNd3Ogg63XhBEByObRADv0IZ1EN76AU+0B1uwGUohSve9AxP+X8yNPGkc9TVHaqt3alS+ahUZpXKLIoBoujvcuVVVa1TqQzh4Z3z8g6UlJRCT/gWboEKfCACYiEQdmi1UvsWLQ6cPHk7t3rkyO9CQjJttpmKUiQIelCDRpZv2u2zFMUPWsJcSOvSseXvfkv/x2x/Oxn9HQd/PzJ6H7+hbesmy5fM2b5h8fYNi9958/HIiJDtu44uX71p2ZI3H/+L2qZhg3rs2HXsr/YZGRGy+uu33W7p5TmL/y6D/qdCdGRo/t8rPuqAwaWl565cmanRBMTGDvD1NdXX/yAIWr3e3Lp1t/PnN2g0wODCwoPFxcdE0dioUZtKl7jm2DEfo9HhCNu794ns7N8qkWXZdeTIK5WVF6dPXzZkyKsduk7/+ezZLFfCwIGfDRmyPCurZvv2rW63pFKJ3du1Xrr0+ZMnt9wdx4YNi/bu/W748I86d360X7/XfvrpjWPH1txd+tNPb1y6sHV8796el69fvnzW5Vo2d26PNm3enTXrh++/P3b60pNPLktO7jhhwtt9+46FpVAHL0GNV1DT7dXZPgRB0BgkKIB8GAqN7wn+uSEBGoFTrX7S5Tphs70MIugEQedybbJaZ+t0bcEFdtjYsGHLXr0+b9v2aXjNa58IbIbn/Pw6KIqzru765cuTRbFjYOBWg6FvWWWlr9k8deTI8AAft9tlt9dHRSUOHTozIKAyIED49NNvmzZtde8n9OyzcwYPHuKND4mQDG74AIqhHai8Zk5uCIJe4AQbtIIGYAWrN7CaBJ1gK0jQEoASaAwlUA8TIAK6wQNwDcpBDb1AgeWQC6fhF2j8/9h76/C4zjP9/3NgmMQsW5bMzMwc23FMie2Y4mDbYCmFpOG0adpQg07SMDlmTMzMLNuybFmSZYtpJA3PHPj9MR2vu93ttkn3l02/vq/n8iXr0DvvOfPqOQ/cN+TACSgAATJAg1RogQqYDK1hBjjgCKjQCCZ4ANIgB34KFjBCK4cj64EHHu3XbwyQkJD6k5+80qHXmI927fIGgyaDoU/btjcPHVpTtfvy5S2aplRVFWqab9asWcGgz2AwJyRkjhp1u9vtX7r0w0gk4vW6y8uLu3RZqChBUbQIgpyYOM1i6VZa+pmmBQVBDoePZmTcGqMdtUAvmOnzven1Pub1/jYQWA5TIVGSqKvblZs7Li2tdzjs9/ncgjApPv7nV++FJCUnJ78Ag3btWrRv373x8Tnt298UifgFQbTZ9EmTbgoEAh5PS2rrHg888FtJkkOhQDgcDAb9oVBgzpx77733maeeeizO5ZwxbVqT211WdrmxMTUh4WcAqKDquqLritncPSXlmUikWNNawTi4bDAca9OmdffuoyoqLhw/vlkQNJ/vjCRZRNEaM4soWiKRWl2XoDfkwBG4DHmQAkfBA7kQgd2gQxsog90wDbrCV1AERpAgDJmwCRoEwaTrDo/n03D4oiCYNa1FEEyCYAmFVur6JHgbWsNSqAYbNIINLoIEadAGPLAHmgDwQBJsAwtoML+p6avy8tsjkYro3La0rKmsfEgU+xmN5oqKnQ0NOrwIt8PjcAL2AlAHbeDztm0HhcPeyxUVFXXa5MmvuVzZkye/2q3bwGBwgaJ8BSjKpmDwQRgIMjwIBZA+6DrV6H+D73dk9Lu8+HX8H0ZlVd3b762MeqV/u/W//OV/h/euUz7F8L/kj2ZlxoMFbvB43FVVKxTFn5MzOT29j6KUhkL+9u17jRo1w+9vhhS4ua6uUBDEUCgwcuQsozOjtKYGWkP//fufOnv2w5aWS+vWzXU6jXfc8efk5NympipFCfft+6NBgx4GHI7MqVP/rGk5n332iSxLacnJMyZMWLXyxXXr3lRV5d13Hy4sPDl79tu5uUOAzp0n3Xzz63v2LP3yy6cbG6uef35GbcWpRRMmWE0mdzi84MABPSvr3SeeaJudDcQ7nS/+7Gcje3U6efIvwpjjx995yy0/gg9gN+SDAVxwGuqgHkZBENwxCveO8DWsigX/orYaTsFYRVkqSbdomt3nW6Bpl0KhP4VCb1gsNwmCAYzwcdeu0/v3/zXQtu2MkSNfNps/gdfhHXjD6ZxsNGZ7vefOnLnHYpnrcv0ciIt7as32Tlv27gXSU1KMRnH16jeLi/MtFltCQkpdHT/+8eILFwquvUevvvrbXbu2AkZDGVSAANmgQicwQCmEQIXNUAVmSI8xRlXDYZBAgKMQAAcYIB0EuAT1UAIpMD3GNhqANjAXfLFFvg9kwiewA3pDGoTBAXFwOEYOpYAKM8EQG8wwGABhyIDFMYmsEIgwFrw9exb++MfPZmbm+nwev9/j93sDAe+kSQsX3/lEXSBiNhhUTctMSrpt7FirUCUIoq63jBs3S5Kk5ma30WjSdU2WDf37z0hMbOvxNNfW1nfuvECSjC0tl0TRpGkh0B2O/snJc1taLopiMDNzkSTZPJ5TIMV8o2y4IxQqDIV2wixIgOOq2tKmzbCkpE5NTaU1NafCYWT5v+iklOVUXZfs9tTs7GEtLeUlJesMBsPAgSPr6mpXrVqakzN2x44N77zzW7PZajJZjEZz9IfS0sJXX31CFMWBAwbU1tV9uWIFgmC3qxUVN/v9e0ECSRBkQZC93o1VVfeoqgVaQymsTk9Pc7mSKyrOHzmycdCgJydM+MBuF8+cudnvv3B1VGVlz9XXbxRFOzhgJ9SCBDbYF+u3s8NWaAt+kOEgzIGu0A8WQTHsimXwj4AXOgpCotE4xmic6vdv9fu3KUqlKKYGg+/q+jxYDMBDcA+sgv1QB6kgwmDIBgt0BDvshzIIw2VwQTtwQQIsCIXkK1fme73bmpo+r6t73mC4UdcbJMlUX2+G52MKokNhCdhhVVTZq23boUaj3Wo2l9VIU6a8YbUmRmegf/8fjRnzFLwSCj0TDj8F/SEZjkENjAT3N1sk/1/AdWf0Ov4NUVVdz3/TR19ZVbfkvRV33z7jHz/bb69TPsXwv+GPPv2bewVhI7hhlKYZy8o2NjWdT0rqmZU16vLlonPnjiYkpGVm5kI1OGG2z2f2eNyRSHjAgAlZWe0gDFkw6tSpD7Ztu7d//6mTJj0ciYTq68tWrnxSFHM7dZoRDLoDAXcw2BQKtfTv/+Pc3NlgCIXDudnZC2fMOHZ49TPPzJak5GnTXrBa4wKBpkCgKRBoTkxsM3Pmn/z+yOuv35YZZ5k6aCRQ2dBwsKFh4uTJT/7oR7IsRxRFUVVV0zRd/8nCha0d7s2b39E0VdPUnj3H3XDDHINhC3SHTHgV+kMtjIYOMAWuQApMhoHQGy7C+xCAFngTgnATxMMYRdkkCLmCcIPf/6NIZK3VOleSMjXNZzSGhg9/skOHW1U1qCh+RQkkJXUbP/7D5ORSQVgVHz/bZGoTCJwJBEpdrgft9vnR0BeoFsv4K7U/WrphAyBJ0o03Tj9xYvvJk7t0HUlyhsNtHn747h07vgYikchTT/10375dw4bNAhbfdFNKogrFsbYh4BT4IDXWHH0CikAHGRrhFHQGHeIgCMehHnQQ4GxM49EHF8B9TXWBGS5BDeTBDmiGjpAMbSAlWv153w/GwCXIgpNggUJwXcPdY4J62AM9YDesi/WNRWn2j0PJyZN7zp07YrM5bTaH1eqwWu0Wi91ksmzZ8oXDkXPicuOm48cFcFqt43r1An348Mmgbd++urFRlaTUHTveb26uFQSxU6dhgiBmZQ2XJGNp6df19Q1m87TKyld9vtMgmEyZomh3ODqLotnt3tPcfFkQnPAZ7ADACDZIBRscMRguguB0ZtXUnLp4cbPLlSNJgxobf9vU9Nq1X5nm5vfd7hdlubPNlub1VhUWLmvbtqvFYhFFbe3aFR07zhox4idz5rxXXe157LHbamv/EvbbsWP1c8/dP3r06EDALwrCshUrBg4c5vN5k5O7tW49qq7ukaamd2Pn/7Sh4XmYDjUgw4bp0+e2tLhl2XDq1K4RI15q1WqsyRQ/dOjv27WbWFh4e0PDBqC09FG3e3t8/DxVbYBaCMAN4IMr4IJOMU6ujrEqzEOwIEYTC2TD3WCDbWAGf7ScVBQTAFluZzbfHolURSIlmtYA98Mt10zJZHgdKsEPKvSGEJSDBYDW0AEKQQIzDIcGSIl9HUbr+piamscbGl4zGCYLQpKuV3u9feBxIMYwpUIiPAu3QKR9+96Jie1ra/MR7d27LxBFWVXDqhpWlJCihLKzBw0YcK+qboLRkCOK+8EGQ+BsdpY4+DrV6H+D687odfwbIj0tqbK67j+12HMNQ36UMP8fxy0zxz3xyD133//MdX/0X+6PZmakTBzfHQ5COZjT0weUlq5rbDwty5b4+IRz5w7n5++Lj0+Gg7AlSh7U2BhZt+7tmpqyjIxc2AlFEA8DAgGlsHCnpkUsFmdFxdnKytOhULMkWczmeLM53mKJM5niIhHvuXPLc3N7L//qq+Nnzya4XLNvvLG5uebKleORSMBiibdY4iyWOIvFZTa7Ll7cfaVsr4g6vm9fp02+WFGxYvfuBw2Gt5cu/Wzjxr/o2UuSJIqiILz40UdLN28uLT0lipIoSitWPLdr1yeiKEM2SOCEZ2ESVIIHzsbY76PoAqOgGd6AJZAG48AQ29pPVS+q6vu6niwIVklKCYcPwanMzFEHDjzudhdKklmWrbJs0bTIvn2/8vlEl2tCOHzJ692naWemTn1d075obHw4GvoCSdOaW1peuFLl2r7/LNCmTd7cuQtra0v8/hYQXK6RcXE3vvzys59++vY999xcVlY+YcLtgiAIguCw2RZOmdI5NzHmcdbCYDDCZRAgGbpDGdSDBiehM9ii4uOQBD3hPAC1oMDlWLFpMnxxDVv+VjgJI+BWGAh7oBw0MMMxcEP8tCmjt65/cUA/CVIhBB3gIqwGPwBnYD30gwEwA87Dq7FG71VwEpIGDJizZs17S5b8B59/XV3FI4/MlqT06dP/NGfO+yFD7kfbt9c2N4ciEUmSNU3dvHmFJLWaOPG1ESOeat9+1p49n1y5ckbXdU1TJcl4/vwyvz8pKWmJ3b4wIeH55uaDTU3bAU0LiKKlpmZlOOyXpN6CYDeZFgtCNSyDJgiBC3ZLUmlKykRJMrjdJZcv7+nW7dZAoF4QrGbzIq93S03NHYpSC7jdr7S0fGCxLNS0BoPBWli4fNCgKaIoxcXFffDB24MG3TdgwB2A05kxffqf4uN7//rXC44d27V+/ccffPCHUaPGOxxOm9X6+ZdfDh8+Jje3nc/nMxodiYldO3Va4PevqKr6odv9ltv9JtwIiSBI0rpJk2YkJ6d5vZ6CguOjR7+eltb/6ox17Xrn0KG/rax85ezZuS0txxMSFup6SNOC4IfxUA9hiIceUAlByIF0KAYJhkFqjFI06heKMARs4IIRUAQnVbU8Ejmk6z5BkEymGZqm6br/r3l2o2gPaSDCKAjDMbDFnhYgDnLBCIPhGBRLUhg+g/pY2UkbSeokiq0ikdWaVg+74OfgiZE/SCDC5/Bno9GWlNT+zJkVEGjVqttXXz144sR7kmSUJKMsm2TZdObMF3v3viIIRsiCNVZrnCg64Ay4szITvvlC+e+O73s3vX7drtvfWkZ6Up9enZ747ZJrf7lu464nfrtkyqRh99w+4xucs0+vjm+/+sjd9z+ze9+x7/wDfreWlZFcXllT/i9SDS2vrMlrkwkD4TQYFcXfsePs6ur9fn+13++dNm1RY2PVlSsXoQ+osALMuq7Exw/esWNZXV059IJCOAlGiFRViW+/vaii4kxcXDr0P3DgpWPH3oyuF7pOZeWRNWsW9egx6tZbn1u8+E+HTxduP3jQZDDout4qy/XZZ4svXTpwdX3Zvv2FgweWzBo1yhcIKKq678yZfcePP28y3SzLS8zmr1ev/skLL0T31HT9F6+88vX+/QtnzRJFMRDwvvHGPQUFe8eMWShJMtRGBdkBuBc6w6dggt5/vaBlwYgYP3y0ksQDW6Eqttxp4NO0vh7PRwZD9YgRb/Xs+bOOHRdv335fSck6oKnp4oYNcxWlVevWr6an/9Jm662qF6ZNW5Ke3nPGjD+npgp1dQtVtTISKairm68obeBhX+AnHk/ypUulFov15ptvlWU9EqlVFLfZnJeaes+KFcsdjrTBg2+KREJnz+4XEM5evBgIBscOHDh+UM/YmONgImSCAiGwQ6+YSk0PcEAdBCERssAHxhgdabSWLtoXkgkdYSvsgrVQDj2gHl6CPJgLp0GFZtChDyigZ2Ykf7DkiQH9zCCCBN1AhWVwBPbDGOgGQBzMBBM8D59AAfSAsMXiHD588cWLhY89Nq+ysrS4+PRTTy3OyRk7YcITgNFomzTp2byOMz/Zvr3B47FYrNu2rU5MHDRq1G+j0p09etw2evTvzp7dU1CwC7h8eYeqdk9IeEEQbIDJNCQp6b1wOFJX96WuR/z+klBI1PWpuu4TBIsgOE2mBZKUAJ9F58piCbRqdbuq+gVBunRpR6dOcyyWxEgkIAg2UUywWG5TVbG6+taGhqd9vrUWyy2imKjrntrak/37T0xNbRUIeGtq3BMnPtWu3ehAwB2N7geDzf363TZq1K/efvu55cvfnjRpWk5O3pUrl/yBwKhR49u163DmzElAUUKA1ZrSrdtdTqfQ3Pw5zIJMOChJyk03zUlNzdi5c5PLlWcyJRiNrv/0ZzgxsavD0VFRauPi5qiqu6VlnSiaYDBcgS0wGhrgIhSDAVIhHzzggD3wCQTBEHtNqoL3QYBUKIFD8LCu/zISKQuHNwOCYNX1Jqv1BngR3rxmFCH4KdSBB76AM6DDYBgAF6A89m2yw1EoA5MkdZflHPg89grUKIp54fCnNltXUGE+KHAb7I9d4j14HzrZbCn5+V9mZ2cEAn6HI3nIkIUXL25YvfoOj6cSOHJkydGjf7ZYJuu6AdY7nW0VxaNpTqiF4YMHdP/OV+//s/aviIx+Z4O/Hhm9jv8Wb7/6SJ9enW6c9dATzy554tkld9//7Nvvrbzn9hn3/DMJ+v+EPr06rVv20vLV275Ysfl/3vvfGtEW+28fIi2vrM3KSOnfpys0wA0gRyJ+hyO7c+eFHs+lUChktdqmTVtoNpsgCGMhDfYoijc+vndW1vTS0gIIw0iog+jPk32+th988IPa2osQgpmnT6/ZtOk+TVPy8z/cvPmhCRN+OHHiA0CbNn3uvvudGreycdcuYNCAAaNGDF29+menTq3QNHXt2oeLL2ycN2GC02oFjl24UHfhwtsm0xBJAjqK4rsmk3T27MJHH62orZ35k59cuHx58ezZJpPJ72/6wx9mRyKhceNulySDLAP7RNEU+8QvwGr4FZyAfX89GfmwAVwwFfbALtgCreEobIad0AP6w0kYreuZgUAd0LbtnEGDfn/ixJ9OnXpjy5Y7HY5pGRl/qW9OTJyXkvLorl0vAGaz64Yb/tCpU9+6uoX19fdo2jhYCECSx3PX2rWew4f3m0wmp9Ol66m1te8FAoWSZBMEU3JyFggHDqxtaAjoCHvzizbs3RtRFIfNBglwCI6DBA6Q4RhUggjWWMa8Aq6AEazQDEWQAEqsnasLtAYdgpAAvWOqpNkQhvbQA1aCHe6CIEjQGdxQf3XWPljy9IB+ncEHKuRCJpyCkdAGtJjspwoDoQOchpFggaAsGw0Gy6BBtxoMcU89ddvvf/+jPn0WDRhwezjsC4d94bA/HPb37n3ruPFP7j53Sdfl9PSJvXrdEQy6g8GmYLApFGpOTe0xefIbmuYQRaumjXc6H9J1r6a5Na1J05oFwRYf/7zJNAMEny8iy1NA1fVSMESLHAyG8QbDFKi32ZS0tKm6rrS0nDIabV27LrBY4i5f3qXrDkU5r+tNuh40GkcbDMMCgR0WywJRTAiHd+h68+DB43JyOl24cLyoqDAc5sKFbRZL/NXovtnsMpudFRXHJUnu129gdnbr48cPX7hQkJqa1qpVm8OHD5w+XTB//uuVlZtLSzfqugKCLNsgBVJhc1pancVii49P2LRprddrmzjxT2lpXb/6an5FxX90f7a0lH399QKzWQCTIOhNTStdro6aJoEbdsFk6A0ToRYywQmnIQzJYIFBoMKbMSLbfPgE2oAPzJAPj0EfaAN/UNWcYPBDVS2BiCy3cThuk6S9cA9chkZYDE3QCrqCDwwxYtoOcBP44Tz4IQkuwU3QIIpJRuMok2kG7IGt4FHVkxZLO0lyQRwIMAEGwWPwAbwOS2E8NITD3szMjC5d+vp8LQ5Hit2ePGTIYpNJXr583sGDr5w69bnVOldV60DLyurjdPYPh2vAA/OgOjsr7VsumP/GUNVv5Ymq6nc5eKGyeNt3ef3r+D+Pyqq6YyfOARnpyf+UFNPfP+ejT70py9IfnnnwX3LC7zWi3uS3P/bIsTML73odBsPW+PiUvLzJkYj/1Kkl8fGJo0ZNDQb9Gzfuhz5ggxpR3JOVNc1iSfd6SysqCiB6Z0/AFXgAjFAI66EjjAQV1tvtgsGgT5r0YE5On+gVo+o1wNdfv3r69JZ5s2clxMdfunx59bp1ZnO8zaDcMmaMqmmBUOj9DRtuluVbDQZj9IBrGD0+iERWS1JeTs64ESOCoVB5ZeVX27dnZHbo3XtCJBKqrCw6cWILWCSptaq+CI9DPfwUUqESXoIgjAcZ9kER9IZSuB22QC10iU1VNCc+MPbfY5AJjUOG3J6U1AsoLV1z5sxrNtvA9PRfCYIJ9FjXNjU1r7rd22688ZmMjF5Hjrxz/PgHAMyDv9Ljgedat47YbLaLF62SlBYIrHc4+gcC5/v0GXL69G5ZzoqL611e/sW4cQ+dOrXe01w2YfDgldtOiuIMXV+j6zK0gkJIgRJIBAn8YIZ6aAcXoAPUgCtajAEOqIeuoEEhhCAdWsfeKHrHYsNRnIIo3WMaKFAIGeeO/0dg7JEnXl259gQEIA/UmBxALoyK7dICG8ABYXBDbygymSI9e05JSMgGTp/eVF5+pn//xdEc97U4fvzzAwfetVhsNlv6mDG/N5nirt16/vzKI0feEgSjooTi458xmQZcuzUUOuh2PwGCwbBI1/2Ksl7X20OiIGyU5UmS1BYIBl/JzLxZlu3V1WuNRlEUje3b33Tx4oaWFt1mey4Y/CgS2WY0Tpak1opyVlEOWyzzgsH1JpPH76+bOvXugoJDpaW1SUnPiaLd7f6d3d50ww3PxsVlRQfw1VePVlWdstniu3TJq6wsr66u7Nq166VLNQkJtsrKplmznktIyA6FfBs3Pnfp0omcnEn19fn19SEIJyZ6u3btfvFisSzLopgzcuRTug5QVLR+//7nunS5vUuX2+vrT+/b96v4+DZGo72qqjwcLklNHatpkbq6IqiBaZAbmwkVvobSmKJBAVggB4AKKIQBcAg6QTrshgT4ObT661uxBd4VBKvT+aPo/wOBzeFwAdghGUbAUSiEwZAa+6ZGIcAZOAcJMAYqYI/F8gMwRl+EwuHdqlpgtw+3WLp7PNuCwTCMi0k8NsF68MFwCMHBXr36d+s2YM+ejRUVNbm5vTIyugiCAEJLS82RI8ut1lt03R8Ob7LZusTFDa2pWRYKVcFdcOynD3T5N1AE3Xfg5Nadh0VBvHHSsJ7dOwANjc3rvtpdWlphMhknTxzao1v7qzv/nU1/i2dfHP0tx/bIT7Z/yzN8Y1znGb1u/4NFuUWnThret1enf+E533/zMVVRf/7oK9/5B/zOLfsbUZBGifSzM1Ku/qZ/n67b1j8JOwTB5HYHCwo+0TQFiI/PXrPmowMHLhoMqbAGKiFO19UrV1bU1+9zONqZTM1wBDToAwK8ARehI4yRpCuwCyS4yett9nrdkmQ0m60mk9VkshqNVqPR0tJSe+nSSaNR/uizz4qKi3NatZoza1Y46L51/HhJFKsbGr7YsmWuwbBMUU6qapwguATBJQhOQXAIwipF+VxR7h46tLGpCSg4f37dli2/mDDBrHjq68svXjxaWLjv4YefHzNmvKZdgcVghOcgFYAM+D20hVXwFZRCbzCDAF+B5xpPFGgHNtgRpRqFruCF0mCwXhQNp069fPbsn/PynjcYLCUli8Lhy6JoEQSDrqtXrjzsdp+Eh9et+3DVqrvPnl07cOBrAwa8YjJ9BVd7YjzwFDSWlTWXX7kMyHJ7m22Bz1cIFBYesli6pqVNEEVZEAB69JiS1WrAym3bohQBgrBQEJxwAgAHdI6pk0fJ59uBDBa4AElwGQZDGDpAOzgWExwfCE1QABEY8teeKNADOoIbVLgA/SF07eMEQCdIgDMQBjlWpLgCPFACK8AJVpBhGJyX5WDPnv0OHVp6+fIJIBj0JCYOO3Fi5cqV94XD/qsX3r//rX37XrfZBrpcqaIYWbVqXnX1iatbT5364MCBF9LTR4EcFzeosfEnPt8XV7f6fJ83Nv7UZBqr617QFGWZrveHX8Hduv6jSGS1okRrQiKSZKmo+NLpTLZaU8zmuKKitV5vkt3+lihmWK2/NJvvDoWWRSJHNa1BEFyh0Ncmk6dt2xsEQbh48VRZWTA19U2jsa0spyUnvxIK9f3sswXFxTsVJbRs2T0VFScGD57n9Ta0tDRXVZXPmze/oaHBYhFbWqQFC96IOuImk2369KcHDLi5sPDTUKgJhDZtpNmz5zc3N/v9Xoul+1VPFGjXbsqUKX+uqNi+efPtO3fen5jYtlWrwaFQczhckpZ2g8PRIRJpAgVmQyb4Y/QIERgDY2MEC5XQDE0QgRQYDodjfX7nQAHTf9UTkgNmXU8JBDZpWqOm+czmISZTf7DBCDgJ5yECZbEeuKsGVIICg6AMdsL0QOB1RTksCLIg2GW5vSjaLJaezc3rNK0WHPA2FIIA8eCCHFDhGMi5uZ02b17h8cQNGvRefX3g2LEVgUCzLBtbWmpEMREkQdjiciWbza2qqz+32xPAAad/+kCXnz246Dtfrr+lbdp6YP3Xe+fOmjB75rh3P1yzfecRAdas25memnT34ukzbxr99nsrT+Wfv7r/39n0t/bt0/Tf4cxcT9Nfx3eG9958rGunvHl3POrzB77rsXzH+Gfz9dGA6N/GUzMzUratfy4r0wkT/f6kc+c+EQQRhOzsBb16/UnXAybTJNgBZbquZGcvbGkprqxcJ8u2tLRMQdgPLTFKl9VwDMxGY4LJ1AjrwQ8GVR360Uc/OXJk9dUrnjix4c03F+fkZIqiNNZuX7N+/dETJ4xGo6JpEUU5XVKycteuH8F9BsNTJtOz4fAH1xTJvxAOfyQIz8+ceUufPg8NHfr+Z5+dOX36tblzJ3Xt+votM8Wak/X1ZU89taR37yF33fXw3LmLQIZ7Qb9GTEiDudABmmEAWKAK6uHsNbrzV2EEN1TG+sGrwHju3Md79z5QU3O6Q4clDkf/nJzHk5Onlpbe0dKyLRQqKymZ5/Pp8HNIgDtqa3Pi47snJvZKSuo7ZMi78fFheBrK4BHQYBhILR6rolRFIucEwWK1ztU0LJbeCQl9QqH6ioq9qjrq9OkNPl9DRkannj2nimJQ14+AVxBGCUIvCENTTIcp6iLmggDlEAIFrsAQMMQ48DvBIDgPMthgMEhghO1Q89ef/TiUw81wBdqBOUbn9BdU19SBBO2gMxSDDEboBiIsg22QAbkxAnwLDJFlS9eufSdMmHXhwp6zZ7cqSkQUTdnZi91uz2efLaiuPgts2/a748eXJiUt0jSvwWDu0ePGjIyOX399X2HhCuDw4ZdPnnw/J+cWTQtLks3h6JWSMtvrfaep6TegezxLWlpeN5unCoJREOzh8Ee6PhV+GBvyeHhZUcoikXVATc3GxMSc1q1HRCL+YLDJ7+9gs70gCNboribTzXb7q6paqOtNEHI66dZtvqIEDQZTaakhNXWJJP2H7x4Xd7/L9fONG3/z8cdzIpHmoUMXKEo4FPI1NNQsWHBbOBx2u91GY/Ytt/zRaLRqmqJpqq5roA8evGjBgrfC4caOHaUJEyZXVVUWFhbouqNdu8mRSFBRApoWiVp8fG779tO83ss5OSOzswdXVZ10u8+npo5zOjvW1e1paooy2+8D6Rr9BTMosD9GcW+DbDgGVWCIFd4lwnFQwQJ2+AVcywa9Gx6Hm+H5cDjZ612qaXWCYFPVKnBAviAUCYId+kMDrIzpnAFeWAkWECAEB+BOGAQPRSLFodBqXfeparnBkNbcvEaSNF2PxtSnwE7YBUAdJMJOWZ4gy+rx4/sgr2/fFy2W1L59X0hKmnDgwMfl5fleb4MkJfj9n3TpcmNj4xWPJ9/pTDUYrCZTyk8faPez739MFCgoLJl50+gO7Vp3aNf6D888sOS9FZqm37HopoljB2VlpnZsnzNx7OBTZy5e3f/vbPpbXO+mv47r+IZ48EdzFsydfPf9zxZdb7H/h/3Rv5/Wz8xIyUh3QAiGKEovWbabTDe0ajVPVf26HpDlThbLXEE4AwiCITt7kaKEVdUHdOs202TKBwnsMBn2QbWi+LOyFtjtdlgBMgiSNHPt2pe2bHkT2Lnz/VWrftuz54DOnbubzRajIMxOTDy4d++JU6c0TSuvqzt87NgLJtMMWQbGSNJbZvNGVf1pKKTBL0KhE3Fxb8+fPyQvDxiSl/fa7NntUlLQdcBqNP5u+vTxua0OHdoR/VxTp8778Y9/ZDD8AKpAijGJnoOfgh57uy6FalgAN8Kpa2QzgWI4CRkA+GAjiDDa7+/S0FCRmXmv2dwKUFVfSsrsnJxHKiufKC29LxLpDfNjwVQPjKyuzj148JeRiFeWbf37v5iT0xuegQzoDy3gA6umzQoGG8Lh44JgA10QDMFgzZUr2yKRxTCzsjL3yJEvfT436LJMTk6Srm+J9ZK6wBb7gMbYL6McOpZY97QGB6ELbIVSyIL+oMEpUKA9GCAD9kP075YOByAICyAHboMwHIHkcVMfPFtYHJ2dp39z34B+LdAATkgEI1wAFXLACpnQGi5DFfjgFGhGowXIysqZOXOx318ViQRE0SQIUnr6NEnKWrbs7lWrHiws3JGQMFcUbZoWMhjMQLt2Q/v2nXXkyGu7dz95/vz6Vq1mmc2JUZZ7wGzOTk+/Q9PO19be4vV+YbHcIorZmtas6zLcB1NiMWMv+CALXlDV7iCmpXVs1WqE31/v8VT4/RlW6y/+utpVleXuNttzuu5JSUnPy5sQDLorKvaGw4okZQiCgb+GwdBOFNNUNdiz51Svt+HQoRWqGrnhhilNTe7ly7+02QZWVpZ99tn9waBHFGVRlKKvfGVlxz7//DeSJHbr1vPKlctr1ixPTb3T6Zy4bt2dxcVfybJFFA2iaJAkQ37+h8eOvSXLZrM5/sqVA253vsPhMBicFRWrm5tV+AO8Dq3hLaiIDaoBPgALeGEY+CAPRsMVOAt+cMK5qBIBJMBgGA5vwscAbILX4c4YGe19uj7H51seCh3WNDc44IzBcKuu14EdhkEcrIEiaIQ14AIL2GAn/DBW1ZMNP1PVxGDwQ02rAYPBYExLmxyJuCEZ2sFiqIVloMIJWb5R130mkzkczu3Z8z8Epdu1u6tXr98VFR1paalR1dpevaYJAoJgsNmsWVkj/f7a++4Z/O/hiQKzZ4x79a2lTz337nMvfnjfT/8QDEUuX6kCduw5tuS9lU/+7p1V63dMnTTs2kP+zqb/hOvO6HVcxzfH7L9QPl33R//ij/59l/QfKTD9cMnjA/qdgAtgjkRaBEGSZaskWaE2EjkkCAkWyx2CYGxuPqmqvtTUySZTtsdTrqqhrl3nORxRlp8MmAElmhYCUlOnJCT0hgYICkIbSVq4d+/aJUvu2r37w0mTZvTq1cdsthiNxpCuZ5tMi5KTy8+eNcHFvXtfNZm6i2JA16OWJggvGY1JgjA3Eknu3v2lm29OtNlagkFPMOgJBpPt9t9Mnny0rOyrs2cjqqpo2g9HjOjor16+7M+qqqqq0qfP0FtvXWw0/hqOAbAGnoJBkAA6XAAFFkNr6A6LoBpOAlAAl6BtTOjoa8iEIVG6KE0bfvHiKx7PCUCSbJJki0TqdV3TdUu0azhmDnDAxYaG0y0tRQaDvbT0y0uXVlgsPwQ3VMAOGANm+AS6hMPxgcAaAPQrV1ZrmguiZRJfhUKjDh/eHImEJMlYV1eg6+0FYWmMxTMaBL0IOshQDW2hBBJAAwUOQR+YD7fDWTgFKtjBDAfADULMFSiAI7AdnLAQXADYYTZ0gaQr5WMeevjDqD+amZHy4ZInBvQDTkI/uBVSIB+iWQszXIQWiNKkO2FfOBzcvn2d1+sxGk2TJs0GpanpqN9/UVUDcXED09NnVVScTkpaLElOv/+Yoly+eHF/SclhRQm7XBlDhy4uKdnctu1Cuz29sTHf7T4ZClXW16/XNEWSLKmpczWtwWKZIYrpinI6HN4FZngbojE8O9jBBlZYCxsMBktSUpemptLCwlWiaIpEqltablHVwhhFgARSOPyVx3OXphlstpRgsLGg4Mvk5HSjMS8Q2FldvVhRKq9+fYLBo3V192palslk0zTl6NFVvXt3liQ5EgmvXLk8Pf2m3r1/PnbsB0Zj7pIlc0pLD0ePOn585WefPTBq1FC/3yMIwoYNq9u0+VV6+pyMjAUdO75w9Oh727Y9LAgIAocOvZKf/3GPHnMCAXcg0NjYeGbWrAUNDfU+X5nPlwK/gziwwC9hDnwG0e/yFxAHCbF8twnkGMmuGEvNG2AIeMEFAuTCDDgAP4H34Mcw4Zp1YjI8GwwWaZpHEC4aDPM1LUqJGk3Kd4M+sB82QiLkghdMcB9kQjgmfxCB6bo+T9OqjUYxPX1KU9MxkMEHOjhhHnSAiCzPEQQXnNJ1Z1raqKtBYk2LaFo4KWlAdvZNHk99796jZdl89uwmqzUpO3t0cfHa+LjIXbfN/Psr3vcImRkpH7z1+C0zxk6dNPz1Fx8e3L9bMBQGcnMye3Zv37Vznq4TifxV1uLvbPpP+L5TO13HdXzH6Nur09uvPnL3/c/u3nf8ux7Ld4y/02If9VP/wVanD5c8ff8PMqEC2hcUPHPp0geAxZKhaafD4e2CYAKjKLorKpZGIi1GY4Io2s6e/aih4VzHjrMFYQccAgeMVdXg5cvvh8P18fEDHI4umrZH0w4Lgl2SbquoOD99+q1paZmRiPLVV6ucNvN2r/eAx+OQpEUpKSGo13UNrIJgiVm8IJzRtG2KMqB9+80FBRVNTU6LxWk2O8xmh9lsN5m+Ont26dGjBRUVBkmSRfHP+/a9sHnz5eICSZIkSX7vvReWLXvPbs+E5+A9+BwmQ3uQYyqad0BcLJCZAgvBCbuhFrrGctPF0B+6xNgZowSNfYuK3m9o+AooL3+5ouIDeA7egTh4Cq6y7b4J+dFS1DNn/lBU9KXd/rLJNNdm+5kg5MM8GAv3QGf4CGyK0lMUxYaG4zAAdHgP9sOd0B8eOnu2WFGCXq8KdlX16vo+8EIzpIMTfBCCNNgP6RAHRtgDN8CNAHSBB8EP5bGgaUcohAj4wQbdoDF6H4FYjDBa3jAM6mHzlfKxM2/94J0PVgAVlbWVVZ7YlIowAfrAmRhVlhEWQDIYYRr0NJudLS36unWfNTTUGQzGSCTUvXv3qqrVHs9pSTLrekQULYIgeb27QqFzJlNSt26TystPFhRsEUVJ0xRBECTJWF29s6kpPy6ug9XaRdMi1dUfhkLVgK6HwRgO749E8q3WQWCHLPgxbLrmMX8LlkrSaEkyBgINRUVrc3KmRiIeGK5prT2eu8LhddH9QqFP/f7nYDK4DQbLmTNftG3bExAEu9O5UBCM1dXzA4E9gNe7oq7uQU0bCJjNjp073x40aGBCQqLT6fj004/bt7+zS5e7o+fs0+cXnTvf88UXPz506LP9+z/ctOmFESMm2e0us9mybNnSDh1+n5w8KbpnXNzA7t3f93i0Vavm7dnzzIULa7t3n6PrOgiNjcduvnlBKBQEm9udDA/H9GmboAnGw5NQA+shHlpDMwiQDzKcgGCsLS8e4qA/XITzUArHIAIGmAgt/00JaR4kgsFgmK3rlYqyEqbA17Eaj3RoBybIgWJwgw4fQN1fyx9UwQYQEhIG1tXtaGmpsttflaRdsB6CAAiCkCiKFkVZaTSKdnuPY8d+UVT0TjROLIoGUTQWFr526dIqQdCt1vjjx5clJqbb7RnFxaslyZSZngQ0N3v/kXXvewFRFDu2z+ncsY3FbCo4X5rTKgNonZ02oG/XmTeNnj1z3Feb/4ok5O9s+k+4Hhm9juv4tujbq9P6ZS8tu075BPxXKfv/rkj07+Deu+fc/4O+EIKhJSUfnT37mNEYl5W1yGAIBINfCIIhMbFDUlLbiorPRNGsqsFWraaXlW2rqNgrisa0tKj8tAkUVW1VXv6p318sisa0tB6SdFTTdoER5HA45PN5V6/+tGPbNm++/PJbr7xyyW7/uqkJkAQhy2a7JxjccQ1fyMeRyFPh8A+GDPnJ0KG39+597+efbzx9laSdV7Zvf2PnzplduwYVBXhm48bPDx++tXv3iKZGIuHnnvvZgQPbJ02ar+vNRuNE+ApuhtZQBdslKQHCsTrLq7FMDZpAhXYgQD1UQDs4Ci1giJkMF+F0be2K0tJHa2sPwhswBBzwHAyDp+Es/BoqYS4ohYVvlpfnOxxvyXI/wGAY6nC8I0kXYpnxGTANVsJmRQmEw3kgQlmshCAefOCHmyORhWCANWCHnrGuIx2SIAMCcAbaQxY0QRhuhWvFJpLhAbDHPJgucAM0wxVoABFEkOEduBSLEcrghXdBhuGwFNq/8Kfj46beM2bKM1fKR0ByTDJHgd5wc4zTdHZMjCeKbpJk6thxakpK7w0bPi8sPKWqalJSxpgxc32+Y7W1X6lqUBTNLS1bI5FLOTnzI5Emg8E0ZMhtihLcv/+jSCQoCIbq6j0tLUXt288Lh92iaElImG4y5dXUfOr1ngFdVSsV5YzLdYuqNsVojCbC6/A2AH+ALZK0SNe9JpOzoOCL1q1vsljSNC0Sa8eZ5vf/MRB4JRh8MxB4E26ARFnWLl3a2avXmNzcnsGgTxTtgM020WIZWV//y6amV93uF2E0tANvQ0PZmDHjO3Xq7PV6gkGte/df5uRMiUS8oZA7FGoKh5uzs8eOGrXkxIlte/a8O27c9KysNhcvng2FIh06PB8fPzQ2UTpoBkNChw6/l6S2ly/v6dRpliybi4oOWCzmadPmtrQ0r137ZWJiLzgElbHy0DiIizEnXAArtIIrUAdXIB6ywAs7wBulB4Y4uAhF8FP4OdTBdtBjmf1B8CJ8cs0dbIIfm0xGEHS9RVHWw2OC8HP4MRyGqEJplCKqGMIgQXeIg5fgUOwkx+EtaC0Iusdzzuv12WyvyXJ3h+MjozEXPoAyaBSExHD4vfT0oaFQg8mUnJ29qKJi8/79i/3+cuD06d+Wl29wuUbY7cm7d78zaNBNTU21kYhfkszx8R0GDegRvdLl8up/dO37P4x9B0+VXvpLGP79T9b17N7ebDau/3pvo7sF0DT92IlzbXIyru7/dzb9La47o9dxHf8CZKQnP/fkfYeOnPnZo69812P57nGtP/qNuZ/uvXsOhCEORtbUHGtqOgViWtosiyVB0zyKEmjTZlRu7tiamnWK4rPb83JzF9TXF8qyyWBw5uT0i0ahRHGQIIyqqlplMLgUJdi79yKrtVpVlwuCMRwOrVz56dSJE5741a8kUezYrt27r73m6NJlaX29DB2s1nEJCY+GQp9FIsAL4fDHgvCHiRNnde0KzOne/Xfjx/9xy5Z39u4FHlm9et2pU7f27Jlos5U2NNzz6ad7i4rmd+/uNJmqyksfeODmqqorU6feZjKZJUkWxagEkQ0KYa3LdX9S0jsmUzy8C57Ypy+FdyA5VjtYBgG4BcZCP9h6TUXpCTgNIwKBQrfbDq9BJgRjjcx3wuPwBqTATAjApZaWeqv1CVGM0tRHICKK6WbzVFFcCl8B0BpsoEAuhOAotIfL0AS2WIrZBiVQBELM3TwPfaAEKsEFmeCIMTs2wDT4AK7lXmmEZ8EG/WEFFEMCyCCCG8pjGoxdYBlEE8oV8H6MPDIbZsAJqLtSng0N8FUsnBYtya2BNSDAefg4lrKPokCWjUBmZr9OnWYcOLBTVRWDwZScnDlp0mKbzdfSckrXVVH0t2lzmygaVTVkMJglydi798zk5JxDhz4TRUMk0tip00JZtihKUBTNgMs1MiFhqtu9FQRNO+dyLRBFm64HYrnjHLgF9sB8OCrLcwXBAh6Ppyovb7bdntXYmA9CTEEqD+4IhbYFg1/CNMiCs4ri69FjaKtWXcrLC8vLCyORS5FIia77jMa8uLh7PZ4vYDp0g9MGQ8mIESM6dOh4+vSpI0cOC4Lp/PlPwuEWg8FuMsWbTHFGo8todF26tCEUaszN7Zie3uro0d01lSUOR3Zh4U8qKt6PTZQAoqZFzp17yO0usVoTbTZXQcHKrKSw0xmnqsrGjauSk2/p3v25nJyb4AHYcs0kfwbvQAewwSVohDhoDRFwwg2QDZuhGLxggCvws9jby2PQBlbCZQDawUzYAQ9DHVTCj43GREFwimJyJPIF/F4QJgCCcJMg/DlWWNwCMmgwETzggr4wDFbCCjgIn0I/MMqytaUlYre/LorRFyqj1fobi+UuWA61ul6bljbEak3TdcVoTDYaE7OzF+m6ae/e+SdPPlZVtTM5+bZwuMrvb+rXb6LFYvd43Lqut249sbm5pEe3DtG5cDnsl8urv+8h0oy05Ffe/OL2Hz614K7H3E0tD/5wDpCcFPerJ167/YdP3faDJ7IyU4YP6V1T2/Dgwy/8l5v+zsm/186oUHWdZ/Q6/o/h9h8+JcnSH69TkELUH/3GLKTA4WNnFt71CvQGA6yTZUdKyk0GQ3xDw7ZIpCI7e3BcXJtgsPncueXJyYNcrs4glJV9abVmJSb203WlrGy5ps0ShARdL1PV1fHxmV26zALOn19XV1caH2+/Z/FtN06c6PP7iYUlEYR3P/xw+apV0xMTc8zmilBoZX19X1GsdDqfHjeuTXx8dC9fOAyUNTW9uHdvjd+va9rcnj0FQWgOBj87cSLb5ZrRqVNYVas8no1FRQkpWaNGTY9EwmVl5w8d2ipJ6apaBTNEcXNc3BMm06DoOZub/+j3b4TZUA7boStkwxaIBwtMvCa2dxG+ho7ggWoYCnGCsAcUXe8BT18zhSvhNVGM07RRIMD63NyJZnNSQcESq/Uxo/EvRXih0KeBwBswH7xwFkqgN3SA7THBzxvgMKyCiTAYBNgCu6EfHIe2cB5GQR60wHaIgAM8EJVHmgtxcAWWQyrcBaXwLgyAqQCchc8hBy7CECiCOhBidD8NcBDaQiGMuIZvNYrtUAU2aIJGuBGyIB92Qje4AO1jquXToBVsgxMmkz0lpXNaWg9A05QTJ95v27Z7Xl53k8kCwpEjm5qbSUmZIIp6dfVmXTfKsjsvb5DLlQ40NJSdP3+gU6dFmhYuK/s6EDCGw+dcrtE2W29NCytKfUPDsvj4+3Q94vdvC4cv67oCebGocAT+LMs/AllVt4piTVJS++TkfjU1Bxsbz2taRNcj0CXGArsDGmE8HDIYylTVM3nyjy5ePHrpUr7JZEtO7lVUtMliGWo2D9Q0b3PzW/AjOGixXDQYzCNGDKmqqjx3riA3t0NjoykUanG7LwwY8ERGxl+C0wcP/qa+/oTdntGmTVJdXaWnqa59bm7RZTUxsVtp6VqTKbdjx+ckyREO1505c7eiOMCWnm6oqzvfpU2mJEnNEa2oqLB9+x9nZc2KnrCubte5c79TlIHwY3gH1sINcBI0aIB+cAaGwn7oBW0AKIMdoEIG3AeJf31nd8FqkK+Rod8Jl8FqNGaZzSOCwd3hcFAQ7oV20W/v1X91/XNYCikwCgrhGNx0lVgUjsNlGAlZorhbEMw2229FMcq5FmOxQg+H9wUCT2dkDHM4cisqvg6F6m227k5nF0GQQQgGq2pqNiYnLwqFipubt/XuPTY5OevgwQ0eT1O3bj8qLV2bECd9vfqFv13WXK6/5cr4t4Ku67V1jakpif/zrtfgjvu/Lc/on1/97nhGv6sLX8d1/He4lvKpuqbh/9nGpmsjo9/4JP37dN22/llBOAzNIBkMPaqqPgsEygTBkJKSV1y8qabmlNFo07RwS8vpysotoihLkiUYjJSWfqIovtatZ6rq+5qWLwitJWmyx+MuLFyjaUqHDjc6nQmelmab1QrYrFab9S/Qdb3g/PmOnbstr68/6/cnGQyL0tL2qarFYIi3/Eee12Y02ozGsKpebo74gsHb+vY1StKVpqalp04tyswMKoqu6+fr61eeO3dvdnaCp6G6+kpBwZHTp/c/+eQfpk0bCXGyfDIh4U9GY49Yf1TA4bjD5bpXEFbCTugHrcELAuTBlJhsjxqjc18AZVAH48EOF3S9XhTHiWIN/ACaAXgbXjKbZ+m6DxT4smvXRT16/KRDh4X9+z8TDP4uGHwXCAT+FAi8Aw/AaJgKYyAO+oAdpsY63IH+cDccgOWwCvbDwFjL/GWYAnkAOGEapEJNrBb2HogDIBt+ADr8Dl6DcTFPlFgJqQd0kGBgjBE9mtuNEj9dhBRof03xaNTagQ+qoQtkwgo4BDugM8SDAhJ0hET4DNZDEUy0WDpXV58vLt4iCJIgCLquKkpw+/alTU11ZrNVEESDwS7LckXFaklKa9fuNafz1uPHV1VVnTMarX5/k8Fg0XW1uHhVKJSanPxqcvIrXu/ppqbNomjU9TDIuq56PKsikUZBsESVe2A1NEEABDCo6kpJqpcklyRZq6p2NjScjosbBTaDYbEgVMHSWOWlE/ZK0sWUlHGybCgpOVlcfGLs2HkeT6PTmdmz5zxdP+3zrdO0aHDxhMlUOHToAp+vsanJffbs6WnT5jc21hmNjjZtJrRqNXL//l+dO/e+pkV27PhBXd2xzp3nB4Nur7dZj/jnT5vW3NJiNDqt1rTOne+QJP/Jk3NbWk7k5y9SlERZngjNXm9tv055Q3r2bPZ6L1++1LnzY1c9USA5eUS/fu+5XNVwN2yAcTHZrQD0Ay/okA822AaFEIYMmBajdgr9zQKQBKIsC7ADfDEO2jRZTjSbR4VCB1S1SBBKdf1rcIELnOAEBzTBRlBhMJyBfFgEq+B0TB4sHpKhDXwlyx5RtLe03BwOb7i2aSwU+szvf0rXA05n29LSL+12R+vWbazWqsrK5ZFIkyRZQ6EKozElEqkIhQ7a7XFxcUk7dixNSso1meIvX94cCAR0/b/u1/n3SNn/HQiC8M96onzPI6OigH7drtv/NXvoR7MXzp109/3PvvDqJ06b5Tsfz///VlFZk52RfNUqKmu+8amyMpK3rXtuYL8WkCQp3WqdWFu71mCIi0QC/frNq6vLLy/fr+t6t263yrJWUvKpKBolyW61Drh0aanfXw262VytaXvApOv4fNrJk58EAg2iaG6dM+Q3zzzz6ZdfXl1QLpaUzL7ttpS0rJdeevOxx57d5vUe83ptogiokcjCZcvO1f6HY/1Ffv69a9eOSbGHVDUYiZyqqlpbUPCznJw7s7J+nZ39+cmT+8vK/tix44zU1Le6dJFP7ayouPjii0v69x9855333XffnYrS6PevEIT/aJESxfhQ6Liu22Op8BrYD2PhBOyNpZ4lEKEevoAcyIBKOAM18LyqFoFZknJgIfwWlprNt0hSGlhgZ79+j7drNy86+MzMUSNHvmMw7PB67wqFdsCvoScAAegG98A+uAIB6A/AXtChDTwUu+JgsEIJCNAfkmLMqVHrCEZQoBNoUA9fQhHIkA71IP8Ns30yOCEFTsJl8ML9MAj2QRmcgZshB/4MpbHZkCEfPgcr5MEpyIbBcBB6QTJcADuUgQcyoSdcgC7gEgRTRsbiYFA8efLDUMgjy8Zhwyb17Dl4587l588fi0TCBkPcpUsf22x98/KeF0VzcvLMdu1eLS4+e/bsZkUJyrK1qOhL6JWc/AdRtJjNfVNT39M0W339Z5oWkCSH17tO161m8826HgQLzIEkWA71IKnqeoPB7HLdrGn+cLi5ubk8Le12VfUKgkMQnAbDAkmKh4+jPTRGY01Ozu2K4jUYzCUlJ8aNmyfLBlVVjEab3Z7eu/diu131+zeA2eksHjp0IaCqSkFBwbRpCyRJ9nhajEYHkJTUrXPn+RcufLZhw/Rw2N21622RiDcUalaDzTeNG1fb0FBWWQnouiYIUps2UzMzBxcU3K/rbWR5vKaValpZn/Zp/bp0OXXhQtHlK+Gweo3I7V9gsWSYTMlQCePBAlvACz2hOUYoa4a7YBEchyNgAC/YwQrPXFPNCeyAV6CN3d7BahVhNdSCAYKy3CoY3KpppbquxcfPluUTuj4fSmIHntf1O6FVjOO2GB6G4fAktMBO8IMH4mBdcnKeqoYMhk4Wy01+/wt+/1PRUwSDbwcCb8Nwo9F1+fK6pKTWkYg/Pj557NiZ3bt3q6j4vLn5eDBYYzS2amnZPGrUrHA4eOLE9ry8geFwQJIMwWDE5bohM8P5X65pcQ7blfKqlmbPd75Q/5+yb99N/x0O/npk9Dr+jyIvNws4euKcx+f/H3f+N8PfFol+SxX7KHHPwH4ddD1gNHZ2OOa43YcikaDTmTpgwMJgsEEQ1LrdLwAA+R5JREFUBEUJdO48PT4+y+cr07Sg3d4nIeGmyspNgNM5zOGwaVq+roeTk6eLYubJk59KkkFRQn36zH37g4//+Kc/AWs2brzjvvsmT5n+i188BgwdOvLll98qczg3u90CDM/KauN03rN69bbiYuBP+/e/fuDAlMzMHKsVqGhpOXn58p86d56SnAz0dble69Spj9NpFkVAgMfatp1ms+7Z8xfa0cmTpz/77OOyfLKh4S/ChppWV1d3azDohsfhl3AJjsIcmAA/hlpYEWN6Pw1LoReMgSkggBeehw7wpKala9oJUewAm63WBZKUEg7vNBgEq9XodOZdO6tWa6ogSJpmAy0W+yRGUS5CBVwCCwTgEETLGd3wMiRDdyiHY5AEi+AEbI+Ve4pwHtbBQLgJ1sHX8Dk4YCt8CIdhDoyF92Bn7Lot8BwoMB9agRt+CFkwAuZBPcyEHBgDE2B5zGvZC5shDzToDePgZCxj5oJTIMFUaA35MQEnEU7BWlE0AsnJU2223qdPf240moCOHXtNmHBLQcFBRQl7vaUJCTe2avXLqzPmcPTu1OnPHo+9sbE8HPZI0tiEhF9f3SpJCcnJfzSZRjY1bdL1iK7bzeZJEIk5o8AYGAWbwWAyWRyOSboe1nWf19uQknKrrmvB4EVdJ+qAStJ4WZ4MNTabLytrrqoG/f4LZrNlxIiZkiTv37/e6cy7cuVQMNikquF27SakpOTExzt6974xEgkePrxaFKWbbpqnKOH167+w2/teuLCisnI/YLOldehwSyTiycmZ7PNVFxauEYRI767dyquqln31VeucBZJkKSh4x+crB5zONqCL4gBVPSvLOywWW3Zq6oH8/ENnL/Xp82bHjr84e/axkpJ3rs6ArmsnT/64ru4saDFPtCPo4IPTkASZcAeYoDM8CCqshTpwQR/oB+/DMgC+gs9hKtQbDAmpqVMTEwfCRsiHJl33a9qV9PSZmhaSpMSEhPkWi0vXF+v617BV1++HtmCJcpnBL2OqpK3gaegAG8ENocTEzPj4Lqrql6QkWW5rt9+uqvktLfMCgT8Fg5/CFGjUdT0lpXWbNoM8ntqEhGSga9f+48ff3NKyPxJpCIfPjhs31+NpVJRIWtrgpKTWTU1VimJ1Om/0+Y5OnTTyv1vTXA47/15d9t8e3+/I6Hd58eu4jv8elVX1G5a/tGHZS3fd/9td+078zwf8u+C/a1f6lv4oMG3KaJ9vcyCwU5azbLaJXm/jqVOrBEHq33+eKBrOn9/Q1HS5VavBrVsPDQZL/f5zRmNmWtoPBUEOBi9aLF0TErpqWhBISBjnco1oaChSlJDLlTlgwOKtuw4vvOee519++aGHHl648M6rV2zbtsOrr75r79ZTFISIqo7MzJyYk/PY1q2/2bJlbUHB3JycHKtVA0EQGqqqXu7UKc9iaYpEmhWlWVHskvTrvLz9TU0b6uoiuq7o+uLMzM5H9v7y4XsVJRKJRLp16zl//mxJutTS8kokcqa2doGi5MFPwApZ8Aj0g2iJahr8DJLgEzgI22FsLGAJDIVucLU07Qe6PknTzsLIQGBVMLjebFa6dFkSHz9h+/bFlZVRRRmamy9u2XKrz9fRYHhZkm6Ax2N6nsBO+B3kgAIXYDUkgwqX4BXoCDNhIrQDHeZCDkRlvleBF47DPrgJhkBHuAUuQFdIgf5ggo6QDd3gVtgF78IV+AO0gllwAES4DxwAfA0HYAEkxYbXExbAcfgU9kMXcMSqFzrBEDgBApyBJJgIRugDI6EImkGEXoLgaG4+7PWeVlWfzdYlJWWarmtnzx4NBHxxccnTp9+hKGFJSkpMnKjriq5HYhaWJHti4hS/PxIKqUZjF10P6fpfJZdNpm5ggnijcYSm1QWDS2EkfAQFAHSGIbJss9lGKEptc/OXuh5xuUZqWri+flUwmKXr/cLhNzXtHAiimAdyfHw/VfVXVq40GhWnM9Fmc+zZs1qW244e/b4oJubnfxEINBgMFsBgsMiy6ejR1bm5mWazJRQKfvXVCqdzRK9eTwwZ8m5zc+XFi2tUNRgOt0iSURC0CxdW9OvXKxKJWM2mlZs2de364w4dFvbt+3j79gsuXPiivv5EONwCBl2v1/UdU6bMCAR8pZWVp0uae/V6zeXqlp5+Q9++f66r23Ps2A/CYXck0nzo0Hy3+5IgjAAr7IhRL0X72aNaBtHAfBBCYIH50BVOxPTGWsFEOAKPw2qYAE5oMhgSAKezd3r6HEk6AyFRrMzOXhwMVkiSA0RdVxyOsS7XDfBbXX8SOkAvqAYrPBKL2auxh2QR3A3NqalZGRmjamsPCYI1EinV9TBYLJbZBkNOKLQCJkIITqant2/dut/Zs+tdrs5bt64oKSmIRMJJSenTp9+uKN5Ro25sbq47cmRzQkJ2RkbmiRM7PJ56u32ww374zkVdp9846n9c1v7tU/b/OK47o9dxHf96RKUmMtKTNix7adnqbS++9tl3PaL/P/D3G+e/dXw0GToFg0U+31pBsOi6pijikSOfeL31smxq1aptQcGy5ubLkmQym+Obmzd5vUdF0QJic3O+271KlhNlOb68/PVg8LLd3iMubkRV1Zni4t2ybOzRY2ZltTshITEnJ+8/XVSSJK/Xm9eu69eXLl1qaWntcCzo3HlHScltublJRmOLonxeVjbWbD7S1FQfDscZDHEGg0uWXbLslOUCr3drQ8P2hgaDIMiC8GlV1dMXLwpNblk2GAyGN9985aOP3na5nOFwUX39g7o+A26GlphITxgWxyjuARlug05wFG6KSchEK+006ALx8EsIQxi6gADHdL2drqvZ2XeZTGnZ2Xfn5v7i0KFfFxV9Wl19YOfOuxTlJln+NSDLP5DlX8Cr8DWsho+gB8RBDWyHbEiHZlgCw2BcbG76wRR4C0JggNnQEVbAJZgPeeCDXbAZBoEzdlQ70GJqjfEwB0zwBoyBERCEQ9cs7I2wPaZuf7VClNiQrkAXsEEleCAR1sJR+COMjRWeRickAJlwE4TBCOh6nqI4Gxo2tbQckSSrpoXj4xNKSwv27v1K01STyRwK+VVVKSi4rbl5vyAYYmasrv6spORFWU63WHo1NPzK4/lcEP4jVd3S8nF9/a90vZMgOHXdGwyu1LTRcBf8BPbFxC1DgmDTNH9LyyqHo5+mBQXBWFf3ZSTSB34Ni+BnirJZVaM7h0XRXF6+NC2tldFosVjsX3/9cXz8kP79nxIEqU+fR9u3vy0/f2lV1YlgsMnhSNq16/127fJcrji73bFmzafp6bO6dPkx4HJ1GDbsQ5st78yZD8Nhj9mclJ//zuDBo+LiEh0223vLlvXv/3SbNtP+cofazRs8+MW6upP19SfBJIrrZsyYrSgRoyyfKPL36vW6zZYT3dPhaDdgwEc2W87Bg7MPHZofCIiCME/XPRCC9tAfasAOIZCgPlYVar6Gvyz68FyM6TuYYQw0wGRIgo0woLLy05aW44DZnJWWdrMgSKmpUz2egtrajao6or7+jXC4FDCZOlitvSEDesFmqAA/PA1XYvUt0RKXk/BnkBMTe5eWrm5qssIbweC5YHAdBARB1vUgJIFste6DuLi4rBMnvjCbcwcOfLF790f2799+6tQBg8HY0uI2GIyqqhw9erJDhw4pKXn79y/VtL4gJsRX3jCu1X13z/5HlrV/jy77fwmuO6PXcR3/i8hIT/r9k/ddLq/52aN/+q7H8r+If5DT/tv4o5npKRCEKeGwLxDYoSiBjh1vcjhaHznyqSwbrFZnnz6Tzp9fryh+RfG1br0gHC5yu9eLolGShkQijrq6jyXJrmndamu/9HrPiKLJ4WhVXX3x3LlNsmwWBEGW2zz00D1XM+lAaWnxbbfNjotLe+yxt8ZMv2N5UVFpS4tNlnUwi2KZ37/08uVJBsMTcXEPOp0/LSxcWVNz9dgPKyp+Wlg43OFQdB148dKld69cmZWc7FdVVVUff/zh3bu3zJ8zRyCiaectFgtsBU+s/SIq0nMYPoEGeA0UWAKX4QZYE4tiRkVERdgBx2Ik3rvg5zAGHoUmTUssKFjS1HRQUVri44d16fJGcfHGAwceE8XfSNLNut4MzdAiScMNhncF4RhsgMGQCpXQFGsJqgYfpEOHv+4cagWJ8DZUggkaIREaoQFscDQmsHTtQh1twyqDSrDCOSgADb6GcjBDAhTBC9AMCZAIO2DDNUWiIfgUqgCQoAhawAFroRleg87wKNwIO8EIxhj55QXwgAxHwAutILmlJb+2dqWiNBuNptmzF9rt1rVrP6qsLFNV1WLp7nSOLin5VXX1h395yMtfqap6Lz5+UiRSJ4qWuLj5Hs/ntbUPRIOjTU2vNTe/DfOgRRAsgcAHuj4Hoh5Jf/gtNMEaCEpSvNv9vtM5xGBIF0VLY+MaVb0B7o1N0Qj4k6rWKsoqUTTV1GzMze3Vtu2gUMjX2FiVnT2jR4+fXp3Ndu3mDhnyUkXFyUgkUFNT1K9f/z59Bvp8Xq833Lr1Hbm5cxTFHzVNC3fp8rO2bRdXVBzyeC6PGjUlN7dDdfWVYFgeNerPaWlDNC2sadEgvpqS0m/cuC8EQbZYtBtuuMlisZ06cUQXbBkZUwwG51XloahlZNwkywmRiFMQbtT1AkHYDpnQNcb3GX0qEqAZ/gCl1zwMy+AkSFbrTFFshJ0xtt0wOGEtDIIH4cmGhvy6uq9Bi0QaJMkRCJTV1++Ex+FuXb+nuXmdz7cXUJQ6SIKvY0HQaLL+Sbj6pd4ML0MvSZIqK7d6vdmC8DK0E4QPFKWnz/eholzUtBpIgtV+/wSor64ucDp79uv3LJCVNX7EiPcqK32bNn3Z2FgXH5+6bdvSObPHlJSUyJL7zkXjIpHCNq07/ObhEf+gJxrF9ZR9FN9rZ1SoLt76XV7/Oq7jH8biHz4ty9Ifn3ngux7Ivx7/LJPoN6Z86tD7IRgMIpwRhFN9+94nSXJd3bni4q+7dx+Tm9ursbHi4MHVmmbIy7tb05SKitXhcBMMFcWOqnpYVXfDTeCBnS7XAFW93LbtLSUlqyGgaVpCQg9RNFy6tPGuu+69+eZbDx7c+/TTj06efOusWXcLArrO0aO7Xn/9iX7JSfsrK+fn5Hxy6dLDLtdNVmt0bIdDoSeamialpd3XqtUfL11aV1NzY0JCjtm8taUlXpaPNjfPSElJNhg+qa7WXXGSKMyaPt1oNC5buTIQzPX7z7hcWdXVF+B+6AbAKlgNo6ADVMBOSIB5IMJlWAXJcCPosA6qYSKUQSf4FO6CkQBo8Bbkm0wJvXp9Bly69FJ19UboJgiNBsPvBSE1NrV6JPILTauI+cFV0AQjYAe4oAlmwjk4CbNiFXg++BjsMAH2Qhm0gluhDD4HFyRAd9gP1TAgpudZAEWQB/2gCE5ALzgDmVACY6AQBsNhqIGbYTt0hiNghFmgwieQDglwGNJi/TEF0BkejwY+Y9gNr8MUAHZAJWTH5J2ifE81kA5VskzbtlmjR08ETp8+sWfPNkEQkpLukKS4SKTK7V5ps3WR5YSmpt0u10xZTnG737PbJxoM2RBpbl6l64rR2NPv3wbTIBHWiaJP0+bDkL95hN+BvZJkcjqHmky5oVCJ270b7odesVcLYv/q8CGs79x5TFZW1+rqC/n5G9LShvTp84gsW3SdGAORDpSWrj5z5vWRI8e3bduhsPDMwYN7IhElL+/Wjh1/+J8uX1Dwp0uXNvXp06Vr175HjuyurCwLhZJCobJ+/Z5MTx92dTdd1w4c+Flt7ZVOnRIHDx6xatUXLpOxwZfg9ZbExXXr3v0PgiBF92xsPHL69K9VNUUQMsCh60ft9hyvV4UIlEE8JEIN2CAbSqAMpsIQ+ASKYAKssdvvEQRHMPh1JHIe+sMJcMDwWFof8MDrBsMFqzVXUdw+Xx08EssPAKXwkskkRiL1mpYCZsiFtTA6FpHNh/6QCcthCPjM5vJgsI8gPHbt5Oj6Ovi9KMZpmg6DwS6KK3NypnfseNc19wWgqOjDkpIvTCbTlMmTFEVZuWr14AHd33/zycPHzgD9+3T9m/v+D6HZ422VlfbNjv03wNibxnzLM2xd851xfV6PjF7H9wbvv/mbrp1yb73jNz5/8Lsey78S34DT/u+ohv59bF//64H9zkMNdNN1/ciRV+vqClJSuiYmdjx7dtfZs7sTEjKHDZutaf6qqo2K4klPv0GWzaqar2mXJamrKHaBILSCKc3NZyIRvyBIeXkzjcYUv9+tquH4+M7t28997713f//7px977Be33fazWbPuBnQdoG/fEU888XaJJgOby8tfSki46okC/U2mJUlJx2pr5506tbm2dl5KSqbJ1KKqxX7/aY/n9vR0lyRdCQZ9mmazWm6dPRs4mZ9fXlERCFzRda1t2wl5eUPhj7Ad3oNNcCNEGbOjKWYTRGnCWsHtEIYv4D1oghvAAGdhJfwi5okCIVgME0Kh6paWExcuPFpdfRjehD/qevdweL6mHQN0vSYcnqtpfvgFPARWcMMcyIPpEIFxkA3jYTR8BkehGt6CNLgRjDAaeoAVTJAMvSALeoIIQ6E97IIKOAEl0BM02Af5MAA0ECEFusDO2KreH3LhY5DADMPABO/Ax+CEdFBAiPUtRSAMff6GHqgHJMEKWAUV0BfCIEN76ANFoIIMgxTFUFNTdeHCuUDA365dx4UL79F1PRKp0nVFllOSk38QDjc0Nx+Ij18oSXF+/wFVbQmHizWtUdc1p3OqydTW798B8yEFjglCjaZFXd6/hQF0h2OAyZQbCJz1eneADC/AGbDGusfMYIYvYavJZElP73jlSv7589ttNofHU7d163y3+5wkGSXJJEkmSTIXFr5XUPCeKNoSEhLz848fO3agffsOTueYsrKv9u27OxRquHrtU6eevXTpa0Fw2myOPXs2VVRcyspqLcuJLtfIgwd/WVj4F6L7cLh569b5dXW1gmBJTk5duvSj7Pg4i8lkMLjatLnd7684dOhWj+c8UF6+8uTJh1S1J/jAAttSU6eEw1WgQymMBh8kgD/WwpULPWEjvADFMA4aBUEWBAdgNk80m8fAPjDCJJgJf4ncgw73RiLTm5vPBgIueBJagS+2QyI8EwqN0rQgaNA9VqUaBiAJhkIxrBDFIWAThCvBoEMQZseenDCEICgI4+AOTXPDcLALwnZBcLjd5xQlKMs2WbZetUjEC/Lo0aPCkcjKVauSk3MHD+gB9O/T9Rt7ovw/n7L/XkdGrzuj1/F9woM/mrNw7qS77n/234Z89BurK/GNUvaZGSkfLvnNwH7VUAySyzWtuHjrlSv7DAZT69bdq6qKjh5dbzSaNU0xGJTy8uWK4hNFs8HQWlG+1LQSSRoKm+AkJMDwcDhQVPRFJOLJzh4fH9+hru5EQ0O+yZTQpctdu3bt7Natf8+eg8LhUDj8H/5NZmZOWlqWIAgOaCXL/2l4EiAIDaHQ/NTUOEmqDYe/qKublJhoEARREIoCgeV1dXfn5qZ6vZevXDl05Mjx48dffvrpeTOHRSL+SCSQnt6ze/e5svwFFMFMSL2m8cIKI+EwlIAKUepKFeJgNGhwCFJAAus1I4o6N01gKCj4SWNjDSyJxTUfgrsikQdUdXU4vFDX28G9sZ76W2EybAAgEebEwplh6A5z4DB8Cn1gEARj1gXS4CN4D4zQGkKxv/QdYTScgiroASbwQj0MAOAKKFAHZugMTbAndsI8qIIzoEBXiAcr5EJTrB+oE7TASbDBm/AcXK3gLIWFsYLRCAwAD5SDGxogCcaCCuEob2urVh1279569OgBs9kiRsm81ONu93JN8wiCJAgmgyFNECw+355I5DwgCCG3+9NIpFwQzIIQFcC0wS5RvBDtkYLfwbq/fkBehT1gFgSz33+qpWVXdvYwcMFgeBK+vGbP12EFDJJlU11d8fnzOydOvMXn86Smjrda2+3e/aPS0lXR/U6ceL6oaFla2lxV9bjdDSdPHp49e15VVaUk2ZOSFodC6s6dc+vqDgPHjv2qomK32bxA15uam92NjXWzZi1obm6SZYfd3i01df6FC0v37LnP6y3funW+32+S5cm67i4sPNsuPW1It24tPp/B4JIkc6tWc0ym1CNH7igr+/jChRdgIKSDVxCOJSffIoo2VW2CKhgL9RCGU9ACp2NaSvHQC+pgHNTBUaPR4fW+oijnAYOhq9HYF3Q4AMG/YQ89B5qm5cOaGP3Z1R0qYRno0A+OQiVkwYGYLqgRrJCsacmwR5ZFozFb12/X9TWxQg4TmHX9LfgMJEiENSZTusmUFwgo27fPqanZf/XenDjxTHX1bk0L2W22devWpaW1j4/P6NGt/d9ZuP5x/L+csv9+O6NCLLdx3a7b98LmzBz31CN333X/by+WXPnOB/NtrKKytqKyNjsj5ducJDsjpaKy9p896qMlT8+cagFZFE0JCfOqqgpUVYlEAqNHL4pEgocOrQXatRuXnJx3+fJnBoND14Nm8zRF2aJp+QC4YC8YdV3x+12FhR/7fOWCIKek5JWXb6+tPSpJZl3n/Pmmxx+/u7LyUpT0B6iuvvzzn98aDDQYjUaLICyurz8RDl9djI6Hw4vq6pJMJr+uRzStKBj8sr7+9vT0H2dlPZ2bu7a+fkdT0++6dbs5O/ulnj21I0eKLl58649/7Ner122zZ//mJw8dPvxGZeVxpzPT4UgXxRBsA/2vGy+2Qh2UgwTH4T1IjGWld0MKPA/T4XHYd80i+RKch9/CU+D9a49nFvxcUV6C7jA31gsVLbYbCX3hXSgHERJgJfjBCDXQGKvs1GJhvGhLShFcgkiMWtwU+0uvwEHIhjgIwGkwgAskOAEJYIFyKAM51uq0GepAhVxww1FQQARDzLNpDyIEIT82D0PgOCyGCtgC90MCxIMAadAEJ2PB3f1wCUygxLqsPEajcerURZWVFWvXfhkKhURR7tVrXkJCfH39x6FQsa6HRdHp9W5WlNKMjJtBj48fExc3oqVlVSBwWNOaBMECWwWh1Gq9VdfDkAk3wJfwEhDj+T8OEyCkaT6//3D37reFQh6wQGeYCV/AIxCB38M2uBk8BoO5sHDbpEmzRVEUBEmSzElJwzIyZubn/+nUqRcOH/7NlStb0tPn6boiCMKhQ3tuueVWu93u9/tE0QG4XFPM5p6HD/94587ZNTX5ZvPCKJmU2103a9b8pqZGt7tBEEy6rhmNyenpi4NBZceO2xUlU5Zv0LQyXW/slJE2omfP0yUlFXV1Pl9ZMFitqsGkpCE5OQuKi9+C4ZANxyGQkjJDFE11dUtV1Q/DoRqOgQB20GE8VMbqg0NgAg8chH42W2qbNuMCgfWh0B5A0+qhHYThR9cwPABPwXlQ4EY4C/fCpdimHfAbyAEjnIRqSId4mAs+OBojFk2CDXFxwxTFLcttzeZZ8IauPxrtitP152A1dIVEWOpwjFbVJllOdjqnWCxDDh36+fnz7wNHjjxaXb0nN3eS1Wpdtnx5cnJe164TWlr+6UXsf7Qr5dXf+SL//7N9e2f0Oxz89cjodXz/0LdXp43LXrrz+0z5FA2Ifhudz6v4Zvn63z1x/wM/mKEodbKckpCwqLk5GA4HBEEcMGBGfHwaCIoSzM0d3bbt2Obm07oelKS2Fss8TSsAAfKgBxwERZYn6Hr/Cxe+kCSjooT79Vvg8Zy/dGm9JBlNpq5eb9YTT9xz5MhOYO/erx95ZHFaWuLokSONRmM3g6GPwXBfQ8OGQAD43Oe7v6Ghv93e22qVoFFRNrvdz+TmzklJAbrabK+2b9/LbnfEgqk/69BhfkrKxzG+/XEjRiz54x8D/nPnzq0RBNFg6CDLNlgG0RyrH5ZDHXQBYDtshqGggwhbYAA8AhaYCT+Ht2EluCHKgvkcZEF7eApOwdWq5XfhD3AHVMLvIRiTnxHhQ9gOs+AgrI7xicbB17APpsEsSIZPoBIABdaAB2bCLRAHa2ODb4B1kAs3wHQIQyK4QIA90AacIEJvUOE8SNAFWsHOWBf2GLDAbtBAgtPQHQxggEPQGQSQwBRrn18Mz0Br6AihWBnAKbgFBkJvuBtq4QRo0AFy4JzRaLLZnFOmLDSZHCtXfibLZqB9+wnt2o10u1fpeljTApIUyM5erGkRQZAEQbbZuicnzw0Ejqlqk66rkuS32xfHfHoTpMJMKIGfwH1QBjeABKFg8FjnzrfKsjkS8YIVVEiDhVAD8+EYTAcjNCqKb8yYaXZ73OnThwVB9vlKdV2xWlvn5NxdWXmwpiYajDQ0Nh4ymUzz5i0yGAzLly8NBoONjV8Eg+d1PWyz9YmPn+H3N5hMc3S9ORRaB+rgwaOrqyvWrduoqkogsK++fo2mhUTR6HD0VZSgJI1Q1QJB2GowmDtmZ+8/c+bkxYuarlutcWVln3i9RaJojM15KuyBCEiiaKmrW64orUGCJjgMLkiCdmCCFJga6x5rARfsgNnQaDbHJyZ27tp1oSheDARWaloTOGE09IQnYSUE4H6j0Q0jQQMXTAYb/AS2w0Z4CTpAGMxQDVNj70sumA3pcBB8UOl0DjEYUnVdF4QEScqxWu+UpCJdv1XXn4DNMAbc4LbbB8tyhqLUynIyYLH0SEiYX1T05ZYt0xsajnXrdpvHc9nn88XFdc3I6NJQf+SWab2/TXb+v8T/gyn773dk9Lu8+HVcxzdFRnrSxmUvfbl62wvfQ8qnb5Oa/y8R9Uf/WZf0vrtnv/ni6KamZboesVi6NTW1bNq0pLm5ulu30bJsOHr0z7W1Z1JTu+bljVHVwnB4tyBYLZZ5gmCA42CFMSDpekiS+sry1Jqao4oSstkS+/VbJAhBQRB1PWSzjTSbx77yyiPLli15662nhwwaOHbUKJPJZDaZwrrex2icZrE819T0ckvLGy0tU+PielmtBkEwiGJJKPRa+/Y97Xa3ojQpSpOiSPBETs6Rqqot1dWKpqm6Pic7e3Rd3YO//GUoFAqGQnmtW08dP97vq4xEAqDabNOMxrawCgpgKVhgHIhwFo7A8Jg/1wDTYCEEIABB6AO/hWJ4FPrCfRABD3hAhIegA8yBn8Iq+BW0h56QCr+JxTVfglK4DTJhETghC8LwORTDLdAagDHQD1ZAAXwKJpgONhBhHHSFr+ASfAW9Y7LsBpgIKVALVdAbOoA/RpXf6RrG0FbQF+pABA36QGeohSboA3HQCBoMhv4wAeLhDABdY2pMraEUKsAATbAI2seqA1PgTkiPyYrWQc6lS0WVlZeCQX+/fiMHDRqn65rbfUnTlNTULgMG3KNp9QaDnpIyRdfD9fXbRNHo9R7TtKDBkJCWdruue2RZslgma5ovEFgLIhyCJtBgNJjBACMhGA14d+0632CwFxdv8PvLZbkMNoIPDDAdPHAjyLBJlps6dOielJS+c+d6JdDkciW53ZtrajaBLklmUTRZre0MBntt7WqbTXE4nIIgrF69IikpUxAkh2N0U9M6n++YIBg1zScILtBDoZV2e1uDwSiK+rp1K0aO7Of3+wcOXOByydXVHwaDZYrSAiZNq9K0rd26TdW1yNlLl/KLi2cMHy4IYlraoDZtptXWbqut3R6JNNts2XAIDNBVlp21tZ+oamtwgQXOgQRO6A91EBd7kRgOuXAJWmAaGKHaYLDpumoyJXTpsiA+3qFpLbFet85wI3wJ94AWDo+CCnDFJL76wTD4E7wF3SAZGkCCG+FijP/BAxEYDrMg5HL1s1o7NTcfEUVrJHJU1wMgmM0zDIYM2A0joBqK7PbhRmOex7MGwo2NH/n9xwBZTktImBMI1HbpsqC6+pjbfSora9zw4W80Nxvq60v/qd75fxz/r6Xsrzuj13Ed3wEy0pOef/K+y+U1P/1eUT79yz3RKL5ZS1P/Pl03rXzEbt0uimZNU+Li+uze/XlFRaHBYOrV66aios2XL++XZZPJlA7F4fB2QTCCCGFYASFIj0Te0LRzothelm9oaqoqLNwCeufON5hM5lDodCRSZjDkxsf/cM2aj6ZNndq5U6dwOLx1+3ZZknaHQhcVJVOS7rHbl/l8tyYmtjYa/Zr2ZWNjF4vltNdbH4nEy3K8LMfJcpwsu2S5IhxeVVe3paZGFkVJEJZeufLUuXO0tES925fffvuzFSuS4l0mk11VqzTNa7GMstluhj3QGnqDAuegBcZBElyB8+CH+lht6NXel2LIh7awD7yxersoY1Q1rIcsOAO3QhIsATM0wGh4Fh4DHe64hhn0Rmgd+7s+G+JBi1Gc9oHxsBNSYfxf35x+MBD2QB/oFYsXXnUj0sEArSD/gR/0+Py9n2dnVoAP2kE97IVGcIEVQnAAIpALcZAFLiiGUrDExEgtkADVcAj8IIALLoIHABmqwRurGYhaBAqhO+yFHDAbDLlbtiwvKSkwmSyapjmdiefPbygu3i4IosnkEEXJbu+g65HKyhVOp9VotEQiBQ0NazUtLIomXVdluQ2ogcDquLhkQTBLkgxfQxOYIRJrZtoNHQRBFEWpsPBLg0E1GIwOxwCLxQZLY+KrgAnWWywJomi1Wu0bNnxmkbU2mZkmk23o0MVmc/Dy5Q+DwRpVDRgMSVVVHyckpDocqXa7Y9myL1JSsjIyWomizWzumpAwPxA429S0LhKpFwRnMPiO3T5QklxOp+vTT/98w8QJyUlJsmySZUP37je2bdu/tnZZJNIoCDZdX9unz9xIJGAyGE4WFS2cMMEbCBgM0bx/244dF4dCFW73MZ/PDUaYDF5NCypKB+gBDTGSLxf0gdNQJsvxsAKqQYKeEAdDwAVr4uJG1tU1XriwPBLxiKKcmTkYNFgVox1NhXEQhLFwSpbPgxM+gVKQoDW0hjTIhKPggTwoglMAtMDSWFmLBILF0qm+frnVqtvtrUSxMBRapeveaLkOxIMbCsElScnNzZ9lZ+c5nQmjR98SiRxqadmo64qi1BkMVre7qKXlbFJSVr9+TwDduz+Ymnb37fc+808tXP8s/h8hxv++O6P6dbtu31PLSE/84M1HFUX56aOvfOeD+UesvLImKyP5f+/8WRnJ5ZU1/9QhmRnJ77/xk47tClU1mJLSPzt78pEj6yXJoKrKoEHz6+rONDVdVlVfVtYio1EJBD4BE7SHvrAMTDBMUTao6iEwiqKloaE2P3+1riNJps6d27S0LAuHL4qiDcS4uDhFVVevXWuW5Xeef/72H/5wdSBQqCg2QRDALIqNqvpFY2Mfu/2lnJzfZGU9WlLy6TW0oyvr6394/vzA+PjqUAh49eLFNy5enJKcfKW6OhKJ/OyJJ3bs3Tt/2jRN18DWsWOix7MkEjkvy5kgQmsIwA7oAE/DBTgEZfAw/ApOwGMxpVDgc1gCP4CfQl/4KRyPbdoMv4LBMA1mw5fwCTwB02EinIy5Ef9JMh6QQIV6WANhEGOFUqdgMwwBN6yMNS9HsRtOwGwogXWxXHk0zLkBmuBm2DV7Ztv77r6lT8+Ozz9998B+GtSCCn0hH8pBgzgIww6oj50kHyqhB/QD8RrO0SxohmOgQkusC9sAk2AkrIatIABwBd6A7jATnHAKSuz2tE6dZp84cWj//s3hcMhgMI0evTgYrDt58vNAwK1piiiayss/S0pKT0jIMRptPXsucLmcNTUfB4Mluh4RBKvP93F8fLbdni0IFpNpisEwGDbBuRhr5kZoCxmiKF+4sCY+3jVo0E3hcFAUbfHxk12uwbAWLoAEmy2WTIdjlKp6ystLUuMdN44c6fX7TSabLBv79p2ZkdHmypVPVNXr9eYnJ+fm5AwPhXxVVRU5OR379RseCPhF0QXIclpi4m26roZCFzStzOUaZ7F0UdXmxsb6aTfdlJeXd7agwGi0BoMtQKtWvQcMmB8IHJFlb+/et5hMturqAqfNNm/8+Bafb1d+vtEoVFbuVpSAIMi5uTMlSYQkGA3nYa+mpUFHOAa10ACp4IBTUAGZkpRiNg+D7XAWAB/EwdKEhBkpKT/OynpVkgafPfuR230hGHQbDLZOnW41mYpgG4ShCZxQKEkXLJa2sYvuhyOxUyXDHkiAMFjhGAwEB9wAI2EjHIZGWU50u9e4XOm6rptMSa1bz3c4UgKBjxXlbIxY9DhMhma/f092dkdRlBIS0tLSWt144x0JCcHGxg/D4SsmU3x19Z4bb7y1vr5WUXyK4lMUf3r6cKPl3jm3LzlbePF/aWF0OWyXy6uamz3f+Z+A/1VTlG8lTK8ofIeDvx4ZvY7vPT548zddO+XNveOx/8st9v8gp/23xzdssX/r8elThgUC9XFxHTt0uDMUigSDHpstceDABYri1bQQiKmpM2y2TF33QjCmHlQMZpikqkc0rUTTwq1azVMU29GjH0uSIRIJDx06PRDY6vfvFQQ5HA5//sUXfbp2ffnJJ+Pj4qaOH//yU08dMxp3hkIi+DXti8bG2UlJv8jMBCbExb2Zm7u8tvaXJSXAksrKFy5fHpuU1N5qVTXt8bNnV5eX35Kenmo0SoJw8513XqmouG3WLLPJJImiLFtUVR07dnIgsCEUOggiqLADxsJ90AYegXSYDe0hC34DBngQyuF1+Bp+A1HOyHkwH56BjbAU3oIZMAqA9nA76HAegEFwN2TCDDgL11aPbINtkAFZIMEnEI3T7IedcAP0grnghM+hDoBNUAHzoA0sBht8AQ3QAp+DNVbJN2fpiuKzhcVAn56dfvv4fTOnZoMOEcgBH+jQBKNj5FBqTKGqb8xj7gxZsBIqY8WmGgTgIoQhGcaDEXJgCpyGP8NReBdGwEQAQpALmiSZnM7s7t0XV1XVFRWdMRhMJpN1+PB5CQkJx49/rGlKQ8OuVq26t207QlFC0YrSdu0m5uYOq69fqWnhUOhwamqvtLRhqhqKilsaDL1NppvhBIThIgyAYRACPTHR1a/fDV5vUzgcEASTrqtWa/fExFtE8Rhgt+c4neMikRpd96c6zeMHDaqsrT1XXOz3NzU3VytKuH37YcOG3aaq/oyM9m3aDG9sLKmpOdOjx8CuXftevFhw8OAOXQ82NS3XNA/ITuckQTA5nSPM5o4+36FQ6FyXLl1yWrfetGlTbXW1y5W4e/fbJSUHBUFwudJstsTMzK5Wa/ypU6shnORyBUKhFbt3Z2S3TkpKaNPGWFKyUlUDsmxV1WiT1oW4uJDJlAGpcABqoRr6QQgEKIdboVYU4wyGnlbrXEEogr3RCuDk5NuTkqL8nSQnP5Cc/PPi4g1u9wWrNcVuz+jadXF8vAwroQ6MopifkjIvHK6COMiFWVANm6AJqiAeUkGDPTABmiBKoNsNFkIxnIGIzeZKTR0WCNSZTElAaurYjIxJ4fBmTWuAS3Aj+EDMyclt1apPQ0OZ3R6naaokScOHT+vcuZPff1SWI1Onzi8tvWA2Z8my7Srfk9WaXlXT8IdXPv+nFq5/CtGU/b93iDTqUH5ji0S+y8Ffd0av498BD/1o9qK5kx579p3/m/7ov7Bd6R/BN21puu/O+c7Kyu0mU5zZnFxWVnjy5BpRFDt1GqXrwStX3gqFqpKSxpnN6fA1nIIs6AEhSIQbNa1G18NAWtpkh6N3Q0NxJBLKyMgbN26BJBUKgmHr9u2zp079xb1XZXLo16PH288/35KVZRPFTc3Nj2RmLkr+j5hid6v1nby8pnB4wblzX9TW3pKe3tFmU6A5Ejna0LAoKyvZaLwSDDYpis1svvmGG3RdP5KfX9vYKP5/7J13eBzl1fZ/U7ZLu6veJdtyl5vcK+4Fg21MMcYGY2qAhJBGQgIhEEJJJyFACITeMbj33nuViyxbvdfd1fbdKd8fm/VnkrwplJfy+r7OpUvWzDxzZnb2mdvnOec+oqRpavfuvefOXSCKRwVBgENwM8yPj22F+6EeVoAXInATDIcHoAMeggIIQCd0wgh4GNbBJrgb+sY7g0cgEa6GdfAeqJAPt8NmGA9WeAE6YDkcgP6gggCjICcmgQmn4DqIKdqIMAP6wQewFFS4Kc4XY6mQfeB9eA96xFXoATNcNXfBu3959aPY5/7NO+fdcuOVUAHd4TLoB33BBEUwGwTwwHBIjK/461AAQ6AM9PieCSBADxgB0bjFQmUmWAELYSQo0BGP1xqqq7f6/U26rvXsORccfr+7o6NRUaL9+08ZO3aepqlduvTLyxvs9TbV1x8NBNpaW89Eo6G0tN5DhtwJ4ezsgampQ/z+utbWPdARiezV9aAoplostwtCFEZBMVSK4ianM7Vfv3EtLdX7968QBNrb3/Z6dwuCZDLl2+0TZdlhtQ4Oh896vas0LVyYN7i8rm7Jhg0Oo7F798I9e96srT0hSbLV6tB1LSWle1NTSUXFVqczXxQTzp49sW/ftl69ik2mLpJkbW9/LRKpiOWMiqKts3NjJHLOaExPTU1dsWqV2+XKycy0Wu3jxy9saCg5fnylokRCoc7ExIwDB95IS8uWZWOa0/naunUTJk4JhUIOR/LBg/vy8sZUVHzocp2JRNxggCOq6lXVTtCgAXwwFJzgAwVugjpojwWkJSk7IeE2ozEJvFlZ9zocczUtpGlhXY/oejQxcVrXrku8XtVoTNR1VRCEbt2uKCgYCaWyrMaYaCTSEH/pO+BqyIYoOKAn1MRbibrgJLTAAQiCHeaDlpLSNydncm3t2kjE1dS0vrPzjKL4LZa8Ll1uFQQVxoFfELY5nVl5eYOOHv0oObmfy8W6dW94PO2iKPbvP9poNA8bNqam5nxJyX6/v8HrrYo9xMFg69attzQ3K/OvmfTfzlr/Lb7eVU1f9WX6S7iErwOuv2bKzx+84/Z7n/yy8dH/nYDo3+GT8dG5syY+/eTVVVXLDIYEmy0vFJL37n1d0zRNU9LSihsa3vb7z4qi0W4fLQhb4SikwD7YD1YYo6qRysoXQqGmpKThyclj6+rKysoOmc22KVNutNlM6cnJk8eOjUSjkZj0aCQSjkRysrIKu3QJiKJFFHtaLH/nj00UzaJYFQrNy8zMNBpbI5F3GxrGDhkiGY0RVT3r9y9parpz+PBuRuOpsrJdhw6dOHu2S0FBQ8Ouqqr6I0f22u2OefMWm80y5MDAuGbnhaXwFFgHDZAAIdgKXeAwnAQbWC9SZ1wDYbDB6rgY0wXRpbVwFOrgF/FF/LmggwWGwitwFvqCBCGogQboBePhLBRDBqiwD6pBhe7ggA4oiIucX0Ai6PGF1L+D/ps/vrv47kcAATZtK4VM2ANB6ANJcfXybZAGdjgWTxUQ4yVcx0CGBjgPQTBAL9gPVfGiewPIcAzKoRjehJK4bJYGNaC73bbTp9/1+RoMBquqRh2Ogp0736qsPCqKksXiAJzOfu3tVUePLklLy+vWrXtV1eaaml2SZDKb7ZqmmEy9PJ5zVVVL8/K6O53dJelsJLIWEASrrsf0MkthpcMx1GAwe73tu3cvHTZsYiQS6dNnkaKUd3R8pGkBRWkXxYRotM7tXtOnz2xBEAyya9W2bfOLiwPRqN3umDnz+urqAyUl60IhnyCIwaCrqmrHwIELfL4mQQgdObL7yitvdrvbJCnR4ZiZmDjO7f4oEDigaRFFaYtGa7Ozb4xGXW63W1eUG666ytPZabHYk5Kypky5RRDUfftej0T8tbXHsrK69u07xudznSgvnzJlen5+gdfbWV5+vlev60wmh8Fgq67eIYoy1IDf6+1UFB0aIAjFkAQHwAcToQpWwgPBYFUwuETXvWCQpHxBSG1s/Gln5zpRNIuiSRCMgmDQdaWp6VFVbbRYIseOvdDZWSuKcnr6IFm2OJ1jI5Gm9vbluv4taIFV0AkCFMSTWI5DAOzxoHgmjIOSeF9QK7gslsyKiiWRiCoIpsTE8Y2Na12uw7JsVRSvrotgho1GY1+HI2vfvjezskaPGfPwxIm/ys+fvW7dG+fPn4hEwpFISNf1EycODRkyxGCwbdmyuLZ2vc9Xu2XL4mAwDeTkJMd/O2V9AnyNq5q+2mT0C5SVumSX7LO1YcV91n7wu9vvfXLHl0byqf6LYKIx5Ganx6RM/6ujhg8peu63iwOBRlUN5eTMNpkK9+9/C0hJGVBQMLOlZaUkJWhaOD39Jlk+C6VQCM2wEeRY75a6und8vjJRNNjt2adPHygp2WU0mgVBaOmQb//BD06WlhqNRpPRaDIaVVW97+GHD5444bDbU63WO8rLd3u9FzypCoevLyvz67pVFBVdrwmF3m1svHbKlAeuv/7pb31rj65v7eh4csqU64qKHps8Od3rPVlWdtOCBbqud+/+QN++z5w82bBr1xaj0aTrut0uwo/hfJxBAm/BG/HGoefgUSiCm+AO+Ah+F/eiA74PnXArLIIkeDrexgl4G0rhahgGOfA6/BDmwGIYDhshK87Yzsa1inZDdVz+6SgsiyXkwXHYBO/CILgVSuBd0OMn2gkbYD58K94m6gLWQDnctGd//8mzf7jorj/W1l0NN8NgWBF3tR2WQx5Mj1dT7YUOAKrhGHSNR3ZVOANZ0A2GwkHYc5EPNTAd+sEEWAkbQIdEsEIEJmjaxHPnVtTX71XViCybhwxZcP784SNH1kajMXUF16lTK0eOnKNpislkmTVrcTTaVFLyXijkBgTBVVu75rLLrlFVRZIshYWLExKModBrqloDUdBhY1bWAkXx2myOrVvfGTfuCoslQZZNJlNKnz63WCyGlpbXNC0giha3e2W/ftcIgmizWN5Yvnxu//5ZdnswErFaE7Ky8q6++pZo1HXs2CpRlM+eXT1gwPVmsyMaDRw5snfatBus1kSfzyOKCYDVOjA5+YZA4DCoilKTk7NYUbyK4gn5fLOnTattaCivqgqHA9FoSBTlkSOv6tNntKJE8vIKBwyYWF1d4vV2jBw3sU+fvrt372hsbMrLm2EwWM6dW+r3t8OUSKQPVIMR8iADOkAHK+yBfNBBg7XwhCBcIQjPKcoQv/81RSlX1UZBSJXla1pa/tjY+Ejss1GU9pqaRbIc0bRI1679BwwYVVa2pLHxgK5rihIUBENHxyp4AKbBEzAclkAFuMEKp+NtIJJhGwyDZkiB28AAr0ElBH2+Kk0zW619DIZ0i6VPevrNnZ0VtbUfRCJtkApLExIWKEpNMOju0mX6iBH3xxwbOPC2iRN/eeLEgePHd8qyYefOtTfccH1dXV1e3uSCghmHDz++Y8c9ipInimNys5WcrH9Mtv4c8fUTIlVV/VPaF+j8pcjoJXytkJ2VuvaD372/bPNv//Q5ph/9J4gRwZwviInGkJOdnpOd/gn46Nolv0hN0aLRzoyMSbm514IQibidzp49eiwIBM5qWthgSE1PX2Q0KqDEBTtXAZI0QJanNzau0HVNUcKjRt3c2tq0Y8cSUZQSErJSUofd+9BDazZvBiqqq6+/6y63z3f9vHlmsznPbB6XmvrD6uol7e3AGrf7GxUVOWbzhORkWRACqrqsufmB+fNvmT4d6JaV9dx9943u1y/R9Dc5/buHDfv+qFHLV62SJMnpHGq1dhs48K8uV+ayZW8LgmC390lO7gePwlYA/gTrYC5ocAB+CZNgFgDd4ZvQBD+F8/BDyIZ58dZKs2AoPA/H4AXwwDWQAkBPuAaWQgkA0+FRUGA4lIEDhsNAKIITUAkiDId2CEE/GBTXsZ8KOXAPWOElaIf1cBS+AYOhAO4DM7wGbvgQPLAIMiG/tm5mbV0wzjJnwlWwGU7CahgQz4IFxsIoOALn4Rx0i4dd1XjxUzYA6TAGmmE1bAQ3zIBkAPJgJpyE10GKjwD0hnl1dccVJWgwmByO7JEjb/H7/YcPrzYarYcOvTly5FUpKbmRSMhoNFutCTNn3pie7jx+/A1BEKuq3rvssmuTk7MikaAkWYCcnCszMkaEw+8DorgiI+M6WU5W1UBDw/nJk6/Jzu7a2FgtSWZVjei6VlAwMydnVCBQouuuAQOut9ky2trKopHI9cXFOQ7H1nPnQopy/vzpzk63KIpTp15dWFhoMFgGDbrRZHKcOvWRrutXXLFIlg0bN77X2dnu8az2ercDRmNOcvJ1giCnpEwJh5ubmlaCWtxvyPnKyrVbttisVr/fv2HDS83NFUBycrYgCF26DDh9endZ2QnQs7Kyli//qKqqXddVWU44c+b9YLAfREGEAzAagtAG9TAITHAcMiEJEuAjQfiDIIyPfWaC8D1d/04wuFTT2gTBKYpdDYZbfb6TVVULw+GK6upFBoMpLW18NOpJTEzq3r140qQb2tsPV1SsEUVra+uH8CiMjT8At8O3YRs0xzgMDAI/NMGUuFxG7Km+EkbDh6Jo8Pt9SUmXR6OtBkMqIMsp6emLIbG1dQd02GxX67qmqq6CgisHDrxDVcOqGtG0qKYpOTmj5sx51+uVDQbD9dffUFVVVVPTaDQ6nM5eWVljIhGDKE7Mztxz1ZU9/5dnS3tiQk1dk/trFSJVP7V9YbhERi/h64bsrNQ3//JITV3TFyj5FKOhXywTvYBPwEdzstPXLnkiLXmv233cYskVRUNZ2QeNjbtstuysrHGRSEtb20egJyfPgVgz62LIBwGCktTXaJzf3r5fUSImk23UqJvAFAh4VTWSlTWkV6+rnnjmT3946aVvPPBAXkHBzJkzjUajwWCI6voAh+O6nJw/NTU9VV//eF3dCIdjckqKSRSNonhWFJ++665Rffq4fD63z+f2+8PR6I/mzTuh65urqmI+z+nd+0cDB1aerzh37nFVDeq6Vlj4A7N5lqKIuq6mpY3NyblKEP4C34GjMAssIMAxWAxDIBCXGrXA7ZACD8MkmBxf3I+CAiNgASwBC1wZj7PGkA4T4PewDqLQG/pDCYwAE7QB0B2Gx9a147mkhfHDu0MPeBX8oMJVMBjegiB8A3Li7okwD8bCq5AD14McT2OV4Wo4BhtAg6EwG45ANyj++CunNwyEaugJCfEu8zXxZvTES1wtMAyC4IaRYIq3mFIhAQZAIH7fUmBTvHD7hmBQbW+v8vnaQBgw4KqUlJ6qGhk3bn5aWpfKymMtLTW1tecaGipDocCQIePHj79CkqRJkxakpmaXlh5oaanr6DjidpcoSsDh6FtYuEgQxKyshSZThtu9MxSqLS4em5GRd+LE3urqsxaL48SJZ1yuM4IgpaYOMptT8vOLExIyzp/fEAq1JFutqTbbmjNn6j0eQRACAf+KFW+1tDSaTCZN00ymRIPBcurUR6KYIMsGUZS2bPmwS5d8VVV79rxZVStdriWa5lNVrygaBUFobv4wO3uwpkWMRn315s3XzZzp8Xp79hzXs+e4vXs/OndufyDQaTCYysuPVlSUdO06S5bl7du3traG8vKmybKlomJVNNoTssEMS2FMPCTUAKMgCBHIgv7QBJogPANDL/5WCsJsQfirorTHxBkEIcFgWKCqedXVixMS8nJy5rhch0RR8njadF1LTc2ZOfPOlBSrpinwOAz5+Fd8EvwJWsEK/aEavDAKDLABZsPzUA7AIJggiglJSZd7PNt8vma/P9Le/oGqegCnc4YgmCyWiYJgjERWC4Jw6NAzx4+/KEkmSTKKokEUZUGQ9u59yu2uHDhwQFNTw7atWzIzC+rrtwKBQKMgpGRn7Xjtz/d8TlKj/xr2xATga8RHL5HRS7iELxlee/6niqJ+IXz0Cw+I/iM+AR8FXn/h5/OuSmlt3SWKRpjZ0nK+qmqlJJkEwaRpckvL67oeEcUOg+EIeKAbSOHwq4pySBRzDYYr/X7v0aNLw2FfUdF0pzO3re2My1WemJgzdOg9S1avGT169NgxYyKRyM5du9raXfs7Os54vekm0ze6dl3n8cxNT++TkBBU1aUtLWldu55tampxu5MSE5MSEpwJCU6bzWGzuX2+NQcPvnfmTMzb906evHfNmqxE21VX3XH+/Pd8vlJRlD2ew9GoXl+/1OU6mpDQPT9/AbTAtWCFI1AF2bAFBLBeJDW6A/bDWFgJZfHF/Vje5Cl4F3pDHawE4aIb5oK3IBX2wbPwJFTCs5AASdAMLaBBBuSBCHZI//ibIB064EVoAQGOQ3cohXMfV0Jtg3UwA3ZDyUXdRE1wBPaDBV6EtbAWvgkW+BD8ccFICTZBZXxd+ByYIRkKYW+8AXqMJ3lhO2RDL1gN5fEWUxKcg+0wGHpDCWhghJXgAjMEOzosBw++3t5eIYqy2ZxoNtsSE1NOn955/vwJkyk5JaX75s0fVlScMhrNuo4sGxMSHAcPrq+tPWcwmB2OCY2Nm9vb90uSRVUjgmCQpMTW1pXBYL0gmE0my5496+rqygsL+xkM1t69Z9fUbGho2A4oStBgsJ48uSQa9aSm5tuMxnWlpR3+0MRu3Uwmy2WXzSwuHr1+/ZKSkkPBoN9oTCwpec9kSnE4ulmtCevXv9WlS0GfPv0Akym5Z8/FVqulre01TfMaDCm1tS/l508xmZISbLY3P/zw2hkzDLIsCKLJlJCbO3DEiAXnzx+tri4xmxPOnTvWu/fNkUinLMstLVrPngvCYZeqhv3+nvEweRTGgQ1OghkGQxuUxAuJjkMHZOv67bq+4uPfyCOC8HNBMFitzdHoS5pWB4Io9gU1LW18S8uWcLjxssv+evx4ya5dy0IhvyRJoiiZzd3hh7D640NVwPchCJlQDm2ggw02wGL4NtwNS2Fv7ME2mTI8nq1+vx9+Cb8Ohwe2tLweCp0DVDUgik6f792srFEmU0ZOzuLz57esWrXY6/1bNsuWLd9vbT0lCEJion3zpk29+4wuKCjq3lU5d+69UMiVl5P82vN3f+ET5telyv4SGb2ES/jy4bW45NP5/8WSpi8hE43hk/HRb915/Q+/PVwUDRCGhW53uLX1iKYFEhNny3JhS8tboignJfU3Gs9CI0gwW1H2RqNbYlG0cFg8cODdQMBjNFqysvJKS5e2tp6UZbMkGR12u8FgWL9hQ0uL65FHXrjxrofXtbYd93jMkiSCSRRDqvphc3O3IUOe+9Wvnnrood8vW/bi2rUXHDtQWnrLb39bkJOj6zrw7P79z+zbt2DQoLCi5OUNXLjw54HAkkOHrvN4vJCYk3NlW9uulpZtghALZGrxzvWPwSPQDX4PdfGxP4S9cD2MhFmwHHbFN+2GlTAY+sFU0OAd8ABQB+9DX5gO40CH8/BHyIIfwEiogg4Q4AB4YCIYYTP44vQuBBvAAVfCVvgd9IH74UHYA6/EfdgLz8E1sAgehsPwQXzTFtgBC2E4XAbH4XoYCPfBYHgfaiAIb4EHBoAA50EGAwyHLjAEzsIJAFphD/SB4dAXJsIROAzAcTgYbxM1CGZAPbRAJ6yHU6DKcn+jceapU2srKnZHoyGTyXrq1Pbq6tIePW6KRr1JSdmjR88vKTm4d+/6cDhoNJqPHNnc1tY4atTCaDQsSYmZmYs7O2tqapaoalAQctvb1ytKKClpvq6HOjpa3O7WmTNv8vs7DQZbSkqP4uKbvd6K8vKPNC3a0VFuNhtHj54fCvkiiqJr2i1DBgWj0cREB9CnT/Hll19/4sQBr9cTDnvN5qycnEnRqD8cDhUV9Rs9ekJ9fa0s23Rd1XU1N3dGdvZYj2dDKFTbtessh6NHZ2dFJBK5/oor0lNSNu/ebzKaGxpORaPBhITUyy67PRgMKoqhd+8bw2FXXd1mSUrNy5ve3n6yunqVrqdDEeyEOnBAAuwBA5jBDSchGxLgKLggCVLhCvitrv8tfVnXl+v6faJYrOtt2dnT0tMHK8q7qnpE1zskydzWtlvXg2PGPGu3d58w4VWjsd/69a81NVV6PK2ynOx0XiMIf4VfxZ+TU/AT6ANeCAlCGAaCHVbCvXAdAFfAs1AHy6FFEGx+vwS/hiQA7tL1ezo6Vnq9uwXBFAgs69p1VjjsNhrTDIaknJxFimJeseKm6urNq1Ytams726PH9YIQ3rRpY9+icTk5PTvaT99z+3Ur333oiunFrz5/05dhwvy6LNlf6IvxyZio9gW6LrSUb/wCT38Jl/B5490PN732zprHHryje7e8z/tcX1omegGfzMMDh0/deMf7MBIscEAQjicl3QqGSOSsz7cmI2O63d6/puaNcNgH4yAN1ohikq5XFRV9p6Fhi8dzIjd3kCCECwr67d27LDm5t8tVOW3auP379xcU9L3nnp8ZDEZBoLz8zJ/+9HBGyFcZCExPSVnT1jZ3zpxv3nprzIfzlZUP//KX6Vbr03ff/ebmzc+vWjVp+PCeBQVLt2wZmJS0o6pqTlFRqs228vTpRd/6WxBo1aqnjh2rhrbs7IEWS05d3VKDIcnnq4BcyIVvXxTX/AjehxvgKLTBnPhLF2iGlZAEKXAURkPWRffmGJTDCNgNE2DgRZtq4PhFJHIXPAFByIKREIRDYIVqGAZm2AO9YfhFI9vgTgDc8Bdoh36wAb51UQJoBzwNHkiDGpgPOQAI4IHNMAV6AbAN3owHQYuhCY5AGligz0VuB+A4aOCF4XHlqRi8sCsuRDotnloaQzvsgjbIAAucs1q/IQiJmtYSCq1ITk7StGA4TEHBXFk2l5Q8PWXKnRZLYiQSPHBgqSwTjUYNhoRBg2aBvnHjn7Kz75TlRKCtbXUkUi0IZlFMtdsv1zR/e/tLubndxo69MhIJ7dq1xmjMzc8fDei6XlOzq6HhcE5O7/79p3q9rYcPr8i1mmb07Nns822sqAjrUs+eRb16DRQEQRDEVavestsHpKYWu1yldXXb8vNzp027oqTk6LFjhyEhGGzJzZ2RnNwPqKz80GJJzs4eV1OzMRDoyEwRZ0+Z8v6aNZLRFg37Rg4fvnv/qX79ppvN9sOHl4hialJSz7q6DWZzgqoaExK6NDa2gaqqEgTBCzbwQxukgA4S1MEAqAczhGEKbILB0B28sC4uqvUnWZ4hCCmquqR373sBv7+6tnYF9DQYmuz2rsOGPSHL/1+BobLyo5KS39psTlm+zGTqqWl+j2d5NCrCNfAs9IAs2Ao2mAwVUAd3xVfzhfhPDT6A1TARFgGgXLRDG/xFEM7k5081mRyVlaus1t5O5yhRNAKhUH1T0wcJCVmFhdfU12/3+Up1XZ88+dbzZRv+/Pv7v8zzpNOR8EW78AmRXjgs/qv+r/b7HyG0lB/8zLz5L3EpMnoJX3PMv2bKYw/ecdu9T36u8dEvQ7nSf4KcT1piv3XVN0cOOwYN0F3XQx0dH0UiZ0ymvrKc39y8ta1te37+TQkJOeADG1ynaZKuK0B29qTMzMnV1YcUJZKSkjN58qJgsF4UpZKSkiFDJt133+MGgxHQdbp16/Pooy9Gs7uJsL2j467bb7/ARIHuXbu+9Pvfm5OTr3/iib+sWTNn4sSBvXqJoijAvtraRUOGpCckNHg87X7/hUMkSRLFKlBUNSjL9i5dFhmNDpBhGtweT8GM9aOfCQ/BOjDDDfEO77FQQTosBqAEpn2ciQKDoCfshqkwIF4EHbNcGAA3x/dMizdg9EI7HIXZYIVsOAj7YCgMgFDc+oAMv423Jv8h9IKtFwnyx5AMj0I+nIcbICuuHhpL6xwPL8PLAJjAADbIgWo4DCJ0xtXOL5gJ0sAPxniL8wtIjBcq6R/PTwAsEIQcaIWBMDUaPaLrbkGwWyw3ut2KricWFNym60pNzXrQT5zY4HY3CYIwbNhVomg2Gu0DBswMBNz7978HenPzG8Fglar6k5ImWq39BMFut09TlBa3+30wjhs3q7OzY8OG9xVF9/naDx9+0ettEkUpO3uIrmsjR85tb6/du/cDWbb2Tkur93iWnDzZtUsXh6Pr+fPlO3asUVXVbLZEIiGjMbGj46Tff8Jm6+dwOE+cOHro0L7Bg8cYDM78/Dn19ZsaGrYBkUin2ZxaWbnS72+2WDKTnc73Vq9OdGZkZOTY7fZV69bJcvahQytbWyuCwU6LJfXs2Q8djkxVVSyWjLq6M5pWpusukMEHTeCJL44XQAhaoQikeBfWKVAJreCDmPj/dZAOf5LlWYJQoChbRNHocpWoatBiyezZ8y6z2WUwWAcO/KEkGXVdi8V0NU0pKJjdr993gkG/pgV0PSqKtqSkBYmJveEPMAB6QAlYYRJUCUKpLIdgEySCExzgADtosF8Uw7AS1oHtok122AVVCQk5Nlt2ff12WSYlJVRT87zffxYwm3NAyMoaU1e3VdcbBg8eLEnmivNbvuRMFDh1puKLduET49Iy/SVcwpcYQ4v7rP3gd7d9bpJPX6pypX+LT1Zin5Od/uTPbhs5rBRaQYPpPt+mQGCPIBhgsMtV3ti40mrNh5OwFqJwGXD69B+83oqkpP45OdPb2xvPnNktitK4cfPMZoOqSmPGTI9GI3ELRyJhs9nSpUvPoCCpVmvvHj3+zgerxSJLUounc87EiflZWW0u1ztr1yoez6iCAovBcKalZempU5nWv8lwvv/+A8eObTcacyCruXlvbe0SVQ0mJw+DCLwGpz6eJFoDvwUBSmFDXI8pJsAUhjdAgV6wAZo/7tR+qIXrYDesjUuUiPFy6bVx4fpVcA+MhW9CIeyH68EBl0MX0MEMdfHszws5oPVQBs/CGXhGEMpF8ZvwGFy8nNUB3wUz3AZ/jlPMmFXDs3HZqZ/CX+FGeBRCcBryYRIMhwNQf9FRZ6ABZsIg2Ajn4idSYRNocAOMhOVwOr6pHd6HLJgCg2AJaNFov2Bwp663CoIZZFl2iKKntnajJKWC5PE4du9+t7W12mSygmCx2FU1cuTIsmi0J8iqOqy1dUkgUCZJVkVxSVKiqvrc7g9VdaAkaeFwcNOmJbm5/SKRYEpK/5SU4pKSt5uaTkQifkkytLc3HjjwUf/+cyIRv1GSPjp9etakSZFIxGRKGDx4kaYlrljxel1dRTQaFQRjXd0Oo3F6NNomy/KxY4euvvoWj8dlMCTY7T169LjZ56uurFyiqqFQqD0aVfPybohEPB1utyM5a/jw8X5/5/mKiuzsKSkpgy2W7CNHloqi2NzcDvaGhtpIJNjYWAdtuq5qmhsk6AfToBOSIA+qwA2FYIxpJ0ERlMdyJCyWVngb6gFwQoIoFijKhzZbcXr6s+3tFQ0NazVNEUWDrqualrJ58/V1dRsEQRQESRAkUZTLyl4+c+ZFTYuqamVHxyvRaD0gy6lggALYCSZIhFpRPG8wZGRlTbFaG+GWeEcxoB7uTE7O1HWDxTJfEN6Fn0A4vvVFWAH5dnuX0tJXCwuLgkFvcfHEESOmtraudrl2KIpX16Neb7Wi1GVl5Xs8npys1Od++90v+TwZm8y/skv2X20y+s/7hF6yS/Z1suyslLUf/Pb9ZZt/+6e3P9uR6xtacj7PdvOfk+Vkp9U3tPy3h7z+wqMjh9WDKS9379ZVf3rkgSGCIEEYbvL5Im73UcgFDd6PZVJarROrqz/q6Dgqikaj0VpbW3bs2CZZlg0Gc3u789FH7zpxYp/RaDQYjAaDyWg0/fnPv9ixY0Nycl6/AQPvuv/+jdu3X5iq2l2uW+6772xlnc2WqKpqc3v7e+vXd1dVuySpun60oWHr+fM39uoli2J9/clnnrm6ouJscvJNuq7FPAkE+lVVrY9G3QBMht/CyvjYG+ARKAYZRkEHvAYxxdNWeAnSYFZcEWlbvMpYg+2gwELoAjeCF96Pv623wGGYCVXwJvwaroVpIMPNMA7egE4ARsIVkAA6LI2fV4eN0B7X1nlLEDol6QVRvE6SfgsfwAsAVMD9MAIehWvgKdgOy0GHffAKzIWrYDJcC1kwEJLgNkiAYugLxTAHyqEUgKPgh5mQHidPx+Aw+GElOOG6uJ7/XDgAe6AOPoI+MAaA/jAddsExXbcGg+8pynFdj5hMSWVl7/r9VZJkEwSj1TrFYpl2+PCqsrK9ihK2WpN27nxN03rKcg6YoRjmulw7Ozo2qWpEklI6Ol7V9TGQYrUmrF79eo8eI/Pz+0WjIVm2ZmQMLyycW1m5pbX1tNls27r15aKiKxITM0QtuvbcuVmTJuVlZfmDQaPRBvTqdXl+/riNGz/SNLWqal1GxvWynKQonRUV5bNmLdR1GhtrRdGo65rB4CgsvNFkSleUQDDozcmZFQzWBYM1KZldR46cdO7cqbKyMzk5U5OSihobt7e1nYR+Xm+3UKgeopATCPSFSiiIfyMqQAcjhCERTseFRY1wBopAhwgcgemCYEpKmu1wjIDlcBxaRDE9Gn0vMXFiauqDRmNhdvar0K+i4jW/vyoScZnN3R2OK44effLUqWdiD/TJk388d+6ttLTLZdmRlTXX6Rzkcr0TDB5TlHZwwnbIBDMkCsKplJQF0Wiz2ZzSrdv8lJRs+GZcvPYHDkdXWU4QxQxRzLVab5OkDvgGnIZnYDVcA7UdHSeLiiZYrQ6LJcFgMHbp0nfGjEW6Xt7Wtl6WLdFoxaxZC9rams6eLXvh6R98yafKC5O5PdEGuvur18tehZjc3icmo1+Y80Jr+YbPjNlewiV86bHo7l/IsvS7X9z7mYxW19Cam/2/KtT82eKT+b905da5sybGfj9w+NTCO96C6SDAGhCgGI7E3r5JSYs0zdvZuTwlZVAwWD5mzOKjR5eHwx6bzdHZmS5Jjs7OdTfeeN+MGfM8no4nnrjX5XKPHn1TScm6oqJ8q9WyevXqO2+6adG8eafLyr7/s58lp+SMGjVl8+alQ3p0Wbt79/SMzG6ausnrNTocle3tcwsLnUbj1vr6876gKHZNTJwiCFJn5/pQKKaaHob+0ALNcB80w1IYHxN0hDGQAzugD3SHbVAHM2EZFMOIi66+GjZCV6iFvLg66QWshUrIhAaYAU5YCQpcC90/vrR9HLbCOMiDWlgKKWCFGpgMu0CAay9avDooisNE8TZA1+s17WFdV6ECboabLhq2AX4OHmiC2z+uDdQGy2AgbIPh4Lxokxe2gQ+cMAq4yNUgHIVmKIbiizapEITt0ABj44mqQABsEIId0A59oVMUvUajIxSaAM2wRpLsdvttgKI0+/0rExONiqLo+iCjsW80WuP374cbAPDBCoMBTVNUdRh0gbOwrbh4Rk5O7+rqkpKSzd27X5uY2AWIRr0VFcsiEXdR0ZV2e1Z19f6amoPXz5yZlZa2df/+U+ernIkWR3JxWlovQRDCYe+xY+9mZi4GMRLZ0d5eOmfOTYIg7t27pbPT3a/f4LKysuTk8VZrjqoGz5x5tlu3bwSDdR7PzmDQd8UV8xsaqqqq8HiO5uXN6Og43dmpQwMMgYNQCLVQBLvhcjgCGZAdr5EfAnsgD1qhC5yHJFBABy/IMAdcRuPJ1NSFQDhc43Kt1LQcQfDb7dOTku64+FHr7Pywo+N3QFraNyQpUVVdLtdKm83pdPaqrd2QlbUgFKoOhaozM+cCgUBlc/NKozFGl3NgFCwTRS05+SpFcXs8K/v2vTcWnPL5qmtrV2ma0enslZw8qqVlQzhsMxongQZiNLovEtkDZpgDrbBl4MDpTmfmiRPrFSVcWDiwS5e+oigKgnjo0MZQqHP69GsPH95ZVVk6oG/P1//yMF9i/NPJsNPrz8/N+EL8+QRIK+z7KUdoLT/973f6fHBpmf4S/m/h9ecfSktxfu+hZz7lOHUNrV91JgrkZqfVNbT+t0ddYKLA8CFF21Z9Z+Sw/dAMV4IXwjAYxoOm6wGDId/pvMnlKlfVqCCIgwfPdThyWltrdT1iNvdLSrr+rbeef/HFJ370o4WaZhozZpEkyZIkR6PRXr16L1iw4LX337//0Ufv/uEPc/N6jRkzXZYNkiQfPnVqblJSX3QVfKrqCQQW9+mTbDJVeb3lPp8s97Hbp+u64vVuDIWqYCiocDmchSSQoAVy4HY4DitgGhRCA7RCI/jgMhgOH8JlH2eiQAHMhhpIhxn/UL56GTihCq4BK+wGM3hAuUh9KWZN0AZ7YAW8D+kwF1zQAzZCLkyFdfEEUB2GadopRZkDUUFIF4QpcA7SoRgiEI5HZLOhlyiGwHZRDVYMyRCMxzKVuF5VzETogC7QAJ3x1IWYtUINDILD0HbRVVjhLFRCf9gJHfGwXwVsgZ3gAyOYoUHT8kOhWHvVHjBd18M+30pV7ZCkRLt9odcbhFFGY79I5Kzfv8Jg8MMH4IEEuDYa9anqGCiE40bjsZSU3OzsnufOHSgt3Q/06hUpL/9QUXwGQ2JiYn5iYqbDkXP+/Ha7PSpJUkZq6vItW8qq24GpY8Y0Neytrt5tMFgVJQyyKJo7O1dPnjxS13Wj0bRu3Qfduw9WlIjTmex2t9bUrOzoOB6N+gRB1rRQR8eWsWOv1nUtFAodOXJQ1xVNi/h8bZ2dPmiAENTCIDgDKpyByZAA3nhb14FQCHtAAg/0ggCYYAJMgQwwwRzwC8J+TQt0du7WtJDBkJKefqvB4DYa02y2Cbqu6Hr0giUmzkpImCkIUih0SlV9gmBNSVkQjVpqazdmZc1XFFdHx75wuKWz87iq+k2mzIKCb2hae7wb7R5wpaUtUJS2YHCjPTHh1Kk/tLcfFQQ5MbEwLW2EyZSYkjKusXF5NNpgMAQCgRdUtR5Eg2G0INhgBLSK4j5JMqSnd92/f0lSUlLfvn3q60/v2bMqHA4ZDMZg0JeXV3js2N6mpmqn3S5KX2Sl9r/F/zSZ2xNtNXXNX50l+6/2Mv0lXML/Lfzykbv79+k2/7afnauo+/d7/zPEZq6vOhONIcZHPwElvYCc7PSnfrZ45LBTcBY6YRfUQBqY3e6lfv8OSUq222dFIuE9e14PBFw9e47v2nVYOFwRCp2RpNTU1G/s3Lk1NbXngAEzNU0pL9/X0VF7/Pix48ePOxzOxYtvKSktHTFiyoABIyKR0O7d64Lulv6almswNCvKux0dQ2fMzOs3oCkQON7evrqqamCvXrEaDo9nRTBYA1NAAh1yYC40gwlWwVowQ3+wQxqchNNQCAb4CBqgCwA7YN/HL/c4fACpoMOr0B5PtZSgHV6BJJgGm2EzOAThL/BTeO3jiZ5vwgl4FH4GNjDCYpgKj4ECVlgoCD+A62ApNMXF+fdDT0W5VVV/pusvpaf/OilpDtwLW+MEEfiZJJ2w25+zWhfBr+M6kYAbHgE7/Byuhw/gVHxTPbwDxTAbLoPVUBbfdAJ2wTyYD5fDe3HVJ2AzHIdbYTZMglVwDHbANHgKMsAIgyABfg8t0BFP3gjJclJiYh+f7yNVdQmCRdfDgmALh0+YTK2pqcPN5pT8/L7wNlSAERQwwb7kZH9iYjdZNpaXHzl//nC3bnMlSXK73aFQY3PzRq+3WlFCFovz/PltPl91YWEPoyxv2L27qS3Uq9c8RQkdOnnSaM5LTOx27Ng7kYhPlu1NTUuCwfaTJ49aLNaVK98OBqO7dm0QRWHHjjLorijR5ua9LtcJg8FeVfV2OCxs2vSRKCZu2lQKiS5XA1ja2hrjBUkJ0A9y4RoIwEhIgs0QgLK4dGs2DIr3gm+HJghDMxhBgmTQYI0k5SYn91XV8o6O5ZoWFUWLonQajXJDw61+/0ZBMFywlpYHoMxoTNK0ho6O91S1QxBkkM3mLE2LNjcv0/VsRSlqbd3b1rZFEERRNClKJ2TDGvCAqKpBt3t1r14jMzMzr7/uus7OA3V1a3RdjUTcRmNSQ8OHDodF1/XExOFO54hQ6INo9CCg635wwDaLZbzTmbFr19v9+g1xudpSU1MXLFiUluZYv/612toyj6dNUSLnzp0cNWpcYkLC6BEDP/EM83njX4cV7Ik2vjLC+JfI6CVcwlcK373n+ptvuPynj7/4Cfjo1yAg+neIEetPyUffeOGRkcNqQIZh8RxECaYEgxVe7wpBMOq6ajRm7t37psfTKIqGxMQMr3d9IHBIEEyiaE1ISAb91KlN9fWnc3P79Swo2LFj+4ED+202myRJsmwQBGHr1uX+tvp0u13R9WZFea+j47rFt33/+z988slfMbB4V0PD4quuUjUNBLf73WjUAOOgEw6CBjsAmAkSzIVOeCeeNH8cTsJUCEEWjIO1cB6Aq+EsLI9P0/tgF0yBKORDLrwZp24V8CYMhMnQE8aDIAg3g0MQpgvCC3AEXgAF/gwueAwKwQ4/hknx08kgCsIvBWEyIAjz4cF4C/uTMDnWS0nXy5KTv221jnY4bkpO/oEg/B7+Cj64z2AIOxwvSFKBxXKjzfZDQXgXlkENPAZD4H6Q4Cp4APbAbjgBS2AiTAZgNMyHQ3AQDsIxuCO+cD8R7oTdsA1WQS3cBl3jR82FUrgPJkM6/ApSIRMegB7wZygEL+wGjyha3O51mmb1+z8Kh0/ouqLruqadd7tPqmpIlk11ddsKCuZYLAfgEEQNhrDV2tbRUaKqQUmSy8uP9u59k6oGJUk6duzEZZfdWFQ0trx8SSTiMRgSTaY+slywbt0Kk8nU3CH26bMwFHKJguD2J3bvfrmu615v9Ny5Gk2TFKVZVY2nTpnCYSkYTIRsCIZCeaHQsFhrVlUd2d5+KhKJMcUkTYtqWg4UQRC66Hosmm6L359DoMXT9ZywAbJBgIFwGk6BDJ1ggk7okOVvi+IU2AEl4IFkWGI2X6PrPqPRWVi4yGZztra+Hgqd0/WI3T4yNfXK9vYnOzqeATTNX1+/UBCazeYcozE1N/dqu72wvf2tYPCEorSaTHmNjW/DDdAEdpjl8wVqa18NBus0LQzVEIZCSbK3t78+YcJCj6clJTk5Lzf3tsWLk5yB8+dfC4VaBUF0OBJ79RobiQQMhpTExMHp6fMV5VA4vBossMbpvElVmzs7W/v3H9ylS/fOzo7U1DRgypTpkyZN2bNnZTgcbGioWLz4tubmRn/Ie8W0MZ94evlc8Z/P5zV1zf9+py8YX2Eyeiln9BL+7+Lg0dLb7n3yr8/8uEe33P/wkK8fE70Yn/7qnvnL+3/8cyP0h71QDkOhN6ySJL+qtg4a9N329hO1tZuLiqbW1lZkZl5WXb1MEDIUxdWjR1Fra3kg4Bk9emFl5aFEY+eQfv2WbdyYnJbe3t5WVDTq8OEdBXbbpD59tpaWWjs7D/n9P/7xQ9OnX37h1B988N7WdasTrNbDp1tU1QfdwQl7oQ8ch67QClNgM8yBBNgGVWCBCFwJdtgAPWAQVMFyiMJikGBNXB/0PIyDJNgDPaAXnINtMAL2w2Tod9HNCMN6QbgHiiEEfl1/CY7BELj2IinH2M/90ASdgnBrvC24ELcOXX8KaiF2sT7YD5LTOS0hYWZb2+PRaL0sZ0QiTSbTJLN5FiAISbruDoc3B4MbRTGoaQGYDxOhDLrFh3XBi1AJV0EeeMEd7+naCO+CBb4JSeCGg/G0YD/8HsLwTYgJF2wFJ5yB70BmvG/TejDGUz8v4DV4SxCMyckjnc6hLS3rvd5SSBMEl8MxyG4fFQpVtbWtMhhsOTmzZDmhtXWXy3VCksxO5+DU1NGhUHNt7ftOZ1529iRdp6FhSyjUPH36tzyephMndra3n3c6c43GgtTUIZoW7eg4FgzWFRbO8Xrr6uu3RyK+4uJvuFznKioOwf2QGu9fMDYeUd4KfaEVzkBfCIMA5fEAuQqD4RyUQDGUwGA4DpfDhri27m5ogHGwD2I5CRlwBMIwEjqgCawQFkW7rouSNBfQ9WZNW6nrAuhm81hRzAoG3+nadZbVmgO4XCfr69cJgjEv79tANOpqa1shCMmq2mEy2XJyZre0bJXlhNTUMYDPV97QsMpgSNX1aDQ6BpLhFbgWzACchiNggHQYDacl6eyoUVfpOgcOrBoxfMjQwYNlWQYOHzmybceOnJyi/v2nnjixvrGxKjl5msXSJdaDtL19TTBYabdfq6qdPt/q0aOn5OUVrlv3frduE44fXz5lyvQ+fYoikUhra/OKFUtvu+0be/fuLiurOL7r5U88pXyu+AQz3pdZhTStMP9TjtBaXvOZePIJcCkyegn/dzGsuPe6D357271PvvPhv2/98PVIEv3X+JTxUeDeO+e99eIUWAPDoRu4AJilqt1B0LRoampxYeHc06e3aFrEbE7p0WORwRACpaOjRpbNY8bcJElGSTJEFSXJbr957lwtHFIUpbT06ODsjKl9+xolSZakzrT0Z555fvToMT6f1+fz+f3+QMB/5ZWz7rrve+UNzarqAnO82r1vXJt9AvSCFWCLM7+RMBJ0uAEssBMCsAkOQDbcChIchzBMh0KogOmQDKXggRKohFy4EfbDQOgN0YtiDDIU6frPwB2ndHtgaJwEJ0AC2MAGCqzMzGwxGA7p+itgB7+uL9b198Cm63+VpFardSgsgzLYDxoE3O736uoWhUJVJtNd4XCZxZIfiWwMhZa43S8HAs+63QuDwSa4WtOyzeYs+BBehyPwcwhBImyAdjDCMqiSpO0Ggwv2gh82gglS4PdwWhRfzsoaK4q/Bg/8GqwZGdfAb+AUbAUrlEJ9vHTJCuvhMIyH6EUWgUmQI0lGUTSqaiA1dUJGxuXQaDD017SIIIgWSzdZdiYnDzaZUtzu3RZL2GJxFBQMVNUAYDZnyLLVbu8FQn39JpPJYLU6QiH3oUNrLZYhgiD07TuzrW1fe/sRWbZFoz5JMgcCzTU1G7p2nSBJRr+/uaLCBI/Hy8l3wHiQQQUNogCkwVCoBDc0QK+4GmiMdveAMVACCpyG6eCHYDwrdAwMhE0QgVi/pVaIwhgwQZsomkXRIIp2TavU9aiqrgCfICRJ0g0QNpsni2JWKPRRZub4iop3WlsPAElJ/fLyZplMtvb2DYriEUVjevo8UQxZLI6cnDnt7ft9vrqOjgNtbXsVxW82ZxUW3qkobdHoxHg7JSkeF485PwTMMApOQE2vXiMkybB379Lhw+9wuVNfeOmlyqoqoE+fPrqu9+497tChpfX1Fl1/tq2tpK1tpaYFBEEWRass52la2O/fLEmO5OT0Vave7tXr8qlTfzBr1s+3b9+xY8dWo9HY0FCfnJyyb9+eqqqqgrzUTzOlfH74mjFR4FP0XlLjX4QvDJcio5fwfx0NjW33/+zZbgXZ3//WDf/TPl97GnoxPv3F1je0TLjyYRgIJRCEKyAVngE9P39aSsoAj+d8Tc1mh6MwI2M0CDU1K1NSknv3nqgo4aqqIw0NZ01GLTstbeb48ZFodMm6dQUJCf1yu4pEN5w+HZTTw2F/YWH6b37z9MUnrays+OEPvx8MWn0+HaohAfpDJtTDAbgebFAFW6AIXHE9nUNwNWyBBhChF5RCb5gEv5ek7qraDNPBBQdgBuwHBX4MVfA7GAYD4UVIBRFmgy3u0T4ogXRB+I2u74PfwQ0wG9bBK3A7TAWgGh7r0mVicfGPfL7agwcfdrtjtTuXwwk4bjIVpqQ8KknJHs8rnZ3vQjbcBFb4qyD4bLYfy/IAVT3t8/1clqPR6LUwDlbABlgQ9+SoJB1R1bmCcBdU6/qzUAlmmA3nYbssD7RYHgNjJPJ6OPwuOOAWKIQ/i2JJbu4fzOZe4XB5Q8PD0aiSk3Ndauq1Hs/WmppfaNpwCMP9sApehe/CTHg9KemYy3UOfnpR+dcZeMBmm221Tne5HjGbTWlpMxTFXV//riBIktRTktwpKZc3Nb2TmTnW5ao0Gl15ef3q6k4bDJbW1oDZLGZmzqiufqNr11nV1WucziyTKVHXA62ttUZjttGYGgicVlWiUTOMcDrPK0rA4civr1fgVH5+f5eryutthsHxjlYrYCMkwjiQAWiBI9ATzKDCEegFGXAKmkGA7Hh3Ig9sgWugDQ5AEHQohiIADkMHjILj0A526A/bIVuSrJKUFonshUegP/xGEA6I4pWCkKkov7da7wiF3svJmdGjx30eT8np04+ZTPacnOktLXsNhk5NU1tbG1JSrjCb85qb33I6+0ajfq+3Oi/vV7quNDQ8ZjCImZnTNS1aUfEX+Aa8Bn2gHNLhPPSHgXAAfJAQ69w7fPjYAwdWTZjwo759ZwMnTy7dseM348aOzc7K+mjZyoyMbnV1SYLwJEiArj8liptTUmZ2du6R5d5+/xanc4EkbZVlsXv36WPG3Bb7jN3u+lWrHhNFd0JCgt/v7+jomD17QU3Fvleff+TTzCefB74oJvr8y8tKz1Vf+Oe8qyaNGdF/597jG7cdFAVxzsyxxQMu7nlGa7t7xdpdFZUNFotp1owxA/t1/xeDpxVmgf4pvBNayxs/xeGfCpfI6CV8HdDQ2PZP/17f1AYMK+79b0f4p5JPTc3tmRkp/6eYaAyfCR994NEX9h3sBBXq4HJYazbPDoWWZ2YOS0zMr6zcYDA4RFHNz5/Z2LgjIUHu02dSScm6QCCYnl6kKqWaqqqRyMwJEzbs2pVqMIzo2vWDQ4ecWUNmznxEVSNr1vxc1xueeOJXmZlZwLp1a/74x6ctlr7RqKezMyaQlApFcN5mU/3+03HNqcGwHWqgC3igAM5BAiSCGc5DAeTBbnBAtdV6TzS6Lxo9AePhAKRAEtwPdgBK4VfxWOkNcBDq4QrIgS1wGsbCeRgNH3y8h+cxeAYmQn/4de/eN/bpc3tsw5kzfy0tPQQX9AoqZflEVtZbQDh8tKXlj3DvRapML1qt44zGmZrW6PPdr2kLoX9800FYClMhAGdhpCDMi23Q9b/CQZgR37NJFA+bzfdIUrGmNQYCj+j6rRc1mlpitwczMx+MRhubmn6Rnj7X6Zzyt4ek7jft7X6456IzPg2Xg6WwUA4E6hobN8JdcC3sg5/Z7XfabDcCEHG7n1CUQ2lp01pb13XpsrCubmkkIsmyUVGaExIKPJ7T3bqNbW8vMxrNvXv33rNni67nQpOuRy2WdJstr1u3hSdP/txsTk1I6FtTs9Lh6O/1nlLVuXAazsA0s/lgKDQMKqEBEsEDl8MWMMHdcACaoRz8MCaeF7EHGqE3pMJOGAJVYIZG6BuPLw6BMOyHabAqXj4/FA5BNoyC7WCFKLTFe9BXwEBoNhiyo9Hz8PN4d1bgPXhRFKfq+m5RdOblTe/W7W+PgaIESkuf8niOGI1JmZkZPXuOqag4dObMtqSkSR7PnpSUEZ2ddXl5vzYYMgBd1xobn/T7t2dmXl5Xtwmi0B+C0ASF4IcySIEIOGP5HkbjepPJPHLkvT16TL3wnW1qOrllyy8yMqz19W0+X7EgPHrxN1rXP4TfSZJD19XExOm6rkejG0ePvq1Pn6mAIPwt4UQQOHp06YEDbyYkJMycOe/48f03XjPyYv2NLwO+wJhoKBQJhcNAVFHv+/Ef/vjUdw4eObN155Fbb7wSePrP7187a8KUCf9fke3PrywryMvs16eb3x/8/fPv33Pb3H/BR9MK0z81Gf3vmqF8hhDaLpHRS/iKo6Gxbfp138/OTM3J+vv1oINHS7MzU3/x4B3/CR/94SPPt7W7L/DRpub2+37yx2HFvX/wP0dMv8aIrdd/Gkpa39Ay/sonYUC8S7vJYrkGjKHQsqSkbI+nOj//7tbWtaFQpdPZR5I8giB0drr69ZvvclWEAsevv+aadRs3VlRWZqWnJ4ni6YaGPv3nTpjw7Qvjb936dGnp6iee+OWpUydffPGFrKzJiYk9m5u3eTztADjACift9sGdnQdhDmyGLBBAgiawQDKcg0TohJ7QCOnQB3Q4BpVW692CYFOUk+HwOrDAaPguAIG4F154Dg7DDWCDQ3AM8qEZRkAiHAUj3AhdL8oQjUInvGY01hQX35+WNhSEUKitrm5zaekZGPTxG9kpy6UmU57f74W58YxP4j/3Go2+SKQcFkA6RC9KNnXBq9AJ3xWEIhCgVdd3wVEYHh88NkgEdhsMOdGo76IswwtnOWWxHBIET3b2N0ymLoIgRKPtbvfW5mYvLIyPE7shrfAinOvZ8xZZTggEamtqlmnaINjvdD5gscy6+Kp8vle83r9aLFkFBQuApqYNbvcZWc5SlJqiopnJyd0OHHht9OjLCgv7dHa6Nm5c7vEYdL09N3f6gAEPAMFgo8WSBdTVrTtx4nFd12Ax2OAcbIQJcBxkmAynIBDX5N8LleCE3iBDOdTAMGiCJugHpyEbKqEnNIAKIRgGViiDJiiGGmiFQaBBPYyGaDw9VIIkaIMhcARU6AuFsF4QcnX9mxex/FC849c7slzTrdudGRmTL9xzQQCElpat58493a/fxNzcIqCtrerw4ZWKErZY+uXl/UaSEjXNf+FzdLtXNTf/AWQYD8mwHUyQEx+zHDogCcZCFRydOPHHffpcqes66LquC4Kg63og0L527YOtrR5B+DkUxpnN337q+ivwZpcud3R0tAQC641Ge0KC46qrHnc6L6jMoqrRDz74bn39qVmz5pWXn5k0pse9d87jy4Qvyer8cy8vzclKm3P52F//6Z3xowcNH9wHCARDC7/x2Iev/kIUhX88ZMW63V5vYOF1U/9xUwyphcmf0qu28o5POcInxqWc0Uv4yiM7K/UXP7mjoant7lvnvvzMj2P2i5/cMbS493/ORIFfPXJ3vz7drr/tZ+cq6t7+cON1tz4M3HjdtM/Z/S8pPpMS+5HDcqAdcmASRDWtUxSTrdYbPR5F16NAWtrldvvwtrbDfr9LUaT+/W+QJIOihBRVBWZMnTp82LDymppqd2D46LtGj749EglEo8GYjRhx86hRd//oRz9+6aWX8vKucjoHaFokGvWOGRErowmDCW7o7IwVqsdkuj3girUzBQNUQBgGQj6cAgk6YCv4YTAQCDyvKKdluZ/ZfCUoF+VUWeMmQCvIsCyudn45NMAEsMJxCEIdnLgoQ9QKDtgBpZHIyGPHfuP3NxgMCZJkKi19FdSPK4AaQVGU84HAOjgBLrDHe8QngAH2Kko1lML++Mj2+NYNklSbktIbfg51YAWjKL4KrosGN4ABolCjKBthP1RdNH7M5wOaVqlpnqamVyTJJkkOUbQ0N7/y8ddH7G7YICCKWnX1+z5fldGY0qPHHZJUYjQOMBoH6npE18MxA0ymkbKcqml+l+uoqgbT08fn589VlJqBA69JSel+7txWhyOrpORQbW2FyWS54op5GRmS1ZqRmztT06KaFjWZUjUtqmmR7OxJubmx0q4zEIACWAxHwAKToAZOQCOchxAMgSnQBiEACmEoHIUWKIIQqFAFJhCgL2SCDgJo0AN6wxFog2GQDM0gQwQMMByywQ2dMBSawQ0DoW9Mh1XXS6E23oHWAkngjDkmiraGhmXRaKfBYDcY7AZDoiwnCoJUW/t+auqQ06d3nzq1BUhN7TJmzEJBkDTNpyitgCja4mbV9TDYoBtkwibwQhc4He96XwgKDIXyjIyQLCdt3/706tU/AARBFEVJEES3u/q99272eDqgQNdv0/Xl8YfEBCZd/yN8JAhGj0ft7FyektLH6eypaeaXX76xrGxb7CEIhbyvvLIoHBZ1XREJfdmY6CfL+/88mGhZee2Zs9VzLh8L3HD1lKf//P7Pnnr5id+9cff3fxsOR6prm/7xkJq65g9XbLty+uh/OfBXuJr+UjvQS/Z1sDkzx7z8zAO33vvk8jU7QW9obH3u5aXL1+x65ZkHhhX3+s/H+d4986ZPGv7Q4y8+//Kya2aNf++vj2RmJH/hV/cFWm52at1/2TX0Ynvzhe9fO9sMlWADSzjcEg6vBqPJNFHTIjU1z4VCdQ7H0JSUKbou9ehxOeg1Nbtqag75/IHn//rXhsbGocXFg/r3b3W3RSJ+o9FqNFoNBkvMrNak2toj4bCcljbKas0NBGqrqt41mezzr5n21ovfvO+uUdAYj0oKcAC8MAUSoQO8MCqeBRiBLvH+TG2QCccg9j4YFQ6vjUZjWuU2OArfBXd8/jwD90IyqA7HCFgPNSDGg6/7IQJpkjROEHbBIxf19X4O9gvCc4LwcDh8zbZtt9fXbwagH5TBhxe9FU7CEhgJSmJiATxyke5pC9wvil0Mhj8ajX8RhFhxUjS+9Wmz+Wzfvs916/aznJyrdf12Xd8EGI0FsuyB12JdUgFogNcslmJdj6alTYTfwYr4JgWeSEwM9Or15969XzYYEktL54dC5ZFIk9U6VBTXwE8hEt+5Ar6Tl5cD6qBB/Wtqlvh85yXJrGlhVdVbW2+JRA4Jgilm4fC+9vZvJSX16t49Nxo50tS0ARBFoyQZnM7ckpJlJpN13rw/Dhx44/r1H507d8pstmqalpDQfe/eu2trV4qiIWYgHjz4w4aGEkEwmUyxFlMesIIC3aAadsPdcG+8nNwIGpjgFJwGDRLBCDkQgrPQD4ZBOB7rtYEEB6ECBEiHZCiApHiXVBPsgWoQoDvo0B0a4g9JNqyNdy4YCb+AVy96/74Nz0JfkylX160HDixqadkW2xAOtx84cLPT2X3o0F+NHfuyzyfu2/deIOD2+12y7DQYnJWVt3o8/39Vs7X1Ly0tr0E2pMEKSIMQ6BCCamiBIIjgczjazWaHwZCekXFLY2P1O+8saGs7BzQ3n16x4tsWyzBFcUMuzIZndf1h0AFd/7nJtAW6yXKGy/VyUdENnZ01FktqQcH03NzJy5Y9tHPnX3y+1pdfvlEQbDZbhsPuMEqee++87gufwS5YXUNLbnZqbnbqf3WU02H7zD1RVeWpp9/8yfduvDDHvvnnh+ZfPWnOzDF//t33xwzvHwqH/+6Qppb2nz7x0pMPf8Nht/7LwbVPbV/YB3QpMnoJXxMMK+798jMPPPTES8+9vOyWe5/Kzkpdv+Q32f+wcP+v0dDY1uHqjP1+xbRRn4ObXz18yvjoU4988767BkAJiJCoKFow+E6MbKnqwMbGd32+06Jo0DRV17WysrWNjaedzss1Te/Xb8g7S5acOXtWlmWjsWjfvvc++uj7F4YNBFxvvnlrWdlpyFSUQCjUVF39YWrqQFm2ACOGFN1757ztqx7My9kBjSBAJmyO9xBKgNXxvp3ALqiCDMiCFMgFB+wGAZJhSiRyTFHOgwATIAjfglJYAw9AYUzOyWrtlZJyFeyBetDhEKRB7GUsGAyLBSEA90M1PAlNgvA89AUE4VZd/+mBAz+rqPgIRFgAOrwJHXAQNsNkSAEpKWlCSsoMeA6Wwzl4SJKmGwyPAILQ3Wh8WRQz4H6ohcfs9mifPs+bzV2A7OxbCwsfFoSf6/oHgiAnJy+0WNLhFaiCE/Cu2VxsMBQACQn9srMXiOJS+AN0wP1JSWk9ejwjy0miaO7a9RfJydPLym71+48Kgikl5TaDwQ33QSVsg4eysnonJOQYDMb+/YdNmza3uXlLc/M2XVdleawsX9bRcb/f/w7g97/b0fH9rKwpqhq0mM2LFy/OzKSy8k1VDQqCfOrU6oyMntde+7TJlDho0NXz5j1z8uTJXbs2BIMBWU7My7vm9Ok/njr1OyAc7ti2bZ7L1WI0DhZFm8Mx12othA/gbJyUH4YfwEjoA4+CFdbEq/4nggAHwQsRkKEUhkJf6A5TwQUVEAEj9IOOuLRCBBJhN1jAEG+z5IKT8WKmCJRBLohwEMxQBGYohDmwDL4DnfASvApXQ7ssO1NSpiclTT558qHKyr8GAjUHDixKTx8+aNDPAKs1a8SIP9jto3fufN3jaTQYUpOTpyQnT29oeKyl5XmgufmPbW1vwTxogApIhZz4QzgR8gWhHZohyWDwer3hjo4qgyFFkqzp6QsUJfWDD249duydFSvuk6QeJlOBpoUgGfLgRjit6wt0/UHYFg4Ph85otK5nz6tUNRoKuYzGBF3XkpN79+1705Ejy15//Q6TKb2gYKrbfX7R/Gm/ePCuTzxpfOb4ZEnwn1Pt/MtvrZk2aVhWRsqFv4ii2KdnQVHvrhaz6fTZqq75WRfv3+Hq/NGjf370gVuzM1P+YbC/gxrvTf/J7AvVGW0rX/8Fnv4SLuGzxXMvL3v+5WXZmanrl/zmwh8bGtuee3nZwaOlsX/+4sHb/+nCfUNj2y33PgW88swDwPTrfnD3rVctuGbK/4rjX3Z8ypKm/YdPLbzj95AB+ZAgCLt1vRkWQwNsTEoaEwyetNnSfL5IUtJsVXV5vR8uXvzN8+dLN29ePXTw4OMlfqt1is/3YXJywty5v/b7Oz788LvBYCpcBgeSkmSX63hBwczExIKWlsOL5/e8c/Hc2HnrG1p/9Oiz+w6eycsd8uafb/nRo8/uO6iDFzLhIPSBUzAGDscIH8QaadbDTFgOYyALVDgAfhgHIpyGc6DDOOgKdbA1I+MmWU5VlA6Xa10kEksZHAEuWCdJhZI0BnRVPaiq++FaQbgRpIuSMgVo0PUnwAxjQIKtcBqAKyEbSkTxcHb2bYIgRyJt7e2rFSUiy3eL4pR4BiogCIKgqttV9fnMzKuyshbGRr5QWRKJtFZUPKrr5oSEibquBwIH/P7dgNU63WjsFQ6fCIV25uV9QxRNuh5uaVkbCnVkZl6bnj5P1y/koSIIgs93sq7uN0ZjkcUyGPD5tgQCJ0ApKJiUllbU0nKio+PoddfdJgh4vZ5Nm1a4XG0m03cFQdK0ukhkmck0OBzek50902rNb23d2b9/0sgRI4Bt27cfOnTIbHb07j1l8uTvXfzw+P0d69c/3tBwLDPzKoslV1E66+qWGY3OUKhF0zItlhnR6BlNK3U6rwPC4TKPZzVokA53QbePP4nvwQbIiAfFT0EFyKDDSLhYpjEC++PqVz0AqABPPEYuQWG8i1VPSIC9YIcAZIMBzoARcmEMnIIGmBFfitwY60QFM8AAG1NSxlutPUCIRls7OtZDpGvX+QUFc+KPByDoerS9/URp6bOynOd0jgWi0fbW1qWSlBIO18FcCMFy6AXdDYaT0WgjjIdGKIFUUZQlKd9gGAlKKPSe0WhPSBhmNKaBpKre5ubX7PYRNtvA9vY1kUgrdIVBYAYRDsA5GAl1UNWt22SjMbG6enU0GgWSkory86cAXm9NefmKgQPvKCv7SFUDJbtf+sRzxWeOLxUTrahqeOoPb73wux/Ev5js2nciOzO1W5ds4K9vru5we+//1vwL+3t9ge/85JkffntBr+55/3bw1EIz6J/CO6GtPPQpDv9UuBQZvYSvD557ednyNbvuvvWqYcW9Y9QzRkMvBEpfeeaBOTPH3nrvU8vX7PrHwx964iXglWceyM5Kzc5KXf/Bb3btO/GbP737v30ZX0p8yvjoiCFFb734ve2rvjNyWCO06vplkAAh6ApXu1xHFCUUDBqSkmaBFg5XR6ORYDDQrVuPuXMXnjh5StcVQTAnJi50uw2vvnrju+/eHQzmwwSQQfB4znTvfr3T2Ssc9rjdlQP7/39tlJzstDdfeOTa2ePf/PMt8d9jBadZMAEqATDDWPDHg2QxLadY1qAd9oAOXSAER6EV+kIGFEEXKBOEc6A3N7/d2bnTYEh1OC4DAwyFWngfLKLYFo3+VdfbJWkE6PC2rq/6eAqprutPW62BjIwOWAqdMBGcMAHyYJ/ReLqw8Ft1dX/y+U6YTJlO51ij0aiqH4JHEBIEIUkQkgTBqWk1ivInUYw2Nr7e0rJMkmySZBVFiyhagMrKXxiNNpvN3tHxhqa5bbZRJlNPo7GX0dg7FNoPR2bPfrC29nmP56AoWlNSJoGvufktn++ELCfJslOWHbLsAKGp6Q2DQdG0Q52da0BPSJhkMhVkZhanp/dvaNjf0nKsb995r776dGVlmcORPHXqHFGUIpEXNa1aFNNNplvD4UP5+dclJvZqadkRDNbv3394w4YNwITx40eNGhUO+4xGy989PDZbMojhcLipabPXe04QDHl58xQlqGmZFsu0aLQkFFofiVg8nmWa5jUau6SkLBYEI6RD+j88iTFu2gHlEIYeMAEU6Ac5F2XOKSBC/3hCrRc06AqFEAY79II68EFRvHAtAlawQA/oAj3BDqPhWFxo7F2oBwGmQRSmgAxrYHZ7+8m2tpWaFjYaMxyOsYpCRcXbXm9FLH/UYEg0GBKMxqSGho3hsDscLm1rW6FpYYMhJTv79nC4Aq4DP2wAEbrD3mjUDQnQAaVwM3xT0zIU5YyutwiCVdM8ut69re19n++4KBpF0QSazTa4tfV9VU2BVAjAUmgDEyhgh8ZYyN9sdpSWfjB06GUOR/qUKbcqSnNp6duhUJvXW2uzZVRUrDWZLDlZSZ94ovjM8aViosDLb6958PuLLjBRIDsz9ffPv7/o7sdvuOPRDrf3e3dfBzS1dHzrh08Dj//ujeq65sd/+/qiux9fdPfj2/cc+5fDf4VzRi9FRi/ha4Lla3Y99/KyGJWM/aWhse2hJ17Kzkz9xYO3X7xnQ2Pb9Ot+8PIzD/xnkk+Py7L0u19863Nx+quGT19iDzzwyLNLVrjAAKXQE4ZBoyCszcy8R9dVr3dHWppcVXUIGDHisuLi4WfPnjp4YEc4kma1XiEIks+3VFEciYlTvd7WhIQjRmOrotgLCi7v7KyqrV2raUVvvXjtiCFF/8KB/YdPLbzjzzAEdFgF+VAAZjgFCkyEAOyDbGiGobAT+sNRGAQHoB80QjIkwBFJGqeqW2EhrLFY0my2QW1tK2E+vAJT4JzV2lNV28PhE7J8haKshmthOYwVhEcAqNX1b9rt6aJozM62BIO+ysrzMAN2wBCottnUoqInLZYcl+vQmTOPmM1djcbMYPCk0ehwu88ZDL8QxVGAqi5TlN/l5s6qr18+fPgNR48uT0gYUVj4GBAON5w9e5/TWVRU9AhQXv58Tc17dvsVodAJXU8ThIjN1nbddU+kpXVraDi9dOmj0ajD4Rjc3PxBdva4mpqNubnfTk+/HgiHa86e/WZGRnZnZ3Nx8ZiysmPt7SG7/XKvd3NqandV7QiH22fMeDI5uev585s3b35swICh+fnd1q5dWlg47MyZ7QbDNEkaEAr9plu325qaNmhaWBCEgoLh9fWH7Hbx8hkzDh85Ulur+3y1ycnZc+f+ymy2A6FQ5wcf3Of3y37/6R49pp07tyE9/bLk5OFVVa/HEiRCoT3wMxgGvxbFPQ7HlYJg6uh4C/KgDe6FC/85WQXbIBFMUA1JUAw+2AVGsMJlcSUBoCW+swUaIRNyQYGjMAKq413pJ8Ee6AanYRJsgwzoD2dBgzRwgQLZYIFtMBz6wSswF5bDbXAdaPBbSdqTknJFOFwbCLRKUnYotL2o6HtdulwT8+bAge93dlYoir9bt9ktLYd8vqaUlCtkObGh4SW4CV6HGXAGIqCCBGZohoWQBwLosBvWm0yTw+HNNtv3NK05FFpuNufYbANcrvWy7FCUVFBUVYeBcBYOwWg4D4lQC+NkeQ8wceKM5uZ6rzcycOAU4PjxTVVVJU5noaKErFZnfv5Qo3joted/9mmmiM8KXzYm+p9D1/XmVldm+n9XHZ9a+GnDi23lX5ju/aXI6CV8TTBn5tiLk0RjTHRoce+/Y6JAdlbqnMvH/tPg6D/i9ecfTE1xXH/bI5+tt19RfPoSe+CpR775q0fHghucebl1sAUMoOm66nav9/uP2e3pQJ8+Cw4fPrRjx0ZZlmWD4do5Q4PBd1W1QxDMoHq9LkFY53AEcnIKdF31+Wqrq1dp2vh4s5x/hRFDit57+VuwC4LxZdB90AlmkCAC26AIfgKTYRUUQymIcBi6Q1UsIgstMFVVYxLWBpgfDEbc7s1ghldhCuTGVs2s1kk221RFWQ6AGW6GE7p+C2zW9bsdjuz09Mm6romiOGLEjCFDxsAy0KElJSW1uPgFiyUHSEoaOnjwSxD2+8+IopSZOT0zc1w0+gNV/UBRXlOUX2dlTbXZCnRdt9mcY8cu1rQzp04t8vtPnTp1S3r6uBgTBQoL7+7V6wcezzJdVwUhnJoaXbz4+bS0bkB2dt/bb/9rTk5yW9smUTSlpAzs0eP6xsYXKisfdbu3nj17T2pql549L1PViMFgnDTp2i5dMjo63tC0qK57ITp37vPJyV2B7t0nX3PNS1VVTSdOHDIYzN26DRs6dK6mbYlGtwGtrTslydi16zxVDRsMloEDF6pq8htvvtnZ2SnLlj59bgkGw6++urChocTlqnvllYU+n5iYOFQQhIyMAQMG3OB2H25sXKdpEV2PhELH4TcwDID7NW2+y/VONNoAVpgGhfA4bAXgfVgC/cEDJhgHUdgGQTDCINBhNcT6j5+HLXH2aYTe0AHnIAIiNEAHFIIZDkMOOECGnTANUmA/+CAD2qAKAmCHAXANlMBOMMEauBeuA0CE+1V1YUvLe4rSKYpOk2mYzXbt6dN/Onr0EUUJbN9+o9dbk5V1tar6Taakrl3nZGQMbml5NxisADu8DleDB9ygQk8IggqLIAMi4AU/DIKbwuFyUXSCKIpZVuvtkYjqcq0DXVFSZHmUrrfEVWx7wVQ4Ci6og/HQoijByy6bIgjC6dNHw+GAx9OiaerAgZMvu2y+x1NhtSb07DkpFCiZM3P8J5gWPnP8t0zU4/Xz5WCigCAI/y0TBb7SkVHxgiTdJbtkXyc7eLS0vrHtm7de9U+3AjlZqf/hUL9+5O4Zk4Zff9sj5yvqvvDr+jJYXnZafUPrpxnhmlkT3n7xxhuuKdq24tm3X1wIe3Rd7ezcYjYPcjhmnzixFjCbk/r1W1RV1Xj27ElZkpatWpWd3U2SdoiiFTCZNvfpM8Xl8nZ2ulU1XFm5WpZvgFyQXK7Of332+obWoYN67Vj15Khh7QB0h16wH4wgwgaYCncDMBu+C7ugJ5jiIbF0aIZmaIPW+MrvCfDDVEXpBQGYDV2gBOpDoSORyDmDoavTGdOH7wAb3AhOXX84OblnevqkYLDO6y1tb290u9sKCwfOmHGz0RjMzi7s1+/XkvT/l63N5szi4hdstjxNC2ta2Okc0KXLAviLpv01N3duQkL39vYDgN/vMhgsI0YszM5OP3Pmrp497yssvFPTwpoW0bSopilZWZcPH/66JCldujhuueUFqzXpwilMpoTrrnuqd+/BgiAoSjAhIbdv31ugurLy4by8HgMGjG9uPhcIeGJirsOGTR0/framtaSmFsye/QeDwaooEVWNqqqSnNx13rxXJClPlo2KEklP7zpu3CKHo0kQJFk25OVd6fNVRSIeRQkDhYVTu3adXl5eHqs/69JldkJC93feueu99+4RhJyUlMsjkSZZtmiaarfnDB58i667VFWLRHzwSyiAILjADdPhMa+3CmKUYgRcDm/CS7AexoIZgvH/dQyFVDgQb0/fC9JgM5TAgXgdWxgMYIGYUGsZGKATiiECEciFHlAHMkyBMJy9qI5kFFwPnRAAFXJgMQggwaMwOV4RFQUF5sKf/f5mQbCCKsv5CQm3tLSc27r1OlXVsrOv7+wsEQRJVUOgp6UN6d59vsezA4IwB0xwMs6by8ELNdAAJjDGhbps4BKEJk1LCAZf17RWXddMpisgGXINhvHR6FJNa4W9cAiA9HhGwTioh9qsrDy7PWnjxqW9et3rdF6+devrFRVHQUhKytJ1NTd3uKt92+Rx3a6ZNeELn6PqG1rzstP+8/07vf4uuRlJjoQv3PNPY5+ejH6Bzl+KjF7C1xPL1+66aubYf7qpvrHt4NHS/1B8NIbv3TPvx99Z+ODjL52rqPuMHPxq49PHR0cMKYoFrUcMKdqx6qf5udmD+plV1W0w5KWm3i0IssdTKcvWoqJF0Wia29NZ2H1St26jBgyYqaqlglCTnt7FYkkrKrrJ55MDgQ6YqygJ0JyfWz2g77/qmHchXpKTnfbmCz8dNawfhKELjICyeDzpCvCBH/wwAH4ObWCDvnAl1IEISZABNfFEwFxYBW5IBQFSYDu0g0PTevv9y8PhEkGwgmYw7IcPYumGgiAmJw/t7Cytr1/Wo8d3bbYr1617tarqlNOZZjCY2tq2Hz16l6L4LjgfDrcfPrxYVRszMhLLyp7xeE6bzdmJib0SErpYrbmtrTtDobPAmTPrjx1brqqR7Ox+us6ZM483NKwWRZMoGkXRIIqy13v+yJFvCoLQ2lr24ouLPZ6LdQ31d9/9QW3tSaczsaTk2ZaWQ7KckJIyQJZN3bqNqKw8ePbs9ilTftXSEl2//i2Ppz07u5vBYDx1au369Q/KskmWjZJkkCRZFKVNmx6trj4jigkbNvypsfGszZbcp894QZAyMye63adqa1fBT86cKT99+iNVDaem9rTZ0pua9tXUrAeysy/LzByhKLakpIle7+GOjs26vnDv3qdbWk7JsnnAgBs0zafrZy5S7kwCJzihHKohDKvBD9lwPeyBCWCCndAzXpQD9IUuEIA6iEAWDIUS6ArJUAkR6IAOUCAPUsEIvaANyiAJ8uEIeCEJdNgG18BPIRuaIApGiIpiC7wODWCI1fDBg7A7ThYNIEMDPACRSKTC53tP01yimGixTI5EPJmZszs6dnV0lOr642fOfFRXt0UQxISE3MTELtAVUmEZGCAdTsdYhdM5VxDWwoexzzS+TL/KYOgPGZqWEQy+oarnBcGg652i2DUSeVvTckCDq6EtrlTqB0Oc2nZLTc1ctuz1/v1/3KXLNV27zhs58k8VFaWHD6/p7GwDUVfLf/Ldq78MwqKfICZakJvx+fnzv4ivcmT0Czz3JVzC54fszNT6f9YjtL6x7ZZ7n7pq5tgYGa1vbIvZvx1w4tjixx+8/ZZ7n7rER2P49Hz0AnKy07au+MMbf/7xbQudweBhUbTqut7ZqZaVfagoAaezO4iZmb18vrZjx5YVFc2BYEpKSmXlOsBuLwAbJMCZMSMat674Q87//B76x7fUmy888p27cuF0vPdSJ+wE68cLjLZBqyxrsAyMsCg+a0+EdKgGIA9mwGoIgQTHwQtV8T2vCAYP+f3rQU9JmWW12uDNmBp5NOppadkyYMAvc3Lm5OfPHzDgl4cP7zx+fKeua6mpEzQtfOjQYq+3FPD5zh06dJPZbLFaM0RRnjhxdnPz+ra2XbqugKW5eXM4XDFq1GxBEGbOXGww6Hv3vqEoYUGQEhKuPXfumbKyp2OX3Ni45ujRb6akFOu62qvXcIvF9MILN1ZW/i2k+vzzC9vbG9LSehgMhunT57e1Haip2aBpEVk2NTaeqa8/e/nlz+bmjpk06cns7Mnr179ZV3deVVWn8+rGxtp3373R7a4BFCW8YsV91dUlRmMXSTJ36zbz2LG1ZWW7o9GQKMqBQENDw074FUyDZzs6eh858lpnZ10k4svNnRkMtpWVvR0OuxQlKEkmn++4x3PCYHhGkhbL8mNlZduqq3dqWkTXNZgIj8JbF32eL8D70A/ywApLoDkuoGiGXdAProRbwQVHQQU/ZEIblAPxYmQHnIu1ZYceUBVvbRAFA7ghCNlghkMQhQRwwDpYDFMgBb4P/WAV1IEgy3MkqRiWQAm0ggPGwK/gQtX5WfgW9IdOg2EGpPl8b0SjZzXNLUkWj+eo290IT8Mo+Etbm3T+/LvhsCsa9UIBvArDoRM84BDFCYJgNRoLU1JukeVGeBbaYRust1oXqmojJMFlMDUcXh+JbNc0r6qe1bR0yAYHJMIccMAacIMNjsECqKqrqywu/nle3hUxj1NSiseOfU1RMg4cWG4yJfQqNP/rXO3/HfwfZqKA9umY6BeWMMolMnoJX1fcc+tVy9fuuiDnFMOyNbtiTPSeW6+qjxfaP/TES9Ov+8G0a3/wdzv/I4YV917/wW9uufeptz/c9Hn6/pVBjI9+VpQUuPfOeY/8cFhn5xpBkGTZ7rSHSkvfFwRR17VQyNvStP3WBePb28/ruq5p+qSxeadOvSeKEmhQ+Z27cl7/l2UT/9Nb6t4757394mI4CAIkQB38ABrj238nyyegvyDIRmMKLIF6MEAhbAY//B4eg02gw3zYDzrIMAGmgR90SIE5kUhsTCE5+QqHYyi8BzQ3bxwy5PnU1L9F8VNTxw4d+mJNTZuqKoIgZmXNtlpzjh79Rn39h8eO3ZOUVJidfZmmqZIkdenSc9asm8LhUkUJ6LrfbA5Mm3abriNJkiiKl112VW5ut7173xIEg8HQxW5f3Ni47dChO2pq3jlz5vGMjDFOZx9dj8qyYejQGUVFo99667uHDn34wgs3yrK5f/85ihKRZWN6eu7s2bdAa0vLYVk2NDZWzpz5XGpq35irQ4bcPXLk/Tt2LFPVqCCYkpIWBIOJ7723uKpq11tvXd/S0pyUdIOuh2TZnJzcu2/fG2tqztTWnhQEubp6J/wRRsTv8I8ikZtOnHhX06KSZOnWbaHRmFpa+kYk4gXJ4yk3GP4kigMBUZxoNL5YV9d+9uwakKAIFsIH8ENQ4LewHK6MU6jpMBxWQQ1YYDOMgskAZMIdkAy74kqiQ+L/hQiDEyrBAjlggsMwPP7HMCRAGzTEVfElGAIhaIB74k1HY5gPN8AWQbADkjRclq+GXdABidAVZsMa+DZsgR9Cr1i7WkFwGAxTZXlaILBKUeplObGjoxn+EFeeyoDf+nyjz559IxyOUeqRkAGaIBhEcbauVxsMaaAJgi05+SaLJR2ehe0WyzUQ1rQWsMTFAeZHo/WgaZoVJgpCKVji1zUGJsBx0OEGKIMOi2VwevoIVQ2pakjTFE2LSpKpR49bNc1htztnzRj3n3zHP1f832aixAnlJ7YvMjIqtF+qpr+ErykOHi295d6nhhX3HlbcOzszdfnaXfWNbY8/ePuw4t7Pvbxs2ZpdMVZ68c6/+Mnt/9Pi/gXUN7Y98PMX8nMzLlaD+z+OT6lC+nfYf/jUort//5275999y5T6htYf/fz5w8fOjR7e/69//CHw0cptz7z4/tVXTrj3znn1Da0/+cVf9hyo/fadk/7F+uB/IgKw//CpBXf8HmQYBKehDb4Pf4UAXAVVBkNtQsK1odDhYHArJEBXsMH3wQBAC/we+kIz1EMlDIEesB4ikAHjQIBXZdnpdE42GjOj0Y729o+6dFmcn3/Dx9UB9YqKF2tq3rfb+zidQw2GxGjUW1Pzal7e5OTkIre7rL5+q9FoGDhwVEFBD0kSN278SJIsQ4de7na3HD++JRwOJSenDRo0zmpNbG9v2r59jc12uSwXCIIUCGwOh4/l5V2ZmFjY2rqvre1AQUFRz55DrFZ7KBTYuPG1zMyi7t3Ht7WVnz27yWiU+/cflZ/fQxSlEyf2lpefmTr1tykpseQWXdeJ+VxS8saJE68nJEw3mXoJghSN1rlc75vNvRMTp0YilR7PepstOS/vMqs1XRTlmpqtLS2N8EvoeuFi4z8/hOe6dJmbkNAV9M7O8rq6VZI0RRC+IQgJf8uIQ9B1DVDVZ1V1I9wBgApLIQBBmAnAJhgE/UGDJtgEKkyCXrFBQIknqpXBWugNSQDUx2VHk6ErNEENjAJnvAuoAbKgGwRhH2RCP6iA82CGu2ONDC7Cefg9pIlimiSNAEEQpGj0LV3PgQFgBOAwnIQhMAh2Q43BMFEUu4EM/kjkI0FI1bTfxLNgL8a78DxcBpmwDfyieJuu77JYGjIyLquqWm63X24ydQfa2v5iNI4RxcRIZJWiBMAJSTAJzFALG+A2WCrLUau1Z2fn7njJP/CeyTQ+HA6ZTAcjkZAs50mSd8iQx53Ov0VA3e4z+/d/W5LS8/KSf/6jq77YyOj/eSZKSqHnU47QXu74TDz5BLgUGb2Ery1igczYcvzBo6X33HrVhiW/ucBEX3nmgQtMNLbzK8888NATL/3bJfucrNQ3nn+wpq75uw/96XP1/yuEz3DJHhgxpGjLsifvvmUKsczOPz/8+IO3xZgocPWsCVtXPBejnjnZaU88dOcvfzb/XzPRmAjAvz3pjlVPjhoW4xl9oSc8CQa4CgKyXKGq7mi02mQaZLcvEoQIdIUH4kwUSIfvwlEIgQHmwsn4QnAf8MMa6AQUZUBb24fB4HlBkDSNioq3jx//PoiiaIzZmTOP19WtEwRLUpKhtvbNQKDGaEwBEhML2tpKqqvX5+cPLijoffToniNHdhqNZlk2JCYmd3a27dnzYXb2AF3XdD1h8+b3OzqaBUEwGs3h8MZAYANgMHSVZUtiYtempq0+31lJMhiN0pYtbzY3VyckOEVRyMjo09xceurUqrS0QUlJvY8d23/48Haj0SgIiGLX1avvOnt2uSQZJMkoSUZJMu3e/dSxY8s1TQ0ETrrd76uq22DIBcFs7hsOn/V4VkhSD1EsKi19r6XlqCBIoiiBHW6HzfH7FiOFL8DLoFVVbauu/khRgnZ7d1lOiEa3KcpTcf1OC5gFwaqqL6vqBrDC03Ft+evBDTMhAmtAgHPwEfggF3qDAQ5ACMxgimdfhGEniNARV5zNgXywxnsZeCAZUmEXGOLZwH7QwAZAHpyHBgCGwu/g4jWT3fBrmAs/0zSjorwPXjDruk+SBPgAagDIjpfzrwIvJEeju6LRlRAUhESQNc0D8+HYxx/YV+EVkKAA1oJDEBy6vstm6xgx4k99+97Xv//3PJ7lfv9eQNcDgmAPBN7Py5sMNlgEMrwD9dAI6bDOaLTqOgZDSlra9aJ4CnaABqFwWBbFnV27TpCkdLv9akEo2L37zpqa5UBj4+b9++9TlAGSFEiw6peY6JcA6n/Tb+kf7QvOGf3kvUQv2SX7kltOVso9t86559Y5jz94W6xJ/bI1O5et2fXKMz/KyUr5u52HFffKzkw9ePTMfzLyG8//JDXFMe+2R77wa/yS2KfsYv93lvPxFtJXzxr/L/b8F1tjDan/85O++cL9o4a5oQYyQYKB4JakLZmZPTXN4fMtDYV2S1K6IJhgKzz88en7EFRCFQiQDzdA7D82AowBG6wCoCfMcrk2BYOxrMTLXa7aAwcW+f3Vqho8dOjOlpZDZvMC0HJyivr3n9LYuNztPgSEQu1NTbtHjVociQRFUbryypvb29vWrn1P01SzOWH79nf79JmSkJAsScaePafn54/ZunWJ1+sSBEP37jcbDD6v921dV0TR2Ni41e+vGDx4gaapvXoNGTp0yt69y8+ePaBpWjQaPHt2U9++NyqKX5KMgwff7HL51659W1GiomhyOq87cODZfft+B4C2ceP3Kyr2wpWCIDsc80QxuaPjjUikAlQQOzs3GI036rpbFM1JSQsbGo5WVKxRlDAkwiR4DF6J37dfw4cwBSS40euVz59/3e+vU9UQXKZpFZHIQl2PJeaiKE+p6goohkS4CjbDdoiCBhKsgeHgh7HggHehAoKQBCZ4Ac7HT9oEL0E6RKAA6uEURCECBmiOi9vHMoZTwAgWuAyAfeABFXxQB+NAhyKYAx/BCwBsgVfgZrgCzPAtXZ8Yjb6laSchajSONxonwRY4ESOgsBGckAp2mKtpQiTymqZV6boLukEXuA8+ijv/PLwGg8EBKyArdvkOR3DUqGet1iwgL+/KsWNfEoR6j2cFGEKhFV27zlKUAKSBADNhKCwDD2hGo56YOE3TXLKcYjLlZWbeajarsAJUWV4/ePDNPl+zLKcCVuuExMSrT578/bFjPz927DFF6QbO9FTDhNE9P8Ov/39r/9XXHHSP11eQm/5Feft52qcvYPrCnL8UGb2E/1tYvnb34w/elvPPetbXN7Y1NLX9003/FL9+5K4Zk4bNu+3RSyVNMXy28dFPj0+WPPDmC498565BcBYAJT/3wL13TAuHPaDDolDovN+/EgQYBk1wXzww9g78BW6Eh2AqbAALXBNnNp0wEEYDEIICWOD1xgiWDFMCAePBg7fs3Tvf7/9/7Z13nFTl9f/ft0yfnZntfReW3nsHKRaKICqgKBpRYklETTMmavJVE2MsaZbYe8FC7yDSe++wlAW2s3V2ernl98dk+JFEjX0p8349L17MzJ3nnufOLZ89z3PO8Vqtt0AINFGUcnM79+8/2ePZCpSXr+jde7LBYI1GQ6IoGgymUaOmWK3O+vqaEyf29ugxPiOjdUNDGaAo4ezsbl26TNq1a60kmSTJ3LLlpKSk1EBgmSCI4O3bd2ok4tM0RZIMRUWdL7/8hqNHt2uaevDg0vbtrzOZnKoaEUWDJJk6dZooy+nHjx8QBKPRWJiaOvXo0XXz50+bOXNSRUUJTANFEIyA3T7Sar3E7Z4NuN1zjcZJgpCq6yFBMBkM2ampt3m9AZ+vCkzQBq6DmfAz+D18BuMgGk84P1pRepw48aGmRcEEI3XdEIlM1bS1ivKwqq6AK8EPNmgNP4ITsBAsMB8GQi5EwQpDYSAshCYwQzfoAB/CJtgP70IGuECArTAMusFuCIET1HgseQCyoUM8IZQAPSELtoAAJ+EycIMFRMiFKVAKD8IHcDcMP+vMuhruVZRVgmAUBLMsdzGZpgjCESiDEFhgKDRBEgBDdb1rJDIzXp+2FQyCF+Ax+BvMhJHggZAgZENbaMrN7dKnz98kyaSqIUUJqGrQbm8xaNBrGRntIJKfP1KSzJWVG8ALRyAEnWEqnDSbXQ7HeI9nMWhNTWsjkWrQUlLGOp1dZNnUtevk+vpj1dU7I5GjgcAmTQvIco7LdXtV1UZN6w4FsPG6q4ffc8ek73wF+Vck4RM9i/N4zWhCjCa4uNi263BO1ufLzXlL1scWmH713n7x0+sef2jarfc8mdCjMc4dPfptlrHec8ekD16dBpYbJjhXzX/hnjsm/Xr6QNAhBW6JRKK6HrtrjwQr/BxehgVwd7zieWu4FOZBFFSwwUqojqcT3wobIAUGCYIiirFK5T00rYWqmk2mcapapWlLIbp+/dsnT25PTs4bOPAmYMCAqQaDZc+eOfX19ceOHV+9ek4o5B8wYJTVmlRY2CctreWRI2urqk4Kgmnjxudqag4lJxe2ajUiFAqdOjU7GvVkZg7OyOhjMpk7dbqyqaly9+4FomiaO/elkpL96em5V155q67rnTrdZDI5jxyZ7XannzpVcejQPE2LtG59RVJSbih0KBjcBUaXa5LXG/L5rHAdnIBFIDY1faAotUZjG6dzKohG4xRBcESjH+l6a7d7ViCwRRBMTudVimKAUigFO9wI9bADroQgbAEJVoEHOsBUXVchCEA/GBiNPqyq22AseOE4NMFpcMGtkAEhGAQtYT0IsA/8UAQ3QW18DjAfBsNmmAvZ0BIqQYJL49FLCgRAg/ZwCQQhG9rBfqiFYjgCCrSA3mCEYVANm6E3vBnPMzUOQvGctf9BOtgFwRyJLNa0elFMNptvEUUV8mB4vArDFtgDUWgJV4MAp0GBVBgFe2AxDAc37IcMXW8PG6GxomLNzp0PgyhJZlm2SpJFksxHj75eWbnBYslISkovKZmtqj+C+2ELbAADOEEzm7s1NX1itYpJSck5OUm1tTNCoZOiaNK0oN2e6fPV1tRsdzhcLte4aPSwz7cEFEGwaFosq/+n4OzepU1seN9JUYyvRUKJ/jvnc2qnHzivaaIlWvO23Ky07bsO/8ebsRL28xZvePzBabGX8xavj7X/2WHfHu3feu6BW+95MpESP9ZiKfG/ZVb8b9m+bsrr/279e3Vau/Cpxx+6LvZywrhhaxc+mJ+7EOrhWl2XYDdUQDfoDcthArSIz/NGoAB+HJ+Xd0BP2BKfI24Be2EB6IIgJSX1gWVQHa/qFA6F5uTldQQ9Ofn64uItBw6sEAQJEEV5586Po9EUgyElJaVjKGRevPjd2toKTdNEUdqzZ0FtbUVqai9JMhUVjT9yZNnJk+s1TRHF5FBILimZEYk0aZoiinIw6Nm3b3ZKSm9NC3ftOn7r1k/37FkXex5Ikvnw4Y9Cod4Gw5NG4xuNjS13737X7z+tqlGbrY/fv9HvXyuKFkEQwQVVME+WB4qiQ5LSPJ4PFaUqNl8sCLZI5BNN6wK/hMd9viMez1JBMOp6CDrBAjgIhvhCTAVWQAuwQyPMBS+IIMB2WAkhyANjPIHRcnBCFrwLOwDIBDvkw/J4as9yWABusIMOdtgIfkiGfHBACygFGSxggrWQDWboCOXQEMsPCg7YCQ7QYRzUw14QIQRWcMNOuANugHGwAPaAEQLQC54/a2IdOAx/ggJZzhZFPRz+SNOqBcGi602QB59CEO6BX0AFbIgFMIERVNgIPpDBCBkQht1ggSxYBXmgStItDQ0Na9fe5HYfjO1v//5nTp5cYDC0NZtdBw68qmnTYRL0ghfBBh9BPSjB4A673Waz5TqdGd27X9anz2i3e0lT09pIpMZmSz9xYsW1105uaKiT5bS0tFtl2ex2vx2NngQzrISWEMnLzvjvO8A5eJnHMts3433p+27fXow2p/0Nx5d+f1I3QYJzjW27Dk+958m3nnvgjAe0oqruoT+9XllV9+ZzDwBzl6yft3hDnx7tc7JTt+0qrqyqe/yhaf/TXVpRVXfzT/80YdwlUyZc9r2P4Tzhuw2x/+o75X8Fzn+bzh949OVN2wphFXSALdAXUmAVRGEojI9v64WXYk9M6Au5UA+bIQwmGAwBOCqKaFpLGAivQltJ8qhqBDrApyCkpd0Ogts9x+Wy1tefcjiyo9F0h2Ow270sLa1FWlr3mpptlZVr7HZnSkpRQ4O7sPDqxsb9Pt/xVq2uDYVqS0rm2WypPp/JZhsTCm0JBtenpvYSBHdd3bGsrNEWS/bJk29feunPfb66vXvnpaWll5aesNszgsERsnzXmSEryhua9qbZ7DSZBhmN+Y2NcwTBoOtEo0WwRpav0XWfKB6z2yeEw3sDgeVW67BgcJcgWDVtIJxJN+GDFwyGSkVp0PWxIMFCyAc/uGAfDIYI1MFQ2AKH4QpYCdfBejgNg2E1DIflMAL2Q3uwwSpoDVlwEGRQIRuOwUA4BCdhOKyBIbAhrkQbwBfP5V4EtVAN3UGFcvDDNbAQcqAYekI1eMELN8ZTRFVBNkSgHu6KB+kDxfAOZMEhmAB+WAf58AvYCm/CIGgwm60WyyXh8K5A4DODYVg0ug76gAemgQxAFGbAUegAx8EXP1Y5cByKYCfkQBVkggPawTJZvgfQtNWatr1r1980NOypqFjtcNwSCCwRRU84fAf8x63pDfhYEAwuV0F+/hVlZStyctLatesPeL31W7bMDwRUs1kYN258eXnphg0b09PvigmeYHCfx7MCDFAI9oK8+tXz//a5Fwvf25VIwif6eaS0Ovkte2g43uI7sOMbkRCjCS46tu06/NDjrwN9erSvqK6rrKobP2bQ3bddXVFVd+s9T+Zkpz3+4P9fVPrf4vWLqKiqe+CxVwrzMu+ffv33PobzhB9Yj/4wu5ty5yObtpVCT5BgDbSBEugCByEL7oQ6+CekQxtBWGOx9AoE6qEzBGEJjANgL9TESzVeAUnwMoRhFBSABq87HKPN5g6Az7cmENjucAy12boHg4fc7mUuV/vMzP4mU3IoVHf06AdOZ7ucnMsCgaqKihWCoGVl9Xc6W4mifPLk4kBAs9nGCYIUjZ7y+WbLsjkzc5TFkltXt97j2de37012e7qmqUeOrK6oKJblX4tiLLVZLImSCIKuH4hGf+tyXWoyFQmC1NS0NBQ6ousuSRohismqukqSwjbbVSCqarXfv1TTNJgMA+IHTAAFgE3wDlwHaRCCeRAGBTpC63ie134gwglYA0lwFQAHYSeYQYc+kA1LYBBkQwhWggBRsEFXKIWa+HqJatgdz3h/OURgWTx6vR0cgzKQoSPkwQ7wweXghhXxkPkroBCKYSncAGbQoBg2QTu4CjL/5ZP6V7qoEHwKmyCW3kGFNRACd3wVwQqrtZPJ1BUkRSnz+ebrugZd40XqzxCBHbA0HvtvgmrQwAApYIVy8EFX6AFroE6SxgpCLqDr5ao6VxAkh2NyNHoiEFgJHeFnkBvvXAfgNDxkt0utWk0oKZkfiVTbbFaTKblnz5EmkxWYM+cv1113c3n5qV07t2ZmPV1Z+YzJVGS19gTc7oWhUB20Ksgrf++lh7/kovueLsmEEv1cUlod/5Y9NBxv9Z1Y8g1IrBlNcNHRp0f75TOfjsXX333b+OUznz6jRMePGfTWcw+cHcPUp0f7xx+cNvWeJ/9nt7nZae+9+OCp8tM/e/iF79P884kfcgHZDyZ833/5kZ/dNRrCkAlXQj0AFugFDfBneA5yoQ8EQbBaBzmdPeJrIgERtkAIXJAJYVgVL24+EJbAvpjo8XhUt/sTTfObzR0FQbJaO/v9O4PBBlFMdbvTi4vfdruLrdZMUTS4XJ18vlMnT35iNLaxWnOqqjZWVKwRRaPBYItGzU1N/4xGSwyGlgZDa7u9rdVaUFW12OerkyTTjh0fHzr0qShK2dkddV2NRv+kaZvPJFESBLOuF0ejDwBe72qPZxnoTucoQTDJcl9JylDV+QZDk91ubmp6IRotkeVcs7kvyLAMAmeVsHJAHcwAHd6DHWCGayACfaAjrBaEegjE59ZbwhAAtkAgnh8+BIMhG9aCH5ZBMegwAiRwQjc4BsfBD1sgCGkwGCQYH/dTAnawQxYMhiRoC4WwF+qgbXwZwHR4BEQ4BTI4JMkuCB/DVpChE6TCsXixrljaqSSwwz7YJgh2+BhKQYIRAFwC7WEptAkEjvt88zUtIMv5dvu1oEMpNIDprJYENaBBMkyEa8AGSRACGWRIBwP0gGUGQyg1tVDXZ2raCkAQ8gTBZrEMjkZPBoNbAdBgOmwEIxjBBKfgHjBYrZknTsy32bRIJHLNNdc4HPKKFW/V1JzyeusFQQwE/Lt3b+/apYvbvSwcPmmxuJualoGuqk2QWpBX9uVKlO/nDpBQol/Mt4le0hIVmBIkaAb69Gh/pigo8NCfXo/5Rz93y6/e7XsvPpie6rxu2qPfiZEXAD+MHv2BXbD33jFpxqujYHU8QySwDfzQETTIga5QAttBr69/VtejTudg2AjADhgOvcAPPhgKqTALVDDDKNgVT8NZH4nUNTTM0/UICOFwqcdTHIkcAg1cMLa0dGl19UZd10ArLZ3ncl0tCJIoym3b3hIKNR45MkPTFLDp+jCfb24otE3XVUEwVFTMC4eDZnMfWTb16jXV4zm9Y8fHqhoBE/SLRh9W1Xdiw1TVedHodBgIkeTkqzUtUF//vqLUgwKmaPR9q9VpMmUaDEn5+Zf7/fNCoS2a1gSxHPW/gD3xA7YG/g+6QdRqnSwIO2AFGGP9wEJBEMAFRZALC+BUPK7cC5/Fw5hESIcVkAQ6DIOtsB/MoEAKHIVSyIBUkGE9NEI0vsRzJXQAGZLhKKwDDSJggZXgiCdvWgq/hVHQF/4BfvgEvLKcnJ4+VZZPw1LwgxcGwmF4Ahriw1wKn0APQUiT5cthA+wDIAgOmAk9YTo8GY0WejxvK0qpprnBBQ54BnaedYrFlsPKcG187t4MXaEQjkMDRCAJVhuNFklymkwpHTveZjZXq+qHut6o615BMAYCa83msWCCATAA/gRvALAafg2twKdpqstl7NnzEkkSk12ucWPHDhrUf/36T6qrT1gsluXLF0654YbyiorGxgVt2lydlJSXnlpTX/+eoqgFecrq+c9+lYvuu70DJJTol3I+BzA1474TJDhH2LbrcGVV3ecq0dinuV8QgP+5PP3IXSMTKZ/O4vvO+dIsi1P79eq0duHv4qpRgHTYDW4QwAjHYRcMB9FuH+rxzFbVOpMpzWBIE4QaOAgtIAQ9oQz2w/9BD4hCMoyBRgCq4CpNa9/Y+AnIjY2nYYquD9a0RpCgHdxUXX0A9PLy5S7XNQZDlqYFBUGSJHPr1jcajSlu95H4NPTEYHArKIrijUaNdvtkXVdl2WQ02nr0uMloTNq3bxEYoRVcqShvKcrDivKeojwFAyAzlr8pOXmiwZBZX/+erquats1uz0lNHaFpEUkyp6R0atPmxmh0p6o2gAH6QSf4IyyBxfA89IilbpWkPJttqiTVwycQhRJBcEnSeAiCBYbDMFgJMXHcH9JgCTRAJqyGFOgAAuTBlVABKyAIfjgZX4xriPs7t8VjmOZBdxDAAIfh2njt9RB4oQfsBw0OwR/jTlkgC/4GneEzSUqSZVdGxi1WaxLMgQhYYRgI8Ac4AHNhIVwFHkFwimIng+EmQSiLVxzdBcNgWrznO3V9otf7saqeBhv0gj7wDiwC4HXYAx3BBdGzsp+K0BK6QxX4QTCZjE7nGEVpNJuTDYakdu1uSklJVtV3IOL3L7dYpmhaI6QAUATjYSHcBU9CPmSBz24PDRly5YEDW81m86nSUl3Xe/boceutt548uUPT1MnXXXf48OHyisp27aZqmhoJbXnvpUc+m/PIhHGdV8//35NFZ/iu7gAJJfq/UM/rpPcJElzsfEnVpYqqun++Me/xh6Z90Qafyy9/et3jD02bmkj5FOf7y/nSLEo0Rl5O+tqFjw/oUw1AO2gPsUBmFQ7CWBAFQbRYurlck/z+9aCbzUWZmVMNhtOwCHRww0l4AnrBb2BkfC41lpF0CNTBHkjWdRdUQAV0BqssH4YNkAG3aJrgdF5tMrUIBDYrSllDw+njxz+KRDz5+SOt1hw4CPshGW5RlEA06rDZRkWjR/z+5ZFI9NChhaGQu6hoWMuWQyAE1ZAGk1S1RFVfgkuhBWwHLRDYp6q+pKThKSmTdT3qdBakpl7q9e4LBk80NOx3u4+YzSkdOtxmNPrjCQtbw2XwNrwJQ6EI9oOkqmWCYLVap5hMLUATRYMkjda0g7peAXXghfZwSzzpkgadoDdsgHpIg77xKPgQ2GEMmCEIp2EIuKEeNNAhG7pDCfigN6TAcbDBGDgFuyAZDFAEreBmCEM25ELk33/nlhAOh8sCgQOaFnI4LktNHRv/SIfu0AlegFUwEhQ4oesBCAlCpsEwVRQzQIJxcA2EIARhCMIIeDoUOg120KAQRsIGeASKoQvUgSeecyAEVXAUwuCCSyBqNmc6nWO83s8Upaa0dHlDwwFFCWZnD27dejzIFsv1mlYeDq8CPywHD9hhLNRCF2gJG4B+/S7/7LNZ0aA7L69w0aLFS5YuVVU1NSXF6XT269PnVGnplm17QTcY9L7dQ6vnvxC7kJ965Kff4GL5lneAb3ClX2RKlIRnNEGC85urxwyuqK7btuvwf7x/ZiHp15qpj9GnR/u3nnsgoUfP5jufsGtGJRojLyf9/Zd/P/GqS6AesmEABMADY0AyGA7quhoKHTAYslJTb1fVJl1XJMmWkXGTzZYUj+z5P8gAL/igJUyBFRAGIBDPmilCviAYBGE97ANdljtL0mFYBAaIiqLc0DBbVetk2SWKLYJB57Fj7/p8pZoWCw9aB9vABJoopkajR/z+RdBPlp3BoLpnz8fhcJOua5AGK2A7yJAPTsiFVbE6UprW0NDwvqLUGgwZoNts7dzuLV7vDqs1Kz9/4KlTC2tqdkiSSRRlMMNcqII0aA15UBgrni5J9lBoQSi0DDAYuoEuikM0bTtsFUWHIIThfTgFTjCBAdZBAHKhAzigM+yO+T5lOeZRFqE/qNAVGqEYBMiHfeCFJHBCCqTAQXCACapgI9wMt0MfWAxl8Sn7ANwd/4sixkx4Hn6uqve73Vs9nrWiaBIEgyBYBWEt7AERCsAJvUGGT2GcprWLRF7StMMgi2IbkOEl2AzmeD1SC+jwGoRgH6wEL7jgMmiETlADSSDDB+AHIBU8sDNebzZiNrdpaloQDgdBT0m5vLR0eU3NVoPBFo36RDFF1wPh8HpoAy1AhIVQA2aI1aZfBR1MJnnLlhVWg55ks6WkpE2ZcpvfH3znnXeqT5+uq6szm83r1m9q3fpyk8nVpV3l4w/d+Z1cL9/sDvANrnSX0/4NdnSecz6L0eZMK5VoiXbOtJhwPJNYNJZ59NZ7nrx6zKDpt139zfrs26P9p588/cBjr3wwa0WzD/Acad9VDsJYisFvmUz0u2pPP3LHM48OgsNgAwtkgEmS1hUUdAPJ693m8SwWBEGW08Jh7+nTb0SjdcnJowRBg21wApLi4S92aA0yrAYTbIdb4BKoF0WbKF4KUUHYC1o0uikzc1pqalf4AHSPZ3s02j8UKlIUD8iyPErXB5SUfKxpYZBhPJyC+TGfpd//KVwNUVE05OaOt1rb7tr1fjgcc8JNgkr4DKJGYx6sFQQVLhEEKTX1KputW339B8HgISAUKvd6dxcVTYlEmiTJ1LnzzW73oZMnF6pqBDJhEKyFYoiCHdaADl1E0eZ0TtX1ukBghq4HQdL147q+3W6/WdM8gjBQEIbBAtgJEUiHRtgBVRABIxRDGeSLYoqqVsKh+CS4DirsgC6gQgCiUAY1cQM2QSQWigSb4XboDMAYuAaWwmEww2XQCx6E+QC8A2/DQzAUusBfAgFDXd0MVfVIUorLNVWWY9Xt/fE6SQtgClwN18NdirJEVTdAEzhhKLwK78SfvA3wi/jpczU0wUYoBy9I4IUGGALXgw3ehiNggR7ggi2xAxKJlEejUUnqIctOm61tbu4tjY0njh+f5fdXiaIzFJoDE6EMkqAXtIflsA8U2ANtQLRYbAZCY4YOrWloSElJNZlM48ZNyMsvev/990Oh0IqV63r2nOr310wY2+dPD9353d4BvtZN4BukDU522pv9tvDDt/hU+zduSnPa33h8yQ8pfhMkOGfZuuvwQ4+/AeRkp1ZW1cdi7b96ddAvoqKq7tePvVKYl/nrRMqnON/So9nsDtHPZcuOg5Nv/wcArQryqu+9ffwf/rrI46m1WO4Kh+dBnSynCEKmrocjkT0pKWMaGhbp+hWwFG6KZ/Y5Br+X5U6qejg1tV1T06FoNAf6wHuyfLeivGM0jjSZfh6JzFLVzaJYmpw8+vTpVyETauAySIGZojhEFPNFMU3XG6LRD6AvtAYd1kKlIFh1fTg4YYXdbsvOHiUIos93vLJyAXSI115fBnXxWJ9hUCoI63Jz7wECgeKGhkWgG42uFi0malr45MnZbdtemZSUr2nK0aPzA4G6SGQgtIIKWArJQDx91X6jsSIpaTzg8y2LRI7oui4IBrt9sq5HfL53RfHnIEG5ps0HEwCdIBMWQBYYIQKnQROEZF0fBiZYDx7wQlvIgvUQgiwYBGWwFZIgBQbCATgAbWE4pP3r2Q0gQA0sAx9MAKAclsIg2AIPQad//53fEoRFRmMbu31MbCDh8CEwgBkmxw9gjFPwvCjKmibBAPDCGkiF6fB7yIAusBUmghe2wgHoAmUQjlcHzQABDsJ66Ayxc/40HBAESRAKZXmcoqw2Guuzsq4FCfTa2qXB4HFdd+n6JfEcVUPBFV8Tshu80AtyYUNRvuWqESPmfPrpqcrKpKTsXr06FRW1EUWxoaFh7txPevS4ubb28LVj8u+74z/STn03fMWrOOET/eokt9r6LXtoPN73O7HkG5AQowkS/BsVVXUV1XV9v/68/Jcz5Sd/kmXpH3+8+7vt9vzlGwvKc1OJxiivrB0y9v6CvMI18x8Ftuw4eMMdz1gsPwYpElmlKLsslgFm84BI5IDfvwTE+FLFudAbesLLktRZlvtEIu8XFo41mVJKS2cHg4BbEJKMxvFG49Qz+wqH/6EoCzQtCD+FU7AY+sBuyINGSeotSd0ikRehU3w9pQE+gJGQAmvBI4pWQZCysrrZ7a0rKxeAx+tNgkGgwWoQYCiUGAw7FSUqSQUuVzezuWUkUl1b+2GHDncHg1UVFWsikVqnc6DFEiwsHA7s2PGCKBZGIi0gGySYC4UwAA7AKoPBJYoFVusgEKPRU37/arv9Rk2rD4fXKEqDLLfQtG6QD4qmvQZDwAk7oRRyQYMKyDMa20YiK2EgdIQt0AQVMASyoAmWw1VwEg4LQhQkXS+M51d6H7wwMv7yDCtgjSTlqKoHLofYCop3IBt+A1n/vvEiQXhbEMwWS1+jsa0gSIpS5/HMgFvhUhDiWTxj/1bD3wHoH5+a3wMnIPY3xua4bt4OG8EB+XAgK2uUy9X36NHHVbVNPF3rKyBDGnQAoA6OGo0/VpTPNK0CsgXhaHr6aJutHXDq1AuadikEYSNE42mneoABiqEOLoUFYB8ztP3Bo0fNFktxycnCwgGnTu3r3Lnl0KGX7dq1bc+eQ1lZ3cde5vqelGiML7+Wv1na/ItWiQLJrTZ9yx4ajw/43xt9PyTWjCZI8G/kZqd950oUeP/FB9NTXZOmPfad93ye8s0CbM9lJQrk5aSvW/h0TIkC/Xp1LNnxRrdOnylKsdE4XJIKw+H9odBOWS50uX4KAjRCFtwK1fCswTDEYLhEVfeDLxCoAKFlyykZGa0hZDbfazTeBGo8OgeT6T6D4RYAwtAGboQD8fJOL6qqWVXXgAYpUABL4pE9BlgMPsgQxVRVrauo2NDQsE3XFbs9225XYTGEQQALHDeZ9hUUXAFmQcivq1vm8+3UdUUUZUXxnTz5iSx3Bi0tLau6+khx8axoNKBpSlpaT1FcBYfABApkwH6rtdxqbWOxFIpi0Oudq+tBXY+Koh3UQGCBwzFQEAxGY2tNm6Pre8AMEbDDZ9ACJCiECrgGfKKYbDZPjAu4MNihJ6yGIxAEGepgL1wqitbU1Ftk2Q0LwAchuAzWwmtnLY9bCOuhgySlGAyFMBNOQTi+MOA+2H7WLzwTXjMY2hQV9VOUrYHAKpAFIVal80P4c6waKkggwzF4GAKQCbPgGAhQBEHoCasgAMBGWAXtwAknc3OvbdXq16mpw7p1e91uD8Fi8IIGAyAUzyDWJAgpirJK08rBBBm6PrSmZmFj4wbQNS12EFbCYHDClSDBSqgHPzhgLgyAxsqaGpPFUlRYaDCYS0sPWK23HDhQPnv2h42NDWZz6vetRPnSm0DsSk8o0a9JIpo+QYIE/4tnHrlz1Ig+k6Y9diQR0gR8/QDbc1yJxvhvCz94+XfjR/mi0S2ga1rLYHBDKLRZEKygCcJmmANqLEZekjpEo2skaZ8oGk2m08ePvx0MVtntRWAMBh+ORheDFC/aTjj8Ujj8LgBvwwbIglGgwVoIwE9UdYggmONR7QosAg12wWjoC8cUpQwugabGxiZNUyIRxecbAsNhNiiSZIZQONynvHwdWKLRRkh2u/cHg8WybDtyZL2u3xIIrALr8ePFMN7tTj106CNdVxsatmtazO33GURFEQgGAtWaFtV1UzDYTlEympre07RGQbB6vWt0Pdvn2yoIrnDYYzBM0fWtuv4ppMB+6BD30e6AK8EBIUGwSlILq3WqKNZBA1igLVwKByAmzrbANRAUxSRRdKSk/MhsdsJMiIIVRoMb/gpVMAs2w+XQJAh2s/lSi2UUrICDYIZLoA/8EeYA8C58kJR0k6pWmkyOnj2nWq2hpqZ3NM0DSXAl1MD9cBKANfA49IIQZMII2A7bwQtG2AoRyIB62ASjwA2NBQVXt2gxPXbaWCwF3bq9kZXVA2aDBYzQC5ywFUKCYNK0ChgWj3xqCxPd7kOnT88DCyyACdAIThBhCLSHdeABf6w+rSQqwUhk5NChxcdPKordYrkhEll97x0jPnrlwRSHdNPELt+3Eo3xuTeBb3alX/RKlPgfq9+4Na8YbfY1t4mWaBdN++Xdkx5/+Lap9zx15ER5sxtzjrS83PTyqtov36a8qra8qjYvN73Zrf1m7alHf3r3tGxdBwQYEw6f8vlmgm4yXSNJFvgANEGQo9F1onikffubdF3v2HFAhw7dT5z4IByuAxGuCYX+Eg6/GLtxh0JPRiIfwTUgOBy3SFIJzAc1XmLnp7ALLtP1v0II/k+Wh0uSbLdnQQmcAiPIcAUssljutttfgIkNDdWwNZZDXhDcqroPMiE5HG7Q9e5QCfnwjs/XLhJpAheYAbBDObihfTDo1vX8UCgZ1sPPoFAQ0LQjsQn3SMTv9Z6EJOin63nB4C5VNUFEFO2aNkLTTgtCsiBky/KVonginuOpA9wMCoyGJJhnMFwRDL6rKLvAZDbfIIpAVTzr03jwQBSuiiUiUNVAILBD04J2+wiXaxwAOsgwFNLgWdgLI8EH5boehKgsd7DZpkpSDTgAaA9j4UN4FOYnJU0CVdN8RqNNkoydOk3IzCz0eheADWQYAQ54GJbAS9AVHBAEO+TDVXA6HikVgiHgg+MwDAJQ4XIVZWaO1bSwpoU1LaRpIV1X8vOnuVzdQYg7tttDb6jRND9cAgcgACXQAA64PhAwQBTGQj3sgRoohhC0gnHggQ7QWhSXms3mK4YOnbV4cXWdW5bbZ6YfvXta+/vunJSXm/7E7+64785JzXUT+GZXustlb/bLvPnbvwTlN25aMxqf8IwmSPCD0rdH+7ee//XU6U+t3rCnuW05V/hy/+g3m7A717jvzkkfvHIrBGNllqJRKyAIosk01mDoAQtAt1obOnb8USTiAURR7NCh34ABV1ZWLgY5lgszElkQCEwPBh+MRlfADbE8ppKU7HBMNRhiIUpGGATd4SFYDEvhdVm+GiyiKHfocEP79tfL8hYoASt8YLM9ajJNBIzGax2OtwwGJywHg8FwlyQNhUVQCTIchF7wGMjwY13/K5yC1aDBlZALS6EMVOgCO+F3MAx+outToSrmrDWb+xqNmTAbyiACHXTdK0m5ZvOzRuPdJtPjirJaVddBQJaT7faOsAyq4nXtnTDfaLzSbH7Aav17JLIrGl0vCAZd90tSrMxmSTyKKBt0WJKUdGdy8ouhUKXXuwR0UTSKokUUP4WdIEE3MMAA8MFKuDcSyff5XlHVk6KYKkk5NpsdPoJayILJsM/huEHXNZ9vZnb2rXv3zjx5ci1QVDQiM7MjNMBBCEFnuBzegT6QAXtBgO1QAUa4HAAL9IN9UAo9QBWErYIgCUJg584pTU27RNEkimZRNEciNXv33h4KNUEHOASH44dChHawE7yxNE8wC8pBBBNkQUQQNoliusl0mSAchR0gghE0aAsfWa35aSkpS1aujGpJuq7l5zqvGpV8353/coU2y7UWuwls212c8Il+C75tNH0zmp4QowkS/ND07dH+05lP/eOV2e/P/Ky5bTlX+CI9el5MzX9F+vXquG7RvQP6HIV66AYEg/MU5ZAs9zAaxxqNclHROL+/qrx8qa5Hlyx54/Dhbfn57YcMmSCKwCawwo9UtVFR9sBkCMA8Xe/u8y1Q1Xqb7QqzuQMEwQcd4Ep4DebI8nWCkKVpG3Rdb2oqsdvzunSZ5nQ2CYKelPS2wTAEIhAFRRDsNttTJlN/QZB1PSRJ3WR5ImwBG1wCd4Mb3NAEufAU5AFggkvgElgDwIb49HSMy+EpqIGQIJgtlpEWyxBYAhEIynInk+mZmIdVkoaZza/oep2mHZIka0rK5Skpl8FSOAE2+Nhk+pHJ9FNAkvrYbK9pmhIKfaLrUVEskOWJsAe2x+e+ZzkcD1os10tSfkrKG6LYsaHhbVX1S5I9J2eq0eiDWCr4WKXQ1fB7QZggCL/U9Z8EAjMjkR267jeZUtLSusJ8OAoRUMDg832Sl3d3VtYt7dq91tDgPnhwjqIEg8FG6AdlsB0EkECALFgLDjCACVbCCbCACpmwL17j1Axr7PZrdD2Sm3tpVtaggwd/WVHxARAIHN+9e5ok5eh6CJLhVtBhK/hAgTpogvaQDINgICyDbVAHqbDMZLpB004LQqrZfKskSbAUPOCAeUlJnXU9HAyFfKG09u0vTUsxjRtpPqNEm5c+3dt93XXkCSV6Ft/aM9p8JMRoggTNQG522nsv/nbjtgNPPf9Rc9tyrvBdLR07l8nLSX/qkdsG9KmEUwAMycrYrig7QRMEQVGCx47NKSzsqOv6iBE3FBdv3bHjU0AUZZOpDObFC/DECjzOg1Hwu2i0tdf7kaLUiaLFYMiAT2AfZECmJHUQxXRFmW2ztcnJ+ceJE5tPnlwmy2ans6XZ7PD57lOUYjCCAWSQAoGnw+E1un5nNPq8qu4VxRayPFqS9HjiTxe4wAlOqIf1MBbehDJoBTeAETpBC4jEG5AH7cEYiexX1dMGQ4ekpNsFwSdJrYzG3599cESxpcn0Ihh0XdG0iM3WMSvrZlk+Igii2fwLg+EaXW/UdbeuN4HFYnlKlq8CDWyi2MJgmCoIjRCGYqfzCbN5zJluk5J+a7Xe0tQ012BwSpI9O/smuz0DloMMm+BJQRgZ21IQJgjCs+HwPk1rlOWk1NQBOTnjBGE9HBRFh9f7fosWD6enTwTM5sL27d8UhA47d74dDLrBAbeCFZaAH6ywAfLiaz1Pwig4AptjZTyhHmpAhK022zWALFtE0Zia2r1Vq8llZa8fOPCL/fvvleVcq7WvojRAMljhRmgJW0CCahgH9eAEoDWMh2LwQZXJNEnTToMuikmCIJpM18pyW/gUIikp/S2W1qFQqWTI7NhxUGP95mvHDj0XlOiZi/1rrSNPKNF/53z2jDb7IodES7SLs+Vlp33w0oOlZad/9tALzW7MOdLy49G1ApR//UzX50XLz0mf8cr/DejjAcvP7zKtXfD89Gk5mlYqioajR7fYbJMPHNgK2O2ukSOnNjRUFxdvAyk19Tqr1QXvggp2eAOmwg0A3K7rU3y+jzXNLwhyUtINgnAQNsaWkEajHzqdQ7KzHzObOxYUvB4MOg4f/jAS8UqS1eXq5vP9JBJZHHsY+P0PRyL7BOGfgjAB/qqq21V1FUQkKdlkUmEaHIo/OBbCL+AGuA1+BAvgcNytcgR+De746lXgL7APHo9Ge/l87ylKiSg6QZOknaHQNF3//7JD18tDoclWazuTaXhFxXOBQLHRmJmU1NNstkUi7+l6oyAkC4JLEJyC4FCUDeHwi3BbNPqCqu4SBIfBMBlCghARBOt/POcEwQSEQo1NTRtV1Z+cPCwjYxwocK8gDIiHEseqwHeBu1W1Nhr1qmo4Kaltixa3Wa1Noii3bv200zlU04KxBZ2aFszP/3lu7gOKElsVqsNV0BtWgwI50B5qQIbhUAoeKAEFvNAbekC0MHm0IEih0GKbzXn8+IxAoNpkSm3X7rZA4IjB0CYp6XK3e56quuET2AYRGArDwAajYLsoVopiCBZBE6TC1eBJTr5W1z2qutpgcAUCf49GdwBG4zBJamux5JtM2U1NWzQtWlDQ43TVyod+fs3P7pzU7BfFf1zssfvA//zWxZnZ/kvat/eMNqPxCc9oggTNyfsvPZie6pqYSPkUJ1ZXadvu4vwLyyf6H8x45f/+8ti0++4cB9x356T3Xpp45eUdQZblvKSkW0EuLt6uqsrw4TekpuYIgqBpYafzCpdrcLzQ5f0wCDzxlO9D4XehUDFIspzrcNwiy00Q1LTKlJTxGRm/iO1Ukhy5uU9L0sDa2r2CYHA4+qSnjw8GnwiFXvH57o1GfYLwUmzyXRD6CcIrqurXtEOCYHQ6r7JaW8O9sAI+hL/DPTAOgNHwf7A3nstpIpjhXtgNOjwGDfAE5MJ18MtAYFkotFHXlbS00RaLGAr9SFV3App2MBic5nCMSkv7jct1a1raow0Ny5qaNiiK22hMdTiS/P5bFGV9bCDR6MxQ6I8wHSbDk6q6U1E+i2XF1/V+bvd9weDsM4fa73/H6/2ryfSIyfRPj6ehvn4paIIgSZJDFP+h67GFsHKsCryuz4JHYXpjY25JySs+X4nR6DSbMxXFdeLE74PBY6JoiS3oFEWLz7f31Km/6LoBPoqvUugLHSAFWsN6aII8KAchXgpLitfzRBDMjWqazzcrLa2N3Z6WnJxSUvKx318uy1ZVDZhMRQ0N71utRSAZjZMFYTt8BhLEgvd3iGItSKLYU5IyYR6chAhogUAgElmSltbfaEzPyrpB03aEw4t1XdV1j9lcdPr0m4JQoOsBJVLy8jM/6d+r4w9zwn8JZZW1/32x5+ekl1XWln2xizThE/081PM3ml5wlySS3idI0My8P+uzN2cs+9NDtyXZrJ+t23XTxEub26JmI/b4iT2KLmw9+t9s3nHwprvesFrHeDwv5udPaWhY0r//aL+/adeuDQaDTZa7Wq0d6+tnh8Mn4Rq4+d+//TKsN5kMmpZmtV4mCHi9s0VRz8r6ndncEf7lHQS83pXV1X+QZYfTOcBiKdR17fTpD6PRloLwN5DO6lCHADxmMFQ4neMEQY5ETrndsyETbod2EP2XOwYBvPAaVMRLSe2HtdAWUuDX/+71OAF/gfK8vLskyd7UtMHt3mQ03h+J/C05+cdO5/8fVCRytLb2EVHUbLbs9PQhbvfe06eXm0x3QyQcfhUehmHxbWvgj6Lo17RTcDechnlW63i7/ec+30uBwIcm0xOSNCDe7ZO6/lly8iUezwGX68rGxrnRqFUQnoBcXX8d3oTfQX8AlsKz6elDw+E6j8cCwPaCggfS0q4C6urmlJY+A+NhKdwIC8EKI2EpuKACzNAEbaEERGiE28AUd2TmyrJXUUrbtBnf2Hg0OTmlqKh/RcX+/fuXZmUNrq5ebzS2NBiSzOYWDQ3rTabbdD0UjS7UtFgAnFkQKi2WqcHgy7J8oyCkadoBRVkK3QXhOPhbtLipoWGHICQ5nYN0PVxbuzAc9mtak9GYLAgdRDE5O3PbOy/89lxYA/M/L/PP3SChRD8XV9Gsb9mDu2TCd2LJN0Bwlyxurn0nSJDgDFt3Fd8y/am+Pdr95t7J2ZkpzW1O8/AfD56LUI+WV9YOGfuwrqttWhX+4bcTnn1llkLe/v07C/NzO7d3Ll0ZjkQqw2ETlENL+L+Yjw2egd1QmJFhDofdPp/bZhsXCCxVlDawLjPzt07n2Fj/9fVv1de/ajb3Tk01VlVts9u7JScPq65+Pxw2gSoIT0DLuC1lun6fyZSak2M5cWKnwzHGbO7g9S4NBsshH34H8lmGvwPLTabkcNgNV0A2lMB6GAY//vchBuCPcNxiyXG5BsmyS1WDlZVvuly3Op23CAKArv+riFEkcryu7ncWizMj41JJModCpysq5iiKFX4LRcC/TVEyD96Ae0AGD8yVZZuquk2mJ0SxS2zfuu4HFGVhNPqsxdLR6RwDeDzLAoGjMB4WwO+h61nWHoCnLRZDMNgWusEJWJSRMcFgSKuoeAHGgAyb4+sllsNJMIENLJAPW6Ed9I6X9LwLLCDCCtgHWuvWVxqNjqNHF7Ru3S8/v7uua15vzYEDy32+Rru9p93ep6FhaSTSZDReKwgO0BRlm6Ksl6Rcs/maSGRTNLpdkkZLUnuQdL1JUWYKgi8v79po1F1VtSwnp6emtTUYMkRR9vn219cvN5svFcWs9NSN77/0q/NCiX7uZgkl+kW4ij75lj24S5pt9XBimj5BgnOCrTsP9+3Rbuuu4sPHyprblubhv59MMf9oc9nTLOTlpK9b+MdJ43t9OvN3/Xt1/ODl30l6WXaG9dW/Tnv6kZ88cn8P0ECEwVAF90EZ/AZ2wRiIiqJcVHRNSkqB1/uepsWqE407ffrJurqXgdraZ+vr33A6f6RpPkkydOnyo2j0RG3tXE0Lx+Kydf3Hur4OgP26Ps1iyRMEWZaNPXuO9XqX+P0bVdUPnaARfgZnTtQXYTH0lySby9UL5sDheMDTJrgfmuJb1sDPzGaHKKopKa7q6g9DoTKDwQma1zuvuvonquoDSRBkQZB9vmXV1XcZjeasLMvx4y96vcVmc6bd3lqWJXgOPGADK1jADHMF4X1RNMHfYTc44EeKUq7rEV0Pnzm8gmATBBsEBcEeDh/z+dZrWtBuH+JyXQYz4XboANF49FUYWsONweBpaAQ/tIRpNTWfVVS8IEkTICUeThSLuL8MRoMHjFAEh2NpCkCEVLDBKxAr2HgZpBUWDrda090nF+m6UFpasmHDWz5fndOZ3br1QFE0JSX1r6+fFQ57dT0jHH5FUTaBKMv9QDQah0YiGxSlUhCS4GA0OkPX6wTBCWk2WytVDZ4+vVaSHAMHtquu/sjn2wWiwZAGRllulZ667vxSosTvA4eOlJJQov8D9fytwJTwjCZIcE4wZ/GGa8YMqqiqm/KTP08cN+Rim6n/kifTmYn7H9aic5TNOw5O/vEb0B4kOA4lkAIj4DSsczjycnOHm82pfn/50aOf6PooaA31MN9szguHSxyOawQhye9fnJXVKju7lyCIR47Ma2oq1bQroAgOwAr4EXxotXa1WPr6fJ8VFWUXFfX2eGp27JgXjSZFo22gG6yEQ/BLWAu74UbYZ7cHU1KuCASO1tcv1PUOEIAR8UKUvwET/N5kKjIa20UiSwYMuKu6+sDhw0uSk4c0Nq5LSfmFz7dQVWvT058wm7s0NX3U2PhsQcGk6uoVgwZdGgoFNm1anJY2OBis1LRsVfVEIkfh99AXgNfhI4NhrCBsS0oa2NAwX9e7wDD4KwyEjUbjL2X52tgBjET+qapzZLl1dnZ6Xd1eVbU5naOj0dONjZ9CBLrA2Qu4P4SPQI6Ly1HQCjZCJYyFd6AFBCACDrgcVPgnDIVq6AiD4J8QhdZwHIbDfEiDkfBG27ZXHD26ICvr8qqqpa1bT6+v3+R27+zcebTfX19ZWQN6KGQBH+SACzZIUq4sDw+HXzIaB0ejBwShtyget1iuDYVWRKP7ZXmUqm7LzOxSXb0yK+smt/tjQRCCwUvguM1mMJsL3e79eTmGNfOf/GFP2M/n6056NHn8hfmZ3589Pxi6rs9auG7T9kMZaa5L+ncZ0Kfjtl3Fb3/06ZkN8nPTH7jn+jMvvb7gGx8sPVVek5OVOvmaYXnZaV/Suavo/Vit4G+K4C6Z8i2+/q1IiNEECc4tKqrqfv3oq7Is/ePxnza3LT8QX+XJdBFO2X8R5ZW19z/y6qZtRkiFpTAGPJK0U5KcTmeb2to1BQVXpKZ23bfvBVVF19vAcAD+4XL9WNejPt88g8EhSWFJMrVqNcZotO/Y8YKixDKxx1KHvm63X2o2d/b5PlPVU6rqbd26f0FBd1EUN2360OvNgoFghRJYDFaYBPWiuEKWLS7XCJMpR9MCtbVzI5FkGAgibIM9YDWZ2lssg0OhjZJ0okePGyTJ6PVW798/LxqNpqTcCwQCa4PBrS7XNLf79dzcsVZrQUnJG1dccV1yckZ9ffXatXN1PUkUO5tM3cLhPYHAp/ATqIJFRuONmlYmy6UpKVeralN9/TxFscIpuB3K4VNZHm80/jwSeVpRFttst4RCC1q06OdytTlxYpHbfcpq7enzHYOesBmS4GHIhbdgJlwBS+FOKIFPYRC4ATgCfaAaBGiAPrAHLoMZ0BnGQof4L/YmbIB2cAVosABqwWOxpLhcPU2mjNLST9q0uQfweourqhZnZrZpaPAqilPTBsBH0B8yQIENghCAECRJ0mRNWy/Losk0DFCUQ8HgEpBl2ZSaOi4arXO7V2ja5WApyNt63x3X/OYPM3IybWsW/OUHPVO/gItWiQK/euSVgryMq0cPrK1vWvrZtttvHvPpmp2SJI4c3ju2gclosFr+tbw7ElVuvffpqZNHdm7f4lTZ6b+9PPsfj/8kK+MLF3G5it75lua5S370LXv4xiSm6RMkOLfIzU57/6XfKop630P/bG5bfgi+4pPpIpyy/yLyctJnvPLggD6B+ER56MYJpr49WwqCKAhybu41ZWUrKyvX6rpmt18tSdUwBwKx73o8H9ntnTUtmpPTz2i079//jtdbruuq3T4AlsABsIJuMOR6PHN1vdJgsA8aNKaq6uDBgyslyaAo0YwMCd6CE1AEJhgC9TDXas3LyGhfU/Oxx7NFkpJkOdViicJsqIc+0FmWMy2WIYHAKk0r03X7+vXPV1XtczhyOnYcK0kGj2emopy2WPq6XFPd7tfz8yeazZmlpR9nZw9fsuSd48f3O50pY8bcYjSGVbVO07wmUzeH41ZBeBuWGY3XgV9VNylKQyh0TBAs6ek32+05YAIVsmGSoqwKhW5S1WU222RNq9e0OkEQdV1r0WJ0Xt5An299PCfoJSDA3fAizIYREAEZzNARrofd0AgV0B9agRvCcA3UQQ18CGn/rkSBXBAkyR2v0jQGBoGWnNzXZEo/fXo5WKqqlkYijVZrQVHRnXV1lZFIpqZdAovBB5/BcVBggK6ng0uSrtO0tZp2uEv7SCi0EBRJamWz/RjUlJSx0Witz7dW0zIhoyBv0wcvPzRh3NBVc/+QUKLNzvot+5Od9nt/fHVBbkavrm0e+vmNGWkuwGoxJTvtsXZGiQJLP9s2+tK+lw/tmZ2Z0r93h7unXfXhnNVfuodvk9dJbd5p+kSe0URLtHOxffDSb9NTnROn/aHZLfn+WiylaMFXTiZa8NWyD14k7cNXfn/d+HSw/vyu1CcevuPDV34/flQbEO32VoWFNzc2HtN1TRAMDsePjEYrfCAIZq93jtPZ32brpOuKKBpatRqTnd334MEPNU2V5Qync4oo7oFPQQ+F9ktSuKBgsqpGDAbj2LG3CEJ448YZihJOSWnfosUwmAe7QAUR5ubkTNb1qCSZOnW6KRQ6UF+/WFX9JlNeUlIRzIcS8FkszkBgha5X2u3tJcmSm3vt0aOrjx9fHY0GjUan3Z7k8XwcjVaCIAiS2Zx16tTHOTkjunV7uHfvP2/fvnb//s0mkyUY9GdlaR7PG5HIUUlKlaQMSeoEQiQyx2D4sST9vrFxrde7ThAEozFdFJPgdSgGO0zQtJNW6w2a5g6Flui6cvLk2pKSeZoWSU/v7nC0lCQ/7IcwdILesBiuhTBsBQO8CmWQClPAA72gLSyGJugJOyXpBOgQKw0aPOshuwA+glS7vasgfAobwAAOUTRZrflVVUuSkrIEIdvvV8rKZoTDtbJs1bQQFMIsScoGGYbBdjgERlANBoeqbtC0UpCy0tNV9Vgw+IGmNei6XxAkUCXpaFZWa3DdOKFq3YLnYvk7z5GUvV/rehfA4/G3yM9sdrO/q7Z15+HLLumxav3uNz9YtmLNTl3TY++vWLPzhdfnvTVj2eGjpWdvf7SkomuHlmdeduvQsvhY2Zf0/+3FaDMenIRnNEGCc5S/PHrnbTeMnDDtD0dKKprblu+emIPk6868J/yjZ/P0Iz/56LX7f3bnxDMvH5jetqpqicmU2rLlbbquwmFVrbVar7DbR+p6yOXqa7d3b2par6r1ZWVrGxuPpaV16tr1Nl1XVdUny1lO5y0GQxBEWfbk50/yeo+Ew7Vud50oSiNGXNuyZWtFiUiSKT29a/v218vyVpAFYVV29jWybFcUvyQZrNbMTp1ukeWAqvpE0ZycPCI1dSSshGgkokqSPzd3iqoGJclitxe1aHFLTc3Jyso9kmTJzR2ZnX2J1zs7Ejkpy7aysplFRdd17HgfkJk5ZPDgV8vLG9eunacokaKiPl27Xur3zwuFtuq6TxRTIpH3jMZfy/JkSepjNr8eCon19Z9Eo3WC4DSZJsAW2AQh0HVdDQbnJyVdBWRk3BoOSwcPvu33V0SjHpOplyCUwo74g9kMftgCfcAJbWA2HAILhCANZkILUKFRFI84HKPADCPhUvgbLABgFnwCl0J9MLgrO7t7q1aZ8CG4Tab0ioqZ4XBDJOITxWSTaawg9Csr+7ixcZemRWCPKGYIQmy1aCFcBVWwGpqiUbuuH4OJ4F26el3HjjdlZLQOBN7XtHqDIXXKtdw0oa/HU3vjhM5PPHxH85yXX8DF7BONEY5E//jXD46WVBQVZhUfK7v7N8/puj728n43XDO8Z9c2+bkZ/3h17uxF68/e3mD4/zkrzCajqn15xc7z2TPajPtOkCDBlzNlwognHrrtR9OfusD06LdZAJrQo2fzH0nLJ44b+upfJ5WWzohEmnRd79Klhd//kaKUiqILRIulTX393MxMRFFSlJ5Hjsytrz9gMjkAr3eF17tQEEw22+WgZ2Vd3ti4q7Z2vSQ5amoq589/o7GxtkuX/sCBA+9UV29PSsrv1u0OUQzl5FxlMKRUVc1WVU95+YYTJ5ZIkrFt24mSpAYCR0Khk2ZzUU7OnbLsk6RwRsZVHs8+r3e313u4oWGrKBry8ycrilnXVVUNJyd3adnyekXZLQhimza3tGgxMRr1RqPeaNRnMqX17ftXm224rutGozUvr/PAgTdq2g5djyjKTpPpcVn+V+4qQcgwmZ5V1V5+/w5BsElSS7N5qiBUwypBsAUC7yQlXQuiKFqB5OSrzOYehw/PUJRQOLxD13vCIFgLQUiCbWCAErBAaxgM6+IFltZDNqSBKEn7UlNvjUarIRWALnAjLICnYAEMAx+EcnJaZ2d3b2g4ZDbXG40bRTE4ZMgNI0bcEQrVghlUg6GHyTSxpmYdGETRKsvDdf2wLJkgAA4YB3Zw63o13AxbRFFu3/46t/vEsAHWU7s+umpk+O7bhvzszok/u3Piy8/85ImHm7/C59kklCjQumXuhLGD7/zRlcMGdZs+bXyyK+lEabXTYRvYp+PAPh0vu6THC09Mn71ow5ntc7JSK6rqzrw8VV6Tl/3lx/DbZLzXmrc2vfy/N0mQIEHz0bdHu3ee//WPpj/1xEO3DR/UrbnN+Q749qFIZ/RoIqTpv+nfq+OKmQ/+5g9vVFa6vO5Da+f/5f5HXty1P00QpIaGNeFwXknJelEUZTnXZLq+tHR+KOQG4JZIZH5T07t2+1hBkILByrq6Tbm5t1VUvNq79/WHDu1YvPj9wYOv1HWtZ8/J+/bNC4cb8/OHa5oiy0nl5e+lpHRvbNxTVDS2snLDoUMfFBWNVtVQamqb06dnulzDHI7eIFgs+V7v3qambVZra1HMamjYGQrVZGePFkWj1+s4dOi5vLzRLlentLTelZW7SkvnZGT0N5szzoyrrm7bsWMfSpJt+fLnunUbnZnZevjwH3/22auq2kIUW0AY/v9iO1EsUBRB108qymFJKjSbpyjKVkU57XRep+v4fCvA4nYvt9v7Wq1dzebWNTVvQg8ogqUQgBqIQA8AdkISRCATroC9IEIatIXtomhJTr4hENgdjR602VL8/hdhLOTD7fASjIAA7BRFKTOz654977Zq1SoYNEiSVF5e7fM1JCfnKEpEUY6p6iGjcaQktTAaR0UiK2V5RDT6iSConVqnlFYtcXs7QEcYAEfgUrt9W0ZGqKLCHgw2ThqbGXONP/3IT84+B36IU+0rk1CiMcZd0e/mu5/q27N9p3aFXl+w5FRVeqrr0NFSjzfQr2d7YM+BkvRU55ntx1za5/5HX+3fq0OS3RKNKv98a8FtN478kv6bSn7yJZ+e4whNiWj6BAnOeSqq6n7++5cu6d/lfE/59N0GxSdC7L+I8sraf7wy84xA+fvLM+cs2tS3Z+uZCyImU0lejr20vLskFWiaNxJZqmnlECsZukIQDggCYMjKuk7Xlaqq9yZOvNtkspw4cXDjxsXA8OG/iEQCe/fOEQSzx3PKZMp0OtsmJ3c7evTlDh1uNptTTp1a1th4RNfVgoIpqhqqrJxvsbQNBIpdrgFu98bc3Ftqa5eYTF3M5jZu93xBCIiiJRQqEASXqi5MT++r60pdnRd0Wa7o1euJtLRewKlTs/fv/4vBMFaS1rRpM2z//kWtW/dr23bQokXPQHs4YTL9QZIGxQYbjb5tNLznD+QYDEWKskaSOhmNI6LRrbp+xG6/qqnpTUnqCQ26LkBVcvJVspxcXf083AwLIR/2wxXwKRRBa1gHreAwdIFCqIYdMB42QdhgkMzmzsHgJoejIyBJltra1XAZtIaXYDQsgVFm82aj0ZafnyUIgsGgjRgxYuvWLevWrevadeTevcvgDtgMB43G0Zp2WtNqQZAki6Y19e7g2n30VHp6m/JyH3SCeQV5Y2V5p92RVVbmnXp9tzOLNM5ZEkr0bKpONzz2l/fqGz0GWb77tqsG9unY2OR76vmPT5RWi6KQmux45Fc3RxTl0Wfee+mpe4HNOw79880FmqYDk68eNvaKfs09gu+LhBhNkOD8oKKq7v5HX5Vl6dnzNuXT96EdE3r0a/H3l2fOXbL5vX8+UF5Ve+OdM4zGMbreGAq9Cy2gN6RChSguz8m5Oxo9UVe3RlXrgAEDRufnt/H53EuXvt+27WVZWR1EUT55cnNJyYbs7Eudzk5VVcubmg6lp3fPyOhhMCSFQg2HD79XWHizyZSuqoHy8jmRSL0omrKzr1eUppqaBXb7JVZrN11Xfb4NgcBOQbhMFLvoep2mzbPbk71eB/SF/bCxc+dfRaO+4uKXDIaxgNW6s0+fG73e2n375jmdmVVVxXA7FMNag2G6wXBDJPKionwAV8I6g2GEKKZFInNF0SoIaaLYFIkcNRrHaFqtIChG46XR6JZIZJ3LNUqJrPcFnGCFPNgAEoyHHeCHWoOhp8Xi8XgOQTuwQqUgWHS9AtoYjT5VrW3R4pbq6mV2e2uXq5vff6Kycr6mdYZiCMJ4qDMad3Xu3K1Vqw6rVi1q165V3779dF0/ceLEokULFUWAuwE4DMskqa2m+W22TOjr97/tdKZ063btsWNrB/VO/njegYK8pAlje00cN/T+R17s16tjQolekOi6Xl3bmP3FKZwuSBJiNEGC84kb73riPNWj359qTOjRb8bmHQdvuOMlg2FEOPwJdC/IKy0t7wkGWV6bmTmhouINk2lkJPKpwzG2qWlBly798vJaL1/+Ydu2V1RV7enYcUw47N+165O2be8qK1uo66mBwDboIEklLVteabfn7t79nCCYnM6OmZmXAsXFz+Tn3x6J1NTULBMEo6a5jEbV6RwtSa6ampc0zSGKbUSxE+iqOlfXU6A3mKAaFoFmNP4IUNWVJpO/fftLk5MLdF07cmRVefkhuAWAKlgmSZeo6hq4DIBVRuM1opgFUjS6SNNOgmYwDBOE7Gh0uSTlG42DAFU9HgotBAnaQkfYAo0wEspghyi6dN2dlXW5zdZCVcMnTrwOmaJotNlGqWpNMLjYYEjJzR3n95fU1Kx0ubq5XD2NxmRNC5eXzwqF6mEUqPBZy5YtBg68fNGiGYoSdTpTIhH/lVdemZqadvz4sUWLFkWjbaA3WEGF943GjibTIFFc1tR0eODAOyKhg0P65vzszonllbWbdxycOG5oc50wX5eEEk3w1RFBT7RES7TzpX3w0m/SU50Tpj3W7JZ89VZWWVtWWZufk/Y99Z+fk1ZWWdvswzzvWv9eHdYteLhXt4MFeZk/v6vFugXPXjc+BLWSZB/a/9SpXR/26loOssnUJiXl5oMHDx06tM1gsB49+pnb3Wrbtk8VJSQIss+7IRwujURKQYKhqtrv2LHZ9fUHQLDZbvF4KsrLZypKAFDV8OnT82y2SZrmhysikZS6unfD4RO6HoXumrZG09aBLV7NKJYQKgsKRbG1IFhV9VOTyQF5u3bNP3JklShK6emtJQm7fRmUQDbcqKqrYTSoorgFQpHI7Gh0JWAwXAlJsjxYklpHIvM0LRqN1gcCr2patSS1MRoHQhJ0gjXggySocbmOQWtJKgTB690VDtepahCsgCCoIBoMbcCUltbX7y+pqdkKstttPXnyLY/nkCRZLJY8yAYLLIbC7OyCefPe6dixaygUGDBgeHp67nvvvXfkSHF1dXVuRkZRnkeS5kEt2ECR5dbR6KwePQpE0SCLp4f0zf7ZnRNAz8tJmzjukmY/bb5i+7qXfJPHV5if0exmJ1pzNcFTsqh55XCCBAm+Lu/PWvn6jGV/fui2tkW5zW3L/6Cssi4/58tK2H2HOwJ+mH1dYMxcsOaMv+3vL88URMN9t4+PvfzHK3Nffb/RZGoHos+3Ohzer2mjIBUWyHK4IC9DNkgnTp7MyxtbVrZGUa4CI1TBUkEQ7fZ7gGBwIZRrmgqC2TxSklK93tfgHjDBblgBVjBBWxAFoQw8ut4TTkAF9IAqWc5V1UPgM5mKZDnNYunS2DjP6bRmZXU4eXKvKBq83iZoBe3gfbgG5joc4zyeBTABVomi1WAYHYl8aDCMiEY/1fU2cAwuh9Ow0WQapWk10WjsjxkNzGCCo3AF7BTFSKtWXZOSMnbvnpWePvz06YMwGZYKwgmr9Uq/f1529qiqqqVwE7wJ0+EELE1J6RUO1/r9LtgF42F1YWG6w+Ho3LnHjBmv33rrzyRJPnbs4Jo1Szp06BD0eMKatWvXy5Yvf1nTLoFVRS0GTr+t+19fWWQ1G8de1v3cn4v/b77uVZ/wiSZIiNEECc5Ltu4qvnn60+8+f/+5rEd/MCXajHu84Nm84+BNP33X6RwdDpd4PFtgInwiisFhg/r/8TcTy6tqr7/9sfbtf2wyOYuL3wkGW0E3qIAlBkNbo3GgIJgV5VQotMRmmygIciCwStMqoBV0hyyIwiswGOywG6rBAMnQF1RYDqmCYNL1/uCBzxyOoVZrD6CpaaGqnhJFSyiUC0NhHpihAlpCCqwDE1wHwEZBqNR1RRTTNS0T2sEncAMkQwkslaTWquoGI/SCLeCHAdAEm9u3vzwtrWjnzo8LCi45fHg+tIMxAOyGlQCYYTJUwTq4HYAGWGQyyeGwAn1AgmV9+w5o27bT8uWL6usqW7Rs261bX5vNoarKnDnvulzZvXqNrShbN3xAETBr4cYZL/82Lye9vLJ25oI1CSWa4CIhkWc0QYLzkr492r37/P03T3961YY9zW3L59MsujA/Jy3mIk3wXdG/V8fVc35RX/+hrofBXpC3+uPX7v3ZHePeevYneTnp/Xt13LDwuTTnjqamY61bX5eeHoa1EAZrNGoPBGZqWr0gGAXBKIoOv3+OpvUGWRRbwhw48q/CMaTCWigEoD00wAEwge5ydYd6cEMOWD0eX1PTItAcjitEsTAUSoPhsA4aoAlUKIBWMAKAPRCGPro+DKKalgttYSuoZvNBKINsuFVVa8AJfWAX1EA3cMNusDudOdu2fdCq1ajBg389fvyrSUlNMAt80BGmgATXQ5ksbzcapaSk2IhS4Ppw2A0DQTSb14PauXPP+fM/EsUch81WlG7bs2t1TU2l1WrXNLVly+5lJ1fdPKFfLEXougV/zctJB/Jy0hNKNMHFQ0KMJkhwvtK3R7uVM//8wZzV785c2dy2/CfN6KFM6NHvnLyc9PULHu3SvqYgT/7w5Xv7/3scd15O+vsvPpCddqyh4VBKSmdBOAwHwAKSrg8OBGboul8Uk3y+ebreXxA+EwSr2RxITf2pwXAEdoBFFHfZbJmCsBUEcEIPqIUNoAUCBy2W9gbDITgIYUiVpJr6+g9U1atpQXAZDJugFBzQAlJgCRyFIDggACshABYA2sAqaCEIktNZAPPheLyiUgZsMxqdZwo3wjUWi3b48IpOna7r1286kJ7e4dpr38nLy5blj6EaAmACvyzvMZtb2WwZfn+F3b4TNoMMETCI4qddu46x25OWLJltNrcSBLlNi9zbfzx21eynvQ1H9u7dFg6HZNHz4pO3n0dhSV9EWWVdQokm+MYkpukTJDi/qaiq+9Wjr8my9Nzj50rG43NhrvxcsOFi4w9/fW/u0gq/vyQn09mza9HH84qhjyyvFkUpGvXo+hAwiOJGScqRJIPdPjoSKfF6FwiCxWRy5eVlnD5doqqC358aq2wEJ6Hcbr/EYunu968MBPaDvUWLdq1bD2lsLNu5c4EkuQShrc1W43YfgQxIgcEQgRnQMuadBRVKYDDsgxSoA7MoNui6aDLdHI1+pqpJsE8Ue4hik6IcAx1scAWEZfmzIUN+m5fXXxD+VfpbEARBEI4eXbpx4191fRgcMZlyVbUGvKIYycvrm5SUeeDALEXJh/KMjI42m/3EiTU2W5LT2SU5ub0a2frYAxPOZKT/+8szZy/e8MGLD+ad/7kgvtnl5nLavw9jEpyPJDyjCRKc3+Rmp8146TeKot7z0IvNbcs38Y58TyT8oz8wZZV1v/vFTb+9p/+kcQNXzn7qmUfu2rjowYF9ylrkZ7/3z3tO7Xz/uvFAnSi67pnW7Z3nJzY1faDrQUlKMZnyIpGaaDRsNtuvvPLW3FwdDkEU0gTBYLH08HjmS5IoSYY2bbpWVRV7PNXJyXm6HjGbnbJ8zOFwAl279odiOAZJABigFlpCN0gRhM0Qga4wFpy6bjGZblTV41BhMp0EwWjMNJuvsFongwgjwW+xrFZVy7p1f66p2W802o1Gm9FoMxis1dV7t259TRCMfbMOyrJgNg+xWsdqmpCf38/lKqw4vkRTw5d1t5lMclFR/9zcPjk5vWQ5LT29RyS04Y2/33V2baSf3Tlx7by/JZRoggQkPKMJElwwPP3PmUtWbnv3ufttVnOzGHCOyNCzSYTY/zB80U9fXlkLnNFbMxesKa+sjU3xl1fW3v/YG1t3VhUWXmE0JpeWznU6DQMHjhME8cCBjQcO7IaWgtBoMKRHIqVWa0o0Wq6qekHBlVVVa9u06b1///L09N6RSGUk4g+HvaIoDR583bFj28vLzbDb4eiXnt5w/Pgp6Ae7HI6hXu9yXc+DobBDFL2y3Nlk2idJBqPR2dRUHInoFss4UAKBhXBNUtLidu0679pVLUlFkcin/frd06XLZODQodkbNvwlKWmsw7bLEPBGkxw1NXardbTH81KHDmOKi+cPystZe+rUZX173HHHVb/78wyTtVdp6SazOcNmqX/3+Z9fALrzv0ko0QTfCQkxmiDBhUMzpnw6B5XoGc5l2y4AvvHhjQWMvz5jX17emKqqlTZbg6bRqlXfrKwW27cvLys9qOnJqnolOGClJB0tKpoUDjeWli6yGAwKxu7drzWbHdXVB06e3DRo0ESvt/HgvhWaICiKNmbM2KysnIaG+lmzPgSj0VhgMo0PhT5TlHJdd0mS3WCoCoVO2+05VquzZ8/B1dUn9u5daTReFgrta926wOOpiUa9Xm++0XipqpaFw3OLioakpbXfuvX5pKSxoKihz4radejbd+DO7WsPFTdYrdGsjOxlH/7uV4+8tHPPkXde+Fc4/K8eeWn3gepWLVq9/PTNCSV6hoQSTfDfJMRoggQXFM2S8uncV3vnvoXnKd/+wG7ecfCWe16WZWurVq4R/Vtt3nEopGY2NtaYdK9kFA4cEWE0bLPbqzIzB9WWz26TnOxRVWeq42ilt227UX5/bVnZ1u7dL9+3Y367nJzTiuZKMjnspqSUQkmSV3y6OC8398Qp2WweretRn+95qzVfliMtCjMOHDzcqdOlFRV7evQY6XCkzZ37t8LCFm53cPDgGxUlsnXr7IBf0vSBopgFSiSyVFWPtmlzc01N0OOZn5+fM3r0uO1bV0255pL+vTr+/ZVZzzxy1+eO7u8vz5w4bmhCiZ4hoUQTfC6CNyFGEyS4sNiyq/jm6U//+aFbRwzq9gPs7nzReeeLnecR39UhLa+svf+x1/r2aPPzOycCf3t55vtztnUuSvvjw1OBS65+NBrNdrnCV16a37tb22f/NiMzO+1vT98H3P/Yq2XVplCodso1vQf07jj9l3/PLyp47o935uWkX3/HHwRjyskTx66/atCA3h2n/PRlg2FkIPB+j66jcrMay6q8x0oq7rhpxKRxQ3/9h9eiFGzePH/C1VdJunf1plPdu4/auHHGJT06r9i8WaevwTAgGt2k6yccjjHh4IwUZ1JqVq5BjD77hzsuSJX5VUgo0QTfLQkxmiDBBUhFVd19v395aP8uN08c8b3u6PxSeOeXtec43+vBnLlgTf9eHWNSr7yy9pePvNS/V4eYVN2842BedvoZFXj9HX8489F/LFH928szgTMf/fKRV6tq3E/9bmr/Xh0XLN987ET5z+MJqq6/4w81de4nHprWv1fH8sraUTf+PhDw9+3a7pnH7vhkwZp/vLofjLIcykx352Wnl5RUtW3f5skHb0oo0a9FQokm+BIEb8nC5rYhQYIE3z0VVfW/fPQ1gyw99/jnTyB+S87T2KCEHv1OOE8PY3ll7RkF+R9DOPuj8srav70y6+d3TIi9s3nHwetuf+7mSSMe/+0k4O+vzJ44dkhCiX4tEko0wZeTEKMJElzITL7rye9Dj56nWiTGeSqjzx3O61//bL76QM6WqhczCSWa4HsiIUYTJLjAefqfMxev3P7ec/fbrKbvpMMLQ4tcGKP44bnAjlviL5OvTkKJJvj+SIjRBAkufN6btfL1Gcv//NCt7b51iP2FpEUupLH8AFzAui1xJvxPEko0wfdKQowmSHBRsGVX8c3Tn3n3+V99Gz164T2zL7wRfU9c8Afqgh/gtyGhRBN83yTKgSZIcFHQr0e7VTP/fPP0Z1Zu2PvNerggn9aJqqFfhQvyp/8PEmfCF5FQogl+AARfwjOaIMFFQ0VV/X2/f7lVi+zfTp/01b9VWlkHFFy4cuSCH+C3obSy7uI5Mokz4T/4Zr9+Qokm+LokxGiCBBcXsZRPsiw9/9VC7C8eLXLxjPSrc3Eek4tz1P9NQokm+MFIiNEECc5vKqrqt+wq3rKruKKqvm+PthPGDMrNTv2f35p815NfRY9ebE/li228X87FfDQu5rHHSCjRBD8kiTWjCRKcr1RU1T/7+vwp9zy9ZVdxvx7trh0zEBg28TcPPP7m//zuhy890LVji6un/dEfCH/RNhfh87ggJ600sXAQuCh//bO5yM+Er/vruz0BEko0wbcg4RlNkOC8pKKq/oHH3yyvrnv/ufvPdoVWVNUPm/ib957/Vb8e7f5nJ+/NWvnajOVP/nvKp6rTDR5/0GI2XbRa5CLXYSSOQJyLcwnpN1CiLfIzvj97ElwMJDyjCRKcl8xavKG8uq6iqn7KPU8/+/r8M+/nZqc++dCtN01/5qt0ctOEEbGNi0sqYu+8M3PlVbf+4YHH37zYHsBnk/CKXcy//tkU5KRdbCdDQokmaBYEX8mC5rYhQYIEX4+Kqvop9zzz5ENT+/VoF/s/sHrmE2c2GDbxt7FPv2Jvse3Lq+qfe2PBtWMGfq1Y+wuV0spaoOAiKwJZWll7sQ35q3CRHJavO0y3x59Qogm+ExJiNEGC84/Zizc++8aCs9XnTdP/kpud+uRDU79Zh1t2FT/w+FsVVfW3Txl5x5RR342VFwQXiQrhYhXfX50L/kxIKNEEzYgsNLcFCRIk+AZUVNWfffFeO2bAA4+/9dRZYrS8qr6iuq68qj4vO/XLXaTlVfXPvb4QyM5M2XvwZOKecDaFOekXvAoBSitrCy/0MX5LYmcCF6he/7ongNvjb5lQogm+OxJrRhMkOP+YMGYgsGVX8Zl3+vVod3YY07OvL5hyzzO/fvytLbuOPPv6wqETfztr8cbP7aq8qn7KPc+UV9dNGD1w3ew/K4p690Mvfd/2n18UxFXIhcrFoLa/Ewpy0i/IkyHhE03Q7MjNbUCCBAm+CU8+NPXXj781YfTAa8cMrKiu+/Xjb8Xcn+VV9bMXb5y1ZONTZ60Z3bKreMr0vxBXsWfzwONvAe8/96u87FTgo5d+/dQ/Z42f9senHprarijvhxzRuUzBhesfvVDH9f1xgZ0MCSWa4FxA8CfWjCZIcH6yZVfxs68vLK+uAyaMHnjvtHHlVfX/EpfP//K/N54y/S+rZz6R918p8WNT+We/8+6sVa/NWJ7Qo//BhTdLeyGJqh+YC+PQJZRognOE/weeW0l9mr/W6QAAAABJRU5ErkJggg==", "text/plain": [ "" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -59,6 +48,45 @@ "plt.show(lego, viewup='z', zoom=1.75)" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + " Volume:   vedo.volume.Volume\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
voxel spacing (104, 104, 104)
in memory size 1MB
point data array Tiff Scalars
scalar range (0, 150.0)
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/notebooks/numpy2volume.ipynb b/examples/notebooks/numpy2volume.ipynb index a5128720..271e7ce4 100644 --- a/examples/notebooks/numpy2volume.ipynb +++ b/examples/notebooks/numpy2volume.ipynb @@ -14,7 +14,7 @@ }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -56,31 +56,32 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - "vedo.mesh.Mesh\n", + " Volume:   vedo.volume.Volume\n", "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", "
bounds
(x/y/z)
0 ... 29.00
0 ... 29.00
0 ... 29.00
center of mass (14.4, 14.4, 14.4)
average size 16.762
nr. points / faces 8200 / 8208
dimensions (30, 30, 30)
voxel spacing (1.00, 1.00, 1.00)
in memory size 0MB
point data array input_scalars
cell data array input_scalars
scalar range (0, 1.000)
\n", "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "lego" + "vol" ] }, { diff --git a/examples/notebooks/pca.ipynb b/examples/notebooks/pca.ipynb index ab0bd4fd..29d96c65 100644 --- a/examples/notebooks/pca.ipynb +++ b/examples/notebooks/pca.ipynb @@ -9,20 +9,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "inside points # 2463\n", - "outside points # 2537\n", - "asphericity: 0.5412817357526739\n" + "\u001b[1m\u001b[32minside points # 2482\u001b[0m\n", + "\u001b[1m\u001b[31moutside points # 2518\u001b[0m\n", + "\u001b[1masphericity: 0.5372652622181039\u001b[0m\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, + "execution_count": 1, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -33,16 +34,16 @@ "from vedo import *\n", "import numpy as np\n", "\n", - "# settings.default_backend = '2d' # or k3d, ipyvtk, or vtk\n", + "# settings.default_backend = '2d' # or k3d, ipyvtk, trame, or vtk\n", "\n", "plt = Plotter(size=(1000,500))\n", "\n", - "pts = np.random.randn(5000, 3) * [3,2,1]# random gaussian point cloud\n", + "pts = np.random.randn(5000, 3) * [3,2,1] # random gaussian point cloud\n", "\n", - "elli = pca_ellipsoid(pts, pvalue=0.5) # group of [ellipse, 3 axes]\n", + "elli = pca_ellipsoid(pts, pvalue=0.5) # group of [ellipse, 3 axes]\n", "plt += elli\n", "\n", - "ipts = elli.inside_points(pts) # select points inside mesh\n", + "ipts = elli.inside_points(pts) # extract points inside mesh\n", "opts = elli.inside_points(pts, invert=True)\n", "plt += Points(ipts, c=\"g\")\n", "plt += Points(opts, c=\"r\")\n", @@ -55,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -86,7 +87,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/examples/notebooks/slider2d.ipynb b/examples/notebooks/slider2d.ipynb index f3c49463..d3c6e2a4 100644 --- a/examples/notebooks/slider2d.ipynb +++ b/examples/notebooks/slider2d.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "d7392fcc", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e9c49f3446564b878da7b61202e6ecaf", + "model_id": "bd23b3e80ac04b0182a6ae4ecaeccd86", "version_major": 2, "version_minor": 0 }, @@ -23,7 +23,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "cae768630c2547f68a5ed31f5717b44c", + "model_id": "8343dfff93a241f2bb162cbe534f88f7", "version_major": 2, "version_minor": 0 }, @@ -37,7 +37,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ea344652cf2247369609f6b6ad98de33", + "model_id": "ff53984d270240658ad1f8b32b4e11d5", "version_major": 2, "version_minor": 0 }, diff --git a/examples/notebooks/sphere.ipynb b/examples/notebooks/sphere.ipynb index 1a7bea1e..0fc5c139 100644 --- a/examples/notebooks/sphere.ipynb +++ b/examples/notebooks/sphere.ipynb @@ -2,13 +2,13 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "90aa2b5c56ad47d095bfaf846d72370b", + "model_id": "57e24154bb6744b683e93d69c55631ed", "version_major": 2, "version_minor": 0 }, @@ -23,15 +23,54 @@ "source": [ "from vedo import *\n", "\n", - "settings.default_backend='k3d'\n", + "settings.default_backend = 'k3d' # or k3d, ipyvtk,trame or vtk\n", "\n", - "s = Sphere().cut_with_plane(normal=(1,1,1))\n", - "scals = s.points()[:,2] # use z-coords to color vertices\n", + "sph = Sphere()\n", + "sph.cut_with_plane(normal=(1,1,1))\n", + "scalars = sph.vertices[:,2] # use z-coords to color vertices\n", "\n", "# NB, actions can be concatenated into a pipeline:\n", "# add point scalars with a choice of color map, use flat shading, print infos and then show\n", - "s.cmap('Set3', scals).add_scalarbar()\n", - "s.show(axes=1, viewup='z')" + "sph.cmap('Set3', scalars).add_scalarbar()\n", + "sph.show(axes=1, viewup='z')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + " Sphere:   vedo.mesh.Mesh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
bounds
(x/y/z)
-0.8135 ... 0.9977
-0.8135 ... 0.9977
-0.8146 ... 1.000
center of mass (0.155, 0.192, 0.361)
average size 0.879
nr. points / faces 657 / 1184
point data array Scalars
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sph" ] }, { diff --git a/examples/notebooks/test_types.ipynb b/examples/notebooks/test_types.ipynb index 9c203a51..113bc9b3 100644 --- a/examples/notebooks/test_types.ipynb +++ b/examples/notebooks/test_types.ipynb @@ -12,7 +12,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Mr. Rabbit:   vedo.mesh.Mesh
(...mbl.es/examples/data/bunny.obj)\n", @@ -27,7 +27,7 @@ "
" ], "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "59ebe06a", "metadata": {}, "outputs": [ @@ -55,7 +55,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Wild-type Embryo:   vedo.volume.Volume\n", @@ -71,10 +71,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "b22e6d01", "metadata": {}, "outputs": [ @@ -113,10 +113,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "id": "ddd6fbb6", "metadata": {}, "outputs": [ @@ -140,10 +140,10 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - " MouseLimb:   vedo.tetmesh.TetMesh\n", + " MouseLimb:   vedo.tetmesh.TetMesh
(...s/examples/data/limb_ugrid.vtk)\n", "\n", "\n", "\n", @@ -154,10 +154,10 @@ "
bounds
(x/y/z)
0 ... 1416
-711.3 ... 700.2
-851.6 ... 463.9
center of mass (582, 18.1, -252)
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -171,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "id": "221660dc", "metadata": {}, "outputs": [ @@ -181,24 +181,24 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - " UGrid:   vedo.ugrid.UGrid
(/tmp/ugrid.vtk)\n", + " UGrid:   vedo.ugrid.UGrid\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", "
bounds
(x/y/z)
0 ... 5.993
0 ... 2.000
0 ... 3.000
center of mass (3.64, 1.15, 1.64)
nr. points / cells 26 / 80
point data array SignedDistances
bounds
(x/y/z)
0 ... 13.00
0 ... 2.000
0 ... 3.000
center of mass (4.44, 1.15, 1.66)
nr. points / cells 33 / 18
point data array SignedDistance
cell data array elem_val
\n", "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -212,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "24f64426", "metadata": {}, "outputs": [ @@ -222,7 +222,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Axes:   vedo.assembly.Assembly\n", @@ -235,10 +235,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 7, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -251,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "id": "5ab995ad", "metadata": {}, "outputs": [ @@ -261,32 +261,32 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Histogram1D:   vedo.pyplot.Figure\n", "\n", - "\n", + "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "
nr. of parts 44
nr. of parts 43
position (0.0, 0.0, 0.0)
x-limits (-3.445, 3.300)
y-limits (0, 135.0)
world bounds
(x/y/z)
-3.814 ... 3.300
-0.2101 ... 5.239
0 ... 1.349e-3
x-limits (-3.661, 3.074)
y-limits (0, 146.0)
world bounds
(x/y/z)
-4.029 ... 3.074
-0.2098 ... 5.222
0 ... 1.347e-3
\n", "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo.pyplot import np, histogram\n", - "data = np.random.randn(1000)\n", - "histo = histogram(data)\n", + "mydata = np.random.randn(1000)\n", + "histo = histogram(mydata)\n", "histo" ] }, @@ -297,14 +297,6 @@ "metadata": {}, "outputs": [], "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "01177e99", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/volumetric/ugrid1.py b/examples/volumetric/ugrid1.py index 9170ffc2..967c1c40 100644 --- a/examples/volumetric/ugrid1.py +++ b/examples/volumetric/ugrid1.py @@ -1,11 +1,10 @@ - +"""Cut an UnstructuredGrid with a mesh""" from vedo import * ug1 = UGrid(dataurl+'ugrid.vtk') - -ug2= ug1.clone().tomesh().wireframe() +ms1 = ug1.clone().tomesh().wireframe() cyl = Cylinder(r=3, height=7).x(3).wireframe() -ug1.cut_with_mesh(cyl) +ms2 = ug1.cut_with_mesh(cyl).tomesh().cmap('jet') -show(ug1, ug2, cyl, axes=1).close() +show(ms1, ms2, cyl, __doc__, axes=1).close() diff --git a/examples/volumetric/ugrid2.py b/examples/volumetric/ugrid2.py index 1c962036..bc610a93 100644 --- a/examples/volumetric/ugrid2.py +++ b/examples/volumetric/ugrid2.py @@ -1,11 +1,15 @@ -"""Cut UGrid with plane""" +"""Cut an UnstructuredGrid with a plane""" from vedo import * ug = UGrid(dataurl+'ugrid.vtk') -ug.cmap('k5') +ug.cmap('blue8') ug = ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) -msh = ug.tomesh(shrink=0.8) # return a polygonal Mesh +# Create a polygonal Mesh for visualization +msh = ug.shrink(0.9).tomesh() -show([(ug, __doc__), msh], N=2, axes=1, viewup='z').close() +# note the difference with the following: +# msh = ug.tomesh().shrink(0.9) + +show(msh, axes=1, viewup='z').close() diff --git a/tests/issues/issue_656.py b/tests/issues/issue_656.py new file mode 100644 index 00000000..dc7709b7 --- /dev/null +++ b/tests/issues/issue_656.py @@ -0,0 +1,10 @@ + +from vedo import * + +one = Mesh(dataurl+"bunny.obj", c="green") +two = Mesh(dataurl+"bunny.obj", c="red").shift(0.3,0,0) + +one.add_shadow("z", -0.1) +two.add_shadow("z", -0.1) + +show(one, two, axes=1).close() \ No newline at end of file diff --git a/tests/issues/issue_893.py b/tests/issues/issue_893.py new file mode 100644 index 00000000..7dd51cf8 --- /dev/null +++ b/tests/issues/issue_893.py @@ -0,0 +1,33 @@ +import numpy as np +import vedo + +N = np.arange(24).reshape([2, 3, 4]) +cubes = [] +texts = [] +positions = [] +xs, ys, zs = N.shape +for x in range(xs): + for y in range(ys): + for z in range(zs): + pos = (x, y, z) + val = N[x, y, z] + cubes.append(vedo.Cube(pos=pos, side=0.6, alpha=0.1)) + positions.append(pos) + +pts = vedo.Points(positions) +labs= pts.labels2d(font='Quikhand', scale=2, justify="top-center", c="red4") +vedo.show(cubes, labs, axes=4).close() + +################################################################### (BUG) +texts = [] +xs, ys, zs = [2, 1, 2] +for x in range(xs): + for y in range(ys): + for z in range(zs): + pos = (x, y, z) + txt = vedo.Text3D(f"{pos}", pos, s=0.05, justify='centered', c='r5') + txt.rotate_x(0.00001) + txt.shift(0.00001, 0.00001, 0.00001) # same as rotate_x + texts.append(txt.follow_camera()) + +vedo.show(texts, axes=1) diff --git a/tests/issues/issue_905.py b/tests/issues/issue_905.py new file mode 100644 index 00000000..8a4e29a3 --- /dev/null +++ b/tests/issues/issue_905.py @@ -0,0 +1,58 @@ +import sys +from PyQt5 import Qt +from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor +from vedo import Plotter, Cone, printc + + +class MainWindow(Qt.QMainWindow): + + def __init__(self, parent=None): + + Qt.QMainWindow.__init__(self, parent) + self.frame = Qt.QFrame() + self.layout = Qt.QVBoxLayout() + self.vtkWidget = QVTKRenderWindowInteractor(self.frame) + + # Create renderer and add the vedo objects and callbacks + self.plt = Plotter(qt_widget=self.vtkWidget) + self.plt += Cone().rotate_x(20) + + self.button = self.plt.add_button( + self.buttonfunc, + pos=(0.7, 0.05), # x,y fraction from bottom left corner + states=["click to green"], # text for each state + c=["w"], # font color for each state + bc=["dg"], # background color for each state + font="courier", # font type + size=25, # font size + bold=True, # bold font + italic=False, # non-italic font style + ) + + self.plt.show() # <--- show the vedo rendering + + # Set-up the rest of the Qt window + button = Qt.QPushButton("My Button makes the cone red") + button.setToolTip("This is an example button") + button.clicked.connect(self.onClick) + self.layout.addWidget(self.vtkWidget) + self.layout.addWidget(button) + self.frame.setLayout(self.layout) + self.setCentralWidget(self.frame) + self.show() # <--- show the Qt Window + + def buttonfunc(self, obj, ename): + print("btn is clicked...") + self.plt.objects[0].color("green5").rotate_z(40) + + @Qt.pyqtSlot() + def onClick(self): + printc("..calling onClick") + self.plt.objects[0].color("red5").rotate_z(40) + self.plt.render() + + +if __name__ == "__main__": + app = Qt.QApplication(sys.argv) + window = MainWindow() + app.exec_() \ No newline at end of file diff --git a/tests/issues/issue_908.py b/tests/issues/issue_908.py new file mode 100644 index 00000000..1703443a --- /dev/null +++ b/tests/issues/issue_908.py @@ -0,0 +1,32 @@ +"""Colorize a mesh cell by clicking on it""" +from vedo import Mesh, Plotter, dataurl + +# Define the callback function to change the color of the clicked cell to red +def func(evt): + msh = evt.actor + if not msh: + return + pt = evt.picked3d + + idcell = msh.closest_point(pt, return_cell_id=True) + idpoint = msh.closest_point(pt,return_point_id=True) + + #This works always + # m.cellcolors[idcell] = [255,0,0,255] #RGBA + + #Points need to have the array removed first (BUG) + m.pointdata.remove("PointsRGBA") + m.pointcolors[idpoint] = [255,0,0,255] + +# Load a 3D mesh of a panther from a file and set its color to blue +m = Mesh(dataurl + "panther.stl").c("blue7") + +# Make the mesh opaque and set its line width to 1 +# m.force_opaque().linewidth(1) + +# Create a Plotter object and add the callback function to it +plt = Plotter() +plt.add_callback("mouse click", func) + +# Display the mesh with the Plotter object and the docstring +plt.show(m, __doc__, axes=1).close() \ No newline at end of file diff --git a/tests/issues/issue_939.py b/tests/issues/issue_939.py new file mode 100644 index 00000000..49628b63 --- /dev/null +++ b/tests/issues/issue_939.py @@ -0,0 +1,4 @@ +from vedo import * +# cloning generates the same object type (not Mesh) +print(type(Plane().clone())) +print(type(Line([0,0],[1,1]).clone())) diff --git a/tests/issues/issue_946.py b/tests/issues/issue_946.py new file mode 100644 index 00000000..ca8e1801 --- /dev/null +++ b/tests/issues/issue_946.py @@ -0,0 +1,56 @@ +import sys +from PyQt5.QtWidgets import QMainWindow, QApplication, QFrame, QVBoxLayout +from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor +from vedo import dataurl, Volume +from vedo.applications import Slicer3DPlotter + + +class MainWindow(QMainWindow): + def __init__(self, parent=None): + + QMainWindow.__init__(self, parent) + self.frame = QFrame() + self.layout = QVBoxLayout() + self.vtkWidget = QVTKRenderWindowInteractor(self.frame) + + # Create renderer and add the vedo objects and callbacks + self.vol = Volume(dataurl + "embryo.slc") + + self.plt = Slicer3DPlotter( + volume=self.vol, + cmaps=("gist_ncar_r", "jet", "Spectral_r", "hot_r", "bone_r"), + use_slider3d=True, + bg="blue1", + bg2="blue9", + qt_widget=self.vtkWidget, + ) + self.cid1 = self.plt.add_callback("mouse click", self._trigger) + + self.plt.show() + + # Set-up the rest of the Qt window + self.layout.addWidget(self.vtkWidget) + self.frame.setLayout(self.layout) + self.setCentralWidget(self.frame) + self.show() + + def _trigger(self, evt): + # print("You have clicked your mouse button. Event info:\n", evt) + i = int(self.plt.xslider.value) + j = int(self.plt.yslider.value) + k = int(self.plt.zslider.value) + print(i,j,k, type(self.vol.xslice(i))) + + def onClose(self): + # Disable the interactor before closing to prevent it + # from trying to act on already deleted items + print("CLOSING") + self.vtkWidget.close() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + window = MainWindow() + app.aboutToQuit.connect(window.onClose) + window.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/tests/issues/issue_948.py b/tests/issues/issue_948.py new file mode 100644 index 00000000..8c56b2bf --- /dev/null +++ b/tests/issues/issue_948.py @@ -0,0 +1,35 @@ +from vedo import * + +settings.default_font = "VictorMono" + +r = 0.2 + +points_2d = np.random.rand(10000, 2) - 0.5 +values = np.random.rand(10000) +vmin, vmax = values.min(), values.max() + +pcloud1 = Points(points_2d, c='k', r=5).rotate_x(30) +pcloud2 = pcloud1.clone().cut_with_cylinder(r=r, invert=True) + +cyl = Cylinder(r=r, height=1, res=360).alpha(0.2) +dists = pcloud1.distance_to(cyl, signed=True) +mask = dists < 0 +print("The boolean mask is", mask) + +pcloud1.pointdata['values'] = values +pcloud1.pointdata['MASK'] = mask + +pts1 = pcloud1.clone().point_size(5) +pts1.cut_with_scalar(0.5, 'MASK') + +pts1.cmap('bwr', 'values', vmin=vmin, vmax=vmax).add_scalarbar3d(title='values') +# pts1.cmap('RdYlBu', 'MASK').add_scalarbar3d(title='MASK') +pts1.scalarbar.rotate_x(90) + +grid = Grid(res=[100,100]).rotate_x(30) +grid.interpolate_data_from(pcloud1, n=3) +grid.cut_with_cylinder(r=r, invert=True) +grid.cmap('bwr', 'values', vmin=vmin, vmax=vmax).wireframe(False).lw(0) +grid.add_scalarbar3d(title='interpolated values').scalarbar.rotate_x(90) + +show(cyl, grid, axes=True) diff --git a/tests/issues/issue_950.py b/tests/issues/issue_950.py new file mode 100644 index 00000000..d32f7405 --- /dev/null +++ b/tests/issues/issue_950.py @@ -0,0 +1,17 @@ +from vedo import * + +np.random.seed(1) + +# generate a random set of points in 3D space +pts1 = np.random.randn(100, 3) +pts2 = np.random.randn(100, 3) + +lines = [] +for i in range(100): + # generate a line between two points + lines.append(Line(pts1[i], pts2[i]).color(i)) + +# create a new line from the lines list +newline = Lines(lines) + +show([lines, newline], N=2, axes=1) \ No newline at end of file diff --git a/tests/issues/w1.py b/tests/issues/w1.py new file mode 100644 index 00000000..98453234 --- /dev/null +++ b/tests/issues/w1.py @@ -0,0 +1,66 @@ +from vedo import * + + +def scroll_left(obj, ename): + global index + i = (index - 1) % len(meshes) + txt.text(meshes[i].name).c("k") + plt.remove(meshes[index]).add(meshes[i]) + plt.reset_camera() + index = i + +def scroll_right(obj, ename): + global index + i = (index + 1) % len(meshes) + txt.text(meshes[i].name).c("k") + plt.remove(meshes[index]).add(meshes[i]) + plt.reset_camera() + index = i + +def flag(obj, ename): + global index + txt.text("Flag Button Pressed!").c("r") + plt.reset_camera() + + +# load some meshes +m1 = Mesh(dataurl + "bunny.obj").c("green5") +m2 = Mesh(dataurl + "apple.ply").c("red5") +m3 = Mesh(dataurl + "beethoven.ply").c("blue5") +m1.name = "a bunny" +m2.name = "an apple" +m3.name = "mr. beethoven" + +meshes = [m1, m2, m3] +txt = Text2D(meshes[0].name, font="Courier", pos="top-center", s=1.5) + +plt = Plotter() + +bu = plt.add_button( + scroll_right, + pos=(0.8, 0.06), # x,y fraction from bottom left corner + states=[">"], # text for each state + c=["w"], # font color for each state + bc=["k5"], # background color for each state + size=40, # font size +) +bu = plt.add_button( + scroll_left, + pos=(0.2, 0.06), # x,y fraction from bottom left corner + states=["<"], # text for each state + c=["w"], # font color for each state + bc=["k5"], # background color for each state + size=40, # font size +) +bu = plt.add_button( + flag, + pos=(0.5, 0.06), + states=["Flag"], + c=["w"], + bc=["r"], + size=40, +) + +index = 0 # init global index +plt += txt +plt.show(meshes[0]).close() diff --git a/vedo/assembly.py b/vedo/assembly.py index 514d8fc7..eb14551e 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -9,7 +9,7 @@ import vedo from vedo.transformations import LinearTransform - +from vedo.visual import CommonVisual __docformat__ = "google" @@ -86,7 +86,7 @@ def procrustes_alignment(sources, rigid=False): ################################################# -class Group(vtk.vtkPropAssembly): +class Group(CommonVisual, vtk.vtkPropAssembly): """Form groups of generic objects (not necessarily meshes).""" def __init__(self, objects=()): @@ -94,7 +94,8 @@ def __init__(self, objects=()): super().__init__() - self.name = "" + self.name = "Group" + self.filename = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 @@ -214,7 +215,7 @@ def show(self, **options): ################################################# -class Assembly(vtk.vtkAssembly): +class Assembly(CommonVisual, vtk.vtkAssembly): """ Group many objects and treat them as a single new object. """ @@ -238,7 +239,8 @@ def __init__(self, *meshs): self.actor = self - self.name = "" + self.name = "Assembly" + self.filename = "" self.rendered_at = set() self.scalarbar = None self.info = {} diff --git a/vedo/backends.py b/vedo/backends.py index cd946d03..3ddb3503 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -123,9 +123,12 @@ def start_k3d(actors2show): for ia in actors2show2: - if isinstance(ia, (vtk.vtkCornerAnnotation, - vtk.vtkAssembly, - vtk.vtkActor2D)): + if isinstance(ia, + (vtk.vtkCornerAnnotation, vtk.vtkAssembly, vtk.vtkActor2D)): + continue + + if hasattr(ia, 'actor') and isinstance(ia.actor, + (vtk.vtkCornerAnnotation, vtk.vtkAssembly, vtk.vtkActor2D)): continue iacloned = ia @@ -145,15 +148,15 @@ def start_k3d(actors2show): # work out scalars first, Points Lines are also Mesh objs if isinstance(ia, Points): # print('scalars', ia.name, ia.npoints) - iap = ia.GetProperty() + iap = ia.properties - if ia.inputdata().GetNumberOfPolys(): + if ia.dataset.GetNumberOfPolys(): iacloned = ia.clone() - iapoly = iacloned.clean().triangulate().compute_normals().polydata() + iapoly = iacloned.clean().triangulate().compute_normals().dataset else: - iapoly = ia.polydata() + iapoly = ia.dataset - if ia.mapper().GetScalarVisibility() and ia.mapper().GetColorMode() > 0: + if ia.mapper.GetScalarVisibility() and ia.mapper.GetColorMode() > 0: vtkdata = iapoly.GetPointData() vtkscals = vtkdata.GetScalars() @@ -173,9 +176,9 @@ def start_k3d(actors2show): if not vtkscals.GetName(): vtkscals.SetName("scalars") - scals_min, scals_max = ia.mapper().GetScalarRange() + scals_min, scals_max = ia.mapper.GetScalarRange() color_attribute = (vtkscals.GetName(), scals_min, scals_max) - lut = ia.mapper().GetLookupTable() + lut = ia.mapper.GetLookupTable() lut.Build() kcmap = [] nlut = lut.GetNumberOfTableValues() @@ -193,20 +196,20 @@ def start_k3d(actors2show): arr = ia.pointdata[0] kimage = arr.reshape(-1, ky, kx) - colorTransferFunction = ia.GetProperty().GetRGBTransferFunction() + colorTransferFunction = ia.properties.GetRGBTransferFunction() kcmap = [] for i in range(128): r, g, b = colorTransferFunction.GetColor(i / 127) kcmap += [i / 127, r, g, b] - kbounds = np.array(ia.imagedata().GetBounds()) + np.repeat( - np.array(ia.imagedata().GetSpacing()) / 2.0, 2 + kbounds = np.array(ia.dataset.GetBounds()) + np.repeat( + np.array(ia.dataset.GetSpacing()) / 2.0, 2 ) * np.array([-1, 1] * 3) kobj = k3d.volume( kimage.astype(np.float32), color_map=kcmap, - # color_range=ia.imagedata().GetScalarRange(), + # color_range=ia.dataset.GetScalarRange(), alpha_coef=10, bounds=kbounds, name=name, @@ -230,9 +233,9 @@ def start_k3d(actors2show): vedo.notebook_plotter += kobj ################################################################# Lines - elif (hasattr(ia, "polydata") - and ia.polydata(False).GetNumberOfLines() - and ia.polydata(False).GetNumberOfPolys() == 0): + elif (hasattr(ia, "lines") + and ia.dataset.GetNumberOfLines() + and ia.dataset.GetNumberOfPolys() == 0): for i, ln_idx in enumerate(ia.lines): @@ -255,17 +258,17 @@ def start_k3d(actors2show): vedo.notebook_plotter += kobj ################################################################## Mesh - elif isinstance(ia, Mesh) and ia.npoints and ia.polydata(False).GetNumberOfPolys(): + elif isinstance(ia, Mesh) and ia.npoints and ia.dataset.GetNumberOfPolys(): # print('Mesh', ia.name, ia.npoints, len(ia.cells)) if not vtkscals: color_attribute = None cols = [] - if ia.mapper().GetColorMode() == 0: + if ia.mapper.GetColorMode() == 0: # direct RGB colors - vcols = ia.inputdata().GetPointData().GetScalars() + vcols = ia.dataset.GetPointData().GetScalars() if vcols and vcols.GetNumberOfComponents() == 3: cols = utils.vtk2numpy(vcols) cols = 65536 * cols[:, 0] + 256 * cols[:, 1] + cols[:, 2] @@ -345,7 +348,7 @@ def start_trame(): from trame.ui.vuetify import VAppLayout from trame.widgets import vtk as t_vtk, vuetify except ImportError: - print("trame is not installed, try:\n> pip install trame") + print("trame is not installed, try:\n> pip install trame==2.5.2") return None plt = vedo.plotter_instance diff --git a/vedo/core.py b/vedo/core.py index 5c42b5ba..6af56a25 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -17,8 +17,13 @@ __doc__ = "Base classes providing functionality to all vedo objects." -__all__ = ["CommonAlgorithms", "PointAlgorithms", "VolumeAlgorithms"] - +__all__ = [ + "CommonAlgorithms", + "PointAlgorithms", + "VolumeAlgorithms", + "UGridAlgorithms", +] + ############################################################################### class DataArrayHelper: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 984ab077..aa5e94e9 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -730,7 +730,7 @@ def polydata(self, **kwargs): colors.printc( "WARNING: call to .polydata() is obsolete, use property .dataset instead.", c="y") - return self + return self.dataset def clone(self, deep=True): diff --git a/vedo/shapes.py b/vedo/shapes.py index c8ea14d9..7d8a7210 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -964,6 +964,8 @@ def __init__( opacity in range [0,1] lw : (int) line width in pixel units + dotted : (bool) + draw a dotted line res : (int) resolution, number of points along the line (only relevant if only 2 points are specified) @@ -973,6 +975,20 @@ def __init__( ![](https://user-images.githubusercontent.com/32848391/52503049-ac9cb600-2be4-11e9-86af-72a538af14ef.png) """ + if len(start_pts)>1 and isinstance(start_pts[0], Line): + # passing a list of Line, see tests/issues/issue_950.py + polylns = vtk.vtkAppendPolyData() + for ln in start_pts: + polylns.AddInputData(ln.dataset) + polylns.Update() + super().__init__(polylns.GetOutput(), c, alpha) + self.lw(lw).lighting("off") + if dotted: + self.properties.SetLineStipplePattern(0xF0F0) + self.properties.SetLineStippleRepeatFactor(1) + self.name = "Lines" + return + if isinstance(start_pts, Points): start_pts = start_pts.vertices if isinstance(end_pts, Points): diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 0b2df0a1..5f3f5828 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -133,6 +133,9 @@ def __init__( self.transform = LinearTransform() + self.name = "TetMesh" + self.filename = "" + # inputtype = str(type(inputobj)) # print('TetMesh inputtype', inputtype) @@ -162,6 +165,7 @@ def __init__( self.dataset = r2t.GetOutput() elif isinstance(inputobj, str): + self.filename = inputobj if "https://" in inputobj: inputobj = download(inputobj, verbose=False) ug = loadUnStructuredGrid(inputobj) @@ -248,7 +252,7 @@ def _repr_html_(self): bounds = "
".join( [ - utils.utils.precision(min_x,4) + " ... " + utils.utils.precision(max_x,4) + utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) @@ -285,7 +289,7 @@ def _repr_html_(self): "

", help_text, "", "", - "", + "", "", pdata, diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 3de9a99e..cca056bc 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -8,7 +8,6 @@ import vtkmodules.all as vtk import vedo -from vedo import settings from vedo import utils from vedo.core import UGridAlgorithms from vedo.file_io import download, loadUnStructuredGrid @@ -134,7 +133,7 @@ def __init__(self, inputobj=None): self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() self.actor.SetMapper(self.mapper) - # self.mapper.SetInputData(self.dataset) ###NOT HERE! + self.mapper.SetInputData(self.dataset) ###NOT HERE? self.pipeline = utils.OperationNode( self, comment=f"#cells {self.dataset.GetNumberOfCells()}", @@ -156,6 +155,7 @@ def _repr_html_(self): library_name = "vedo.ugrid.UGrid" help_url = "https://vedo.embl.es/docs/vedo/ugrid.html" + # self.mapper.SetInputData(self.dataset) arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() diff --git a/vedo/visual.py b/vedo/visual.py index cc869501..f7532ca5 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -34,7 +34,7 @@ class CommonVisual: def __init__(self): self.mapper = None self.properties = None - self.actor = None + # self.actor = None self.scalarbar = None self.dataset = None @@ -94,7 +94,15 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation """Build a thumbnail of the object and return it as an array.""" # speed is about 20Hz for size=[200,200] ren = vtk.vtkRenderer() - ren.AddActor(self.actor) + + actor = self.actor + if isinstance(self, vedo.UGrid): + geo = vtk.vtkGeometryFilter() + geo.SetInputData(self.dataset) + geo.Update() + actor = vedo.Mesh(geo.GetOutput()).cmap("rainbow").actor + + ren.AddActor(actor) if axes: axes = vedo.addons.Axes(self) ren.AddActor(axes.actor) @@ -117,7 +125,7 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.ascontiguousarray(np.flip(narr, axis=0)) - ren.RemoveActor(self.actor) + ren.RemoveActor(actor) if axes: ren.RemoveActor(axes.actor) ren_win.Finalize() From d7ebca563d0a4f7280d54e5844e5f5b46904011b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 16:14:54 +0200 Subject: [PATCH 103/251] add more issues and discussions in tests/" --- docs/changes.md | 1 + tests/issues/discussion_527.py | 37 +++++++ tests/issues/discussion_716.py | 17 ++++ tests/issues/discussion_751.py | 19 ++++ tests/issues/discussion_784.py | 14 +++ tests/issues/discussion_800.py | 36 +++++++ tests/issues/{w1.py => discussion_942.py} | 2 +- tests/issues/issue_805.py | 15 +++ tests/issues/issue_851.py | 13 +++ tests/issues/issue_854.py | 18 ++++ tests/issues/issue_856.py | 18 ++++ tests/issues/issue_871a.py | 112 ++++++++++++++++++++++ tests/issues/issue_871b.py | 32 +++++++ vedo/core.py | 7 +- 14 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 tests/issues/discussion_527.py create mode 100644 tests/issues/discussion_716.py create mode 100644 tests/issues/discussion_751.py create mode 100644 tests/issues/discussion_784.py create mode 100644 tests/issues/discussion_800.py rename tests/issues/{w1.py => discussion_942.py} (98%) create mode 100644 tests/issues/issue_805.py create mode 100644 tests/issues/issue_851.py create mode 100644 tests/issues/issue_854.py create mode 100644 tests/issues/issue_856.py create mode 100644 tests/issues/issue_871a.py create mode 100644 tests/issues/issue_871b.py diff --git a/docs/changes.md b/docs/changes.md index 2136c8b8..28e73d3e 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -86,6 +86,7 @@ ex06_elasticity2.py release on master as branch? +tests/issues/issue_871.py ``` diff --git a/tests/issues/discussion_527.py b/tests/issues/discussion_527.py new file mode 100644 index 00000000..3394582a --- /dev/null +++ b/tests/issues/discussion_527.py @@ -0,0 +1,37 @@ +from vedo import * + +settings.immediate_rendering = False # faster for multi-renderers + +# (0,0) is the bottom-left corner of the window, (1,1) the top-right +# the order in the list defines the priority when overlapping +custom_shape = [ + dict(bottomleft=(0.0, 0.0), topright=(0.5, 1), bg="wheat", bg2="w"), # ren0 + dict(bottomleft=(0.5, 0.0), topright=(1, 1), bg="blue3", bg2="lb"), # ren1 + dict(bottomleft=(0.2, 0.05), topright=(0.8, 0.1), bg="white"), # ren2 +] +plt = Plotter(shape=custom_shape, size=(1600, 900)) + +s0 = ParametricShape(0) +s1 = ParametricShape(1) + +plt.show(s0, "renderer0", at=0) +plt.show(s1, "renderer1", at=1) + + +def slider1(widget, event): + value = slider_rep.GetValue() + s0.rotate_y(value) + s1.rotate_y(-value) + + +plt.renderer = plt.renderers[2] # make it the current renderer +slider = plt.add_slider(slider1, -5, 5, value=0, pos=([0.05, 0.02], [0.55, 0.02])) +slider_rep = slider.GetRepresentation() +vscale = 20 +slider_rep.SetSliderLength(0.003 * vscale) # make it thicker +slider_rep.SetSliderWidth(0.025 * vscale) +slider_rep.SetEndCapLength(0.001 * vscale) +slider_rep.SetEndCapWidth(0.025 * vscale) +slider_rep.SetTubeWidth(0.0075 * vscale) + +plt.interactive().close() \ No newline at end of file diff --git a/tests/issues/discussion_716.py b/tests/issues/discussion_716.py new file mode 100644 index 00000000..d10633e5 --- /dev/null +++ b/tests/issues/discussion_716.py @@ -0,0 +1,17 @@ + +from vedo import * + +msh = Polygon(nsides=5) + +pts = utils.pack_spheres(msh, radius=0.1) + +# optionally add some noise: +jitter = np.random.randn(len(pts),3)/1000 +jitter[:,2] = 0 +pts += jitter + +pts = Points(pts) +pts.cut_with_line(msh.vertices) # needs an ordered set of points + +show(msh, pts, axes=1) + diff --git a/tests/issues/discussion_751.py b/tests/issues/discussion_751.py new file mode 100644 index 00000000..f4b4e41d --- /dev/null +++ b/tests/issues/discussion_751.py @@ -0,0 +1,19 @@ +from vedo import * + +def callb(evt): + msh = evt.actor + if not msh: + return + pt = evt.picked3d + idcell = msh.closest_point(pt, return_cell_id=True) + msh.cellcolors[idcell] = [255,0,0,255] # red, opaque + +m = Mesh(dataurl + "290.vtk") +m.decimate().smooth().compute_normals() +m.compute_quality().cmap("Blues", on="cells") + +plt = Plotter() +plt.add_callback("mouse click", callb) +plt.show(m, m.labels("cellid")) +plt.close() + diff --git a/tests/issues/discussion_784.py b/tests/issues/discussion_784.py new file mode 100644 index 00000000..c8aefdf4 --- /dev/null +++ b/tests/issues/discussion_784.py @@ -0,0 +1,14 @@ + +from vedo import * + +s = Sphere(quads=True, res=10) # some test points in space +pts = s.points() + +vpts = Points(pts) +vpts.compute_normals_with_pca(invert=True) +vpts.print() + +normals = vpts.pointdata["Normals"] +arrows = Arrows(pts, pts + normals/10).c('red5') + +show(vpts, arrows, axes=True).close() diff --git a/tests/issues/discussion_800.py b/tests/issues/discussion_800.py new file mode 100644 index 00000000..32e62dd0 --- /dev/null +++ b/tests/issues/discussion_800.py @@ -0,0 +1,36 @@ + +from vedo import * + +def make_cap(t1, t2): + + newpoints = t1.vertices.tolist() + t2.vertices.tolist() + newfaces = [] + for i in range(n-1): + newfaces.append([i, i+1, i+n]) + newfaces.append([i+n, i+1, i+n+1]) + newfaces.append([2*n-1, 0, n]) + newfaces.append([2*n-1, n-1, 0]) + capm = Mesh([newpoints, newfaces]) + return capm + + +pts = [[sin(x), cos(x), x/3] for x in np.arange(0.1, 3, 0.3)] +vline = Line(pts, lw=3) + +t1 = Tube(pts, r=0.2, cap=False) +t2 = Tube(pts, r=0.3, cap=False) + +tc1a, tc1b = t1.boundaries().split() +tc2a, tc2b = t2.boundaries().split() +n = tc1b.npoints + +tc1b.join(reset=True).clean() # needed because indices are flipped +tc2b.join(reset=True).clean() + +capa = make_cap(tc1a, tc2a) +capb = make_cap(tc1b, tc2b) + +# show(vline, t1, t2, tc1a, tc1b, tc2a, tc2b, capa, capb, axes=1).close() + +thick_tube = merge(t1, t2, capa, capb).lw(1)#.clean() +show("thick_tube", vline, thick_tube, axes=1).close() \ No newline at end of file diff --git a/tests/issues/w1.py b/tests/issues/discussion_942.py similarity index 98% rename from tests/issues/w1.py rename to tests/issues/discussion_942.py index 98453234..bf1f8fd5 100644 --- a/tests/issues/w1.py +++ b/tests/issues/discussion_942.py @@ -63,4 +63,4 @@ def flag(obj, ename): index = 0 # init global index plt += txt -plt.show(meshes[0]).close() +plt.show(meshes[0]).close() \ No newline at end of file diff --git a/tests/issues/issue_805.py b/tests/issues/issue_805.py new file mode 100644 index 00000000..701ede07 --- /dev/null +++ b/tests/issues/issue_805.py @@ -0,0 +1,15 @@ +from vedo import * + +grid = Grid().wireframe(False) +square = Rectangle().extrude(0.5).scale(0.4).rotate_z(20).shift(0,0,-.1) +square.alpha(0.3) + +centers = grid.cell_centers +ids = square.inside_points(centers, return_ids=True) + +arr = np.zeros(centers.shape[0]).astype(np.uint8) +arr[ids] = 1 +grid.celldata["myflag"] = arr +grid.cmap("rainbow", "myflag", on='cells') + +show(grid, square, axes=8) \ No newline at end of file diff --git a/tests/issues/issue_851.py b/tests/issues/issue_851.py new file mode 100644 index 00000000..15f6f702 --- /dev/null +++ b/tests/issues/issue_851.py @@ -0,0 +1,13 @@ +from vedo import * + +x=[5]*20 +y=[24]*20 +z=range(20) +c=range(20) + +cols = color_map(c, "viridis", vmin=0, vmax=25) + +tube1 = Tube(list(zip(x,y,z)), c=c, res=30, r=5) +tube2 = Tube(list(zip(x,y,z)), c=cols, res=30, r=5).pos(15,0,0) + +show(tube1, tube2, bg='black', bg2='bb', axes=True) diff --git a/tests/issues/issue_854.py b/tests/issues/issue_854.py new file mode 100644 index 00000000..408f5eb3 --- /dev/null +++ b/tests/issues/issue_854.py @@ -0,0 +1,18 @@ +from vedo import * + +msh = ParametricShape("RandomHills").scale(2) + +spline = Spline([[1,1,-1], [0,2,0], [1,3,3]]).lw(3) + +pts = spline.vertices +cpts = [] +for i in range(spline.npoints-1): + p = pts[i] + q = pts[i+1] + ipts = msh.intersect_with_line(p, q) + if len(ipts): + cpts.append(ipts[0]) + +cpts = Points(cpts, r=12) + +show(msh, spline, cpts, axes=1, viewup="z") diff --git a/tests/issues/issue_856.py b/tests/issues/issue_856.py new file mode 100644 index 00000000..b1e7ad05 --- /dev/null +++ b/tests/issues/issue_856.py @@ -0,0 +1,18 @@ +from vedo import * + + +def func(widget, e): + x = widget.value + m = msh.clone() + ids = m.find_cells_in_bounds(xbounds=(-10,x)) + m.delete_cells(ids) + plt.remove("frog").add(m).render() + + +msh = Mesh("data/frog.obj").texture("data/frog.jpg") +msh.name = "frog" + +plt = Plotter(axes=1) +plt.add_slider(func, xmin=-6, xmax=3, value=-6) +plt.show(msh) +plt.close() \ No newline at end of file diff --git a/tests/issues/issue_871a.py b/tests/issues/issue_871a.py new file mode 100644 index 00000000..a4f1e437 --- /dev/null +++ b/tests/issues/issue_871a.py @@ -0,0 +1,112 @@ +import numpy as np +from vedo import settings, Plotter, Arrow, screenshot, \ + ScalarBar3D, Axes, mag, color_map, Assembly, Line + +settings.default_font = 'Theemim' +settings.multi_samples=8 + +filename = 'data/obs_xyz.dat' +xyz = np.loadtxt(filename, dtype=np.float64) +xyz = xyz[1:, :] - np.array([0, 20, 0]) +n_obs, n_col = xyz.shape + +# Read in the data +num_field = np.loadtxt('data/tmp_field.txt', dtype=np.float64) +amp = mag(num_field) + +# We need to create a few slices from the original arrays +# First create a mask array to mark all receiver points with x = -10, 0, 10 +x_mark = [-19.5, -9.236842110, 1.026315790, 11.289473680, 19.5] +y_mark = [-4.5, 4.5] +mask = np.zeros(n_obs, dtype=bool) + +# We need to create a mask array to mark all receiver points with x being +# any of x_mark and y being any of y_marko +for x_m in x_mark: + mask_local = np.abs(xyz[:, 0] - x_m) < 1e-6 + mask = np.logical_or(mask, mask_local) + +# Create an Arrows object for all the receivers where mask is True +start = xyz[mask, :] +orientation = num_field[mask, :] +orientation = orientation / mag(orientation)[:, None] # normalize +amp_mask = amp[mask] +vrange = np.array([amp_mask.min(), amp_mask.max()]) + +arrs = [] +for i in range(start.shape[0]): + arr = Arrow(start[i], start[i] + orientation[i] * 4) + color = color_map( + amp_mask[i], "jet", + vmin=vrange[0], vmax=vrange[1], + ) + arr.color(color).lighting('off') + arrs.append(arr) +arrows = Assembly(arrs) + +# create a 2D scalarbar +# scalarbar = ScalarBar( +# vrange, +# title='E (V/m)', +# c="jet", +# font_size=22, +# pos=(0.7, 0.25), +# size=(60,600), +# ) + +# create a dummy line to use as a 3D scalarbar +pos = (-10, -14, -32) +line = Line([0, 0], [1, 0]).cmap("jet", vrange * 1e6) +scalarbar = ScalarBar3D( + line, + # c="white", + title="E (:muV/m)", + title_size=3, + title_xoffset=3, + label_rotation=90, + label_offset=.5, + label_size=2, + pos=pos, + size=(1, 20), + nlabels=5, +) +scalarbar.rotate_z(-90) + +size = (3920, 2160) +plt = Plotter() + +axes = Axes( + arrows, + xtitle='Easting (m)', + ytitle='Northing (m)', + ztitle='Elevation (m)', + xtitle_position=0.60, + xlabel_size=0.018, + xtitle_offset=0.15, + ytitle_position=0.85, + ylabel_rotation=-90, + ylabel_size=0.02, + ytitle_rotation=180, + y_values_and_labels=[(-5, "-5"), (0, "0"), (5, "5")], + axes_linewidth=4, + xrange=arrows.xbounds(), + yrange=arrows.ybounds(), + zxgrid2=True, + zshift_along_y=1, + zaxis_rotation=-70, + ztitle_size=0.02, + ztitle_position=0.68, + xyframe_line=True, + grid_linewidth=2, +) +cam = dict( + position=(-58.8911, -54.5234, 8.63461), + focal_point=(-5.25549, -0.0457020, -23.8989), + viewup=(0.248841, 0.304150, 0.919549), + distance=83.0844, + clipping_range=(34.8493, 143.093), +) +fig_name = 'data/electric_field.png' +plt.show(arrows, axes, scalarbar, interactive=0, camera=cam) +# screenshot(fig_name) +plt.interactive().close() \ No newline at end of file diff --git a/tests/issues/issue_871b.py b/tests/issues/issue_871b.py new file mode 100644 index 00000000..bd8f6327 --- /dev/null +++ b/tests/issues/issue_871b.py @@ -0,0 +1,32 @@ +from vedo import * + +settings.default_font = "Theemim" + +pts = [(0, 0), (1, 0), (1, 1), (0, 1), (0, 0.5)] +data = [1, 10, 100, 1000, 10000] +scalarbar = None + +line = Line(pts, c="k", lw=10) +line.pointdata["mydata"] = data + +line.cmap("jet", "mydata", logscale=True) + +# automatic add scalarbar +# line.add_scalarbar(title="mydata", size=(100,800)) +# line.add_scalarbar3d(title="mydata", nlabels=4) +# +# Or manual add scalarbar +# scalarbar = ScalarBar(line, title="mydata", size=(100,800)) +scalarbar = ScalarBar3D(line, title="mydata", + c='black', nlabels=4, label_format=":.1e") +# modify the text of the scalarbar +for e in scalarbar.unpack(): + if isinstance(e, Text3D): + txt = e.text().replace(".0e+0", " x10^") + if "x10" in txt: # skip the title + e.text(txt) # update new text + e.scale(0.02) + +plt = Plotter() +plt += [line, line.labels("mydata", scale=.02), scalarbar] +plt.show() \ No newline at end of file diff --git a/vedo/core.py b/vedo/core.py index 6af56a25..7970d231 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -526,7 +526,12 @@ def inputdata(self): @property def npoints(self): - """Retrieve the number of points.""" + """Retrieve the number of points (or vertices).""" + return self.dataset.GetNumberOfPoints() + + @property + def nvertices(self): + """Retrieve the number of vertices (or points).""" return self.dataset.GetNumberOfPoints() @property From c61f0b1c5e63d940b66eea391f9d2832298d9c7d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 20:09:53 +0200 Subject: [PATCH 104/251] add tests/issues/test_remove_objects.py --- docs/changes.md | 5 +- tests/issues/run_all.sh | 11 +++ tests/issues/test_remove_objects.py | 33 +++++++++ vedo/addons.py | 5 +- vedo/applications.py | 2 +- vedo/assembly.py | 11 ++- vedo/file_io.py | 2 +- vedo/plotter.py | 100 ++++++++++++++++++++-------- 8 files changed, 130 insertions(+), 39 deletions(-) create mode 100755 tests/issues/run_all.sh create mode 100644 tests/issues/test_remove_objects.py diff --git a/docs/changes.md b/docs/changes.md index 28e73d3e..1ff53f20 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -86,8 +86,11 @@ ex06_elasticity2.py release on master as branch? -tests/issues/issue_871.py +tests/issues/issue_871a.py + +staging +clonala analysis ``` diff --git a/tests/issues/run_all.sh b/tests/issues/run_all.sh new file mode 100755 index 00000000..da82bbbb --- /dev/null +++ b/tests/issues/run_all.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# source run_all.sh +# +echo Press Esc at anytime to skip example, F1 to interrupt + +for f in *.py + do + echo "----------------------------------------" + echo "Processing $f script.." + python "$f" + done diff --git a/tests/issues/test_remove_objects.py b/tests/issues/test_remove_objects.py new file mode 100644 index 00000000..11dbd332 --- /dev/null +++ b/tests/issues/test_remove_objects.py @@ -0,0 +1,33 @@ +from vedo import * +from vedo.pyplot import matrix + + +def func(event): + if not event.object: + return + + if event.object.name == "Sphere": + sph = Sphere() + arr = np.random.rand(sph.npoints)*np.random.rand() + sph.cmap("Blues", arr) + # sph.add_scalarbar(title="Elevation", c="k") + sph.add_scalarbar3d(title="Elevation", c="k") + plt.remove("Sphere").add(sph).render() + + if event.object.name == "Matrix": + arr = np.eye(n, m)/2 + np.random.randn(n, m)*0.1 + mat = matrix(arr, scale=0.15).scale(2).y(2) + plt.remove("Matrix").add(mat).render() + +sph = Sphere() + +n, m = (6, 5) +mat = matrix( + np.eye(n, m)/2 + np.random.randn(n, m)*0.1, + scale=0.15, # size of bin labels; set it to 0 to remove labels +).scale(2).y(2) + +plt = Plotter() +plt.add_callback("mouse left click", func) +plt.show(sph, mat, 'click to change random data') + diff --git a/vedo/addons.py b/vedo/addons.py index b8fadc2f..57c7d831 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -577,7 +577,7 @@ def nodes(self, onscreen=False): ##################################################################### class SliderWidget(vtk.vtkSliderWidget): - """Helper class for vtkSliderWidget""" + """Helper class for `vtkSliderWidget`""" def __init__(self): super().__init__() @@ -637,6 +637,9 @@ def on(self): def off(self): self.EnabledOff() + def toggle(self): + self.SetEnabled(not self.GetEnabled()) + ##################################################################### def Goniometer( diff --git a/vedo/applications.py b/vedo/applications.py index 02deb710..179adb03 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -764,7 +764,7 @@ def button_func_mode(_obj, _ename): bold=0, italic=False, ) - bum.frame(c='w') + bum.frame(color='w') bum.status(volume.mode()) # add histogram of scalar diff --git a/vedo/assembly.py b/vedo/assembly.py index eb14551e..8a3e2066 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -574,14 +574,13 @@ def _genflatten(lst): return list(_genflatten([self])) - def pickable(self, value=None): + + def pickable(self, value=True): """Set/get the pickability property of an assembly and its elements""" + self.SetPickable(value) # set property to each element - if value is not None: - for elem in self.recursive_unpack(): - elem.SetPickable(value) - - # set property for self using inherited pickable() + for elem in self.recursive_unpack(): + elem.pickable(value) return self def show(self, **options): diff --git a/vedo/file_io.py b/vedo/file_io.py index 6ff788af..f03f251e 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1225,7 +1225,7 @@ def write(objct, fileoutput, binary=True): Possile extensions are: - `vtk, vti, npy, npz, ply, obj, stl, byu, vtp, vti, mhd, xyz, tif, png, bmp` """ - obj = objct + obj = objct.dataset # if isinstance(obj, Points): # picks transformation # obj = objct # elif isinstance(obj, (vtk.vtkActor, vtk.vtkVolume)): diff --git a/vedo/plotter.py b/vedo/plotter.py index c6b9c8e0..bbdd036c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -75,13 +75,13 @@ def __setitem__(self, key, value): def __repr__(self): f = "---------- ----------\n" for n in self.__slots__: - try: - if n == "actor" and self.actor and self.actor.data and self.actor.data.name: - f += f"event.{n} = {self.actor.name} ({self.actor.npoints} points)\n" + if n == "object" and self.object: + if self.object.name: + f += f"event.{n} = {self.object.name}\n" else: - f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" - except AttributeError: - pass + f += f"event.{n} = {self.object.__class__.__name__} \n" + else: + f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" return f @@ -824,11 +824,12 @@ def add(self, *objs, at=None): for a in acts: - if isinstance(a, vtk.vtkInteractorObserver): - a.add_to(self) # from cutters - continue - if ren: + + if isinstance(a, vtk.vtkInteractorObserver): + a.add_to(self) # from cutters + continue + try: ren.AddActor(a) except TypeError: @@ -870,33 +871,42 @@ def remove(self, *objs, at=None): break if has_str or has_actor: - # need to get the actors - acts = self.get_meshes(include_non_pickables=True, unpack_assemblies=False) - for a in acts: + # need to get the actors to search for + # acts = self.get_meshes(include_non_pickables=True, unpack_assemblies=False) + # acts+= self.get_volumes(include_non_pickables=True) + acts = self.get_actors(include_non_pickables=True) + for a in set(acts): + # print("PARSING", [a]) try: - if a.name and a.name in objs: + if (a.name and a.name in objs) or a in objs: + # print('a.name',a.name) objs.append(a) except AttributeError: - pass + try: + if (a.data.name and a.data.name in objs) or a.data in objs: + # print('a.data.name',a.data.name) + objs.append(a.data) + except AttributeError: + pass ir = self.renderers.index(ren) ids = [] for ob in set(objs): - if isinstance(ob, vtk.vtkInteractorObserver): - ob.remove_from(self) # from cutters - continue - - # remove it from internal list if possible - if ob in list(self.objects): - try: - idx = self.objects.index(ob) - ids.append(idx) - except ValueError: - pass + # will remove it from internal list if possible + try: + idx = self.objects.index(ob) + ids.append(idx) + except ValueError: + pass if ren: ### remove it from the renderer + + if isinstance(ob, vtk.vtkInteractorObserver): + ob.remove_from(self) # from cutters + continue + try: ren.RemoveActor(ob) except TypeError: @@ -1130,6 +1140,34 @@ def get_volumes(self, at=None, include_non_pickables=False): pass return vols + def get_actors(self, at=None, include_non_pickables=False): + """ + Return a list of Volumes from the specified renderer. + + Arguments: + at : (int) + specify which renderer to look at + include_non_pickables : (bool) + include non-pickable objects + """ + if at is None: + renderer = self.renderer + at = self.renderers.index(renderer) + elif isinstance(at, int): + renderer = self.renderers[at] + + acts = [] + acs = renderer.GetViewProps() + acs.InitTraversal() + for _ in range(acs.GetNumberOfItems()): + a = acs.GetNextProp() + if include_non_pickables or a.GetPickable(): + # try: + # acts.append(a.data) + # except AttributeError: + acts.append(a) + return acts + def reset_camera(self, tight=None): """ Reset the camera position and zooming. @@ -2342,6 +2380,8 @@ def fill_event(self, ename="", pos=(), enable_picking=True): self.picker.PickProp(x, y, self.renderer) actor = self.picker.GetProp3D() + # if not actor: # GetProp3D already picks Assembly + # actor = picker.GetAssembly() delta3d = np.array([0, 0, 0]) if actor: @@ -2374,11 +2414,13 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.keypress = key if enable_picking: try: - event.actor = actor.data # obsolete use object instead event.object = actor.data except AttributeError: - event.actor = None - event.object = None + event.object = actor + try: + event.actor = actor.data # obsolete use object instead + except AttributeError: + event.actor = actor event.picked3d = picked3d event.picked2d = (x, y) event.delta2d = (dx, dy) From de919db2a62a13f7eeeef1ac2b5c6234adc72aec Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 22:22:59 +0200 Subject: [PATCH 105/251] changes in core.apply_transform(), add NonLinearTransform --- vedo/core.py | 38 +++++++++--- vedo/pointcloud.py | 4 +- vedo/shapes.py | 3 +- vedo/transformations.py | 134 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 162 insertions(+), 17 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index 7970d231..25cb096d 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -10,7 +10,7 @@ import vedo from vedo import colors from vedo import utils -from vedo.transformations import LinearTransform +from vedo.transformations import LinearTransform, NonLinearTransform __docformat__ = "google" @@ -1277,24 +1277,45 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): """ if self.dataset.GetNumberOfPoints() == 0: return self - + if isinstance(LT, LinearTransform): + LT_is_linear = True tr = LT.T if LT.is_identity(): return self - if concatenate: - self.transform.concatenate(LT) + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): + LT_is_linear = True LT = LinearTransform(LT) + tr = LT.T if LT.is_identity(): return self + + elif isinstance(LT, NonLinearTransform): + LT_is_linear = False tr = LT.T - if concatenate: - self.transform.concatenate(LT) - elif isinstance(LT, (vtk.vtkThinPlateSplineTransform)): + self.transform = LT # reset + + elif isinstance(LT, vtk.vtkThinPlateSplineTransform): + LT_is_linear = False tr = LT - # cannot concatenate here + self.transform = NonLinearTransform(LT) # reset + + else: + vedo.logger.error("apply_transform(), unknown input type", type(LT)) + return self + + ################ + if LT_is_linear: + if concatenate: + try: + # self.transform might still not be linear + self.transform.concatenate(LT) + except AttributeError: + # in that case reset it + self.transform = LinearTransform() + ################ tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputData(self.dataset) @@ -1312,6 +1333,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.line_locator = None return self + def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index aa5e94e9..3098836c 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -11,7 +11,7 @@ import vedo from vedo import colors from vedo import utils -from vedo.transformations import LinearTransform +from vedo.transformations import LinearTransform, NonLinearTransform from vedo.core import PointAlgorithms from vedo.visual import PointsVisual @@ -1850,8 +1850,8 @@ def warp(self, source, target, sigma=1.0, mode="3d"): T.SetSigma(sigma) T.SetSourceLandmarks(ptsou) T.SetTargetLandmarks(pttar) - # self.transform = T self.apply_transform(T) + # self.transform = NonLinearTransform(T) self.pipeline = utils.OperationNode("warp", parents=parents) return self diff --git a/vedo/shapes.py b/vedo/shapes.py index 7d8a7210..33003ce0 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -975,12 +975,13 @@ def __init__( ![](https://user-images.githubusercontent.com/32848391/52503049-ac9cb600-2be4-11e9-86af-72a538af14ef.png) """ - if len(start_pts)>1 and isinstance(start_pts[0], Line): + if utils.is_sequence(start_pts) and len(start_pts)>1 and isinstance(start_pts[0], Line): # passing a list of Line, see tests/issues/issue_950.py polylns = vtk.vtkAppendPolyData() for ln in start_pts: polylns.AddInputData(ln.dataset) polylns.Update() + super().__init__(polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: diff --git a/vedo/transformations.py b/vedo/transformations.py index 3b735f51..401fc8da 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -18,6 +18,7 @@ __all__ = [ "LinearTransform", + "NonLinearTransform", "spher2cart", "cart2spher", "cart2cyl", @@ -152,12 +153,6 @@ def pop(self): self.T.Pop() return self - def invert(self): - """Invert transformation.""" - self.T.Inverse() - self.inverse_flag = bool(self.T.GetInverseFlag()) - return self - def is_identity(self): """Check if identity.""" m = self.T.GetMatrix() @@ -166,6 +161,12 @@ def is_identity(self): return True return False + def invert(self): + """Invert transformation.""" + self.T.Inverse() + self.inverse_flag = bool(self.T.GetInverseFlag()) + return self + def compute_inverse(self): """Compute inverse.""" t = self.clone() @@ -466,6 +467,127 @@ def reorient( return self +################################################### +class NonLinearTransform: + """Work with non-linear transformations.""" + + def __init__(self, T=None): + + if T is None: + T = vtk.vtkThinPlateSplineTransform() + + elif isinstance(T, vtk.vtkThinPlateSplineTransform): + S = vtk.vtkThinPlateSplineTransform() + S.DeepCopy(T) + T = S + + elif isinstance(T, NonLinearTransform): + S = vtk.vtkThinPlateSplineTransform() + S.DeepCopy(T.T) + T = S + + self.T = T + self.inverse_flag = False + + @property + def source_points(self): + """Get source points.""" + pts = self.T.GetSourceLandmarks() + vpts = [] + for i in range(pts.GetNumberOfPoints()): + vpts.append(pts.GetPoint(i)) + return np.array(vpts) + + @property + def target_points(self): + """Get target points.""" + pts = self.T.GetTargetLandmarks() + vpts = [] + for i in range(pts.GetNumberOfPoints()): + vpts.append(pts.GetPoint(i)) + return np.array(vpts) + + @source_points.setter + def source_points(self, pts): + """Set source points.""" + if _is_sequence(pts): + pass + else: + pts = pts.vertices + vpts = vtk.vtkPoints() + for p in pts: + vpts.InsertNextPoint(p[0], p[1], p[2]) + self.T.SetSourceLandmarks(vpts) + + @target_points.setter + def target_points(self, pts): + """Set target points.""" + if _is_sequence(pts): + pass + else: + pts = pts.vertices + vpts = vtk.vtkPoints() + for p in pts: + vpts.InsertNextPoint(p[0], p[1], p[2]) + self.T.SetTargetLandmarks(vpts) + return self + + @property + def sigma(self): + """Set sigma.""" + return self.T.GetSigma() + + @sigma.setter + def sigma(self, s): + """Get sigma.""" + self.T.SetSigma(s) + + @property + def mode(self, m): + if m=='3d': + self.T.SetBasisToR() + elif m=='2d': + self.T.SetBasisToR2LogR() + else: + vedo.logger.error('mode can be either "2d" or "3d"') + return self + + def clone(self): + """Clone transformation to make an exact copy.""" + return NonLinearTransform(self.T) + + def invert(self): + """Invert transformation.""" + self.T.Inverse() + self.inverse_flag = bool(self.T.GetInverseFlag()) + return self + + def compute_inverse(self): + """Compute inverse.""" + t = self.clone() + t.invert() + return t + + def apply_to(self, obj): + """Apply transformation.""" + if _is_sequence(obj): + v = self.T.TransformFloatPoint(obj) + return np.array(v) + + obj.transform = self + + tp = vtk.vtkTransformPolyDataFilter() + tp.SetTransform(self.T) + tp.SetInputData(obj.dataset) + tp.Update() + out = tp.GetOutput() + + obj.dataset.DeepCopy(out) + obj.point_locator = None + obj.cell_locator = None + obj.line_locator = None + + ######################################################################## # 2d ###### def cart2pol(x, y): From 1f2df92cedf2e03df5df504079bdc2c3a45a9ad9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 18 Oct 2023 22:44:03 +0200 Subject: [PATCH 106/251] fix warp4.py --- examples/advanced/warp4.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/examples/advanced/warp4.py b/examples/advanced/warp4.py index a52ea047..5463e6db 100644 --- a/examples/advanced/warp4.py +++ b/examples/advanced/warp4.py @@ -88,23 +88,27 @@ def onkeypress(self, evt): ###################################### MORPH & GENER printc("You must select your end point first!", c='y') return - output = [self.mesh1.clone().c('grey4'), self.mesh2, self.msg2] warped_plane = self.plane1.clone().pickable(False) warped_plane.warp(self.arrow_starts, self.arrow_stops, mode=self.mode) - output.append(warped_plane + Axes(warped_plane, xygrid=0, text_scale=0.6)) + T = warped_plane.transform - mw = self.mesh1.clone().apply_transform(warped_plane.transform).c('red4') - output.append(mw) + mw = self.mesh1.clone().apply_transform(T).c('red4') - T_inv = warped_plane.transform.compute_inverse() - a = Points(self.arrow_starts, r=10).apply_transform(warped_plane.transform) - b = Points(self.arrow_stops, r=10).apply_transform(warped_plane.transform) + a = Points(self.arrow_starts, r=10).apply_transform(T) + b = Points(self.arrow_stops, r=10).apply_transform(T) + + T_inv = T.compute_inverse() self.dottedln = Lines(a,b, res=self.n).apply_transform(T_inv).point_size(5) - output.append(self.dottedln) self.msg1.text(self.instructions) self.msg2.text("Morphed output:") - self.plotter.at(1).clear().add_renderer_frame().add(output).reset_camera() + axes = Axes(warped_plane, xygrid=0, text_scale=0.6) + + self.plotter.at(1).clear() + self.plotter.add_renderer_frame() + self.plotter.add(self.mesh1.clone().c('grey4'), self.mesh2, self.msg2) + self.plotter.add(warped_plane, axes, mw, self.dottedln) + self.plotter.reset_camera().render() elif evt.keypress == 'g': ##------- generate intermediate shapes if not self.dottedln: @@ -114,7 +118,8 @@ def onkeypress(self, evt): ###################################### MORPH & GENER allpts = allpts.reshape(len(self.arrow_starts), self.n+1, 3) for i in range(self.n + 1): pi = allpts[:,i,:] - m_nterp = self.mesh1.clone().warp(self.arrow_starts, pi, mode=self.mode).c('b3').lw(1) + m_nterp = self.mesh1.clone().warp(self.arrow_starts, pi, mode=self.mode) + m_nterp.c('blue3').lw(1) intermediates.append(m_nterp) self.msg2.text("Morphed output + Interpolation:") self.plotter.at(1).add(intermediates).render() @@ -128,14 +133,14 @@ def onkeypress(self, evt): ###################################### MORPH & GENER self.msg1.text(self.instructions) self.msg2.text("[output will show here]") self.plotter.at(0).clear() - self.plotter.add([self.plane1, self.msg1, self.mesh1, self.mesh2]) + self.plotter.add(self.plane1, self.msg1, self.mesh1, self.mesh2) self.plotter.at(1).clear().add_renderer_frame() - self.plotter.add([self.plane2, self.msg2]).render() + self.plotter.add(self.plane2, self.msg2).render() ######################################################################################## MAIN if __name__ == "__main__": - outlines = load(dataurl+"timecourse1d.npy") # load a set of 2d shapes + outlines = load(dataurl + "timecourse1d.npy") # load a set of 2d shapes mesh1 = outlines[25] mesh2 = outlines[35].scale(1.3).shift(-2,0,0) morpher = Morpher(mesh1, mesh2, 10) # generate 10 intermediate outlines From 72dbe883edbc0bcedf3d56370035f2d137b57fc7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 11:37:44 +0200 Subject: [PATCH 107/251] fix examples/basic/mesh_map2cell.py --- docs/changes.md | 1 - vedo/core.py | 2 ++ vedo/transformations.py | 6 ++++++ vedo/version.py | 2 +- vedo/visual.py | 21 +++++++++------------ 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 1ff53f20..9c8bc623 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -56,7 +56,6 @@ glyphs2.py ~/Projects/vedo/examples/advanced -warp4.py ~/Projects/vedo/examples/pyplot diff --git a/vedo/core.py b/vedo/core.py index 25cb096d..1d774699 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -752,6 +752,7 @@ def map_cells_to_points(self, arrays=(), move=False): c2p.ProcessAllArraysOn() c2p.Update() self._update(c2p.GetOutput(), reset_locators=False) + self.mapper.SetScalarModeToUsePointData() self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return self @@ -851,6 +852,7 @@ def map_points_to_cells(self, arrays=(), move=False): p2c.ProcessAllArraysOn() p2c.Update() self._update(p2c.GetOutput(), reset_locators=False) + self.mapper.SetScalarModeToUseCellData() self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return self diff --git a/vedo/transformations.py b/vedo/transformations.py index 401fc8da..f7ccf8d3 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -105,6 +105,8 @@ def __init__(self, T=None): S.DeepCopy(T.T) T = S + self.name = "LinearTransform" + self.comment = "" self.T = T self.T.PostMultiply() self.inverse_flag = False @@ -489,6 +491,10 @@ def __init__(self, T=None): self.T = T self.inverse_flag = False + self.name = "NonLinearTransform" + self.comment = "" + + @property def source_points(self): """Get source points.""" diff --git a/vedo/version.py b/vedo/version.py index bfa8b689..ae67d195 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev14a' +_version = '2023.5.0+dev15a' diff --git a/vedo/visual.py b/vedo/visual.py index f7532ca5..0b0d7f42 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1063,29 +1063,26 @@ def cmap( lut.Build() # arr.SetLookupTable(lut) # wrong! causes weird instabilities with LUT + # if data.GetScalars(): + # data.GetScalars().SetLookupTable(lut) + # data.GetScalars().Modified() data.SetActiveScalars(array_name) # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars # data.SetActiveAttribute(array_name, 0) # boh! - # if data.GetScalars(): - # data.GetScalars().SetLookupTable(lut) - # data.GetScalars().Modified() - self.mapper.SetLookupTable(lut) self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars self.mapper.ScalarVisibilityOn() self.mapper.SetScalarRange(lut.GetRange()) - # this seems unnecessary - # if on.startswith("point"): - # self.mapper.SetScalarModeToUsePointData() - # else: - # self.mapper.SetScalarModeToUseCellData() - # if hasattr(self.mapper, "SetArrayName"): - # self.mapper.SetArrayName(array_name) - # self.mapper.Modified() + if on.startswith("point"): + self.mapper.SetScalarModeToUsePointData() + else: + self.mapper.SetScalarModeToUseCellData() + if hasattr(self.mapper, "SetArrayName"): + self.mapper.SetArrayName(array_name) return self def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): From bb75ca85cb5b97e001ae1cc64500618338506850 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 13:53:06 +0200 Subject: [PATCH 108/251] fix histo_2d_b.py --- examples/basic/background_image.py | 2 +- examples/pyplot/isolines.py | 4 +- examples/volumetric/app_raycaster.py | 11 ++- examples/volumetric/image_mask.py | 39 -------- examples/volumetric/read_vts.py | 20 ---- examples/volumetric/slicer1.py | 6 +- examples/volumetric/tet_cut1.py | 13 ++- vedo/applications.py | 139 +++++++++++++++------------ vedo/cli.py | 5 +- vedo/file_io.py | 11 ++- vedo/interactor_modes.py | 2 + vedo/mesh.py | 9 +- vedo/pyplot.py | 12 ++- vedo/visual.py | 37 ++++--- 14 files changed, 154 insertions(+), 156 deletions(-) delete mode 100644 examples/volumetric/image_mask.py delete mode 100644 examples/volumetric/read_vts.py diff --git a/examples/basic/background_image.py b/examples/basic/background_image.py index 2b557866..767399ad 100644 --- a/examples/basic/background_image.py +++ b/examples/basic/background_image.py @@ -13,7 +13,7 @@ ) # Load a 3D model of a flamingo and rotate it so it is upright -a1 = load(dataurl+"flamingo.3ds").rotate_x(-90) +a1 = Cube().rotate_z(20) # Display a docstring on the second subrenderer plt.at(2).show(__doc__) diff --git a/examples/pyplot/isolines.py b/examples/pyplot/isolines.py index 1bbb12e4..ac0efcd2 100644 --- a/examples/pyplot/isolines.py +++ b/examples/pyplot/isolines.py @@ -13,7 +13,7 @@ isob = mesh0.isobands(n=5).add_scalarbar("H=Elevation") # make a copy and interpolate the Scalars from points to cells -mesh1 = mesh0.clone(deep=False).map_points_to_cells() +mesh1 = mesh0.clone().map_points_to_cells() printc('Mesh cell arrays :', mesh1.celldata.keys()) gvecs = mesh1.gradient(on='cells') @@ -22,7 +22,7 @@ ars.add_scalarbar3d(title='|:nablaH|:dot0.01 [arb.units]') # colormap the gradient magnitude directly on the mesh -mesh2 = mesh1.clone(deep=False).lw(0.1).cmap('jet', mag(gvecs), on='cells') +mesh2 = mesh1.clone().cmap('jet', mag(gvecs), on='cells') mesh2.add_scalarbar3d(title='|:nablaH| [arb.units]') plt = Plotter(N=4, size=(1200,900), axes=11) diff --git a/examples/volumetric/app_raycaster.py b/examples/volumetric/app_raycaster.py index 363f090a..42bbfa16 100644 --- a/examples/volumetric/app_raycaster.py +++ b/examples/volumetric/app_raycaster.py @@ -1,8 +1,11 @@ from vedo import Volume, dataurl from vedo.applications import RayCastPlotter -embryo = Volume(dataurl+"embryo.slc").mode(1).c('jet') # change properties +# Load Volume data +embryo = Volume(dataurl + "embryo.slc") +embryo.mode(1).cmap("jet") # change visual properties -plt = RayCastPlotter(embryo, bg='black', bg2='blackboard', axes=7) # Plotter instance - -plt.show(viewup="z").close() +# Create a Plotter instance and show +plt = RayCastPlotter(embryo, bg='black', bg2='blackboard', axes=7) +plt.show(viewup="z") +plt.close() diff --git a/examples/volumetric/image_mask.py b/examples/volumetric/image_mask.py deleted file mode 100644 index d7e38b23..00000000 --- a/examples/volumetric/image_mask.py +++ /dev/null @@ -1,39 +0,0 @@ -from vedo import Picture, show, settings -from vedo.pyplot import histogram -import numpy as np - -settings.default_font = "Theemim" - -pic = Picture("https://thumbs.dreamstime.com/z/green-grass-vase-tranquillity-white-rectangular-nature-81294508.jpg") -msh = pic.tomesh() # convert it to a quad-mesh -rgb = msh.pointdata["RGBA"] # numpy array - -tot = np.sum(rgb, axis=1) + 0.1 # add 0.1 to avoid divide by zero -ratio_g = rgb[:,1] / tot -ratio_r = rgb[:,0] / tot - -ids_r = np.where(ratio_r > 0.38) # threshold to find the red vase -ids_g = np.where(ratio_g > 0.36) # threshold for grass -ids_w = np.where(tot > 240*3) # threshold to identify white areas - -data_g = np.zeros(msh.npoints) -data_r = np.zeros(msh.npoints) -data_w = np.zeros(msh.npoints) -data_r[ids_r] = 1.0 -data_g[ids_g] = 1.0 -data_w[ids_w] = 1.0 - -ngreen = len(ids_g[0]) -total = len(rgb) - len(ids_r[0]) - len(ids_w[0]) -gvalue = int(ngreen/total*100 + 0.5) - -show([ - [pic, "Original image. How much grass is there?"], - histogram(ratio_g, logscale=True, xtitle='ratio of green'), - [msh.clone().cmap('Greens', data_g), f'Ratio of green is \approx {gvalue}%'], - [msh.clone().cmap('Reds', data_r), 'Masking the vase region'], - [msh.clone().cmap('Greys', data_w), 'Masking bright areas'], - ], - shape="2|3", size=(1370, 1130), sharecam=False, - bg='aliceblue', mode='image', zoom=1.5, interactive=True, -) diff --git a/examples/volumetric/read_vts.py b/examples/volumetric/read_vts.py deleted file mode 100644 index ec4786cb..00000000 --- a/examples/volumetric/read_vts.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Read structured grid data and show -the associated vector and scalar fields""" -from vedo import * - -settings.use_depth_peeling = True - -g = load(dataurl+'structgrid.vts') - -coords = g.vertices - -# g.print() gives the list of point and cell data contained in g -vects = g.pointdata['Momentum']/600 -print('numpy array shapes are:', coords.shape, vects.shape) - -# build arrows from starting points to endpoints, with colormap -arrows = Arrows(coords-vects, coords+vects, c='hot_r') - -g.cmap('jet', input_array='Density').linewidth(0.1).alpha(0.3) - -show(g, arrows, __doc__, axes=7, viewup='z').close() diff --git a/examples/volumetric/slicer1.py b/examples/volumetric/slicer1.py index c9263693..7834f720 100644 --- a/examples/volumetric/slicer1.py +++ b/examples/volumetric/slicer1.py @@ -1,5 +1,5 @@ -"""Use sliders to slice volume -Click button to change colormap""" +"""Use sliders to slice a Volume +(click button to change colormap)""" from vedo import dataurl, Volume, Text2D from vedo.applications import Slicer3DPlotter @@ -9,7 +9,7 @@ vol, cmaps=("gist_ncar_r", "jet", "Spectral_r", "hot_r", "bone_r"), use_slider3d=False, - bg="blue1", + bg="white", bg2="blue9", ) diff --git a/examples/volumetric/tet_cut1.py b/examples/volumetric/tet_cut1.py index 2096969d..62322a5d 100644 --- a/examples/volumetric/tet_cut1.py +++ b/examples/volumetric/tet_cut1.py @@ -1,13 +1,18 @@ """Cut a TetMesh with an arbitrary polygonal Mesh""" from vedo import * -settings.use_depth_peeling = True - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') -sphere = Sphere(r=500, c='g').x(400).alpha(0.2) +sphere = Sphere(r=500, c='green5', alpha=0.2).x(400) ugrid = tetmesh.cut_with_mesh(sphere, invert=True) tetmesh_cut = TetMesh(ugrid) +print(tetmesh_cut) + +show( + tetmesh_cut.tomesh(), + sphere, + __doc__, + axes=dict(xtitle='x [:mum]'), +).close() -show(tetmesh_cut, sphere, __doc__, axes=dict(xtitle='x [:mum]')).close() diff --git a/vedo/applications.py b/vedo/applications.py index 179adb03..39ada1d2 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -17,7 +17,7 @@ from vedo.plotter import Event, Plotter from vedo.pointcloud import fit_plane, Points from vedo.shapes import Line, Ribbon, Spline, Text2D -from vedo.pyplot import CornerHistogram +from vedo.pyplot import CornerHistogram, histogram from vedo.addons import SliderWidget @@ -52,7 +52,7 @@ class Slicer3DPlotter(Plotter): def __init__( self, volume, - cmaps=("gist_ncar_r", "hot_r", "bone_r", "jet", "Spectral_r"), + cmaps=("gist_ncar_r", "hot_r", "bone", "bone_r", "jet", "Spectral_r"), clamp=True, use_slider3d=False, show_histo=True, @@ -68,7 +68,7 @@ def __init__( cmaps : (list) list of color maps names to cycle when clicking button clamp : (bool) - clamp scalar to reduce the effect of tails in color mapping + clamp scalar range to reduce the effect of tails in color mapping use_slider3d : (bool) show sliders attached along the axes show_histo : (bool) @@ -95,14 +95,18 @@ def __init__( cx, cy, cz = "lr", "lg", "lb" ch = (0.8, 0.8, 0.8) - if len(self.renderers) > 1: # 2d sliders do not work with multiple renderers + if len(self.renderers) > 1: + # 2d sliders do not work with multiple renderers use_slider3d = True - box = volume.box().alpha(0.1) + self.volume = volume + box = volume.box().alpha(0.2) self.add(box) if show_icon: - self.add_inset(volume, pos=(0.85, 0.85), size=0.15, c="w", draggable=draggable) + self.add_inset( + volume, pos=(0.9, 0.9), size=0.15, c="w", draggable=draggable + ) # inits la, ld = 0.7, 0.3 # ambient, diffuse @@ -118,57 +122,76 @@ def __init__( rmin = max(rmin, meanlog - (rmax - meanlog) * 0.9) # print("scalar range clamped to range: (" # + precision(rmin, 3) + ", " + precision(rmax, 3) + ")") - self._cmap_slicer = cmaps[0] - msh = volume.zslice(int(dims[2] / 2)).lighting("", la, ld, 0) - msh.name = "ZSlice" - msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - if len(cmaps) > 1: - msh.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) - msh.scalarbar.name = "scalarbar" - # self.add(msh.clone()) # BUG - self.add(msh) + self.cmap_slicer = cmaps[0] - self._oldi = None - self._oldj = None - self._oldk = None + self.current_i = None + self.current_j = None + self.current_k = int(dims[2] / 2) + self.xslice = None + self.yslice = None + self.zslice = None + self.zslice = volume.zslice(self.current_k).lighting("", la, ld, 0) + self.zslice.name = "ZSlice" + self.zslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) + self.add(self.zslice) + + if show_histo: + # try to reduce the number of values to histogram + dims = self.volume.dimensions() + n = (dims[0]-1) * (dims[1]-1) * (dims[2]-1) + n = min(1_000_000, n) + data_reduced = np.random.choice(data, n) + self.histogram = histogram( + data_reduced, + # title=volume.filename, + bins=20, logscale=True, + c=self.cmap_slicer, bg=ch, alpha=1, + axes=dict(text_scale=2), + ).as2d(pos=[-0.925,-0.88], scale=0.4) + self.add(self.histogram) + + ################# def slider_function_x(widget, event): i = int(self.xslider.value) - if i == self._oldi: + if i == self.current_i: return - self._oldi = i - msh = volume.xslice(i).lighting("", la, ld, 0) - msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - msh.name = "XSlice" + self.current_i = i + self.xslice = volume.xslice(i).lighting("", la, ld, 0) + self.xslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) + self.xslice.name = "XSlice" self.remove("XSlice") # removes the old one if 0 < i < dims[0]: - self.add(msh) + self.add(self.xslice) + self.render() def slider_function_y(widget, event): j = int(self.yslider.value) - if j == self._oldj: + if j == self.current_j: return - self._oldj = j - msh = volume.yslice(j).lighting("", la, ld, 0) - msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - msh.name = "YSlice" + self.current_j = j + self.yslice = volume.yslice(j).lighting("", la, ld, 0) + self.yslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) + self.yslice.name = "YSlice" self.remove("YSlice") if 0 < j < dims[1]: - self.add(msh) + self.add(self.yslice) + self.render() def slider_function_z(widget, event): k = int(self.zslider.value) - if k == self._oldk: + if k == self.current_k: return - self._oldk = k - msh = volume.zslice(k).lighting("", la, ld, 0) - msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - msh.name = "ZSlice" + self.current_k = k + self.zslice = volume.zslice(k).lighting("", la, ld, 0) + self.zslice.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) + self.zslice.name = "ZSlice" self.remove("ZSlice") if 0 < k < dims[2]: - self.add(msh) + self.add(self.zslice) + self.render() if not use_slider3d: self.xslider = self.add_slider( @@ -202,6 +225,7 @@ def slider_function_z(widget, event): show_value=False, c=cz, ) + else: # 3d sliders attached to the axes bounds bs = box.bounds() self.xslider = self.add_slider3d( @@ -237,42 +261,35 @@ def slider_function_z(widget, event): ) ################# - def buttonfunc(_obj, _ename): + def button_func(obj, ename): bu.switch() - self._cmap_slicer = bu.status() - for m in self.actors: - try: - if "Slice" in m.name: - m.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) - if len(cmaps) > 1: - self.remove("scalarbar") - m2 = m.clone() - m2.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) - m2.scalarbar.name = "scalarbar" - self.add(m2.scalarbar) - except AttributeError: - pass + self.cmap_slicer = bu.status() + for m in self.objects: + if "Slice" in m.name: + m.cmap(self.cmap_slicer, vmin=rmin, vmax=rmax) + self.remove(self.histogram) + if show_histo: + self.histogram = histogram( + data_reduced, + # title=volume.filename, + bins=20, logscale=True, + c=self.cmap_slicer, bg=ch, alpha=1, + axes=dict(text_scale=2), + ).as2d(pos=[-0.925,-0.88], scale=0.4) + self.add(self.histogram) self.render() if len(cmaps) > 1: bu = self.add_button( - buttonfunc, - pos=(0.275, 0.005), + button_func, states=cmaps, c=["k9"] * len(cmaps), bc=["k1"] * len(cmaps), # colors of states - size=14, + size=16, bold=True, ) - bu.pos([0.24, 0.005], "bottom-left") + bu.pos([0.04, 0.01], "bottom-left") - ################# - if show_histo: - hist = CornerHistogram( - data, s=0.2, bins=25, logscale=True, - pos=(0.02, 0.02), c=ch, bg=ch, alpha=0.7 - ) - self.add(hist) class Slicer3DTwinPlotter(Plotter): """ diff --git a/vedo/cli.py b/vedo/cli.py index 1ad26e50..6b833bb3 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -765,12 +765,11 @@ def draw_scene(args): bg="white", bg2="lb", use_slider3d=useSlider3D, - cmaps=[args.cmap, "Spectral_r", "hot_r", "bone_r", "gist_ncar_r"], - alpha=args.alpha, axes=args.axes_type, clamp=True, - size=(1000, 800), + size=(1350, 1000), ) + plt.show() return ######################################################################## diff --git a/vedo/file_io.py b/vedo/file_io.py index f03f251e..822973a6 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -621,7 +621,16 @@ def load3DS(filename): a = actors.GetItemAsObject(i) acts.append(a) del renWin - return Assembly(acts) + + wrapped_acts = acts + # wrapped_acts = [] + # for a in acts: + # newa = Mesh(a.GetMapper().GetInput()) + # newa.pos(a.GetPosition()) + # newa.copy_properties_from(a) + # wrapped_acts.append(newa) + + return wrapped_acts def loadOFF(filename): diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index 3958ea85..80889294 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -767,6 +767,8 @@ def PerformPickingOnSelection(self): self.start_x, self.start_y, self.end_x, self.end_y """ renderer = self.GetCurrentRenderer() + if not renderer: + return [] assemblyPath = renderer.PickProp(self.start_x, self.start_y, self.end_x, self.end_y) diff --git a/vedo/mesh.py b/vedo/mesh.py index a1acd954..452e853d 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1869,12 +1869,19 @@ def isobands(self, n=10, vmin=None, vmax=None): bcf.GenerateContourEdgesOff() bcf.Update() bcf.GetOutput().GetCellData().GetScalars().SetName("IsoBands") + m1 = Mesh(bcf.GetOutput()).compute_normals(cells=True) m1.mapper.SetLookupTable(lut) - + m1.mapper.SetScalarRange(lut.GetRange()) m1.pipeline = OperationNode("isobands", parents=[self]) return m1 + # self._update(bcf.GetOutput()) + # self.mapper.SetLookupTable(lut) + # self.mapper.SetScalarRange(lut.GetRange()) + # self.pipeline = OperationNode("isobands", parents=[self]) + # return self + def isolines(self, n=10, vmin=None, vmax=None): """ Return a new `Mesh` representing the isolines of the active scalars. diff --git a/vedo/pyplot.py b/vedo/pyplot.py index eb97edc8..18345026 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -756,6 +756,7 @@ def __init__( errors=False, density=False, logscale=False, + max_entries=None, fill=True, radius=0.075, c="olivedrab", @@ -797,6 +798,8 @@ def __init__( normalize the area to 1 by dividing by the nr of entries and bin size logscale : (bool) use logscale on y-axis + max_entries : (int) + if `data` is larger than `max_entries`, a random sample of `max_entries` is used fill : (bool) fill bars with solid color `c` gap : (float) @@ -832,6 +835,9 @@ def __init__( ![](https://vedo.embl.es/images/pyplot/histo_1D.png) """ + if max_entries and data.shape[0] > max_entries: + data = np.random.choice(data, max_entries) + # purge NaN from data valid_ids = np.all(np.logical_not(np.isnan(data))) data = np.asarray(data[valid_ids]).ravel() @@ -3052,7 +3058,7 @@ def _histogram_quad_bin(x, y, **kwargs): zscale = kwargs.pop("zscale", 1) cmap = kwargs.pop("cmap", "Blues_r") - gr = histo.actors[2] + gr = histo.objects[2] d = gr.diagonal_size() tol = d / 1_000_000 # tolerance if gap >= 0: @@ -3089,8 +3095,8 @@ def _histogram_quad_bin(x, y, **kwargs): msh.cmap(cmap, newzvals, name="Frequency") msh.lw(1).lighting("ambient") - histo.actors[2] = msh - histo.RemovePart(gr) + histo.objects[2] = msh + histo.RemovePart(gr.actor) histo.AddPart(msh.actor) histo.objects.append(msh) return histo diff --git a/vedo/visual.py b/vedo/visual.py index 0b0d7f42..592654dc 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -569,16 +569,25 @@ def copy_properties_from(self, source, deep=True, actor_related=True): Copy properties from another ``Points`` object. """ pr = vtk.vtkProperty() + try: + sp = source.properties + mp = source.mapper + sa = source.actor + except AttributeError: + sp = source.GetProperty() + mp = source.GetMapper() + sa = source + if deep: - pr.DeepCopy(source.properties) + pr.DeepCopy(sp) else: - pr.ShallowCopy(source.properties) + pr.ShallowCopy(sp) self.actor.SetProperty(pr) self.properties = pr if self.actor.GetBackfaceProperty(): bfpr = vtk.vtkProperty() - bfpr.DeepCopy(source.actor.GetBackfaceProperty()) + bfpr.DeepCopy(sa.GetBackfaceProperty()) self.actor.SetBackfaceProperty(bfpr) self.properties_backface = bfpr @@ -586,22 +595,22 @@ def copy_properties_from(self, source, deep=True, actor_related=True): return self # mapper related: - self.mapper.SetScalarVisibility(source.mapper.GetScalarVisibility()) - self.mapper.SetScalarMode(source.mapper.GetScalarMode()) - self.mapper.SetScalarRange(source.mapper.GetScalarRange()) - self.mapper.SetLookupTable(source.mapper.GetLookupTable()) - self.mapper.SetColorMode(source.mapper.GetColorMode()) + self.mapper.SetScalarVisibility(mp.GetScalarVisibility()) + self.mapper.SetScalarMode(mp.GetScalarMode()) + self.mapper.SetScalarRange(mp.GetScalarRange()) + self.mapper.SetLookupTable(mp.GetLookupTable()) + self.mapper.SetColorMode(mp.GetColorMode()) self.mapper.SetInterpolateScalarsBeforeMapping( - source.mapper.GetInterpolateScalarsBeforeMapping() + mp.GetInterpolateScalarsBeforeMapping() ) self.mapper.SetUseLookupTableScalarRange( - source.mapper.GetUseLookupTableScalarRange() + mp.GetUseLookupTableScalarRange() ) - self.actor.SetPickable(source.actor.GetPickable()) - self.actor.SetDragable(source.actor.GetDragable()) - self.actor.SetTexture(source.actor.GetTexture()) - self.actor.SetVisibility(source.actor.GetVisibility()) + self.actor.SetPickable(sa.GetPickable()) + self.actor.SetDragable(sa.GetDragable()) + self.actor.SetTexture(sa.GetTexture()) + self.actor.SetVisibility(sa.GetVisibility()) return self def color(self, c=False, alpha=None): From e71fa10896e00555e587a529c07d290ad4cce337 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 14:11:57 +0200 Subject: [PATCH 109/251] fix streamlines4.py --- examples/volumetric/delaunay3d.py | 2 +- examples/volumetric/streamlines4.py | 9 ++++--- examples/volumetric/tensors.py | 6 +++-- vedo/shapes.py | 6 ++--- vedo/utils.py | 40 +++-------------------------- 5 files changed, 17 insertions(+), 46 deletions(-) diff --git a/examples/volumetric/delaunay3d.py b/examples/volumetric/delaunay3d.py index ff1291c7..af42b784 100644 --- a/examples/volumetric/delaunay3d.py +++ b/examples/volumetric/delaunay3d.py @@ -17,6 +17,6 @@ # cmesh.pipeline.show() # to show the graph of operations show([(s, pin, "Generate points in a Sphere"), - (cmesh, __doc__), + (cmesh.tomesh(), __doc__), ], N=2, axes=1, ).close() diff --git a/examples/volumetric/streamlines4.py b/examples/volumetric/streamlines4.py index c1ff9772..42e9e269 100644 --- a/examples/volumetric/streamlines4.py +++ b/examples/volumetric/streamlines4.py @@ -1,9 +1,10 @@ from vedo import * -ug = Mesh('https://github.com/marcomusy/vedo/files/4602353/domain_unstruct.vtk.gz') +f = download('https://github.com/marcomusy/vedo/files/4602353/domain_unstruct.vtk.gz') +ug = UGrid(gunzip(f)) # make up some custom vector field -pts = ug.points() +pts = ug.vertices x,y,z = pts.T windx = np.ones_like(x)*4 windy = np.exp(-(x+18)**2/100) * np.sign(y)/(abs(y)+8)*20 @@ -17,6 +18,6 @@ xpr = np.zeros_like(ypr)-40 probes = np.c_[xpr, ypr] -str_lns = StreamLines(ug, probes, max_propagation=80, lw=3) +lines = StreamLines(ug, probes, max_propagation=80, lw=3).c("red4") -show(ars, str_lns, zoom=8, bg2='lb').close() +show(ars, lines, zoom=8, bg2='lb').close() diff --git a/examples/volumetric/tensors.py b/examples/volumetric/tensors.py index febfc961..16fcf322 100644 --- a/examples/volumetric/tensors.py +++ b/examples/volumetric/tensors.py @@ -2,15 +2,17 @@ import vtk from vedo import * -# Create a volume with tensors +# Create a test volume with tensors pl = vtk.vtkPointLoad() pl.SetLoadValue(50) pl.SetSampleDimensions(6,6,6) pl.ComputeEffectiveStressOn() pl.SetPoissonsRatio(0.2) pl.SetModelBounds(-10,10,-10,10,-10,10) +pl.Update() -vol = Volume(pl, mode=1) +vol = Volume(pl.GetOutput(), mode=1) +print(vol.pointdata) # Extract a slice of the volume data at index 3 zsl = vol.zslice(3) diff --git a/vedo/shapes.py b/vedo/shapes.py index 33003ce0..24e7703a 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1547,7 +1547,7 @@ def StreamLines( if active_vectors: grid.GetPointData().SetActiveVectors(active_vectors) - b = grid.GetBounds() + b = grid.bounds() size = (b[5] - b[4] + b[3] - b[2] + b[1] - b[0]) / 3 if initial_step_size is None: initial_step_size = size / 500.0 @@ -1572,7 +1572,7 @@ def read_points(): src.Update() st = vtk.vtkStreamTracer() - st.SetInputDataObject(grid) + st.SetInputDataObject(grid.dataset) st.SetSourceConnection(src.GetOutputPort()) st.SetInitialIntegrationStep(initial_step_size) @@ -1661,7 +1661,7 @@ def read_points(): sta.mapper.SetResolveCoincidentTopologyToPolygonOffset() sta.lighting("off") - scals = grid.GetPointData().GetScalars() + scals = grid.dataset.GetPointData().GetScalars() if scals: sta.mapper.SetScalarRange(scals.GetRange()) if scalar_range is not None: diff --git a/vedo/utils.py b/vedo/utils.py index cf5d9815..ad88638d 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -467,41 +467,6 @@ def vtk2numpy(varr): return vtk_to_numpy(varr) -# def make3d(pts): -# """ -# Make an array which might be 2D to 3D. - -# Array can also be in the form `[allx, ally, allz]`. -# """ -# pts = np.asarray(pts) - -# if pts.dtype == "object": -# raise ValueError("Cannot form a valid numpy array, input may be non-homogenous") - -# if pts.size == 0: # empty list -# return pts - -# if pts.ndim == 1: -# if pts.shape[0] == 2: -# return np.hstack([pts, [0]]).astype(pts.dtype) -# elif pts.shape[0] == 3: -# return pts -# else: -# raise ValueError - -# if pts.shape[1] == 3: -# return pts - -# if 2 <= pts.shape[0] <= 3 and pts.shape[1] > 3: -# pts = pts.T - -# if pts.shape[1] == 2: -# return np.c_[pts, np.zeros(pts.shape[0], dtype=pts.dtype)] - -# if pts.shape[1] != 3: -# raise ValueError("input shape is not supported.") -# return pts - def make3d(pts): """ Make an array which might be 2D to 3D. @@ -1345,7 +1310,10 @@ def precision(x, p, vrange=None, delimiter="e"): out += ", " return out + ")" ############ <-- - if np.isnan(x): + try: + if np.isnan(x): + return "NaN" + except TypeError: return "NaN" x = float(x) From fa62fb88ad855c43a400314b21607fefc77c4943 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 14:33:52 +0200 Subject: [PATCH 110/251] fix examples/pyplot/caption.py --- examples/pyplot/caption.py | 5 ++--- vedo/addons.py | 10 ++++++---- vedo/utils.py | 11 ++++------- vedo/visual.py | 5 ++--- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/examples/pyplot/caption.py b/examples/pyplot/caption.py index 13706268..08861b72 100644 --- a/examples/pyplot/caption.py +++ b/examples/pyplot/caption.py @@ -8,7 +8,7 @@ txt += "Russian\nЭто синий конус\n" txt += "English\nThis is a blue cone" -cone.caption(txt, size=(0.4,0.3), font="LogoType", c='lb') +capt = cone.caption(txt, size=(0.4,0.3), font="LogoType", c='lb') axes = Axes( cone, @@ -20,5 +20,4 @@ c='white', ) -show(cone, axes, __doc__, viewup='z', bg='k', bg2='bb').close() - +show(cone, capt, axes, __doc__, viewup='z', bg='k', bg2='bb').close() diff --git a/vedo/addons.py b/vedo/addons.py index 57c7d831..33b122d0 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4231,11 +4231,13 @@ def add_global_axes(axtype=None, c=None, bounds=()): sz = d except AttributeError: pass - # if isinstance(largestact, Assembly): - # ocf.SetInputData(largestact.unpack(0).actor.data) - # else: - ocf.SetInputData(largestact.dataset) + + try: + ocf.SetInputData(largestact) + except AttributeError: + ocf.SetInputData(largestact.dataset) ocf.Update() + oc_mapper = vtk.vtkHierarchicalPolyDataMapper() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) oc_actor = vtk.vtkActor() diff --git a/vedo/utils.py b/vedo/utils.py index ad88638d..694832f5 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -2417,14 +2417,11 @@ def trimesh2vedo(inputobj): if "PointCloud" in inputobj_type: - trim_cc, trim_al = "black", 1 + vdpts = vedo.shapes.Points(inputobj.vertices, r=8, c='k') if hasattr(inputobj, "vertices_color"): - trim_c = inputobj.vertices_color - if len(trim_c) > 0: - trim_cc = trim_c[:, [0, 1, 2]] / 255 - trim_al = trim_c[:, 3] / 255 - trim_al = np.sum(trim_al) / len(trim_al) # just the average - return vedo.shapes.Points(inputobj.vertices, r=8, c=trim_cc, alpha=trim_al) + vcols = (inputobj.vertices_color * 1).astype(np.uint8) + vdpts.pointcolors = vcols + return vdpts if "path" in inputobj_type: diff --git a/vedo/visual.py b/vedo/visual.py index 592654dc..1f9353b1 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1783,7 +1783,7 @@ def caption( ontop=True, ): """ - Add a 2D caption to an object which follows the camera movements. + Create a 2D caption to an object which follows the camera movements. Latex is not supported. Returns the same input object for concatenation. See also `flagpole()`, `flagpost()`, `labels()` and `legend()` @@ -1887,8 +1887,7 @@ def caption( if "right" in justify: pr.SetJustificationToRight() pr.SetLineSpacing(vspacing) - self._caption = capt - return self + return capt ##################################################################### From 74d625c5dccb8e8e0f08d314da800fdac802fa2f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 14:56:38 +0200 Subject: [PATCH 111/251] fix glyph2 --- examples/basic/glyphs2.py | 1 - vedo/shapes.py | 26 +++++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/examples/basic/glyphs2.py b/examples/basic/glyphs2.py index 8d67e8ec..d0be755b 100644 --- a/examples/basic/glyphs2.py +++ b/examples/basic/glyphs2.py @@ -1,6 +1,5 @@ """Draw color arrow glyphs""" from vedo import * -import numpy as np # Create two spheres with different radii, wireframes, # and colors, and set the position of one of them diff --git a/vedo/shapes.py b/vedo/shapes.py index 24e7703a..762ad2d0 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -13,7 +13,7 @@ import vedo from vedo import settings from vedo.transformations import pol2cart, cart2spher, spher2cart -from vedo.colors import cmaps_names, get_color, printc +from vedo.colors import cmaps_names, get_color, printc, color_map from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh @@ -208,12 +208,12 @@ def __init__( elif utils.is_sequence(c): # user passing an array of point colors ucols = vtk.vtkUnsignedCharArray() ucols.SetNumberOfComponents(3) - ucols.SetName("glyph_RGB") + ucols.SetName("GlyphRGB") for col in c: cl = get_color(col) ucols.InsertNextTuple3(cl[0] * 255, cl[1] * 255, cl[2] * 255) poly.GetPointData().AddArray(ucols) - poly.GetPointData().SetActiveScalars("glyph_RGB") + poly.GetPointData().SetActiveScalars("GlyphRGB") c = None gly = vtk.vtkGlyph3D() @@ -268,6 +268,8 @@ def __init__( if cmap: self.cmap(cmap, "VectorMagnitude") + elif c is None: + self.pointdata.select("GlyphRGB") self.name = "Glyph" @@ -2030,14 +2032,14 @@ def __init__( self.s = s if s is not None else 1 ## used by pyplot.__iadd() self.name = "Arrow" - def tip_point(self, return_index=False): - """Return the coordinates of the tip of the Arrow, or the point index.""" - if self.tip_index is None: - arrpts = utils.vtk2numpy(self.source.GetOutput().GetPoints().GetData()) - self.tip_index = np.argmax(arrpts[:, 0]) - if return_index: - return self.tip_index - return self.vertices[self.tip_index] + # def tip_point(self, return_index=False): + # """Return the coordinates of the tip of the Arrow, or the point index.""" + # if self.tip_index is None: + # arrpts = utils.vtk2numpy(self.source.GetOutput().GetPoints().GetData()) + # self.tip_index = np.argmax(arrpts[:, 0]) + # if return_index: + # return self.tip_index + # return self.vertices[self.tip_index] class Arrows(Glyph): @@ -2126,8 +2128,6 @@ def __init__( c=c, alpha=alpha, ) - if c not in cmaps_names: - self.c(c) self.flat().lighting("off") self.name = "Arrows" From 2f93ea7c400630b467467f870c2bd7862a869c59 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 16:27:48 +0200 Subject: [PATCH 112/251] small fix to scalarbar3d --- docs/changes.md | 60 +++++++++++----------------------- examples/other/flag_labels1.py | 28 ++++++++-------- examples/pyplot/goniometer.py | 3 +- tests/common/test_core.py | 6 ++-- vedo/addons.py | 2 +- vedo/shapes.py | 10 ++++-- vedo/visual.py | 42 ++++++++++++------------ 7 files changed, 70 insertions(+), 81 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 9c8bc623..11219a3b 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -47,49 +47,27 @@ examples/volumetric/slicer1.py ``` - ### Broken Examples ``` -~/Projects/vedo/examples/basic -background_image.py -glyphs2.py - - -~/Projects/vedo/examples/advanced - - -~/Projects/vedo/examples/pyplot -caption.py -goniometer.py -histo_2d_b.py -histo_hexagonal.py -isolines.py - - -~/Projects/vedo/examples/simulations -airplane1.py -aspring1.py -brownian2d.py -gyroscope1.py -gyroscope2.py -lorenz.py -pendulum_3d.py -trail.py - - -~/Projects/vedo/examples/other -ellipt_fourier_desc.py -export_numpy.py -flag_labels1.py -ex06_elasticity2.py - - -release on master as branch? -tests/issues/issue_871a.py - - -staging -clonala analysis +tests/issues/discussion_751.py +tests/issues/discussion_800.py +tests/issues/issue_893.py +tests/issues/issue_905.py + +examples/pyplot/goniometer.py + +examples/simulations/airplane1.py +examples/simulations/aspring1.py +examples/simulations/brownian2d.py +examples/simulations/gyroscope1.py +examples/simulations/gyroscope2.py +examples/simulations/lorenz.py +examples/simulations/pendulum_3d.py +examples/simulations/trail.py + +examples/other/ellipt_fourier_desc.py +examples/other/export_numpy.py +examples/other/dolfin/ex06_elasticity2.py ``` diff --git a/examples/other/flag_labels1.py b/examples/other/flag_labels1.py index 5e50d456..27bb2293 100644 --- a/examples/other/flag_labels1.py +++ b/examples/other/flag_labels1.py @@ -2,22 +2,24 @@ to pop a flag-style label""" from vedo import * -b = Mesh(dataurl+'bunny.obj').color('m') -c = Cube(side=0.1).compute_normals().alpha(0.8).y(-0.02).lighting("off").lw(1) +b = Mesh(dataurl + "bunny.obj") +b.color("purple5").legend("Bugs the bunny") +c = Cube(side=0.1).y(-0.02).compute_normals() +c.alpha(0.8).lighting("off").lw(1).legend("The Cube box") -fp = b.flagpole('A flag pole descriptor\nfor a rabbit', font='Quikhand') -fp.scale(0.5).color('v').use_bounds() # tell camera to take fp bounds into account - -c.caption('2d caption for a cube\nwith face indices', point=[0.044, 0.03, -0.04], - size=(0.3,0.06), font="VictorMono", alpha=1) +cap = c.caption( + "2d caption for a cube\nwith face indices", + point=[0.044, 0.03, -0.04], + size=(0.3, 0.06), + font="VictorMono", + alpha=1, +) # create a new object made of polygonal text labels to indicate the cell numbers -flabs = c.labels('id', on="cells", font='Theemim', scale=0.02, c='k') -vlabs = c.clone().clean().labels2d(font='ComicMono', scale=3, bc='orange7') +flabs = c.labels("id", on="cells", font="Theemim", scale=0.02, c="k") +vlabs = c.clone().clean().labels2d(font="ComicMono", scale=3, bc="orange7") # create a custom entry to the legend -b.legend('Bugs the bunny') -c.legend('The Cube box') -lbox = LegendBox([b,c], font="Bongas", width=0.25) +lbox = LegendBox([b, c], font="Bongas", width=0.25, bg='blue6') -show(b, c, fp, flabs, vlabs, lbox, __doc__, axes=11, bg2='linen').close() +show(b, c, cap, flabs, vlabs, lbox, __doc__, axes=11, bg2="linen").close() diff --git a/examples/pyplot/goniometer.py b/examples/pyplot/goniometer.py index 408803e7..639c60c3 100644 --- a/examples/pyplot/goniometer.py +++ b/examples/pyplot/goniometer.py @@ -4,7 +4,8 @@ settings.use_parallel_projection = True # avoid parallax effects -mesh = Cone().c("steelblue").rotate_y(90).pos(1, 2, 3) +mesh = Cone().rotate_y(90).pos([1, 2, 3]) +mesh.c("steelblue") # add a flagpole-style comment a, v = precision(mesh.area(), 4), precision(mesh.volume(), 4) diff --git a/tests/common/test_core.py b/tests/common/test_core.py index 7a67ba3c..f7ee225c 100644 --- a/tests/common/test_core.py +++ b/tests/common/test_core.py @@ -279,9 +279,9 @@ assert np.allclose(sphere.vertex_normals[12], [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) -###################################### is_inside -print('is_inside',sphere.is_inside([0.1,0.2,0.3])) -assert Sphere().is_inside([0.1,0.2,0.3]) +###################################### contains +print('is_inside',sphere.contains([0.1,0.2,0.3])) +assert Sphere().contains([0.1,0.2,0.3]) ###################################### intersectWithLine (fails vtk7..) # pts = sphere.intersectWithLine([-2,-2,-2], [2,3,4]) diff --git a/vedo/addons.py b/vedo/addons.py index 33b122d0..e93bd922 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1104,7 +1104,6 @@ def ScalarBar3D( if label_rotation: a = shapes.Text3D( tx, - pos=[sx * label_offset, y, 0], s=lsize, justify="center-top", c=c, @@ -1112,6 +1111,7 @@ def ScalarBar3D( font=label_font, ) a.rotate_z(label_rotation) + a.pos(sx * label_offset, y, 0) else: a = shapes.Text3D( tx, diff --git a/vedo/shapes.py b/vedo/shapes.py index 762ad2d0..1c1f040a 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1549,7 +1549,10 @@ def StreamLines( if active_vectors: grid.GetPointData().SetActiveVectors(active_vectors) - b = grid.bounds() + try: + b = grid.bounds() + except AttributeError: + b = grid.GetBounds() size = (b[5] - b[4] + b[3] - b[2] + b[1] - b[0]) / 3 if initial_step_size is None: initial_step_size = size / 500.0 @@ -1574,7 +1577,10 @@ def read_points(): src.Update() st = vtk.vtkStreamTracer() - st.SetInputDataObject(grid.dataset) + try: + st.SetInputDataObject(grid.dataset) + except AttributeError: + st.SetInputData(grid) st.SetSourceConnection(src.GetOutputPort()) st.SetInitialIntegrationStep(initial_step_size) diff --git a/vedo/visual.py b/vedo/visual.py index 1f9353b1..b9e049cb 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1612,7 +1612,7 @@ def flagpole( - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ - acts = [] + objs = [] if txt is None: if self.filename: @@ -1650,11 +1650,11 @@ def flagpole( lab = vedo.shapes.Text3D( txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center" ) - acts.append(lab) + objs.append(lab) if d and not sph: sph = vedo.shapes.Circle(pt, r=s / 3, res=15) - acts.append(sph) + objs.append(sph) x0, x1, y0, y1, z0, z1 = lab.bounds() aline = [(x0,y0,z0), (x1,y0,z0), (x1,y1,z0), (x0,y1,z0)] @@ -1665,9 +1665,9 @@ def flagpole( cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] - box.actor.SetOrigin(cnt) + # box.actor.SetOrigin(cnt) box.scale([1 + padding, 1 + 2 * padding, 1], origin=cnt) - acts.append(box) + objs.append(box) x0, x1, y0, y1, z0, z1 = box.bounds() if x0 < pt[0] < x1: @@ -1681,16 +1681,18 @@ def flagpole( c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] con = vedo.shapes.Line([c0, c1, pt]) - acts.append(con) - - macts = vedo.merge(acts).c(c).alpha(alpha) - macts.actor.SetOrigin(pt) - macts.bc("tomato").pickable(False) - macts.properties.LightingOff() - macts.properties.SetLineWidth(lw) - macts.actor.UseBoundsOff() - macts.name = "FlagPole" - return macts + objs.append(con) + + mobjs = vedo.merge(objs).c(c).alpha(alpha) + mobjs.name = "FlagPole" + mobjs.bc("tomato").pickable(False) + mobjs.properties.LightingOff() + mobjs.properties.SetLineWidth(lw) + mobjs.actor.UseBoundsOff() + mobjs.actor.SetPosition([0,0,0]) + mobjs.actor.SetOrigin(pt) + # print(pt) + return mobjs def flagpost( self, @@ -1914,11 +1916,14 @@ def follow_camera(self, camera=None, origin=None): factor.SetBackfaceProperty(self.actor.GetBackfaceProperty()) factor.SetTexture(self.actor.GetTexture()) factor.SetScale(self.actor.GetScale()) - factor.SetOrientation(self.actor.GetOrientation()) + # factor.SetOrientation(self.actor.GetOrientation()) factor.SetPosition(self.actor.GetPosition()) factor.SetUseBounds(self.actor.GetUseBounds()) - factor.SetOrigin(self.actor.GetOrigin()) + if origin is None: + factor.SetOrigin(self.actor.GetOrigin()) + else: + factor.SetOrigin(origin) factor.PickableOff() @@ -1929,9 +1934,6 @@ def follow_camera(self, camera=None, origin=None): if plt and plt.renderer and plt.renderer.GetActiveCamera(): factor.SetCamera(plt.renderer.GetActiveCamera()) - if origin is not None: - factor.SetOrigin(origin) - self.actor = None factor.data = self self.actor = factor From 24ca3757b58f9c001a57cb19fd48d29a0a62c37d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 18:26:44 +0200 Subject: [PATCH 113/251] add print_inheritance_tree fix super().init() --- docs/changes.md | 2 -- vedo/applications.py | 2 +- vedo/core.py | 16 +++++++++++++++- vedo/mesh.py | 1 + vedo/pointcloud.py | 2 ++ vedo/shapes.py | 3 +-- vedo/utils.py | 24 ++++++++++++++++++++++++ vedo/visual.py | 37 +++++++++++++++++++++++++++---------- 8 files changed, 71 insertions(+), 16 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 11219a3b..7842779e 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -66,8 +66,6 @@ examples/simulations/pendulum_3d.py examples/simulations/trail.py examples/other/ellipt_fourier_desc.py -examples/other/export_numpy.py -examples/other/dolfin/ex06_elasticity2.py ``` diff --git a/vedo/applications.py b/vedo/applications.py index 39ada1d2..6b264636 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -322,7 +322,7 @@ class Slicer3DTwinPlotter(Plotter): def __init__(self, vol1, vol2, clamp=True, **kwargs): - Plotter.__init__(self, **kwargs) + super().__init__(**kwargs) cmap = "gist_ncar_r" cx, cy, cz = "dr", "dg", "db" # slider colors diff --git a/vedo/core.py b/vedo/core.py index 1d774699..61a1659d 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -15,7 +15,11 @@ __docformat__ = "google" -__doc__ = "Base classes providing functionality to all vedo objects." +__doc__ = """ +Base classes providing functionality to all vedo objects. + +![](https://media.gcflearnfree.org/content/5be1de13686707122ccd266f_11_06_2018/algorithms_illustration.jpg) +""" __all__ = [ "CommonAlgorithms", @@ -1258,6 +1262,8 @@ class PointAlgorithms(CommonAlgorithms): def __init__(self): + super().__init__() + self.transform = None self.point_locator = None self.cell_locator = None @@ -1493,6 +1499,10 @@ def scale(self, s=None, reset=False, origin=True): class VolumeAlgorithms(CommonAlgorithms): """Methods for Volume objects.""" + def __init__(self): + super().__init__() + pass + def bounds(self): """ Get the object bounds. @@ -1662,6 +1672,10 @@ def tomesh(self, fill=True, shrink=1.0): class UGridAlgorithms(CommonAlgorithms): + def __init__(self): + super().__init__() + pass + def _update(self, data, reset_locators=False): self.dataset = data self.mapper.SetInputData(data) diff --git a/vedo/mesh.py b/vedo/mesh.py index 452e853d..349bffc1 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -53,6 +53,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): ![](https://vedo.embl.es/images/basic/buildmesh.png) """ + # print("INIT MESH", super()) super().__init__() if inputobj is None: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3098836c..4558961e 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -510,6 +510,8 @@ def fibonacci_sphere(n): ``` ![](https://vedo.embl.es/images/feats/fibonacci.png) """ + # print("INIT POINTS") + super().__init__() self.filename = "" self.name = "" diff --git a/vedo/shapes.py b/vedo/shapes.py index 1c1f040a..8bcc19d5 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2124,8 +2124,7 @@ def __init__( out = arr.GetOutput() orients = end_pts - start_pts - Glyph.__init__( - self, + super().__init__( start_pts, out, orientation_array=orients, diff --git a/vedo/utils.py b/vedo/utils.py index 694832f5..bcb7d7a3 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -42,6 +42,7 @@ "pack_spheres", "humansort", "print_histogram", + "print_inheritance_tree", "camera_from_quaternion", "camera_from_neuroglancer", "oriented_camera", @@ -1993,6 +1994,29 @@ def print_table(*columns, headers=None, c="g"): # Print the line separator again to close the table vedo.printc(line2, c=c) +def print_inheritance_tree(C): + """Prints the inheritance tree of class C.""" + # Adapted from: https://stackoverflow.com/questions/26568976/ + def class_tree(cls): + subc = [class_tree(sub_class) for sub_class in cls.__subclasses__()] + return {cls.__name__: subc} + + def print_tree(tree, indent=8, current_ind=0): + for k, v in tree.items(): + if current_ind: + before_dashes = current_ind - indent + m = " " * before_dashes + "└" + "─" * (indent - 1) + " " + k + vedo.printc(m) + else: + vedo.printc(k) + for sub_tree in v: + print_tree(sub_tree, indent=indent, current_ind=current_ind + indent) + + if str(C.__class__) != "": + C = C.__class__ + ct = class_tree(C) + print_tree(ct) + def make_bands(inputlist, n): """ diff --git a/vedo/visual.py b/vedo/visual.py index b9e049cb..829a5a1a 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -14,7 +14,11 @@ __docformat__ = "google" -__doc__ = "Base classes to manage positioning and size of the objects in space and other properties" +__doc__ = """ +Base classes to manage visualization and apperance of objects and their properties" + + +""" __all__ = [ "CommonVisual", @@ -32,17 +36,12 @@ class CommonVisual: """Class to manage the visual aspects common to all objects.""" def __init__(self): + self.mapper = None self.properties = None - # self.actor = None - self.scalarbar = None - - self.dataset = None - # self.pointdata = {} - # self.celldata = {} + self.actor = None + self.scalarbar = None - self.shadows = [] - @property def LUT(self): @@ -466,7 +465,8 @@ class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" def __init__(self): - pass + # print("init PointsVisual") + super().__init__() def clone2d( self, @@ -1896,6 +1896,10 @@ def caption( class MeshVisual(PointsVisual): """Class to manage the visual aspects of a ``Maesh`` object.""" + def __init__(self) -> None: + # print("INIT MeshVisual", super()) + super().__init__() + def follow_camera(self, camera=None, origin=None): """ Return an object that will follow camera movements and stay locked to it. @@ -2036,6 +2040,10 @@ def lc(self, linecolor=None): class VolumeVisual(CommonVisual): """Class to manage the visual aspects of a ``Volume`` object.""" + def __init__(self) -> None: + # print("INIT VolumeVisual") + super().__init__() + def alpha_unit(self, u=None): """ Defines light attenuation per unit length. Default is 1. @@ -2261,6 +2269,11 @@ def interpolation(self, itype): ######################################################################################## class ActorTransforms: + + def __init__(self) -> None: + # print("init ActorTransforms") + pass + def pos(self, *p): """Set/get position of object.""" if len(p)==0: @@ -2346,6 +2359,10 @@ def scale(self, s=None, absolute=False): ######################################################################################## class PictureVisual(ActorTransforms, CommonVisual): + def __init__(self) -> None: + # print("init PictureVisual") + super().__init__() + def memory_size(self): """ Return the size in bytes of the object in memory. From 775b72ba03f9354f46c0e4ad312683ff5b15db45 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 19:25:47 +0200 Subject: [PATCH 114/251] add examples/advanced/warp4b.py make plt.camera a property --- docs/changes.md | 6 +- examples/advanced/{warp4.py => warp4a.py} | 3 +- examples/advanced/warp4b.py | 99 +++++++++++++++++++++++ vedo/plotter.py | 20 +++-- 4 files changed, 114 insertions(+), 14 deletions(-) rename examples/advanced/{warp4.py => warp4a.py} (98%) create mode 100644 examples/advanced/warp4b.py diff --git a/docs/changes.md b/docs/changes.md index 7842779e..89ad1b59 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -37,12 +37,14 @@ ------------------------- ## New/Revised Examples ``` -examples/advanced/timer_callback1.py -examples/advanced/timer_callback2.py examples/basic/buttons.py examples/basic/input_box.py examples/basic/sliders2.py examples/basic/interaction_modes2.py +examples/advanced/timer_callback1.py +examples/advanced/timer_callback2.py +examples/advanced/warp4a.py +examples/advanced/warp4b.py examples/volumetric/slicer1.py ``` diff --git a/examples/advanced/warp4.py b/examples/advanced/warp4a.py similarity index 98% rename from examples/advanced/warp4.py rename to examples/advanced/warp4a.py index 5463e6db..e519f1e6 100644 --- a/examples/advanced/warp4.py +++ b/examples/advanced/warp4a.py @@ -1,4 +1,5 @@ -# Morph one shape into another interactively (can work in 3d too!) +# Morph one shape into another interactively +# (can work in 3d too! see example warp4b.py) # from vedo import Plotter, Axes, dataurl, load, printc, merge from vedo.shapes import Text2D, Points, Lines, Arrows2D, Grid diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py new file mode 100644 index 00000000..dbe1607a --- /dev/null +++ b/examples/advanced/warp4b.py @@ -0,0 +1,99 @@ +"""Morphological alignment of 3D surfaces. +Pick a point on the source surface, +then pick the corresponding point on the target surface. +Pick at least 4 point pairs. +Press 'c' to clear the selection. +Press 'd' to delete the last selection. +Press 'q' to quit.""" +from vedo import Plotter, Mesh, Points, Text2D, Axes, settings, dataurl + +################################################ +settings.default_font = "Calco" +settings.enable_default_mouse_callbacks = False + +################################################ +def update(): + source_pts = Points(sources, r=12, c="purple5") + target_pts = Points(targets, r=12, c="purple5") + source_pts.name = "source_pts" + target_pts.name = "target_pts" + slabels = source_pts.labels2d("id", c="purple3") + tlabels = target_pts.labels2d("id", c="purple3") + slabels.name = "source_pts" + tlabels.name = "target_pts" + plt.at(0).remove("source_pts").add(source_pts, slabels) + plt.at(1).remove("target_pts").add(target_pts, tlabels) + plt.render() + + if len(sources) == len(targets) and len(sources) > 3: + warped = source.clone().warp(sources, targets) + warped.name = "warped" + # wpoints = points.clone().apply_transform(warped.transform) + plt.at(2).remove("warped").add(warped) + plt.render() + +def click(evt): + if evt.actor == source: + sources.append(evt.picked3d) + source.pickable(False) + target.pickable(True) + msg0.text("->") + msg1.text("now pick a target point") + elif evt.actor == target: + targets.append(evt.picked3d) + source.pickable(True) + target.pickable(False) + msg0.text("now pick a source point") + msg1.text("<-") + update() + +def keypress(evt): + global sources, targets + if evt.keypress == "c": + sources.clear() + targets.clear() + plt.at(0).remove("source_pts") + plt.at(1).remove("target_pts") + plt.at(2).remove("warped") + msg0.text("CLEARED! Pick a point here") + msg1.text("") + source.pickable(True) + target.pickable(False) + update() + elif evt.keypress == "d": + n = min(len(sources), len(targets)) + sources = sources[:n-1] + targets = targets[:n-1] + msg0.text("Last point deleted! Pick a point here") + msg1.text("") + source.pickable(True) + target.pickable(False) + update() + elif evt.keypress == "q": + plt.close() + exit() + +################################################ +target = Mesh(dataurl + "290.vtk").cut_with_plane(origin=(1,0,0)) +target.pickable(False).c("yellow5") +ref = target.clone().pickable(False).alpha(0.75) + +source = Mesh(dataurl + "limb_surface.vtk") +source.pickable(True).c("k5").alpha(0.8) + +clicked = [] +sources = [] +targets = [] + +msg0 = Text2D("Pick a point on the surface", c='white', alpha=1, bg="blue4", pos="bottom-center") +msg1 = Text2D("", c='white', bg="blue4", alpha=1, pos="bottom-center") + +plt = Plotter(N=3, axes=0, sharecam=0, size=(2490, 810)) +plt.add_callback("click", click) +plt.add_callback("keypress", keypress) +plt.at(0).show(source, msg0, __doc__) +plt.at(1).show(f"Reference {target.filename}", msg1, target) +plt.at(2).show("Morphing Output", ref, Axes(ref), camera=plt.camera, bg="k9") +plt.interactive() +plt.close() + diff --git a/vedo/plotter.py b/vedo/plotter.py index bbdd036c..2dc36dab 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -442,7 +442,6 @@ def __init__( self.background_renderer = None self.size = size self.interactor = None - self.camera = None self._icol = 0 self._clockt0 = time.time() @@ -461,7 +460,6 @@ def __init__( self._interactive = False self.interactor = None self.window = None - self.camera = None # let the backend choose if self.size == "auto": self.size = (1000, 1000) ############################################################# @@ -692,7 +690,6 @@ def __init__( if self.renderers: self.renderer = self.renderers[0] - self.camera = self.renderer.GetActiveCamera() self.camera.SetParallelProjection(settings.use_parallel_projection) if self.size[0] == "f": # full screen @@ -709,7 +706,6 @@ def __init__( for r in self.renderers: self.window.AddRenderer(r) self.wx_widget.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) - self.camera = self.renderer.GetActiveCamera() ######################## return ################ ######################## @@ -799,7 +795,6 @@ def at(self, nren, yren=None): raise RuntimeError self.renderer = self.renderers[nren] - self.camera = self.renderer.GetActiveCamera() return self def add(self, *objs, at=None): @@ -985,7 +980,6 @@ def render(self, resetcam=False): if not self.interactor.GetInitialized(): self.interactor.Initialize() - self.camera = self.renderer.GetActiveCamera() if resetcam: self.renderer.ResetCamera() @@ -1335,7 +1329,6 @@ def fly_to(self, point): if self.interactor: self.resetcam = False self.interactor.FlyTo(self.renderer, point) - self.camera = self.renderer.GetActiveCamera() return self def look_at(self, plane="xy"): @@ -3058,9 +3051,6 @@ def show( if self.renderer: self.renderer.SetActiveCamera(self.camera) - if self.renderer: - self.camera = self.renderer.GetActiveCamera() - self.add(objects) # Backend ############################################################### @@ -3400,7 +3390,6 @@ def close_window(self): self.renderer = None # current renderer self.renderers = [] - self.camera = None self.skybox = None return self @@ -3410,6 +3399,15 @@ def close(self): if vedo.plotter_instance == self: vedo.plotter_instance = None + @property + def camera(self): + """Return the current active camera.""" + return self.renderer.GetActiveCamera() + + @camera.setter + def camera(self, cam): + self.renderer.SetActiveCamera(cam) + def screenshot(self, filename="screenshot.png", scale=1, asarray=False): """ Take a screenshot of the Plotter window. From 285de1b966b769d087976f4c24962412ead5058e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 19:48:00 +0200 Subject: [PATCH 115/251] small fixes to examples/advanced/warp4b.py vedo/shapes.py --- examples/advanced/warp4b.py | 3 ++- vedo/shapes.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py index dbe1607a..dde98a92 100644 --- a/examples/advanced/warp4b.py +++ b/examples/advanced/warp4b.py @@ -93,7 +93,8 @@ def keypress(evt): plt.add_callback("keypress", keypress) plt.at(0).show(source, msg0, __doc__) plt.at(1).show(f"Reference {target.filename}", msg1, target) -plt.at(2).show("Morphing Output", ref, Axes(ref), camera=plt.camera, bg="k9") +cam1 = plt.camera # will share the same camera btw renderers 1 and 2 +plt.at(2).show("Morphing Output", ref, Axes(ref), camera=cam1, bg="k9") plt.interactive() plt.close() diff --git a/vedo/shapes.py b/vedo/shapes.py index 8bcc19d5..76b55215 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2306,8 +2306,7 @@ def __init__( orients = utils.make3d(orients) pts = Points(start_pts) - Glyph.__init__( - self, + super().__init__( pts, arr, orientation_array=orients, From 2a06b7b09605b549f895203dfd26875c2fa9b589 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 20:23:37 +0200 Subject: [PATCH 116/251] fix to assembly self.actor = self --- vedo/assembly.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vedo/assembly.py b/vedo/assembly.py index 8a3e2066..7bd91f1a 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -94,6 +94,8 @@ def __init__(self, objects=()): super().__init__() + self.actor = self + self.name = "Group" self.filename = "" self.trail = None From da1de60463b5bbbb915ce4b1fefec75590371d0b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 19 Oct 2023 21:14:23 +0200 Subject: [PATCH 117/251] fix airplanes12 --- docs/changes.md | 1 - vedo/visual.py | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 89ad1b59..1ccde6d2 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -58,7 +58,6 @@ tests/issues/issue_905.py examples/pyplot/goniometer.py -examples/simulations/airplane1.py examples/simulations/aspring1.py examples/simulations/brownian2d.py examples/simulations/gyroscope1.py diff --git a/vedo/visual.py b/vedo/visual.py index 829a5a1a..6bb505a2 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1134,14 +1134,11 @@ def update_trail(self): Update the trailing line of a moving object. """ currentpos = self.pos() - self.trail_points.append(currentpos) # cycle self.trail_points.pop(0) - - data = np.array(self.trail_points) - currentpos + self.trail_offset + data = np.array(self.trail_points) + self.trail_offset tpoly = self.trail.dataset tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) - self.trail.pos(currentpos) return self def _compute_shadow(self, plane, point, direction): From 0a9c4638356039fab6e4027b03add6a2b77f0a50 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 15:13:45 +0200 Subject: [PATCH 118/251] fix spring stretch and examples --- docs/changes.md | 10 --- examples/other/ellipt_fourier_desc.py | 2 +- examples/simulations/aspring1.py | 4 +- examples/simulations/aspring2_player.py | 4 +- examples/simulations/fourier_epicycles.py | 2 +- examples/simulations/grayscott.py | 5 +- examples/simulations/gyroscope1.py | 3 +- examples/simulations/gyroscope2.py | 68 ----------------- examples/simulations/multiple_pendulum.py | 14 +--- examples/simulations/pendulum_3d.py | 16 ++-- examples/simulations/tunnelling2.py | 61 +++++++-------- tests/issues/discussion_751.py | 10 ++- vedo/addons.py | 4 +- vedo/mesh.py | 59 +-------------- vedo/shapes.py | 92 +++++++++++------------ vedo/transformations.py | 5 -- vedo/version.py | 2 +- 17 files changed, 118 insertions(+), 243 deletions(-) delete mode 100644 examples/simulations/gyroscope2.py diff --git a/docs/changes.md b/docs/changes.md index 1ccde6d2..8328735d 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -57,16 +57,6 @@ tests/issues/issue_893.py tests/issues/issue_905.py examples/pyplot/goniometer.py - -examples/simulations/aspring1.py -examples/simulations/brownian2d.py -examples/simulations/gyroscope1.py -examples/simulations/gyroscope2.py -examples/simulations/lorenz.py -examples/simulations/pendulum_3d.py -examples/simulations/trail.py - -examples/other/ellipt_fourier_desc.py ``` diff --git a/examples/other/ellipt_fourier_desc.py b/examples/other/ellipt_fourier_desc.py index a9fee0e1..9e980214 100644 --- a/examples/other/ellipt_fourier_desc.py +++ b/examples/other/ellipt_fourier_desc.py @@ -6,7 +6,7 @@ shapes = vedo.load(vedo.dataurl+'timecourse1d.npy') sh = shapes[55] -sr = vedo.Line(sh).mirror('x').reverse() +sr = vedo.Line(sh).mirror('x') sm = vedo.merge(sh, sr).c('red5').lw(3) pts = sm.vertices[:,(0,1)] diff --git a/examples/simulations/aspring1.py b/examples/simulations/aspring1.py index b3e47782..aa3db931 100644 --- a/examples/simulations/aspring1.py +++ b/examples/simulations/aspring1.py @@ -21,8 +21,8 @@ def loop_func(event): x = x + v*dt + 1/2 * a * dt**2 # position block.pos(x) # update block position and trail - spring.stretch(x0, x) # stretch helix accordingly - plt.render() + spr = Spring(x0, x, r1=0.06, thickness=0.01) + plt.remove("Spring").add(spr).render() block = Cube(pos=x, side=0.2, c="tomato") spring = Spring(x0, x, r1=0.06, thickness=0.01) diff --git a/examples/simulations/aspring2_player.py b/examples/simulations/aspring2_player.py index bfbc621c..3a2417c0 100644 --- a/examples/simulations/aspring2_player.py +++ b/examples/simulations/aspring2_player.py @@ -34,9 +34,9 @@ def update_scene(i: int): # update block and spring position at frame i block.pos(history_x[i]) - spring.stretch(x0, history_x[i]) + spring = Spring(x0, history_x[i], r1=0.05, thickness=0.005) text.text(f"Frame number {i}\nx = {history_x[i][0]:.4f}") - plt.render() + plt.remove("Spring").add(spring).render() plt = AnimationPlayer(update_scene, irange=[0,200], loop=True) plt += [floor, wall, block, spring, text, __doc__] diff --git a/examples/simulations/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py index ff48bd6d..ff1d58ad 100644 --- a/examples/simulations/fourier_epicycles.py +++ b/examples/simulations/fourier_epicycles.py @@ -48,7 +48,7 @@ def epicycles(time, rotation, fourier, order): # Load some 2D shape and make it symmetric shape = vedo.load(vedo.dataurl+'timecourse1d.npy')[55] -shaper = vedo.Line(shape).mirror('x').reverse() +shaper = vedo.Line(shape).mirror('x') shape = vedo.merge(shape, shaper) x, y, _ = shape.vertices.T diff --git a/examples/simulations/grayscott.py b/examples/simulations/grayscott.py index edcf238e..57c8b552 100644 --- a/examples/simulations/grayscott.py +++ b/examples/simulations/grayscott.py @@ -59,7 +59,10 @@ def loop_func(event): grd.cmap('ocean_r', V.ravel(), on='cells', name="escals") grd.map_cells_to_points() # interpolate cell data to point data - grd.vertices[:,2] = grd.pointdata['escals']*25 # assign z elevation + z = grd.pointdata['escals']*25 + newverts = grd.vertices.copy() # get the original vertices + newverts[:,2] = z # assign z elevation + grd.vertices = newverts # update the mesh vertices plt.render() plt = Plotter(bg='linen') diff --git a/examples/simulations/gyroscope1.py b/examples/simulations/gyroscope1.py index 00adb5aa..97766fa5 100644 --- a/examples/simulations/gyroscope1.py +++ b/examples/simulations/gyroscope1.py @@ -49,7 +49,8 @@ def loop_func(event): # set orientation along gaxis and rotate it around its axis by omega*t degrees gyro.reorient(Lrot, rotation=omega*t, rad=True).pos(gpos) - # spring.stretch(top, gpos) + spring = Spring(top, gpos, r1=0.06, thickness=0.01, c="gray") + plt.remove("Spring").add(spring) plt.render() t = 0 diff --git a/examples/simulations/gyroscope2.py b/examples/simulations/gyroscope2.py deleted file mode 100644 index 5c8d8342..00000000 --- a/examples/simulations/gyroscope2.py +++ /dev/null @@ -1,68 +0,0 @@ -"""A gyroscope sitting on a pedestal. -The analysis is in terms of Lagrangian mechanics. -The Lagrangian variables are polar angle theta, -azimuthal angle phi, and spin angle psi""" -# (adapted from http://www.glowscript.org) -from vedo import * - -# ############################################################ parameters -dt = 3e-03 # time step -Lshaft = 1 # length of gyroscope shaft -M = 1 # mass of gyroscope (massless shaft) -R = 0.4 # radius of gyroscope rotor -theta = 1.3 # initial polar angle of shaft (from vertical) -psidot = -40 # spinning angular velocity (rad/s) -phidot = 0 # (try -1 and +1 to get first and second pattern) - -# ############################################################ -g, r = 9.81, Lshaft / 2 -I3 = 1 / 2 * M * R ** 2 # moment of inertia, I, of gyroscope about its own axis -I1 = M * r ** 2 + 1 / 2 * I3 # I about a line through the support, perpendicular to axis -phi = psi = thetadot = 0 -x = vector(theta, phi, psi) # Lagrangian coordinates -v = vector(thetadot, phidot, psidot) - -# ############################################################ the scene -plt = Plotter() -plt += __doc__ - -shaft = Cylinder([[0, 0, 0], [Lshaft, 0, 0]], r=0.03, c="dg") -rotor = Cylinder([[Lshaft / 2.2, 0, 0], [Lshaft / 1.8, 0, 0]], r=R).texture(dataurl+'textures/white.jpg') -base = Sphere([0, 0, 0], c="dg", r=0.03) -tip = Sphere([Lshaft, 0, 0], c="dg", r=0.03) -gyro = shaft + rotor + base + tip # group relevant meshes into single one of type Assembly -plt += gyro # add it to Plotter list - -pedestal = Box([0, -0.63, 0], height=0.1, length=0.1, width=1).texture(dataurl+'textures/wood1.jpg') -pedbase = Box([0, -1.13, 0], height=0.5, length=0.5, width=0.05).texture(dataurl+'textures/wood1.jpg') -pedpin = Pyramid([0, -0.08, 0], axis=[0, 1, 0], s=0.05, height=0.12).texture(dataurl+'textures/wood1.jpg') -formulas = Picture(dataurl+"images/gyro_formulas.png").alpha(0.9) -formulas.scale(0.0035).pos([-1.4, -1.1, -1.1]) -plt += [pedestal + pedbase + pedpin + formulas] - -# ############################################################ the physics -def loop_func(event): - global t, v, x - t += dt - - st, ct, sp, cp = sin(x[0]), cos(x[0]), sin(x[1]), cos(x[1]) - - thetadot, phidot, psidot = v # unpack - atheta = st*ct * phidot**2 + (M*g*r*st - I3*(psidot + phidot*ct) * phidot*st)/I1 - aphi = I3/I1 * (psidot + phidot * ct) * thetadot/st - 2 * ct * thetadot * phidot/st - apsi = phidot * thetadot * st - aphi * ct - a = vector(atheta, aphi, apsi) - - v += a * dt # update velocities - x += v * dt # update Lagrangian coordinates - - gaxis = (Lshaft + 0.03) * vector(st * sp, ct, st * cp) - # set orientation along gaxis and rotate it around its axis by psidot*t degrees - gyro.reorient(gaxis, rotation=psidot * t, rad=True) - plt.add(Point(gaxis, r=3, c="red4")) - plt.render() - -t = 0 -plt.add_callback("timer", loop_func) -plt.timer_callback("start") -plt.show().close() diff --git a/examples/simulations/multiple_pendulum.py b/examples/simulations/multiple_pendulum.py index 8caec493..15852d32 100644 --- a/examples/simulations/multiple_pendulum.py +++ b/examples/simulations/multiple_pendulum.py @@ -1,6 +1,6 @@ import numpy as np from vedo import Plotter, mag, versor, vector -from vedo import Cylinder, Spring, Box, Sphere +from vedo import Cylinder, Spring, Line, Box, Sphere ############## Constants N = 5 # number of bobs @@ -32,14 +32,6 @@ plt += c bob.append(c) -# Create the springs out of N links -link = [None] * N -for k in range(N): - p0 = bob[k].pos() - p1 = bob[k + 1].pos() - link[k] = Spring(p0, p1, thickness=0.015, r1=R / 3, c="gray") - plt += link[k] - # Create some auxiliary variables x_dot_m = np.zeros(N+1) y_dot_m = np.zeros(N+1) @@ -106,9 +98,11 @@ def loop_func(evt): y_dot[j] -= DV[1] # DV.y # Update the loations of the bobs and the stretching of the springs + plt.remove("Line") for k in range(1, N + 1): bob[k].pos([bob_x[k], bob_y[k], 0]) - link[k - 1].stretch(bob[k - 1].pos(), bob[k].pos()) + sp = Line(bob[k - 1].pos(), bob[k].pos(), lw=8, c="gray") + plt.add(sp) plt.render() diff --git a/examples/simulations/pendulum_3d.py b/examples/simulations/pendulum_3d.py index 77621769..58598ebd 100644 --- a/examples/simulations/pendulum_3d.py +++ b/examples/simulations/pendulum_3d.py @@ -1,6 +1,7 @@ """Double pendulum in 3D""" # Original idea and solution using sympy from: # https://www.youtube.com/watch?v=MtG9cueB548 +import time from vedo import * # Load the solution: @@ -18,8 +19,8 @@ ball1.trail.add_shadow('z', -3) # make trails project a shadow too ball2.trail.add_shadow('z', -3) -rod1 = Line([0,0,0], ball1, lw=4) -rod2 = Line(ball1, ball2, lw=4) +rod1 = Line([0,0,0], ball1, lw=4).add_shadow('z', -3) +rod2 = Line(ball1, ball2, lw=4).add_shadow('z', -3) axes = Axes(xrange=(-3,3), yrange=(-3,3), zrange=(-3,3)) @@ -31,15 +32,18 @@ for b1, b2 in zip(p1,p2): ball1.pos(b1) ball2.pos(b2) - rod1.stretch([0,0,0], b1) - rod2.stretch(b1, b2) ball1.update_shadows().update_trail() ball2.update_shadows().update_trail() ball1.trail.update_shadows() ball2.trail.update_shadows() + rod1.vertices = [[0,0,0], b1] + rod2.vertices = [b1, b2] + rod1.update_shadows() + rod2.update_shadows() plt.render() - i+=1 - if i > 150: + time.sleep(0.03) + i += 1 + if i > 100: break plt.interactive().close() diff --git a/examples/simulations/tunnelling2.py b/examples/simulations/tunnelling2.py index d1a2bea5..ea3a6b0b 100644 --- a/examples/simulations/tunnelling2.py +++ b/examples/simulations/tunnelling2.py @@ -1,13 +1,9 @@ """Quantum Tunnelling effect using 4th order Runge-Kutta -method with arbitrary potential shape. -The animation shows the evolution of a particle of relatively well defined -momentum (hence undefined position) in a box hitting a potential barrier.""" -print(__doc__) -import numpy as np -from vedo import Plotter, Picture, Line, dataurl, settings +method with arbitrary potential shape.""" +from vedo import * -Nsteps = 250 # number of steps in time -N = 300 # number of points in space +nsteps = 150 # number of steps in time +n = 300 # number of points in 1d space dt = 0.004 # time step x0 = 6 # peak initial position s0 = 0.75 # uncertainty on particle position @@ -16,21 +12,22 @@ size = 20.0 # x axis span [0, size] # Uncomment below for more examples of the potential V(x). -x = np.linspace(0, size, N+2) -V = 0.15 * np.sin(1.5 * (x - 7)) # particle hitting a sinusoidal barrier -# V = Vmax*(np.abs(x-11) < 0.5)-.01 # simple square barrier potential -# V = -1.2*(np.abs(x-11) < 1.7)-.01 # a wide square well potential -# V = 0.008*(x-10)**2 # elastic potential well -# V = -0.1*(x-10) # particle on a slope bouncing back +x = np.linspace(0, size, n+2) +V = 0.15 * np.sin(1.5 * (x - 7)) # particle hitting a sinusoidal barrier +# V = Vmax*(np.abs(x-11) < 0.5)-0.01 # simple square barrier potential +# V = -0.5*(np.abs(x-11) < 1.7)-0.01 # a wide square well potential +# V = 0.008*(x-10)**2 # elastic potential well +# V = 0.05*(x-10) # particle on a slope bouncing back +# V = 0.0 * x # free particle Psi = np.sqrt(1/s0) * np.exp(-1/2 * ((x-x0)/s0)**2 + 1j*x*k0) # wave packet -dx2 = ((x[-1] - x[0]) / (N+2))**2 * 400 # dx**2 step, scaled -nabla2psi = np.zeros(N+2, dtype=complex) +dx2 = ((x[-1] - x[0]) / (n+2))**2 * 400 # dx**2 step, scaled +nabla2psi = np.zeros(n+2, dtype=complex) def f(psi): # a smart numpy way to calculate the second derivative in x: - nabla2psi[1 : N+1] = (psi[0:N] + psi[2 : N+2] - 2 * psi[1 : N+1]) / dx2 + nabla2psi[1 : n+1] = (psi[0:n] + psi[2 : n+2] - 2 * psi[1 : n+1]) / dx2 return 1j * (nabla2psi - V*psi) # this is the RH of Schroedinger equation! def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method @@ -42,30 +39,34 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method plt = Plotter(interactive=False) -bck = Picture(dataurl+"images/schrod.png").alpha(.3).scale(.0256).pos([0,-5,-.1]) +pic = Picture(dataurl+"images/schrod.png").pos(0, -5, -0.1).scale(0.0255) barrier = Line(np.stack((x, V*15, np.zeros_like(x)), axis=1), c="black", lw=2) -box = bck.box().c('black') +barrier.name = "barrier" +plt.show(pic, barrier, __doc__) lines = [] -for i in range(0, Nsteps): +for i in range(nsteps): for j in range(500): Psi += d_dt(Psi) * dt # integrate for a while before showing things A = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) coords = np.stack((x, A), axis=1) Aline = Line(coords, c="db", lw=3) - plt.show(barrier, bck, Aline, box).remove(Aline) lines.append([Aline, A]) # store objects + plt.remove("Line").add(Aline).render() # now show the same lines along z representing time plt.objects= [] # clean up internal list of objects to show -plt.elevation(20) -plt.azimuth(20) -bck.alpha(1) -for i in range(Nsteps): - p = [0, 0, i*size/Nsteps] # shift along z - l, a = lines[i] - l.cmap("gist_earth_r", a) - plt.add(box, bck, l.pos(p), barrier.clone().alpha(0.3).pos(p)) - plt.reset_camera().render() +plt.elevation(20).azimuth(20) + +barrier.alpha(0.3).c('k') +barrier_end = barrier.clone().pos([0,0,20]) +plt.add(Ribbon(barrier, barrier_end, c="k", alpha=0.1)) +plt.reset_camera() + +for i in range(nsteps): + p = [0, 0, i*size/nsteps] # shift along z + line, A = lines[i] + line.cmap("gist_earth_r", A).pos(p) + plt.add(pic, line).render() plt.interactive().close() diff --git a/tests/issues/discussion_751.py b/tests/issues/discussion_751.py index f4b4e41d..e0e0b2b4 100644 --- a/tests/issues/discussion_751.py +++ b/tests/issues/discussion_751.py @@ -1,17 +1,23 @@ from vedo import * def callb(evt): - msh = evt.actor + msh = evt.object if not msh: return pt = evt.picked3d idcell = msh.closest_point(pt, return_cell_id=True) - msh.cellcolors[idcell] = [255,0,0,255] # red, opaque + # msh.cellcolors[idcell] = [255,0,0,255] # red, opaque + cols = msh.cellcolors.copy() + cols[idcell] = [0,255,0,255] # green, opaque + msh.cellcolors = cols + plt.render() m = Mesh(dataurl + "290.vtk") m.decimate().smooth().compute_normals() m.compute_quality().cmap("Blues", on="cells") +print(m.cellcolors) + plt = Plotter() plt.add_callback("mouse click", callb) plt.show(m, m.labels("cellid")) diff --git a/vedo/addons.py b/vedo/addons.py index e93bd922..8571ddc8 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4231,10 +4231,10 @@ def add_global_axes(axtype=None, c=None, bounds=()): sz = d except AttributeError: pass - + try: ocf.SetInputData(largestact) - except AttributeError: + except TypeError: ocf.SetInputData(largestact.dataset) ocf.Update() diff --git a/vedo/mesh.py b/vedo/mesh.py index 349bffc1..593b4ea5 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -234,62 +234,11 @@ def _repr_html_(self): def faces(self, ids=()): """ - DEPRECATED. Use property `mesh.faces` instead. - - Get cell polygonal connectivity ids as a python `list`. - The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - - If ids is set, return only the faces of the given cells. + DEPRECATED. Use property `mesh.cells` instead. """ - print("WARNING: use property mesh.cells instead of mesh.faces()") - arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) - - # Get cell connettivity ids as a 1D array. vtk format is: - # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - if len(arr1d) == 0: - arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) - - i = 0 - conn = [] - n = len(arr1d) - if n: - while True: - cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] - conn.append(cell) - i += arr1d[i] + 1 - if i >= n: - break - if len(ids): - return conn[ids] - return conn # cannot always make a numpy array of it! - - # @property - # def cells(self): - # """ - # Get cell polygonal connectivity ids as a python `list`. - # The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. - - # If ids is set, return only the faces of the given cells. - # """ - # arr1d = vtk2numpy(self.dataset.GetPolys().GetData()) - - # # Get cell connettivity ids as a 1D array. vtk format is: - # # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. - # if len(arr1d) == 0: - # arr1d = vtk2numpy(self.dataset.GetStrips().GetData()) - - # i = 0 - # conn = [] - # n = len(arr1d) - # if n: - # while True: - # cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] - # conn.append(cell) - # i += arr1d[i] + 1 - # if i >= n: - # break - # return conn # cannot always make a numpy array of it! - + vedo.printc("WARNING: use property mesh.cells instead of mesh.faces()",c='y') + return self.cells + @property def edges(self): """ diff --git a/vedo/shapes.py b/vedo/shapes.py index 76b55215..95cbc0d3 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -408,21 +408,6 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): alpha : (float) opacity in range [0,1] """ - self.slope = [] # populated by analysis.fit_line - self.center = [] - self.variances = [] - - self.coefficients = [] # populated by pyplot.fit() - self.covariance_matrix = [] - self.coefficients = [] - self.coefficient_errors = [] - self.monte_carlo_coefficients = [] - self.reduced_chi2 = -1 - self.ndof = 0 - self.data_sigma = 0 - self.error_lines = [] - self.error_band = None - self.res = res if isinstance(p1, Points): p1 = p1.pos() @@ -432,16 +417,18 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): p0 = p0.vertices # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: - if len(p0) > 3: - if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): - # assume input is 2D xlist, ylist - p0 = np.stack((p0, p1), axis=1) - p1 = None - p0 = utils.make3d(p0) + # if utils.is_sequence(p0) and len(p0) > 3: + # if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): + # # assume input is 2D xlist, ylist + # p0 = np.stack((p0, p1), axis=1) + # p1 = None + # p0 = utils.make3d(p0) # detect if user is passing a list of points: if isinstance(p0, vtk.vtkPolyData): poly = p0 + top = np.array([0,0,1]) + base = np.array([0,0,0]) elif utils.is_sequence(p0[0]): p0 = utils.make3d(p0) @@ -463,7 +450,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): poly.SetLines(lines) top = p0[-1] base = p0[0] - self.res = 2 + res = 2 else: # or just 2 points to link @@ -479,6 +466,23 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): base = np.asarray(p0, dtype=float) super().__init__(poly, c, alpha) + + self.slope = [] # populated by analysis.fit_line + self.center = [] + self.variances = [] + + self.coefficients = [] # populated by pyplot.fit() + self.covariance_matrix = [] + self.coefficients = [] + self.coefficient_errors = [] + self.monte_carlo_coefficients = [] + self.reduced_chi2 = -1 + self.ndof = 0 + self.data_sigma = 0 + self.error_lines = [] + self.error_band = None + self.res = res + self.lw(lw) self.properties.LightingOff() self.actor.PickableOff() @@ -500,19 +504,18 @@ def clone(self, deep=True): ``` ![](https://vedo.embl.es/images/feats/line_clone.png) """ - name = self.name - base = self.base - top = self.top - prop = vtk.vtkProperty() - prop.DeepCopy(self.properties) + poly = vtk.vtkPolyData() + if deep: + poly.DeepCopy(self.dataset) + else: + poly.ShallowCopy(self.dataset) - ln = Line(self) - ln.transform = self.transform + ln = Line(poly) ln.copy_properties_from(self) - ln.dataset.DeepCopy(self.dataset) - ln.name = name - ln.base = base - ln.top = top + # ln.transform = self.transform # WRONG + ln.name = self.name + ln.base = self.base + ln.top = self.top return ln def linecolor(self, lc=None): @@ -1669,7 +1672,10 @@ def read_points(): sta.mapper.SetResolveCoincidentTopologyToPolygonOffset() sta.lighting("off") - scals = grid.dataset.GetPointData().GetScalars() + try: + scals = grid.dataset.GetPointData().GetScalars() + except AttributeError: + scals = grid.GetPointData().GetScalars() if scals: sta.mapper.SetScalarRange(scals.GetRange()) if scalar_range is not None: @@ -3097,10 +3103,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra normal vector to the plane """ pos = utils.make3d(pos) - sx, sy = s - normal = np.asarray(normal, dtype=float) - self.variance = 0 ps = vtk.vtkPlaneSource() ps.SetResolution(res[0], res[1]) @@ -3108,17 +3111,16 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra tri.SetInputConnection(ps.GetOutputPort()) tri.Update() - poly = tri.GetOutput() axis = normal / np.linalg.norm(normal) theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtk.vtkTransform() t.PostMultiply() - t.Scale(sx, sy, 1) + t.Scale(s[0], s[1], 1) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) tf = vtk.vtkTransformPolyDataFilter() - tf.SetInputData(poly) + tf.SetInputData(tri.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3128,15 +3130,13 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra self.name = "Plane" self.top = normal self.base = np.array([0.0, 0.0, 0.0]) - + self.variance = 0 + def clone(self): newplane = Plane() newplane.dataset.DeepCopy(self.dataset) - newplane.transform = self.transform - prop = vtk.vtkProperty() - prop.DeepCopy(self.properties) - newplane.actor.SetProperty(prop) - newplane.properties = prop + newplane.copy_properties_from(self) + # newplane.transform = self.transform newplane.variance = 0 newplane.top = self.normal newplane.base = self.base diff --git a/vedo/transformations.py b/vedo/transformations.py index f7ccf8d3..1bdba403 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -433,11 +433,6 @@ def reorient( show(objs, Point(), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/orientation.png) - - Examples: - - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) - - ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) """ newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) diff --git a/vedo/version.py b/vedo/version.py index ae67d195..f1dc76fb 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev15a' +_version = '2023.5.0+dev16a' From 15d8a2bf538eb7fa9a6bc1a79415b312cd664cc0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 17:55:43 +0200 Subject: [PATCH 119/251] as2d() to clone2d() --- docs/changes.md | 6 ++- examples/advanced/fitspheres2.py | 2 +- examples/pyplot/histo_1d_e.py | 2 +- vedo/applications.py | 38 +++++++++++---- vedo/assembly.py | 12 ++--- vedo/cli.py | 8 ++++ vedo/core.py | 1 + vedo/mesh.py | 81 +++++++++++++++----------------- vedo/pyplot.py | 2 +- 9 files changed, 90 insertions(+), 62 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 8328735d..093e0a07 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -53,11 +53,13 @@ examples/volumetric/slicer1.py ``` tests/issues/discussion_751.py tests/issues/discussion_800.py -tests/issues/issue_893.py tests/issues/issue_905.py examples/pyplot/goniometer.py -``` +``` +### TODO +TextBase maybe useless can go into Actor2D +Mesh([points, faces, lines]) diff --git a/examples/advanced/fitspheres2.py b/examples/advanced/fitspheres2.py index 0207cafc..8f6d2a01 100644 --- a/examples/advanced/fitspheres2.py +++ b/examples/advanced/fitspheres2.py @@ -24,6 +24,6 @@ pts2.append(p + n / 8) plt += msh, Points(pts1), Lines(pts1, pts2, c="black") -plt += histogram(vals, xtitle='radius', xlim=[0,2]).as2d(pos="bottom-left") +plt += histogram(vals, xtitle='radius', xlim=[0,2]).clone2d(pos="bottom-left") plt += __doc__ plt.show().close() diff --git a/examples/pyplot/histo_1d_e.py b/examples/pyplot/histo_1d_e.py index 658f1c06..6b97da04 100644 --- a/examples/pyplot/histo_1d_e.py +++ b/examples/pyplot/histo_1d_e.py @@ -20,4 +20,4 @@ continents = sphere.threshold("Distance", above=20.0) continents.cmap("gist_earth").linewidth(1) -show(oceans, continents, histo.as2d(), __doc__) +show(oceans, continents, histo.clone2d(), __doc__) diff --git a/vedo/applications.py b/vedo/applications.py index 6b264636..d52439d0 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -103,9 +103,19 @@ def __init__( box = volume.box().alpha(0.2) self.add(box) + volume_axes_inset = vedo.addons.Axes( + box, + xtitle=' ', ytitle=' ', ztitle=' ', + yzgrid=False, + xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.08, + axes_linewidth=3, + xline_color='dr', yline_color='dg', zline_color='db', + ) + if show_icon: self.add_inset( - volume, pos=(0.9, 0.9), size=0.15, c="w", draggable=draggable + volume, volume_axes_inset, + pos=(0.9, 0.9), size=0.15, c="w", draggable=draggable ) # inits @@ -150,7 +160,7 @@ def __init__( bins=20, logscale=True, c=self.cmap_slicer, bg=ch, alpha=1, axes=dict(text_scale=2), - ).as2d(pos=[-0.925,-0.88], scale=0.4) + ).clone2d(pos=[-0.925,-0.88], scale=0.4) self.add(self.histogram) ################# @@ -198,7 +208,7 @@ def slider_function_z(widget, event): slider_function_x, 0, dims[0], - title="X", + title="", title_size=0.5, pos=[(0.8, 0.12), (0.95, 0.12)], show_value=False, @@ -208,7 +218,7 @@ def slider_function_z(widget, event): slider_function_y, 0, dims[1], - title="Y", + title="", title_size=0.5, pos=[(0.8, 0.08), (0.95, 0.08)], show_value=False, @@ -218,7 +228,7 @@ def slider_function_z(widget, event): slider_function_z, 0, dims[2], - title="Z", + title="", title_size=0.6, value=int(dims[2] / 2), pos=[(0.8, 0.04), (0.95, 0.04)], @@ -275,7 +285,7 @@ def button_func(obj, ename): bins=20, logscale=True, c=self.cmap_slicer, bg=ch, alpha=1, axes=dict(text_scale=2), - ).as2d(pos=[-0.925,-0.88], scale=0.4) + ).clone2d(pos=[-0.925,-0.88], scale=0.4) self.add(self.histogram) self.render() @@ -522,7 +532,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): c=histo_color, ytitle="log_10 (counts)", axes=dict(text_scale=1.9), - ).as2d(pos="bottom-left", scale=0.4) + ).clone2d(pos="bottom-left", scale=0.4) axes = kwargs.pop("axes", 7) if axes == 7: @@ -531,9 +541,21 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): ) box = orig_volume.box().alpha(0.25) + + volume_axes_inset = vedo.addons.Axes( + box, + yzgrid=False, + xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.08, + axes_linewidth=3, + xline_color='dr', yline_color='dg', zline_color='db', + xtitle_color='dr', ytitle_color='dg', ztitle_color='db', + xtitle_size=0.1, ytitle_size=0.1, ztitle_size=0.1, + title_font='VictorMono', + ) + self.user_mode("image") self.at(0).add(self.volume.actor, box, axe, self.usage, hist) - self.at(1).add(orig_volume) + self.at(1).add(orig_volume, volume_axes_inset) #################################################################### def on_key_press(self, evt): diff --git a/vedo/assembly.py b/vedo/assembly.py index 7bd91f1a..3bd10d36 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -252,12 +252,12 @@ def __init__(self, *meshs): self.objects = [m for m in meshs if m] self.actors = [m.actor for m in self.objects] - if self.objects: - self.base = self.objects[0].base - self.top = self.objects[0].top - else: - self.base = None - self.top = None + # if self.objects: + # self.base = self.objects[0].base + # self.top = self.objects[0].top + # else: + # self.base = None + # self.top = None scalarbars = [] for a in self.actors: diff --git a/vedo/cli.py b/vedo/cli.py index 6b833bb3..465ff47f 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -769,6 +769,13 @@ def draw_scene(args): clamp=True, size=(1350, 1000), ) + plt += vedo.Text2D( + args.files[0], + pos="top-left", + font="VictorMono", + s=1, + c="k", + ) plt.show() return @@ -802,6 +809,7 @@ def draw_scene(args): sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = applications.Slicer2DPlotter(vol) + # vedo.plotter_instance.window.SetWindowName(f"vedo - {args.files[0]}") vedo.plotter_instance.show().close() return diff --git a/vedo/core.py b/vedo/core.py index 61a1659d..06106def 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -784,6 +784,7 @@ def vertices(self): @vertices.setter def vertices(self, pts): """Set vertices (points) coordinates.""" + pts = utils.make3d(pts) arr = utils.numpy2vtk(pts, dtype=np.float32) try: vpts = self.dataset.GetPoints() diff --git a/vedo/mesh.py b/vedo/mesh.py index 593b4ea5..73ed1b2a 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -701,49 +701,44 @@ def shrink(self, fraction=0.85): self.pipeline = OperationNode("shrink", parents=[self]) return self - def stretch(self, q1, q2): - """ - Stretch mesh between points `q1` and `q2`. - - Examples: - - [aspring1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/aspring1.py) - - ![](https://vedo.embl.es/images/simulations/50738955-7e891800-11d9-11e9-85cd-02bd4f3f13ea.gif) - - .. note:: - for `Mesh` objects, two vectors `mesh.base`, and `mesh.top` must be defined. - """ - if self.base is None: - vedo.logger.error("in stretch() must define vectors mesh.base and mesh.top at creation") - raise RuntimeError() - - p1, p2 = self.base, self.top - q1, q2, z = np.asarray(q1), np.asarray(q2), np.array([0, 0, 1]) - a = p2 - p1 - b = q2 - q1 - plength = np.linalg.norm(a) - qlength = np.linalg.norm(b) - T = vtk.vtkTransform() - T.PostMultiply() - T.Translate(-p1) - cosa = np.dot(a, z) / plength - n = np.cross(a, z) - if np.linalg.norm(n): - T.RotateWXYZ(np.rad2deg(np.arccos(cosa)), n) - T.Scale(1, 1, qlength / plength) - - cosa = np.dot(b, z) / qlength - n = np.cross(b, z) - if np.linalg.norm(n): - T.RotateWXYZ(-np.rad2deg(np.arccos(cosa)), n) - else: - if np.dot(b, z) < 0: - T.RotateWXYZ(180, [1, 0, 0]) - - T.Translate(q1) - - self.apply_transform(T) - return self + # def stretch(self, q1, q2): + # """ + # Stretch mesh between points `q1` and `q2`. + + # .. note:: + # for `Mesh` objects, two vectors `mesh.base`, and `mesh.top` must be defined. + # """ + # if self.base is None: + # vedo.logger.error("in stretch() must define vectors mesh.base and mesh.top at creation") + # raise RuntimeError() + + # p1, p2 = self.base, self.top + # q1, q2, z = np.asarray(q1), np.asarray(q2), np.array([0, 0, 1]) + # a = p2 - p1 + # b = q2 - q1 + # plength = np.linalg.norm(a) + # qlength = np.linalg.norm(b) + # T = vtk.vtkTransform() + # T.PostMultiply() + # T.Translate(-p1) + # cosa = np.dot(a, z) / plength + # n = np.cross(a, z) + # if np.linalg.norm(n): + # T.RotateWXYZ(np.rad2deg(np.arccos(cosa)), n) + # T.Scale(1, 1, qlength / plength) + + # cosa = np.dot(b, z) / qlength + # n = np.cross(b, z) + # if np.linalg.norm(n): + # T.RotateWXYZ(-np.rad2deg(np.arccos(cosa)), n) + # else: + # if np.dot(b, z) < 0: + # T.RotateWXYZ(180, [1, 0, 0]) + + # T.Translate(q1) + + # self.apply_transform(T) + # return self def cap(self, return_cap=False): """ diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 18345026..da0ba849 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -660,7 +660,7 @@ def add_legend( aleg.name = "Legend" return self - def as2d(self, pos="bottom-left", scale=1, padding=0.05): + def clone2d(self, pos="bottom-left", scale=1, padding=0.05): """ Convert the Figure into a 2D static object (a 2D Assembly). From 91610595080143fbb6f5d8fd3b689d54075e7c7f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 18:42:38 +0200 Subject: [PATCH 120/251] parse examples/other --- docs/changes.md | 1 + examples/other/morphomatics_regression.py | 60 ------------------- examples/other/napari1.py | 23 ++++--- examples/other/trame_ex1.py | 9 ++- examples/other/vpolyscope.py | 21 ------- .../other/{wx_window1.py => wx_window.py} | 0 examples/other/wx_window2.py | 46 -------------- 7 files changed, 18 insertions(+), 142 deletions(-) delete mode 100644 examples/other/morphomatics_regression.py delete mode 100644 examples/other/vpolyscope.py rename examples/other/{wx_window1.py => wx_window.py} (100%) delete mode 100644 examples/other/wx_window2.py diff --git a/docs/changes.md b/docs/changes.md index 093e0a07..b6434c81 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -62,4 +62,5 @@ examples/pyplot/goniometer.py ### TODO TextBase maybe useless can go into Actor2D Mesh([points, faces, lines]) +reimplement actor rotations diff --git a/examples/other/morphomatics_regression.py b/examples/other/morphomatics_regression.py deleted file mode 100644 index 9bd06a14..00000000 --- a/examples/other/morphomatics_regression.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Geodesic regression for data in SO(3) -with the Morphometrics library""" -try: - from morphomatics.manifold import SO3 - from morphomatics.stats import RiemannianRegression -except ModuleNotFoundError: - print("Install with:") - print("pip install git+https://github.com/morphomatics/morphomatics.git#egg=morphomatics") -import numpy as np -import vedo - -# z-axis is axis of rotation -I = np.eye(3) -R = np.array( - [[np.cos(np.pi / 6), -np.sin(np.pi / 6), 0], - [np.sin( np.pi / 6), np.cos(np.pi / 6), 0], - [0, 0, 1]], -) - -# 6 points in SO(3). The extra dimension is not needed here but comes -# into play when the data consists of tuples of matrices. -M = SO3() -Y = np.zeros((6,) + tuple(M.point_shape)) # -> (6,1,3,3) -eval_perturbed = lambda t, vec: M.connec.exp(M.connec.geopoint(I,R,t), vec) -Y[0, 0] = eval_perturbed(-2 / 3, np.array([[0, 0, 0.1], [0, 0, 0.0], [-0.1, 0.0, 0]])) -Y[1, 0] = eval_perturbed(-1 / 3, np.array([[0, 0, 0.0], [0, 0, 0.2], [ 0.0,-0.2, 0]])) -Y[2, 0] = I -Y[3, 0] = eval_perturbed( 1 / 3, np.array([[0, 0, 0.0], [0, 0, 0.2], [ 0.0,-0.2, 0]])) -Y[4, 0] = eval_perturbed( 2 / 3, np.array([[0, 0, 0.1], [0, 0, 0.0], [-0.1, 0.0, 0]])) -Y[5, 0] = R - -# corresponding time points -t = np.array([0, 1/5, 2/5, 3/5, 4/5, 1]) - -# geodesic has degree 1 -degrees = np.array([1]) -# cubic regression -# degrees = np.array([3]) - -# solve -regression = RiemannianRegression(M, Y, t, degrees) - -# geodesic least-squares estimator -gam = regression.trend - -# evaluate geodesic at 100 equidistant points -X = gam.eval() - -# rotate [1,0,0] by rotations in X, i.e. take first column of X -x = X[...,0].squeeze() -time = np.linspace(0,1, x.shape[0]) -pts = [y[..., 0][0] for y in Y] - -# visualize -pts = vedo.Points(pts, r=15) -line = vedo.Line(x).lw(10).cmap("jet", time) -line.add_scalarbar("time") -sphere = vedo.Sphere(c='white').flat() -vedo.show(sphere, line, pts, __doc__, axes=1, viewup='z').close() - diff --git a/examples/other/napari1.py b/examples/other/napari1.py index 68b6f6ab..9f89a7a2 100644 --- a/examples/other/napari1.py +++ b/examples/other/napari1.py @@ -2,26 +2,25 @@ import napari import vedo +print("\nSEE ALSO https://github.com/jo-mueller/napari-vedo-bridge") + # Load the surface, triangulate just in case, and compute vertex normals surf = vedo.Mesh(vedo.dataurl+"beethoven.ply").triangulate().compute_normals() surf.rotate_x(180).rotate_y(60) vertices = surf.vertices -faces = surf.cells +faces = np.array(surf.cells) normals = surf.vertex_normals # generate vertex values by projecting normals on a "lighting vector" values = np.dot(normals, [-1, 1, 1]) -print(vertices.shape, faces.shape, values.shape) -# (2521, 3) (5030, 3) (2521,) - -with napari.gui_qt(): - # create an empty viewer - viewer = napari.Viewer() +# create an empty viewer +viewer = napari.Viewer() - # add the surface - viewer.add_surface((vertices, faces, values), opacity=0.8) - viewer.add_points(vertices, size=0.05, face_color='pink') +# add the surface +viewer.add_surface((vertices, faces, values), opacity=0.8) +viewer.add_points(vertices, size=0.05, face_color='pink') - # turn on 3D rendering - viewer.dims.ndisplay = 3 +# turn on 3D rendering +viewer.dims.ndisplay = 3 +napari.run() \ No newline at end of file diff --git a/examples/other/trame_ex1.py b/examples/other/trame_ex1.py index c206d597..e3df59c7 100644 --- a/examples/other/trame_ex1.py +++ b/examples/other/trame_ex1.py @@ -9,16 +9,19 @@ import vedo -cone = vedo.Cone() +sphere = vedo.Sphere().lw(1) +sphere.cmap("Spectral_r", sphere.vertices[:, 1]) +axes = vedo.Axes(sphere) plt = vedo.Plotter() -plt += cone +plt += sphere +plt += axes.unpack() +plt += vedo.Text3D("A color sphere", font='Quikhand', s=0.2, pos=[-1,1,-1]) # ----------------------------------------------------------------------------- # Trame # ----------------------------------------------------------------------------- server = get_server() - with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") diff --git a/examples/other/vpolyscope.py b/examples/other/vpolyscope.py deleted file mode 100644 index 69f15995..00000000 --- a/examples/other/vpolyscope.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# Visualization example with polyscope (pip install polyscope) -# https://polyscope.run/py/ -import vedo -import polyscope - -m = vedo.load(vedo.dataurl + "embryo.tif").isosurface().extract_largest_region() -# m = vedo.load(vedo.dataurl+'man.vtk') - -polyscope.set_program_name("vedo using polyscope") -polyscope.set_verbosity(0) -polyscope.set_up_dir("z_up") -polyscope.init() -ps_mesh = polyscope.register_surface_mesh( - "My vedo mesh", m.vertices, m.cells, color=[0.5, 0, 0], smooth_shade=True -) -ps_mesh.add_scalar_quantity("heights", m.vertices[:, 2], defined_on="vertices") -ps_mesh.set_material("wax") # wax, mud, jade, candy -polyscope.show() - -vedo.show(m, axes=11) diff --git a/examples/other/wx_window1.py b/examples/other/wx_window.py similarity index 100% rename from examples/other/wx_window1.py rename to examples/other/wx_window.py diff --git a/examples/other/wx_window2.py b/examples/other/wx_window2.py deleted file mode 100644 index 38155749..00000000 --- a/examples/other/wx_window2.py +++ /dev/null @@ -1,46 +0,0 @@ -import wx -import vedo -from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor - -##################################################### wx app -app = wx.App(False) -frame = wx.Frame(None, -1, "vedo with wxpython", size=(800,800)) -widget = wxVTKRenderWindowInteractor(frame, -1) -sizer = wx.BoxSizer(wx.VERTICAL) -sizer.Add(widget, 1, wx.EXPAND) -frame.SetSizer(sizer) -frame.Layout() -widget.Enable(1) -widget.AddObserver("ExitEvent", lambda o,e,f=frame: f.Close()) - -##################################################### vedo -def func(event): - mesh = event.actor - if not mesh: return - - ptid = mesh.closest_point(event.picked3d, return_point_id=True) - txt = f"Probed point:\n{vedo.utils.precision(event.picked3d, 3)}\n" \ - f"value = {vedo.utils.precision(arr[ptid], 2)}" - - spt = mesh.vertices[ptid] - vpt = vedo.shapes.Sphere(spt, r=0.01, c='orange2').pickable(False) - vig = vpt.flagpole(txt, s=.05, offset=(0.5,0.5), font="VictorMono").follow_camera() - - msg.text(txt) # update the 2d text message - plt.remove(plt.objects[-2:]).add([vpt, vig]) # remove last 2 objects, add the new ones - widget.Render() # need to manually call Render - -msg = vedo.Text2D(pos='bottom-left', font="VictorMono") -msh = vedo.shapes.ParametricShape("RandomHills").cmap('terrain') -axs = vedo.Axes(msh) -arr = msh.pointdata["Scalars"] - -plt = vedo.Plotter(bg='moccasin', bg2='blue9', wx_widget=widget) -plt.add([msh, axs, msg]).reset_camera() -plt.objects += [None,None,None] # place holder for sphere, flagpole, text2d -plt.add_callback('MouseMove', func) - -##################################################### -# Show everything -frame.Show() -app.MainLoop() From cbf8b9ff5f71c89174b58de3814987fc90f1428c Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 19:57:05 +0200 Subject: [PATCH 121/251] fix Arrows coloring --- docs/changes.md | 12 ++++++++++++ examples/basic/closewindow.py | 3 +-- examples/simulations/gas.py | 28 +++++++++++----------------- vedo/cli.py | 5 +++-- vedo/shapes.py | 21 ++++++++++----------- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index b6434c81..aa805db2 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -57,10 +57,22 @@ tests/issues/issue_905.py examples/pyplot/goniometer.py +closewindow.py + +brownian2d.py +gyro +particle_simulator.py +slice_plane1.py +volume_operations.py + +fit_polynomial1.py +nearest.py + ``` ### TODO TextBase maybe useless can go into Actor2D Mesh([points, faces, lines]) reimplement actor rotations +save and load a transform diff --git a/examples/basic/closewindow.py b/examples/basic/closewindow.py index 5edf3666..55e74ff4 100644 --- a/examples/basic/closewindow.py +++ b/examples/basic/closewindow.py @@ -8,7 +8,6 @@ mesh = Paraboloid() plt1 = show(mesh, __doc__, title='First Plotter instance') - # Now press 'q' to exit the window interaction, # windows stays open but not reactive anymore. @@ -22,7 +21,7 @@ # window should now close, the Plotter instance becomes unusable # but mesh objects still exist in it: -printc("First Plotter:", plt1.objects, '\nPress enter again') +printc("First Plotter:", plt1.objects, '\nPress q again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. ################################################################## diff --git a/examples/simulations/gas.py b/examples/simulations/gas.py index be94f3a1..e477c15a 100644 --- a/examples/simulations/gas.py +++ b/examples/simulations/gas.py @@ -2,22 +2,21 @@ ## Based on gas.py by Bruce Sherwood for a cube as a container ## Slightly modified by Andrey Antonov for a torus. ## Adapted by M. Musy for vedo -## relevant points in the code are marked with '### <--' from random import random import numpy as np -from vedo import Plotter, progressbar, mag, versor, Torus, Sphere +from vedo import Plotter, mag, versor, Torus, Spheres from vedo.addons import ProgressBarWidget ############################################################# Natoms = 400 # change this to have more or fewer atoms -Nsteps = 150 # nr of steps in the simulation +Nsteps = 200 # nr of steps in the simulation Matom = 4e-3 / 6e23 # helium mass -Ratom = 0.025 # wildly exaggerated size of helium atom +Ratom = 0.025 RingThickness = 0.3 # thickness of the toroid RingRadius = 1 k = 1.4e-23 # Boltzmann constant -T = 300 # room temperature +T = 300 # room temperature dt = 1.5e-5 ############################################################ @@ -28,31 +27,28 @@ def reflection(p, pos): plt = Plotter(title="gas in toroid", interactive=0, axes=0) plt += __doc__ -plt += Torus(c="g", r1=RingRadius, r2=RingThickness, alpha=0.1).wireframe(1) ### <-- +plt += Torus(c="g", r1=RingRadius, r2=RingThickness, alpha=0.1).wireframe(1) -Atoms = [] poslist = [] plist, mlist, rlist = [], [], [] -mass = Matom * Ratom ** 3 / Ratom ** 3 +mass = Matom pavg = np.sqrt(2.0 * mass * 1.5 * k * T) # average kinetic energy p**2/(2mass) = (3/2)kT +colors = np.random.rand(Natoms) for i in range(Natoms): alpha = 2 * np.pi * random() x = RingRadius * np.cos(alpha) * 0.9 y = RingRadius * np.sin(alpha) * 0.9 z = 0 - atm = Sphere(pos=(x, y, z), r=Ratom, c=i, res=6).phong() - plt += atm - Atoms = Atoms + [atm] ### <-- theta = np.pi * random() phi = 2 * np.pi * random() px = pavg * np.sin(theta) * np.cos(phi) py = pavg * np.sin(theta) * np.sin(phi) pz = pavg * np.cos(theta) poslist.append((x, y, z)) - plist.append((px, py, pz)) + plist.append((px, py, pz)) mlist.append(mass) - rlist.append(Ratom) + rlist.append(np.abs(Ratom + Ratom*np.random.rand() / 2)) pos = np.array(poslist) poscircle = pos @@ -68,7 +64,6 @@ def reflection(p, pos): pbw = ProgressBarWidget(Nsteps) plt += pbw - plt.show() for it in range(Nsteps): @@ -125,11 +120,10 @@ def reflection(p, pos): p[k] = reflection(p[k], pos[k] - poscircle[k]) # then update positions of display objects - for l in range(Natoms): - Atoms[l].pos(pos[l]) ### <-- outside = np.greater_equal(mag(pos), RingRadius + RingThickness) pbw.update() # update progress bar - plt.render().reset_camera().azimuth(0.5) ### <-- + plt.remove("Spheres").add(Spheres(pos, r=radius, c='b6')) + plt.render().reset_camera().azimuth(0.5) plt.interactive().close() diff --git a/vedo/cli.py b/vedo/cli.py index 465ff47f..0310aa0e 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -736,7 +736,6 @@ def draw_scene(args): sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vol.mode(int(args.mode)).color(args.cmap).jittering(True) - vol.lighting(args.lighting) plt = applications.RayCastPlotter(vol) plt.show(viewup="z", interactive=True).close() return @@ -911,9 +910,11 @@ def draw_scene(args): try: ds = actor.diagonal_size() * 3 plt.camera.SetClippingRange(0, ds) + plt.reset_camera() + # plt.render() plt.show(actor, at=i, interactive=False, zoom=args.zoom, mode=interactor_mode) - plt.actors = actors + except AttributeError: # wildcards in quotes make glob return actor as a list :( vedo.logger.error("Please do not use wildcards within single or double quotes") diff --git a/vedo/shapes.py b/vedo/shapes.py index 95cbc0d3..d6140f1b 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2044,15 +2044,6 @@ def __init__( self.s = s if s is not None else 1 ## used by pyplot.__iadd() self.name = "Arrow" - # def tip_point(self, return_index=False): - # """Return the coordinates of the tip of the Arrow, or the point index.""" - # if self.tip_index is None: - # arrpts = utils.vtk2numpy(self.source.GetOutput().GetPoints().GetData()) - # self.tip_index = np.argmax(arrpts[:, 0]) - # if return_index: - # return self.tip_index - # return self.vertices[self.tip_index] - class Arrows(Glyph): """ @@ -2130,16 +2121,24 @@ def __init__( out = arr.GetOutput() orients = end_pts - start_pts + + color_by_vector_size = c in cmaps_names + super().__init__( start_pts, out, orientation_array=orients, scale_by_vector_size=True, - color_by_vector_size=True, + color_by_vector_size=color_by_vector_size, c=c, alpha=alpha, ) - self.flat().lighting("off") + self.lighting("off") + if color_by_vector_size: + vals = np.linalg.norm(orients, axis=1) + self.mapper.SetScalarRange(vals.min(), vals.max()) + else: + self.c(c) self.name = "Arrows" From e73f3cca4f00fe582b55909066c4d72e02c67188 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 20:41:22 +0200 Subject: [PATCH 122/251] get rid of .top and .base in most classes --- vedo/addons.py | 6 +- vedo/assembly.py | 415 +--------------------------------------- vedo/core.py | 11 +- vedo/pointcloud.py | 5 - vedo/pyplot.py | 14 +- vedo/shapes.py | 18 +- vedo/transformations.py | 2 +- 7 files changed, 20 insertions(+), 451 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 8571ddc8..baccb238 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -732,8 +732,8 @@ def Goniometer( justify="center", ) cr = np.cross(va, vb) + lb.reorient([0,0,1], cr * np.sign(cr[2]), rotation=rotation, xyplane=False) lb.pos(p2 + vc * r / 1.75) - lb.reorient(cr * np.sign(cr[2]), rotation=rotation) lb.c(c).bc("tomato").lighting("off") acts.append(lb) @@ -2414,9 +2414,7 @@ def Ruler3D( macts.properties.SetLineWidth(lw) macts.properties.LightingOff() macts.actor.UseBoundsOff() - macts.base = q1 - macts.top = q2 - macts.reorient(p2 - p1, rotation=axis_rotation) + macts.reorient(q2 - q1, p2 - p1, rotation=axis_rotation) macts.pos(pos) macts.bc("tomato").pickable(False) return macts diff --git a/vedo/assembly.py b/vedo/assembly.py index 3bd10d36..cd1235ed 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -252,13 +252,6 @@ def __init__(self, *meshs): self.objects = [m for m in meshs if m] self.actors = [m.actor for m in self.objects] - # if self.objects: - # self.base = self.objects[0].base - # self.top = self.objects[0].top - # else: - # self.base = None - # self.top = None - scalarbars = [] for a in self.actors: if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): @@ -469,10 +462,8 @@ def rotate_z(self, angle): LT = LinearTransform().rotate_z(angle) return self.apply_transform(LT) - def reorient(self, new_axis, old_axis=None, rotation=0, rad=False): + def reorient(self, old_axis, new_axis, rotation=0, rad=False): """Rotate object to a new orientation.""" - if old_axis is None: - old_axis = self.top - self.base if rad: rotation *= 57.3 axis = old_axis / np.linalg.norm(old_axis) @@ -597,407 +588,3 @@ def show(self, **options): """ return vedo.plotter.show(self, **options) - -############################################################################### -# class Gruppo: - -# def __init__(self, *meshes): -# """ -# Group many and treat them as a single new object. -# """ - -# self.actor = vtk.vtkPropAssembly() -# self.actor.data = self #reference to this object - -# self.rendered_at = set() - -# self.name = "Gruppo" - -# self.objects = [] - -# self.transform = LinearTransform() - -# for m in vedo.utils.flatten(meshes): -# if m: -# self.objects.append(m) -# self.actor.AddPart(m.actor) -# if hasattr(m, "scalarbar") and m.scalarbar is not None: -# self.objects.append(m.scalarbar) -# self.actor.AddPart(m.scalarbar.actor) - -# self.actor.PickableOff() - -# if self.objects: -# self.base = self.objects[0].base -# self.top = self.objects[0].top -# else: -# self.base = None -# self.top = None - -# self.pipeline = vedo.utils.OperationNode( -# "Gruppo", -# parents=self.objects, -# comment=f"#objects {len(self.objects)}", -# c="#f08080", -# ) -# ########################################## - -# def _repr_html_(self): -# """ -# HTML representation of the Gruppo object for Jupyter Notebooks. - -# Returns: -# HTML text with the image and some properties. -# """ -# import io -# import base64 -# from PIL import Image - -# library_name = "vedo.assembly.Gruppo" -# help_url = "https://vedo.embl.es/docs/vedo/assembly.html" - -# arr = self.thumbnail(zoom=1.1, elevation=-60) - -# im = Image.fromarray(arr) -# buffered = io.BytesIO() -# im.save(buffered, format="PNG", quality=100) -# encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") -# url = "data:image/png;base64," + encoded -# image = f"" - -# # statisitics -# bounds = "
".join( -# [ -# vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) -# for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) -# ] -# ) - -# help_text = "" -# if self.name: -# help_text += f" {self.name}:   " -# help_text += '' + library_name + "" -# if self.filename: -# dots = "" -# if len(self.filename) > 30: -# dots = "..." -# help_text += f"
({dots}{self.filename[-30:]})" - -# allt = [ -# "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.utils.precision(cm,3) + "
center of mass " + utils.precision(cm,3) + "
nr. points / tets " + str(self.npoints) + " / " + str(self.ncells) + "
", -# "", -# "", -# "
", -# image, -# "
", -# help_text, -# "", -# "", -# "", -# "", -# "", -# "
nr. of objects " -# + str(self.GetNumberOfPaths()) -# + "
position " + str(self.transformation.position) + "
diagonal size " -# + vedo.utils.precision(self.diagonal_size(), 5) -# + "
bounds
(x/y/z)
" + str(bounds) + "
", -# "
", -# ] -# return "\n".join(allt) - -# def __add__(self, obj): -# """ -# Add an object to the `Gruppo` -# """ -# self.objects.append(obj) -# self.actor.AddPart(obj.actor) - -# if hasattr(obj, "scalarbar") and obj.scalarbar is not None: -# self.objects.append(obj.scalarbar) -# self.actor.AddPart(obj.scalarbar.actor) -# return self - -# def __iadd__(self, *obj): -# """ -# Add an object to the group -# """ -# for ob in obj: -# if ob: -# self.objects.append(ob) -# self.actor.AddPart(ob.actor) -# if hasattr(ob, "scalarbar") and ob.scalarbar is not None: -# self.objects.append(ob.scalarbar) -# self.AddPart(ob.scalarbar.actor) -# return self - -# def __contains__(self, obj): -# """Allows to use ``in`` to check if an object is in the `Gruppo`.""" -# return obj in self.objects - -# def pickable(self, value): -# """Set/get the pickability property of an assembly and its elements""" -# # set property to each element -# for elem in self.recursive_unpack(): -# elem.pickable(value) -# self.actor.SetPickable(value) -# return self - -# def use_bounds(self, value): -# """Consider object bounds in rendering.""" -# self.actor.SetUseBounds(value) -# return self - -# def unpack(self): -# """Unpack the group into its elements""" -# elements = [] -# self.actor.InitPathTraversal() -# parts = self.actor.GetParts() -# parts.InitTraversal() -# for i in range(parts.GetNumberOfItems()): -# ele = parts.GetItemAsObject(i) -# elements.append(ele) -# return elements - -# def clone(self): -# """Make a clone copy of the object.""" -# newlist = [] -# for a in self.objects: -# newlist.append(a.clone()) -# newg = Gruppo(newlist) -# newg.name = self.name -# newg.transform = self.transform.clone() -# return newg - -# def diagonal_size(self): -# """Get the diagonal size of the bounding box.""" -# b = self.bounds() -# return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) - -# # def g_unpack(self): -# # """Unpack the group into its elements""" - -# # return self.objects - -# # def r_unpack(self): -# # """Flatten out an Gruppo.""" - -# # def _genflatten(lst): -# # if not lst: -# # return [] -# # ## -# # # if isinstance(lst[-1], Gruppo): -# # # lst = lst[-1].g_unpack() -# # ## - -# # for elem in lst: -# # if isinstance(elem, Gruppo): -# # for x in elem.g_unpack(): -# # yield x -# # else: -# # yield elem - -# # l1 = list(_genflatten(self.objects)) -# # return l1 - -# def recursive_unpack(self): -# """Flatten out an Gruppo.""" -# flatlist = [] -# for o1 in self.objects: -# if isinstance(o1, Gruppo): -# for o2 in o1.objects: -# if isinstance(o2, Gruppo): -# for o3 in o2.objects: -# if isinstance(o3, Gruppo): -# for o4 in o3.objects: -# if isinstance(o3, Gruppo): -# print("Warning: Gruppo.recursive_unpack() is limited to 4 levels") -# else: -# flatlist.append(o4) -# else: -# flatlist.append(o3) -# else: -# flatlist.append(o2) -# else: -# flatlist.append(o1) -# return flatlist - -# def unpack(self, i=None): -# """Unpack the list of objects from a ``Gruppo``. - -# If `i` is given, get `i-th` object from a ``Gruppo``. -# Input can be a string, in this case returns the first object -# whose name contains the given string. - -# Examples: -# - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) -# """ -# if i is None: -# return self.objects -# elif isinstance(i, int): -# return self.objects[i] -# elif isinstance(i, str): -# for m in self.objects: -# if i in m.name: -# return m - -# def pos(self, *p): -# """Set object position.""" -# if len(p) == 0: -# return self.transform.position -# q = self.transform.position -# LT = LinearTransform().translate(-q +p) -# self.transform.concatenate(LT) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - -# def rotate_x(self, angle, rad=False, around=None): -# """ -# Rotate around x-axis. If angle is in radians set `rad=True`. - -# Use `around` to define a pivoting point. -# """ -# LT = LinearTransform().rotate_x(angle, rad, around) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - -# def rotate_y(self, angle, rad=False, around=None): -# """ -# Rotate around y-axis. If angle is in radians set `rad=True`. - -# Use `around` to define a pivoting point. -# """ -# LT = LinearTransform().rotate_y(angle, rad, around) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - -# def rotate_z(self, angle, rad=False, around=None): -# """ -# Rotate around z-axis. If angle is in radians set `rad=True`. - -# Use `around` to define a pivoting point. -# """ -# LT = LinearTransform().rotate_z(angle, rad, around) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - -# def x(self, val=None): -# """Set/Get object position along x axis.""" -# p = self.transform.position -# if val is None: -# return p[0] -# self.pos(val, p[1], p[2]) -# return self - -# def y(self, val=None): -# """Set/Get object position along y axis.""" -# p = self.transform.position -# if val is None: -# return p[1] -# self.pos(p[0], val, p[2]) -# return self - -# def z(self, val=None): -# """Set/Get object position along z axis.""" -# p = self.transform.position -# if val is None: -# return p[2] -# self.pos(p[0], p[1], val) -# return self - -# def shift(self, *ds): -# """Add a shift to the current object position.""" -# LT = LinearTransform().translate(ds) -# self.transform.concatenate(LT) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - -# def scale(self, s=None, reset=False, origin=True): -# """ -# Set/get object's scaling factor. - -# Arguments: -# s : (list, float) -# scaling factor(s). -# reset : (bool) -# if True previous scaling factors are ignored. -# origin : (bool) -# if True scaling is applied with respect to object's position, -# otherwise is applied respect to (0,0,0). - -# Note: -# use `s=(sx,sy,sz)` to scale differently in the three coordinates. -# """ -# if s is None: -# return np.array(self.transform.T.GetScale()) - -# if not _is_sequence(s): -# s = [s, s, s] - -# LT = LinearTransform() -# if reset: -# old_s = np.array(self.transform.T.GetScale()) -# LT.scale(s / old_s) -# else: -# if origin is True: -# LT.scale(s, origin=self.transform.position) -# elif origin is False: -# LT.scale(s, origin=False) -# else: -# LT.scale(s, origin=origin) - -# self.transform.concatenate(LT) -# for o in self.recursive_unpack(): -# o.apply_transform(LT) -# return self - - -# def bounds(self): -# """ -# Get the object bounds. -# Returns a list in format [xmin,xmax, ymin,ymax]. -# """ -# return self.actor.GetBounds() - -# def xbounds(self, i=None): -# """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" -# b = self.bounds() -# if i is not None: -# return b[i] -# return (b[0], b[1]) - -# def ybounds(self, i=None): -# """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" -# b = self.bounds() -# if i == 0: -# return b[2] -# if i == 1: -# return b[3] -# return (b[2], b[3]) - -# def zbounds(self, i=None): -# """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" -# b = self.bounds() -# if i == 0: -# return b[4] -# if i == 1: -# return b[5] -# return (b[4], b[5]) - - -# def show(self, **options): -# """ -# Create on the fly an instance of class ``Plotter`` or use the last existing one to -# show one single object. - -# This method is meant as a shortcut. If more than one object needs to be visualised -# please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - -# Returns the ``Plotter`` class instance. -# """ -# return vedo.plotter.show(self, **options) - diff --git a/vedo/core.py b/vedo/core.py index 06106def..6d79edcb 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -326,11 +326,7 @@ class CommonAlgorithms: def __init__(self): self.dataset = None - # self._update = lambda a, reset_locators=0: a self.pipeline = None - self.top = np.array([0, 0, 1]) - self.base = np.array([0, 0, 0]) - self.name = "" self.filename = "" @@ -1443,7 +1439,7 @@ def rotate_z(self, angle, rad=False, around=None): LT = LinearTransform().rotate_z(angle, rad, around) return self.apply_transform(LT) - def reorient(self, newaxis, initaxis=None, rotation=0, rad=False, xyplane=True): + def reorient(self, initaxis, newaxis, rotation=0, rad=False, xyplane=False): """ Reorient the object to point to a new direction from an initial one. If `initaxis` is None, the object will be assumed in its "default" orientation. @@ -1451,12 +1447,9 @@ def reorient(self, newaxis, initaxis=None, rotation=0, rad=False, xyplane=True): Use `rotation` to first rotate the object around its `initaxis`. """ - if initaxis is None: - initaxis = np.asarray(self.top) - self.base - q = self.transform.position LT = LinearTransform() - LT.reorient(newaxis, initaxis, q, rotation, rad, xyplane) + LT.reorient(initaxis, newaxis, q, rotation, rad, xyplane) return self.apply_transform(LT) def scale(self, s=None, reset=False, origin=True): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 4558961e..3d02810a 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -273,7 +273,6 @@ def fit_plane(points, signed=False): pla = vedo.shapes.Plane(datamean, n, s=[s, s]) pla.variance = dd[2] pla.name = "FitPlane" - pla.top = n return pla @@ -524,8 +523,6 @@ def fibonacci_sphere(n): self.axes = None self.picked3d = None - self.top = np.array([0, 0, 1]) - self.base = np.array([0, 0, 0]) self.info = {} self.time = time.time() self.rendered_at = set() @@ -763,8 +760,6 @@ def clone(self, deep=True): cloned.copy_properties_from(self) - cloned.base = np.array(self.base) - cloned.top = np.array(self.top) cloned.name = str(self.name) cloned.filename = str(self.filename) cloned.info = dict(self.info) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index da0ba849..37baaada 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -396,11 +396,13 @@ def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): if isinstance(a, (shapes.Arrow, shapes.Arrow2D)): # discard input Arrow and substitute it with a brand new one # (because scaling would fatally distort the shape) - prop = a.properties - prop.LightingOff() + py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py b = shapes.Arrow2D(a.base, a.top, s=a.s, fill=a.fill).z(a.z()) + + prop = a.properties + prop.LightingOff() b.actor.SetProperty(prop) b.properties = prop b.y(py * self.yscale) @@ -2987,8 +2989,8 @@ def _plot_polar( if mrg: mrg.color(bc).alpha(alpha).lighting("off") rh = Assembly([lines, ptsact, filling] + [mrg]) - rh.base = np.array([0, 0, 0], dtype=float) - rh.top = np.array([0, 0, 1], dtype=float) + # rh.base = np.array([0, 0, 0], dtype=float) + # rh.top = np.array([0, 0, 1], dtype=float) rh.name = "PlotPolar" return rh @@ -3174,8 +3176,8 @@ def _histogram_hex_bin( asse = Assembly(hexs) asse.SetScale(1.2 / n * dx, 1 / m * dy, norm / binmax * (dx + dy) / 4) asse.SetPosition(xmin, ymin, 0) - asse.base = np.array([0, 0, 0], dtype=float) - asse.top = np.array([0, 0, 1], dtype=float) + # asse.base = np.array([0, 0, 0], dtype=float) + # asse.top = np.array([0, 0, 1], dtype=float) asse.name = "HistogramHexBin" return asse diff --git a/vedo/shapes.py b/vedo/shapes.py index d6140f1b..79272946 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2591,8 +2591,8 @@ def __init__( ar.SetNegative(invert) ar.SetResolution(res) ar.Update() + super().__init__(ar.GetOutput(), c, alpha) - self.pos(self.base) self.lw(2).lighting("off") self.name = "Arc" @@ -2825,8 +2825,6 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): super().__init__(glyph.GetOutput(), alpha=alpha) self.pos(base) - self.base = base - self.top = centers[-1] self.phong() if cisseq: self.mapper.ScalarVisibilityOn() @@ -3127,8 +3125,6 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra self.lighting("off") self.pos(pos) self.name = "Plane" - self.top = normal - self.base = np.array([0.0, 0.0, 0.0]) self.variance = 0 def clone(self): @@ -3137,8 +3133,6 @@ def clone(self): newplane.copy_properties_from(self) # newplane.transform = self.transform newplane.variance = 0 - newplane.top = self.normal - newplane.base = self.base return newplane @property @@ -3392,8 +3386,8 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al super().__init__(poly, c=c, alpha=alpha) self.pos(pos) self.lw(1).lighting("off") - self.base = np.array([0.5, 0.5, 0.0]) - self.top = np.array([0.5, 0.5, 1.0]) + # self.base = np.array([0.5, 0.5, 0.0]) + # self.top = np.array([0.5, 0.5, 1.0]) self.name = "TessellatedBox" @@ -3464,9 +3458,9 @@ def __init__( tuf.Update() super().__init__(tuf.GetOutput(), c, alpha) self.phong() - self.pos(start_pt) self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) + self.pos(start_pt) self.name = "Spring" @@ -3521,9 +3515,9 @@ def __init__( super().__init__(pd, c, alpha) self.phong() + self.base = base + self.top = top self.pos(pos) - self.base = base + pos - self.top = top + pos self.name = "Cylinder" diff --git a/vedo/transformations.py b/vedo/transformations.py index 1bdba403..e31cc211 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -404,7 +404,7 @@ def matrix3x3(self): return np.array(M) def reorient( - self, newaxis, initaxis, around=(0, 0, 0), rotation=0, rad=False, xyplane=True + self, initaxis, newaxis, around=(0, 0, 0), rotation=0, rad=False, xyplane=True ): """ Set/Get object orientation. From fc0cc700b5bdc49b3498c5907bddadeb0a2fb313 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 22:25:24 +0200 Subject: [PATCH 123/251] add write (Non)LinearTranformations, fix reorient() --- docs/changes.md | 1 - examples/advanced/capping_mesh.py | 3 +- examples/advanced/warp6.py | 2 +- examples/pyplot/fit_circle.py | 2 +- examples/simulations/gyroscope1.py | 2 +- vedo/transformations.py | 107 ++++++++++++++++++++++++++--- 6 files changed, 101 insertions(+), 16 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index aa805db2..3e98131c 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -74,5 +74,4 @@ nearest.py TextBase maybe useless can go into Actor2D Mesh([points, faces, lines]) reimplement actor rotations -save and load a transform diff --git a/examples/advanced/capping_mesh.py b/examples/advanced/capping_mesh.py index 53df421a..9d2a4954 100644 --- a/examples/advanced/capping_mesh.py +++ b/examples/advanced/capping_mesh.py @@ -8,13 +8,12 @@ def capping(amsh, bias=0, invert=False, res=50): pln = fit_plane(bn) cp = [pln.closest_point(p) for p in bn.vertices] pts = Points(cp) - pts.top = pln.normal if invert is None: cutm = amsh.clone().cut_with_plane(origin=pln.center, normal=pln.normal) invert = cutm.npoints > amsh.npoints - pts2 = pts.clone().reorient([0,0,1]).project_on_plane('z') + pts2 = pts.clone().reorient(pln.normal, [0,0,1]).project_on_plane('z') msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res) source = pts2.vertices.tolist() diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index d6a221f9..124a660d 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -10,7 +10,7 @@ def on_keypress(event): p = verts[idx] + n / 5 txt = Text3D("Text3D\nABCDEF", s=0.1, justify="centered", c="red5") - txt.reorient(n).pos(p) + txt.reorient([0,0,1], n).pos(p) tpts = txt.clone().subsample(0.05).vertices kpts = [mesh.closest_point(tp) for tp in tpts] diff --git a/examples/pyplot/fit_circle.py b/examples/pyplot/fit_circle.py index b0dd08e1..2dc568d0 100644 --- a/examples/pyplot/fit_circle.py +++ b/examples/pyplot/fit_circle.py @@ -23,7 +23,7 @@ curvs[i] = sqrt(1/R) * z/abs(z) if R < 0.75: circle = Circle(center, r=R).wireframe() - circle.reorient(normal) + circle.reorient([0,0,1], normal) circles.append(circle) fitpts.append(center) diff --git a/examples/simulations/gyroscope1.py b/examples/simulations/gyroscope1.py index 97766fa5..cd3c9c57 100644 --- a/examples/simulations/gyroscope1.py +++ b/examples/simulations/gyroscope1.py @@ -48,7 +48,7 @@ def loop_func(event): gpos = cm - 1/2 * Ls * versor(Lrot) # set orientation along gaxis and rotate it around its axis by omega*t degrees - gyro.reorient(Lrot, rotation=omega*t, rad=True).pos(gpos) + gyro.reorient([0,0,1], Lrot, rotation=omega*t, rad=True).pos(gpos) spring = Spring(top, gpos, r1=0.06, thickness=0.01, c="gray") plt.remove("Spring").add(spring) plt.render() diff --git a/vedo/transformations.py b/vedo/transformations.py index e31cc211..d046c8f8 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -45,7 +45,9 @@ class LinearTransform: """Work with linear transformations.""" def __init__(self, T=None): - """Define a linear transformation. + """ + Define a linear transformation. + Can be saved to file and reloaded. Arguments: T : (vtk.vtkTransform, numpy array) @@ -72,6 +74,9 @@ def __init__(self, T=None): ``` """ + self.name = "LinearTransform" + self.comment = "" + if T is None: T = vtk.vtkTransform() @@ -104,9 +109,21 @@ def __init__(self, T=None): S = vtk.vtkTransform() S.DeepCopy(T.T) T = S + + elif isinstance(T, str): + import json + with open(T, "r") as read_file: + D = json.load(read_file) + self.name = D["name"] + self.comment = D["comment"] + matrix = np.array(D["matrix"]) + T = vtk.vtkTransform() + m = vtk.vtkMatrix4x4() + for i in range(4): + for j in range(4): + m.SetElement(i, j, matrix[i][j]) + T.SetMatrix(m) - self.name = "LinearTransform" - self.comment = "" self.T = T self.T.PostMultiply() self.inverse_flag = False @@ -403,6 +420,21 @@ def matrix3x3(self): M = [[m.GetElement(i, j) for j in range(3)] for i in range(3)] return np.array(M) + def write(self, filename): # eg. filename="transform.mat" + """Save transformation to ASCII file.""" + import json + m = self.T.GetMatrix() + M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] + arr = np.array(M) + dictionary = { + "name": self.name, + "comment": self.comment, + "matrix": arr.astype(float).tolist(), + "n_concatenated_transforms": self.n_concatenated_transforms, + } + with open(filename, "w") as outfile: + json.dump(dictionary, outfile, sort_keys=True, indent=2) + def reorient( self, initaxis, newaxis, around=(0, 0, 0), rotation=0, rad=False, xyplane=True ): @@ -427,7 +459,7 @@ def reorient( for a in np.linspace(0, 6.28, 7): v = vector(cos(a), sin(a), 0)*1000 pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) - pic.reorient(v) + pic.reorient([0,0,1], v) pic.pos(v - center) objs += [pic, Arrow(v, v+v)] show(objs, Point(), axes=1).close() @@ -470,6 +502,10 @@ class NonLinearTransform: def __init__(self, T=None): + self.name = "NonLinearTransform" + self.filename = "" + self.comment = "" + if T is None: T = vtk.vtkThinPlateSplineTransform() @@ -483,12 +519,40 @@ def __init__(self, T=None): S.DeepCopy(T.T) T = S + elif isinstance(T, str): + import json + filename = str(T) + self.filename = filename + with open(filename, "r") as read_file: + D = json.load(read_file) + self.name = D["name"] + self.comment = D["comment"] + source = D["source_points"] + target = D["target_points"] + mode = D["mode"] + sigma = D["sigma"] + + T = vtk.vtkThinPlateSplineTransform() + vptss = vtk.vtkPoints() + for p in source: + vptss.InsertNextPoint(p[0], p[1], p[2]) + T.SetSourceLandmarks(vptss) + vptst = vtk.vtkPoints() + for p in target: + vptst.InsertNextPoint(p[0], p[1], p[2]) + T.SetTargetLandmarks(vptst) + T.SetSigma(sigma) + # mode + if mode == "2d": + T.SetBasisToR2LogR() + elif mode == "3d": + T.SetBasisToR() + else: + print(f'In {filename} mode can be either "2d" or "3d"') + self.T = T self.inverse_flag = False - self.name = "NonLinearTransform" - self.comment = "" - @property def source_points(self): @@ -534,7 +598,7 @@ def target_points(self, pts): return self @property - def sigma(self): + def sigma(self) -> float: """Set sigma.""" return self.T.GetSigma() @@ -544,19 +608,42 @@ def sigma(self, s): self.T.SetSigma(s) @property + def mode(self) -> str: + """Get mode.""" + m = self.T.GetBasis() + if m == 0: + return "2d" + elif m == 1: + return "3d" + + @mode.setter def mode(self, m): + """Set mode.""" if m=='3d': self.T.SetBasisToR() elif m=='2d': self.T.SetBasisToR2LogR() else: - vedo.logger.error('mode can be either "2d" or "3d"') - return self + print('In NonLinearTransform mode can be either "2d" or "3d"') def clone(self): """Clone transformation to make an exact copy.""" return NonLinearTransform(self.T) + def write(self, filename): + """Save transformation to ASCII file.""" + import json + dictionary = { + "name": self.name, + "comment": self.comment, + "mode": self.mode, + "sigma": self.sigma, + "source_points": self.source_points.astype(float).tolist(), + "target_points": self.target_points.astype(float).tolist(), + } + with open(filename, "w") as outfile: + json.dump(dictionary, outfile, sort_keys=True, indent=2) + def invert(self): """Invert transformation.""" self.T.Inverse() From a0f3236c86f437fc32251621510ce1c2540000ce Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 20 Oct 2023 22:29:40 +0200 Subject: [PATCH 124/251] fix tests for reorient() --- tests/common/test_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/common/test_core.py b/tests/common/test_core.py index f7ee225c..4b0e79a5 100644 --- a/tests/common/test_core.py +++ b/tests/common/test_core.py @@ -99,7 +99,7 @@ ###################################### orientation -cr = cone.pos(0,0,0).clone().reorient((1, 1, 0)) +cr = cone.pos(0,0,0).clone().reorient([0,0,1], (1, 1, 0)) print('orientation',np.max(cr.vertices[:,2]) ,'<', 1.01) assert np.max(cr.vertices[:,2]) < 1.01 From a6b659c3e9df0b8beccc01fc3635b8c122145bfe Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 21 Oct 2023 18:59:15 +0200 Subject: [PATCH 125/251] fix interactor initialized, spline_tool callback --- docs/changes.md | 18 +-- examples/advanced/timer_callback0.py | 1 + examples/advanced/timer_callback1.py | 5 +- examples/advanced/timer_callback3.py | 1 + examples/basic/align2.py | 1 - examples/basic/closewindow.py | 4 +- examples/basic/keypress.py | 2 +- examples/basic/mesh_merge_vs_assembly.py | 36 ------ examples/basic/mousehighlight.py | 2 +- examples/basic/mousehover0.py | 2 +- examples/basic/spline_tool.py | 11 ++ examples/other/flag_labels1.py | 5 +- examples/volumetric/volume_operations.py | 4 +- tests/issues/issue_953.py | 58 ++++++++++ vedo/addons.py | 20 +++- vedo/applications.py | 22 ++-- vedo/cli.py | 3 - vedo/plotter.py | 138 +++++++++++++---------- vedo/pointcloud.py | 8 ++ vedo/pyplot.py | 5 +- vedo/settings.py | 7 -- vedo/shapes.py | 13 +-- vedo/utils.py | 16 ++- vedo/vtkclasses.py | 3 +- 24 files changed, 225 insertions(+), 160 deletions(-) delete mode 100644 examples/basic/mesh_merge_vs_assembly.py create mode 100644 tests/issues/issue_953.py diff --git a/docs/changes.md b/docs/changes.md index 3e98131c..5f71ae75 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -12,6 +12,10 @@ - add background radial gradients - add `utils.line_line_distance()` - add `utils.segment_segment_distance()` +- addressed bug on windows OS in timers callbacks thanks to @jonaslindemann +- add `plotter.initialize_interactor()` +- add object hinting (flag_labels1.py) by hovering mouse + ### Breaking changes @@ -40,12 +44,14 @@ examples/basic/buttons.py examples/basic/input_box.py examples/basic/sliders2.py +examples/basic/spline_tool.py examples/basic/interaction_modes2.py examples/advanced/timer_callback1.py examples/advanced/timer_callback2.py examples/advanced/warp4a.py examples/advanced/warp4b.py examples/volumetric/slicer1.py +examples/other/flag_labels1.py ``` @@ -55,18 +61,6 @@ tests/issues/discussion_751.py tests/issues/discussion_800.py tests/issues/issue_905.py -examples/pyplot/goniometer.py - -closewindow.py - -brownian2d.py -gyro -particle_simulator.py -slice_plane1.py -volume_operations.py - -fit_polynomial1.py -nearest.py ``` diff --git a/examples/advanced/timer_callback0.py b/examples/advanced/timer_callback0.py index c626d049..cdf9c424 100644 --- a/examples/advanced/timer_callback0.py +++ b/examples/advanced/timer_callback0.py @@ -11,6 +11,7 @@ def loop_func(event): txt = Text2D(bg='yellow', font="Calco") plt = Plotter(axes=1) +# plt.initialize_interactor() # on windows this is needed plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(msh, txt) diff --git a/examples/advanced/timer_callback1.py b/examples/advanced/timer_callback1.py index 5f23f57c..c6f3380a 100644 --- a/examples/advanced/timer_callback1.py +++ b/examples/advanced/timer_callback1.py @@ -24,13 +24,16 @@ def handle_timer(event): xtitle="time window [s]", ytitle="intensity [a.u.]", ) fig.shift(-x[0]) # put the whole plot object back at (0,0) - # pop (remove) the old plot and add the new one + # Pop (remove) the old plot and add the new one plotter.pop().add(fig).render() timer_id = -1 t0 = time.time() + plotter= Plotter(size=(1200,600)) +# plt.initialize_interactor() # on windows this is needed + button = plotter.add_button(bfunc, states=[" Play ","Pause"], size=40) evntid = plotter.add_callback("timer", handle_timer, enable_picking=False) diff --git a/examples/advanced/timer_callback3.py b/examples/advanced/timer_callback3.py index 40ec698d..b36b5559 100644 --- a/examples/advanced/timer_callback3.py +++ b/examples/advanced/timer_callback3.py @@ -31,6 +31,7 @@ def func2(event): # Create a plotter object with axes plt = Plotter(axes=1) +# plt.initialize_interactor() # on windows this is needed # Add the two callback functions to the plotter's timer events id1 = plt.add_callback("timer", func1) diff --git a/examples/basic/align2.py b/examples/basic/align2.py index 42fc9aa8..0b20235f 100644 --- a/examples/basic/align2.py +++ b/examples/basic/align2.py @@ -18,7 +18,6 @@ # Find best alignment between the 2 sets of Points, # e.i. find how to move vpts1 to best match vpts2 aligned_pts1 = vpts1.clone().align_to(vpts2, invert=False) -print(aligned_pts1.transform) txt = aligned_pts1.transform.__str__() # Create arrows to visualize how the points move during alignment diff --git a/examples/basic/closewindow.py b/examples/basic/closewindow.py index 55e74ff4..3e2f7200 100644 --- a/examples/basic/closewindow.py +++ b/examples/basic/closewindow.py @@ -18,10 +18,10 @@ ask('window is now unresponsive (press Enter here)', c='tomato', invert=1) plt1.close_window() + # window should now close, the Plotter instance becomes unusable # but mesh objects still exist in it: - -printc("First Plotter:", plt1.objects, '\nPress q again') +printc("Objects in first Plotter:", len(plt1.objects), '\nPress q again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. ################################################################## diff --git a/examples/basic/keypress.py b/examples/basic/keypress.py index a8ada47d..1c2fbb08 100644 --- a/examples/basic/keypress.py +++ b/examples/basic/keypress.py @@ -7,7 +7,7 @@ ############################################################# def myfnc(evt): - mesh = evt.actor + mesh = evt.object # printc('dump event info', evt) if not mesh or evt.keypress != "c": printc("click mesh and press c", c="r") diff --git a/examples/basic/mesh_merge_vs_assembly.py b/examples/basic/mesh_merge_vs_assembly.py deleted file mode 100644 index 13504594..00000000 --- a/examples/basic/mesh_merge_vs_assembly.py +++ /dev/null @@ -1,36 +0,0 @@ -''' -Mesh objects can be combined with -(1) `mesh.merge` - creates a new mesh object; this new mesh inherits properties (color, etc.) of the first mesh. -(2) `assembly.Assembly` - groups meshes (or other objects); preserves properties -(3) `+` - equivalent to `Assembly` -''' -# credits: https://github.com/icemtel -import vedo - -# Define vertices and faces -verts = [(0, 0, 0), (10, 0, 0), (0, 10, 0), (0, 0, 10)] -faces = [(0, 1, 2), (2, 1, 3), (1, 0, 3), (0, 2, 3)] -# Create a tetrahedron and a copy -mesh1 = vedo.Mesh([verts, faces], c='red') -mesh2 = mesh1.clone().pos(15,15,0).c('blue') # Create a copy, position it; change color - -# Merge: creates a new mesh, fusion of the 2 inputs. Color of the second mesh is lost. -mesh_all = vedo.merge(mesh1, mesh2) -print('1. Type:', type(mesh_all)) -plotter = vedo.show("mesh.merge(mesh1, mesh2) creates a single new Mesh object", - mesh_all, viewup='z', axes=1) # -> all red -plotter.close() - -# Assembly: groups meshes. Objects keep their individuality (can be later unpacked). -mesh_all = vedo.Assembly(mesh1, mesh2) -print('2. Type:', type(mesh_all)) -plotter = vedo.show("Assembly(mesh1, mesh2) groups meshes preserving their properties", - mesh_all, viewup='z', axes=1) # -> red and blue -plotter.close() - -# Equivalently, "+" also creates an Assembly -mesh_all = mesh1 + mesh2 -print('3. Type:', type(mesh_all)) -plotter = vedo.show("mesh1+mesh2 operator is equivalent to Assembly()", - mesh_all, viewup='z', axes=1) # -> red and blue -plotter.close() diff --git a/examples/basic/mousehighlight.py b/examples/basic/mousehighlight.py index 06f7df91..1245745a 100644 --- a/examples/basic/mousehighlight.py +++ b/examples/basic/mousehighlight.py @@ -14,7 +14,7 @@ def func(evt): return sil = evt.object.silhouette().linewidth(6).c('red5') sil.name = "silu" # give it a name so we can remove the old one - msg.text("You clicked: "+evt.actor.name) + msg.text("You clicked: " + evt.object.name) plt.remove('silu').add(sil) msg = Text2D("", pos="bottom-center", c='k', bg='r9', alpha=0.8) diff --git a/examples/basic/mousehover0.py b/examples/basic/mousehover0.py index f9e3801b..06f5e817 100644 --- a/examples/basic/mousehover0.py +++ b/examples/basic/mousehover0.py @@ -2,7 +2,7 @@ from vedo import ParametricShape, Plotter, precision def func(evt): ### called every time mouse moves! - if not evt.actor: + if not evt.object: return # mouse hits nothing, return. pt = evt.picked3d # 3d coords of point under mouse diff --git a/examples/basic/spline_tool.py b/examples/basic/spline_tool.py index 1112f577..1f64fb2b 100644 --- a/examples/basic/spline_tool.py +++ b/examples/basic/spline_tool.py @@ -13,6 +13,17 @@ # Add the spline tool using the same points and interact with it sptool = plt.add_spline_tool(pts, closed=True) + +# Add a callback to print the center of mass of the spline +sptool.add_observer( + "end of interaction", + lambda o, e: ( + print(f"Spline changed! CM = {sptool.spline().center_of_mass()}"), + print(f"\tNumber of points: {sptool.spline().vertices.size}"), + ) +) + +# Stay in the loop until the user presses q plt.interactive() # Switch off the tool diff --git a/examples/other/flag_labels1.py b/examples/other/flag_labels1.py index 27bb2293..9f4ab130 100644 --- a/examples/other/flag_labels1.py +++ b/examples/other/flag_labels1.py @@ -22,4 +22,7 @@ # create a custom entry to the legend lbox = LegendBox([b, c], font="Bongas", width=0.25, bg='blue6') -show(b, c, cap, flabs, vlabs, lbox, __doc__, axes=11, bg2="linen").close() +with Plotter(axes=11, bg2="linen") as plt: + plt.add(b, c, cap, flabs, vlabs, lbox, __doc__) + plt.add_hint(b, "My fave bunny") + plt.show() diff --git a/examples/volumetric/volume_operations.py b/examples/volumetric/volume_operations.py index 3323c653..6529be96 100644 --- a/examples/volumetric/volume_operations.py +++ b/examples/volumetric/volume_operations.py @@ -37,13 +37,13 @@ grd = vgrad.pointdata['ImageScalarsGradient'] pts = vol.vertices # coords as numpy array -arrs = Arrows(pts, pts + grd*0.1) +arrs = Arrows(pts, pts + grd*0.1, c="jet") pts_probes = [[0.2,0.5,0.5], [0.2,0.3,0.4]] vpts_probes = Points(pts_probes).probe(vgrad) vects = vpts_probes.pointdata['ImageScalarsGradient'] -arrs_pts_probe = Arrows(pts_probes, pts_probes + vects) +arrs_pts_probe = Arrows(pts_probes, pts_probes + vects, c='black') plt = Plotter(axes=1, N=2) plt.at(0).show("A masked Volume", vol) diff --git a/tests/issues/issue_953.py b/tests/issues/issue_953.py new file mode 100644 index 00000000..f4191578 --- /dev/null +++ b/tests/issues/issue_953.py @@ -0,0 +1,58 @@ +import numpy as np +from colorcet import bmy +from vedo import Points, Grid, show + + +def add_reconst(name, i=2): + p = Points(np_pts) + + bb = list(p.bounds()) + if bb[0] == bb[1]: + bb[1] += 1 + bb[0] -= 1 + if bb[2] == bb[3]: + bb[3] += 1 + bb[2] -= 1 + if bb[4] == bb[5]: + bb[5] += 1 + bb[4] -= 1 + + m = p.reconstruct_surface(bounds=bb) + m.cmap(bmy, m.vertices[:, i]).add_scalarbar() + names.append(name) + pts.append(p) + mesh.append(m) + + +names = [] +pts = [] +mesh = [] + +grid = Grid(res=(20, 20)) + +# grid with constant z=0 +np_pts = grid.clone().vertices +add_reconst("z=0") + +# grid with constant z=1 +np_pts = grid.clone().z(1).vertices +add_reconst("z=1") + +# grid with varying z +np_pts = grid.clone().vertices +np_pts[:, 2] = np.sin(np_pts[:, 0]) +add_reconst("sin z") + +# constant y +np_pts = grid.clone().rotate_x(90).vertices +add_reconst("y=0", 1) + +# constant x +np_pts = grid.clone().rotate_y(90).vertices +add_reconst("x=0", 0) + +# rotated plan +np_pts = grid.clone().rotate_x(90).rotate_y(40).rotate_z(60).vertices +add_reconst("tilted") + +show([t for t in zip(names, pts, mesh)], N=len(mesh), sharecam=False, axes=1) diff --git a/vedo/addons.py b/vedo/addons.py index baccb238..32ec40d5 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -493,7 +493,7 @@ def __init__(self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, o """ super().__init__() - self.representation = vtk.vtkOrientedGlyphContourRepresentation() + self.representation = self.GetRepresentation() self.representation.SetAlwaysOnTop(ontop) self.representation.GetLinesProperty().SetColor(get_color(lc)) @@ -506,6 +506,8 @@ def __init__(self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, o self.representation.GetActiveProperty().SetColor(get_color(ac)) self.representation.GetActiveProperty().SetLineWidth(lw + 1) + # self.representation.BuildRepresentation() # crashes + self.SetRepresentation(self.representation) if utils.is_sequence(points): @@ -515,6 +517,16 @@ def __init__(self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, o self.closed = closed + @property + def interactor(self): + """Return the current interactor.""" + return self.GetInteractor() + + @interactor.setter + def interactor(self, iren): + """Set the current interactor.""" + self.SetInteractor(iren) + def add(self, pt): """ Add one point at a specified position in space if 3D, @@ -525,6 +537,12 @@ def add(self, pt): else: self.representation.AddNodeAtWorldPosition(pt) return self + + def add_observer(self, event, func, priority=1): + """Add an observer to the widget.""" + event = utils.get_vtk_name_event(event) + cid = self.AddObserver(event, func, priority) + return cid def remove(self, i): """Remove specific node by its index""" diff --git a/vedo/applications.py b/vedo/applications.py index d52439d0..96faad7a 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -307,7 +307,8 @@ class Slicer3DTwinPlotter(Plotter): Example: ```python - from vedo import dataurl, Volume + from vedo import * + from vedo.applications import Slicer3DTwinPlotter vol1 = Volume(dataurl + "embryo.slc") vol2 = Volume(dataurl + "embryo.slc") @@ -471,9 +472,6 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): super().__init__(**kwargs) - self.interactor.RemoveAllObservers() - self.add_callback("on key press", self.on_key_press) - orig_volume = vol.clone(deep=False) self.volume = vol @@ -498,14 +496,12 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): self.lighting(window=levels[0], level=levels[1]) self.usage_txt = ( - "H :rightarrow toggle this banner off\n" - "Left click & drag :rightarrow modify luminosity and contrast\n" - "SHIFT+Left click :rightarrow slice image obliquely\n" - "SHIFT+Middle click :rightarrow slice image perpendicularly" - # "R :rightarrow Reset the Window/Color levels\n" - # "X :rightarrow Reset to sagittal view\n" - # "Y :rightarrow Reset to coronal view\n" - # "Z :rightarrow Reset to axial view" + "H :rightarrow Toggle this banner on/5off\n" + "Left click & drag :rightarrow Modify luminosity and contrast\n" + "SHIFT+Left click :rightarrow Slice image obliquely\n" + "SHIFT+Middle click :rightarrow Slice image perpendicularly\n" + "SHIFT+R :rightarrow Fly to closest cartesian view\n" + "SHIFT+U :rightarrow Toggle parallel projection" ) self.usage = Text2D( @@ -535,6 +531,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): ).clone2d(pos="bottom-left", scale=0.4) axes = kwargs.pop("axes", 7) + axe = None if axes == 7: axe = vedo.addons.RulerAxes( orig_volume, xtitle="x - ", ytitle="y - ", ztitle="z - " @@ -556,6 +553,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): self.user_mode("image") self.at(0).add(self.volume.actor, box, axe, self.usage, hist) self.at(1).add(orig_volume, volume_axes_inset) + self.at(0) # set focus here #################################################################### def on_key_press(self, evt): diff --git a/vedo/cli.py b/vedo/cli.py index 0310aa0e..d86f3c07 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ Command Line Interface module ----------------------------- @@ -808,7 +806,6 @@ def draw_scene(args): sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = applications.Slicer2DPlotter(vol) - # vedo.plotter_instance.window.SetWindowName(f"vedo - {args.files[0]}") vedo.plotter_instance.show().close() return diff --git a/vedo/plotter.py b/vedo/plotter.py index 2dc36dab..e100bd94 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -711,8 +711,8 @@ def __init__( ######################## if self.qt_widget is not None: - self.interactor = self.qt_widget.GetRenderWindow().GetInteractor() self.window = self.qt_widget.GetRenderWindow() # overwrite + self.interactor = self.qt_widget.GetRenderWindow().GetInteractor() ######################## return ################ ######################## @@ -751,14 +751,14 @@ def __init__( vsty = vtk.vtkInteractorStyleTrackballCamera() self.interactor.SetInteractorStyle(vsty) - if settings.enable_default_mouse_callbacks: - self.interactor.AddObserver("LeftButtonPressEvent", self._mouseleftclick) - if settings.enable_default_keyboard_callbacks: self.interactor.AddObserver("KeyPressEvent", self._keypress) + if settings.enable_default_mouse_callbacks: + self.interactor.AddObserver("LeftButtonPressEvent", self._mouseleftclick) ##################################################################### ..init ends here. + def __iadd__(self, objects): self.add(objects) return self @@ -775,7 +775,20 @@ def __exit__(self, *args, **kwargs): # context manager like in "with Plotter() as plt:" self.close() + + def initialize_interactor(self): + """Initialize the interactor if not already initialized.""" + if self.offscreen: + return self + if self.interactor: + if not self.interactor.GetInitialized(): + self.interactor.Initialize() + self.interactor.RemoveObservers("CharEvent") + return self + def process_events(self): + """Process all pending events.""" + self.initialize_interactor() if self.interactor: try: self.interactor.ProcessEvents() @@ -970,15 +983,14 @@ def render(self, resetcam=False): self.wx_widget.Render() return self + self.initialize_interactor() + if self.qt_widget: if resetcam: self.renderer.ResetCamera() self.qt_widget.Render() return self - if self.interactor: - if not self.interactor.GetInitialized(): - self.interactor.Initialize() if resetcam: self.renderer.ResetCamera() @@ -991,6 +1003,7 @@ def interactive(self): Start window interaction. Analogous to `show(..., interactive=True)`. """ + self.initialize_interactor() if self.interactor: self.interactor.Start() return self @@ -1366,6 +1379,9 @@ def record(self, filename=".vedo_recorded_events.log"): Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ + if not self.interactor: + vedo.logger.warning("Cannot record events, no interactor defined.") + return self erec = vtk.vtkInteractorEventRecorder() erec.SetInteractor(self.interactor) erec.SetFileName(filename) @@ -1393,6 +1409,10 @@ def play(self, events=".vedo_recorded_events.log", repeats=0): Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ + if not self.interactor: + vedo.logger.warning("Cannot play events, no interactor defined.") + return self + erec = vtk.vtkInteractorEventRecorder() erec.SetInteractor(self.interactor) @@ -1704,7 +1724,6 @@ def add_spline_tool( ac="g5", lw=2, closed=False, - interactive=False, ): """ Add a spline tool to the current plotter. @@ -1737,22 +1756,19 @@ def add_spline_tool( ![](https://vedo.embl.es/images/basic/spline_tool.png) """ sw = addons.SplineTool(points, pc, ps, lc, ac, lw, closed) - if self.interactor: - sw.SetInteractor(self.interactor) - else: - vedo.logger.error("in add_spline_tool(), No interactor found.") - raise RuntimeError - sw.On() + sw.interactor = self.interactor + sw.on() sw.Initialize(sw.points.dataset) - if sw.closed: - sw.representation.ClosedLoopOn() sw.representation.SetRenderer(self.renderer) + # closed: + sw.representation.SetClosedLoop(closed) + # if closed: + # sw.representation.ClosedOn() + # else: + # sw.representation.ClosedOff() sw.representation.BuildRepresentation() - sw.Render() - if interactive: - self.interactor.Start() - else: - self.interactor.Render() + self.widgets.append(sw) + # sw.Render() return sw def add_icon(self, icon, pos=3, size=0.08): @@ -1841,16 +1857,17 @@ def add_hint( obj, text="", c="k", - bc="yellow8", + bg="yellow9", font="Calco", size=18, justify=0, angle=0, - delay=100, + delay=500, ): """ Create a pop-up hint style message when hovering an object. - Use add_hint(False) to disable all hints. + Use `add_hint(obj, False)` to disable a hinting a specific object. + Use `add_hint(None)` to disable all hints. Arguments: obj : (Mesh, Points) @@ -1860,15 +1877,19 @@ def add_hint( delay : (int) milliseconds to wait before pop-up occurs """ - if self.offscreen: + if self.offscreen or not self.interactor: return self - if vedo.vtk_version[0] == 9 and "Linux" in vedo.sys_platform: # Linux vtk9 is bugged - vedo.logger.warning("add_hint() is not available on Linux platforms.") + if vedo.vtk_version[:2] == (9,0) and "Linux" in vedo.sys_platform: + # Linux vtk9.0 is bugged + vedo.logger.warning( + f"add_hint() is not available on Linux platforms for vtk{vedo.vtk_version}." + ) return self - if obj is False: + if obj is None: self.hint_widget.EnabledOff() + self.hint_widget.SetInteractor(None) self.hint_widget = None return self @@ -1887,7 +1908,7 @@ def add_hint( if not self.hint_widget: self.hint_widget = vtk.vtkBalloonWidget() - rep = vtk.vtkBalloonRepresentation() + rep = self.hint_widget.GetRepresentation() rep.SetBalloonLayoutToImageRight() trep = rep.GetTextProperty() @@ -1895,7 +1916,7 @@ def add_hint( trep.SetFontFile(utils.get_font_path(font)) trep.SetFontSize(size) trep.SetColor(vedo.get_color(c)) - trep.SetBackgroundColor(vedo.get_color(bc)) + trep.SetBackgroundColor(vedo.get_color(bg)) trep.SetShadow(False) trep.SetJustification(justify) trep.UseTightBoundingBoxOn() @@ -1908,31 +1929,28 @@ def add_hint( rep.SetBackgroundOpacity(0) self.hint_widget.SetRepresentation(rep) self.widgets.append(self.hint_widget) - if self.interactor.GetInitialized(): - self.hint_widget.EnabledOn() - else: - vedo.logger.warning("add_hint() must be called after show(). Skip.") - return self + self.hint_widget.EnabledOn() - bst = self.hint_widget.GetBalloonString(obj) + bst = self.hint_widget.GetBalloonString(obj.actor) if bst: - self.hint_widget.UpdateBalloonString(obj, text) + self.hint_widget.UpdateBalloonString(obj.actor, text) else: - self.hint_widget.AddBalloon(obj, text) + self.hint_widget.AddBalloon(obj.actor, text) return self def add_shadows(self): """Add shadows at the current renderer.""" - shadows = vtk.vtkShadowMapPass() - seq = vtk.vtkSequencePass() - passes = vtk.vtkRenderPassCollection() - passes.AddItem(shadows.GetShadowMapBakerPass()) - passes.AddItem(shadows) - seq.SetPasses(passes) - camerapass = vtk.vtkCameraPass() - camerapass.SetDelegatePass(seq) - self.renderer.SetPass(camerapass) + if self.renderer: + shadows = vtk.vtkShadowMapPass() + seq = vtk.vtkSequencePass() + passes = vtk.vtkRenderPassCollection() + passes.AddItem(shadows.GetShadowMapBakerPass()) + passes.AddItem(shadows) + seq.SetPasses(passes) + camerapass = vtk.vtkCameraPass() + camerapass.SetDelegatePass(seq) + self.renderer.SetPass(camerapass) return self def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): @@ -2225,7 +2243,6 @@ def _legfunc(evt): self.add_callback("MouseMove", _legfunc) return self - ##################################################################### def add_scale_indicator( self, pos=(0.7, 0.05), @@ -2263,6 +2280,11 @@ def add_scale_indicator( ``` ![](https://vedo.embl.es/images/feats/scale_indicator.png) """ + # Note that this cannot go in addons.py + # because it needs callbacks and window size + if not self.interactor: + return self + ppoints = vtk.vtkPoints() # Generate the polyline psqr = [[0.0, gap], [length / 10, gap]] dd = psqr[1][0] - psqr[0][0] @@ -2521,10 +2543,6 @@ def _func_wrap(iren, ename, timerid=None): event_name = utils.get_vtk_name_event(event_name) - # Not compatible with ProcessEvents() - if "MouseMove" in event_name or "Timer" in event_name: - settings.allow_interaction = False - cid = self.interactor.AddObserver(event_name, _func_wrap, priority) # print(f"Registering event: {event_name} with id={cid}") return cid @@ -2592,6 +2610,8 @@ def add_observer(self, event_name, func, priority=0): Add a callback function that will be called when an event occurs. Consider using `add_callback()` instead. """ + if not self.interactor: + return self event_name = utils.get_vtk_name_event(event_name) idd = self.interactor.AddObserver(event_name, func, priority) return idd @@ -3136,9 +3156,10 @@ def show( self.renderer.ResetCameraClippingRange() - if self.interactor and not self.interactor.GetInitialized(): - self.interactor.Initialize() - self.interactor.RemoveObservers("CharEvent") + # if self.interactor and not self.interactor.GetInitialized(): + # self.interactor.Initialize() + # self.interactor.RemoveObservers("CharEvent") + self.initialize_interactor() if settings.immediate_rendering: self.window.Render() ##################### <-------------- Render @@ -3213,6 +3234,7 @@ def add_inset(self, *objects, **options): """ if not self.interactor: return None + pos = options.pop("pos", 0) size = options.pop("size", 0.1) c = options.pop("c", "lb") @@ -4137,12 +4159,6 @@ def _keypress(self, iren, event): else: self.remove(self.cutter_widget) self.cutter_widget = None - else: - for ob in self.objects: - if isinstance(ob, vedo.Volume): - addons.add_cutter_tool(ob) - return - vedo.printc("Click object and press X to open the cutter box widget.", c=4) elif key == "E": diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3d02810a..a902b241 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2674,6 +2674,14 @@ def reconstruct_surface( z0 - (z1 - z0) * padding, z1 + (z1 - z0) * padding, ) + + bb = sdf.GetBounds() + if bb[0]==bb[1]: + vedo.logger.warning("reconstruct_surface(): zero x-range") + if bb[2]==bb[3]: + vedo.logger.warning("reconstruct_surface(): zero y-range") + if bb[4]==bb[5]: + vedo.logger.warning("reconstruct_surface(): zero z-range") pd = self.dataset diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 37baaada..39cf6daa 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -2631,7 +2631,7 @@ def fit( p1d = np.poly1d(coeffs) theor = p1d(xr) - fitl = shapes.Line(xr, theor, lw=lw, c=c).z(tol * 2) + fitl = shapes.Line(np.c_[xr, theor], lw=lw, c=c).z(tol * 2) fitl.coefficients = coeffs fitl.covariance_matrix = V residuals2_sum = np.sum(np.power(p1d(x) - y, 2)) / ndof @@ -2677,7 +2677,8 @@ def fit( error_lines = [] for i in [nstd, -nstd]: - el = shapes.Line(xr, theor + stds * i, lw=1, alpha=0.2, c="k").z(tol) + pp = np.c_[xr, theor + stds * i] + el = shapes.Line(pp, lw=1, alpha=0.2, c="k").z(tol) error_lines.append(el) el.name = "ErrorLine for sigma=" + str(i) diff --git a/vedo/settings.py b/vedo/settings.py index 48569791..17469ff8 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -28,9 +28,6 @@ class Settings: screenshot_transparent_background = False screeshot_large_image = False # Sometimes setting this to True gives better results - # [DISABLED] Allow to continuously interact with scene during interactive() execution - allow_interaction = True - # Enable tracking pipeline functionality: # allows to show a graph with the pipeline of action which let to a final object # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) @@ -143,7 +140,6 @@ class Settings: "remember_last_figure_format", "screenshot_transparent_background", "screeshot_large_image", - "allow_interaction", "hack_call_screen_size", "enable_default_mouse_callbacks", "enable_default_keyboard_callbacks", @@ -225,9 +221,6 @@ def __init__(self, level=0): self.screenshot_transparent_background = False self.screeshot_large_image = False - # [DISABLED] Allow to continuously interact with scene during interactor.Start() execution - self.allow_interaction = True - # BUG in vtk9.0 (if true close works but sometimes vtk crashes, if false doesnt crash but cannot close) # see plotter.py line 555 self.hack_call_screen_size = True diff --git a/vedo/shapes.py b/vedo/shapes.py index 79272946..8e2a72db 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -416,23 +416,16 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): if isinstance(p0, Points): p0 = p0.vertices - # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: - # if utils.is_sequence(p0) and len(p0) > 3: - # if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): - # # assume input is 2D xlist, ylist - # p0 = np.stack((p0, p1), axis=1) - # p1 = None - # p0 = utils.make3d(p0) - # detect if user is passing a list of points: if isinstance(p0, vtk.vtkPolyData): + poly = p0 top = np.array([0,0,1]) base = np.array([0,0,0]) elif utils.is_sequence(p0[0]): - p0 = utils.make3d(p0) + p0 = utils.make3d(p0) ppoints = vtk.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(np.asarray(p0), dtype=np.float32)) lines = vtk.vtkCellArray() @@ -2122,7 +2115,7 @@ def __init__( orients = end_pts - start_pts - color_by_vector_size = c in cmaps_names + color_by_vector_size = utils.is_sequence(c) or c in cmaps_names super().__init__( start_pts, diff --git a/vedo/utils.py b/vedo/utils.py index bcb7d7a3..1637e809 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -2711,17 +2711,25 @@ def get_vtk_name_event(name): words = [ "pick", "timer", "reset", "enter", "leave", "char", "error", "warning", "start", "end", "wheel", "clipping", - "range", "camera", "render", + "range", "camera", "render", "interaction", "modified", ] for w in words: if w in ln: event_name = event_name.replace(w, w.capitalize()) - - event_name = event_name.replace(" ", "") + + event_name = event_name.replace("REnd ", "Rend") + event_name = event_name.replace("the ", "") + event_name = event_name.replace(" of ", "").replace(" ", "") if not event_name.endswith("Event"): event_name += "Event" - # print("event_name", event_name) + if vtk.vtkCommand.GetEventIdFromString(event_name) == 0: + vedo.printc( + f"Error: '{name}' is not a valid event name.", c='r') + vedo.printc("Check the list of events here:", c='r') + vedo.printc("\thttps://vtk.org/doc/nightly/html/classvtkCommand.html", c='r') + # raise RuntimeError + return event_name diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index ab266bd6..63bfaa7b 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -43,6 +43,7 @@ vtkVariant, vtkVariantArray, vtkVersion, + vtkCommand, ) from vtkmodules.vtkCommonDataModel import ( @@ -450,7 +451,6 @@ ) from vtkmodules.vtkInteractionWidgets import ( - vtkBalloonRepresentation, vtkBalloonWidget, vtkBoxWidget, vtkContourWidget, @@ -458,7 +458,6 @@ vtkFocalPlanePointPlacer, vtkImplicitPlaneWidget, vtkOrientationMarkerWidget, - vtkOrientedGlyphContourRepresentation, vtkPolygonalSurfacePointPlacer, vtkSliderRepresentation2D, vtkSliderRepresentation3D, From 0ba06473ed7b8bbc7c1a005d901be7586ed46cf6 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 21 Oct 2023 21:03:30 +0200 Subject: [PATCH 126/251] pass all examples --- .circleci/config.yml | 42 ---- docs/changes.md | 10 +- examples/notebooks/distance2mesh.ipynb | 13 +- examples/notebooks/numpy2volume.ipynb | 21 +- examples/notebooks/pore_network.ipynb | 292 ------------------------- examples/pyplot/goniometer.py | 17 +- examples/pyplot/histo_1d_c.py | 5 +- examples/simulations/brownian2d.py | 5 +- examples/simulations/lorenz.py | 27 +-- examples/volumetric/read_volume1.py | 2 +- examples/volumetric/tet_cut2.py | 7 +- tests/dolfin/run_all.sh | 8 - tests/dolfin/test_ascalarbar.py | 33 --- tests/dolfin/test_pointLoad.py | 88 -------- tests/dolfin/test_poisson.py | 46 ---- vedo/plotter.py | 3 +- vedo/version.py | 2 +- 17 files changed, 56 insertions(+), 565 deletions(-) delete mode 100644 examples/notebooks/pore_network.ipynb delete mode 100755 tests/dolfin/run_all.sh delete mode 100644 tests/dolfin/test_ascalarbar.py delete mode 100644 tests/dolfin/test_pointLoad.py delete mode 100644 tests/dolfin/test_poisson.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 79bae0ed..fe1881e1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,47 +43,6 @@ jobs: destination: test-reports - ############################################################## - test-dolfinx: - docker: - - image: quay.io/fenicsproject/dolfinx:dev-env-real - environment: - MPLBACKEND: "agg" - DEBIAN_FRONTEND: "noninteractive" - - steps: - - checkout - - - run: - name: install vedo et al - command: | - pip3 install vtk - pip3 install . - - - run: - name: Get dolfinx cmake compile and install - command: | - pip3 install git+https://github.com/FEniCS/fiat.git --upgrade - pip3 install git+https://github.com/FEniCS/ufl.git --upgrade - pip3 install git+https://github.com/FEniCS/ffcx.git --upgrade - rm -rf /usr/local/include/dolfin /usr/local/include/dolfin.h - git clone https://github.com/FEniCS/dolfinx.git - cd dolfinx - mkdir -p build && cd build && cmake -G Ninja -DCMAKE_BUILD_TYPE=Developer ../cpp/ - ninja -j3 install - cd ../python - pip3 -v install . --user - - - run: - name: Run tests - command: | - cd - cd project/tests/dolfinx - source run_all.sh - - - store_artifacts: - path: test-reports - destination: test-reports ###################################################### workflows: @@ -91,7 +50,6 @@ workflows: build-stuff: jobs: - test-vedo - #- test-dolfinx diff --git a/docs/changes.md b/docs/changes.md index 5f71ae75..b1693cba 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -50,8 +50,10 @@ examples/advanced/timer_callback1.py examples/advanced/timer_callback2.py examples/advanced/warp4a.py examples/advanced/warp4b.py +examples/simulations/lorenz.py examples/volumetric/slicer1.py examples/other/flag_labels1.py + ``` @@ -61,11 +63,11 @@ tests/issues/discussion_751.py tests/issues/discussion_800.py tests/issues/issue_905.py - +slice_plane1.py ``` ### TODO -TextBase maybe useless can go into Actor2D -Mesh([points, faces, lines]) -reimplement actor rotations +- TextBase maybe useless can go into Actor2D +- Mesh([points, faces, lines]) +- reimplement actor rotations diff --git a/examples/notebooks/distance2mesh.ipynb b/examples/notebooks/distance2mesh.ipynb index 4aabaf58..170deef9 100644 --- a/examples/notebooks/distance2mesh.ipynb +++ b/examples/notebooks/distance2mesh.ipynb @@ -15,7 +15,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "de7b1fda636f4a5f9c73c3bbb8f0377f", + "model_id": "c4481d3517314c468fa1808b8ea1829b", "version_major": 2, "version_minor": 0 }, @@ -23,9 +23,8 @@ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, - "execution_count": 1, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -47,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -56,7 +55,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Sphere:   vedo.mesh.Mesh\n", @@ -71,10 +70,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } diff --git a/examples/notebooks/numpy2volume.ipynb b/examples/notebooks/numpy2volume.ipynb index 271e7ce4..d6bab0f4 100644 --- a/examples/notebooks/numpy2volume.ipynb +++ b/examples/notebooks/numpy2volume.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -14,12 +14,12 @@ }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 1, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -42,12 +42,12 @@ "lego = vol.legosurface(vmin=.3, vmax=.6)\n", "lego.cmap(\"hot_r\")\n", "\n", - "show(lego, axes=1)" + "show(lego, axes=1, zoom=1.1, viewup='z')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -72,10 +72,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -84,6 +84,13 @@ "vol" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/notebooks/pore_network.ipynb b/examples/notebooks/pore_network.ipynb deleted file mode 100644 index 2d7d9959..00000000 --- a/examples/notebooks/pore_network.ipynb +++ /dev/null @@ -1,292 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import vedo\n", - "from numpy import array\n", - "\n", - "pore_data = {'radius': array([1.19674905, 1.17642665, 1.48423733, 4.11235865, 5.27399875,\n", - " 1.6080488 , 5.04062365, 3.28250786, 0.48145194, 1.95844462,\n", - " 2.95412234, 6.34223284, 2.68521829, 1.22652792, 1.89028428,\n", - " 2.32453223, 2.37981034, 5.88536598, 4.78205451, 3.666239 ,\n", - " 5.94103498, 5.94537754, 3.51141173, 5.69892518, 2.37635673,\n", - " 1.56836145, 5.27402228, 2.67315768, 2.31724564, 2.92747411,\n", - " 1.17457039, 1.1796397 , 0.27594236, 0.58774932, 0.37354945,\n", - " 2.94445452, 0.43445867, 1.16996146, 1.12668883, 1.21957642]),\n", - " 'center': array([[30., 15., 3.],\n", - " [ 4., 47., 3.],\n", - " [37., 3., 5.],\n", - " [42., 44., 6.],\n", - " [16., 19., 8.],\n", - " [32., 32., 10.],\n", - " [13., 41., 10.],\n", - " [37., 24., 12.],\n", - " [29., 45., 15.],\n", - " [40., 50., 16.],\n", - " [22., 49., 19.],\n", - " [16., 30., 21.],\n", - " [49., 34., 24.],\n", - " [35., 34., 28.],\n", - " [27., 3., 29.],\n", - " [21., 4., 30.],\n", - " [24., 15., 32.],\n", - " [42., 39., 36.],\n", - " [11., 20., 37.],\n", - " [29., 31., 37.],\n", - " [27., 46., 38.],\n", - " [12., 7., 51.],\n", - " [46., 48., 52.],\n", - " [26., 46., 59.],\n", - " [38., 4., 62.],\n", - " [40., 49., 63.],\n", - " [ 7., 38., 64.],\n", - " [49., 4., 65.],\n", - " [48., 46., 65.],\n", - " [27., 24., 70.],\n", - " [50., 50., 70.],\n", - " [48., 50., 72.],\n", - " [12., 51., 72.],\n", - " [41., 36., 73.],\n", - " [43., 51., 73.],\n", - " [25., 4., 74.],\n", - " [34., 25., 74.],\n", - " [43., 25., 75.],\n", - " [50., 33., 75.],\n", - " [45., 38., 75.]]),\n", - " 'color': array([[ 0, 0, 0],\n", - " [ 1, 1, 1],\n", - " [ 2, 2, 2],\n", - " [ 3, 3, 3],\n", - " [ 4, 4, 4],\n", - " [ 5, 5, 5],\n", - " [ 6, 6, 6],\n", - " [ 7, 7, 7],\n", - " [ 8, 8, 8],\n", - " [ 9, 9, 9],\n", - " [10, 10, 10],\n", - " [11, 11, 11],\n", - " [12, 12, 12],\n", - " [13, 13, 13],\n", - " [14, 14, 14],\n", - " [15, 15, 15],\n", - " [16, 16, 16],\n", - " [17, 17, 17],\n", - " [18, 18, 18],\n", - " [19, 19, 19],\n", - " [20, 20, 20],\n", - " [21, 21, 21],\n", - " [22, 22, 22],\n", - " [23, 23, 23],\n", - " [24, 24, 24],\n", - " [25, 25, 25],\n", - " [26, 26, 26],\n", - " [27, 27, 27],\n", - " [28, 28, 28],\n", - " [29, 29, 29],\n", - " [30, 30, 30],\n", - " [31, 31, 31],\n", - " [32, 32, 32],\n", - " [33, 33, 33],\n", - " [34, 34, 34],\n", - " [35, 35, 35],\n", - " [36, 36, 36],\n", - " [37, 37, 37],\n", - " [38, 38, 38],\n", - " [39, 39, 39]]),\n", - " 'pore_pressure': [0.0,\n", - " 0.0,\n", - " 0.0,\n", - " 0.1,\n", - " 10.0,\n", - " 7.598155494738002,\n", - " 10.0,\n", - " 0.1,\n", - " 0.0,\n", - " 0.1,\n", - " 4.9866234871525,\n", - " 10.0,\n", - " 0.1,\n", - " 0.0,\n", - " 10.0,\n", - " 10.0,\n", - " 9.999999999999998,\n", - " 0.1,\n", - " 10.0,\n", - " 5.887868354558643,\n", - " 4.512645435262695,\n", - " 10.0,\n", - " 0.1,\n", - " 6.150712624490666,\n", - " 6.885571232556974,\n", - " 0.1,\n", - " 10.0,\n", - " 0.1,\n", - " 0.1,\n", - " 9.908732905890773,\n", - " 0.1,\n", - " 0.1,\n", - " 0.0,\n", - " 0.0,\n", - " 0.0,\n", - " 9.57065941647515,\n", - " 0.0,\n", - " 0.0,\n", - " 0.0,\n", - " 0.0]}\n", - "\n", - "throat_data = {'radius': array([2.90419237, 1.91412649, 4.95871637, 2.66664252, 3.84343485,\n", - " 2.91695308, 2.64362353, 2.90442779, 2.16462804, 1.59391792,\n", - " 2.89982681, 4.00869598, 2.20213635, 3.22351169, 2.33049898,\n", - " 4.0408531 , 3.26135521, 3.53445357, 3.87389098, 5.70235662,\n", - " 4.33497331, 3.67944754, 4.31956756, 1.54813143, 2.33478145,\n", - " 3.54625105, 3.2341318 , 3.56343412, 2.91256156, 4.51513931,\n", - " 3.03150832, 2.90332157, 3.13112118, 4.94121126, 3.87019909,\n", - " 2.97949269, 2.96877147, 2.17017842, 2.16641068, 4.14354076,\n", - " 4.05124284, 1.24314961, 2.60263205, 1.56828704, 2.91248637,\n", - " 1.21171778, 1.54088758, 0.58485084, 1.84036701, 0.40036291]),\n", - " 'throat_connection': array([[ 4, 6],\n", - " [ 3, 7],\n", - " [ 6, 11],\n", - " [ 6, 10],\n", - " [ 4, 11],\n", - " [ 4, 5],\n", - " [ 3, 9],\n", - " [ 4, 7],\n", - " [ 3, 12],\n", - " [ 5, 7],\n", - " [ 4, 14],\n", - " [ 7, 11],\n", - " [ 7, 12],\n", - " [ 7, 17],\n", - " [ 4, 17],\n", - " [10, 17],\n", - " [12, 17],\n", - " [ 4, 15],\n", - " [10, 20],\n", - " [17, 20],\n", - " [ 4, 18],\n", - " [11, 20],\n", - " [11, 19],\n", - " [14, 15],\n", - " [ 4, 16],\n", - " [11, 18],\n", - " [17, 19],\n", - " [15, 21],\n", - " [19, 20],\n", - " [18, 21],\n", - " [19, 21],\n", - " [20, 26],\n", - " [20, 22],\n", - " [20, 23],\n", - " [23, 26],\n", - " [21, 26],\n", - " [22, 23],\n", - " [22, 28],\n", - " [24, 27],\n", - " [21, 24],\n", - " [21, 35],\n", - " [25, 28],\n", - " [26, 29],\n", - " [24, 35],\n", - " [21, 29],\n", - " [28, 30],\n", - " [27, 35],\n", - " [30, 31],\n", - " [29, 35],\n", - " [38, 39]]),\n", - "}\n", - "\n", - "throat_coordinates = list()\n", - "throat_connectivity = throat_data['throat_connection']\n", - "for throat_connection in throat_connectivity:\n", - " pore_i = throat_connection[0]\n", - " pore_j = throat_connection[1]\n", - " pore_i_coordinate = pore_data['center'][pore_i]\n", - " pore_j_coordinate = pore_data['center'][pore_j]\n", - " throat_coordinates.append((pore_i_coordinate, pore_j_coordinate))\n", - "\n", - "pores_rendering_list = list()\n", - "for idx in range(len(pore_data['center'])):\n", - " pore_rendering = vedo.Sphere(\n", - " pos=pore_data['center'][idx],\n", - " r=pore_data['radius'][idx],\n", - " # c=pore_data['color'][idx] /50\n", - " c=vedo.color_map(pore_data['pore_pressure'][idx], name='jet', vmin=0, vmax=10)\n", - " )\n", - " pores_rendering_list.append(pore_rendering)\n", - "\n", - "# just create a temporary Points and extract a scalarbar\n", - "sb = vedo.Points(pore_data['center']\n", - " ).cmap('jet', pore_data['pore_pressure']\n", - " ).add_scalarbar(c='k', title='pore\\npressure').scalarbar\n", - "\n", - "cylinder_radius_scale_factor = 0.5\n", - "throats_rendering_list = list()\n", - "for idx, throat_coordinate in enumerate(throat_coordinates):\n", - " cylinder_radius = cylinder_radius_scale_factor * throat_data['radius'][idx]\n", - " throats_rendering = vedo.Cylinder(\n", - " pos=(throat_coordinate[0], throat_coordinate[1]),\n", - " r=cylinder_radius,\n", - " c=vedo.color_map(cylinder_radius, name='bone', vmin=0, vmax=5),\n", - " )\n", - " throats_rendering_list.append(throats_rendering)\n", - "\n", - "vedo.show(*pores_rendering_list, *throats_rendering_list, sb, axes=1, zoom=1.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/pyplot/goniometer.py b/examples/pyplot/goniometer.py index 639c60c3..5d59326b 100644 --- a/examples/pyplot/goniometer.py +++ b/examples/pyplot/goniometer.py @@ -1,5 +1,4 @@ -"""The 3D-ruler axis style, -a flag pole and a goniometer""" +"""The 3D-ruler axes and a goniometer""" from vedo import * settings.use_parallel_projection = True # avoid parallax effects @@ -7,23 +6,13 @@ mesh = Cone().rotate_y(90).pos([1, 2, 3]) mesh.c("steelblue") -# add a flagpole-style comment -a, v = precision(mesh.area(), 4), precision(mesh.volume(), 4) -fp = mesh.flagpole( - "S = πr^2 +πr√(h^2 +r^2 )\n = " + a - + "~μm^2 \nV = πr^2 ·h/3\n = " + v - + "~μm^3", - s=0.1, -) -fp.color("r3").scale(0.7).follow_camera() - # measure the angle formed by 3 points gon = Goniometer( [-0.5, 1, 2], [2.5, 2, 2], [-0.5, 3, 3], prefix=":alpha_c =~", lw=2, s=0.8 ) -# show distance of 2 points +# show distance of any 2 points rul = Ruler3D( (-0.5, 2, 1.9), (2.5, 2, 2.9), @@ -36,4 +25,4 @@ # make 3d rulers along the bounding box (similar to set axes=7) ax3 = RulerAxes(mesh, units="μm") -show(mesh, fp, gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() +show(mesh, gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() diff --git a/examples/pyplot/histo_1d_c.py b/examples/pyplot/histo_1d_c.py index c151b4e4..b946999c 100644 --- a/examples/pyplot/histo_1d_c.py +++ b/examples/pyplot/histo_1d_c.py @@ -1,5 +1,6 @@ """Uniform distribution weighted by sin^2 12x + :onehalf""" -from vedo import Line, settings, np +import numpy as np +from vedo import Line, settings from vedo.pyplot import histogram settings.default_font = "DejavuSansMono" @@ -22,7 +23,7 @@ x = np.linspace(0,1, 200) y = 200*np.sin(12*x)**2 + 100 -fig += Line(x, y, c='red5', lw=3).z(0.001) +fig += Line(np.c_[x, y], c='red5', lw=3).z(0.001) fig.add_label('my function', marker='-', mc='red5') fig.add_legend(pos=[0.7,1.33], alpha=0.2) diff --git a/examples/simulations/brownian2d.py b/examples/simulations/brownian2d.py index 869fb42e..5ad36725 100644 --- a/examples/simulations/brownian2d.py +++ b/examples/simulations/brownian2d.py @@ -10,7 +10,6 @@ screen_w = 800 screen_h = 800 - # Constants and time step Nsp = 200 # Number of small spheres Rb = screen_w / 32 # Radius of the big sphere @@ -63,7 +62,7 @@ Dij = (Radius + Radius[:, np.newaxis]) ** 2 # Matrix Dij=(Ri+Rj)**2 # The main loop -for i in progressbar(1000, c="r"): +for i in progressbar(500, c="r"): # Update all positions np.add(Pos, Vel * Dt, Pos) # Fast version of Pos = Pos + Vel*Dt @@ -124,7 +123,7 @@ # exit() if not int(i) % 20: # every 20 steps: rsp = [Pos[0][0], Pos[0][1], 0] - plt.add(Point(rsp, c="r", r=5, alpha=0.1)) # leave a point trace + plt.add(Point(rsp, c="r", r=4)) # leave a point trace spheres.name = "particles" plt.remove("particles").add(spheres).render() diff --git a/examples/simulations/lorenz.py b/examples/simulations/lorenz.py index 849a05e1..22361061 100644 --- a/examples/simulations/lorenz.py +++ b/examples/simulations/lorenz.py @@ -15,24 +15,25 @@ vel.append(mag(v)) # Plot the trajectory in 3D space -line = Line(pts).lw(2).cmap("winter", vel).add_scalarbar("speed") +line = Line(pts).lw(2) +line.cmap("winter", vel).add_scalarbar("speed") line.add_shadow("x", 3, alpha=0.2) line.add_shadow("z", -25, alpha=0.2) -pt = Point(pts[0], c="red4", r=12).add_trail(lw=4) -def loop_func(event): - global i - if i < len(pts): - pt.pos(pts[i]).update_trail() # move the point +pt = Point(pts[0], c="red4", r=12) +pt.add_trail(lw=4).add_shadow("x", 3, alpha=0.5) +pt.trail.add_shadow("x", 3, alpha=0.5) + +def loop_func(event): # move the point + if len(pts): + pos = pts.pop(0) + pt.pos(pos).update_trail().update_shadows() + pt.trail.update_shadows() plt.render() - i += 1 - else: - plt.timer_callback("stop", tid) # stop the timer -i = 0 plt = Plotter(axes=dict(xygrid=False)) -plt.show(line, pt, __doc__, viewup="z", interactive=False) plt.add_callback("timer", loop_func) -tid = plt.timer_callback("start") -plt.interactive().close() +plt.timer_callback("start") +plt.show(line, pt, __doc__, viewup="z") +plt.close() diff --git a/examples/volumetric/read_volume1.py b/examples/volumetric/read_volume1.py index 79ea1501..55f177ed 100644 --- a/examples/volumetric/read_volume1.py +++ b/examples/volumetric/read_volume1.py @@ -13,7 +13,7 @@ show([ (vol, Axes(vol, c='w'), f"Original Volume\ncolor map: {cmap}"), - (fig, "Voxel scalar histogram\nand opacity transfer function") + (fig.clone2d("center"), "Voxel scalar histogram\nand opacity transfer function") ], N=2, sharecam=False, bg=(82,87,110), zoom=1.1, ).close() diff --git a/examples/volumetric/tet_cut2.py b/examples/volumetric/tet_cut2.py index dfc51756..3483b79b 100644 --- a/examples/volumetric/tet_cut2.py +++ b/examples/volumetric/tet_cut2.py @@ -12,14 +12,15 @@ tetm1 = tetm.clone().cut_with_mesh(sphere, invert=True) # Make it a polygonal Mesh for visualization -msh1 = tetm1.tomesh().linewidth(0.1).color('lb') +msh1 = tetm1.tomesh().linewidth(0.1).cmap('Blues') # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): -tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) +tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True).cmap("jet") + # Cut tetm, but the output will keep only the tets on the boundary: tetm3 = tetm.clone().cut_with_mesh(sphere, only_boundary=True) -tetm3.add_scalarbar3d(c='k') +tetm3.cmap("jet").add_scalarbar3d(c='k') show([ (msh1, sphere, __doc__), diff --git a/tests/dolfin/run_all.sh b/tests/dolfin/run_all.sh deleted file mode 100755 index de9535a9..00000000 --- a/tests/dolfin/run_all.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# source run_all.sh -# -for f in test_*.py -do - echo "Processing $f script.." - python3 "$f" -done diff --git a/tests/dolfin/test_ascalarbar.py b/tests/dolfin/test_ascalarbar.py deleted file mode 100644 index bb01c77c..00000000 --- a/tests/dolfin/test_ascalarbar.py +++ /dev/null @@ -1,33 +0,0 @@ -import numpy as np -from dolfin import * -from dolfin import __version__ -from vedo.dolfin import plot - - -print('Test ascalarbar, dolfin version', __version__) - -if hasattr(MPI, 'comm_world'): - mesh = UnitSquareMesh(MPI.comm_world, nx=16, ny=16) -else: - mesh = UnitSquareMesh(16,16) - -V = FunctionSpace(mesh, 'Lagrange', 1) -f = Expression('10*(x[0]+x[1]-1)', degree=1) -u = interpolate(f, V) - -actors = plot(u, mode='color', cmap='viridis', vmin=-3, vmax=3, style=1, - returnActorsNoShow=True) - -actor = actors[0] - -solution = actor.pointdata[0] - -print('ArrayNames', actor.pointdata.keys()) -print('min', 'mean', 'max:') -print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) - -assert len(solution) == 289 -assert np.isclose(np.min(solution) , -10., atol=1e-05) -assert np.isclose(np.max(solution) , 10., atol=1e-05) - - diff --git a/tests/dolfin/test_pointLoad.py b/tests/dolfin/test_pointLoad.py deleted file mode 100644 index b92dd3c9..00000000 --- a/tests/dolfin/test_pointLoad.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Apply a vector-valued point load -to a corner of a linear-elastic cube. -""" -# Credit https://fenicsproject.discourse.group/t/ -#applying-pointsource-at-two-different-vectors/1459/2 -from dolfin import * -from vedo.dolfin import plot -import numpy as np - - -print('Test pointLoad') - -BULK_MOD = 1.0 -SHEAR_MOD = 1.0 - -mesh = UnitCubeMesh(10, 10, 10) -VE = VectorElement("Lagrange", mesh.ufl_cell(), 1) -V = FunctionSpace(mesh, VE) - -# Constrain normal displacement on two sides: -def boundary1(x, on_boundary): - return on_boundary and near(x[1], 0.0) -bc1 = DirichletBC(V.sub(1), Constant(0.0), boundary1) - -def boundary2(x, on_boundary): - return on_boundary and near(x[0], 0.0) -bc2 = DirichletBC(V.sub(0), Constant(0.0), boundary2) - -# Solve linear elasticity with point load at upper-right corner: -u = TrialFunction(V) -v = TestFunction(V) - -eps = 0.5 * (grad(u) + grad(u).T) -I = Identity(3) -sigma = BULK_MOD*tr(eps)*I + 2*SHEAR_MOD*(eps-tr(eps)*I/3) - -a = inner(sigma, grad(v)) * dx -L = inner(Constant((0,0,0)), v) * dx - -# Assemble: -A = assemble(a) -B = assemble(L) - -# Apply point sources: -ptSrcLocation = Point(1-DOLFIN_EPS, 1-DOLFIN_EPS) - -# Vectorial point load: -f = [0.01, 0.02] - -# Distinct point sources for x- and y-components -ptSrc_x = PointSource(V.sub(0), ptSrcLocation, f[0]) -ptSrc_y = PointSource(V.sub(1), ptSrcLocation, f[1]) -ptSrcs = [ptSrc_x, ptSrc_y] - -# Apply to RHS of linear system: -for ptSrc in ptSrcs: - ptSrc.apply(B) - -# Apply BCs: -for bc in [bc1, bc2]: - bc.apply(A) - bc.apply(B) - -# Solve: -u = Function(V) -solve(A, u.vector(), B) - -# Plot results: -acts = plot(u, mode="displacement", returnActorsNoShow=True) - -actor = acts[0] - -solution = actor.pointdata[0] - -print('ArrayNames', actor.pointdata.keys()) -print('min', 'mean', 'max:') -print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) -print('bounds[3]:') -print(actor.bounds()[3]) - -assert np.isclose(np.min(solution) , 0.0007107061021966307, atol=1e-03) -assert np.isclose(np.mean(solution), 0.012744666491495634, atol=1e-03) -assert np.isclose(np.max(solution) , 0.4923130138837739, atol=1e-03) -assert len(solution) == 1331 -assert np.isclose(actor.bounds()[3] , 1.425931564186973, atol=1e-03) - -print('Test pointLoad PASSED') diff --git a/tests/dolfin/test_poisson.py b/tests/dolfin/test_poisson.py deleted file mode 100644 index 734e6b06..00000000 --- a/tests/dolfin/test_poisson.py +++ /dev/null @@ -1,46 +0,0 @@ -from fenics import * -import numpy as np - -print('Test poisson' ) - -# Create mesh and define function space -mesh = UnitSquareMesh(8, 8) -V = FunctionSpace(mesh, "P", 1) - -# Define boundary condition -uD = Expression("1 + x[0]*x[0] + 2*x[1]*x[1]", degree=2) -bc = DirichletBC(V, uD, "on_boundary") - -# Define variational problem -w = TrialFunction(V) -v = TestFunction(V) -u = Function(V) -f = Constant(-6.0) - -# Compute solution -solve( dot(grad(w), grad(v))*dx == f*v*dx, u, bc) - -f = r'-\nabla^{2} u=f' - -########################################################### vedo -from vedo.dolfin import plot -from vedo import Latex - -l = Latex(f, s=0.2, c='w').shift(.6,.6,.1) - -acts = plot(u, l, cmap='jet', scalarbar='h', returnActorsNoShow=True) - -actor = acts[0] - -solution = actor.pointdata[0] - -print('ArrayNames', actor.pointdata.keys()) -print('min', 'mean', 'max:') -print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) - -assert np.isclose(np.min(solution) , 1., atol=1e-03) -assert np.isclose(np.mean(solution), 2.0625, atol=1e-03) -assert np.isclose(np.max(solution) , 4., atol=1e-03) -assert len(solution) == 81 - -print('Test poisson PASSED') diff --git a/vedo/plotter.py b/vedo/plotter.py index e100bd94..b9766dd4 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3424,7 +3424,8 @@ def close(self): @property def camera(self): """Return the current active camera.""" - return self.renderer.GetActiveCamera() + if self.renderer: + return self.renderer.GetActiveCamera() @camera.setter def camera(self, cam): diff --git a/vedo/version.py b/vedo/version.py index f1dc76fb..ebbe3128 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev16a' +_version = '2023.5.0+dev17a' From 066641c8f45917b8020addb9b656981f0dbdd834 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 22 Oct 2023 13:43:22 +0200 Subject: [PATCH 127/251] pick bounds in Axes --- docs/changes.md | 18 ++++++++---------- examples/advanced/warp4b.py | 12 ++++++------ vedo/addons.py | 16 +++++++++++++++- vedo/version.py | 2 +- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index b1693cba..9ffb45d8 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -2,8 +2,8 @@ - added `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - bug fix in `closest_point()` thanks to @goncalo-pt -- bug fix in tformat thanks to @JohnsWor https://github.com/marcomusy/vedo/pull/913 -- add texture to npz files thanks to @zhouzq-thu https://github.com/marcomusy/vedo/pull/918 +- bug fix in tformat thanks to @JohnsWor in #913 +- add texture to npz files thanks to @zhouzq-thu in #918 - Fix meshlab interface thanks to @JeffreyWardman in #924 - Update `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 @@ -20,14 +20,12 @@ ### Breaking changes - plt.actors must become plt.objects -- in `plotter.add_button(func)`, must use `func(event)` instead of `func()` -(thanks to @smoothumut for spotting the bug) -- change .points() to .vertices everywhere -- change .cell_centers() to .cell_centers everywhere -- change .faces() to .cells everywhere -- change .lines() to .lines everywhere -- change .edges() to .edges everywhere -- change .normals() to .vertex_normals and .cell_normals everywhere +- change .points() to .vertices +- change .cell_centers() to .cell_centers +- change .faces() to .cells +- change .lines() to .lines +- change .edges() to .edges +- change .normals() to .vertex_normals and .cell_normals - removed `Volume.probe_points()` - removed `Volume.probe_line()` - removed `Volume.probe_plane()` diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py index dde98a92..b17ec161 100644 --- a/examples/advanced/warp4b.py +++ b/examples/advanced/warp4b.py @@ -2,9 +2,9 @@ Pick a point on the source surface, then pick the corresponding point on the target surface. Pick at least 4 point pairs. -Press 'c' to clear the selection. -Press 'd' to delete the last selection. -Press 'q' to quit.""" +Press c to clear the selection. +Press d to delete the last selection. +Press q to quit.""" from vedo import Plotter, Mesh, Points, Text2D, Axes, settings, dataurl ################################################ @@ -37,14 +37,14 @@ def click(evt): sources.append(evt.picked3d) source.pickable(False) target.pickable(True) - msg0.text("->") + msg0.text("--->") msg1.text("now pick a target point") elif evt.actor == target: targets.append(evt.picked3d) source.pickable(True) target.pickable(False) msg0.text("now pick a source point") - msg1.text("<-") + msg1.text("<---") update() def keypress(evt): @@ -79,7 +79,7 @@ def keypress(evt): ref = target.clone().pickable(False).alpha(0.75) source = Mesh(dataurl + "limb_surface.vtk") -source.pickable(True).c("k5").alpha(0.8) +source.pickable(True).c("k5").alpha(1) clicked = [] sources = [] diff --git a/vedo/addons.py b/vedo/addons.py index 32ec40d5..135b17e5 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2993,6 +2993,20 @@ def Axes( else: c = get_color(c) + # Check if obj has bounds, if so use those + if obj is not None: + try: + bb = obj.bounds() + except AttributeError: + try: + bb = obj.GetBounds() + if xrange is None: xrange = (bb[0], bb[1]) + if yrange is None: yrange = (bb[2], bb[3]) + if zrange is None: zrange = (bb[4], bb[5]) + obj = None # dont need it anymore + except AttributeError: + pass + if use_global: vbb, drange, min_bns, max_bns = compute_visible_bounds() else: @@ -3005,7 +3019,7 @@ def Axes( zrange = (0, 0) if xrange is None or yrange is None: vedo.logger.error("in Axes() must specify axes ranges!") - raise RuntimeError() + return None ########################################### if xrange is not None: if xrange[1] < xrange[0]: diff --git a/vedo/version.py b/vedo/version.py index ebbe3128..70dcfc79 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev17a' +_version = '2023.5.0+dev18a' From ac62384919e44deca5ef98ef25b2962dfaf7600d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 22 Oct 2023 19:05:09 +0200 Subject: [PATCH 128/251] add tests/issues/test_fxy_bessel.py --- .gitignore | 6 +++++- tests/issues/test_fxy_bessel.py | 36 +++++++++++++++++++++++++++++++++ vedo/shapes.py | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/issues/test_fxy_bessel.py diff --git a/.gitignore b/.gitignore index b6372226..05aa3dc6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ .vedo_pipeline_graphviz* docs/examples_db.js -docs/index.html +docs/pdoc/html vedo.egg-info build @@ -27,3 +27,7 @@ store speed_tester.py data www + +dev_*.py +z?.py +v?.py \ No newline at end of file diff --git a/tests/issues/test_fxy_bessel.py b/tests/issues/test_fxy_bessel.py new file mode 100644 index 00000000..5b74922a --- /dev/null +++ b/tests/issues/test_fxy_bessel.py @@ -0,0 +1,36 @@ +import numpy as np +from scipy import special +from scipy.special import jn_zeros +from vedo import show +from vedo.pyplot import plot + +Nr = 2 +Nθ = 3 + +def f(x, y): + d2 = x ** 2 + y ** 2 + if d2 > 1: + return np.nan + else: + r = np.sqrt(d2) + θ = np.arctan2(y, x) + kr = jn_zeros(Nθ, 4)[Nr] + return special.jn(Nθ, kr * r) * np.cos(Nθ * θ) + + +p = plot( + f, xlim=[-1, 1], ylim=[-1, 1], zlim=[-1, 1], + show_nan=False, bins=(100, 100), +) + +# Unpack the plot objects to customize them +objs = p.unpack() +# objs[1].off() # turn off the horizontal levels +# objs[0].lw(1) # set line width +objs[0].lighting('off') # style of mesh lighting "glossy", "plastic".. +zvals = objs[0].vertices[:, 2] # get the z values +objs[0].cmap("RdBu", zvals, vmin=-0.0, vmax=0.4) # apply the color map +sc = objs[0].add_scalarbar3d(title="Bessel Function").scalarbar + +print("range:", zvals.min(), zvals.max()) +show(p, sc, viewup="z").close() diff --git a/vedo/shapes.py b/vedo/shapes.py index 8e2a72db..0db33ab1 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -92,7 +92,7 @@ (":nabla", "∇"), (":inf", "∞"), (":rightarrow", "→"), - (":lefttarrow", "←"), + (":leftarrow", "←"), (":partial", "∂"), (":sqrt", "√"), (":approx", "≈"), From 00d5e8262a76ff1437bbc1f66c25e4de8b7016d1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 22 Oct 2023 21:02:10 +0200 Subject: [PATCH 129/251] init Grid with object or bounding box --- vedo/shapes.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/vedo/shapes.py b/vedo/shapes.py index 0db33ab1..560de5c3 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -3010,6 +3010,8 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. Create an even or uneven 2D grid. Arguments: + pos : (list, Points, Mesh) + position in space, can also be passed as a bounding box [xmin,xmax, ymin,ymax]. s : (float, list) if a float is provided it is interpreted as the total size along x and y, if a list of coords is provided they are interpreted as the vertices of the grid along x and y. @@ -3038,9 +3040,24 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. """ resx, resy = res sx, sy = s + + try: + bb = pos.bounds() + pos = [(bb[0] + bb[1])/2, (bb[2] + bb[3])/2, (bb[4] + bb[5])/2] + sx = bb[1] - bb[0] + sy = bb[3] - bb[2] + except AttributeError: + pass if len(pos) == 2: pos = (pos[0], pos[1], 0) + elif len(pos) in [4,6]: # passing a bounding box + bb = pos + pos = [(bb[0] + bb[1])/2, (bb[2] + bb[3])/2, 0] + sx = bb[1] - bb[0] + sy = bb[3] - bb[2] + if len(pos)==6: + pos[2] = bb[4] - bb[5] if utils.is_sequence(sx) and utils.is_sequence(sy): verts = [] From 30257ae12e6045806631635da0950a98e9f287b9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 22 Oct 2023 22:33:00 +0200 Subject: [PATCH 130/251] add NonLinearTranformations.position warning --- vedo/plotter.py | 2 +- vedo/transformations.py | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index b9766dd4..7032f54c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3601,7 +3601,7 @@ def _keypress(self, iren, event): x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) - if key in ["q", "Ctrl+q", "Ctrl+w", "Escape"]: + if key in ["q", "Return", "Ctrl+q", "Ctrl+w", "Escape"]: iren.ExitCallback() return diff --git a/vedo/transformations.py b/vedo/transformations.py index d046c8f8..11eed0d7 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -554,23 +554,43 @@ def __init__(self, T=None): self.inverse_flag = False + @property + def position(self): + """ + Trying to get the position of a `NonLinearTransform` always returns [0,0,0]. + """ + return np.array([0.0, 0.0, 0.0], dtype=np.float32) + + @position.setter + def position(self, p): + """ + Trying to set position of a `NonLinearTransform` + has no effect and prints a warning. + + Use clone() method to create a copy of the object, + or reset it with 'object.transform = vedo.LinearTransform()' + """ + print("Warning: NonLinearTransform has no position.") + print(" Use clone() method to create a copy of the object,") + print(" or reset it with 'object.transform = vedo.LinearTransform()'") + @property def source_points(self): - """Get source points.""" + """Get the source points.""" pts = self.T.GetSourceLandmarks() vpts = [] for i in range(pts.GetNumberOfPoints()): vpts.append(pts.GetPoint(i)) - return np.array(vpts) + return np.array(vpts, dtype=np.float32) @property def target_points(self): - """Get target points.""" + """Get the target points.""" pts = self.T.GetTargetLandmarks() vpts = [] for i in range(pts.GetNumberOfPoints()): vpts.append(pts.GetPoint(i)) - return np.array(vpts) + return np.array(vpts, dtype=np.float32) @source_points.setter def source_points(self, pts): @@ -595,7 +615,6 @@ def target_points(self, pts): for p in pts: vpts.InsertNextPoint(p[0], p[1], p[2]) self.T.SetTargetLandmarks(vpts) - return self @property def sigma(self) -> float: From d085e88ccb6c5835d42b872e2ca1644ada2e03e5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 11:43:10 +0200 Subject: [PATCH 131/251] minor fixes --- docs/changes.md | 5 ++++- vedo/addons.py | 6 ++++-- vedo/version.py | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 9ffb45d8..8d431aa7 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -67,5 +67,8 @@ slice_plane1.py ### TODO - TextBase maybe useless can go into Actor2D - Mesh([points, faces, lines]) -- reimplement actor rotations +- reimplement actor rotations, + try disable .position .rotations to check +- revisit splines and other widgets + diff --git a/vedo/addons.py b/vedo/addons.py index 135b17e5..06b8f520 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2835,9 +2835,11 @@ def Axes( htitle_rotation=0, htitle_offset=(0, 0.01, 0), xtitle_position=0.95, ytitle_position=0.95, ztitle_position=0.95, - xtitle_offset=0.025, ytitle_offset=0.0275, ztitle_offset=0.02, # can be a list (dx,dy,dz) + # xtitle_offset can be a list (dx,dy,dz) + xtitle_offset=0.025, ytitle_offset=0.0275, ztitle_offset=0.02, xtitle_justify=None, ytitle_justify=None, ztitle_justify=None, - xtitle_rotation=0, ytitle_rotation=0, ztitle_rotation=0, # can be a list (rx,ry,rz) + # xtitle_rotation can be a list (rx,ry,rz) + xtitle_rotation=0, ytitle_rotation=0, ztitle_rotation=0, xtitle_box=False, ytitle_box=False, xtitle_size=0.025, ytitle_size=0.025, ztitle_size=0.025, xtitle_color=None, ytitle_color=None, ztitle_color=None, diff --git a/vedo/version.py b/vedo/version.py index 70dcfc79..4055c45f 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev18a' +_version = '2023.5.0+dev19a' From 2242ef7b75c131a8c5703a050abf4c8df3e1ebb7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 15:26:50 +0200 Subject: [PATCH 132/251] add tests/issues/test_fxy_bessel2.py --- ...test_fxy_bessel.py => test_fxy_bessel1.py} | 0 tests/issues/test_fxy_bessel2.py | 74 +++++++++++++++++++ 2 files changed, 74 insertions(+) rename tests/issues/{test_fxy_bessel.py => test_fxy_bessel1.py} (100%) create mode 100644 tests/issues/test_fxy_bessel2.py diff --git a/tests/issues/test_fxy_bessel.py b/tests/issues/test_fxy_bessel1.py similarity index 100% rename from tests/issues/test_fxy_bessel.py rename to tests/issues/test_fxy_bessel1.py diff --git a/tests/issues/test_fxy_bessel2.py b/tests/issues/test_fxy_bessel2.py new file mode 100644 index 00000000..66f408de --- /dev/null +++ b/tests/issues/test_fxy_bessel2.py @@ -0,0 +1,74 @@ +import numpy as np +import colorsys +from scipy import special +from scipy.special import jn_zeros +from vedo import ScalarBar3D, show, settings +from vedo.colors import color_map, build_lut +from vedo.pyplot import plot + +Nr = 2 +Nθ = 1 + +settings.default_font = "Theemim" +settings.interpolate_scalars_before_mapping = False + +def custom_lut(name, vmin=0, vmax=1, scale_l=0.05, N=256): + # Create a custom look-up-table + lut = [] + x = np.linspace(vmin, vmax, N) + for i in range(N): + r, g, b = color_map(i, name, 0, N-1) + h, l, s = colorsys.rgb_to_hls(r,g,b) + ###### do something here ###### + l = min(1, l * (1 + 5 * scale_l)) + rgb = colorsys.hls_to_rgb(h, l, s) + lut.append([x[i], rgb]) + return build_lut(lut) + +def f(x, y): + d2 = x**2 + y**2 + if d2 > 1: + return np.nan + else: + r = np.sqrt(d2) + θ = np.arctan2(y, x) + kr = jn_zeros(Nθ, 4)[Nr] + return special.jn(Nθ, kr * r) * np.exp(1j * Nθ * θ) + +p1 = plot( + lambda x,y: np.abs(f(x,y)), + xlim=[-1, 1], ylim=[-1, 1], + bins=(200, 200), + show_nan=False, + axes=dict( + xtitle="x", ytitle="y", ztitle="|f(x,y)|", + xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, + xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, + ztitle_offset=0.03, + ), +) + +# Unpack the plot objects to customize them +msh = p1.unpack(0).triangulate().lighting('glossy') +msh.cut_with_sphere((0,0,0), 0.99, invert=0) + +pts = msh.vertices # get the points +zvals = pts[:,2] # get the z values +θvals = [np.angle(f(*p[:2])) for p in pts] # get the phases + +lut = custom_lut("hsv", vmin=-np.pi/10, vmax=np.pi) + +msh.cmap(lut, θvals) # apply the color map +scbar = ScalarBar3D( + msh, title=f"Bessel Function Nr={Nr} Nθ={Nθ}", + label_rotation=90, c="black", +) + +# Set a specific camera position and orientation (press shift-C to see it) +cam = dict( + position=(3.88583, 0.155949, 3.88584), + focal_point=(0, 0, 0), + viewup=(-0.7, 0, 0.7), + distance=5.4, +) +show(p1, scbar, camera=cam).close() From 9e7314d7f822a08edf73b7965a6f6ef3b61aa5a8 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 17:41:27 +0200 Subject: [PATCH 133/251] fix actor to object --- tests/issues/issue_908.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/issues/issue_908.py b/tests/issues/issue_908.py index 1703443a..a2bbe161 100644 --- a/tests/issues/issue_908.py +++ b/tests/issues/issue_908.py @@ -3,7 +3,7 @@ # Define the callback function to change the color of the clicked cell to red def func(evt): - msh = evt.actor + msh = evt.object if not msh: return pt = evt.picked3d From 10cb5bd2aff1ef622531b4b8b68b330ebaf2f43e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 17:49:45 +0200 Subject: [PATCH 134/251] fix actor to object 2 --- examples/advanced/multi_viewer2.py | 12 ++++++------ examples/advanced/spline_draw.py | 4 ++-- examples/advanced/warp4a.py | 2 +- examples/advanced/warp4b.py | 4 ++-- examples/advanced/warp6.py | 2 +- examples/simulations/drag_chain.py | 2 +- examples/volumetric/slice_plane1.py | 8 ++++---- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/advanced/multi_viewer2.py b/examples/advanced/multi_viewer2.py index 6d95bd43..547eb743 100644 --- a/examples/advanced/multi_viewer2.py +++ b/examples/advanced/multi_viewer2.py @@ -4,11 +4,11 @@ ############################################################################## def on_left_click(evt): - if not evt.actor: return - shapename.text(f'This is called: {evt.actor.name}, on renderer nr.{evt.at}') - plt.at(1).remove(actsonshow).add(evt.actor).reset_camera() - actsonshow.clear() - actsonshow.append(evt.actor) + if not evt.object: return + shapename.text(f'This is called: {evt.object.name}, on renderer nr.{evt.at}') + plt.at(1).remove(objs).add(evt.object).reset_camera() + objs.clear() + objs.append(evt.object) ############################################################################## sy, sx, dx = 0.12, 0.12, 0.01 @@ -37,7 +37,7 @@ def on_left_click(evt): shapename = Text2D(pos='top-center', c='r', bg='y', font='Calco') # empty text vlogo = VedoLogo(distance=5) -actsonshow = [vlogo] +objs = [vlogo] title = "My Multi Viewer 1.0" instr = "Click on the left panel to select a shape\n" diff --git a/examples/advanced/spline_draw.py b/examples/advanced/spline_draw.py index 940d4be8..4e3184b9 100644 --- a/examples/advanced/spline_draw.py +++ b/examples/advanced/spline_draw.py @@ -21,7 +21,7 @@ # self.spline = None # def on_left_click(self, evt): -# if not evt.actor: +# if not evt.object: # return # p = evt.picked3d + [0, 0, 1] # self.cpoints.append(p) @@ -29,7 +29,7 @@ # printc("Added point:", precision(p[:2], 4), c="g") # def on_right_click(self, evt): -# if evt.actor and len(self.cpoints) > 0: +# if evt.object and len(self.cpoints) > 0: # self.cpoints.pop() # pop removes the last point # self.update() # printc("Deleted last point", c="r") diff --git a/examples/advanced/warp4a.py b/examples/advanced/warp4a.py index e519f1e6..6bdf670c 100644 --- a/examples/advanced/warp4a.py +++ b/examples/advanced/warp4a.py @@ -66,7 +66,7 @@ def draw(self, toggle=None): #################################### update scene self.plotter.add(points) def onleftclick(self, evt): ############################################ add points - msh = evt.actor + msh = evt.object if not msh or msh.name!="Grid": return pt = self.merged_meshes.closest_point(evt.picked3d) # get the closest pt on the line self.arrow_stops.append(pt) if self.toggle else self.arrow_starts.append(pt) diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py index b17ec161..50ce991c 100644 --- a/examples/advanced/warp4b.py +++ b/examples/advanced/warp4b.py @@ -33,13 +33,13 @@ def update(): plt.render() def click(evt): - if evt.actor == source: + if evt.object == source: sources.append(evt.picked3d) source.pickable(False) target.pickable(True) msg0.text("--->") msg1.text("now pick a target point") - elif evt.actor == target: + elif evt.object == target: targets.append(evt.picked3d) source.pickable(True) target.pickable(False) diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index 124a660d..e19e86c0 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -3,7 +3,7 @@ def on_keypress(event): - if event.actor and event.keypress == "c": + if event.object and event.keypress == "c": picked = event.picked3d idx = mesh.closest_point(picked, return_point_id=True) n = normals[idx] diff --git a/examples/simulations/drag_chain.py b/examples/simulations/drag_chain.py index 75f7562c..1f20f905 100644 --- a/examples/simulations/drag_chain.py +++ b/examples/simulations/drag_chain.py @@ -5,7 +5,7 @@ l = 3 # length of one segment def func(evt): - if not evt.actor: + if not evt.object: return coords = line.vertices coords[0] = evt.picked3d diff --git a/examples/volumetric/slice_plane1.py b/examples/volumetric/slice_plane1.py index fb281fc9..fb52afb0 100644 --- a/examples/volumetric/slice_plane1.py +++ b/examples/volumetric/slice_plane1.py @@ -3,12 +3,12 @@ from vedo import dataurl, precision, Sphere, Volume, Plotter def func(evt): - if not evt.actor: + if not evt.object: return - pid = evt.actor.closest_point(evt.picked3d, return_point_id=True) - txt = f"Probing:\n{precision(evt.actor.picked3d, 3)}\nvalue = {arr[pid]}" + pid = evt.object.closest_point(evt.picked3d, return_point_id=True) + txt = f"Probing:\n{precision(evt.object.picked3d, 3)}\nvalue = {arr[pid]}" - pts = evt.actor.vertices + pts = evt.object.vertices sph = Sphere(pts[pid], c='orange7').pickable(False) fp = sph.flagpole(txt, s=7, offset=(-150,15), font=2).follow_camera() # remove old and add the two new objects From 79d00a7347d57c14df8ef265c167b78923f48ed5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 20:02:26 +0200 Subject: [PATCH 135/251] add lut_color_at --- docs/changes.md | 1 + vedo/shapes.py | 12 ------------ vedo/visual.py | 27 +++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 8d431aa7..1bfbbfb0 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -15,6 +15,7 @@ - addressed bug on windows OS in timers callbacks thanks to @jonaslindemann - add `plotter.initialize_interactor()` - add object hinting (flag_labels1.py) by hovering mouse +- add `colors.lut_color_at(value)` the color of the lookup table at value. diff --git a/vedo/shapes.py b/vedo/shapes.py index 560de5c3..71c9e8de 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1520,18 +1520,6 @@ def StreamLines( ![](https://vedo.embl.es/images/volumetric/56964003-9145a500-6b5a-11e9-9d9e-9736d90e1900.png) """ - if len(opts): # Deprecations - printc(" Warning! In StreamLines() unrecognized keywords:", opts, c="y") - initial_step_size = opts.pop("initialStepSize", initial_step_size) - max_propagation = opts.pop("maxPropagation", max_propagation) - max_steps = opts.pop("maxSteps", max_steps) - step_length = opts.pop("stepLength", step_length) - extrapolate_to_box = opts.pop("extrapolateToBox", extrapolate_to_box) - surface_constrained = opts.pop("surfaceConstrained", surface_constrained) - compute_vorticity = opts.pop("computeVorticity", compute_vorticity) - scalar_range = opts.pop("scalarRange", scalar_range) - printc(" Please use 'snake_case' instead of 'camelCase' keywords", c="y") - if isinstance(domain, vedo.Points): if extrapolate_to_box: grid = _interpolate2vol(domain, **extrapolate_to_box) diff --git a/vedo/visual.py b/vedo/visual.py index 6bb505a2..2e078899 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -655,6 +655,18 @@ def alpha(self, opacity=None): self.actor.SetBackfaceProperty(self.properties_backface) return self + def lut_color_at(self, value): + """ + Return the color of the lookup table at value. + """ + lut = self.mapper.GetLookupTable() + if not lut: + return None + rgb = [0,0,0] + lut.GetColor(value, rgb) + alpha = lut.GetOpacity(value) + return np.array(rgb + [alpha]) + def opacity(self, alpha=None): """Set/get mesh's transparency. Same as `mesh.alpha()`.""" return self.alpha(alpha) @@ -1559,7 +1571,7 @@ def flagpole( point=None, offset=None, s=None, - font="", + font="Calco", rounded=True, c=None, alpha=1.0, @@ -1650,7 +1662,7 @@ def flagpole( objs.append(lab) if d and not sph: - sph = vedo.shapes.Circle(pt, r=s / 3, res=15) + sph = vedo.shapes.Circle(pt, r=s / 3, res=16) objs.append(sph) x0, x1, y0, y1, z0, z1 = lab.bounds() @@ -1691,6 +1703,17 @@ def flagpole( # print(pt) return mobjs + # mobjs = vedo.Assembly(objs)#.c(c).alpha(alpha) + # mobjs.name = "FlagPole" + # # mobjs.bc("tomato").pickable(False) + # # mobjs.properties.LightingOff() + # # mobjs.properties.SetLineWidth(lw) + # # mobjs.actor.UseBoundsOff() + # # mobjs.actor.SetPosition([0,0,0]) + # # mobjs.actor.SetOrigin(pt) + # # print(pt) + # return mobjs + def flagpost( self, txt=None, From f29485a743511cd0f91bb4de0c8fae3cb78e9d27 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 23 Oct 2023 22:39:03 +0200 Subject: [PATCH 136/251] add deprecated as2d() back --- docs/changes.md | 2 ++ vedo/core.py | 8 +++++++- vedo/pyplot.py | 7 +++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/changes.md b/docs/changes.md index 1bfbbfb0..d1f23882 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -71,5 +71,7 @@ slice_plane1.py - reimplement actor rotations, try disable .position .rotations to check - revisit splines and other widgets +- merge does something strange with flagpost +- analysis_plots.visualize_clones_as_timecourse_with_fit not working diff --git a/vedo/core.py b/vedo/core.py index 6d79edcb..7c9d1e5c 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1196,7 +1196,13 @@ def probe(self, source): return self def compute_cell_size(self): - """Add to this mesh a cell data array containing the areas of the polygonal faces""" + """ + Add to this object a cell data array + containing the area, volume and edge length + of the cells (when applicable to the object type). + + Array names are: `Area`, `Volume`, `Length`. + """ csf = vtk.vtkCellSizeFilter() csf.SetInputData(self.dataset) csf.SetComputeArea(1) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 39cf6daa..389c8d61 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -662,6 +662,13 @@ def add_legend( aleg.name = "Legend" return self + def as2d(self, **kwargs): + """ + Deprecated. Use `clone2d()` instead. + """ + vedo.printc("WARNING: as2d() is deprecated. Use clone2d() instead.", c="y") + return self.clone2d(**kwargs) + def clone2d(self, pos="bottom-left", scale=1, padding=0.05): """ Convert the Figure into a 2D static object (a 2D Assembly). From a85097fd0a0f0d558dd5811504c51a2cc7715833 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 10:35:27 +0200 Subject: [PATCH 137/251] add self.mapper.SetColorModeToDirectScalars to pointcolors --- vedo/version.py | 2 +- vedo/visual.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/vedo/version.py b/vedo/version.py index 4055c45f..818dc7ac 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev19a' +_version = '2023.5.0+dev20a' diff --git a/vedo/visual.py b/vedo/visual.py index 2e078899..d17fb3e3 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -873,6 +873,7 @@ def cellcolors(self, value): assert n == value.shape[0] self.celldata["CellsRGBA"] = value.astype(np.uint8) + self.mapper.SetColorModeToDirectScalars() self.celldata.select("CellsRGBA") @property @@ -924,6 +925,7 @@ def pointcolors(self, value): assert n == value.shape[0] self.pointdata["PointsRGBA"] = value.astype(np.uint8) + self.mapper.SetColorModeToDirectScalars() self.pointdata.select("PointsRGBA") ##################################################################################### From 357e23a9e4f69ebf4d4426d97e5adface51423d5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 12:18:42 +0200 Subject: [PATCH 138/251] new changes to core.array.select() and visual.cmap() --- docs/changes.md | 1 + examples/basic/cells_within_bounds.py | 8 +-- vedo/core.py | 76 +++++++++++++++++++-------- vedo/visual.py | 58 ++++++++++++-------- 4 files changed, 97 insertions(+), 46 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index d1f23882..bad7d42b 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -63,6 +63,7 @@ tests/issues/discussion_800.py tests/issues/issue_905.py slice_plane1.py +examples/basic/cells_within_bounds.py because of clone() ``` ### TODO diff --git a/examples/basic/cells_within_bounds.py b/examples/basic/cells_within_bounds.py index e7383250..1b1f7ff9 100644 --- a/examples/basic/cells_within_bounds.py +++ b/examples/basic/cells_within_bounds.py @@ -2,7 +2,7 @@ from vedo import * # Load a mesh of a shark and normalize it -mesh = Mesh(dataurl+'shark.ply').normalize() +mesh = Mesh(dataurl+'shark.ply').normalize().compute_normals() # Set the color of the mesh and the line width to 1 mesh.color('aqua').linewidth(1) @@ -14,7 +14,7 @@ ids = mesh.find_cells_in_bounds(zbounds=(z1,z2)) # Print the cell IDs in green to the console -printc('IDs of cells within bounds:\n', ids, c='g') +printc('IDs of cells within bounds:\n', sorted(ids), c='g') # Create two Plane objects at the specified z-positions p1 = Plane(normal=(0,0,1), s=[2,2]).z(z1).alpha(0.5) @@ -23,5 +23,7 @@ # Set the color of cells within the bounds to red mesh.cellcolors[ids] = [200,10,10, 255] #RGBA +labels = mesh.labels("cellid", scale=0.01) + # Show the mesh, the two planes, the docstring -show(mesh, p1, p2, __doc__, axes=1).close() +show(mesh, p1, p2, labels, __doc__, axes=1).close() diff --git a/vedo/core.py b/vedo/core.py index 7c9d1e5c..7b362a47 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -153,6 +153,21 @@ def keys(self): arrnames.append(name) return arrnames + def rename(self, oldname, newname): + """Rename an array""" + if self.association == 0: + varr = self.obj.dataset.GetPointData().GetArray(oldname) + elif self.association == 1: + varr = self.obj.dataset.GetCellData().GetArray(oldname) + elif self.association == 2: + varr = self.obj.dataset.GetFieldData().GetArray(oldname) + if varr: + varr.SetName(newname) + else: + vedo.logger.warning( + f"Cannot rename non existing array {oldname} to {newname}" + ) + def remove(self, key): """Remove a data array by name or number""" if self.association == 0: @@ -174,23 +189,17 @@ def clear(self): name = data.GetArray(i).GetName() data.RemoveArray(name) - def rename(self, oldname, newname): - """Rename an array""" - if self.association == 0: - varr = self.obj.dataset.GetPointData().GetArray(oldname) - elif self.association == 1: - varr = self.obj.dataset.GetCellData().GetArray(oldname) - elif self.association == 2: - varr = self.obj.dataset.GetFieldData().GetArray(oldname) - if varr: - varr.SetName(newname) - else: - vedo.logger.warning( - f"Cannot rename non existing array {oldname} to {newname}" - ) - def select(self, key): """Select one specific array by its name to make it the `active` one.""" + # Default (ColorModeToDefault): unsigned char scalars are treated as colors, + # and NOT mapped through the lookup table, while everything else is. + # ColorModeToDirectScalar extends ColorModeToDefault such that all integer + # types are treated as colors with values in the range 0-255 + # and floating types are treated as colors with values in the range 0.0-1.0. + # Setting ColorModeToMapScalars means that all scalar data will be mapped + # through the lookup table. + # (Note that for multi-component scalars, the particular component + # to use for mapping can be specified using the SelectColorArray() method.) if self.association == 0: data = self.obj.dataset.GetPointData() self.obj.mapper.SetScalarModeToUsePointData() @@ -205,28 +214,53 @@ def select(self, key): if not arr: return + # NEW nc = arr.GetNumberOfComponents() if nc == 1: data.SetActiveScalars(key) elif nc >= 2: - if "rgb" in key.lower(): + if "rgb" in key.lower() and nc != 2: data.SetActiveScalars(key) - # try: - # self.mapper.SetColorModeToDirectScalars() - # except AttributeError: - # pass + try: + # could be a volume mapper + self.obj.mapper.SetColorModeToDirectScalars() + except AttributeError: + pass else: data.SetActiveVectors(key) elif nc >= 4: data.SetActiveTensors(key) try: + # could be a volume mapper self.obj.mapper.SetArrayName(key) self.obj.mapper.ScalarVisibilityOn() - # .. could be a volume mapper except AttributeError: pass + # # OLD + # nc = arr.GetNumberOfComponents() + # if nc == 1: + # data.SetActiveScalars(key) + # elif nc >= 2: + # if "rgb" in key.lower(): + # data.SetActiveScalars(key) + # # try: + # # self.mapper.SetColorModeToDirectScalars() + # # except AttributeError: + # # pass + # else: + # data.SetActiveVectors(key) + # elif nc >= 4: + # data.SetActiveTensors(key) + + # try: + # # could be a volume mapper + # self.obj.mapper.SetArrayName(key) + # self.obj.mapper.ScalarVisibilityOn() + # except AttributeError: + # pass + def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: diff --git a/vedo/visual.py b/vedo/visual.py index d17fb3e3..a7d869d3 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -873,7 +873,7 @@ def cellcolors(self, value): assert n == value.shape[0] self.celldata["CellsRGBA"] = value.astype(np.uint8) - self.mapper.SetColorModeToDirectScalars() + # self.mapper.SetColorModeToDirectScalars() # done in select() self.celldata.select("CellsRGBA") @property @@ -891,6 +891,7 @@ def pointcolors(self): lut = self.mapper.GetLookupTable() vscalars = self.dataset.GetPointData().GetScalars() if vscalars is None or lut is None: + # create a constant array arr = np.zeros([self.npoints, 4], dtype=np.uint8) col = np.array(self.properties.GetColor()) col = np.round(col * 255).astype(np.uint8) @@ -925,7 +926,7 @@ def pointcolors(self, value): assert n == value.shape[0] self.pointdata["PointsRGBA"] = value.astype(np.uint8) - self.mapper.SetColorModeToDirectScalars() + # self.mapper.SetColorModeToDirectScalars() # done in select() self.pointdata.select("PointsRGBA") ##################################################################################### @@ -981,10 +982,10 @@ def cmap( if not self.dataset.GetCellData().GetScalars(): input_array = 0 # pick the first at hand - if on.startswith("point"): + if "point" in on.lower(): data = self.dataset.GetPointData() n = self.dataset.GetNumberOfPoints() - elif on.startswith("cell"): + elif "cell" in on.lower(): data = self.dataset.GetCellData() n = self.dataset.GetNumberOfCells() else: @@ -1072,7 +1073,8 @@ def cmap( lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() - else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap + else: + # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap lut = vtk.vtkLookupTable() if logscale: lut.SetScaleToLog10() @@ -1085,29 +1087,41 @@ def cmap( lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() - # arr.SetLookupTable(lut) # wrong! causes weird instabilities with LUT - # if data.GetScalars(): - # data.GetScalars().SetLookupTable(lut) - # data.GetScalars().Modified() - - data.SetActiveScalars(array_name) - # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars - # data.SetActiveAttribute(array_name, 0) # boh! - + # TEST NEW WAY self.mapper.SetLookupTable(lut) - self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars - self.mapper.ScalarVisibilityOn() + self.mapper.SetColorModeToMapScalars() self.mapper.SetScalarRange(lut.GetRange()) - - if on.startswith("point"): - self.mapper.SetScalarModeToUsePointData() + if "point" in on.lower(): + self.pointdata.select(array_name) else: - self.mapper.SetScalarModeToUseCellData() - if hasattr(self.mapper, "SetArrayName"): - self.mapper.SetArrayName(array_name) + self.celldata.select(array_name) return self + # # TEST this is the old way: + # # arr.SetLookupTable(lut) # wrong! causes weird instabilities with LUT + # # if data.GetScalars(): + # # data.GetScalars().SetLookupTable(lut) + # # data.GetScalars().Modified() + + # data.SetActiveScalars(array_name) + # # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars + # # data.SetActiveAttribute(array_name, 0) # boh! + + # self.mapper.SetLookupTable(lut) + # self.mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars + + # self.mapper.ScalarVisibilityOn() + # self.mapper.SetScalarRange(lut.GetRange()) + + # if on.startswith("point"): + # self.mapper.SetScalarModeToUsePointData() + # else: + # self.mapper.SetScalarModeToUseCellData() + # if hasattr(self.mapper, "SetArrayName"): + # self.mapper.SetArrayName(array_name) + # return self + def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): """ Add a trailing line to mesh. From a37d0f0d56ac6d01823dfab66a5a48b3704b78b3 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 12:23:08 +0200 Subject: [PATCH 139/251] remove plane.clone() as it breaks examples/basic/cells_within_bounds.py --- vedo/shapes.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/vedo/shapes.py b/vedo/shapes.py index 71c9e8de..8a4ee265 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -3125,13 +3125,14 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra self.name = "Plane" self.variance = 0 - def clone(self): - newplane = Plane() - newplane.dataset.DeepCopy(self.dataset) - newplane.copy_properties_from(self) - # newplane.transform = self.transform - newplane.variance = 0 - return newplane + # breaks examples/basic/cells_within_bounds.py + # def clone(self): + # newplane = Plane() + # newplane.dataset.DeepCopy(self.dataset) + # newplane.copy_properties_from(self) + # # newplane.transform = self.transform + # newplane.variance = 0 + # return newplane @property def normal(self): From d8d135379242307d1c8bbe783cfd29cf6dfe33dd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 17:06:41 +0200 Subject: [PATCH 140/251] move ActorTransforms in PictureVisual --- vedo/picture.py | 2 +- vedo/visual.py | 149 +++++++++++++++++++++++------------------------- 2 files changed, 71 insertions(+), 80 deletions(-) diff --git a/vedo/picture.py b/vedo/picture.py index 04442f2e..cd9a7494 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -240,7 +240,7 @@ def shape(self): ################################################# -class Picture(vedo.visual.PictureVisual, vedo.visual.ActorTransforms): +class Picture(vedo.visual.PictureVisual): """ Class used to represent 2D pictures in a 3D world. """ diff --git a/vedo/visual.py b/vedo/visual.py index a7d869d3..ae044b9a 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -26,7 +26,6 @@ "VolumeVisual", "MeshVisual", "PictureVisual", - "ActorTransforms", "BaseActor2D", ] @@ -2304,11 +2303,78 @@ def interpolation(self, itype): ######################################################################################## -class ActorTransforms: +class PictureVisual(CommonVisual): def __init__(self) -> None: - # print("init ActorTransforms") - pass + # print("init PictureVisual") + super().__init__() + + def memory_size(self): + """ + Return the size in bytes of the object in memory. + """ + return self.dataset.GetActualMemorySize() + + def scalar_range(self): + """ + Return the scalar range of the image. + """ + return self.dataset.GetScalarRange() + + def alpha(self, a=None): + """Set/get picture's transparency in the rendering scene.""" + if a is not None: + self.properties.SetOpacity(a) + return self + return self.properties.GetOpacity() + + def level(self, value=None): + """Get/Set the image color level (brightness) in the rendering scene.""" + if value is None: + return self.properties.GetColorLevel() + self.properties.SetColorLevel(value) + return self + + def window(self, value=None): + """Get/Set the image color window (contrast) in the rendering scene.""" + if value is None: + return self.properties.GetColorWindow() + self.properties.SetColorWindow(value) + return self + + def bounds(self): + """Get the bounding box.""" + return self.actor.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + + def diagonal_size(self): + """Get the length of the diagonal of mesh bounding box.""" + b = self.bounds() + return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) def pos(self, *p): """Set/get position of object.""" @@ -2392,81 +2458,6 @@ def scale(self, s=None, absolute=False): return self -######################################################################################## -class PictureVisual(ActorTransforms, CommonVisual): - - def __init__(self) -> None: - # print("init PictureVisual") - super().__init__() - - def memory_size(self): - """ - Return the size in bytes of the object in memory. - """ - return self.dataset.GetActualMemorySize() - - def scalar_range(self): - """ - Return the scalar range of the image. - """ - return self.dataset.GetScalarRange() - - def alpha(self, a=None): - """Set/get picture's transparency in the rendering scene.""" - if a is not None: - self.properties.SetOpacity(a) - return self - return self.properties.GetOpacity() - - def level(self, value=None): - """Get/Set the image color level (brightness) in the rendering scene.""" - if value is None: - return self.properties.GetColorLevel() - self.properties.SetColorLevel(value) - return self - - def window(self, value=None): - """Get/Set the image color window (contrast) in the rendering scene.""" - if value is None: - return self.properties.GetColorWindow() - self.properties.SetColorWindow(value) - return self - - def bounds(self): - """Get the bounding box.""" - return self.actor.GetBounds() - - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) - - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) - - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) - - def diagonal_size(self): - """Get the length of the diagonal of mesh bounding box.""" - b = self.bounds() - return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - - ######################################################################################## class BaseActor2D(vtk.vtkActor2D): """ From 56d692885941d9c32060b684ed3340e83a889b54 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 17:13:43 +0200 Subject: [PATCH 141/251] vedo.visual.BaseActor2D to vedo.visual.Actor2D --- vedo/mesh.py | 2 +- vedo/picture.py | 2 +- vedo/shapes.py | 2 +- vedo/visual.py | 14 ++++---------- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index 73ed1b2a..79196788 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1478,7 +1478,7 @@ def boundaries( ): """ Return the boundary lines of an input mesh. - Check also `vedo.base.BaseActor.mark_boundaries()` method. + Check also `vedo.core.CommonAlgorithms.mark_boundaries()` method. Arguments: boundary_edges : (bool) diff --git a/vedo/picture.py b/vedo/picture.py index cd9a7494..baec5040 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -140,7 +140,7 @@ def _set_justification(img, pos): ################################################# -class Picture2D(vedo.visual.BaseActor2D): +class Picture2D(vedo.visual.Actor2D): """ Embed an image as a static 2D image in the canvas. """ diff --git a/vedo/shapes.py b/vedo/shapes.py index 8a4ee265..5d7c271b 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4548,7 +4548,7 @@ def off(self): self.actor.SetVisibility(False) return self -class Text2D(TextBase, vedo.visual.BaseActor2D): +class Text2D(TextBase, vedo.visual.Actor2D): """ Create a 2D text object. """ diff --git a/vedo/visual.py b/vedo/visual.py index ae044b9a..9aa947fd 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -16,8 +16,6 @@ __doc__ = """ Base classes to manage visualization and apperance of objects and their properties" - - """ __all__ = [ @@ -26,7 +24,7 @@ "VolumeVisual", "MeshVisual", "PictureVisual", - "BaseActor2D", + "Actor2D", ] @@ -2459,12 +2457,8 @@ def scale(self, s=None, absolute=False): ######################################################################################## -class BaseActor2D(vtk.vtkActor2D): - """ - Base class. - - .. warning:: Do not use this class to instantiate objects. - """ +class Actor2D(vtk.vtkActor2D): + """Wrapping of `vtkActor2D`.""" def __init__(self): """Manage 2D objects.""" @@ -2492,7 +2486,7 @@ def pos(self, px=None, py=None): p = [px, py] else: p = px - assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" + assert len(p) == 2, "Error: len(pos) must be 2 for Actor2D" self.SetPosition(p) return self From e384f565f90e508ed4b42d12e0505201004bf422 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 17:51:16 +0200 Subject: [PATCH 142/251] fix plane.clone() and ScalarBar3D --- vedo/addons.py | 11 +++-------- vedo/shapes.py | 20 +++++++++++--------- vedo/visual.py | 4 ++-- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 06b8f520..ec4058e0 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -965,7 +965,7 @@ def ScalarBar3D( pos=None, size=(0, 0), title_font="", - title_xoffset=0, + title_xoffset=0.0, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, @@ -976,7 +976,7 @@ def ScalarBar3D( label_rotation=0, label_format="", italic=0, - c=None, + c='k', draw_box=True, above_text=None, below_text=None, @@ -1038,11 +1038,6 @@ def ScalarBar3D( lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() - elif isinstance(obj, vedo.UGrid): # TODO - return None - # lut = utils.ctf2lut(obj) # returns None - # vmin, vmax = lut.GetRange() - elif utils.is_sequence(obj): vmin, vmax = np.min(obj), np.max(obj) @@ -1159,7 +1154,7 @@ def ScalarBar3D( font=title_font, ) t.rotate_z(90 + title_rotation) - t.pos(sx * title_xoffset, title_yoffset, 0) + t.pos(sx * (title_xoffset-1.2), title_yoffset, 0) tacts.append(t) if pos is None: diff --git a/vedo/shapes.py b/vedo/shapes.py index 5d7c271b..35e8eec7 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -13,7 +13,7 @@ import vedo from vedo import settings from vedo.transformations import pol2cart, cart2spher, spher2cart -from vedo.colors import cmaps_names, get_color, printc, color_map +from vedo.colors import cmaps_names, get_color, printc from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh @@ -443,7 +443,9 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): poly.SetLines(lines) top = p0[-1] base = p0[0] - res = 2 + if res != 2: + printc(f"Warning: calling Line(res={res}), try remove []?", c='y') + res = 2 else: # or just 2 points to link @@ -3126,13 +3128,13 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra self.variance = 0 # breaks examples/basic/cells_within_bounds.py - # def clone(self): - # newplane = Plane() - # newplane.dataset.DeepCopy(self.dataset) - # newplane.copy_properties_from(self) - # # newplane.transform = self.transform - # newplane.variance = 0 - # return newplane + def clone(self): + newplane = Plane() + newplane.dataset.DeepCopy(self.dataset) + newplane.copy_properties_from(self) + newplane.transform = self.transform + newplane.variance = 0 + return newplane @property def normal(self): diff --git a/vedo/visual.py b/vedo/visual.py index 9aa947fd..fb7e3b26 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -251,7 +251,7 @@ def add_scalarbar3d( pos=None, size=(0, 0), title_font="", - title_xoffset=-1.2, + title_xoffset=0.0, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, @@ -2464,7 +2464,7 @@ def __init__(self): """Manage 2D objects.""" super().__init__() - self.mapper = None + self.mapper = self.GetMapper() self.properties = self.GetProperty() self.filename = "" From 06ccaf33c678386dd19c2e917eafba03e9447f0f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 18:52:26 +0200 Subject: [PATCH 143/251] minor fixes --- tests/issues/issue_871a.py | 1 - vedo/addons.py | 20 ++++++++++++++------ vedo/shapes.py | 7 ++++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/tests/issues/issue_871a.py b/tests/issues/issue_871a.py index a4f1e437..bfbba7a7 100644 --- a/tests/issues/issue_871a.py +++ b/tests/issues/issue_871a.py @@ -62,7 +62,6 @@ # c="white", title="E (:muV/m)", title_size=3, - title_xoffset=3, label_rotation=90, label_offset=.5, label_size=2, diff --git a/vedo/addons.py b/vedo/addons.py index ec4058e0..aa994883 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -8,6 +8,7 @@ import vtkmodules.all as vtk import vedo +from vedo.transformations import LinearTransform from vedo import settings from vedo import utils from vedo import shapes @@ -1285,15 +1286,19 @@ def ScalarBar3D( if draw_box: tacts.append(scale.box().lw(1).c(c)) - for m in tacts+scales: + for m in tacts + scales: m.shift(pos) + m.actor.PickableOff() m.properties.LightingOff() asse = Assembly(scales + tacts) + # asse.transform = LinearTransform().shift(pos) + bb = asse.GetBounds() # print("ScalarBar3D pos",pos, bb) # asse.SetOrigin(pos) + asse.SetOrigin(bb[0], bb[2], bb[4]) # asse.SetOrigin(bb[0],0,0) #in pyplot line 1312 @@ -4041,10 +4046,10 @@ def add_global_axes(axtype=None, c=None, bounds=()): c = get_color(c) # for speed if not plt.renderer: - return None + return if plt.axes_instances[r]: - return None + return ############################################################ # custom grid walls @@ -4262,7 +4267,10 @@ def add_global_axes(axtype=None, c=None, bounds=()): try: ocf.SetInputData(largestact) except TypeError: - ocf.SetInputData(largestact.dataset) + try: + ocf.SetInputData(largestact.dataset) + except TypeError: + return ocf.Update() oc_mapper = vtk.vtkHierarchicalPolyDataMapper() @@ -4285,7 +4293,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): rulax = RulerAxes(vbb, c=c, xtitle="x - ", ytitle="y - ", ztitle="z - ") plt.axes_instances[r] = rulax if not rulax: - return None + return rulax.actor.UseBoundsOn() rulax.actor.PickableOff() plt.add(rulax) @@ -4441,4 +4449,4 @@ def add_global_axes(axtype=None, c=None, bounds=()): if not plt.axes_instances[r]: plt.axes_instances[r] = True - return None + return diff --git a/vedo/shapes.py b/vedo/shapes.py index 35e8eec7..fc5f79a0 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2372,10 +2372,10 @@ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestRegularPolygonSource.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=nsides, endpoint=False) - x, y = pol2cart(np.ones_like(t) * r, t) + pts = pol2cart(np.ones_like(t) * r, t).T faces = [list(range(nsides))] # do not use: vtkRegularPolygonSource - super().__init__([np.c_[x, y], faces], c, alpha) + super().__init__([pts, faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.pos(pos) @@ -2562,7 +2562,7 @@ def __init__( ar.UseNormalAndAngleOff() ar.SetPoint1([0, 0, 0]) ar.SetPoint2(point2) - ar.SetCenter(center) + # ar.SetCenter(center) elif normal is not None and angle is not None: ar.UseNormalAndAngleOn() ar.SetAngle(angle) @@ -2576,6 +2576,7 @@ def __init__( ar.Update() super().__init__(ar.GetOutput(), c, alpha) + self.pos(center) self.lw(2).lighting("off") self.name = "Arc" From 7a83d34b3003a00ddfbb778d6745cdfe5fceb164 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 19:31:19 +0200 Subject: [PATCH 144/251] picture.Picture2D to Picture(...).clone2d() update pyplot/embed_matplotlib.py --- docs/changes.md | 5 +- examples/pyplot/embed_matplotlib.py | 4 +- vedo/picture.py | 176 ++++++++++++---------------- vedo/visual.py | 1 + 4 files changed, 82 insertions(+), 104 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index bad7d42b..7d966a8a 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -16,6 +16,9 @@ - add `plotter.initialize_interactor()` - add object hinting (flag_labels1.py) by hovering mouse - add `colors.lut_color_at(value)` the color of the lookup table at value. +- remove `picture.Picture2D(...)` which becomes `Picture(...).clone2d()` +see `examples/pyplot/embed_matplotlib.py`. + @@ -52,7 +55,7 @@ examples/advanced/warp4b.py examples/simulations/lorenz.py examples/volumetric/slicer1.py examples/other/flag_labels1.py - +examples/pyplot/embed_matplotlib.py ``` diff --git a/examples/pyplot/embed_matplotlib.py b/examples/pyplot/embed_matplotlib.py index 4ff19e05..7af70cd5 100644 --- a/examples/pyplot/embed_matplotlib.py +++ b/examples/pyplot/embed_matplotlib.py @@ -11,7 +11,7 @@ plt.hist(msh.celldata["chem_0"], log=True) plt.title(r'$\mathrm{Matplotlib\ Histogram\ of\ log(chem_0)}$') -pic1 = Picture2D(fig, scale=0.5, pos="bottom-right").ontop() -pic2 = Picture2D(dataurl+"images/embryo.jpg", pos='top-right') +pic1 = Picture(fig).clone2d("bottom-right", scale=0.5).alpha(0.8) +pic2 = Picture(dataurl+"images/embryo.jpg").clone2d('top-right') show(msh, pic1, pic2, __doc__, bg='lightgrey', axes=1) diff --git a/vedo/picture.py b/vedo/picture.py index baec5040..0a8aae31 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -19,7 +19,7 @@ ![](https://vedo.embl.es/images/basic/rotateImage.png) """ -__all__ = ["Picture", "Picture2D"] +__all__ = ["Picture"] ################################################# @@ -139,106 +139,6 @@ def _set_justification(img, pos): return img, pos -################################################# -class Picture2D(vedo.visual.Actor2D): - """ - Embed an image as a static 2D image in the canvas. - """ - - def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify=""): - """ - Embed an image as a static 2D image in the canvas. - - Arguments: - fig : Picture, matplotlib.Figure, matplotlib.pyplot, vtkImageData - the input image - pos : (list) - 2D (x,y) position in range [0,1], - [0,0] being the bottom-left corner - scale : (float) - apply a scaling factor to the image - ontop : (bool) - keep image on top or not - padding : (int) - an internal padding space as a fraction of size - (matplotlib only) - justify : (str) - define the anchor point ("top-left", "top-center", ...) - """ - super().__init__() - # print("input type:", fig.__class__) - - self.array = None - - if utils.is_sequence(fig): - self.array = fig - self.dataset = _get_img(self.array) - - elif isinstance(fig, Picture): - self.dataset = fig.dataset - - elif isinstance(fig, vtk.vtkImageData): - assert fig.GetDimensions()[2] == 1, "Cannot create an Picture2D from Volume" - self.dataset = fig - - elif isinstance(fig, str): - self.dataset = _get_img(fig) - self.filename = fig - - elif "matplotlib" in str(fig.__class__): - if hasattr(fig, "gcf"): - fig = fig.gcf() - fig.tight_layout(pad=padding) - fig.canvas.draw() - - # self.array = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) - # self.array = self.array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) - width, height = fig.get_size_inches() * fig.get_dpi() - self.array = np.frombuffer( - fig.canvas.buffer_rgba(), dtype=np.uint8 - ).reshape((int(height), int(width), 4)) - self.array = self.array[:, :, :3] - - self.dataset = _get_img(self.array) - - ############# - if scale != 1: - newsize = np.array(self.dataset.GetDimensions()[:2]) * scale - newsize = newsize.astype(int) - rsz = vtk.vtkImageResize() - rsz.SetInputData(self.dataset) - rsz.SetResizeMethodToOutputDimensions() - rsz.SetOutputDimensions(newsize[0], newsize[1], 1) - rsz.Update() - self.dataset = rsz.GetOutput() - - if padding: - pass # TODO - - if justify: - self.dataset, pos = _set_justification(self.dataset, justify) - else: - self.dataset, pos = _set_justification(self.dataset, pos) - - self.mapper = vtk.vtkImageMapper() - self.mapper.SetInputData(self.dataset) - self.mapper.SetColorWindow(255) - self.mapper.SetColorLevel(127.5) - self.SetMapper(self.mapper) - - self.GetPositionCoordinate().SetCoordinateSystem(3) - self.SetPosition(pos) - - if ontop: - self.GetProperty().SetDisplayLocationToForeground() - else: - self.GetProperty().SetDisplayLocationToBackground() - - @property - def shape(self): - return np.array(self.dataset.GetDimensions()[:2]).astype(int) - - ################################################# class Picture(vedo.visual.PictureVisual): """ @@ -248,6 +148,7 @@ class Picture(vedo.visual.PictureVisual): def __init__(self, obj=None, channels=3): """ Can be instantiated with a path file name or with a numpy array. + Can also be instantiated with a matplotlib figure. By default the transparency channel is disabled. To enable it set channels=4. @@ -277,6 +178,23 @@ def __init__(self, obj=None, channels=3): img = _get_img(obj) self.filename = obj + elif "matplotlib" in str(obj.__class__): + fig = obj + if hasattr(fig, "gcf"): + fig = fig.gcf() + fig.tight_layout(pad=1) + fig.canvas.draw() + + # self.array = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) + # self.array = self.array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + width, height = fig.get_size_inches() * fig.get_dpi() + self.array = np.frombuffer( + fig.canvas.buffer_rgba(), dtype=np.uint8 + ).reshape((int(height), int(width), 4)) + self.array = self.array[:, :, :3] + + img = _get_img(self.array) + else: img = vtk.vtkImageData() @@ -419,6 +337,62 @@ def clone(self): pic.pipeline = utils.OperationNode("clone", parents=[self], c="#f7dada", shape="diamond") return pic + + def clone2d(self, pos=(0, 0), scale=1, justify=""): + """ + Embed an image as a static 2D image in the canvas. + + Return a 2D (an `Actor2D`) copy of the input Picture. + + Arguments: + pos : (list, str) + 2D (x,y) position in range [0,1], + [0,0] being the bottom-left corner + scale : (float) + apply a scaling factor to the image + justify : (str) + define the anchor point ("top-left", "top-center", ...) + """ + pic = vedo.visual.Actor2D() + + pic.name = self.name + pic.filename = self.filename + pic.file_size = self.file_size + + pic.dataset = self.dataset + + pic.properties = pic.GetProperty() + pic.properties.SetDisplayLocationToBackground() + + if scale != 1: + newsize = np.array(self.dataset.GetDimensions()[:2]) * scale + newsize = newsize.astype(int) + rsz = vtk.vtkImageResize() + rsz.SetInputData(self.dataset) + rsz.SetResizeMethodToOutputDimensions() + rsz.SetOutputDimensions(newsize[0], newsize[1], 1) + rsz.Update() + pic.dataset = rsz.GetOutput() + + if justify: + pic.dataset, pos = _set_justification(pic.dataset, justify) + else: + pic.dataset, pos = _set_justification(pic.dataset, pos) + + pic.mapper = vtk.vtkImageMapper() + pic.SetMapper(pic.mapper) + pic.mapper.SetInputData(pic.dataset) + pic.mapper.SetColorWindow(255) + pic.mapper.SetColorLevel(127.5) + + pic.GetPositionCoordinate().SetCoordinateSystem(3) + pic.SetPosition(pos) + + pic.shape = tuple(self.dataset.GetDimensions()[:2]) + + pic.pipeline = utils.OperationNode("clone2d", parents=[self], c="#f7dada", shape="diamond") + return pic + def extent(self, ext=None): """ diff --git a/vedo/visual.py b/vedo/visual.py index fb7e3b26..dcdfea68 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2467,6 +2467,7 @@ def __init__(self): self.mapper = self.GetMapper() self.properties = self.GetProperty() self.filename = "" + self.shape = [] def layer(self, value=None): """Set/Get the layer number in the overlay planes into which to render.""" From 7bd0d73fd45ef3fea59903cf4a7366edcec90dc3 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 20:30:41 +0200 Subject: [PATCH 145/251] put back title_xoffset=-1.2 and make a call to self.interactor.ProcessEvents() in OSX only once --- vedo/addons.py | 4 ++-- vedo/plotter.py | 43 +++++++++++++++++++++++-------------------- vedo/visual.py | 2 +- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index aa994883..24ac95ff 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -966,7 +966,7 @@ def ScalarBar3D( pos=None, size=(0, 0), title_font="", - title_xoffset=0.0, + title_xoffset=-1.2, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, @@ -1155,7 +1155,7 @@ def ScalarBar3D( font=title_font, ) t.rotate_z(90 + title_rotation) - t.pos(sx * (title_xoffset-1.2), title_yoffset, 0) + t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) if pos is None: diff --git a/vedo/plotter.py b/vedo/plotter.py index 7032f54c..6396dde2 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -447,6 +447,7 @@ def __init__( self._clockt0 = time.time() self._extralight = None self._cocoa_initialized = False + self._cocoa_process_events = True # make one call in show() self._bg = bg # used by backend notebooks ##################################################################### @@ -3156,9 +3157,6 @@ def show( self.renderer.ResetCameraClippingRange() - # if self.interactor and not self.interactor.GetInitialized(): - # self.interactor.Initialize() - # self.interactor.RemoveObservers("CharEvent") self.initialize_interactor() if settings.immediate_rendering: @@ -3169,25 +3167,30 @@ def show( return backends.get_notebook_backend() ######################################################################### - self.window.SetWindowName(self.title) + if self.interactor: # can be offscreen.. - try: - # Needs "pip install pyobjc" on Mac OSX - if ( - self._cocoa_initialized is False - and "Darwin" in vedo.sys_platform - and not self.offscreen - ): - self._cocoa_initialized = True - from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps - pid = os.getpid() - x = NSRunningApplication.runningApplicationWithProcessIdentifier_(int(pid)) - x.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) - except: - pass - # vedo.logger.debug("On Mac OSX try: pip install pyobjc") + self.window.SetWindowName(self.title) - if self.interactor: # can be offscreen.. + try: + # Needs "pip install pyobjc" on Mac OSX + if ( + self._cocoa_initialized is False + and "Darwin" in vedo.sys_platform + and not self.offscreen + ): + self._cocoa_initialized = True + from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps + pid = os.getpid() + x = NSRunningApplication.runningApplicationWithProcessIdentifier_(int(pid)) + x.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) + except: + pass + # vedo.logger.debug("On Mac OSX try: pip install pyobjc") + + if "Darwin" in vedo.sys_platform and not self.offscreen: + if self.interactor.GetInitialized() and self._osx_process_events: + self.interactor.ProcessEvents() + self._cocoa_process_events = False if interactive is not None: self._interactive = interactive diff --git a/vedo/visual.py b/vedo/visual.py index dcdfea68..d870faf6 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -251,7 +251,7 @@ def add_scalarbar3d( pos=None, size=(0, 0), title_font="", - title_xoffset=0.0, + title_xoffset=-1.2, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, From 3a3a4e4e6b32868960964e52267a677d715ed41c Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 20:59:13 +0200 Subject: [PATCH 146/251] improvements to method `mesh.clone2d()` --- docs/changes.md | 2 +- examples/other/clone2d.py | 2 +- vedo/visual.py | 97 +++++++++++++-------------------------- 3 files changed, 34 insertions(+), 67 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 7d966a8a..7f01e7cd 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -18,7 +18,7 @@ - add `colors.lut_color_at(value)` the color of the lookup table at value. - remove `picture.Picture2D(...)` which becomes `Picture(...).clone2d()` see `examples/pyplot/embed_matplotlib.py`. - +- improvements to method `mesh.clone2d()` diff --git a/examples/other/clone2d.py b/examples/other/clone2d.py index 8b5d1e85..02813076 100644 --- a/examples/other/clone2d.py +++ b/examples/other/clone2d.py @@ -15,7 +15,7 @@ # 5. World (anchor the 2d image to mesh) # (returns a vtkActor2D) -man2d = man3d.clone2d(pos=[0.4,0.4], coordsys=4, c='r', alpha=1) +man2d = man3d.clone2d().pos([0.4,0.4]).c('red4') show(man3d, man2d, __doc__, axes=1).close() diff --git a/vedo/visual.py b/vedo/visual.py index d870faf6..a1962997 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -465,39 +465,10 @@ def __init__(self): # print("init PointsVisual") super().__init__() - def clone2d( - self, - pos=(0, 0), - coordsys=4, - scale=None, - c=None, - alpha=None, - ps=2, - lw=1, - sendback=False, - layer=0, - ): + def clone2d(self, scale=1): """ - Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. - - Arguments: - coordsys : (int) - the coordinate system, options are - - 0 = Displays - - 1 = Normalized Display - - 2 = Viewport (origin is the bottom-left corner of the window) - - 3 = Normalized Viewport - - 4 = View (origin is the center of the window) - - 5 = World (anchor the 2d image to mesh) - - ps : (int) - point size in pixel units - - lw : (int) - line width in pixel units - - sendback : (bool) - put it behind any other 3D object + Copy a 3D Mesh into a flat 2D image. + Returns a new `Actor2D`. Examples: - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) @@ -513,19 +484,18 @@ def clone2d( else: scale = 350 / msiz - cmsh = self.clone() - poly = cmsh.pos(0, 0, 0).scale(scale).dataset + cmsh = self.clone().pos([0, 0, 0]).scale(scale) + poly = cmsh.dataset - mapper3d = self.mapper - cm = mapper3d.GetColorMode() - lut = mapper3d.GetLookupTable() - sv = mapper3d.GetScalarVisibility() - use_lut = mapper3d.GetUseLookupTableScalarRange() - vrange = mapper3d.GetScalarRange() - sm = mapper3d.GetScalarMode() + cm = self.mapper.GetColorMode() + lut = self.mapper.GetLookupTable() + sv = self.mapper.GetScalarVisibility() + use_lut = self.mapper.GetUseLookupTableScalarRange() + vrange = self.mapper.GetScalarRange() + sm = self.mapper.GetScalarMode() mapper2d = vtk.vtkPolyDataMapper2D() - mapper2d.ShallowCopy(mapper3d) + mapper2d.ShallowCopy(self.mapper) mapper2d.SetInputData(poly) mapper2d.SetColorMode(cm) mapper2d.SetLookupTable(lut) @@ -534,30 +504,16 @@ def clone2d( mapper2d.SetScalarRange(vrange) mapper2d.SetScalarMode(sm) - act2d = vtk.vtkActor2D() + act2d = Actor2D() + act2d.properties = act2d.GetProperty() + act2d.mapper = mapper2d + act2d.dataset = poly + act2d.SetMapper(mapper2d) - act2d.SetLayerNumber(layer) csys = act2d.GetPositionCoordinate() - csys.SetCoordinateSystem(coordsys) - act2d.SetPosition(pos) - if c is not None: - c = colors.get_color(c) - act2d.GetProperty().SetColor(c) - mapper2d.SetScalarVisibility(False) - else: - act2d.GetProperty().SetColor(cmsh.color()) - if alpha is not None: - act2d.GetProperty().SetOpacity(alpha) - else: - act2d.GetProperty().SetOpacity(cmsh.alpha()) - act2d.GetProperty().SetPointSize(ps) - act2d.GetProperty().SetLineWidth(lw) - act2d.GetProperty().SetDisplayLocationToForeground() - if sendback: - act2d.GetProperty().SetDisplayLocationToBackground() - - # print(csys.GetCoordinateSystemAsString()) - # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) + csys.SetCoordinateSystem(4) + act2d.properties.SetColor(cmsh.color()) + act2d.properties.SetOpacity(cmsh.alpha()) return act2d ################################################## @@ -625,7 +581,7 @@ def color(self, c=False, alpha=None): cc = colors.get_color(c) self.properties.SetColor(cc) if self.trail: - self.trail.GetProperty().SetColor(cc) + self.trail.properties.SetColor(cc) if alpha is not None: self.alpha(alpha) return self @@ -2530,6 +2486,17 @@ def pickable(self, value=True): self.SetPickable(value) return self + def color(self, value=None): + """Set/Get the object color.""" + if value is None: + return self.properties.GetColor() + self.properties.SetColor(colors.get_color(value)) + return self + + def c(self, value=None): + """Set/Get the object color.""" + return self.color(value) + def alpha(self, value=None): """Set/Get the object opacity.""" if value is None: From 2d1d993da463801354b518c1e42c8d427b70c6db Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 21:11:48 +0200 Subject: [PATCH 147/251] improvements to method `mesh.clone2d()` part2 --- examples/other/clone2d.py | 11 ++++++----- vedo/visual.py | 9 +++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/other/clone2d.py b/examples/other/clone2d.py index 02813076..345f0f46 100644 --- a/examples/other/clone2d.py +++ b/examples/other/clone2d.py @@ -1,8 +1,9 @@ -"""Make a static 2D copy of a mesh +"""Make a static 2D clone copy of a mesh and place it in the rendering window""" from vedo import Mesh, dataurl, show -man3d = Mesh(dataurl+'man.vtk').rotate_z(20).rotate_x(-70).scale(0.2) +man3d = Mesh(dataurl+'man.vtk') +man3d.rotate_z(20).rotate_x(-70).scale(0.2) man3d.c('darkgreen').lighting('glossy') # Make a 2D snapshot of a 3D mesh @@ -13,9 +14,9 @@ # 3. Normalized Viewport # 4. View (origin is the center of the window) # 5. World (anchor the 2d image to mesh) -# (returns a vtkActor2D) - -man2d = man3d.clone2d().pos([0.4,0.4]).c('red4') +# (returns a Actor2D) +man2d = man3d.clone2d().coordinate_system(4).pos([0.4,0.4]) +man2d.c('red4') show(man3d, man2d, __doc__, axes=1).close() diff --git a/vedo/visual.py b/vedo/visual.py index a1962997..4fdb0ec2 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -465,10 +465,10 @@ def __init__(self): # print("init PointsVisual") super().__init__() - def clone2d(self, scale=1): + def clone2d(self, scale=None): """ Copy a 3D Mesh into a flat 2D image. - Returns a new `Actor2D`. + Returns a `Actor2D`. Examples: - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) @@ -476,6 +476,7 @@ def clone2d(self, scale=1): ![](https://vedo.embl.es/images/other/clone2d.png) """ if scale is None: + # work out a reasonable scale msiz = self.diagonal_size() if vedo.plotter_instance and vedo.plotter_instance.window: sz = vedo.plotter_instance.window.GetSize() @@ -484,8 +485,8 @@ def clone2d(self, scale=1): else: scale = 350 / msiz - cmsh = self.clone().pos([0, 0, 0]).scale(scale) - poly = cmsh.dataset + cmsh = self.clone() + poly = cmsh.pos([0, 0, 0]).scale(scale).dataset cm = self.mapper.GetColorMode() lut = self.mapper.GetLookupTable() From 46e57609855aa77efb975f55fde212e38a67166a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 21:29:08 +0200 Subject: [PATCH 148/251] fix _osx to _cocoa and move test in render() --- vedo/plotter.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 6396dde2..2488ac51 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -992,6 +992,10 @@ def render(self, resetcam=False): self.qt_widget.Render() return self + if self._cocoa_process_events and self.interactor.GetInitialized(): + if "Darwin" in vedo.sys_platform and not self.offscreen: + self.interactor.ProcessEvents() + self._cocoa_process_events = False if resetcam: self.renderer.ResetCamera() @@ -3187,11 +3191,6 @@ def show( pass # vedo.logger.debug("On Mac OSX try: pip install pyobjc") - if "Darwin" in vedo.sys_platform and not self.offscreen: - if self.interactor.GetInitialized() and self._osx_process_events: - self.interactor.ProcessEvents() - self._cocoa_process_events = False - if interactive is not None: self._interactive = interactive From dd731a5f24616a1793ec35ec4d19d8ff68485c33 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 21:30:21 +0200 Subject: [PATCH 149/251] fix _osx to _cocoa and move test in render() part2 --- vedo/plotter.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 2488ac51..1d665045 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -992,15 +992,15 @@ def render(self, resetcam=False): self.qt_widget.Render() return self - if self._cocoa_process_events and self.interactor.GetInitialized(): - if "Darwin" in vedo.sys_platform and not self.offscreen: - self.interactor.ProcessEvents() - self._cocoa_process_events = False - if resetcam: self.renderer.ResetCamera() self.window.Render() + + if self._cocoa_process_events and self.interactor.GetInitialized(): + if "Darwin" in vedo.sys_platform and not self.offscreen: + self.interactor.ProcessEvents() + self._cocoa_process_events = False return self def interactive(self): From 4fae927201f777d24bef66c3e97467f48297efcd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 21:55:19 +0200 Subject: [PATCH 150/251] name change from `Picture` to `Image` --- docs/changes.md | 3 +- examples/advanced/spline_draw.py | 4 +- examples/basic/rotate_image.py | 4 +- examples/basic/slider_browser.py | 4 +- examples/other/icon.py | 2 +- examples/other/qt_window2.py | 4 +- examples/pyplot/earthquake_browser.py | 2 +- examples/pyplot/embed_matplotlib.py | 4 +- examples/simulations/tunnelling2.py | 2 +- examples/simulations/wave_equation1d.py | 2 +- examples/volumetric/image_false_colors.py | 8 ++-- examples/volumetric/image_fft.py | 4 +- examples/volumetric/image_probe.py | 4 +- examples/volumetric/image_rgba.py | 8 ++-- examples/volumetric/image_to_mesh.py | 4 +- vedo/cli.py | 8 ++-- vedo/file_io.py | 16 +++---- vedo/picture.py | 58 +++++++++++++---------- vedo/plotter.py | 20 ++++---- vedo/transformations.py | 2 +- vedo/utils.py | 8 ++-- vedo/visual.py | 6 +-- 22 files changed, 92 insertions(+), 85 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 7f01e7cd..6ab25a1a 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -16,9 +16,10 @@ - add `plotter.initialize_interactor()` - add object hinting (flag_labels1.py) by hovering mouse - add `colors.lut_color_at(value)` the color of the lookup table at value. -- remove `picture.Picture2D(...)` which becomes `Picture(...).clone2d()` +- remove `picture.Picture2D(...)` which becomes `Image(...).clone2d()` see `examples/pyplot/embed_matplotlib.py`. - improvements to method `mesh.clone2d()` +- name change from `Picture` to `Image` diff --git a/examples/advanced/spline_draw.py b/examples/advanced/spline_draw.py index 4e3184b9..c2d4b5e8 100644 --- a/examples/advanced/spline_draw.py +++ b/examples/advanced/spline_draw.py @@ -1,7 +1,7 @@ -from vedo import dataurl, Picture +from vedo import dataurl, Image from vedo.applications import SplinePlotter # ready to use class! -pic = Picture(dataurl + "images/embryo.jpg") +pic = Image(dataurl + "images/embryo.jpg") plt = SplinePlotter(pic) plt.show(mode="image", zoom='tightest') diff --git a/examples/basic/rotate_image.py b/examples/basic/rotate_image.py index 88f283d7..dcf32460 100644 --- a/examples/basic/rotate_image.py +++ b/examples/basic/rotate_image.py @@ -1,10 +1,10 @@ """Normal jpg/png pictures can be loaded, cropped, rotated and positioned in 3D.""" -from vedo import Plotter, Picture, dataurl +from vedo import Plotter, Image, dataurl plt = Plotter(axes=7) -pic = Picture(dataurl+"images/dog.jpg") +pic = Image(dataurl+"images/dog.jpg") for i in range(5): p = pic.clone() diff --git a/examples/basic/slider_browser.py b/examples/basic/slider_browser.py index 93c5e2a4..622bab9d 100644 --- a/examples/basic/slider_browser.py +++ b/examples/basic/slider_browser.py @@ -1,6 +1,6 @@ """Mouse hind limb growth from day 10 9h to day 15 21h""" from vedo import settings, dataurl, load -from vedo import Text2D, Plotter, Picture, Axes, Line +from vedo import Text2D, Plotter, Image, Axes, Line def sliderfunc(widget, event): @@ -18,7 +18,7 @@ def sliderfunc(widget, event): plt = Plotter(bg="blackboard") plt += Text2D(__doc__, pos="top-center", s=1.2, c="w") -plt += Picture(dataurl + "images/limbs_tc.jpg").scale(0.0154).y(10) +plt += Image(dataurl + "images/limbs_tc.jpg").scale(0.0154).y(10) plt += Line([(0, 8), (0, 10), (28.6, 10), (4.5, 8)], c="gray") plt += Axes(objs[-1]) plt += objs[0] diff --git a/examples/other/icon.py b/examples/other/icon.py index 17d5f966..408013c5 100644 --- a/examples/other/icon.py +++ b/examples/other/icon.py @@ -7,7 +7,7 @@ plt += Text3D(__doc__).bc('tomato') -elg = Picture(dataurl+"images/embl_logo.jpg") +elg = Image(dataurl+"images/embl_logo.jpg") plt.add_icon(elg, pos=2, size=0.06) plt.add_icon(VedoLogo(), pos=1, size=0.06) diff --git a/examples/other/qt_window2.py b/examples/other/qt_window2.py index fde3ffe0..7208fadc 100644 --- a/examples/other/qt_window2.py +++ b/examples/other/qt_window2.py @@ -1,7 +1,7 @@ import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor -from vedo import Plotter, Picture, Text2D, printc +from vedo import Plotter, Image, Text2D, printc class MainWindow(Qt.QMainWindow): @@ -15,7 +15,7 @@ def __init__(self, parent=None): # Create vedo renderer and add objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.cbid = self.plt.add_callback("key press", self.onKeypress) - self.imgActor = Picture("https://icatcare.org/app/uploads/2018/07/Helping-your-new-cat-or-kitten-settle-in-1.png") + self.imgActor = Image("https://icatcare.org/app/uploads/2018/07/Helping-your-new-cat-or-kitten-settle-in-1.png") self.text2d = Text2D("Use slider to change contrast") self.slider = Qt.QSlider(1) diff --git a/examples/pyplot/earthquake_browser.py b/examples/pyplot/earthquake_browser.py index 6d811037..691a2473 100644 --- a/examples/pyplot/earthquake_browser.py +++ b/examples/pyplot/earthquake_browser.py @@ -9,7 +9,7 @@ usecols = ['time','place','latitude','longitude','depth','mag'] data = pandas.read_csv(path, usecols=usecols)[usecols][::-1].reset_index(drop=True) # reverse list -pic = Picture(dataurl + "images/eo_base_2020_clean_3600x1800.png") +pic = Image(dataurl + "images/eo_base_2020_clean_3600x1800.png") pic.pickable(False).level(185).window(120) # add some contrast to the original image scale = [pic.shape[0]/2, pic.shape[1]/2, 1] comment = Text2D(__doc__, bg='green9', alpha=0.7, font='Ubuntu') diff --git a/examples/pyplot/embed_matplotlib.py b/examples/pyplot/embed_matplotlib.py index 7af70cd5..92af7eb4 100644 --- a/examples/pyplot/embed_matplotlib.py +++ b/examples/pyplot/embed_matplotlib.py @@ -11,7 +11,7 @@ plt.hist(msh.celldata["chem_0"], log=True) plt.title(r'$\mathrm{Matplotlib\ Histogram\ of\ log(chem_0)}$') -pic1 = Picture(fig).clone2d("bottom-right", scale=0.5).alpha(0.8) -pic2 = Picture(dataurl+"images/embryo.jpg").clone2d('top-right') +pic1 = Image(fig).clone2d("bottom-right", scale=0.5).alpha(0.8) +pic2 = Image(dataurl+"images/embryo.jpg").clone2d('top-right') show(msh, pic1, pic2, __doc__, bg='lightgrey', axes=1) diff --git a/examples/simulations/tunnelling2.py b/examples/simulations/tunnelling2.py index ea3a6b0b..e527b8c2 100644 --- a/examples/simulations/tunnelling2.py +++ b/examples/simulations/tunnelling2.py @@ -39,7 +39,7 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method plt = Plotter(interactive=False) -pic = Picture(dataurl+"images/schrod.png").pos(0, -5, -0.1).scale(0.0255) +pic = Image(dataurl+"images/schrod.png").pos(0, -5, -0.1).scale(0.0255) barrier = Line(np.stack((x, V*15, np.zeros_like(x)), axis=1), c="black", lw=2) barrier.name = "barrier" plt.show(pic, barrier, __doc__) diff --git a/examples/simulations/wave_equation1d.py b/examples/simulations/wave_equation1d.py index 35a5a448..c295d9ed 100644 --- a/examples/simulations/wave_equation1d.py +++ b/examples/simulations/wave_equation1d.py @@ -93,7 +93,7 @@ def euler(y, v, t, dt): # simple euler integrator # let's also add a fancy background image from wikipedia img = dataurl + "images/wave_wiki.png" -plt += Picture(img).alpha(0.8).scale(0.4).pos(0,-100,-1) +plt += Image(img).alpha(0.8).scale(0.4).pos(0,-100,-1) plt += __doc__ plt.show(zoom=1.5) diff --git a/examples/volumetric/image_false_colors.py b/examples/volumetric/image_false_colors.py index 046be835..260819db 100644 --- a/examples/volumetric/image_false_colors.py +++ b/examples/volumetric/image_false_colors.py @@ -1,6 +1,6 @@ -"""Generate the Mandelbrot set as a color-mapped Picture object""" +"""Generate the Mandelbrot set as a color-mapped Image object""" import numpy as np -from vedo import Picture, dataurl, show +from vedo import Image, dataurl, show def mandelbrot(h=400, w=400, maxit=20, r=2): @@ -19,8 +19,8 @@ def mandelbrot(h=400, w=400, maxit=20, r=2): z[diverge] = r # avoid diverging too much return divtime -pic = Picture(mandelbrot()).cmap("RdGy") +pic = Image(mandelbrot()).cmap("RdGy") show(pic, __doc__, axes=1, size=[800,600], zoom=1.4).close() # Also: -# Picture(dataurl+"images/dog.jpg").cmap("RdGy").show().close() +# Image(dataurl+"images/dog.jpg").cmap("RdGy").show().close() diff --git a/examples/volumetric/image_fft.py b/examples/volumetric/image_fft.py index aab3b216..53b996ef 100644 --- a/examples/volumetric/image_fft.py +++ b/examples/volumetric/image_fft.py @@ -1,10 +1,10 @@ # 2D Fast Fourier Transform of a picture -from vedo import Picture, show +from vedo import Image, show # url = 'https://comps.canstockphoto.com/a-capital-silhouette-stock-illustrations_csp31110154.jpg' url = 'https://vedo.embl.es/examples/data/images/dog.jpg' -pic = Picture(url).resize([200,None]) # resize so that x has 200 pixels, but keep y aspect-ratio +pic = Image(url).resize([200,None]) # resize so that x has 200 pixels, but keep y aspect-ratio picfft = pic.fft(logscale=12) picfft = picfft.tomesh().cmap('Set1',"RGBA").add_scalarbar("12\dotlog(fft)") # optional step diff --git a/examples/volumetric/image_probe.py b/examples/volumetric/image_probe.py index 46377d1d..4f2d0f5e 100644 --- a/examples/volumetric/image_probe.py +++ b/examples/volumetric/image_probe.py @@ -1,9 +1,9 @@ """Probe image intensities along a set of radii""" -from vedo import Picture, dataurl, Circle, Lines, show +from vedo import Image, dataurl, Circle, Lines, show from vedo.pyplot import plot import numpy as np -pic = Picture(dataurl+'images/spheroid.jpg') +pic = Image(dataurl+'images/spheroid.jpg') cpt = [580,600,0] circle = Circle(cpt, r=500, res=36).wireframe() diff --git a/examples/volumetric/image_rgba.py b/examples/volumetric/image_rgba.py index d1c33d49..b5ed95e6 100644 --- a/examples/volumetric/image_rgba.py +++ b/examples/volumetric/image_rgba.py @@ -1,7 +1,7 @@ """Example plot of 2 images containing an alpha channel for modulating the opacity""" #Credits: https://github.com/ilorevilo -from vedo import Picture, show +from vedo import Image, show import numpy as np rgbaimage1 = np.random.rand(50, 50, 4) * 255 @@ -10,9 +10,9 @@ rgbaimage2 = np.random.rand(50, 50, 4) * 255 rgbaimage2[:, :, 3] = alpharamp[::-1] -p1 = Picture(rgbaimage1, channels=4) +p1 = Image(rgbaimage1, channels=4) -p2 = Picture(rgbaimage2, channels=4).z(12) +p2 = Image(rgbaimage2, channels=4).z(12) show(p1, p2, __doc__, axes=7, viewup="z").close() @@ -24,6 +24,6 @@ img[256:, 256:] = 255 img = img.transpose(1,0) -pict = Picture(img) +pict = Image(img) show(pict, mode="image", bg=(0.4,0.5,0.6), axes=1).close() diff --git a/examples/volumetric/image_to_mesh.py b/examples/volumetric/image_to_mesh.py index 97e3ee54..87f160c7 100644 --- a/examples/volumetric/image_to_mesh.py +++ b/examples/volumetric/image_to_mesh.py @@ -1,8 +1,8 @@ # Transform a picture into a mesh -from vedo import Picture, dataurl, show +from vedo import Image, dataurl, show import numpy as np -pic = Picture(dataurl+"images/dog.jpg").smooth(5) +pic = Image(dataurl+"images/dog.jpg").smooth(5) msh = pic.tomesh() # make a quad-mesh out of it # build a scalar array with intensities diff --git a/vedo/cli.py b/vedo/cli.py index d86f3c07..fe710873 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -40,7 +40,7 @@ from vedo import settings from vedo.colors import get_color, printc from vedo.mesh import Mesh -from vedo.picture import Picture +from vedo.picture import Image from vedo.plotter import Plotter from vedo.tetmesh import TetMesh from vedo.ugrid import UGrid @@ -577,7 +577,7 @@ def vfunc(event): ahl = plt.hover_legends[-1] plt.remove(ahl) plt.screenshot() # writer - printc(":camera: Picture saved as screenshot.png") + printc(":camera: Image saved as screenshot.png") plt.add(ahl) return elif event.keypress == "h": @@ -602,7 +602,7 @@ def vfunc(event): for f in files: if os.path.isfile(f): try: - pic = Picture(f) + pic = Image(f) if pic: pics.append(pic) except: @@ -940,7 +940,7 @@ def draw_scene(args): acts = load(args.files, force=args.reload) plt += acts for a in acts: - if hasattr(a, "c"): # Picture doesnt have it + if hasattr(a, "c"): # Image doesnt have it a.c(args.color) if args.point_size > 0: diff --git a/vedo/file_io.py b/vedo/file_io.py index 822973a6..5165f241 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -15,7 +15,7 @@ from vedo import colors from vedo import utils from vedo.assembly import Assembly -from vedo.picture import Picture +from vedo.picture import Image from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume @@ -342,12 +342,12 @@ def _load_file(filename, unpack): for frame in ImageSequence.Iterator(img): a = np.array(frame.convert("RGB").getdata(), dtype=np.uint8) a = a.reshape([frame.size[1], frame.size[0], 3]) - frames.append(Picture(a)) + frames.append(Image(a)) return frames picr.SetFileName(filename) picr.Update() - actor = Picture(picr.GetOutput()) # object derived from vtk.vtkImageActor() + actor = Image(picr.GetOutput()) # object derived from vtk.vtkImageActor() ################################################################# multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): @@ -970,9 +970,9 @@ def _fillmesh(obj, adict): adict["alpha"] = als adict["alphagrad"] = algrs - ######################################################## Picture - elif isinstance(obj, Picture): - adict["type"] = "Picture" + ######################################################## Image + elif isinstance(obj, Image): + adict["type"] = "Image" _fillcommon(obj, adict) adict["array"] = obj.tonumpy() @@ -1160,9 +1160,9 @@ def _buildmesh(d): vol.alpha_gradient(d["alphagrad"]) objs.append(vol) - ### Picture + ### Image elif d['type'].lower() == 'picture': - vimg = Picture(d["array"]) + vimg = Image(d["array"]) _load_common(vimg, d) objs.append(vimg) diff --git a/vedo/picture.py b/vedo/picture.py index 0a8aae31..a0b99419 100644 --- a/vedo/picture.py +++ b/vedo/picture.py @@ -19,7 +19,7 @@ ![](https://vedo.embl.es/images/basic/rotateImage.png) """ -__all__ = ["Picture"] +__all__ = ["Image", "Picture"] ################################################# @@ -139,8 +139,7 @@ def _set_justification(img, pos): return img, pos -################################################# -class Picture(vedo.visual.PictureVisual): +class Image(vedo.visual.ImageVisual): """ Class used to represent 2D pictures in a 3D world. """ @@ -153,13 +152,13 @@ def __init__(self, obj=None, channels=3): By default the transparency channel is disabled. To enable it set channels=4. - Use `Picture.dimensions()` to access the number of pixels in x and y. + Use `Image.dimensions()` to access the number of pixels in x and y. Arguments: channels : (int, list) only select these specific rgba channels (useful to remove alpha) """ - self.name = "Picture" + self.name = "Image" self.filename = "" self.file_size = 0 self.pipeline = None @@ -224,12 +223,12 @@ def __init__(self, obj=None, channels=3): sx, sy, _ = self.dataset.GetDimensions() shape = np.array([sx, sy]) - self.pipeline = utils.OperationNode("Picture", comment=f"#shape {shape}", c="#f28482") + self.pipeline = utils.OperationNode("Image", comment=f"#shape {shape}", c="#f28482") ###################################################################### def _repr_html_(self): """ - HTML representation of the Picture object for Jupyter Notebooks. + HTML representation of the Image object for Jupyter Notebooks. Returns: HTML text with the image and some properties. @@ -238,7 +237,7 @@ def _repr_html_(self): import base64 from PIL import Image - library_name = "vedo.picture.Picture" + library_name = "vedo.picture.Image" help_url = "https://vedo.embl.es/docs/vedo/picture.html" arr = self.thumbnail(zoom=1.1) @@ -302,7 +301,6 @@ def _repr_html_(self): ###################################################################### def _update(self, data): - """Overwrite the Picture data mesh with a new data.""" self.dataset = data self.mapper.SetInputData(data) self.mapper.Modified() @@ -323,12 +321,12 @@ def channels(self): return self.dataset.GetPointData().GetScalars().GetNumberOfComponents() def clone(self): - """Return an exact copy of the input Picture. + """Return an exact copy of the input Image. If transform is True, it is given the same scaling and position.""" img = vtk.vtkImageData() img.DeepCopy(self.dataset) - pic = Picture(img) + pic = Image(img) # assign the same transformation to the copy pic.actor.SetOrigin(self.actor.GetOrigin()) pic.actor.SetScale(self.actor.GetScale()) @@ -342,7 +340,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): """ Embed an image as a static 2D image in the canvas. - Return a 2D (an `Actor2D`) copy of the input Picture. + Return a 2D (an `Actor2D`) copy of the input Image. Arguments: pos : (list, str) @@ -501,7 +499,7 @@ def tile(self, nx=4, ny=4, shift=(0, 0)): z1, ) constant_pad.Update() - pic = Picture(constant_pad.GetOutput()) + pic = Image(constant_pad.GetOutput()) pic.pipeline = utils.OperationNode( "tile", comment=f"by {nx}x{ny}", parents=[self], c="#f28482" @@ -528,8 +526,8 @@ def append(self, pictures, axis="z", preserve_extents=False): Example: ```python - from vedo import Picture, dataurl - pic = Picture(dataurl+'dog.jpg').pad() + from vedo import Image, dataurl + pic = Image(dataurl+'dog.jpg').pad() pic.append([pic,pic], axis='y') pic.append([pic,pic,pic], axis='x') pic.show(axes=1).close() @@ -616,7 +614,7 @@ def select(self, component): ec.SetInputData(self.dataset) ec.SetComponents(component) ec.Update() - pic = Picture(ec.GetOutput()) + pic = Image(ec.GetOutput()) pic.pipeline = utils.OperationNode( "select", comment=f"component {component}", parents=[self], c="#f28482" ) @@ -643,7 +641,7 @@ def bw(self): def smooth(self, sigma=3, radius=None): """ - Smooth a Picture with Gaussian kernel. + Smooth a `Image` with Gaussian kernel. Arguments: sigma : (int) @@ -694,7 +692,7 @@ def enhance(self): Example: ```python from vedo import * - pic = Picture(vedo.dataurl+'images/dog.jpg').bw() + pic = Image(vedo.dataurl+'images/dog.jpg').bw() show(pic, pic.clone().enhance(), N=2, mode='image', zoom='tight') ``` ![](https://vedo.embl.es/images/feats/pict_enhance.png) @@ -784,7 +782,7 @@ def fft(self, mode="magnitude", logscale=12, center=True): ils.Update() out = ils.GetOutput() - pic = Picture(out) + pic = Image(out) pic.pipeline = utils.OperationNode("FFT", parents=[self], c="#f28482") return pic @@ -818,7 +816,7 @@ def rfft(self, mode="magnitude"): colors.printc("Error in rfft(): unknown mode", mode) raise RuntimeError() - pic = Picture(out) + pic = Image(out) pic.pipeline = utils.OperationNode("rFFT", parents=[self], c="#f28482") return pic @@ -988,7 +986,7 @@ def invert(self): def binarize(self, threshold=None, invert=False): """ - Return a new Picture where pixel above threshold are set to 255 + Return a new Image where pixel above threshold are set to 255 and pixels below are set to 0. Arguments: @@ -999,8 +997,8 @@ def binarize(self, threshold=None, invert=False): Example: ```python - from vedo import Picture, show - pic1 = Picture("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") + from vedo import Image, show + pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() @@ -1034,7 +1032,7 @@ def binarize(self, threshold=None, invert=False): def threshold(self, value=None, flip=False): """ - Create a polygonal Mesh from a Picture by filling regions with pixels + Create a polygonal Mesh from a Image by filling regions with pixels luminosity above a specified value. Arguments: @@ -1181,7 +1179,7 @@ def tomesh(self): def tonumpy(self): """ - Get read-write access to pixels of a Picture object as a numpy array. + Get read-write access to pixels of a Image object as a numpy array. Note that the shape is (nrofchannels, nx, ny). When you set values in the output image, you don't want numpy to reallocate the array @@ -1204,7 +1202,7 @@ def add_rectangle(self, xspan, yspan, c="green5", alpha=1): Example: ```python import vedo - pic = vedo.Picture(vedo.dataurl+"images/dog.jpg") + pic = vedo.Image(vedo.dataurl+"images/dog.jpg") pic.rectangle([100,300], [100,200], c='green4', alpha=0.7) pic.line([100,100],[400,500], lw=2, alpha=1) pic.triangle([250,300], [100,300], [200,400], c='blue5') @@ -1425,3 +1423,11 @@ def write(self, filename): shape="cylinder", ) return self + +################################################# +class Picture(Image): + def __init__(self, obj=None, channels=3): + """Deprecated. Use `Image` instead.""" + colors.printc("Picture() is deprecated, use Image() instead.", c='y') + super().__init__(obj=obj, channels=channels) + diff --git a/vedo/plotter.py b/vedo/plotter.py index 1d665045..3cd54b08 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -57,7 +57,7 @@ class Event: "isMesh", "isAssembly", "isVolume", - "isPicture", + "isImage", "isActor2D", ] @@ -119,7 +119,7 @@ def show( Create on the fly an instance of class Plotter and show the object(s) provided. Allowed input objects types are: - ``str, Mesh, Volume, Picture, Assembly + ``str, Mesh, Volume, Image, Assembly vtkPolyData, vtkActor, vtkActor2D, vtkImageActor, vtkAssembly or vtkVolume`` @@ -653,7 +653,7 @@ def __init__( self.background_renderer.SetLayer(0) self.background_renderer.InteractiveOff() self.background_renderer.SetBackground(vedo.get_color(bg2)) - image_actor = vedo.Picture(self.backgrcol).actor + image_actor = vedo.Image(self.backgrcol).actor self.window.AddRenderer(self.background_renderer) self.background_renderer.AddActor(image_actor) @@ -2167,7 +2167,7 @@ def _legfunc(evt): tp = "Points " elif evt.isVolume: tp = "Volume " - elif evt.isPicture: + elif evt.isImage: tp = "Pict " elif evt.isAssembly: tp = "Assembly " @@ -2217,7 +2217,7 @@ def _legfunc(evt): if cdata.GetScalars().GetName() == evt.object.mapper.GetArrayName(): t += " *" - if evt.isPicture: + if evt.isImage: t = f"{os.path.basename(evt.object.filename[:maxlength+10])}".ljust(maxlength+10) t += f"\nImage shape: {evt.object.shape}" pcol = self.color_picker(evt.picked2d) @@ -2452,7 +2452,7 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.isMesh = isinstance(event.object, vedo.Mesh) event.isAssembly = isinstance(event.object, vedo.Assembly) event.isVolume = isinstance(event.object, vedo.Volume) - event.isPicture = isinstance(event.object, vedo.Picture) + event.isImage = isinstance(event.object, vedo.Image) event.isActor2D = isinstance(event.object, vtk.vtkActor2D) return event @@ -2482,7 +2482,7 @@ def add_callback(self, event_name, func, priority=0.0, enable_picking=True): - `isMesh`: True if of class - `isAssembly`: True if of class - `isVolume`: True if of class Volume - - `isPicture`: True if of class + - `isImage`: True if of class If `enable_picking` is False, no picking will be performed. This can be useful to avoid double picking when using buttons. @@ -3445,9 +3445,9 @@ def screenshot(self, filename="screenshot.png", scale=1, asarray=False): """ return vedo.file_io.screenshot(filename, scale, asarray) - def topicture(self, scale=1): + def toimage(self, scale=1): """ - Generate a Picture object from the current rendering window. + Generate a `Image` object from the current rendering window. Arguments: scale : (int) @@ -3466,7 +3466,7 @@ def topicture(self, scale=1): w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() - return vedo.picture.Picture(w2if.GetOutput()) + return vedo.picture.Image(w2if.GetOutput()) def export(self, filename="scene.npz", binary=False): """ diff --git a/vedo/transformations.py b/vedo/transformations.py index 11eed0d7..5c576f5f 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -458,7 +458,7 @@ def reorient( objs = [] for a in np.linspace(0, 6.28, 7): v = vector(cos(a), sin(a), 0)*1000 - pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) + pic = Image(dataurl+"images/dog.jpg").rotate_z(10) pic.reorient([0,0,1], v) pic.pos(v - center) objs += [pic, Arrow(v, v+v)] diff --git a/vedo/utils.py b/vedo/utils.py index 1637e809..c487d448 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -86,7 +86,7 @@ class OperationNode: # Volume, UGrid #4cc9f0 # TetMesh #9e2a2b # File #8a817c - # Picture #f28482 + # Image #f28482 # Assembly #f08080 def __init__( @@ -1115,7 +1115,7 @@ def get_uv(p, x, v): ```python from vedo import * - pic = Picture(dataurl+"coloured_cube_faces.jpg") + pic = Image(dataurl+"coloured_cube_faces.jpg") cb = Mesh(dataurl+"coloured_cube.obj").lighting("off").texture(pic) cbpts = cb.vertices @@ -1748,8 +1748,8 @@ def _print_vtkactor(obj): if obj.axes: vedo.printc("axes style".ljust(14) + ":", obj.axes, axtype[obj.axes], bold=False, c="c") - elif isinstance(obj, vedo.Picture): # dumps Picture info - vedo.printc("Picture".ljust(70), c="y", bold=True, invert=True) + elif isinstance(obj, vedo.Image): # dumps Image info + vedo.printc("Image".ljust(70), c="y", bold=True, invert=True) # try: # # generate a print thumbnail # width, height = obj.dimensions() diff --git a/vedo/visual.py b/vedo/visual.py index 4fdb0ec2..027bb384 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -23,7 +23,7 @@ "PointsVisual", "VolumeVisual", "MeshVisual", - "PictureVisual", + "ImageVisual", "Actor2D", ] @@ -2258,10 +2258,10 @@ def interpolation(self, itype): ######################################################################################## -class PictureVisual(CommonVisual): +class ImageVisual(CommonVisual): def __init__(self) -> None: - # print("init PictureVisual") + # print("init ImageVisual") super().__init__() def memory_size(self): From 50a840d9536e7159cc93c50f613ad41178900529 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 21:57:24 +0200 Subject: [PATCH 151/251] rename vedo/picture.py vedo/image.py --- docs/changes.md | 2 +- vedo/__init__.py | 2 +- vedo/{picture.py => image.py} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename vedo/{picture.py => image.py} (100%) diff --git a/docs/changes.md b/docs/changes.md index 6ab25a1a..03771bbb 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -19,7 +19,7 @@ - remove `picture.Picture2D(...)` which becomes `Image(...).clone2d()` see `examples/pyplot/embed_matplotlib.py`. - improvements to method `mesh.clone2d()` -- name change from `Picture` to `Image` +- name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` diff --git a/vedo/__init__.py b/vedo/__init__.py index ea825f2e..9b260374 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -34,7 +34,7 @@ from vedo.assembly import * from vedo.pointcloud import * from vedo.mesh import * -from vedo.picture import * +from vedo.image import * from vedo.volume import * from vedo.tetmesh import * from vedo.addons import * diff --git a/vedo/picture.py b/vedo/image.py similarity index 100% rename from vedo/picture.py rename to vedo/image.py From c4eb72ff6dd946f127efb29c871f899520cd18ca Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 24 Oct 2023 22:09:11 +0200 Subject: [PATCH 152/251] fix picture import mistakes --- examples/basic/rotate_image.py | 2 +- examples/volumetric/image_fft.py | 2 +- examples/volumetric/image_to_mesh.py | 2 +- tests/common/test_pyplot.py | 4 +- vedo/applications.py | 2 +- vedo/backends.py | 4 +- vedo/cli.py | 2 +- vedo/core.py | 2 +- vedo/file_io.py | 4 +- vedo/image.py | 56 ++++++++++++++-------------- vedo/mesh.py | 8 ++-- vedo/plotter.py | 2 +- vedo/shapes.py | 4 +- vedo/visual.py | 2 +- 14 files changed, 48 insertions(+), 48 deletions(-) diff --git a/examples/basic/rotate_image.py b/examples/basic/rotate_image.py index dcf32460..37e66250 100644 --- a/examples/basic/rotate_image.py +++ b/examples/basic/rotate_image.py @@ -1,4 +1,4 @@ -"""Normal jpg/png pictures can be loaded, +"""Normal jpg/png image formats can be loaded, cropped, rotated and positioned in 3D.""" from vedo import Plotter, Image, dataurl diff --git a/examples/volumetric/image_fft.py b/examples/volumetric/image_fft.py index 53b996ef..3513aac0 100644 --- a/examples/volumetric/image_fft.py +++ b/examples/volumetric/image_fft.py @@ -1,4 +1,4 @@ -# 2D Fast Fourier Transform of a picture +# 2D Fast Fourier Transform of a image from vedo import Image, show # url = 'https://comps.canstockphoto.com/a-capital-silhouette-stock-illustrations_csp31110154.jpg' diff --git a/examples/volumetric/image_to_mesh.py b/examples/volumetric/image_to_mesh.py index 87f160c7..6f90ee15 100644 --- a/examples/volumetric/image_to_mesh.py +++ b/examples/volumetric/image_to_mesh.py @@ -1,4 +1,4 @@ -# Transform a picture into a mesh +# Transform a image into a mesh from vedo import Image, dataurl, show import numpy as np diff --git a/tests/common/test_pyplot.py b/tests/common/test_pyplot.py index 6267c281..f69e685f 100644 --- a/tests/common/test_pyplot.py +++ b/tests/common/test_pyplot.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from vedo import shapes, show, dataurl, settings -from vedo import Picture, Mesh, Points, Point +from vedo import Image, Mesh, Points, Point from vedo.pyplot import Figure, donut @@ -18,7 +18,7 @@ man = Mesh(dataurl+'man.vtk').scale(1.4).pos(7,4).rotate_x(-90, around=[7,4,0]) fig += man -pic = Picture("https://vedo.embl.es/examples/data/textures/bricks.jpg") +pic = Image("https://vedo.embl.es/examples/data/textures/bricks.jpg") fig += pic.scale(0.005).pos(2,10) fig += Points([[8,1],[10,3]], r=15) diff --git a/vedo/applications.py b/vedo/applications.py index 96faad7a..268de44c 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -1402,7 +1402,7 @@ def __init__(self, obj, init_points=(), closed=False, splined=True, **kwargs): else: self.object = obj - if isinstance(self.object, vedo.Picture): + if isinstance(self.object, vedo.Image): self.mode = "image" self.parallel_projection(True) diff --git a/vedo/backends.py b/vedo/backends.py index 3ddb3503..209f86dd 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -332,8 +332,8 @@ def start_k3d(actors2show): vedo.notebook_plotter += kobj ##################################################################### - elif isinstance(ia, vedo.Picture): - vedo.logger.error("Sorry Picture objects are not supported in k3d.") + elif isinstance(ia, vedo.Image): + vedo.logger.error("Sorry Image objects are not supported in k3d.") if plt and settings.backend_autoclose: plt.close() diff --git a/vedo/cli.py b/vedo/cli.py index fe710873..5e9a168c 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -40,7 +40,7 @@ from vedo import settings from vedo.colors import get_color, printc from vedo.mesh import Mesh -from vedo.picture import Image +from vedo.image import Image from vedo.plotter import Plotter from vedo.tetmesh import TetMesh from vedo.ugrid import UGrid diff --git a/vedo/core.py b/vedo/core.py index 7b362a47..cce5d8e1 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -431,7 +431,7 @@ def memory_size(self): return self.dataset.GetActualMemorySize() def modified(self): - """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" + """Use in conjunction with ``tonumpy()`` to update any modifications to the image array""" self.dataset.GetPointData().Modified() self.dataset.GetPointData().GetScalars().Modified() return self diff --git a/vedo/file_io.py b/vedo/file_io.py index 5165f241..9237de8c 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -15,7 +15,7 @@ from vedo import colors from vedo import utils from vedo.assembly import Assembly -from vedo.picture import Image +from vedo.image import Image from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume @@ -1161,7 +1161,7 @@ def _buildmesh(d): objs.append(vol) ### Image - elif d['type'].lower() == 'picture': + elif d['type'].lower() == 'picture' or d['type'].lower() == 'image': vimg = Image(d["array"]) _load_common(vimg, d) objs.append(vimg) diff --git a/vedo/image.py b/vedo/image.py index a0b99419..6bfb8f2e 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -41,7 +41,7 @@ def _get_img(obj, flip=False, translate=()): picr = vtk.vtkTIFFReader() picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: - colors.printc("Cannot understand picture format", obj, c="r") + colors.printc("Cannot understand image format", obj, c="r") return vtk.vtkImageData() picr.SetFileName(obj) picr.Update() @@ -141,7 +141,7 @@ def _set_justification(img, pos): class Image(vedo.visual.ImageVisual): """ - Class used to represent 2D pictures in a 3D world. + Class used to represent 2D images in a 3D world. """ def __init__(self, obj=None, channels=3): @@ -237,8 +237,8 @@ def _repr_html_(self): import base64 from PIL import Image - library_name = "vedo.picture.Image" - help_url = "https://vedo.embl.es/docs/vedo/picture.html" + library_name = "vedo.image.Image" + help_url = "https://vedo.embl.es/docs/vedo/image.html" arr = self.thumbnail(zoom=1.1) @@ -307,17 +307,17 @@ def _update(self, data): return self def dimensions(self): - """Return the picture dimension as number of pixels in x and y""" + """Return the image dimension as number of pixels in x and y""" nx, ny, _ = self.dataset.GetDimensions() return np.array([nx, ny]) @property def shape(self): - """Return the picture shape as number of pixels in x and y""" + """Return the image shape as number of pixels in x and y""" return self.dimensions() def channels(self): - """Return the number of channels in picture""" + """Return the number of channels in image""" return self.dataset.GetPointData().GetScalars().GetNumberOfComponents() def clone(self): @@ -394,7 +394,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): def extent(self, ext=None): """ - Get or set the physical extent that the picture spans. + Get or set the physical extent that the image spans. Format is `ext=[minx, maxx, miny, maxy]`. """ if ext is None: @@ -405,7 +405,7 @@ def extent(self, ext=None): return self def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): - """Crop picture. + """Crop image. Arguments: top : (float) @@ -443,7 +443,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): def pad(self, pixels=10, value=255): """ - Add the specified number of pixels at the picture borders. + Add the specified number of pixels at the image borders. Pixels can be a list formatted as [left,right,bottom,top]. Arguments: @@ -477,7 +477,7 @@ def pad(self, pixels=10, value=255): def tile(self, nx=4, ny=4, shift=(0, 0)): """ - Generate a tiling from the current picture by mirroring and repeating it. + Generate a tiling from the current image by mirroring and repeating it. Arguments: nx : (float) @@ -506,7 +506,7 @@ def tile(self, nx=4, ny=4, shift=(0, 0)): ) return pic - def append(self, pictures, axis="z", preserve_extents=False): + def append(self, images, axis="z", preserve_extents=False): """ Append the input images to the current one along the specified axis. Except for the append axis, all inputs must have the same extent. @@ -536,9 +536,9 @@ def append(self, pictures, axis="z", preserve_extents=False): """ ima = vtk.vtkImageAppend() ima.SetInputData(self.dataset) - if not utils.is_sequence(pictures): - pictures = [pictures] - for p in pictures: + if not utils.is_sequence(images): + images = [images] + for p in images: if isinstance(p, vtk.vtkImageData): ima.AddInputData(p) else: @@ -552,7 +552,7 @@ def append(self, pictures, axis="z", preserve_extents=False): ima.Update() self._update(ima.GetOutput()) self.pipeline = utils.OperationNode( - "append", comment=f"axis={axis}", parents=[self, *pictures], c="#f28482" + "append", comment=f"axis={axis}", parents=[self, *images], c="#f28482" ) return self @@ -560,7 +560,7 @@ def resize(self, newsize): """Resize the image resolution by specifying the number of pixels in width and height. If left to zero, it will be automatically calculated to keep the original aspect ratio. - newsize is the shape of picture as [npx, npy], or it can be also expressed as a fraction. + newsize is the shape of image as [npx, npy], or it can be also expressed as a fraction. """ old_dims = np.array(self.dataset.GetDimensions()) @@ -589,7 +589,7 @@ def resize(self, newsize): return self def mirror(self, axis="x"): - """Mirror picture along x or y axis. Same as `flip()`.""" + """Mirror image along x or y axis. Same as `flip()`.""" ff = vtk.vtkImageFlip() ff.SetInputData(self.dataset) if axis.lower() == "x": @@ -605,7 +605,7 @@ def mirror(self, axis="x"): return self def flip(self, axis="y"): - """Mirror picture along x or y axis. Same as `mirror()`.""" + """Mirror image along x or y axis. Same as `mirror()`.""" return self.mirror(axis=axis) def select(self, component): @@ -687,7 +687,7 @@ def median(self): def enhance(self): """ - Enhance a b&w picture using the laplacian, enhancing high-freq edges. + Enhance a b&w image using the laplacian, enhancing high-freq edges. Example: ```python @@ -730,7 +730,7 @@ def enhance(self): def fft(self, mode="magnitude", logscale=12, center=True): """ - Fast Fourier transform of a picture. + Fast Fourier transform of a image. Arguments: logscale : (float) @@ -787,7 +787,7 @@ def fft(self, mode="magnitude", logscale=12, center=True): return pic def rfft(self, mode="magnitude"): - """Reverse Fast Fourier transform of a picture.""" + """Reverse Fast Fourier transform of a image.""" ffti = vtk.vtkImageRFFT() ffti.SetInputData(self.dataset) @@ -939,7 +939,7 @@ def warp( ns = len(source_pts) nt = len(target_pts) if ns != nt: - colors.printc("Error in picture.warp(): #source != #target points", ns, nt, c="r") + colors.printc("Error in image.warp(): #source != #target points", ns, nt, c="r") raise RuntimeError() ptsou = vtk.vtkPoints() @@ -976,7 +976,7 @@ def warp( def invert(self): """ - Return an inverted picture (inverted in each color channel). + Return an inverted image (inverted in each color channel). """ rgb = self.tonumpy() data = 255 - np.array(rgb) @@ -1074,7 +1074,7 @@ def threshold(self, value=None, flip=False): return out def cmap(self, name, vmin=None, vmax=None): - """Colorize a picture with a colormap representing pixel intensity""" + """Colorize a image with a colormap representing pixel intensity""" n = self.dataset.GetPointData().GetNumberOfComponents() if n > 1: ecr = vtk.vtkImageExtractComponents() @@ -1187,7 +1187,7 @@ def tonumpy(self): Example: arr[:] = arr - 15 If the array is modified call: - ``picture.modified()`` + ``image.modified()`` when all your modifications are completed. """ nx, ny, _ = self.dataset.GetDimensions() @@ -1408,12 +1408,12 @@ def add_text( return self def modified(self): - """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" + """Use in conjunction with ``tonumpy()`` to update any modifications to the image array""" self.dataset.GetPointData().GetScalars().Modified() return self def write(self, filename): - """Write picture to file as png or jpg.""" + """Write image to file as png or jpg.""" vedo.file_io.write(self.dataset, filename) self.pipeline = utils.OperationNode( "write", diff --git a/vedo/mesh.py b/vedo/mesh.py index 79196788..6382de4f 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -291,9 +291,9 @@ def texture( Input tname can also be an array or a `vtkTexture`. Arguments: - tname : (numpy.array, str, Picture, vtkTexture, None) + tname : (numpy.array, str, Image, vtkTexture, None) the input texture to be applied. Can be a numpy array, a path to an image file, - a vedo Picture. The None value disables texture. + a vedo Image. The None value disables texture. tcoords : (numpy.array, str) this is the (u,v) texture coordinate array. Can also be a string of an existing array in the mesh. @@ -331,13 +331,13 @@ def texture( if isinstance(tname, vtk.vtkTexture): tu = tname - elif isinstance(tname, vedo.Picture): + elif isinstance(tname, vedo.Image): tu = vtk.vtkTexture() out_img = tname elif is_sequence(tname): tu = vtk.vtkTexture() - out_img = vedo.picture._get_img(tname) + out_img = vedo.image._get_img(tname) elif isinstance(tname, str): tu = vtk.vtkTexture() diff --git a/vedo/plotter.py b/vedo/plotter.py index 3cd54b08..17e24afd 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3466,7 +3466,7 @@ def toimage(self, scale=1): w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() - return vedo.picture.Image(w2if.GetOutput()) + return vedo.image.Image(w2if.GetOutput()) def export(self, filename="scene.npz", binary=False): """ diff --git a/vedo/shapes.py b/vedo/shapes.py index fc5f79a0..a9013baf 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -17,7 +17,7 @@ from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh -from vedo.picture import Picture +from vedo.image import Image __docformat__ = "google" @@ -4815,7 +4815,7 @@ def clear(self): return self -class Latex(Picture): +class Latex(Image): """ Render Latex text and formulas. """ diff --git a/vedo/visual.py b/vedo/visual.py index 027bb384..68b91a43 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2277,7 +2277,7 @@ def scalar_range(self): return self.dataset.GetScalarRange() def alpha(self, a=None): - """Set/get picture's transparency in the rendering scene.""" + """Set/get image's transparency in the rendering scene.""" if a is not None: self.properties.SetOpacity(a) return self From d4e2086f85914ae70344ba8d58e7be36a633c3c1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 12:43:55 +0200 Subject: [PATCH 153/251] new vtkclasses.py --- vedo/vtkclasses.py | 598 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 593 insertions(+), 5 deletions(-) diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 63bfaa7b..bb6109c4 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -3,11 +3,37 @@ """ Subset of vtk classes to be imported directly """ +import importlib + + +location = dict() +module_cache = {} + + +def get(module_name="", cls_name=""): + if not cls_name: + cls_name = module_name + module_name = location[cls_name] + module_name = "vtkmodules." + module_name + if module_name not in module_cache: + module = importlib.import_module(module_name) + module_cache[module_name] = module + if cls_name: + return getattr(module_cache[module_name], cls_name) + else: + return module_cache[module_name] + + +#################################################### + import vtkmodules.vtkCommonComputationalGeometry from vtkmodules.vtkCommonColor import vtkNamedColors +location["vtkNamedColors"] = "vtkCommonColor" + + from vtkmodules.vtkCommonCore import ( mutable, VTK_UNSIGNED_CHAR, @@ -43,9 +69,48 @@ vtkVariant, vtkVariantArray, vtkVersion, - vtkCommand, ) +as_strings = [ + "mutable", + "VTK_UNSIGNED_CHAR", + "VTK_UNSIGNED_SHORT", + "VTK_UNSIGNED_INT", + "VTK_UNSIGNED_LONG", + "VTK_UNSIGNED_LONG_LONG", + "VTK_UNSIGNED_CHAR", + "VTK_CHAR", + "VTK_SHORT", + "VTK_INT", + "VTK_LONG", + "VTK_LONG_LONG", + "VTK_FLOAT", + "VTK_DOUBLE", + "VTK_SIGNED_CHAR", + "VTK_ID_TYPE", + "VTK_VERSION_NUMBER", + "VTK_FONT_FILE", + "vtkArray", + "vtkIdTypeArray", + "vtkBitArray", + "vtkCharArray", + "vtkDoubleArray", + "vtkFloatArray", + "vtkIdList", + "vtkIntArray", + "vtkLookupTable", + "vtkMath", + "vtkPoints", + "vtkStringArray", + "vtkUnsignedCharArray", + "vtkVariant", + "vtkVariantArray", + "vtkVersion", +] +for name in as_strings: + location[name] = "vtkCommonCore" + + from vtkmodules.vtkCommonDataModel import ( VTK_HEXAHEDRON, VTK_TETRA, @@ -96,17 +161,76 @@ vtkWedge, ) +as_strings = [ + "VTK_HEXAHEDRON", + "VTK_TETRA", + "VTK_VOXEL", + "VTK_WEDGE", + "VTK_PYRAMID", + "VTK_HEXAGONAL_PRISM", + "VTK_PENTAGONAL_PRISM", + "vtkCellArray", + "vtkBox", + "vtkCellLocator", + "vtkCylinder", + "vtkDataSetAttributes", + "vtkDataObject", + "vtkDataSet", + "vtkFieldData", + "vtkHexagonalPrism", + "vtkHexahedron", + "vtkImageData", + "vtkImplicitDataSet", + "vtkImplicitSelectionLoop", + "vtkImplicitWindowFunction", + "vtkIterativeClosestPointTransform", + "vtkLine", + "vtkMultiBlockDataSet", + "vtkMutableDirectedGraph", + "vtkPentagonalPrism", + "vtkPlane", + "vtkPlanes", + "vtkPointLocator", + "vtkPolyData", + "vtkPolyLine", + "vtkPolyPlane", + "vtkPolygon", + "vtkPyramid", + "vtkQuadric", + "vtkRectilinearGrid", + "vtkSelection", + "vtkSelectionNode", + "vtkSphere", + "vtkStaticCellLocator", + "vtkStaticPointLocator", + "vtkStructuredGrid", + "vtkTetra", + "vtkTriangle", + "vtkUnstructuredGrid", + "vtkVoxel", + "vtkWedge", +] +for name in as_strings: + location[name] = "vtkCommonDataModel" + + from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm +location["vtkAlgorithm"] = "vtkCommonExecutionModel" from vtkmodules.vtkCommonMath import vtkMatrix4x4, vtkQuaternion +location["vtkMatrix4x4"] = "vtkCommonMath" +location["vtkQuaternion"] = "vtkCommonMath" from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, - vtkLinearTransform, vtkThinPlateSplineTransform, vtkTransform, ) +location["vtkHomogeneousTransform"] = "vtkCommonTransforms" +location["vtkLandmarkTransform"] = "vtkCommonTransforms" +location["vtkThinPlateSplineTransform"] = "vtkCommonTransforms" +location["vtkTransform"] = "vtkCommonTransforms" from vtkmodules.vtkFiltersCore import ( VTK_BEST_FITTING_PLANE, @@ -151,8 +275,59 @@ vtkWindowedSincPolyDataFilter, ) +as_strings = [ + "VTK_BEST_FITTING_PLANE", + "vtk3DLinearGridCrinkleExtractor", + "vtkAppendPolyData", + "vtkCellCenters", + "vtkCellDataToPointData", + "vtkCenterOfMass", + "vtkCleanPolyData", + "vtkClipPolyData", + "vtkPolyDataConnectivityFilter", + "vtkPolyDataEdgeConnectivityFilter", + "vtkContourFilter", + "vtkContourGrid", + "vtkCutter", + "vtkDecimatePro", + "vtkDelaunay2D", + "vtkDelaunay3D", + "vtkElevationFilter", + "vtkFeatureEdges", + "vtkFlyingEdges3D", + "vtkGlyph3D", + "vtkIdFilter", + "vtkImageAppend", + "vtkImplicitPolyDataDistance", + "vtkMarchingSquares", + "vtkMaskPoints", + "vtkMassProperties", + "vtkPointDataToCellData", + "vtkPolyDataNormals", + "vtkProbeFilter", + "vtkQuadricDecimation", + "vtkResampleWithDataSet", + "vtkReverseSense", + "vtkStripper", + "vtkTensorGlyph", + "vtkThreshold", + "vtkTriangleFilter", + "vtkTubeFilter", + "vtkUnstructuredGridQuadricDecimation", + "vtkVoronoi2D", + "vtkWindowedSincPolyDataFilter", +] +for name in as_strings: + location[name] = "vtkFiltersCore" + + try: - from vtkmodules.vtkFiltersCore import vtkStaticCleanUnstructuredGrid, vtkPolyDataPlaneCutter + from vtkmodules.vtkFiltersCore import ( + vtkStaticCleanUnstructuredGrid, + vtkPolyDataPlaneCutter, + ) + location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" + location["vtkPolyDataPlaneCutter"] = "vtkFiltersCore" except ImportError: pass @@ -163,12 +338,24 @@ vtkExtractPolyDataGeometry, vtkExtractSelection, ) +as_strings = [ + "vtkExtractCellsByType", + "vtkExtractGeometry", + "vtkExtractPolyDataGeometry", + "vtkExtractSelection", +] +for name in as_strings: + location[name] = "vtkFiltersExtraction" + try: - from vtkmodules.vtkFiltersExtraction import vtkExtractEdges # vtk9.0 + from vtkmodules.vtkFiltersExtraction import vtkExtractEdges # vtk9.0 + location["vtkExtractEdges"] = "vtkFiltersExtraction" except ImportError: - from vtkmodules.vtkFiltersCore import vtkExtractEdges # vtk9.2 + from vtkmodules.vtkFiltersCore import vtkExtractEdges # vtk9.2 + location["vtkExtractEdges"] = "vtkFiltersCore" from vtkmodules.vtkFiltersFlowPaths import vtkStreamTracer +location["vtkStreamTracer"] = "vtkFiltersFlowPaths" from vtkmodules.vtkFiltersGeneral import ( @@ -195,19 +382,52 @@ vtkRectilinearGridToTetrahedra, vtkVertexGlyphFilter, ) +as_strings = [ + "vtkBooleanOperationPolyDataFilter", + "vtkBoxClipDataSet", + "vtkCellValidator", + "vtkClipDataSet", + "vtkCountVertices", + "vtkContourTriangulator", + "vtkCurvatures", + "vtkDataSetTriangleFilter", + "vtkDensifyPolyData", + "vtkDistancePolyDataFilter", + "vtkGradientFilter", + "vtkIntersectionPolyDataFilter", + "vtkLoopBooleanPolyDataFilter", + "vtkMultiBlockDataGroupFilter", + "vtkTransformPolyDataFilter", + "vtkOBBTree", + "vtkQuantizePolyDataPoints", + "vtkRandomAttributeGenerator", + "vtkShrinkFilter", + "vtkShrinkPolyData", + "vtkRectilinearGridToTetrahedra", + "vtkVertexGlyphFilter", +] +for name in as_strings: + location[name] = "vtkFiltersGeneral" try: from vtkmodules.vtkCommonDataModel import vtkCellTreeLocator + location["vtkCellTreeLocator"] = "vtkCommonDataModel" except ImportError: from vtkmodules.vtkFiltersGeneral import vtkCellTreeLocator + location["vtkCellTreeLocator"] = "vtkFiltersGeneral" from vtkmodules.vtkFiltersGeometry import ( vtkGeometryFilter, vtkDataSetSurfaceFilter, vtkImageDataGeometryFilter, ) +location["vtkGeometryFilter"] = "vtkFiltersGeometry" +location["vtkDataSetSurfaceFilter"] = "vtkFiltersGeometry" +location["vtkImageDataGeometryFilter"] = "vtkFiltersGeometry" + try: from vtkmodules.vtkFiltersGeometry import vtkMarkBoundaryFilter + location["vtkMarkBoundaryFilter"] = "vtkFiltersGeometry" except ImportError: pass @@ -219,6 +439,16 @@ vtkProcrustesAlignmentFilter, vtkRenderLargeImage, ) +as_strings = [ + "vtkFacetReader", + "vtkImplicitModeller", + "vtkPolyDataSilhouette", + "vtkProcrustesAlignmentFilter", + "vtkRenderLargeImage", +] +for name in as_strings: + location[name] = "vtkFiltersHybrid" + from vtkmodules.vtkFiltersModeling import ( vtkAdaptiveSubdivisionFilter, @@ -240,14 +470,38 @@ vtkSelectPolyData, vtkSubdivideTetra, ) +as_strings = [ + "vtkAdaptiveSubdivisionFilter", + "vtkBandedPolyDataContourFilter", + "vtkButterflySubdivisionFilter", + "vtkContourLoopExtraction", + "vtkCookieCutter", + "vtkDijkstraGraphGeodesicPath", + "vtkFillHolesFilter", + "vtkHausdorffDistancePointSetFilter", + "vtkLinearExtrusionFilter", + "vtkLinearSubdivisionFilter", + "vtkLoopSubdivisionFilter", + "vtkRibbonFilter", + "vtkRotationalExtrusionFilter", + "vtkRuledSurfaceFilter", + "vtkSectorSource", + "vtkSelectEnclosedPoints", + "vtkSelectPolyData", + "vtkSubdivideTetra", +] +for name in as_strings: + location[name] = "vtkFiltersModeling" try: from vtkmodules.vtkFiltersModeling import vtkCollisionDetectionFilter + location["vtkCollisionDetectionFilter"] = "vtkFiltersModeling" except ImportError: pass try: from vtkmodules.vtkFiltersModeling import vtkImprintFilter + location["vtkImprintFilter"] = "vtkFiltersModeling" except ImportError: pass @@ -267,6 +521,25 @@ vtkSignedDistance, vtkVoronoiKernel, ) +as_strings = [ + "vtkConnectedPointsFilter", + "vtkDensifyPointCloudFilter", + "vtkEuclideanClusterExtraction", + "vtkExtractEnclosedPoints", + "vtkExtractSurface", + "vtkGaussianKernel", + "vtkLinearKernel", + "vtkPCANormalEstimation", + "vtkPointDensityFilter", + "vtkPointInterpolator", + "vtkRadiusOutlierRemoval", + "vtkShepardKernel", + "vtkSignedDistance", + "vtkVoronoiKernel", +] +for name in as_strings: + location[name] = "vtkFiltersPoints" + from vtkmodules.vtkFiltersSources import ( vtkArcSource, @@ -288,17 +561,45 @@ vtkTexturedSphereSource, vtkTessellatedBoxSource, ) +as_strings = [ + "vtkArcSource", + "vtkArrowSource", + "vtkConeSource", + "vtkCubeSource", + "vtkCylinderSource", + "vtkDiskSource", + "vtkFrustumSource", + "vtkGlyphSource2D", + "vtkGraphToPolyData", + "vtkLineSource", + "vtkOutlineCornerFilter", + "vtkParametricFunctionSource", + "vtkPlaneSource", + "vtkPointSource", + "vtkProgrammableSource", + "vtkSphereSource", + "vtkTexturedSphereSource", + "vtkTessellatedBoxSource", +] +for name in as_strings: + location[name] = "vtkFiltersSources" from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane +location["vtkTextureMapToPlane"] = "vtkFiltersTexture" from vtkmodules.vtkFiltersVerdict import vtkMeshQuality, vtkCellSizeFilter +location["vtkMeshQuality"] = "vtkFiltersVerdict" +location["vtkCellSizeFilter"] = "vtkFiltersVerdict" from vtkmodules.vtkImagingStencil import vtkPolyDataToImageStencil +location["vtkPolyDataToImageStencil"] = "vtkImagingStencil" from vtkmodules.vtkIOExport import vtkX3DExporter +location["vtkX3DExporter"] = "vtkIOExport" from vtkmodules.vtkIOExportGL2PS import vtkGL2PSExporter +location["vtkGL2PSExporter"] = "vtkIOExportGL2PS" from vtkmodules.vtkIOGeometry import ( vtkBYUReader, @@ -309,6 +610,18 @@ vtkSTLReader, vtkSTLWriter, ) +as_strings = [ + "vtkBYUReader", + "vtkFacetWriter", + "vtkOBJReader", + "vtkOpenFOAMReader", + "vtkParticleReader", + "vtkSTLReader", + "vtkSTLWriter", +] +for name in as_strings: + location[name] = "vtkIOGeometry" + from vtkmodules.vtkIOImage import ( vtkBMPReader, @@ -329,12 +642,37 @@ vtkTIFFReader, vtkTIFFWriter, ) +as_strings = [ + "vtkBMPReader", + "vtkBMPWriter", + "vtkDEMReader", + "vtkDICOMImageReader", + "vtkHDRReader", + "vtkJPEGReader", + "vtkJPEGWriter", + "vtkMetaImageReader", + "vtkMetaImageWriter", + "vtkNIFTIImageReader", + "vtkNIFTIImageWriter", + "vtkNrrdReader", + "vtkPNGReader", + "vtkPNGWriter", + "vtkSLCReader", + "vtkTIFFReader", + "vtkTIFFWriter", +] +for name in as_strings: + location[name] = "vtkIOImage" from vtkmodules.vtkIOImport import ( vtk3DSImporter, vtkOBJImporter, vtkVRMLImporter, ) +location["vtk3DSImporter"] = "vtkIOImport" +location["vtkOBJImporter"] = "vtkIOImport" +location["vtkVRMLImporter"] = "vtkIOImport" + from vtkmodules.vtkIOLegacy import ( vtkSimplePointsWriter, @@ -346,8 +684,23 @@ vtkRectilinearGridReader, vtkUnstructuredGridReader, ) +as_strings = [ + "vtkSimplePointsWriter", + "vtkStructuredGridReader", + "vtkStructuredPointsReader", + "vtkDataSetReader", + "vtkDataSetWriter", + "vtkPolyDataWriter", + "vtkRectilinearGridReader", + "vtkUnstructuredGridReader", +] +for name in as_strings: + location[name] = "vtkIOLegacy" + from vtkmodules.vtkIOPLY import vtkPLYReader, vtkPLYWriter +location["vtkPLYReader"] = "vtkIOPLY" +location["vtkPLYWriter"] = "vtkIOPLY" from vtkmodules.vtkIOXML import ( vtkXMLGenericDataObjectReader, @@ -364,11 +717,31 @@ vtkXMLUnstructuredGridReader, vtkXMLUnstructuredGridWriter, ) +as_strings = [ + "vtkXMLGenericDataObjectReader", + "vtkXMLImageDataReader", + "vtkXMLImageDataWriter", + "vtkXMLMultiBlockDataReader", + "vtkXMLMultiBlockDataWriter", + "vtkXMLPRectilinearGridReader", + "vtkXMLPUnstructuredGridReader", + "vtkXMLPolyDataReader", + "vtkXMLPolyDataWriter", + "vtkXMLRectilinearGridReader", + "vtkXMLStructuredGridReader", + "vtkXMLUnstructuredGridReader", + "vtkXMLUnstructuredGridWriter", +] +for name in as_strings: + location[name] = "vtkIOXML" + from vtkmodules.vtkImagingColor import ( vtkImageLuminance, vtkImageMapToWindowLevelColors, ) +location["vtkImageLuminance"] = "vtkImagingColor" +location["vtkImageMapToWindowLevelColors"] = "vtkImagingColor" from vtkmodules.vtkImagingCore import ( vtkExtractVOI, @@ -387,6 +760,24 @@ vtkImageThreshold, vtkImageTranslateExtent, ) +as_strings = [ + "vtkImageAppendComponents", + "vtkImageBlend", + "vtkImageCast", + "vtkImageConstantPad", + "vtkImageExtractComponents", + "vtkImageFlip", + "vtkImageMapToColors", + "vtkImageMirrorPad", + "vtkImagePermute", + "vtkImageResample", + "vtkImageResize", + "vtkImageReslice", + "vtkImageThreshold", + "vtkImageTranslateExtent", +] +for name in as_strings: + location[name] = "vtkImagingCore" from vtkmodules.vtkImagingFourier import ( vtkImageButterworthHighPass, @@ -395,6 +786,15 @@ vtkImageFourierCenter, vtkImageRFFT, ) +as_strings = [ + "vtkImageButterworthHighPass", + "vtkImageButterworthLowPass", + "vtkImageFFT", + "vtkImageFourierCenter", + "vtkImageRFFT", +] +for name in as_strings: + location[name] = "vtkImagingFourier" from vtkmodules.vtkImagingGeneral import ( vtkImageCorrelation, @@ -406,6 +806,18 @@ vtkImageMedian3D, vtkImageNormalize, ) +as_strings = [ + "vtkImageCorrelation", + "vtkImageEuclideanDistance", + "vtkImageGaussianSmooth", + "vtkImageGradient", + "vtkImageHybridMedian2D", + "vtkImageLaplacian", + "vtkImageMedian3D", + "vtkImageNormalize", +] +for name in as_strings: + location[name] = "vtkImagingGeneral" from vtkmodules.vtkImagingHybrid import vtkImageToPoints, vtkSampleFunction from vtkmodules.vtkImagingMath import ( @@ -415,14 +827,33 @@ vtkImageMagnitude, vtkImageMathematics, ) +as_strings = [ + "vtkImageDivergence", + "vtkImageDotProduct", + "vtkImageLogarithmicScale", + "vtkImageMagnitude", + "vtkImageMathematics", +] +for name in as_strings: + location[name] = "vtkImagingMath" from vtkmodules.vtkImagingMorphological import ( vtkImageContinuousDilate3D, vtkImageContinuousErode3D, ) +as_strings = [ + "vtkImageContinuousDilate3D", + "vtkImageContinuousErode3D", +] +for name in as_strings: + location[name] = "vtkImagingMorphological" from vtkmodules.vtkImagingSources import vtkImageCanvasSource2D +location["vtkImageCanvasSource2D"] = "vtkImagingSources" + from vtkmodules.vtkImagingStencil import vtkImageStencil +location["vtkImageStencil"] = "vtkImagingStencil" + from vtkmodules.vtkInfovisLayout import ( vtkCircularLayoutStrategy, vtkClustering2DLayoutStrategy, @@ -434,6 +865,19 @@ vtkSimple3DCirclesStrategy, vtkSpanTreeLayoutStrategy, ) +as_strings = [ + "vtkCircularLayoutStrategy", + "vtkClustering2DLayoutStrategy", + "vtkConeLayoutStrategy", + "vtkFast2DLayoutStrategy", + "vtkForceDirectedLayoutStrategy", + "vtkGraphLayout", + "vtkSimple2DLayoutStrategy", + "vtkSimple3DCirclesStrategy", + "vtkSpanTreeLayoutStrategy", +] +for name in as_strings: + location[name] = "vtkInfovisLayout" from vtkmodules.vtkInteractionStyle import ( vtkInteractorStyleFlight, @@ -450,7 +894,25 @@ vtkInteractorStyleUser, ) +as_strings = [ + "vtkInteractorStyleFlight", + "vtkInteractorStyleImage", + "vtkInteractorStyleJoystickActor", + "vtkInteractorStyleJoystickCamera", + "vtkInteractorStyleRubberBand2D", + "vtkInteractorStyleRubberBand3D", + "vtkInteractorStyleRubberBandZoom", + "vtkInteractorStyleTerrain", + "vtkInteractorStyleTrackballActor", + "vtkInteractorStyleTrackballCamera", + "vtkInteractorStyleUnicam", + "vtkInteractorStyleUser", +] +for name in as_strings: + location[name] = "vtkInteractionStyle" + from vtkmodules.vtkInteractionWidgets import ( + vtkBalloonRepresentation, vtkBalloonWidget, vtkBoxWidget, vtkContourWidget, @@ -458,6 +920,7 @@ vtkFocalPlanePointPlacer, vtkImplicitPlaneWidget, vtkOrientationMarkerWidget, + vtkOrientedGlyphContourRepresentation, vtkPolygonalSurfacePointPlacer, vtkSliderRepresentation2D, vtkSliderRepresentation3D, @@ -465,8 +928,28 @@ vtkSphereWidget, ) +as_strings = [ + "vtkBalloonRepresentation", + "vtkBalloonWidget", + "vtkBoxWidget", + "vtkContourWidget", + "vtkPlaneWidget", + "vtkFocalPlanePointPlacer", + "vtkImplicitPlaneWidget", + "vtkOrientationMarkerWidget", + "vtkOrientedGlyphContourRepresentation", + "vtkPolygonalSurfacePointPlacer", + "vtkSliderRepresentation2D", + "vtkSliderRepresentation3D", + "vtkSliderWidget", + "vtkSphereWidget", +] +for name in as_strings: + location[name] = "vtkInteractionWidgets" + try: from vtkmodules.vtkInteractionWidgets import vtkCameraOrientationWidget + location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" except ImportError: pass @@ -483,6 +966,22 @@ vtkScalarBarActor, vtkXYPlotActor, ) +as_strings = [ + "vtkAnnotatedCubeActor", + "vtkAxesActor", + "vtkAxisActor2D", + "vtkCaptionActor2D", + "vtkCornerAnnotation", + "vtkCubeAxesActor", + "vtkLegendBoxActor", + "vtkLegendScaleActor", + "vtkPolarAxesActor", + "vtkScalarBarActor", + "vtkXYPlotActor", +] +for name in as_strings: + location[name] = "vtkRenderingAnnotation" + from vtkmodules.vtkRenderingCore import ( vtkActor, @@ -532,12 +1031,65 @@ vtkVolumeProperty, vtkWindowToImageFilter, ) +as_strings = [ + "vtkActor", + "vtkActor2D", + "vtkAreaPicker", + "vtkAssembly", + "vtkBillboardTextActor3D", + "vtkCamera", + "vtkCameraInterpolator", + "vtkColorTransferFunction", + "vtkCoordinate", + "vtkDataSetMapper", + "vtkDistanceToCamera", + "vtkFlagpoleLabel", + "vtkFollower", + "vtkHierarchicalPolyDataMapper", + "vtkImageActor", + "vtkImageMapper", + "vtkImageProperty", + "vtkImageSlice", + "vtkInteractorEventRecorder", + "vtkInteractorObserver", + "vtkLight", + "vtkLogLookupTable", + "vtkMapper", + "vtkPointGaussianMapper", + "vtkPolyDataMapper", + "vtkPolyDataMapper2D", + "vtkProp", + "vtkProp3D", + "vtkPropAssembly", + "vtkPropCollection", + "vtkPropPicker", + "vtkProperty", + "vtkRenderWindow", + "vtkRenderer", + "vtkRenderWindowInteractor", + "vtkSelectVisiblePoints", + "vtkSkybox", + "vtkTextActor", + "vtkTextMapper", + "vtkTextProperty", + "vtkTextRenderer", + "vtkTexture", + "vtkViewport", + "vtkVolume", + "vtkVolumeProperty", + "vtkWindowToImageFilter", +] +for name in as_strings: + location[name] = "vtkRenderingCore" from vtkmodules.vtkRenderingFreeType import vtkVectorText +location["vtkVectorText"] = "vtkRenderingFreeType" from vtkmodules.vtkRenderingImage import vtkImageResliceMapper +location["vtkImageResliceMapper"] = "vtkRenderingImage" from vtkmodules.vtkRenderingLabel import vtkLabeledDataMapper +location["vtkLabeledDataMapper"] = "vtkRenderingLabel" from vtkmodules.vtkRenderingOpenGL2 import ( vtkDepthOfFieldPass, @@ -555,6 +1107,24 @@ vtkTranslucentPass, vtkVolumetricPass, ) +as_strings = [ + "vtkDepthOfFieldPass", + "vtkCameraPass", + "vtkDualDepthPeelingPass", + "vtkEquirectangularToCubeMapTexture", + "vtkLightsPass", + "vtkOpaquePass", + "vtkOverlayPass", + "vtkRenderPassCollection", + "vtkSSAOPass", + "vtkSequencePass", + "vtkShader", + "vtkShadowMapPass", + "vtkTranslucentPass", + "vtkVolumetricPass", +] +for name in as_strings: + location[name] = "vtkRenderingOpenGL2" from vtkmodules.vtkRenderingVolume import ( vtkFixedPointVolumeRayCastMapper, @@ -563,10 +1133,28 @@ vtkUnstructuredGridVolumeRayCastMapper, vtkUnstructuredGridVolumeZSweepMapper, ) +as_strings = [ + "vtkFixedPointVolumeRayCastMapper", + "vtkGPUVolumeRayCastMapper", + "vtkProjectedTetrahedraMapper", + "vtkUnstructuredGridVolumeRayCastMapper", + "vtkUnstructuredGridVolumeZSweepMapper", +] +for name in as_strings: + location[name] = "vtkRenderingVolume" from vtkmodules.vtkRenderingVolumeOpenGL2 import ( vtkOpenGLGPUVolumeRayCastMapper, vtkSmartVolumeMapper, ) +as_strings = [ + "vtkOpenGLGPUVolumeRayCastMapper", + "vtkSmartVolumeMapper", +] +for name in as_strings: + location[name] = "vtkRenderingVolumeOpenGL2" +######################################################### # print("successfully finished importing vtkmodules") +del as_strings +del name From 576708f1fa5ae66b7c2516c44c6023a802df2db7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 12:44:43 +0200 Subject: [PATCH 154/251] add docs/vtkmodules_9.2.6_hierarchy.txt --- docs/vtkmodules_9.2.6_hierarchy.txt | 4188 +++++++++++++++++++++++++++ 1 file changed, 4188 insertions(+) create mode 100644 docs/vtkmodules_9.2.6_hierarchy.txt diff --git a/docs/vtkmodules_9.2.6_hierarchy.txt b/docs/vtkmodules_9.2.6_hierarchy.txt new file mode 100644 index 00000000..87707a22 --- /dev/null +++ b/docs/vtkmodules_9.2.6_hierarchy.txt @@ -0,0 +1,4188 @@ +vtkmodules.generate_pyi.Graph +vtkmodules.generate_pyi.Node +vtkmodules.generate_pyi.add_indent +vtkmodules.generate_pyi.annotation_text +vtkmodules.generate_pyi.argparse +vtkmodules.generate_pyi.ast +vtkmodules.generate_pyi.build_graph +vtkmodules.generate_pyi.builtins +vtkmodules.generate_pyi.class_pyi +vtkmodules.generate_pyi.fix_annotations +vtkmodules.generate_pyi.get_constructors +vtkmodules.generate_pyi.get_signatures +vtkmodules.generate_pyi.handle_static +vtkmodules.generate_pyi.has_self +vtkmodules.generate_pyi.identifier +vtkmodules.generate_pyi.importlib +vtkmodules.generate_pyi.indent +vtkmodules.generate_pyi.inspect +vtkmodules.generate_pyi.isclass +vtkmodules.generate_pyi.isenum +vtkmodules.generate_pyi.ismethod +vtkmodules.generate_pyi.isnamespace +vtkmodules.generate_pyi.isvtkmethod +vtkmodules.generate_pyi.keychar +vtkmodules.generate_pyi.m +vtkmodules.generate_pyi.main +vtkmodules.generate_pyi.module_pyi +vtkmodules.generate_pyi.namespace_pyi +vtkmodules.generate_pyi.o +vtkmodules.generate_pyi.os +vtkmodules.generate_pyi.parse_error +vtkmodules.generate_pyi.push_signature +vtkmodules.generate_pyi.re +vtkmodules.generate_pyi.sorted_graph +vtkmodules.generate_pyi.sorted_graph_helper +vtkmodules.generate_pyi.string +vtkmodules.generate_pyi.sys +vtkmodules.generate_pyi.template +vtkmodules.generate_pyi.topologically_sorted_items +vtkmodules.generate_pyi.typename +vtkmodules.generate_pyi.typename_forward +vtkmodules.generate_pyi.types +vtkmodules.generate_pyi.vtkObject +vtkmodules.generate_pyi.vtkSOADataArrayTemplate +vtkmodules.generate_pyi.vtkmethod +vtkmodules.numpy_interface.algorithms._apply_func2 +vtkmodules.numpy_interface.algorithms._array_count +vtkmodules.numpy_interface.algorithms._global_func +vtkmodules.numpy_interface.algorithms._global_per_block +vtkmodules.numpy_interface.algorithms._local_array_count +vtkmodules.numpy_interface.algorithms._lookup_mpi_type +vtkmodules.numpy_interface.algorithms._make_dfunc +vtkmodules.numpy_interface.algorithms._make_dsfunc +vtkmodules.numpy_interface.algorithms._make_dsfunc2 +vtkmodules.numpy_interface.algorithms._make_ufunc +vtkmodules.numpy_interface.algorithms._reduce_dims +vtkmodules.numpy_interface.algorithms.abs +vtkmodules.numpy_interface.algorithms.absolute_import +vtkmodules.numpy_interface.algorithms.add +vtkmodules.numpy_interface.algorithms.algs +vtkmodules.numpy_interface.algorithms.all +vtkmodules.numpy_interface.algorithms.apply_dfunc +vtkmodules.numpy_interface.algorithms.apply_ufunc +vtkmodules.numpy_interface.algorithms.arccos +vtkmodules.numpy_interface.algorithms.arccosh +vtkmodules.numpy_interface.algorithms.arcsin +vtkmodules.numpy_interface.algorithms.arcsinh +vtkmodules.numpy_interface.algorithms.arctan +vtkmodules.numpy_interface.algorithms.arctan2 +vtkmodules.numpy_interface.algorithms.arctanh +vtkmodules.numpy_interface.algorithms.area +vtkmodules.numpy_interface.algorithms.aspect +vtkmodules.numpy_interface.algorithms.aspect_gamma +vtkmodules.numpy_interface.algorithms.bitwise_or +vtkmodules.numpy_interface.algorithms.ceil +vtkmodules.numpy_interface.algorithms.condition +vtkmodules.numpy_interface.algorithms.cos +vtkmodules.numpy_interface.algorithms.cosh +vtkmodules.numpy_interface.algorithms.count_per_block +vtkmodules.numpy_interface.algorithms.cross +vtkmodules.numpy_interface.algorithms.curl +vtkmodules.numpy_interface.algorithms.det +vtkmodules.numpy_interface.algorithms.determinant +vtkmodules.numpy_interface.algorithms.diagonal +vtkmodules.numpy_interface.algorithms.divergence +vtkmodules.numpy_interface.algorithms.divide +vtkmodules.numpy_interface.algorithms.dot +vtkmodules.numpy_interface.algorithms.dsa +vtkmodules.numpy_interface.algorithms.eigenvalue +vtkmodules.numpy_interface.algorithms.eigenvector +vtkmodules.numpy_interface.algorithms.exp +vtkmodules.numpy_interface.algorithms.expand_dims +vtkmodules.numpy_interface.algorithms.flatnonzero +vtkmodules.numpy_interface.algorithms.floor +vtkmodules.numpy_interface.algorithms.gradient +vtkmodules.numpy_interface.algorithms.hypot +vtkmodules.numpy_interface.algorithms.in1d +vtkmodules.numpy_interface.algorithms.inv +vtkmodules.numpy_interface.algorithms.inverse +vtkmodules.numpy_interface.algorithms.isnan +vtkmodules.numpy_interface.algorithms.itertools +vtkmodules.numpy_interface.algorithms.izip +vtkmodules.numpy_interface.algorithms.jacobian +vtkmodules.numpy_interface.algorithms.laplacian +vtkmodules.numpy_interface.algorithms.ln +vtkmodules.numpy_interface.algorithms.log +vtkmodules.numpy_interface.algorithms.log10 +vtkmodules.numpy_interface.algorithms.logical_not +vtkmodules.numpy_interface.algorithms.mag +vtkmodules.numpy_interface.algorithms.make_cell_mask_from_NaNs +vtkmodules.numpy_interface.algorithms.make_mask_from_NaNs +vtkmodules.numpy_interface.algorithms.make_point_mask_from_NaNs +vtkmodules.numpy_interface.algorithms.make_vector +vtkmodules.numpy_interface.algorithms.max +vtkmodules.numpy_interface.algorithms.max_angle +vtkmodules.numpy_interface.algorithms.max_per_block +vtkmodules.numpy_interface.algorithms.mean +vtkmodules.numpy_interface.algorithms.mean_per_block +vtkmodules.numpy_interface.algorithms.min +vtkmodules.numpy_interface.algorithms.min_angle +vtkmodules.numpy_interface.algorithms.min_per_block +vtkmodules.numpy_interface.algorithms.mod +vtkmodules.numpy_interface.algorithms.multiply +vtkmodules.numpy_interface.algorithms.negative +vtkmodules.numpy_interface.algorithms.nonzero +vtkmodules.numpy_interface.algorithms.norm +vtkmodules.numpy_interface.algorithms.numpy +vtkmodules.numpy_interface.algorithms.power +vtkmodules.numpy_interface.algorithms.reciprocal +vtkmodules.numpy_interface.algorithms.remainder +vtkmodules.numpy_interface.algorithms.rint +vtkmodules.numpy_interface.algorithms.shape +vtkmodules.numpy_interface.algorithms.shear +vtkmodules.numpy_interface.algorithms.sin +vtkmodules.numpy_interface.algorithms.sinh +vtkmodules.numpy_interface.algorithms.skew +vtkmodules.numpy_interface.algorithms.sqrt +vtkmodules.numpy_interface.algorithms.square +vtkmodules.numpy_interface.algorithms.std +vtkmodules.numpy_interface.algorithms.strain +vtkmodules.numpy_interface.algorithms.subtract +vtkmodules.numpy_interface.algorithms.sum +vtkmodules.numpy_interface.algorithms.sum_per_block +vtkmodules.numpy_interface.algorithms.surface_normal +vtkmodules.numpy_interface.algorithms.sys +vtkmodules.numpy_interface.algorithms.tan +vtkmodules.numpy_interface.algorithms.tanh +vtkmodules.numpy_interface.algorithms.trace +vtkmodules.numpy_interface.algorithms.unstructured_from_composite_arrays +vtkmodules.numpy_interface.algorithms.var +vtkmodules.numpy_interface.algorithms.vertex_normal +vtkmodules.numpy_interface.algorithms.volume +vtkmodules.numpy_interface.algorithms.vorticity +vtkmodules.numpy_interface.algorithms.vtkMPI4PyCommunicator +vtkmodules.numpy_interface.algorithms.vtkMultiProcessController +vtkmodules.numpy_interface.algorithms.where +vtkmodules.numpy_interface.dataset_adapter.ArrayAssociation +vtkmodules.numpy_interface.dataset_adapter.CompositeDataIterator +vtkmodules.numpy_interface.dataset_adapter.CompositeDataSet +vtkmodules.numpy_interface.dataset_adapter.CompositeDataSetAttributes +vtkmodules.numpy_interface.dataset_adapter.DataObject +vtkmodules.numpy_interface.dataset_adapter.DataSet +vtkmodules.numpy_interface.dataset_adapter.DataSetAttributes +vtkmodules.numpy_interface.dataset_adapter.Graph +vtkmodules.numpy_interface.dataset_adapter.HyperTreeGrid +vtkmodules.numpy_interface.dataset_adapter.Molecule +vtkmodules.numpy_interface.dataset_adapter.MultiCompositeDataIterator +vtkmodules.numpy_interface.dataset_adapter.NoneArray +vtkmodules.numpy_interface.dataset_adapter.PointSet +vtkmodules.numpy_interface.dataset_adapter.PolyData +vtkmodules.numpy_interface.dataset_adapter.Table +vtkmodules.numpy_interface.dataset_adapter.UnstructuredGrid +vtkmodules.numpy_interface.dataset_adapter.VTKArray +vtkmodules.numpy_interface.dataset_adapter.VTKArrayMetaClass +vtkmodules.numpy_interface.dataset_adapter.VTKCompositeDataArray +vtkmodules.numpy_interface.dataset_adapter.VTKCompositeDataArrayMetaClass +vtkmodules.numpy_interface.dataset_adapter.VTKNoneArray +vtkmodules.numpy_interface.dataset_adapter.VTKNoneArrayMetaClass +vtkmodules.numpy_interface.dataset_adapter.VTKObjectWrapper +vtkmodules.numpy_interface.dataset_adapter.WrapDataObject +vtkmodules.numpy_interface.dataset_adapter._make_tensor_array_contiguous +vtkmodules.numpy_interface.dataset_adapter._metaclass +vtkmodules.numpy_interface.dataset_adapter.buffer_shared +vtkmodules.numpy_interface.dataset_adapter.itertools +vtkmodules.numpy_interface.dataset_adapter.izip +vtkmodules.numpy_interface.dataset_adapter.numpy +vtkmodules.numpy_interface.dataset_adapter.numpyTovtkDataArray +vtkmodules.numpy_interface.dataset_adapter.numpy_support +vtkmodules.numpy_interface.dataset_adapter.operator +vtkmodules.numpy_interface.dataset_adapter.reshape_append_ones +vtkmodules.numpy_interface.dataset_adapter.sys +vtkmodules.numpy_interface.dataset_adapter.vtkDataArrayToVTKArray +vtkmodules.numpy_interface.dataset_adapter.vtkDataObject +vtkmodules.numpy_interface.dataset_adapter.vtkWeakReference +vtkmodules.numpy_interface.dataset_adapter.weakref +vtkmodules.numpy_interface.internal_algorithms._cell_derivatives +vtkmodules.numpy_interface.internal_algorithms._cell_quality +vtkmodules.numpy_interface.internal_algorithms._matrix_math_filter +vtkmodules.numpy_interface.internal_algorithms.abs +vtkmodules.numpy_interface.internal_algorithms.absolute_import +vtkmodules.numpy_interface.internal_algorithms.all +vtkmodules.numpy_interface.internal_algorithms.area +vtkmodules.numpy_interface.internal_algorithms.aspect +vtkmodules.numpy_interface.internal_algorithms.aspect_gamma +vtkmodules.numpy_interface.internal_algorithms.condition +vtkmodules.numpy_interface.internal_algorithms.cross +vtkmodules.numpy_interface.internal_algorithms.curl +vtkmodules.numpy_interface.internal_algorithms.det +vtkmodules.numpy_interface.internal_algorithms.determinant +vtkmodules.numpy_interface.internal_algorithms.diagonal +vtkmodules.numpy_interface.internal_algorithms.divergence +vtkmodules.numpy_interface.internal_algorithms.dot +vtkmodules.numpy_interface.internal_algorithms.dsa +vtkmodules.numpy_interface.internal_algorithms.eigenvalue +vtkmodules.numpy_interface.internal_algorithms.eigenvector +vtkmodules.numpy_interface.internal_algorithms.gradient +vtkmodules.numpy_interface.internal_algorithms.inv +vtkmodules.numpy_interface.internal_algorithms.inverse +vtkmodules.numpy_interface.internal_algorithms.jacobian +vtkmodules.numpy_interface.internal_algorithms.laplacian +vtkmodules.numpy_interface.internal_algorithms.ln +vtkmodules.numpy_interface.internal_algorithms.log +vtkmodules.numpy_interface.internal_algorithms.log10 +vtkmodules.numpy_interface.internal_algorithms.mag +vtkmodules.numpy_interface.internal_algorithms.make_vector +vtkmodules.numpy_interface.internal_algorithms.max +vtkmodules.numpy_interface.internal_algorithms.max_angle +vtkmodules.numpy_interface.internal_algorithms.mean +vtkmodules.numpy_interface.internal_algorithms.min +vtkmodules.numpy_interface.internal_algorithms.min_angle +vtkmodules.numpy_interface.internal_algorithms.norm +vtkmodules.numpy_interface.internal_algorithms.numpy +vtkmodules.numpy_interface.internal_algorithms.numpy_support +vtkmodules.numpy_interface.internal_algorithms.shear +vtkmodules.numpy_interface.internal_algorithms.skew +vtkmodules.numpy_interface.internal_algorithms.strain +vtkmodules.numpy_interface.internal_algorithms.sum +vtkmodules.numpy_interface.internal_algorithms.surface_normal +vtkmodules.numpy_interface.internal_algorithms.trace +vtkmodules.numpy_interface.internal_algorithms.var +vtkmodules.numpy_interface.internal_algorithms.vertex_normal +vtkmodules.numpy_interface.internal_algorithms.volume +vtkmodules.numpy_interface.internal_algorithms.vorticity +vtkmodules.numpy_interface.internal_algorithms.vtkCellDataToPointData +vtkmodules.numpy_interface.internal_algorithms.vtkCellDerivatives +vtkmodules.numpy_interface.internal_algorithms.vtkCellQuality +vtkmodules.numpy_interface.internal_algorithms.vtkCellSizeFilter +vtkmodules.numpy_interface.internal_algorithms.vtkImageData +vtkmodules.numpy_interface.internal_algorithms.vtkMatrixMathFilter +vtkmodules.numpy_interface.internal_algorithms.vtkPolyDataNormals +vtkmodules.qt.PyQtImpl +vtkmodules.qt.QVTKRWIBase +vtkmodules.qt.impl +vtkmodules.qt.importlib +vtkmodules.qt.sys +vtkmodules.qt.QVTKRenderWindowInteractor.ConnectionType +vtkmodules.qt.QVTKRenderWindowInteractor.CursorShape +vtkmodules.qt.QVTKRenderWindowInteractor.EventType +vtkmodules.qt.QVTKRenderWindowInteractor.FocusPolicy +vtkmodules.qt.QVTKRenderWindowInteractor.Key +vtkmodules.qt.QVTKRenderWindowInteractor.KeyboardModifier +vtkmodules.qt.QVTKRenderWindowInteractor.MiddleButton +vtkmodules.qt.QVTKRenderWindowInteractor.MouseButton +vtkmodules.qt.QVTKRenderWindowInteractor.PyQt5 +vtkmodules.qt.QVTKRenderWindowInteractor.PyQtImpl +vtkmodules.qt.QVTKRenderWindowInteractor.QApplication +vtkmodules.qt.QVTKRenderWindowInteractor.QCursor +vtkmodules.qt.QVTKRenderWindowInteractor.QEvent +vtkmodules.qt.QVTKRenderWindowInteractor.QMainWindow +vtkmodules.qt.QVTKRenderWindowInteractor.QObject +vtkmodules.qt.QVTKRenderWindowInteractor.QSize +vtkmodules.qt.QVTKRenderWindowInteractor.QSizePolicy +vtkmodules.qt.QVTKRenderWindowInteractor.QTimer +vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRWIBase +vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRWIBaseClass +vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRenderWidgetConeExample +vtkmodules.qt.QVTKRenderWindowInteractor.QVTKRenderWindowInteractor +vtkmodules.qt.QVTKRenderWindowInteractor.QWidget +vtkmodules.qt.QVTKRenderWindowInteractor.Qt +vtkmodules.qt.QVTKRenderWindowInteractor.SizePolicy +vtkmodules.qt.QVTKRenderWindowInteractor.WidgetAttribute +vtkmodules.qt.QVTKRenderWindowInteractor.WindowType +vtkmodules.qt.QVTKRenderWindowInteractor._get_event_pos +vtkmodules.qt.QVTKRenderWindowInteractor._keysyms +vtkmodules.qt.QVTKRenderWindowInteractor._keysyms_for_ascii +vtkmodules.qt.QVTKRenderWindowInteractor.vtkGenericRenderWindowInteractor +vtkmodules.qt.QVTKRenderWindowInteractor.vtkRenderWindow +vtkmodules.qt.QVTKRenderWindowInteractor.vtkmodules +vtkmodules.util.misc +vtkmodules.util.numpy_support +vtkmodules.util.vtkConstants +vtkmodules.util.vtkMethodParser +vtkmodules.util.vtkVariant +vtkmodules.util.colors.alice_blue +vtkmodules.util.colors.alizarin_crimson +vtkmodules.util.colors.antique_white +vtkmodules.util.colors.aquamarine +vtkmodules.util.colors.aquamarine_medium +vtkmodules.util.colors.aureoline_yellow +vtkmodules.util.colors.azure +vtkmodules.util.colors.banana +vtkmodules.util.colors.beige +vtkmodules.util.colors.bisque +vtkmodules.util.colors.black +vtkmodules.util.colors.blanched_almond +vtkmodules.util.colors.blue +vtkmodules.util.colors.blue_light +vtkmodules.util.colors.blue_medium +vtkmodules.util.colors.blue_violet +vtkmodules.util.colors.brick +vtkmodules.util.colors.brown +vtkmodules.util.colors.brown_madder +vtkmodules.util.colors.brown_ochre +vtkmodules.util.colors.burlywood +vtkmodules.util.colors.burnt_sienna +vtkmodules.util.colors.burnt_umber +vtkmodules.util.colors.cadet +vtkmodules.util.colors.cadmium_lemon +vtkmodules.util.colors.cadmium_orange +vtkmodules.util.colors.cadmium_red_deep +vtkmodules.util.colors.cadmium_red_light +vtkmodules.util.colors.cadmium_yellow +vtkmodules.util.colors.cadmium_yellow_light +vtkmodules.util.colors.carrot +vtkmodules.util.colors.cerulean +vtkmodules.util.colors.chartreuse +vtkmodules.util.colors.chocolate +vtkmodules.util.colors.chrome_oxide_green +vtkmodules.util.colors.cinnabar_green +vtkmodules.util.colors.cobalt +vtkmodules.util.colors.cobalt_green +vtkmodules.util.colors.cobalt_violet_deep +vtkmodules.util.colors.cold_grey +vtkmodules.util.colors.coral +vtkmodules.util.colors.coral_light +vtkmodules.util.colors.cornflower +vtkmodules.util.colors.cornsilk +vtkmodules.util.colors.cyan +vtkmodules.util.colors.cyan_white +vtkmodules.util.colors.dark_orange +vtkmodules.util.colors.deep_ochre +vtkmodules.util.colors.deep_pink +vtkmodules.util.colors.dim_grey +vtkmodules.util.colors.dodger_blue +vtkmodules.util.colors.eggshell +vtkmodules.util.colors.emerald_green +vtkmodules.util.colors.english_red +vtkmodules.util.colors.firebrick +vtkmodules.util.colors.flesh +vtkmodules.util.colors.flesh_ochre +vtkmodules.util.colors.floral_white +vtkmodules.util.colors.forest_green +vtkmodules.util.colors.gainsboro +vtkmodules.util.colors.geranium_lake +vtkmodules.util.colors.ghost_white +vtkmodules.util.colors.gold +vtkmodules.util.colors.gold_ochre +vtkmodules.util.colors.goldenrod +vtkmodules.util.colors.goldenrod_dark +vtkmodules.util.colors.goldenrod_light +vtkmodules.util.colors.goldenrod_pale +vtkmodules.util.colors.green +vtkmodules.util.colors.green_dark +vtkmodules.util.colors.green_pale +vtkmodules.util.colors.green_yellow +vtkmodules.util.colors.greenish_umber +vtkmodules.util.colors.grey +vtkmodules.util.colors.honeydew +vtkmodules.util.colors.hot_pink +vtkmodules.util.colors.indian_red +vtkmodules.util.colors.indigo +vtkmodules.util.colors.ivory +vtkmodules.util.colors.ivory_black +vtkmodules.util.colors.khaki +vtkmodules.util.colors.khaki_dark +vtkmodules.util.colors.lamp_black +vtkmodules.util.colors.lavender +vtkmodules.util.colors.lavender_blush +vtkmodules.util.colors.lawn_green +vtkmodules.util.colors.lemon_chiffon +vtkmodules.util.colors.light_beige +vtkmodules.util.colors.light_goldenrod +vtkmodules.util.colors.light_grey +vtkmodules.util.colors.light_salmon +vtkmodules.util.colors.lime_green +vtkmodules.util.colors.linen +vtkmodules.util.colors.madder_lake_deep +vtkmodules.util.colors.magenta +vtkmodules.util.colors.manganese_blue +vtkmodules.util.colors.maroon +vtkmodules.util.colors.mars_orange +vtkmodules.util.colors.mars_yellow +vtkmodules.util.colors.melon +vtkmodules.util.colors.midnight_blue +vtkmodules.util.colors.mint +vtkmodules.util.colors.mint_cream +vtkmodules.util.colors.misty_rose +vtkmodules.util.colors.moccasin +vtkmodules.util.colors.naples_yellow_deep +vtkmodules.util.colors.navajo_white +vtkmodules.util.colors.navy +vtkmodules.util.colors.old_lace +vtkmodules.util.colors.olive +vtkmodules.util.colors.olive_drab +vtkmodules.util.colors.olive_green_dark +vtkmodules.util.colors.orange +vtkmodules.util.colors.orange_red +vtkmodules.util.colors.orchid +vtkmodules.util.colors.orchid_dark +vtkmodules.util.colors.orchid_medium +vtkmodules.util.colors.papaya_whip +vtkmodules.util.colors.peach_puff +vtkmodules.util.colors.peacock +vtkmodules.util.colors.permanent_green +vtkmodules.util.colors.permanent_red_violet +vtkmodules.util.colors.peru +vtkmodules.util.colors.pink +vtkmodules.util.colors.pink_light +vtkmodules.util.colors.plum +vtkmodules.util.colors.powder_blue +vtkmodules.util.colors.purple +vtkmodules.util.colors.purple_medium +vtkmodules.util.colors.raspberry +vtkmodules.util.colors.raw_sienna +vtkmodules.util.colors.raw_umber +vtkmodules.util.colors.red +vtkmodules.util.colors.rose_madder +vtkmodules.util.colors.rosy_brown +vtkmodules.util.colors.royal_blue +vtkmodules.util.colors.saddle_brown +vtkmodules.util.colors.salmon +vtkmodules.util.colors.sandy_brown +vtkmodules.util.colors.sap_green +vtkmodules.util.colors.sea_green +vtkmodules.util.colors.sea_green_dark +vtkmodules.util.colors.sea_green_light +vtkmodules.util.colors.sea_green_medium +vtkmodules.util.colors.seashell +vtkmodules.util.colors.sepia +vtkmodules.util.colors.sienna +vtkmodules.util.colors.sky_blue +vtkmodules.util.colors.sky_blue_deep +vtkmodules.util.colors.sky_blue_light +vtkmodules.util.colors.slate_blue +vtkmodules.util.colors.slate_blue_dark +vtkmodules.util.colors.slate_blue_light +vtkmodules.util.colors.slate_blue_medium +vtkmodules.util.colors.slate_grey +vtkmodules.util.colors.slate_grey_dark +vtkmodules.util.colors.slate_grey_light +vtkmodules.util.colors.snow +vtkmodules.util.colors.spring_green +vtkmodules.util.colors.spring_green_medium +vtkmodules.util.colors.steel_blue +vtkmodules.util.colors.steel_blue_light +vtkmodules.util.colors.tan +vtkmodules.util.colors.terre_verte +vtkmodules.util.colors.thistle +vtkmodules.util.colors.titanium_white +vtkmodules.util.colors.tomato +vtkmodules.util.colors.turquoise +vtkmodules.util.colors.turquoise_blue +vtkmodules.util.colors.turquoise_dark +vtkmodules.util.colors.turquoise_medium +vtkmodules.util.colors.turquoise_pale +vtkmodules.util.colors.ultramarine +vtkmodules.util.colors.ultramarine_violet +vtkmodules.util.colors.van_dyke_brown +vtkmodules.util.colors.venetian_red +vtkmodules.util.colors.violet +vtkmodules.util.colors.violet_dark +vtkmodules.util.colors.violet_red +vtkmodules.util.colors.violet_red_medium +vtkmodules.util.colors.violet_red_pale +vtkmodules.util.colors.viridian_light +vtkmodules.util.colors.warm_grey +vtkmodules.util.colors.wheat +vtkmodules.util.colors.white +vtkmodules.util.colors.white_smoke +vtkmodules.util.colors.yellow +vtkmodules.util.colors.yellow_green +vtkmodules.util.colors.yellow_light +vtkmodules.util.colors.yellow_ochre +vtkmodules.util.colors.zinc_white +vtkmodules.util.keys.DataObjectMetaDataKey +vtkmodules.util.keys.DataaObjectKey +vtkmodules.util.keys.DoubleKey +vtkmodules.util.keys.DoubleVectorKey +vtkmodules.util.keys.ExecutivePortKey +vtkmodules.util.keys.ExecutivePortVectorKey +vtkmodules.util.keys.IdTypeKey +vtkmodules.util.keys.InformationKey +vtkmodules.util.keys.InformationVectorKey +vtkmodules.util.keys.IntegerKey +vtkmodules.util.keys.IntegerRequestKey +vtkmodules.util.keys.IntegerVectorKey +vtkmodules.util.keys.KeyVectorKey +vtkmodules.util.keys.MakeKey +vtkmodules.util.keys.ObjectBaseKey +vtkmodules.util.keys.ObjectBaseVectorKey +vtkmodules.util.keys.RequestKey +vtkmodules.util.keys.StringKey +vtkmodules.util.keys.StringVectorKey +vtkmodules.util.keys.UnsignedLongKey +vtkmodules.util.keys.VariantKey +vtkmodules.util.keys.VariantVectorKey +vtkmodules.util.misc.calldata_type +vtkmodules.util.misc.os +vtkmodules.util.misc.sys +vtkmodules.util.misc.vtkGetDataRoot +vtkmodules.util.misc.vtkGetTempDir +vtkmodules.util.misc.vtkRegressionTestImage +vtkmodules.util.numpy_support.ID_TYPE_CODE +vtkmodules.util.numpy_support.LONG_TYPE_CODE +vtkmodules.util.numpy_support.ULONG_TYPE_CODE +vtkmodules.util.numpy_support.VTK_ID_TYPE_SIZE +vtkmodules.util.numpy_support.VTK_LONG_TYPE_SIZE +vtkmodules.util.numpy_support.create_vtk_array +vtkmodules.util.numpy_support.get_numpy_array_type +vtkmodules.util.numpy_support.get_vtk_array_type +vtkmodules.util.numpy_support.get_vtk_to_numpy_typemap +vtkmodules.util.numpy_support.numpy +vtkmodules.util.numpy_support.numpy_to_vtk +vtkmodules.util.numpy_support.numpy_to_vtkIdTypeArray +vtkmodules.util.numpy_support.vtkConstants +vtkmodules.util.numpy_support.vtkDataArray +vtkmodules.util.numpy_support.vtkIdTypeArray +vtkmodules.util.numpy_support.vtkLongArray +vtkmodules.util.numpy_support.vtk_to_numpy +vtkmodules.util.vtkAlgorithm.VTKAlgorithm +vtkmodules.util.vtkAlgorithm.VTKPythonAlgorithmBase +vtkmodules.util.vtkAlgorithm.vtkAlgorithm +vtkmodules.util.vtkAlgorithm.vtkDataObject +vtkmodules.util.vtkAlgorithm.vtkDemandDrivenPipeline +vtkmodules.util.vtkAlgorithm.vtkInformation +vtkmodules.util.vtkAlgorithm.vtkPythonAlgorithm +vtkmodules.util.vtkAlgorithm.vtkStreamingDemandDrivenPipeline +vtkmodules.util.vtkConstants.VTK_ARIAL +vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUAD +vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON +vtkmodules.util.vtkConstants.VTK_BIQUADRATIC_QUADRATIC_WEDGE +vtkmodules.util.vtkConstants.VTK_BIT +vtkmodules.util.vtkConstants.VTK_BIT_MAX +vtkmodules.util.vtkConstants.VTK_BIT_MIN +vtkmodules.util.vtkConstants.VTK_CHAR +vtkmodules.util.vtkConstants.VTK_CHAR_MAX +vtkmodules.util.vtkConstants.VTK_CHAR_MIN +vtkmodules.util.vtkConstants.VTK_COLOR_MODE_DEFAULT +vtkmodules.util.vtkConstants.VTK_COLOR_MODE_MAP_SCALARS +vtkmodules.util.vtkConstants.VTK_COMPOSITE_DATA_SET +vtkmodules.util.vtkConstants.VTK_CONVEX_POINT_SET +vtkmodules.util.vtkConstants.VTK_COURIER +vtkmodules.util.vtkConstants.VTK_DATA_OBJECT +vtkmodules.util.vtkConstants.VTK_DATA_SET +vtkmodules.util.vtkConstants.VTK_DOUBLE +vtkmodules.util.vtkConstants.VTK_DOUBLE_MAX +vtkmodules.util.vtkConstants.VTK_DOUBLE_MIN +vtkmodules.util.vtkConstants.VTK_EMPTY_CELL +vtkmodules.util.vtkConstants.VTK_ERROR +vtkmodules.util.vtkConstants.VTK_FLOAT +vtkmodules.util.vtkConstants.VTK_FLOAT_MAX +vtkmodules.util.vtkConstants.VTK_FLOAT_MIN +vtkmodules.util.vtkConstants.VTK_GENERIC_DATA_SET +vtkmodules.util.vtkConstants.VTK_GRAPH +vtkmodules.util.vtkConstants.VTK_HEXAGONAL_PRISM +vtkmodules.util.vtkConstants.VTK_HEXAHEDRON +vtkmodules.util.vtkConstants.VTK_HIERARCHICAL_BOX_DATA_SET +vtkmodules.util.vtkConstants.VTK_HIERARCHICAL_DATA_SET +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_EDGE +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_HEXAHEDRON +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_POLYGON +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_PYRAMID +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_QUAD +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_TETRAHEDRON +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_TRIANGLE +vtkmodules.util.vtkConstants.VTK_HIGHER_ORDER_WEDGE +vtkmodules.util.vtkConstants.VTK_HYPER_OCTREE +vtkmodules.util.vtkConstants.VTK_ID_TYPE +vtkmodules.util.vtkConstants.VTK_IMAGE_DATA +vtkmodules.util.vtkConstants.VTK_INT +vtkmodules.util.vtkConstants.VTK_INT_MAX +vtkmodules.util.vtkConstants.VTK_INT_MIN +vtkmodules.util.vtkConstants.VTK_LINE +vtkmodules.util.vtkConstants.VTK_LINEAR_INTERPOLATION +vtkmodules.util.vtkConstants.VTK_LONG +vtkmodules.util.vtkConstants.VTK_LONG_LONG +vtkmodules.util.vtkConstants.VTK_LONG_MAX +vtkmodules.util.vtkConstants.VTK_LONG_MIN +vtkmodules.util.vtkConstants.VTK_LUMINANCE +vtkmodules.util.vtkConstants.VTK_LUMINANCE_ALPHA +vtkmodules.util.vtkConstants.VTK_MAX_VRCOMP +vtkmodules.util.vtkConstants.VTK_MULTIBLOCK_DATA_SET +vtkmodules.util.vtkConstants.VTK_MULTIGROUP_DATA_SET +vtkmodules.util.vtkConstants.VTK_NEAREST_INTERPOLATION +vtkmodules.util.vtkConstants.VTK_OBJECT +vtkmodules.util.vtkConstants.VTK_OK +vtkmodules.util.vtkConstants.VTK_OPAQUE +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_CURVE +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_HEX_REGION +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_QUAD_SURFACE +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_SURFACE +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_TETRA_REGION +vtkmodules.util.vtkConstants.VTK_PARAMETRIC_TRI_SURFACE +vtkmodules.util.vtkConstants.VTK_PENTAGONAL_PRISM +vtkmodules.util.vtkConstants.VTK_PIECEWISE_FUNCTION +vtkmodules.util.vtkConstants.VTK_PIXEL +vtkmodules.util.vtkConstants.VTK_POINT_SET +vtkmodules.util.vtkConstants.VTK_POLYGON +vtkmodules.util.vtkConstants.VTK_POLY_DATA +vtkmodules.util.vtkConstants.VTK_POLY_LINE +vtkmodules.util.vtkConstants.VTK_POLY_VERTEX +vtkmodules.util.vtkConstants.VTK_PYRAMID +vtkmodules.util.vtkConstants.VTK_QUAD +vtkmodules.util.vtkConstants.VTK_QUADRATIC_EDGE +vtkmodules.util.vtkConstants.VTK_QUADRATIC_HEXAHEDRON +vtkmodules.util.vtkConstants.VTK_QUADRATIC_LINEAR_QUAD +vtkmodules.util.vtkConstants.VTK_QUADRATIC_LINEAR_WEDGE +vtkmodules.util.vtkConstants.VTK_QUADRATIC_PYRAMID +vtkmodules.util.vtkConstants.VTK_QUADRATIC_QUAD +vtkmodules.util.vtkConstants.VTK_QUADRATIC_TETRA +vtkmodules.util.vtkConstants.VTK_QUADRATIC_TRIANGLE +vtkmodules.util.vtkConstants.VTK_QUADRATIC_WEDGE +vtkmodules.util.vtkConstants.VTK_RECTILINEAR_GRID +vtkmodules.util.vtkConstants.VTK_RGB +vtkmodules.util.vtkConstants.VTK_RGBA +vtkmodules.util.vtkConstants.VTK_SELECTION +vtkmodules.util.vtkConstants.VTK_SHORT +vtkmodules.util.vtkConstants.VTK_SHORT_MAX +vtkmodules.util.vtkConstants.VTK_SHORT_MIN +vtkmodules.util.vtkConstants.VTK_SIGNED_CHAR +vtkmodules.util.vtkConstants.VTK_STRING +vtkmodules.util.vtkConstants.VTK_STRUCTURED_GRID +vtkmodules.util.vtkConstants.VTK_STRUCTURED_POINTS +vtkmodules.util.vtkConstants.VTK_TABLE +vtkmodules.util.vtkConstants.VTK_TEMPORAL_DATA_SET +vtkmodules.util.vtkConstants.VTK_TETRA +vtkmodules.util.vtkConstants.VTK_TEXT_BOTTOM +vtkmodules.util.vtkConstants.VTK_TEXT_CENTERED +vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_ALL +vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_NONE +vtkmodules.util.vtkConstants.VTK_TEXT_GLOBAL_ANTIALIASING_SOME +vtkmodules.util.vtkConstants.VTK_TEXT_LEFT +vtkmodules.util.vtkConstants.VTK_TEXT_RIGHT +vtkmodules.util.vtkConstants.VTK_TEXT_TOP +vtkmodules.util.vtkConstants.VTK_TIMES +vtkmodules.util.vtkConstants.VTK_TREE +vtkmodules.util.vtkConstants.VTK_TRIANGLE +vtkmodules.util.vtkConstants.VTK_TRIANGLE_STRIP +vtkmodules.util.vtkConstants.VTK_TRIQUADRATIC_HEXAHEDRON +vtkmodules.util.vtkConstants.VTK_UNIFORM_GRID +vtkmodules.util.vtkConstants.VTK_UNKNOWN_FONT +vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR +vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR_MAX +vtkmodules.util.vtkConstants.VTK_UNSIGNED_CHAR_MIN +vtkmodules.util.vtkConstants.VTK_UNSIGNED_INT +vtkmodules.util.vtkConstants.VTK_UNSIGNED_LONG +vtkmodules.util.vtkConstants.VTK_UNSIGNED_LONG_LONG +vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT +vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT_MAX +vtkmodules.util.vtkConstants.VTK_UNSIGNED_SHORT_MIN +vtkmodules.util.vtkConstants.VTK_UNSTRUCTURED_GRID +vtkmodules.util.vtkConstants.VTK_VARIANT +vtkmodules.util.vtkConstants.VTK_VERTEX +vtkmodules.util.vtkConstants.VTK_VOID +vtkmodules.util.vtkConstants.VTK_VOXEL +vtkmodules.util.vtkConstants.VTK_WEDGE +vtkmodules.util.vtkConstants.vtkImageScalarTypeNameMacro +vtkmodules.util.vtkImageExportToArray.VTK_DOUBLE +vtkmodules.util.vtkImageExportToArray.VTK_FLOAT +vtkmodules.util.vtkImageExportToArray.VTK_INT +vtkmodules.util.vtkImageExportToArray.VTK_LONG +vtkmodules.util.vtkImageExportToArray.VTK_SHORT +vtkmodules.util.vtkImageExportToArray.VTK_SIGNED_CHAR +vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_CHAR +vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_INT +vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_LONG +vtkmodules.util.vtkImageExportToArray.VTK_UNSIGNED_SHORT +vtkmodules.util.vtkImageExportToArray.numpy +vtkmodules.util.vtkImageExportToArray.umath +vtkmodules.util.vtkImageExportToArray.vtkImageExport +vtkmodules.util.vtkImageExportToArray.vtkImageExportToArray +vtkmodules.util.vtkImageExportToArray.vtkStreamingDemandDrivenPipeline +vtkmodules.util.vtkImageImportFromArray.VTK_DOUBLE +vtkmodules.util.vtkImageImportFromArray.VTK_FLOAT +vtkmodules.util.vtkImageImportFromArray.VTK_INT +vtkmodules.util.vtkImageImportFromArray.VTK_LONG +vtkmodules.util.vtkImageImportFromArray.VTK_SHORT +vtkmodules.util.vtkImageImportFromArray.VTK_SIGNED_CHAR +vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_CHAR +vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_INT +vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_LONG +vtkmodules.util.vtkImageImportFromArray.VTK_UNSIGNED_SHORT +vtkmodules.util.vtkImageImportFromArray.vtkImageImport +vtkmodules.util.vtkImageImportFromArray.vtkImageImportFromArray +vtkmodules.util.vtkMethodParser.DEBUG +vtkmodules.util.vtkMethodParser.VtkDirMethodParser +vtkmodules.util.vtkMethodParser.VtkPrintMethodParser +vtkmodules.util.vtkMethodParser.debug +vtkmodules.util.vtkMethodParser.re +vtkmodules.util.vtkMethodParser.string +vtkmodules.util.vtkMethodParser.sys +vtkmodules.util.vtkMethodParser.types +vtkmodules.util.vtkVariant._variant_check_map +vtkmodules.util.vtkVariant._variant_method_map +vtkmodules.util.vtkVariant._variant_type_map +vtkmodules.util.vtkVariant.sys +vtkmodules.util.vtkVariant.vtkCommonCore +vtkmodules.util.vtkVariant.vtkVariantCast +vtkmodules.util.vtkVariant.vtkVariantCreate +vtkmodules.util.vtkVariant.vtkVariantEqual +vtkmodules.util.vtkVariant.vtkVariantExtract +vtkmodules.util.vtkVariant.vtkVariantLessThan +vtkmodules.util.vtkVariant.vtkVariantStrictEquality +vtkmodules.util.vtkVariant.vtkVariantStrictWeakOrder +vtkmodules.util.vtkVariant.vtkVariantStrictWeakOrderKey +vtkmodules.vtkAcceleratorsVTKmDataModel.vtkmDataSet +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmAverageToCells +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmAverageToPoints +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmCleanGrid +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmClip +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmContour +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmCoordinateSystemTransform +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmExternalFaces +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmExtractVOI +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmFilterOverrides +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmGradient +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmHistogram +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmImageConnectivity +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmLevelOfDetail +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmNDHistogram +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPointElevation +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPointTransform +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmPolyDataNormals +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmProbe +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmThreshold +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmTriangleMeshPointNormals +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmWarpScalar +vtkmodules.vtkAcceleratorsVTKmFilters.vtkmWarpVector +vtkmodules.vtkChartsCore.vtkAxis +vtkmodules.vtkChartsCore.vtkAxisExtended +vtkmodules.vtkChartsCore.vtkCategoryLegend +vtkmodules.vtkChartsCore.vtkChart +vtkmodules.vtkChartsCore.vtkChartBox +vtkmodules.vtkChartsCore.vtkChartBoxData +vtkmodules.vtkChartsCore.vtkChartHistogram2D +vtkmodules.vtkChartsCore.vtkChartLegend +vtkmodules.vtkChartsCore.vtkChartMatrix +vtkmodules.vtkChartsCore.vtkChartParallelCoordinates +vtkmodules.vtkChartsCore.vtkChartPie +vtkmodules.vtkChartsCore.vtkChartPlotData +vtkmodules.vtkChartsCore.vtkChartXY +vtkmodules.vtkChartsCore.vtkChartXYZ +vtkmodules.vtkChartsCore.vtkColorLegend +vtkmodules.vtkChartsCore.vtkColorTransferControlPointsItem +vtkmodules.vtkChartsCore.vtkColorTransferFunctionItem +vtkmodules.vtkChartsCore.vtkCompositeControlPointsItem +vtkmodules.vtkChartsCore.vtkCompositeTransferFunctionItem +vtkmodules.vtkChartsCore.vtkContextArea +vtkmodules.vtkChartsCore.vtkContextPolygon +vtkmodules.vtkChartsCore.vtkControlPointsItem +vtkmodules.vtkChartsCore.vtkInteractiveArea +vtkmodules.vtkChartsCore.vtkLookupTableItem +vtkmodules.vtkChartsCore.vtkPiecewiseControlPointsItem +vtkmodules.vtkChartsCore.vtkPiecewiseFunctionItem +vtkmodules.vtkChartsCore.vtkPiecewisePointHandleItem +vtkmodules.vtkChartsCore.vtkPlot +vtkmodules.vtkChartsCore.vtkPlot3D +vtkmodules.vtkChartsCore.vtkPlotArea +vtkmodules.vtkChartsCore.vtkPlotBag +vtkmodules.vtkChartsCore.vtkPlotBar +vtkmodules.vtkChartsCore.vtkPlotBarRangeHandlesItem +vtkmodules.vtkChartsCore.vtkPlotBox +vtkmodules.vtkChartsCore.vtkPlotFunctionalBag +vtkmodules.vtkChartsCore.vtkPlotGrid +vtkmodules.vtkChartsCore.vtkPlotHistogram2D +vtkmodules.vtkChartsCore.vtkPlotLine +vtkmodules.vtkChartsCore.vtkPlotLine3D +vtkmodules.vtkChartsCore.vtkPlotParallelCoordinates +vtkmodules.vtkChartsCore.vtkPlotPie +vtkmodules.vtkChartsCore.vtkPlotPoints +vtkmodules.vtkChartsCore.vtkPlotPoints3D +vtkmodules.vtkChartsCore.vtkPlotRangeHandlesItem +vtkmodules.vtkChartsCore.vtkPlotStacked +vtkmodules.vtkChartsCore.vtkPlotSurface +vtkmodules.vtkChartsCore.vtkRangeHandlesItem +vtkmodules.vtkChartsCore.vtkScalarsToColorsItem +vtkmodules.vtkChartsCore.vtkScatterPlotMatrix +vtkmodules.vtkCommonColor.vtkColorSeries +vtkmodules.vtkCommonColor.vtkNamedColors +vtkmodules.vtkCommonComputationalGeometry.vtkBilinearQuadIntersection +vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline +vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline +vtkmodules.vtkCommonComputationalGeometry.vtkParametricBohemianDome +vtkmodules.vtkCommonComputationalGeometry.vtkParametricBour +vtkmodules.vtkCommonComputationalGeometry.vtkParametricBoy +vtkmodules.vtkCommonComputationalGeometry.vtkParametricCatalanMinimal +vtkmodules.vtkCommonComputationalGeometry.vtkParametricConicSpiral +vtkmodules.vtkCommonComputationalGeometry.vtkParametricCrossCap +vtkmodules.vtkCommonComputationalGeometry.vtkParametricDini +vtkmodules.vtkCommonComputationalGeometry.vtkParametricEllipsoid +vtkmodules.vtkCommonComputationalGeometry.vtkParametricEnneper +vtkmodules.vtkCommonComputationalGeometry.vtkParametricFigure8Klein +vtkmodules.vtkCommonComputationalGeometry.vtkParametricFunction +vtkmodules.vtkCommonComputationalGeometry.vtkParametricHenneberg +vtkmodules.vtkCommonComputationalGeometry.vtkParametricKlein +vtkmodules.vtkCommonComputationalGeometry.vtkParametricKuen +vtkmodules.vtkCommonComputationalGeometry.vtkParametricMobius +vtkmodules.vtkCommonComputationalGeometry.vtkParametricPluckerConoid +vtkmodules.vtkCommonComputationalGeometry.vtkParametricPseudosphere +vtkmodules.vtkCommonComputationalGeometry.vtkParametricRandomHills +vtkmodules.vtkCommonComputationalGeometry.vtkParametricRoman +vtkmodules.vtkCommonComputationalGeometry.vtkParametricSpline +vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperEllipsoid +vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperToroid +vtkmodules.vtkCommonComputationalGeometry.vtkParametricTorus +vtkmodules.vtkCommonCore.VTK_ABSTRACT_ELECTRONIC_DATA +vtkmodules.vtkCommonCore.VTK_ANNOTATION +vtkmodules.vtkCommonCore.VTK_ANNOTATION_LAYERS +vtkmodules.vtkCommonCore.VTK_ARIAL +vtkmodules.vtkCommonCore.VTK_ARRAY_DATA +vtkmodules.vtkCommonCore.VTK_BIT +vtkmodules.vtkCommonCore.VTK_BIT_MAX +vtkmodules.vtkCommonCore.VTK_BIT_MIN +vtkmodules.vtkCommonCore.VTK_BSP_CUTS +vtkmodules.vtkCommonCore.VTK_BUILD_VERSION +vtkmodules.vtkCommonCore.VTK_CHAR +vtkmodules.vtkCommonCore.VTK_CHAR_MAX +vtkmodules.vtkCommonCore.VTK_CHAR_MIN +vtkmodules.vtkCommonCore.VTK_COLOR_MODE_DEFAULT +vtkmodules.vtkCommonCore.VTK_COLOR_MODE_DIRECT_SCALARS +vtkmodules.vtkCommonCore.VTK_COLOR_MODE_MAP_SCALARS +vtkmodules.vtkCommonCore.VTK_COMPOSITE_DATA_SET +vtkmodules.vtkCommonCore.VTK_COURIER +vtkmodules.vtkCommonCore.VTK_CUBIC_INTERPOLATION +vtkmodules.vtkCommonCore.VTK_CXX_COMPILER +vtkmodules.vtkCommonCore.VTK_DATA_OBJECT +vtkmodules.vtkCommonCore.VTK_DATA_OBJECT_TREE +vtkmodules.vtkCommonCore.VTK_DATA_SET +vtkmodules.vtkCommonCore.VTK_DBL_EPSILON +vtkmodules.vtkCommonCore.VTK_DBL_MIN +vtkmodules.vtkCommonCore.VTK_DEPRECATION_LEVEL +vtkmodules.vtkCommonCore.VTK_DIRECTED_ACYCLIC_GRAPH +vtkmodules.vtkCommonCore.VTK_DIRECTED_GRAPH +vtkmodules.vtkCommonCore.VTK_DOUBLE +vtkmodules.vtkCommonCore.VTK_DOUBLE_MAX +vtkmodules.vtkCommonCore.VTK_DOUBLE_MIN +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_1 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_10 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_11 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_12 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_13 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_14 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_15 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_16 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_2 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_3 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_4 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_5 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_6 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_7 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_8 +vtkmodules.vtkCommonCore.VTK_ENCODING_ISO_8859_9 +vtkmodules.vtkCommonCore.VTK_ENCODING_NONE +vtkmodules.vtkCommonCore.VTK_ENCODING_UNICODE +vtkmodules.vtkCommonCore.VTK_ENCODING_UNKNOWN +vtkmodules.vtkCommonCore.VTK_ENCODING_US_ASCII +vtkmodules.vtkCommonCore.VTK_ENCODING_UTF_8 +vtkmodules.vtkCommonCore.VTK_ERROR +vtkmodules.vtkCommonCore.VTK_EXPLICIT_STRUCTURED_GRID +vtkmodules.vtkCommonCore.VTK_FLOAT +vtkmodules.vtkCommonCore.VTK_FLOAT_MAX +vtkmodules.vtkCommonCore.VTK_FLOAT_MIN +vtkmodules.vtkCommonCore.VTK_FONT_FILE +vtkmodules.vtkCommonCore.VTK_GENERIC_DATA_SET +vtkmodules.vtkCommonCore.VTK_GEO_JSON_FEATURE +vtkmodules.vtkCommonCore.VTK_GRAPH +vtkmodules.vtkCommonCore.VTK_HIERARCHICAL_BOX_DATA_SET +vtkmodules.vtkCommonCore.VTK_HIERARCHICAL_DATA_SET +vtkmodules.vtkCommonCore.VTK_HYPER_OCTREE +vtkmodules.vtkCommonCore.VTK_HYPER_TREE_GRID +vtkmodules.vtkCommonCore.VTK_ID_MAX +vtkmodules.vtkCommonCore.VTK_ID_MIN +vtkmodules.vtkCommonCore.VTK_ID_TYPE +vtkmodules.vtkCommonCore.VTK_ID_TYPE_IMPL +vtkmodules.vtkCommonCore.VTK_ID_TYPE_PRId +vtkmodules.vtkCommonCore.VTK_IMAGE_DATA +vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MAX +vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MEAN +vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_MIN +vtkmodules.vtkCommonCore.VTK_IMAGE_SLAB_SUM +vtkmodules.vtkCommonCore.VTK_IMAGE_STENCIL_DATA +vtkmodules.vtkCommonCore.VTK_INT +vtkmodules.vtkCommonCore.VTK_INT_MAX +vtkmodules.vtkCommonCore.VTK_INT_MIN +vtkmodules.vtkCommonCore.VTK_LINEAR_INTERPOLATION +vtkmodules.vtkCommonCore.VTK_LONG +vtkmodules.vtkCommonCore.VTK_LONG_LONG +vtkmodules.vtkCommonCore.VTK_LONG_LONG_MAX +vtkmodules.vtkCommonCore.VTK_LONG_LONG_MIN +vtkmodules.vtkCommonCore.VTK_LONG_MAX +vtkmodules.vtkCommonCore.VTK_LONG_MIN +vtkmodules.vtkCommonCore.VTK_LUMINANCE +vtkmodules.vtkCommonCore.VTK_LUMINANCE_ALPHA +vtkmodules.vtkCommonCore.VTK_MAJOR_VERSION +vtkmodules.vtkCommonCore.VTK_MAXPATH +vtkmodules.vtkCommonCore.VTK_MAX_THREADS +vtkmodules.vtkCommonCore.VTK_MAX_VRCOMP +vtkmodules.vtkCommonCore.VTK_MINIMUM_DEPRECATION_LEVEL +vtkmodules.vtkCommonCore.VTK_MINOR_VERSION +vtkmodules.vtkCommonCore.VTK_MOLECULE +vtkmodules.vtkCommonCore.VTK_MTIME_MAX +vtkmodules.vtkCommonCore.VTK_MTIME_MIN +vtkmodules.vtkCommonCore.VTK_MTIME_TYPE_IMPL +vtkmodules.vtkCommonCore.VTK_MULTIBLOCK_DATA_SET +vtkmodules.vtkCommonCore.VTK_MULTIGROUP_DATA_SET +vtkmodules.vtkCommonCore.VTK_MULTIPIECE_DATA_SET +vtkmodules.vtkCommonCore.VTK_NEAREST_INTERPOLATION +vtkmodules.vtkCommonCore.VTK_NON_OVERLAPPING_AMR +vtkmodules.vtkCommonCore.VTK_OBJECT +vtkmodules.vtkCommonCore.VTK_OK +vtkmodules.vtkCommonCore.VTK_OPAQUE +vtkmodules.vtkCommonCore.VTK_OPEN_QUBE_ELECTRONIC_DATA +vtkmodules.vtkCommonCore.VTK_OVERLAPPING_AMR +vtkmodules.vtkCommonCore.VTK_PARTITIONED_DATA_SET +vtkmodules.vtkCommonCore.VTK_PARTITIONED_DATA_SET_COLLECTION +vtkmodules.vtkCommonCore.VTK_PATH +vtkmodules.vtkCommonCore.VTK_PIECEWISE_FUNCTION +vtkmodules.vtkCommonCore.VTK_PISTON_DATA_OBJECT +vtkmodules.vtkCommonCore.VTK_POINT_SET +vtkmodules.vtkCommonCore.VTK_POLY_DATA +vtkmodules.vtkCommonCore.VTK_RAMP_LINEAR +vtkmodules.vtkCommonCore.VTK_RAMP_SCURVE +vtkmodules.vtkCommonCore.VTK_RAMP_SQRT +vtkmodules.vtkCommonCore.VTK_RECTILINEAR_GRID +vtkmodules.vtkCommonCore.VTK_REEB_GRAPH +vtkmodules.vtkCommonCore.VTK_RGB +vtkmodules.vtkCommonCore.VTK_RGBA +vtkmodules.vtkCommonCore.VTK_SCALE_LINEAR +vtkmodules.vtkCommonCore.VTK_SCALE_LOG10 +vtkmodules.vtkCommonCore.VTK_SELECTION +vtkmodules.vtkCommonCore.VTK_SHORT +vtkmodules.vtkCommonCore.VTK_SHORT_MAX +vtkmodules.vtkCommonCore.VTK_SHORT_MIN +vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR +vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR_MAX +vtkmodules.vtkCommonCore.VTK_SIGNED_CHAR_MIN +vtkmodules.vtkCommonCore.VTK_SIZEOF_CHAR +vtkmodules.vtkCommonCore.VTK_SIZEOF_DOUBLE +vtkmodules.vtkCommonCore.VTK_SIZEOF_FLOAT +vtkmodules.vtkCommonCore.VTK_SIZEOF_ID_TYPE +vtkmodules.vtkCommonCore.VTK_SIZEOF_INT +vtkmodules.vtkCommonCore.VTK_SIZEOF_LONG +vtkmodules.vtkCommonCore.VTK_SIZEOF_LONG_LONG +vtkmodules.vtkCommonCore.VTK_SIZEOF_SHORT +vtkmodules.vtkCommonCore.VTK_SIZEOF_VOID_P +vtkmodules.vtkCommonCore.VTK_SMP_BACKEND +vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_OPENMP +vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_SEQUENTIAL +vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_STDTHREAD +vtkmodules.vtkCommonCore.VTK_SMP_DEFAULT_IMPLEMENTATION_TBB +vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_OPENMP +vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_SEQUENTIAL +vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_STDTHREAD +vtkmodules.vtkCommonCore.VTK_SMP_ENABLE_TBB +vtkmodules.vtkCommonCore.VTK_SOURCE_VERSION +vtkmodules.vtkCommonCore.VTK_STRING +vtkmodules.vtkCommonCore.VTK_STRUCTURED_GRID +vtkmodules.vtkCommonCore.VTK_STRUCTURED_POINTS +vtkmodules.vtkCommonCore.VTK_TABLE +vtkmodules.vtkCommonCore.VTK_TEMPORAL_DATA_SET +vtkmodules.vtkCommonCore.VTK_TEXT_BOTTOM +vtkmodules.vtkCommonCore.VTK_TEXT_CENTERED +vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_ALL +vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_NONE +vtkmodules.vtkCommonCore.VTK_TEXT_GLOBAL_ANTIALIASING_SOME +vtkmodules.vtkCommonCore.VTK_TEXT_LEFT +vtkmodules.vtkCommonCore.VTK_TEXT_RIGHT +vtkmodules.vtkCommonCore.VTK_TEXT_TOP +vtkmodules.vtkCommonCore.VTK_THREAD_RETURN_VALUE +vtkmodules.vtkCommonCore.VTK_TIMES +vtkmodules.vtkCommonCore.VTK_TREE +vtkmodules.vtkCommonCore.VTK_TYPE_CHAR_IS_SIGNED +vtkmodules.vtkCommonCore.VTK_TYPE_FLOAT32 +vtkmodules.vtkCommonCore.VTK_TYPE_FLOAT64 +vtkmodules.vtkCommonCore.VTK_TYPE_INT16 +vtkmodules.vtkCommonCore.VTK_TYPE_INT16_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_INT16_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_INT32 +vtkmodules.vtkCommonCore.VTK_TYPE_INT32_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_INT32_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_INT64 +vtkmodules.vtkCommonCore.VTK_TYPE_INT64_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_INT64_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_INT8 +vtkmodules.vtkCommonCore.VTK_TYPE_INT8_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_INT8_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_LONG_LONG_FORMAT +vtkmodules.vtkCommonCore.VTK_TYPE_UINT16 +vtkmodules.vtkCommonCore.VTK_TYPE_UINT16_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_UINT16_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_UINT32 +vtkmodules.vtkCommonCore.VTK_TYPE_UINT32_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_UINT32_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_UINT64 +vtkmodules.vtkCommonCore.VTK_TYPE_UINT64_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_UINT64_MIN +vtkmodules.vtkCommonCore.VTK_TYPE_UINT8 +vtkmodules.vtkCommonCore.VTK_TYPE_UINT8_MAX +vtkmodules.vtkCommonCore.VTK_TYPE_UINT8_MIN +vtkmodules.vtkCommonCore.VTK_UNDIRECTED_GRAPH +vtkmodules.vtkCommonCore.VTK_UNIFORM_GRID +vtkmodules.vtkCommonCore.VTK_UNIFORM_GRID_AMR +vtkmodules.vtkCommonCore.VTK_UNIFORM_HYPER_TREE_GRID +vtkmodules.vtkCommonCore.VTK_UNKNOWN_FONT +vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR +vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR_MAX +vtkmodules.vtkCommonCore.VTK_UNSIGNED_CHAR_MIN +vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT +vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT_MAX +vtkmodules.vtkCommonCore.VTK_UNSIGNED_INT_MIN +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG_MAX +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_LONG_MIN +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_MAX +vtkmodules.vtkCommonCore.VTK_UNSIGNED_LONG_MIN +vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT +vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT_MAX +vtkmodules.vtkCommonCore.VTK_UNSIGNED_SHORT_MIN +vtkmodules.vtkCommonCore.VTK_UNSTRUCTURED_GRID +vtkmodules.vtkCommonCore.VTK_UNSTRUCTURED_GRID_BASE +vtkmodules.vtkCommonCore.VTK_USE_FLOAT32 +vtkmodules.vtkCommonCore.VTK_USE_FLOAT64 +vtkmodules.vtkCommonCore.VTK_USE_FUTURE_CONST +vtkmodules.vtkCommonCore.VTK_USE_INT16 +vtkmodules.vtkCommonCore.VTK_USE_INT32 +vtkmodules.vtkCommonCore.VTK_USE_INT64 +vtkmodules.vtkCommonCore.VTK_USE_INT8 +vtkmodules.vtkCommonCore.VTK_USE_UINT16 +vtkmodules.vtkCommonCore.VTK_USE_UINT32 +vtkmodules.vtkCommonCore.VTK_USE_UINT64 +vtkmodules.vtkCommonCore.VTK_USE_UINT8 +vtkmodules.vtkCommonCore.VTK_VARIANT +vtkmodules.vtkCommonCore.VTK_VERSION +vtkmodules.vtkCommonCore.VTK_VERSION_FULL +vtkmodules.vtkCommonCore.VTK_VERSION_NUMBER +vtkmodules.vtkCommonCore.VTK_VOID +vtkmodules.vtkCommonCore.buffer_shared +vtkmodules.vtkCommonCore.mutable +vtkmodules.vtkCommonCore.reference +vtkmodules.vtkCommonCore.vtkAbstractArray +vtkmodules.vtkCommonCore.vtkAnimationCue +vtkmodules.vtkCommonCore.vtkArchiver +vtkmodules.vtkCommonCore.vtkArray +vtkmodules.vtkCommonCore.vtkArrayCoordinates +vtkmodules.vtkCommonCore.vtkArrayExtents +vtkmodules.vtkCommonCore.vtkArrayExtentsList +vtkmodules.vtkCommonCore.vtkArrayIterator +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_I10vtkVariantE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_I12vtkStdStringE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IaE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IcE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IdE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IfE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IhE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IiE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IjE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IlE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_ImE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IsE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_ItE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IxE +vtkmodules.vtkCommonCore.vtkArrayIteratorTemplate_IyE +vtkmodules.vtkCommonCore.vtkArrayRange +vtkmodules.vtkCommonCore.vtkArraySort +vtkmodules.vtkCommonCore.vtkArrayWeights +vtkmodules.vtkCommonCore.vtkAtomicMutex +vtkmodules.vtkCommonCore.vtkBitArray +vtkmodules.vtkCommonCore.vtkBitArrayIterator +vtkmodules.vtkCommonCore.vtkBoxMuellerRandomSequence +vtkmodules.vtkCommonCore.vtkBreakPoint +vtkmodules.vtkCommonCore.vtkByteSwap +vtkmodules.vtkCommonCore.vtkCallbackCommand +vtkmodules.vtkCommonCore.vtkCharArray +vtkmodules.vtkCommonCore.vtkCollection +vtkmodules.vtkCommonCore.vtkCollectionElement +vtkmodules.vtkCommonCore.vtkCollectionIterator +vtkmodules.vtkCommonCore.vtkCommand +vtkmodules.vtkCommonCore.vtkCommonInformationKeyManager +vtkmodules.vtkCommonCore.vtkConditionVariable +vtkmodules.vtkCommonCore.vtkCriticalSection +vtkmodules.vtkCommonCore.vtkDataArray +vtkmodules.vtkCommonCore.vtkDataArrayCollection +vtkmodules.vtkCommonCore.vtkDataArrayCollectionIterator +vtkmodules.vtkCommonCore.vtkDataArraySelection +vtkmodules.vtkCommonCore.vtkDebugLeaks +vtkmodules.vtkCommonCore.vtkDebugLeaksManager +vtkmodules.vtkCommonCore.vtkDebugLeaksObserver +vtkmodules.vtkCommonCore.vtkDenseArray +vtkmodules.vtkCommonCore.vtkDenseArray_I10vtkVariantE +vtkmodules.vtkCommonCore.vtkDenseArray_I12vtkStdStringE +vtkmodules.vtkCommonCore.vtkDenseArray_IaE +vtkmodules.vtkCommonCore.vtkDenseArray_IcE +vtkmodules.vtkCommonCore.vtkDenseArray_IdE +vtkmodules.vtkCommonCore.vtkDenseArray_IfE +vtkmodules.vtkCommonCore.vtkDenseArray_IhE +vtkmodules.vtkCommonCore.vtkDenseArray_IiE +vtkmodules.vtkCommonCore.vtkDenseArray_IjE +vtkmodules.vtkCommonCore.vtkDenseArray_IlE +vtkmodules.vtkCommonCore.vtkDenseArray_ImE +vtkmodules.vtkCommonCore.vtkDenseArray_IsE +vtkmodules.vtkCommonCore.vtkDenseArray_ItE +vtkmodules.vtkCommonCore.vtkDenseArray_IxE +vtkmodules.vtkCommonCore.vtkDenseArray_IyE +vtkmodules.vtkCommonCore.vtkDoubleArray +vtkmodules.vtkCommonCore.vtkDynamicLoader +vtkmodules.vtkCommonCore.vtkEventData +vtkmodules.vtkCommonCore.vtkEventDataAction +vtkmodules.vtkCommonCore.vtkEventDataDevice +vtkmodules.vtkCommonCore.vtkEventDataDevice3D +vtkmodules.vtkCommonCore.vtkEventDataDeviceInput +vtkmodules.vtkCommonCore.vtkEventDataForDevice +vtkmodules.vtkCommonCore.vtkEventDataNumberOfDevices +vtkmodules.vtkCommonCore.vtkEventDataNumberOfInputs +vtkmodules.vtkCommonCore.vtkEventForwarderCommand +vtkmodules.vtkCommonCore.vtkFileOutputWindow +vtkmodules.vtkCommonCore.vtkFloatArray +vtkmodules.vtkCommonCore.vtkFloatingPointExceptions +vtkmodules.vtkCommonCore.vtkGarbageCollector +vtkmodules.vtkCommonCore.vtkGarbageCollectorManager +vtkmodules.vtkCommonCore.vtkGaussianRandomSequence +vtkmodules.vtkCommonCore.vtkGenericDataArray +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIaEaE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIcEcE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIdEdE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIfEfE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIhEhE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIiEiE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIjEjE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIlElE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateImEmE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIsEsE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateItEtE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIxExE +vtkmodules.vtkCommonCore.vtkGenericDataArray_I23vtkSOADataArrayTemplateIyEyE +vtkmodules.vtkCommonCore.vtkIdList +vtkmodules.vtkCommonCore.vtkIdListCollection +vtkmodules.vtkCommonCore.vtkIdTypeArray +vtkmodules.vtkCommonCore.vtkIndent +vtkmodules.vtkCommonCore.vtkInformation +vtkmodules.vtkCommonCore.vtkInformationDataObjectKey +vtkmodules.vtkCommonCore.vtkInformationDoubleKey +vtkmodules.vtkCommonCore.vtkInformationDoubleVectorKey +vtkmodules.vtkCommonCore.vtkInformationIdTypeKey +vtkmodules.vtkCommonCore.vtkInformationInformationKey +vtkmodules.vtkCommonCore.vtkInformationInformationVectorKey +vtkmodules.vtkCommonCore.vtkInformationIntegerKey +vtkmodules.vtkCommonCore.vtkInformationIntegerPointerKey +vtkmodules.vtkCommonCore.vtkInformationIntegerVectorKey +vtkmodules.vtkCommonCore.vtkInformationInternals +vtkmodules.vtkCommonCore.vtkInformationIterator +vtkmodules.vtkCommonCore.vtkInformationKey +vtkmodules.vtkCommonCore.vtkInformationKeyLookup +vtkmodules.vtkCommonCore.vtkInformationKeyVectorKey +vtkmodules.vtkCommonCore.vtkInformationObjectBaseKey +vtkmodules.vtkCommonCore.vtkInformationObjectBaseVectorKey +vtkmodules.vtkCommonCore.vtkInformationRequestKey +vtkmodules.vtkCommonCore.vtkInformationStringKey +vtkmodules.vtkCommonCore.vtkInformationStringVectorKey +vtkmodules.vtkCommonCore.vtkInformationUnsignedLongKey +vtkmodules.vtkCommonCore.vtkInformationVariantKey +vtkmodules.vtkCommonCore.vtkInformationVariantVectorKey +vtkmodules.vtkCommonCore.vtkInformationVector +vtkmodules.vtkCommonCore.vtkIntArray +vtkmodules.vtkCommonCore.vtkLogger +vtkmodules.vtkCommonCore.vtkLongArray +vtkmodules.vtkCommonCore.vtkLongLongArray +vtkmodules.vtkCommonCore.vtkLookupTable +vtkmodules.vtkCommonCore.vtkMath +vtkmodules.vtkCommonCore.vtkMersenneTwister +vtkmodules.vtkCommonCore.vtkMinimalStandardRandomSequence +vtkmodules.vtkCommonCore.vtkMultiThreader +vtkmodules.vtkCommonCore.vtkMutexLock +vtkmodules.vtkCommonCore.vtkOStrStreamWrapper +vtkmodules.vtkCommonCore.vtkObject +vtkmodules.vtkCommonCore.vtkObjectBase +vtkmodules.vtkCommonCore.vtkObjectFactory +vtkmodules.vtkCommonCore.vtkObjectFactoryCollection +vtkmodules.vtkCommonCore.vtkObjectFactoryRegistryCleanup +vtkmodules.vtkCommonCore.vtkOldStyleCallbackCommand +vtkmodules.vtkCommonCore.vtkOutputWindow +vtkmodules.vtkCommonCore.vtkOutputWindowCleanup +vtkmodules.vtkCommonCore.vtkOverrideInformation +vtkmodules.vtkCommonCore.vtkOverrideInformationCollection +vtkmodules.vtkCommonCore.vtkPoints +vtkmodules.vtkCommonCore.vtkPoints2D +vtkmodules.vtkCommonCore.vtkPriorityQueue +vtkmodules.vtkCommonCore.vtkRandomPool +vtkmodules.vtkCommonCore.vtkRandomSequence +vtkmodules.vtkCommonCore.vtkReferenceCount +vtkmodules.vtkCommonCore.vtkSMPTools +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IaE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IcE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IdE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IfE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IhE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IiE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IjE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IlE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_ImE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IsE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_ItE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IxE +vtkmodules.vtkCommonCore.vtkSOADataArrayTemplate_IyE +vtkmodules.vtkCommonCore.vtkScalarsToColors +vtkmodules.vtkCommonCore.vtkShortArray +vtkmodules.vtkCommonCore.vtkSignedCharArray +vtkmodules.vtkCommonCore.vtkSimpleConditionVariable +vtkmodules.vtkCommonCore.vtkSimpleCriticalSection +vtkmodules.vtkCommonCore.vtkSimpleMutexLock +vtkmodules.vtkCommonCore.vtkSmartPointerBase +vtkmodules.vtkCommonCore.vtkSortDataArray +vtkmodules.vtkCommonCore.vtkSparseArray +vtkmodules.vtkCommonCore.vtkSparseArray_I10vtkVariantE +vtkmodules.vtkCommonCore.vtkSparseArray_I12vtkStdStringE +vtkmodules.vtkCommonCore.vtkSparseArray_IaE +vtkmodules.vtkCommonCore.vtkSparseArray_IcE +vtkmodules.vtkCommonCore.vtkSparseArray_IdE +vtkmodules.vtkCommonCore.vtkSparseArray_IfE +vtkmodules.vtkCommonCore.vtkSparseArray_IhE +vtkmodules.vtkCommonCore.vtkSparseArray_IiE +vtkmodules.vtkCommonCore.vtkSparseArray_IjE +vtkmodules.vtkCommonCore.vtkSparseArray_IlE +vtkmodules.vtkCommonCore.vtkSparseArray_ImE +vtkmodules.vtkCommonCore.vtkSparseArray_IsE +vtkmodules.vtkCommonCore.vtkSparseArray_ItE +vtkmodules.vtkCommonCore.vtkSparseArray_IxE +vtkmodules.vtkCommonCore.vtkSparseArray_IyE +vtkmodules.vtkCommonCore.vtkStdString +vtkmodules.vtkCommonCore.vtkStringArray +vtkmodules.vtkCommonCore.vtkStringOutputWindow +vtkmodules.vtkCommonCore.vtkTimePointUtility +vtkmodules.vtkCommonCore.vtkTimeStamp +vtkmodules.vtkCommonCore.vtkTypeFloat32Array +vtkmodules.vtkCommonCore.vtkTypeFloat64Array +vtkmodules.vtkCommonCore.vtkTypeInt16Array +vtkmodules.vtkCommonCore.vtkTypeInt32Array +vtkmodules.vtkCommonCore.vtkTypeInt64Array +vtkmodules.vtkCommonCore.vtkTypeInt8Array +vtkmodules.vtkCommonCore.vtkTypeUInt16Array +vtkmodules.vtkCommonCore.vtkTypeUInt32Array +vtkmodules.vtkCommonCore.vtkTypeUInt64Array +vtkmodules.vtkCommonCore.vtkTypeUInt8Array +vtkmodules.vtkCommonCore.vtkTypedArray +vtkmodules.vtkCommonCore.vtkTypedArray_I10vtkVariantE +vtkmodules.vtkCommonCore.vtkTypedArray_I12vtkStdStringE +vtkmodules.vtkCommonCore.vtkTypedArray_IaE +vtkmodules.vtkCommonCore.vtkTypedArray_IcE +vtkmodules.vtkCommonCore.vtkTypedArray_IdE +vtkmodules.vtkCommonCore.vtkTypedArray_IfE +vtkmodules.vtkCommonCore.vtkTypedArray_IhE +vtkmodules.vtkCommonCore.vtkTypedArray_IiE +vtkmodules.vtkCommonCore.vtkTypedArray_IjE +vtkmodules.vtkCommonCore.vtkTypedArray_IlE +vtkmodules.vtkCommonCore.vtkTypedArray_ImE +vtkmodules.vtkCommonCore.vtkTypedArray_IsE +vtkmodules.vtkCommonCore.vtkTypedArray_ItE +vtkmodules.vtkCommonCore.vtkTypedArray_IxE +vtkmodules.vtkCommonCore.vtkTypedArray_IyE +vtkmodules.vtkCommonCore.vtkUnsignedCharArray +vtkmodules.vtkCommonCore.vtkUnsignedIntArray +vtkmodules.vtkCommonCore.vtkUnsignedLongArray +vtkmodules.vtkCommonCore.vtkUnsignedLongLongArray +vtkmodules.vtkCommonCore.vtkUnsignedShortArray +vtkmodules.vtkCommonCore.vtkVariant +vtkmodules.vtkCommonCore.vtkVariantArray +vtkmodules.vtkCommonCore.vtkVariantEqual +vtkmodules.vtkCommonCore.vtkVariantLessThan +vtkmodules.vtkCommonCore.vtkVariantStrictEquality +vtkmodules.vtkCommonCore.vtkVariantStrictWeakOrder +vtkmodules.vtkCommonCore.vtkVersion +vtkmodules.vtkCommonCore.vtkVoidArray +vtkmodules.vtkCommonCore.vtkWeakPointerBase +vtkmodules.vtkCommonCore.vtkWeakReference +vtkmodules.vtkCommonCore.vtkWindow +vtkmodules.vtkCommonCore.vtkXMLFileOutputWindow +vtkmodules.vtkCommonDataModel.VTK_21_POINT_WEDGE +vtkmodules.vtkCommonDataModel.VTK_3D_EXTENT +vtkmodules.vtkCommonDataModel.VTK_BEZIER_CURVE +vtkmodules.vtkCommonDataModel.VTK_BEZIER_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_BEZIER_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_BEZIER_QUADRILATERAL +vtkmodules.vtkCommonDataModel.VTK_BEZIER_TETRAHEDRON +vtkmodules.vtkCommonDataModel.VTK_BEZIER_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_BEZIER_WEDGE +vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUAD +vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_QUADRATIC_WEDGE +vtkmodules.vtkCommonDataModel.VTK_BIQUADRATIC_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_CELL_SIZE +vtkmodules.vtkCommonDataModel.VTK_CONVEX_POINT_SET +vtkmodules.vtkCommonDataModel.VTK_CUBIC_LINE +vtkmodules.vtkCommonDataModel.VTK_EMPTY +vtkmodules.vtkCommonDataModel.VTK_EMPTY_CELL +vtkmodules.vtkCommonDataModel.VTK_HEXAGONAL_PRISM +vtkmodules.vtkCommonDataModel.VTK_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_EDGE +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_POLYGON +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_QUAD +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_TETRAHEDRON +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_HIGHER_ORDER_WEDGE +vtkmodules.vtkCommonDataModel.VTK_ICP_MODE_AV +vtkmodules.vtkCommonDataModel.VTK_ICP_MODE_RMS +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_CURVE +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_QUADRILATERAL +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_TETRAHEDRON +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_LAGRANGE_WEDGE +vtkmodules.vtkCommonDataModel.VTK_LINE +vtkmodules.vtkCommonDataModel.VTK_MIN_SUPERQUADRIC_THICKNESS +vtkmodules.vtkCommonDataModel.VTK_NUMBER_OF_CELL_TYPES +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_CURVE +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_HEX_REGION +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_QUAD_SURFACE +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_SURFACE +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_TETRA_REGION +vtkmodules.vtkCommonDataModel.VTK_PARAMETRIC_TRI_SURFACE +vtkmodules.vtkCommonDataModel.VTK_PENTAGONAL_PRISM +vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_X +vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_Y +vtkmodules.vtkCommonDataModel.VTK_PERIODIC_ARRAY_AXIS_Z +vtkmodules.vtkCommonDataModel.VTK_PIECES_EXTENT +vtkmodules.vtkCommonDataModel.VTK_PIXEL +vtkmodules.vtkCommonDataModel.VTK_POLYGON +vtkmodules.vtkCommonDataModel.VTK_POLYHEDRON +vtkmodules.vtkCommonDataModel.VTK_POLY_LINE +vtkmodules.vtkCommonDataModel.VTK_POLY_VERTEX +vtkmodules.vtkCommonDataModel.VTK_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_QUAD +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_EDGE +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_LINEAR_QUAD +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_LINEAR_WEDGE +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_POLYGON +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_QUAD +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_TETRA +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_QUADRATIC_WEDGE +vtkmodules.vtkCommonDataModel.VTK_SINGLE_POINT +vtkmodules.vtkCommonDataModel.VTK_TETRA +vtkmodules.vtkCommonDataModel.VTK_TIME_EXTENT +vtkmodules.vtkCommonDataModel.VTK_TOL +vtkmodules.vtkCommonDataModel.VTK_TRIANGLE +vtkmodules.vtkCommonDataModel.VTK_TRIANGLE_STRIP +vtkmodules.vtkCommonDataModel.VTK_TRIQUADRATIC_HEXAHEDRON +vtkmodules.vtkCommonDataModel.VTK_TRIQUADRATIC_PYRAMID +vtkmodules.vtkCommonDataModel.VTK_UNCHANGED +vtkmodules.vtkCommonDataModel.VTK_VERTEX +vtkmodules.vtkCommonDataModel.VTK_VOXEL +vtkmodules.vtkCommonDataModel.VTK_WEDGE +vtkmodules.vtkCommonDataModel.VTK_XYZ_GRID +vtkmodules.vtkCommonDataModel.VTK_XY_PLANE +vtkmodules.vtkCommonDataModel.VTK_XZ_PLANE +vtkmodules.vtkCommonDataModel.VTK_X_LINE +vtkmodules.vtkCommonDataModel.VTK_YZ_PLANE +vtkmodules.vtkCommonDataModel.VTK_Y_LINE +vtkmodules.vtkCommonDataModel.VTK_Z_LINE +vtkmodules.vtkCommonDataModel.vtkAMRBox +vtkmodules.vtkCommonDataModel.vtkAMRDataInternals +vtkmodules.vtkCommonDataModel.vtkAMRInformation +vtkmodules.vtkCommonDataModel.vtkAMRUtilities +vtkmodules.vtkCommonDataModel.vtkAbstractCellLinks +vtkmodules.vtkCommonDataModel.vtkAbstractCellLocator +vtkmodules.vtkCommonDataModel.vtkAbstractElectronicData +vtkmodules.vtkCommonDataModel.vtkAbstractPointLocator +vtkmodules.vtkCommonDataModel.vtkAdjacentVertexIterator +vtkmodules.vtkCommonDataModel.vtkAnimationScene +vtkmodules.vtkCommonDataModel.vtkAnnotation +vtkmodules.vtkCommonDataModel.vtkAnnotationLayers +vtkmodules.vtkCommonDataModel.vtkArrayData +vtkmodules.vtkCommonDataModel.vtkAtom +vtkmodules.vtkCommonDataModel.vtkAttributesErrorMetric +vtkmodules.vtkCommonDataModel.vtkBSPCuts +vtkmodules.vtkCommonDataModel.vtkBSPIntersections +vtkmodules.vtkCommonDataModel.vtkBezierCurve +vtkmodules.vtkCommonDataModel.vtkBezierHexahedron +vtkmodules.vtkCommonDataModel.vtkBezierInterpolation +vtkmodules.vtkCommonDataModel.vtkBezierQuadrilateral +vtkmodules.vtkCommonDataModel.vtkBezierTetra +vtkmodules.vtkCommonDataModel.vtkBezierTriangle +vtkmodules.vtkCommonDataModel.vtkBezierWedge +vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuad +vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuadraticHexahedron +vtkmodules.vtkCommonDataModel.vtkBiQuadraticQuadraticWedge +vtkmodules.vtkCommonDataModel.vtkBiQuadraticTriangle +vtkmodules.vtkCommonDataModel.vtkBond +vtkmodules.vtkCommonDataModel.vtkBoundaryCentered +vtkmodules.vtkCommonDataModel.vtkBoundingBox +vtkmodules.vtkCommonDataModel.vtkBox +vtkmodules.vtkCommonDataModel.vtkCell +vtkmodules.vtkCommonDataModel.vtkCell3D +vtkmodules.vtkCommonDataModel.vtkCellArray +vtkmodules.vtkCommonDataModel.vtkCellArrayIterator +vtkmodules.vtkCommonDataModel.vtkCellCentered +vtkmodules.vtkCommonDataModel.vtkCellData +vtkmodules.vtkCommonDataModel.vtkCellIterator +vtkmodules.vtkCommonDataModel.vtkCellLinks +vtkmodules.vtkCommonDataModel.vtkCellLocator +vtkmodules.vtkCommonDataModel.vtkCellLocatorStrategy +vtkmodules.vtkCommonDataModel.vtkCellTreeLocator +vtkmodules.vtkCommonDataModel.vtkCellTypes +vtkmodules.vtkCommonDataModel.vtkClosestNPointsStrategy +vtkmodules.vtkCommonDataModel.vtkClosestPointStrategy +vtkmodules.vtkCommonDataModel.vtkColor3 +vtkmodules.vtkCommonDataModel.vtkColor3_IdE +vtkmodules.vtkCommonDataModel.vtkColor3_IfE +vtkmodules.vtkCommonDataModel.vtkColor3_IhE +vtkmodules.vtkCommonDataModel.vtkColor3d +vtkmodules.vtkCommonDataModel.vtkColor3f +vtkmodules.vtkCommonDataModel.vtkColor3ub +vtkmodules.vtkCommonDataModel.vtkColor4 +vtkmodules.vtkCommonDataModel.vtkColor4_IdE +vtkmodules.vtkCommonDataModel.vtkColor4_IfE +vtkmodules.vtkCommonDataModel.vtkColor4_IhE +vtkmodules.vtkCommonDataModel.vtkColor4d +vtkmodules.vtkCommonDataModel.vtkColor4f +vtkmodules.vtkCommonDataModel.vtkColor4ub +vtkmodules.vtkCommonDataModel.vtkCompositeDataIterator +vtkmodules.vtkCommonDataModel.vtkCompositeDataSet +vtkmodules.vtkCommonDataModel.vtkCone +vtkmodules.vtkCommonDataModel.vtkConvexPointSet +vtkmodules.vtkCommonDataModel.vtkCoordinateFrame +vtkmodules.vtkCommonDataModel.vtkCubicLine +vtkmodules.vtkCommonDataModel.vtkCylinder +vtkmodules.vtkCommonDataModel.vtkDataAssembly +vtkmodules.vtkCommonDataModel.vtkDataAssemblyUtilities +vtkmodules.vtkCommonDataModel.vtkDataAssemblyVisitor +vtkmodules.vtkCommonDataModel.vtkDataObject +vtkmodules.vtkCommonDataModel.vtkDataObjectCollection +vtkmodules.vtkCommonDataModel.vtkDataObjectTree +vtkmodules.vtkCommonDataModel.vtkDataObjectTreeIndex +vtkmodules.vtkCommonDataModel.vtkDataObjectTreeInternals +vtkmodules.vtkCommonDataModel.vtkDataObjectTreeItem +vtkmodules.vtkCommonDataModel.vtkDataObjectTreeIterator +vtkmodules.vtkCommonDataModel.vtkDataObjectTypes +vtkmodules.vtkCommonDataModel.vtkDataSet +vtkmodules.vtkCommonDataModel.vtkDataSetAttributes +vtkmodules.vtkCommonDataModel.vtkDataSetAttributesFieldList +vtkmodules.vtkCommonDataModel.vtkDataSetCellIterator +vtkmodules.vtkCommonDataModel.vtkDataSetCollection +vtkmodules.vtkCommonDataModel.vtkDirectedAcyclicGraph +vtkmodules.vtkCommonDataModel.vtkDirectedGraph +vtkmodules.vtkCommonDataModel.vtkDistributedGraphHelper +vtkmodules.vtkCommonDataModel.vtkEdgeBase +vtkmodules.vtkCommonDataModel.vtkEdgeListIterator +vtkmodules.vtkCommonDataModel.vtkEdgeTable +vtkmodules.vtkCommonDataModel.vtkEdgeType +vtkmodules.vtkCommonDataModel.vtkEmptyCell +vtkmodules.vtkCommonDataModel.vtkExplicitStructuredGrid +vtkmodules.vtkCommonDataModel.vtkExtractStructuredGridHelper +vtkmodules.vtkCommonDataModel.vtkFieldData +vtkmodules.vtkCommonDataModel.vtkFindCellStrategy +vtkmodules.vtkCommonDataModel.vtkGenericAdaptorCell +vtkmodules.vtkCommonDataModel.vtkGenericAttribute +vtkmodules.vtkCommonDataModel.vtkGenericAttributeCollection +vtkmodules.vtkCommonDataModel.vtkGenericCell +vtkmodules.vtkCommonDataModel.vtkGenericCellIterator +vtkmodules.vtkCommonDataModel.vtkGenericCellTessellator +vtkmodules.vtkCommonDataModel.vtkGenericDataSet +vtkmodules.vtkCommonDataModel.vtkGenericEdgeTable +vtkmodules.vtkCommonDataModel.vtkGenericInterpolatedVelocityField +vtkmodules.vtkCommonDataModel.vtkGenericPointIterator +vtkmodules.vtkCommonDataModel.vtkGenericSubdivisionErrorMetric +vtkmodules.vtkCommonDataModel.vtkGeometricErrorMetric +vtkmodules.vtkCommonDataModel.vtkGraph +vtkmodules.vtkCommonDataModel.vtkGraphEdge +vtkmodules.vtkCommonDataModel.vtkGraphInternals +vtkmodules.vtkCommonDataModel.vtkHexagonalPrism +vtkmodules.vtkCommonDataModel.vtkHexahedron +vtkmodules.vtkCommonDataModel.vtkHierarchicalBoxDataIterator +vtkmodules.vtkCommonDataModel.vtkHierarchicalBoxDataSet +vtkmodules.vtkCommonDataModel.vtkHigherOrderCurve +vtkmodules.vtkCommonDataModel.vtkHigherOrderHexahedron +vtkmodules.vtkCommonDataModel.vtkHigherOrderInterpolation +vtkmodules.vtkCommonDataModel.vtkHigherOrderQuadrilateral +vtkmodules.vtkCommonDataModel.vtkHigherOrderTetra +vtkmodules.vtkCommonDataModel.vtkHigherOrderTriangle +vtkmodules.vtkCommonDataModel.vtkHigherOrderWedge +vtkmodules.vtkCommonDataModel.vtkHyperTree +vtkmodules.vtkCommonDataModel.vtkHyperTreeCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeData +vtkmodules.vtkCommonDataModel.vtkHyperTreeGrid +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedGeometryCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedMooreSuperCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedMooreSuperCursorLight +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedSuperCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedSuperCursorLight +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedVonNeumannSuperCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridNonOrientedVonNeumannSuperCursorLight +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridOrientedCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridOrientedGeometryCursor +vtkmodules.vtkCommonDataModel.vtkHyperTreeGridScales +vtkmodules.vtkCommonDataModel.vtkImageData +vtkmodules.vtkCommonDataModel.vtkImageTransform +vtkmodules.vtkCommonDataModel.vtkImplicitBoolean +vtkmodules.vtkCommonDataModel.vtkImplicitDataSet +vtkmodules.vtkCommonDataModel.vtkImplicitFunction +vtkmodules.vtkCommonDataModel.vtkImplicitFunctionCollection +vtkmodules.vtkCommonDataModel.vtkImplicitHalo +vtkmodules.vtkCommonDataModel.vtkImplicitSelectionLoop +vtkmodules.vtkCommonDataModel.vtkImplicitSum +vtkmodules.vtkCommonDataModel.vtkImplicitVolume +vtkmodules.vtkCommonDataModel.vtkImplicitWindowFunction +vtkmodules.vtkCommonDataModel.vtkInEdgeIterator +vtkmodules.vtkCommonDataModel.vtkInEdgeType +vtkmodules.vtkCommonDataModel.vtkIncrementalOctreeNode +vtkmodules.vtkCommonDataModel.vtkIncrementalOctreePointLocator +vtkmodules.vtkCommonDataModel.vtkIncrementalPointLocator +vtkmodules.vtkCommonDataModel.vtkInformationQuadratureSchemeDefinitionVectorKey +vtkmodules.vtkCommonDataModel.vtkIntersectionCounter +vtkmodules.vtkCommonDataModel.vtkIterativeClosestPointTransform +vtkmodules.vtkCommonDataModel.vtkKdNode +vtkmodules.vtkCommonDataModel.vtkKdTree +vtkmodules.vtkCommonDataModel.vtkKdTreePointLocator +vtkmodules.vtkCommonDataModel.vtkLagrangeCurve +vtkmodules.vtkCommonDataModel.vtkLagrangeHexahedron +vtkmodules.vtkCommonDataModel.vtkLagrangeInterpolation +vtkmodules.vtkCommonDataModel.vtkLagrangeQuadrilateral +vtkmodules.vtkCommonDataModel.vtkLagrangeTetra +vtkmodules.vtkCommonDataModel.vtkLagrangeTriangle +vtkmodules.vtkCommonDataModel.vtkLagrangeWedge +vtkmodules.vtkCommonDataModel.vtkLine +vtkmodules.vtkCommonDataModel.vtkLocator +vtkmodules.vtkCommonDataModel.vtkMarchingCubesTriangleCases +vtkmodules.vtkCommonDataModel.vtkMarchingSquaresLineCases +vtkmodules.vtkCommonDataModel.vtkMeanValueCoordinatesInterpolator +vtkmodules.vtkCommonDataModel.vtkMergePoints +vtkmodules.vtkCommonDataModel.vtkMolecule +vtkmodules.vtkCommonDataModel.vtkMultiBlockDataSet +vtkmodules.vtkCommonDataModel.vtkMultiPieceDataSet +vtkmodules.vtkCommonDataModel.vtkMutableDirectedGraph +vtkmodules.vtkCommonDataModel.vtkMutableUndirectedGraph +vtkmodules.vtkCommonDataModel.vtkNonLinearCell +vtkmodules.vtkCommonDataModel.vtkNonMergingPointLocator +vtkmodules.vtkCommonDataModel.vtkNonOverlappingAMR +vtkmodules.vtkCommonDataModel.vtkOctreePointLocator +vtkmodules.vtkCommonDataModel.vtkOctreePointLocatorNode +vtkmodules.vtkCommonDataModel.vtkOrderedTriangulator +vtkmodules.vtkCommonDataModel.vtkOutEdgeIterator +vtkmodules.vtkCommonDataModel.vtkOutEdgeType +vtkmodules.vtkCommonDataModel.vtkOverlappingAMR +vtkmodules.vtkCommonDataModel.vtkPartitionedDataSet +vtkmodules.vtkCommonDataModel.vtkPartitionedDataSetCollection +vtkmodules.vtkCommonDataModel.vtkPath +vtkmodules.vtkCommonDataModel.vtkPentagonalPrism +vtkmodules.vtkCommonDataModel.vtkPerlinNoise +vtkmodules.vtkCommonDataModel.vtkPiecewiseFunction +vtkmodules.vtkCommonDataModel.vtkPixel +vtkmodules.vtkCommonDataModel.vtkPixelExtent +vtkmodules.vtkCommonDataModel.vtkPixelTransfer +vtkmodules.vtkCommonDataModel.vtkPlane +vtkmodules.vtkCommonDataModel.vtkPlaneCollection +vtkmodules.vtkCommonDataModel.vtkPlanes +vtkmodules.vtkCommonDataModel.vtkPlanesIntersection +vtkmodules.vtkCommonDataModel.vtkPointCentered +vtkmodules.vtkCommonDataModel.vtkPointData +vtkmodules.vtkCommonDataModel.vtkPointLocator +vtkmodules.vtkCommonDataModel.vtkPointSet +vtkmodules.vtkCommonDataModel.vtkPointSetCellIterator +vtkmodules.vtkCommonDataModel.vtkPointsProjectedHull +vtkmodules.vtkCommonDataModel.vtkPolyData +vtkmodules.vtkCommonDataModel.vtkPolyDataCollection +vtkmodules.vtkCommonDataModel.vtkPolyLine +vtkmodules.vtkCommonDataModel.vtkPolyPlane +vtkmodules.vtkCommonDataModel.vtkPolyVertex +vtkmodules.vtkCommonDataModel.vtkPolygon +vtkmodules.vtkCommonDataModel.vtkPolyhedron +vtkmodules.vtkCommonDataModel.vtkPyramid +vtkmodules.vtkCommonDataModel.vtkQuad +vtkmodules.vtkCommonDataModel.vtkQuadraticEdge +vtkmodules.vtkCommonDataModel.vtkQuadraticHexahedron +vtkmodules.vtkCommonDataModel.vtkQuadraticLinearQuad +vtkmodules.vtkCommonDataModel.vtkQuadraticLinearWedge +vtkmodules.vtkCommonDataModel.vtkQuadraticPolygon +vtkmodules.vtkCommonDataModel.vtkQuadraticPyramid +vtkmodules.vtkCommonDataModel.vtkQuadraticQuad +vtkmodules.vtkCommonDataModel.vtkQuadraticTetra +vtkmodules.vtkCommonDataModel.vtkQuadraticTriangle +vtkmodules.vtkCommonDataModel.vtkQuadraticWedge +vtkmodules.vtkCommonDataModel.vtkQuadratureSchemeDefinition +vtkmodules.vtkCommonDataModel.vtkQuadric +vtkmodules.vtkCommonDataModel.vtkRect +vtkmodules.vtkCommonDataModel.vtkRect_IdE +vtkmodules.vtkCommonDataModel.vtkRect_IfE +vtkmodules.vtkCommonDataModel.vtkRect_IiE +vtkmodules.vtkCommonDataModel.vtkRectd +vtkmodules.vtkCommonDataModel.vtkRectf +vtkmodules.vtkCommonDataModel.vtkRecti +vtkmodules.vtkCommonDataModel.vtkRectilinearGrid +vtkmodules.vtkCommonDataModel.vtkReebGraph +vtkmodules.vtkCommonDataModel.vtkReebGraphSimplificationMetric +vtkmodules.vtkCommonDataModel.vtkSelection +vtkmodules.vtkCommonDataModel.vtkSelectionNode +vtkmodules.vtkCommonDataModel.vtkSimpleCellTessellator +vtkmodules.vtkCommonDataModel.vtkSmoothErrorMetric +vtkmodules.vtkCommonDataModel.vtkSortFieldData +vtkmodules.vtkCommonDataModel.vtkSphere +vtkmodules.vtkCommonDataModel.vtkSpheres +vtkmodules.vtkCommonDataModel.vtkSphericalPointIterator +vtkmodules.vtkCommonDataModel.vtkSpline +vtkmodules.vtkCommonDataModel.vtkStaticCellLinks +vtkmodules.vtkCommonDataModel.vtkStaticCellLocator +vtkmodules.vtkCommonDataModel.vtkStaticPointLocator +vtkmodules.vtkCommonDataModel.vtkStaticPointLocator2D +vtkmodules.vtkCommonDataModel.vtkStructuredData +vtkmodules.vtkCommonDataModel.vtkStructuredExtent +vtkmodules.vtkCommonDataModel.vtkStructuredGrid +vtkmodules.vtkCommonDataModel.vtkStructuredPoints +vtkmodules.vtkCommonDataModel.vtkStructuredPointsCollection +vtkmodules.vtkCommonDataModel.vtkSuperquadric +vtkmodules.vtkCommonDataModel.vtkTable +vtkmodules.vtkCommonDataModel.vtkTetra +vtkmodules.vtkCommonDataModel.vtkTree +vtkmodules.vtkCommonDataModel.vtkTreeBFSIterator +vtkmodules.vtkCommonDataModel.vtkTreeDFSIterator +vtkmodules.vtkCommonDataModel.vtkTreeIterator +vtkmodules.vtkCommonDataModel.vtkTriQuadraticHexahedron +vtkmodules.vtkCommonDataModel.vtkTriQuadraticPyramid +vtkmodules.vtkCommonDataModel.vtkTriangle +vtkmodules.vtkCommonDataModel.vtkTriangleStrip +vtkmodules.vtkCommonDataModel.vtkUndirectedGraph +vtkmodules.vtkCommonDataModel.vtkUniformGrid +vtkmodules.vtkCommonDataModel.vtkUniformGridAMR +vtkmodules.vtkCommonDataModel.vtkUniformGridAMRDataIterator +vtkmodules.vtkCommonDataModel.vtkUniformHyperTreeGrid +vtkmodules.vtkCommonDataModel.vtkUnstructuredGrid +vtkmodules.vtkCommonDataModel.vtkUnstructuredGridBase +vtkmodules.vtkCommonDataModel.vtkUnstructuredGridCellIterator +vtkmodules.vtkCommonDataModel.vtkVector +vtkmodules.vtkCommonDataModel.vtkVector2 +vtkmodules.vtkCommonDataModel.vtkVector2_IdE +vtkmodules.vtkCommonDataModel.vtkVector2_IfE +vtkmodules.vtkCommonDataModel.vtkVector2_IiE +vtkmodules.vtkCommonDataModel.vtkVector2d +vtkmodules.vtkCommonDataModel.vtkVector2f +vtkmodules.vtkCommonDataModel.vtkVector2i +vtkmodules.vtkCommonDataModel.vtkVector3 +vtkmodules.vtkCommonDataModel.vtkVector3_IdE +vtkmodules.vtkCommonDataModel.vtkVector3_IfE +vtkmodules.vtkCommonDataModel.vtkVector3_IiE +vtkmodules.vtkCommonDataModel.vtkVector3d +vtkmodules.vtkCommonDataModel.vtkVector3f +vtkmodules.vtkCommonDataModel.vtkVector3i +vtkmodules.vtkCommonDataModel.vtkVector4 +vtkmodules.vtkCommonDataModel.vtkVector4_IdE +vtkmodules.vtkCommonDataModel.vtkVector4_IiE +vtkmodules.vtkCommonDataModel.vtkVector4d +vtkmodules.vtkCommonDataModel.vtkVector4i +vtkmodules.vtkCommonDataModel.vtkVector_IdLi2EE +vtkmodules.vtkCommonDataModel.vtkVector_IdLi3EE +vtkmodules.vtkCommonDataModel.vtkVector_IdLi4EE +vtkmodules.vtkCommonDataModel.vtkVector_IfLi2EE +vtkmodules.vtkCommonDataModel.vtkVector_IfLi3EE +vtkmodules.vtkCommonDataModel.vtkVector_IfLi4EE +vtkmodules.vtkCommonDataModel.vtkVector_IiLi2EE +vtkmodules.vtkCommonDataModel.vtkVector_IiLi3EE +vtkmodules.vtkCommonDataModel.vtkVector_IiLi4EE +vtkmodules.vtkCommonDataModel.vtkVertex +vtkmodules.vtkCommonDataModel.vtkVertexAdjacencyList +vtkmodules.vtkCommonDataModel.vtkVertexListIterator +vtkmodules.vtkCommonDataModel.vtkVoxel +vtkmodules.vtkCommonDataModel.vtkWedge +vtkmodules.vtkCommonDataModel.vtkXMLDataElement +vtkmodules.vtkCommonExecutionModel.VTK_MAX_SPHERE_TREE_LEVELS +vtkmodules.vtkCommonExecutionModel.VTK_MAX_SPHERE_TREE_RESOLUTION +vtkmodules.vtkCommonExecutionModel.VTK_UPDATE_EXTENT_COMBINE +vtkmodules.vtkCommonExecutionModel.VTK_UPDATE_EXTENT_REPLACE +vtkmodules.vtkCommonExecutionModel.vtkAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkAlgorithmOutput +vtkmodules.vtkCommonExecutionModel.vtkAnnotationLayersAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkArrayDataAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkCachedStreamingDemandDrivenPipeline +vtkmodules.vtkCommonExecutionModel.vtkCastToConcrete +vtkmodules.vtkCommonExecutionModel.vtkCompositeDataPipeline +vtkmodules.vtkCommonExecutionModel.vtkCompositeDataSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkDataObjectAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkDataSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkDemandDrivenPipeline +vtkmodules.vtkCommonExecutionModel.vtkDirectedGraphAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkEnsembleSource +vtkmodules.vtkCommonExecutionModel.vtkExecutive +vtkmodules.vtkCommonExecutionModel.vtkExplicitStructuredGridAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkExtentRCBPartitioner +vtkmodules.vtkCommonExecutionModel.vtkExtentSplitter +vtkmodules.vtkCommonExecutionModel.vtkExtentTranslator +vtkmodules.vtkCommonExecutionModel.vtkFilteringInformationKeyManager +vtkmodules.vtkCommonExecutionModel.vtkGraphAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkHierarchicalBoxDataSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkHyperTreeGridAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkImageAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkImageInPlaceFilter +vtkmodules.vtkCommonExecutionModel.vtkImageToStructuredGrid +vtkmodules.vtkCommonExecutionModel.vtkImageToStructuredPoints +vtkmodules.vtkCommonExecutionModel.vtkInformationDataObjectMetaDataKey +vtkmodules.vtkCommonExecutionModel.vtkInformationExecutivePortKey +vtkmodules.vtkCommonExecutionModel.vtkInformationExecutivePortVectorKey +vtkmodules.vtkCommonExecutionModel.vtkInformationIntegerRequestKey +vtkmodules.vtkCommonExecutionModel.vtkMoleculeAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkMultiBlockDataSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkMultiTimeStepAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkNonOverlappingAMRAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkOverlappingAMRAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkParallelReader +vtkmodules.vtkCommonExecutionModel.vtkPartitionedDataSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkPartitionedDataSetCollectionAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkPassInputTypeAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkPiecewiseFunctionAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkPiecewiseFunctionShiftScale +vtkmodules.vtkCommonExecutionModel.vtkPointSetAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkPolyDataAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkProgressObserver +vtkmodules.vtkCommonExecutionModel.vtkReaderAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkReaderExecutive +vtkmodules.vtkCommonExecutionModel.vtkRectilinearGridAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkSMPProgressObserver +vtkmodules.vtkCommonExecutionModel.vtkScalarTree +vtkmodules.vtkCommonExecutionModel.vtkSelectionAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkSimpleImageToImageFilter +vtkmodules.vtkCommonExecutionModel.vtkSimpleReader +vtkmodules.vtkCommonExecutionModel.vtkSimpleScalarTree +vtkmodules.vtkCommonExecutionModel.vtkSpanSpace +vtkmodules.vtkCommonExecutionModel.vtkSphereTree +vtkmodules.vtkCommonExecutionModel.vtkStreamingDemandDrivenPipeline +vtkmodules.vtkCommonExecutionModel.vtkStructuredGridAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkTableAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkThreadedCompositeDataPipeline +vtkmodules.vtkCommonExecutionModel.vtkThreadedImageAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkTreeAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkTrivialConsumer +vtkmodules.vtkCommonExecutionModel.vtkTrivialProducer +vtkmodules.vtkCommonExecutionModel.vtkUndirectedGraphAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkUniformGridAMRAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkUniformGridPartitioner +vtkmodules.vtkCommonExecutionModel.vtkUnstructuredGridAlgorithm +vtkmodules.vtkCommonExecutionModel.vtkUnstructuredGridBaseAlgorithm +vtkmodules.vtkCommonMath.vtkAmoebaMinimizer +vtkmodules.vtkCommonMath.vtkFFT +vtkmodules.vtkCommonMath.vtkFunctionSet +vtkmodules.vtkCommonMath.vtkInitialValueProblemSolver +vtkmodules.vtkCommonMath.vtkMatrix3x3 +vtkmodules.vtkCommonMath.vtkMatrix4x4 +vtkmodules.vtkCommonMath.vtkPolynomialSolversUnivariate +vtkmodules.vtkCommonMath.vtkQuaternion +vtkmodules.vtkCommonMath.vtkQuaternionInterpolator +vtkmodules.vtkCommonMath.vtkQuaternion_IdE +vtkmodules.vtkCommonMath.vtkQuaternion_IfE +vtkmodules.vtkCommonMath.vtkQuaterniond +vtkmodules.vtkCommonMath.vtkQuaternionf +vtkmodules.vtkCommonMath.vtkRungeKutta2 +vtkmodules.vtkCommonMath.vtkRungeKutta4 +vtkmodules.vtkCommonMath.vtkRungeKutta45 +vtkmodules.vtkCommonMath.vtkTuple +vtkmodules.vtkCommonMath.vtkTuple_IdLi2EE +vtkmodules.vtkCommonMath.vtkTuple_IdLi3EE +vtkmodules.vtkCommonMath.vtkTuple_IdLi4EE +vtkmodules.vtkCommonMath.vtkTuple_IfLi2EE +vtkmodules.vtkCommonMath.vtkTuple_IfLi3EE +vtkmodules.vtkCommonMath.vtkTuple_IfLi4EE +vtkmodules.vtkCommonMath.vtkTuple_IhLi2EE +vtkmodules.vtkCommonMath.vtkTuple_IhLi3EE +vtkmodules.vtkCommonMath.vtkTuple_IhLi4EE +vtkmodules.vtkCommonMath.vtkTuple_IiLi2EE +vtkmodules.vtkCommonMath.vtkTuple_IiLi3EE +vtkmodules.vtkCommonMath.vtkTuple_IiLi4EE +vtkmodules.vtkCommonMisc.VTK_PARSER_ABSOLUTE_VALUE +vtkmodules.vtkCommonMisc.VTK_PARSER_ADD +vtkmodules.vtkCommonMisc.VTK_PARSER_AND +vtkmodules.vtkCommonMisc.VTK_PARSER_ARCCOSINE +vtkmodules.vtkCommonMisc.VTK_PARSER_ARCSINE +vtkmodules.vtkCommonMisc.VTK_PARSER_ARCTANGENT +vtkmodules.vtkCommonMisc.VTK_PARSER_BEGIN_VARIABLES +vtkmodules.vtkCommonMisc.VTK_PARSER_CEILING +vtkmodules.vtkCommonMisc.VTK_PARSER_COSINE +vtkmodules.vtkCommonMisc.VTK_PARSER_CROSS +vtkmodules.vtkCommonMisc.VTK_PARSER_DIVIDE +vtkmodules.vtkCommonMisc.VTK_PARSER_DOT_PRODUCT +vtkmodules.vtkCommonMisc.VTK_PARSER_EQUAL_TO +vtkmodules.vtkCommonMisc.VTK_PARSER_ERROR_RESULT +vtkmodules.vtkCommonMisc.VTK_PARSER_EXPONENT +vtkmodules.vtkCommonMisc.VTK_PARSER_FLOOR +vtkmodules.vtkCommonMisc.VTK_PARSER_GREATER_THAN +vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_COSINE +vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_SINE +vtkmodules.vtkCommonMisc.VTK_PARSER_HYPERBOLIC_TANGENT +vtkmodules.vtkCommonMisc.VTK_PARSER_IF +vtkmodules.vtkCommonMisc.VTK_PARSER_IHAT +vtkmodules.vtkCommonMisc.VTK_PARSER_IMMEDIATE +vtkmodules.vtkCommonMisc.VTK_PARSER_JHAT +vtkmodules.vtkCommonMisc.VTK_PARSER_KHAT +vtkmodules.vtkCommonMisc.VTK_PARSER_LESS_THAN +vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHM +vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHM10 +vtkmodules.vtkCommonMisc.VTK_PARSER_LOGARITHME +vtkmodules.vtkCommonMisc.VTK_PARSER_MAGNITUDE +vtkmodules.vtkCommonMisc.VTK_PARSER_MAX +vtkmodules.vtkCommonMisc.VTK_PARSER_MIN +vtkmodules.vtkCommonMisc.VTK_PARSER_MULTIPLY +vtkmodules.vtkCommonMisc.VTK_PARSER_NORMALIZE +vtkmodules.vtkCommonMisc.VTK_PARSER_OR +vtkmodules.vtkCommonMisc.VTK_PARSER_POWER +vtkmodules.vtkCommonMisc.VTK_PARSER_SCALAR_TIMES_VECTOR +vtkmodules.vtkCommonMisc.VTK_PARSER_SIGN +vtkmodules.vtkCommonMisc.VTK_PARSER_SINE +vtkmodules.vtkCommonMisc.VTK_PARSER_SQUARE_ROOT +vtkmodules.vtkCommonMisc.VTK_PARSER_SUBTRACT +vtkmodules.vtkCommonMisc.VTK_PARSER_TANGENT +vtkmodules.vtkCommonMisc.VTK_PARSER_UNARY_MINUS +vtkmodules.vtkCommonMisc.VTK_PARSER_UNARY_PLUS +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_ADD +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_IF +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_OVER_SCALAR +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_SUBTRACT +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_TIMES_SCALAR +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_UNARY_MINUS +vtkmodules.vtkCommonMisc.VTK_PARSER_VECTOR_UNARY_PLUS +vtkmodules.vtkCommonMisc.vtkContourValues +vtkmodules.vtkCommonMisc.vtkErrorCode +vtkmodules.vtkCommonMisc.vtkExprTkFunctionParser +vtkmodules.vtkCommonMisc.vtkFunctionParser +vtkmodules.vtkCommonMisc.vtkHeap +vtkmodules.vtkCommonMisc.vtkPolygonBuilder +vtkmodules.vtkCommonMisc.vtkResourceFileLocator +vtkmodules.vtkCommonPython.vtkPythonArchiver +vtkmodules.vtkCommonSystem.vtkClientSocket +vtkmodules.vtkCommonSystem.vtkDirectory +vtkmodules.vtkCommonSystem.vtkExecutableRunner +vtkmodules.vtkCommonSystem.vtkServerSocket +vtkmodules.vtkCommonSystem.vtkSocket +vtkmodules.vtkCommonSystem.vtkSocketCollection +vtkmodules.vtkCommonSystem.vtkThreadMessager +vtkmodules.vtkCommonSystem.vtkTimerLog +vtkmodules.vtkCommonSystem.vtkTimerLogCleanup +vtkmodules.vtkCommonSystem.vtkTimerLogEntry +vtkmodules.vtkCommonSystem.vtkTimerLogScope +vtkmodules.vtkCommonTransforms.VTK_LANDMARK_AFFINE +vtkmodules.vtkCommonTransforms.VTK_LANDMARK_RIGIDBODY +vtkmodules.vtkCommonTransforms.VTK_LANDMARK_SIMILARITY +vtkmodules.vtkCommonTransforms.VTK_RBF_CUSTOM +vtkmodules.vtkCommonTransforms.VTK_RBF_R +vtkmodules.vtkCommonTransforms.VTK_RBF_R2LOGR +vtkmodules.vtkCommonTransforms.vtkAbstractTransform +vtkmodules.vtkCommonTransforms.vtkCylindricalTransform +vtkmodules.vtkCommonTransforms.vtkGeneralTransform +vtkmodules.vtkCommonTransforms.vtkHomogeneousTransform +vtkmodules.vtkCommonTransforms.vtkIdentityTransform +vtkmodules.vtkCommonTransforms.vtkLandmarkTransform +vtkmodules.vtkCommonTransforms.vtkLinearTransform +vtkmodules.vtkCommonTransforms.vtkMatrixToHomogeneousTransform +vtkmodules.vtkCommonTransforms.vtkMatrixToLinearTransform +vtkmodules.vtkCommonTransforms.vtkPerspectiveTransform +vtkmodules.vtkCommonTransforms.vtkSphericalTransform +vtkmodules.vtkCommonTransforms.vtkThinPlateSplineTransform +vtkmodules.vtkCommonTransforms.vtkTransform +vtkmodules.vtkCommonTransforms.vtkTransform2D +vtkmodules.vtkCommonTransforms.vtkTransformCollection +vtkmodules.vtkCommonTransforms.vtkTransformConcatenation +vtkmodules.vtkCommonTransforms.vtkTransformConcatenationStack +vtkmodules.vtkCommonTransforms.vtkTransformPair +vtkmodules.vtkCommonTransforms.vtkWarpTransform +vtkmodules.vtkDomainsChemistry.vtkBlueObeliskData +vtkmodules.vtkDomainsChemistry.vtkBlueObeliskDataParser +vtkmodules.vtkDomainsChemistry.vtkMoleculeMapper +vtkmodules.vtkDomainsChemistry.vtkMoleculeToAtomBallFilter +vtkmodules.vtkDomainsChemistry.vtkMoleculeToBondStickFilter +vtkmodules.vtkDomainsChemistry.vtkMoleculeToLinesFilter +vtkmodules.vtkDomainsChemistry.vtkMoleculeToPolyDataFilter +vtkmodules.vtkDomainsChemistry.vtkPeriodicTable +vtkmodules.vtkDomainsChemistry.vtkPointSetToMoleculeFilter +vtkmodules.vtkDomainsChemistry.vtkProgrammableElectronicData +vtkmodules.vtkDomainsChemistry.vtkProteinRibbonFilter +vtkmodules.vtkDomainsChemistry.vtkSimpleBondPerceiver +vtkmodules.vtkDomainsChemistryOpenGL2.vtkOpenGLMoleculeMapper +vtkmodules.vtkFiltersAMR.vtkAMRCutPlane +vtkmodules.vtkFiltersAMR.vtkAMRGaussianPulseSource +vtkmodules.vtkFiltersAMR.vtkAMRResampleFilter +vtkmodules.vtkFiltersAMR.vtkAMRSliceFilter +vtkmodules.vtkFiltersAMR.vtkAMRToMultiBlockFilter +vtkmodules.vtkFiltersAMR.vtkImageToAMR +vtkmodules.vtkFiltersAMR.vtkParallelAMRUtilities +vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_DEFAULT +vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_USE_CELL_DATA +vtkmodules.vtkFiltersCore.VTK_ATTRIBUTE_MODE_USE_POINT_DATA +vtkmodules.vtkFiltersCore.VTK_BEST_FITTING_PLANE +vtkmodules.vtkFiltersCore.VTK_CELL_DATA +vtkmodules.vtkFiltersCore.VTK_CELL_DATA_FIELD +vtkmodules.vtkFiltersCore.VTK_COLOR_BY_SCALAR +vtkmodules.vtkFiltersCore.VTK_COLOR_BY_SCALE +vtkmodules.vtkFiltersCore.VTK_COLOR_BY_VECTOR +vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_ALL +vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_ANY +vtkmodules.vtkFiltersCore.VTK_COMPONENT_MODE_USE_SELECTED +vtkmodules.vtkFiltersCore.VTK_DATA_OBJECT_FIELD +vtkmodules.vtkFiltersCore.VTK_DATA_SCALING_OFF +vtkmodules.vtkFiltersCore.VTK_DELAUNAY_XY_PLANE +vtkmodules.vtkFiltersCore.VTK_EXTRACT_ALL_REGIONS +vtkmodules.vtkFiltersCore.VTK_EXTRACT_CELL_SEEDED_REGIONS +vtkmodules.vtkFiltersCore.VTK_EXTRACT_CLOSEST_POINT_REGION +vtkmodules.vtkFiltersCore.VTK_EXTRACT_LARGEST_REGION +vtkmodules.vtkFiltersCore.VTK_EXTRACT_LARGE_REGIONS +vtkmodules.vtkFiltersCore.VTK_EXTRACT_POINT_SEEDED_REGIONS +vtkmodules.vtkFiltersCore.VTK_EXTRACT_SPECIFIED_REGIONS +vtkmodules.vtkFiltersCore.VTK_FOLLOW_CAMERA_DIRECTION +vtkmodules.vtkFiltersCore.VTK_INDEXING_BY_SCALAR +vtkmodules.vtkFiltersCore.VTK_INDEXING_BY_VECTOR +vtkmodules.vtkFiltersCore.VTK_INDEXING_OFF +vtkmodules.vtkFiltersCore.VTK_POINT_DATA +vtkmodules.vtkFiltersCore.VTK_POINT_DATA_FIELD +vtkmodules.vtkFiltersCore.VTK_SCALE_BY_SCALAR +vtkmodules.vtkFiltersCore.VTK_SCALE_BY_VECTOR +vtkmodules.vtkFiltersCore.VTK_SCALE_BY_VECTORCOMPONENTS +vtkmodules.vtkFiltersCore.VTK_SET_TRANSFORM_PLANE +vtkmodules.vtkFiltersCore.VTK_SORT_BY_CELL +vtkmodules.vtkFiltersCore.VTK_SORT_BY_VALUE +vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_LEVELS +vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_LINE +vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_PLANE +vtkmodules.vtkFiltersCore.VTK_SPHERE_TREE_POINT +vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_LENGTH +vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_NORMALIZED_LENGTH +vtkmodules.vtkFiltersCore.VTK_TCOORDS_FROM_SCALARS +vtkmodules.vtkFiltersCore.VTK_TCOORDS_OFF +vtkmodules.vtkFiltersCore.VTK_USE_NORMAL +vtkmodules.vtkFiltersCore.VTK_USE_VECTOR +vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_ABSOLUTE_SCALAR +vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_SCALAR +vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_VECTOR +vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_BY_VECTOR_NORM +vtkmodules.vtkFiltersCore.VTK_VARY_RADIUS_OFF +vtkmodules.vtkFiltersCore.VTK_VECTOR_ROTATION_OFF +vtkmodules.vtkFiltersCore.vtk3DLinearGridCrinkleExtractor +vtkmodules.vtkFiltersCore.vtk3DLinearGridPlaneCutter +vtkmodules.vtkFiltersCore.vtkAppendArcLength +vtkmodules.vtkFiltersCore.vtkAppendCompositeDataLeaves +vtkmodules.vtkFiltersCore.vtkAppendDataSets +vtkmodules.vtkFiltersCore.vtkAppendFilter +vtkmodules.vtkFiltersCore.vtkAppendPolyData +vtkmodules.vtkFiltersCore.vtkAppendSelection +vtkmodules.vtkFiltersCore.vtkArrayCalculator +vtkmodules.vtkFiltersCore.vtkArrayRename +vtkmodules.vtkFiltersCore.vtkAssignAttribute +vtkmodules.vtkFiltersCore.vtkAttributeDataToFieldDataFilter +vtkmodules.vtkFiltersCore.vtkBinCellDataFilter +vtkmodules.vtkFiltersCore.vtkBinnedDecimation +vtkmodules.vtkFiltersCore.vtkCellCenters +vtkmodules.vtkFiltersCore.vtkCellDataToPointData +vtkmodules.vtkFiltersCore.vtkCenterOfMass +vtkmodules.vtkFiltersCore.vtkCleanPolyData +vtkmodules.vtkFiltersCore.vtkClipPolyData +vtkmodules.vtkFiltersCore.vtkCompositeCutter +vtkmodules.vtkFiltersCore.vtkCompositeDataProbeFilter +vtkmodules.vtkFiltersCore.vtkConnectivityFilter +vtkmodules.vtkFiltersCore.vtkConstrainedSmoothingFilter +vtkmodules.vtkFiltersCore.vtkContour3DLinearGrid +vtkmodules.vtkFiltersCore.vtkContourFilter +vtkmodules.vtkFiltersCore.vtkContourGrid +vtkmodules.vtkFiltersCore.vtkContourHelper +vtkmodules.vtkFiltersCore.vtkConvertToMultiBlockDataSet +vtkmodules.vtkFiltersCore.vtkConvertToPartitionedDataSetCollection +vtkmodules.vtkFiltersCore.vtkConvertToPolyhedra +vtkmodules.vtkFiltersCore.vtkCutter +vtkmodules.vtkFiltersCore.vtkDataObjectGenerator +vtkmodules.vtkFiltersCore.vtkDataObjectToDataSetFilter +vtkmodules.vtkFiltersCore.vtkDataSetEdgeSubdivisionCriterion +vtkmodules.vtkFiltersCore.vtkDataSetToDataObjectFilter +vtkmodules.vtkFiltersCore.vtkDecimatePolylineFilter +vtkmodules.vtkFiltersCore.vtkDecimatePro +vtkmodules.vtkFiltersCore.vtkDelaunay2D +vtkmodules.vtkFiltersCore.vtkDelaunay3D +vtkmodules.vtkFiltersCore.vtkEdgeSubdivisionCriterion +vtkmodules.vtkFiltersCore.vtkElevationFilter +vtkmodules.vtkFiltersCore.vtkExecutionTimer +vtkmodules.vtkFiltersCore.vtkExplicitStructuredGridCrop +vtkmodules.vtkFiltersCore.vtkExplicitStructuredGridToUnstructuredGrid +vtkmodules.vtkFiltersCore.vtkExtractCellsAlongPolyLine +vtkmodules.vtkFiltersCore.vtkExtractEdges +vtkmodules.vtkFiltersCore.vtkFeatureEdges +vtkmodules.vtkFiltersCore.vtkFieldDataToAttributeDataFilter +vtkmodules.vtkFiltersCore.vtkFlyingEdges2D +vtkmodules.vtkFiltersCore.vtkFlyingEdges3D +vtkmodules.vtkFiltersCore.vtkFlyingEdgesPlaneCutter +vtkmodules.vtkFiltersCore.vtkGlyph2D +vtkmodules.vtkFiltersCore.vtkGlyph3D +vtkmodules.vtkFiltersCore.vtkGridSynchronizedTemplates3D +vtkmodules.vtkFiltersCore.vtkHedgeHog +vtkmodules.vtkFiltersCore.vtkHull +vtkmodules.vtkFiltersCore.vtkIdFilter +vtkmodules.vtkFiltersCore.vtkImageAppend +vtkmodules.vtkFiltersCore.vtkImageDataToExplicitStructuredGrid +vtkmodules.vtkFiltersCore.vtkImplicitPolyDataDistance +vtkmodules.vtkFiltersCore.vtkImplicitProjectOnPlaneDistance +vtkmodules.vtkFiltersCore.vtkMarchingCubes +vtkmodules.vtkFiltersCore.vtkMarchingSquares +vtkmodules.vtkFiltersCore.vtkMaskFields +vtkmodules.vtkFiltersCore.vtkMaskPoints +vtkmodules.vtkFiltersCore.vtkMaskPolyData +vtkmodules.vtkFiltersCore.vtkMassProperties +vtkmodules.vtkFiltersCore.vtkMergeDataObjectFilter +vtkmodules.vtkFiltersCore.vtkMergeFields +vtkmodules.vtkFiltersCore.vtkMergeFilter +vtkmodules.vtkFiltersCore.vtkMoleculeAppend +vtkmodules.vtkFiltersCore.vtkMultiObjectMassProperties +vtkmodules.vtkFiltersCore.vtkPassThrough +vtkmodules.vtkFiltersCore.vtkPlaneCutter +vtkmodules.vtkFiltersCore.vtkPointDataToCellData +vtkmodules.vtkFiltersCore.vtkPolyDataConnectivityFilter +vtkmodules.vtkFiltersCore.vtkPolyDataEdgeConnectivityFilter +vtkmodules.vtkFiltersCore.vtkPolyDataNormals +vtkmodules.vtkFiltersCore.vtkPolyDataPlaneClipper +vtkmodules.vtkFiltersCore.vtkPolyDataPlaneCutter +vtkmodules.vtkFiltersCore.vtkPolyDataTangents +vtkmodules.vtkFiltersCore.vtkProbeFilter +vtkmodules.vtkFiltersCore.vtkQuadricClustering +vtkmodules.vtkFiltersCore.vtkQuadricDecimation +vtkmodules.vtkFiltersCore.vtkRearrangeFields +vtkmodules.vtkFiltersCore.vtkRectilinearSynchronizedTemplates +vtkmodules.vtkFiltersCore.vtkRemoveDuplicatePolys +vtkmodules.vtkFiltersCore.vtkRemoveUnusedPoints +vtkmodules.vtkFiltersCore.vtkResampleToImage +vtkmodules.vtkFiltersCore.vtkResampleWithDataSet +vtkmodules.vtkFiltersCore.vtkReverseSense +vtkmodules.vtkFiltersCore.vtkSimpleElevationFilter +vtkmodules.vtkFiltersCore.vtkSmoothPolyDataFilter +vtkmodules.vtkFiltersCore.vtkSphereTreeFilter +vtkmodules.vtkFiltersCore.vtkStaticCleanPolyData +vtkmodules.vtkFiltersCore.vtkStaticCleanUnstructuredGrid +vtkmodules.vtkFiltersCore.vtkStreamerBase +vtkmodules.vtkFiltersCore.vtkStreamingTessellator +vtkmodules.vtkFiltersCore.vtkStripper +vtkmodules.vtkFiltersCore.vtkStructuredGridAppend +vtkmodules.vtkFiltersCore.vtkStructuredGridOutlineFilter +vtkmodules.vtkFiltersCore.vtkSurfaceNets2D +vtkmodules.vtkFiltersCore.vtkSynchronizedTemplates2D +vtkmodules.vtkFiltersCore.vtkSynchronizedTemplates3D +vtkmodules.vtkFiltersCore.vtkSynchronizedTemplatesCutter3D +vtkmodules.vtkFiltersCore.vtkTensorGlyph +vtkmodules.vtkFiltersCore.vtkThreshold +vtkmodules.vtkFiltersCore.vtkThresholdPoints +vtkmodules.vtkFiltersCore.vtkTransposeTable +vtkmodules.vtkFiltersCore.vtkTriangleFilter +vtkmodules.vtkFiltersCore.vtkTriangleMeshPointNormals +vtkmodules.vtkFiltersCore.vtkTubeBender +vtkmodules.vtkFiltersCore.vtkTubeFilter +vtkmodules.vtkFiltersCore.vtkUnstructuredGridQuadricDecimation +vtkmodules.vtkFiltersCore.vtkUnstructuredGridToExplicitStructuredGrid +vtkmodules.vtkFiltersCore.vtkVectorDot +vtkmodules.vtkFiltersCore.vtkVectorNorm +vtkmodules.vtkFiltersCore.vtkVoronoi2D +vtkmodules.vtkFiltersCore.vtkWindowedSincPolyDataFilter +vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_COMPONENT +vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_DETERMINANT +vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_EFFECTIVE_STRESS +vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_NONNEGATIVE_DETERMINANT +vtkmodules.vtkFiltersExtraction.VTK_EXTRACT_TRACE +vtkmodules.vtkFiltersExtraction.vtkBlockSelector +vtkmodules.vtkFiltersExtraction.vtkConvertSelection +vtkmodules.vtkFiltersExtraction.vtkExpandMarkedElements +vtkmodules.vtkFiltersExtraction.vtkExtractBlock +vtkmodules.vtkFiltersExtraction.vtkExtractBlockUsingDataAssembly +vtkmodules.vtkFiltersExtraction.vtkExtractCells +vtkmodules.vtkFiltersExtraction.vtkExtractCellsByType +vtkmodules.vtkFiltersExtraction.vtkExtractDataArraysOverTime +vtkmodules.vtkFiltersExtraction.vtkExtractDataOverTime +vtkmodules.vtkFiltersExtraction.vtkExtractDataSets +vtkmodules.vtkFiltersExtraction.vtkExtractExodusGlobalTemporalVariables +vtkmodules.vtkFiltersExtraction.vtkExtractGeometry +vtkmodules.vtkFiltersExtraction.vtkExtractGrid +vtkmodules.vtkFiltersExtraction.vtkExtractLevel +vtkmodules.vtkFiltersExtraction.vtkExtractParticlesOverTime +vtkmodules.vtkFiltersExtraction.vtkExtractPolyDataGeometry +vtkmodules.vtkFiltersExtraction.vtkExtractRectilinearGrid +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedArraysOverTime +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedBlock +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedIds +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedLocations +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedPolyDataIds +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedRows +vtkmodules.vtkFiltersExtraction.vtkExtractSelectedThresholds +vtkmodules.vtkFiltersExtraction.vtkExtractSelection +vtkmodules.vtkFiltersExtraction.vtkExtractTensorComponents +vtkmodules.vtkFiltersExtraction.vtkExtractTimeSteps +vtkmodules.vtkFiltersExtraction.vtkExtractUnstructuredGrid +vtkmodules.vtkFiltersExtraction.vtkExtractVectorComponents +vtkmodules.vtkFiltersExtraction.vtkFrustumSelector +vtkmodules.vtkFiltersExtraction.vtkHierarchicalDataExtractDataSets +vtkmodules.vtkFiltersExtraction.vtkHierarchicalDataExtractLevel +vtkmodules.vtkFiltersExtraction.vtkLocationSelector +vtkmodules.vtkFiltersExtraction.vtkProbeSelectedLocations +vtkmodules.vtkFiltersExtraction.vtkSelector +vtkmodules.vtkFiltersExtraction.vtkValueSelector +vtkmodules.vtkFiltersFlowPaths.vtkAMRInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkAbstractInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkCachingInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkCellLocatorInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkCompositeInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkEvenlySpacedStreamlines2D +vtkmodules.vtkFiltersFlowPaths.vtkInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkIntervalInformation +vtkmodules.vtkFiltersFlowPaths.vtkLagrangianBasicIntegrationModel +vtkmodules.vtkFiltersFlowPaths.vtkLagrangianMatidaIntegrationModel +vtkmodules.vtkFiltersFlowPaths.vtkLagrangianParticle +vtkmodules.vtkFiltersFlowPaths.vtkLagrangianParticleTracker +vtkmodules.vtkFiltersFlowPaths.vtkLinearTransformCellLocator +vtkmodules.vtkFiltersFlowPaths.vtkModifiedBSPTree +vtkmodules.vtkFiltersFlowPaths.vtkParallelVectors +vtkmodules.vtkFiltersFlowPaths.vtkParticlePathFilter +vtkmodules.vtkFiltersFlowPaths.vtkParticleTracer +vtkmodules.vtkFiltersFlowPaths.vtkParticleTracerBase +vtkmodules.vtkFiltersFlowPaths.vtkStreaklineFilter +vtkmodules.vtkFiltersFlowPaths.vtkStreamSurface +vtkmodules.vtkFiltersFlowPaths.vtkStreamTracer +vtkmodules.vtkFiltersFlowPaths.vtkTemporalInterpolatedVelocityField +vtkmodules.vtkFiltersFlowPaths.vtkVectorFieldTopology +vtkmodules.vtkFiltersFlowPaths.vtkVortexCore +vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_COLORS +vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_LABELS +vtkmodules.vtkFiltersGeneral.VTK_CCS_SCALAR_MODE_NONE +vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_GAUSS +vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MAXIMUM +vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MEAN +vtkmodules.vtkFiltersGeneral.VTK_CURVATURE_MINIMUM +vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_MEMORY_LIMIT +vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_NUMBER_OF_POINTS +vtkmodules.vtkFiltersGeneral.VTK_DICE_MODE_SPECIFIED_NUMBER +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_CENTER +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_LEFT +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_BOTTOM_RIGHT +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_CENTER +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_LEFT +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_CENTER_RIGHT +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_CENTER +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_LEFT +vtkmodules.vtkFiltersGeneral.VTK_ICON_GRAVITY_TOP_RIGHT +vtkmodules.vtkFiltersGeneral.VTK_ICON_SCALING_OFF +vtkmodules.vtkFiltersGeneral.VTK_ICON_SCALING_USE_SCALING_ARRAY +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_BACKWARD +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_BOTH_DIRECTIONS +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_FORWARD +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MAJOR_EIGENVECTOR +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MEDIUM_EIGENVECTOR +vtkmodules.vtkFiltersGeneral.VTK_INTEGRATE_MINOR_EIGENVECTOR +vtkmodules.vtkFiltersGeneral.VTK_SUBDIVIDE_LENGTH +vtkmodules.vtkFiltersGeneral.VTK_SUBDIVIDE_SPECIFIED +vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_LENGTH +vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_NORMALIZED_LENGTH +vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_FROM_SCALARS +vtkmodules.vtkFiltersGeneral.VTK_TCOORDS_OFF +vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_GRADIENT +vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_GREEN_LAGRANGE_STRAIN +vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_COMPUTE_STRAIN +vtkmodules.vtkFiltersGeneral.VTK_TENSOR_MODE_PASS_TENSORS +vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_COMPUTE_GRADIENT +vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_COMPUTE_VORTICITY +vtkmodules.vtkFiltersGeneral.VTK_VECTOR_MODE_PASS_VECTORS +vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_12_TET +vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_5_AND_12_TET +vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_5_TET +vtkmodules.vtkFiltersGeneral.VTK_VOXEL_TO_6_TET +vtkmodules.vtkFiltersGeneral.vtkAnimateModes +vtkmodules.vtkFiltersGeneral.vtkAnnotationLink +vtkmodules.vtkFiltersGeneral.vtkAppendLocationAttributes +vtkmodules.vtkFiltersGeneral.vtkAppendPoints +vtkmodules.vtkFiltersGeneral.vtkApproximatingSubdivisionFilter +vtkmodules.vtkFiltersGeneral.vtkAreaContourSpectrumFilter +vtkmodules.vtkFiltersGeneral.vtkAxes +vtkmodules.vtkFiltersGeneral.vtkBlankStructuredGrid +vtkmodules.vtkFiltersGeneral.vtkBlankStructuredGridWithImage +vtkmodules.vtkFiltersGeneral.vtkBlockIdScalars +vtkmodules.vtkFiltersGeneral.vtkBooleanOperationPolyDataFilter +vtkmodules.vtkFiltersGeneral.vtkBoxClipDataSet +vtkmodules.vtkFiltersGeneral.vtkBrownianPoints +vtkmodules.vtkFiltersGeneral.vtkCellDerivatives +vtkmodules.vtkFiltersGeneral.vtkCellValidator +vtkmodules.vtkFiltersGeneral.vtkClipClosedSurface +vtkmodules.vtkFiltersGeneral.vtkClipConvexPolyData +vtkmodules.vtkFiltersGeneral.vtkClipDataSet +vtkmodules.vtkFiltersGeneral.vtkClipVolume +vtkmodules.vtkFiltersGeneral.vtkCoincidentPoints +vtkmodules.vtkFiltersGeneral.vtkContourTriangulator +vtkmodules.vtkFiltersGeneral.vtkCountFaces +vtkmodules.vtkFiltersGeneral.vtkCountVertices +vtkmodules.vtkFiltersGeneral.vtkCursor2D +vtkmodules.vtkFiltersGeneral.vtkCursor3D +vtkmodules.vtkFiltersGeneral.vtkCurvatures +vtkmodules.vtkFiltersGeneral.vtkDataSetGradient +vtkmodules.vtkFiltersGeneral.vtkDataSetGradientPrecompute +vtkmodules.vtkFiltersGeneral.vtkDataSetTriangleFilter +vtkmodules.vtkFiltersGeneral.vtkDateToNumeric +vtkmodules.vtkFiltersGeneral.vtkDeflectNormals +vtkmodules.vtkFiltersGeneral.vtkDeformPointSet +vtkmodules.vtkFiltersGeneral.vtkDensifyPolyData +vtkmodules.vtkFiltersGeneral.vtkDicer +vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdges2D +vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdges3D +vtkmodules.vtkFiltersGeneral.vtkDiscreteFlyingEdgesClipper2D +vtkmodules.vtkFiltersGeneral.vtkDiscreteMarchingCubes +vtkmodules.vtkFiltersGeneral.vtkDistancePolyDataFilter +vtkmodules.vtkFiltersGeneral.vtkEdgePoints +vtkmodules.vtkFiltersGeneral.vtkEqualizerFilter +vtkmodules.vtkFiltersGeneral.vtkExtractArray +vtkmodules.vtkFiltersGeneral.vtkExtractGhostCells +vtkmodules.vtkFiltersGeneral.vtkExtractSelectedFrustum +vtkmodules.vtkFiltersGeneral.vtkExtractSelectionBase +vtkmodules.vtkFiltersGeneral.vtkFiniteElementFieldDistributor +vtkmodules.vtkFiltersGeneral.vtkGradientFilter +vtkmodules.vtkFiltersGeneral.vtkGraphLayoutFilter +vtkmodules.vtkFiltersGeneral.vtkGraphToPoints +vtkmodules.vtkFiltersGeneral.vtkGraphWeightEuclideanDistanceFilter +vtkmodules.vtkFiltersGeneral.vtkGraphWeightFilter +vtkmodules.vtkFiltersGeneral.vtkGroupDataSetsFilter +vtkmodules.vtkFiltersGeneral.vtkGroupTimeStepsFilter +vtkmodules.vtkFiltersGeneral.vtkHierarchicalDataLevelFilter +vtkmodules.vtkFiltersGeneral.vtkHyperStreamline +vtkmodules.vtkFiltersGeneral.vtkIconGlyphFilter +vtkmodules.vtkFiltersGeneral.vtkImageDataToPointSet +vtkmodules.vtkFiltersGeneral.vtkImageMarchingCubes +vtkmodules.vtkFiltersGeneral.vtkInterpolateDataSetAttributes +vtkmodules.vtkFiltersGeneral.vtkInterpolatingSubdivisionFilter +vtkmodules.vtkFiltersGeneral.vtkIntersectionPolyDataFilter +vtkmodules.vtkFiltersGeneral.vtkJoinTables +vtkmodules.vtkFiltersGeneral.vtkLevelIdScalars +vtkmodules.vtkFiltersGeneral.vtkLinkEdgels +vtkmodules.vtkFiltersGeneral.vtkLoopBooleanPolyDataFilter +vtkmodules.vtkFiltersGeneral.vtkMarchingContourFilter +vtkmodules.vtkFiltersGeneral.vtkMatricizeArray +vtkmodules.vtkFiltersGeneral.vtkMergeArrays +vtkmodules.vtkFiltersGeneral.vtkMergeCells +vtkmodules.vtkFiltersGeneral.vtkMergeTimeFilter +vtkmodules.vtkFiltersGeneral.vtkMergeVectorComponents +vtkmodules.vtkFiltersGeneral.vtkMultiBlockDataGroupFilter +vtkmodules.vtkFiltersGeneral.vtkMultiBlockFromTimeSeriesFilter +vtkmodules.vtkFiltersGeneral.vtkMultiBlockMergeFilter +vtkmodules.vtkFiltersGeneral.vtkMultiThreshold +vtkmodules.vtkFiltersGeneral.vtkNormalizeMatrixVectors +vtkmodules.vtkFiltersGeneral.vtkOBBDicer +vtkmodules.vtkFiltersGeneral.vtkOBBNode +vtkmodules.vtkFiltersGeneral.vtkOBBTree +vtkmodules.vtkFiltersGeneral.vtkOverlappingAMRLevelIdScalars +vtkmodules.vtkFiltersGeneral.vtkPassArrays +vtkmodules.vtkFiltersGeneral.vtkPassSelectedArrays +vtkmodules.vtkFiltersGeneral.vtkPointConnectivityFilter +vtkmodules.vtkFiltersGeneral.vtkPolyDataStreamer +vtkmodules.vtkFiltersGeneral.vtkPolyDataToReebGraphFilter +vtkmodules.vtkFiltersGeneral.vtkProbePolyhedron +vtkmodules.vtkFiltersGeneral.vtkQuadraturePointInterpolator +vtkmodules.vtkFiltersGeneral.vtkQuadraturePointsGenerator +vtkmodules.vtkFiltersGeneral.vtkQuadratureSchemeDictionaryGenerator +vtkmodules.vtkFiltersGeneral.vtkQuantizePolyDataPoints +vtkmodules.vtkFiltersGeneral.vtkRandomAttributeGenerator +vtkmodules.vtkFiltersGeneral.vtkRectilinearGridClip +vtkmodules.vtkFiltersGeneral.vtkRectilinearGridToPointSet +vtkmodules.vtkFiltersGeneral.vtkRectilinearGridToTetrahedra +vtkmodules.vtkFiltersGeneral.vtkRecursiveDividingCubes +vtkmodules.vtkFiltersGeneral.vtkReflectionFilter +vtkmodules.vtkFiltersGeneral.vtkRemovePolyData +vtkmodules.vtkFiltersGeneral.vtkRotationFilter +vtkmodules.vtkFiltersGeneral.vtkSampleImplicitFunctionFilter +vtkmodules.vtkFiltersGeneral.vtkShrinkFilter +vtkmodules.vtkFiltersGeneral.vtkShrinkPolyData +vtkmodules.vtkFiltersGeneral.vtkSpatialRepresentationFilter +vtkmodules.vtkFiltersGeneral.vtkSphericalHarmonics +vtkmodules.vtkFiltersGeneral.vtkSplineFilter +vtkmodules.vtkFiltersGeneral.vtkSplitByCellScalarFilter +vtkmodules.vtkFiltersGeneral.vtkSplitColumnComponents +vtkmodules.vtkFiltersGeneral.vtkSplitField +vtkmodules.vtkFiltersGeneral.vtkStructuredGridClip +vtkmodules.vtkFiltersGeneral.vtkSubPixelPositionEdgels +vtkmodules.vtkFiltersGeneral.vtkSubdivisionFilter +vtkmodules.vtkFiltersGeneral.vtkSynchronizeTimeFilter +vtkmodules.vtkFiltersGeneral.vtkTableBasedClipDataSet +vtkmodules.vtkFiltersGeneral.vtkTableFFT +vtkmodules.vtkFiltersGeneral.vtkTableToPolyData +vtkmodules.vtkFiltersGeneral.vtkTableToStructuredGrid +vtkmodules.vtkFiltersGeneral.vtkTemporalPathLineFilter +vtkmodules.vtkFiltersGeneral.vtkTemporalStatistics +vtkmodules.vtkFiltersGeneral.vtkTessellatorFilter +vtkmodules.vtkFiltersGeneral.vtkTimeSourceExample +vtkmodules.vtkFiltersGeneral.vtkTransformFilter +vtkmodules.vtkFiltersGeneral.vtkTransformPolyDataFilter +vtkmodules.vtkFiltersGeneral.vtkUncertaintyTubeFilter +vtkmodules.vtkFiltersGeneral.vtkVertexGlyphFilter +vtkmodules.vtkFiltersGeneral.vtkVolumeContourSpectrumFilter +vtkmodules.vtkFiltersGeneral.vtkVoxelContoursToSurfaceFilter +vtkmodules.vtkFiltersGeneral.vtkWarpLens +vtkmodules.vtkFiltersGeneral.vtkWarpScalar +vtkmodules.vtkFiltersGeneral.vtkWarpTo +vtkmodules.vtkFiltersGeneral.vtkWarpVector +vtkmodules.vtkFiltersGeneral.vtkYoungsMaterialInterface +vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_SCALAR +vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_SCALE +vtkmodules.vtkFiltersGeneric.VTK_COLOR_BY_VECTOR +vtkmodules.vtkFiltersGeneric.VTK_DATA_SCALING_OFF +vtkmodules.vtkFiltersGeneric.VTK_INDEXING_BY_SCALAR +vtkmodules.vtkFiltersGeneric.VTK_INDEXING_BY_VECTOR +vtkmodules.vtkFiltersGeneric.VTK_INDEXING_OFF +vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_SCALAR +vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_VECTOR +vtkmodules.vtkFiltersGeneric.VTK_SCALE_BY_VECTORCOMPONENTS +vtkmodules.vtkFiltersGeneric.VTK_USE_NORMAL +vtkmodules.vtkFiltersGeneric.VTK_USE_VECTOR +vtkmodules.vtkFiltersGeneric.VTK_VECTOR_ROTATION_OFF +vtkmodules.vtkFiltersGeneric.vtkGenericClip +vtkmodules.vtkFiltersGeneric.vtkGenericContourFilter +vtkmodules.vtkFiltersGeneric.vtkGenericCutter +vtkmodules.vtkFiltersGeneric.vtkGenericDataSetTessellator +vtkmodules.vtkFiltersGeneric.vtkGenericGeometryFilter +vtkmodules.vtkFiltersGeneric.vtkGenericGlyph3DFilter +vtkmodules.vtkFiltersGeneric.vtkGenericOutlineFilter +vtkmodules.vtkFiltersGeneric.vtkGenericProbeFilter +vtkmodules.vtkFiltersGeneric.vtkGenericStreamTracer +vtkmodules.vtkFiltersGeometry.VTK_EDGE_OVERLAP +vtkmodules.vtkFiltersGeometry.VTK_NODE_OVERLAP +vtkmodules.vtkFiltersGeometry.VTK_NO_OVERLAP +vtkmodules.vtkFiltersGeometry.VTK_PARTIAL_OVERLAP +vtkmodules.vtkFiltersGeometry.vtkAbstractGridConnectivity +vtkmodules.vtkFiltersGeometry.vtkCompositeDataGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkDataSetGhostGenerator +vtkmodules.vtkFiltersGeometry.vtkDataSetRegionSurfaceFilter +vtkmodules.vtkFiltersGeometry.vtkDataSetSurfaceFilter +vtkmodules.vtkFiltersGeometry.vtkExplicitStructuredGridSurfaceFilter +vtkmodules.vtkFiltersGeometry.vtkFastGeomQuadStruct +vtkmodules.vtkFiltersGeometry.vtkGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkGeometryFilterHelper +vtkmodules.vtkFiltersGeometry.vtkHierarchicalDataSetGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkImageDataGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkImageDataToUniformGrid +vtkmodules.vtkFiltersGeometry.vtkLinearToQuadraticCellsFilter +vtkmodules.vtkFiltersGeometry.vtkMarkBoundaryFilter +vtkmodules.vtkFiltersGeometry.vtkProjectSphereFilter +vtkmodules.vtkFiltersGeometry.vtkRectilinearGridGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkRectilinearGridPartitioner +vtkmodules.vtkFiltersGeometry.vtkStructuredAMRGridConnectivity +vtkmodules.vtkFiltersGeometry.vtkStructuredAMRNeighbor +vtkmodules.vtkFiltersGeometry.vtkStructuredGridConnectivity +vtkmodules.vtkFiltersGeometry.vtkStructuredGridGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkStructuredGridGhostDataGenerator +vtkmodules.vtkFiltersGeometry.vtkStructuredGridPartitioner +vtkmodules.vtkFiltersGeometry.vtkStructuredNeighbor +vtkmodules.vtkFiltersGeometry.vtkStructuredPointsGeometryFilter +vtkmodules.vtkFiltersGeometry.vtkUniformGridGhostDataGenerator +vtkmodules.vtkFiltersGeometry.vtkUnstructuredGridGeometryFilter +vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_EDGE +vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_ZERO +vtkmodules.vtkFiltersHybrid.VTK_BSPLINE_ZERO_AT_BORDER +vtkmodules.vtkFiltersHybrid.VTK_CELL_MODE +vtkmodules.vtkFiltersHybrid.VTK_COLOR_MODE_LINEAR_256 +vtkmodules.vtkFiltersHybrid.VTK_COLOR_MODE_LUT +vtkmodules.vtkFiltersHybrid.VTK_ERROR_ABSOLUTE +vtkmodules.vtkFiltersHybrid.VTK_ERROR_NUMBER_OF_TRIANGLES +vtkmodules.vtkFiltersHybrid.VTK_ERROR_RELATIVE +vtkmodules.vtkFiltersHybrid.VTK_ERROR_SPECIFIED_REDUCTION +vtkmodules.vtkFiltersHybrid.VTK_GRID_CUBIC +vtkmodules.vtkFiltersHybrid.VTK_GRID_LINEAR +vtkmodules.vtkFiltersHybrid.VTK_GRID_NEAREST +vtkmodules.vtkFiltersHybrid.VTK_STYLE_PIXELIZE +vtkmodules.vtkFiltersHybrid.VTK_STYLE_POLYGONALIZE +vtkmodules.vtkFiltersHybrid.VTK_STYLE_RUN_LENGTH +vtkmodules.vtkFiltersHybrid.VTK_VOXEL_MODE +vtkmodules.vtkFiltersHybrid.vtkAdaptiveDataSetSurfaceFilter +vtkmodules.vtkFiltersHybrid.vtkBSplineTransform +vtkmodules.vtkFiltersHybrid.vtkDSPFilterDefinition +vtkmodules.vtkFiltersHybrid.vtkDSPFilterGroup +vtkmodules.vtkFiltersHybrid.vtkDepthSortPolyData +vtkmodules.vtkFiltersHybrid.vtkEarthSource +vtkmodules.vtkFiltersHybrid.vtkFacetReader +vtkmodules.vtkFiltersHybrid.vtkForceTime +vtkmodules.vtkFiltersHybrid.vtkGenerateTimeSteps +vtkmodules.vtkFiltersHybrid.vtkGreedyTerrainDecimation +vtkmodules.vtkFiltersHybrid.vtkGridTransform +vtkmodules.vtkFiltersHybrid.vtkImageToPolyDataFilter +vtkmodules.vtkFiltersHybrid.vtkImplicitModeller +vtkmodules.vtkFiltersHybrid.vtkPCAAnalysisFilter +vtkmodules.vtkFiltersHybrid.vtkPolyDataSilhouette +vtkmodules.vtkFiltersHybrid.vtkProcrustesAlignmentFilter +vtkmodules.vtkFiltersHybrid.vtkProjectedTerrainPath +vtkmodules.vtkFiltersHybrid.vtkRenderLargeImage +vtkmodules.vtkFiltersHybrid.vtkTemporalArrayOperatorFilter +vtkmodules.vtkFiltersHybrid.vtkTemporalDataSetCache +vtkmodules.vtkFiltersHybrid.vtkTemporalFractal +vtkmodules.vtkFiltersHybrid.vtkTemporalInterpolator +vtkmodules.vtkFiltersHybrid.vtkTemporalShiftScale +vtkmodules.vtkFiltersHybrid.vtkTemporalSnapToTimeStep +vtkmodules.vtkFiltersHybrid.vtkTransformToGrid +vtkmodules.vtkFiltersHybrid.vtkWeightedTransformFilter +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisClip +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisCut +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridAxisReflection +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridCellCenters +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridContour +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridDepthLimiter +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridEvaluateCoarse +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridGeometry +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridGradient +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridPlaneCutter +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridThreshold +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridToDualGrid +vtkmodules.vtkFiltersHyperTree.vtkHyperTreeGridToUnstructuredGrid +vtkmodules.vtkFiltersHyperTree.vtkImageDataToHyperTreeGrid +vtkmodules.vtkFiltersImaging.vtkComputeHistogram2DOutliers +vtkmodules.vtkFiltersImaging.vtkExtractHistogram2D +vtkmodules.vtkFiltersImaging.vtkPairwiseExtractHistogram2D +vtkmodules.vtkFiltersModeling.VTK_DIJKSTRA_EDGE_SEARCH +vtkmodules.vtkFiltersModeling.VTK_GREEDY_EDGE_SEARCH +vtkmodules.vtkFiltersModeling.VTK_INSIDE_CLOSEST_POINT_REGION +vtkmodules.vtkFiltersModeling.VTK_INSIDE_LARGEST_REGION +vtkmodules.vtkFiltersModeling.VTK_INSIDE_SMALLEST_REGION +vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_ALL +vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_BOUNDARY +vtkmodules.vtkFiltersModeling.VTK_LOOP_CLOSURE_OFF +vtkmodules.vtkFiltersModeling.VTK_MAX_SPHERE_RESOLUTION +vtkmodules.vtkFiltersModeling.VTK_NORMAL_EXTRUSION +vtkmodules.vtkFiltersModeling.VTK_OUTPUT_BOTH +vtkmodules.vtkFiltersModeling.VTK_OUTPUT_POLYGONS +vtkmodules.vtkFiltersModeling.VTK_OUTPUT_POLYLINES +vtkmodules.vtkFiltersModeling.VTK_POINT_EXTRUSION +vtkmodules.vtkFiltersModeling.VTK_PROJECTED_TEXTURE_USE_PINHOLE +vtkmodules.vtkFiltersModeling.VTK_PROJECTED_TEXTURE_USE_TWO_MIRRORS +vtkmodules.vtkFiltersModeling.VTK_RULED_MODE_POINT_WALK +vtkmodules.vtkFiltersModeling.VTK_RULED_MODE_RESAMPLE +vtkmodules.vtkFiltersModeling.VTK_SCALAR_MODE_INDEX +vtkmodules.vtkFiltersModeling.VTK_SCALAR_MODE_VALUE +vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_LENGTH +vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_NORMALIZED_LENGTH +vtkmodules.vtkFiltersModeling.VTK_TCOORDS_FROM_SCALARS +vtkmodules.vtkFiltersModeling.VTK_TCOORDS_OFF +vtkmodules.vtkFiltersModeling.VTK_VECTOR_EXTRUSION +vtkmodules.vtkFiltersModeling.vtkAdaptiveSubdivisionFilter +vtkmodules.vtkFiltersModeling.vtkBandedPolyDataContourFilter +vtkmodules.vtkFiltersModeling.vtkButterflySubdivisionFilter +vtkmodules.vtkFiltersModeling.vtkCollisionDetectionFilter +vtkmodules.vtkFiltersModeling.vtkContourLoopExtraction +vtkmodules.vtkFiltersModeling.vtkCookieCutter +vtkmodules.vtkFiltersModeling.vtkDijkstraGraphGeodesicPath +vtkmodules.vtkFiltersModeling.vtkDijkstraImageGeodesicPath +vtkmodules.vtkFiltersModeling.vtkFillHolesFilter +vtkmodules.vtkFiltersModeling.vtkFitToHeightMapFilter +vtkmodules.vtkFiltersModeling.vtkGeodesicPath +vtkmodules.vtkFiltersModeling.vtkGraphGeodesicPath +vtkmodules.vtkFiltersModeling.vtkHausdorffDistancePointSetFilter +vtkmodules.vtkFiltersModeling.vtkHyperTreeGridOutlineFilter +vtkmodules.vtkFiltersModeling.vtkImageDataOutlineFilter +vtkmodules.vtkFiltersModeling.vtkImprintFilter +vtkmodules.vtkFiltersModeling.vtkLinearCellExtrusionFilter +vtkmodules.vtkFiltersModeling.vtkLinearExtrusionFilter +vtkmodules.vtkFiltersModeling.vtkLinearSubdivisionFilter +vtkmodules.vtkFiltersModeling.vtkLoopSubdivisionFilter +vtkmodules.vtkFiltersModeling.vtkOutlineFilter +vtkmodules.vtkFiltersModeling.vtkPolyDataPointSampler +vtkmodules.vtkFiltersModeling.vtkProjectedTexture +vtkmodules.vtkFiltersModeling.vtkQuadRotationalExtrusionFilter +vtkmodules.vtkFiltersModeling.vtkRibbonFilter +vtkmodules.vtkFiltersModeling.vtkRotationalExtrusionFilter +vtkmodules.vtkFiltersModeling.vtkRuledSurfaceFilter +vtkmodules.vtkFiltersModeling.vtkSectorSource +vtkmodules.vtkFiltersModeling.vtkSelectEnclosedPoints +vtkmodules.vtkFiltersModeling.vtkSelectPolyData +vtkmodules.vtkFiltersModeling.vtkSpherePuzzle +vtkmodules.vtkFiltersModeling.vtkSpherePuzzleArrows +vtkmodules.vtkFiltersModeling.vtkSubdivideTetra +vtkmodules.vtkFiltersModeling.vtkTrimmedExtrusionFilter +vtkmodules.vtkFiltersModeling.vtkVolumeOfRevolutionFilter +vtkmodules.vtkFiltersPoints.VTK_DENSITY_ESTIMATE_FIXED_RADIUS +vtkmodules.vtkFiltersPoints.VTK_DENSITY_ESTIMATE_RELATIVE_RADIUS +vtkmodules.vtkFiltersPoints.VTK_DENSITY_FORM_NPTS +vtkmodules.vtkFiltersPoints.VTK_DENSITY_FORM_VOLUME_NORM +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_ALL_CLUSTERS +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_ALL_REGIONS +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_CLOSEST_POINT_CLUSTER +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_CLOSEST_POINT_REGION +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_LARGEST_CLUSTER +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_LARGEST_REGION +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_POINT_SEEDED_CLUSTERS +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_POINT_SEEDED_REGIONS +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_SPECIFIED_CLUSTERS +vtkmodules.vtkFiltersPoints.VTK_EXTRACT_SPECIFIED_REGIONS +vtkmodules.vtkFiltersPoints.VTK_MAX_LEVEL +vtkmodules.vtkFiltersPoints.vtkBoundedPointSource +vtkmodules.vtkFiltersPoints.vtkConnectedPointsFilter +vtkmodules.vtkFiltersPoints.vtkConvertToPointCloud +vtkmodules.vtkFiltersPoints.vtkDensifyPointCloudFilter +vtkmodules.vtkFiltersPoints.vtkEllipsoidalGaussianKernel +vtkmodules.vtkFiltersPoints.vtkEuclideanClusterExtraction +vtkmodules.vtkFiltersPoints.vtkExtractEnclosedPoints +vtkmodules.vtkFiltersPoints.vtkExtractHierarchicalBins +vtkmodules.vtkFiltersPoints.vtkExtractPointCloudPiece +vtkmodules.vtkFiltersPoints.vtkExtractPoints +vtkmodules.vtkFiltersPoints.vtkExtractSurface +vtkmodules.vtkFiltersPoints.vtkFitImplicitFunction +vtkmodules.vtkFiltersPoints.vtkGaussianKernel +vtkmodules.vtkFiltersPoints.vtkGeneralizedKernel +vtkmodules.vtkFiltersPoints.vtkHierarchicalBinningFilter +vtkmodules.vtkFiltersPoints.vtkInterpolationKernel +vtkmodules.vtkFiltersPoints.vtkLinearKernel +vtkmodules.vtkFiltersPoints.vtkMaskPointsFilter +vtkmodules.vtkFiltersPoints.vtkPCACurvatureEstimation +vtkmodules.vtkFiltersPoints.vtkPCANormalEstimation +vtkmodules.vtkFiltersPoints.vtkPointCloudFilter +vtkmodules.vtkFiltersPoints.vtkPointDensityFilter +vtkmodules.vtkFiltersPoints.vtkPointInterpolator +vtkmodules.vtkFiltersPoints.vtkPointInterpolator2D +vtkmodules.vtkFiltersPoints.vtkPointOccupancyFilter +vtkmodules.vtkFiltersPoints.vtkPointSmoothingFilter +vtkmodules.vtkFiltersPoints.vtkPoissonDiskSampler +vtkmodules.vtkFiltersPoints.vtkProbabilisticVoronoiKernel +vtkmodules.vtkFiltersPoints.vtkProjectPointsToPlane +vtkmodules.vtkFiltersPoints.vtkRadiusOutlierRemoval +vtkmodules.vtkFiltersPoints.vtkSPHCubicKernel +vtkmodules.vtkFiltersPoints.vtkSPHInterpolator +vtkmodules.vtkFiltersPoints.vtkSPHKernel +vtkmodules.vtkFiltersPoints.vtkSPHQuarticKernel +vtkmodules.vtkFiltersPoints.vtkSPHQuinticKernel +vtkmodules.vtkFiltersPoints.vtkShepardKernel +vtkmodules.vtkFiltersPoints.vtkSignedDistance +vtkmodules.vtkFiltersPoints.vtkStatisticalOutlierRemoval +vtkmodules.vtkFiltersPoints.vtkUnsignedDistance +vtkmodules.vtkFiltersPoints.vtkVoronoiKernel +vtkmodules.vtkFiltersPoints.vtkVoxelGrid +vtkmodules.vtkFiltersPoints.vtkWendlandQuinticKernel +vtkmodules.vtkFiltersProgrammable.VTK_COLOR_BY_INPUT +vtkmodules.vtkFiltersProgrammable.VTK_COLOR_BY_SOURCE +vtkmodules.vtkFiltersProgrammable.vtkProgrammableAttributeDataFilter +vtkmodules.vtkFiltersProgrammable.vtkProgrammableFilter +vtkmodules.vtkFiltersProgrammable.vtkProgrammableGlyphFilter +vtkmodules.vtkFiltersPython.vtkPythonAlgorithm +vtkmodules.vtkFiltersSMP.vtkSMPContourGrid +vtkmodules.vtkFiltersSMP.vtkSMPMergePoints +vtkmodules.vtkFiltersSMP.vtkSMPMergePolyDataHelper +vtkmodules.vtkFiltersSelection.vtkCellDistanceSelector +vtkmodules.vtkFiltersSelection.vtkKdTreeSelector +vtkmodules.vtkFiltersSelection.vtkLinearSelector +vtkmodules.vtkFiltersSources.VTK_ARROW_GLYPH +vtkmodules.vtkFiltersSources.VTK_BOX_TYPE_AXIS_ALIGNED +vtkmodules.vtkFiltersSources.VTK_BOX_TYPE_ORIENTED +vtkmodules.vtkFiltersSources.VTK_CIRCLE_GLYPH +vtkmodules.vtkFiltersSources.VTK_CROSS_GLYPH +vtkmodules.vtkFiltersSources.VTK_DASH_GLYPH +vtkmodules.vtkFiltersSources.VTK_DIAMOND_GLYPH +vtkmodules.vtkFiltersSources.VTK_EDGEARROW_GLYPH +vtkmodules.vtkFiltersSources.VTK_HOOKEDARROW_GLYPH +vtkmodules.vtkFiltersSources.VTK_MAX_CIRCLE_RESOLUTION +vtkmodules.vtkFiltersSources.VTK_MAX_SUPERQUADRIC_RESOLUTION +vtkmodules.vtkFiltersSources.VTK_MIN_SUPERQUADRIC_ROUNDNESS +vtkmodules.vtkFiltersSources.VTK_MIN_SUPERQUADRIC_THICKNESS +vtkmodules.vtkFiltersSources.VTK_NO_GLYPH +vtkmodules.vtkFiltersSources.VTK_POINT_EXPONENTIAL +vtkmodules.vtkFiltersSources.VTK_POINT_SHELL +vtkmodules.vtkFiltersSources.VTK_POINT_UNIFORM +vtkmodules.vtkFiltersSources.VTK_SOLID_CUBE +vtkmodules.vtkFiltersSources.VTK_SOLID_DODECAHEDRON +vtkmodules.vtkFiltersSources.VTK_SOLID_ICOSAHEDRON +vtkmodules.vtkFiltersSources.VTK_SOLID_OCTAHEDRON +vtkmodules.vtkFiltersSources.VTK_SOLID_TETRAHEDRON +vtkmodules.vtkFiltersSources.VTK_SQUARE_GLYPH +vtkmodules.vtkFiltersSources.VTK_TEXTURE_STYLE_FIT_IMAGE +vtkmodules.vtkFiltersSources.VTK_TEXTURE_STYLE_PROPORTIONAL +vtkmodules.vtkFiltersSources.VTK_THICKARROW_GLYPH +vtkmodules.vtkFiltersSources.VTK_THICKCROSS_GLYPH +vtkmodules.vtkFiltersSources.VTK_TRIANGLE_GLYPH +vtkmodules.vtkFiltersSources.VTK_VERTEX_GLYPH +vtkmodules.vtkFiltersSources.vtkArcSource +vtkmodules.vtkFiltersSources.vtkArrowSource +vtkmodules.vtkFiltersSources.vtkButtonSource +vtkmodules.vtkFiltersSources.vtkCapsuleSource +vtkmodules.vtkFiltersSources.vtkCellTypeSource +vtkmodules.vtkFiltersSources.vtkConeSource +vtkmodules.vtkFiltersSources.vtkCubeSource +vtkmodules.vtkFiltersSources.vtkCylinderSource +vtkmodules.vtkFiltersSources.vtkDiagonalMatrixSource +vtkmodules.vtkFiltersSources.vtkDiskSource +vtkmodules.vtkFiltersSources.vtkEllipseArcSource +vtkmodules.vtkFiltersSources.vtkEllipticalButtonSource +vtkmodules.vtkFiltersSources.vtkFrustumSource +vtkmodules.vtkFiltersSources.vtkGlyphSource2D +vtkmodules.vtkFiltersSources.vtkGraphToPolyData +vtkmodules.vtkFiltersSources.vtkHandleSource +vtkmodules.vtkFiltersSources.vtkHyperTreeGridPreConfiguredSource +vtkmodules.vtkFiltersSources.vtkHyperTreeGridSource +vtkmodules.vtkFiltersSources.vtkLineSource +vtkmodules.vtkFiltersSources.vtkOutlineCornerFilter +vtkmodules.vtkFiltersSources.vtkOutlineCornerSource +vtkmodules.vtkFiltersSources.vtkOutlineSource +vtkmodules.vtkFiltersSources.vtkParametricFunctionSource +vtkmodules.vtkFiltersSources.vtkPartitionedDataSetCollectionSource +vtkmodules.vtkFiltersSources.vtkPartitionedDataSetSource +vtkmodules.vtkFiltersSources.vtkPlaneSource +vtkmodules.vtkFiltersSources.vtkPlatonicSolidSource +vtkmodules.vtkFiltersSources.vtkPointHandleSource +vtkmodules.vtkFiltersSources.vtkPointSource +vtkmodules.vtkFiltersSources.vtkPolyLineSource +vtkmodules.vtkFiltersSources.vtkPolyPointSource +vtkmodules.vtkFiltersSources.vtkProgrammableDataObjectSource +vtkmodules.vtkFiltersSources.vtkProgrammableSource +vtkmodules.vtkFiltersSources.vtkRandomHyperTreeGridSource +vtkmodules.vtkFiltersSources.vtkRectangularButtonSource +vtkmodules.vtkFiltersSources.vtkRegularPolygonSource +vtkmodules.vtkFiltersSources.vtkSelectionSource +vtkmodules.vtkFiltersSources.vtkSphereSource +vtkmodules.vtkFiltersSources.vtkSuperquadricSource +vtkmodules.vtkFiltersSources.vtkTessellatedBoxSource +vtkmodules.vtkFiltersSources.vtkTextSource +vtkmodules.vtkFiltersSources.vtkTexturedSphereSource +vtkmodules.vtkFiltersSources.vtkUniformHyperTreeGridSource +vtkmodules.vtkFiltersStatistics.vtkAutoCorrelativeStatistics +vtkmodules.vtkFiltersStatistics.vtkBivariateLinearTableThreshold +vtkmodules.vtkFiltersStatistics.vtkComputeQuantiles +vtkmodules.vtkFiltersStatistics.vtkComputeQuartiles +vtkmodules.vtkFiltersStatistics.vtkContingencyStatistics +vtkmodules.vtkFiltersStatistics.vtkCorrelativeStatistics +vtkmodules.vtkFiltersStatistics.vtkDescriptiveStatistics +vtkmodules.vtkFiltersStatistics.vtkExtractFunctionalBagPlot +vtkmodules.vtkFiltersStatistics.vtkExtractHistogram +vtkmodules.vtkFiltersStatistics.vtkHighestDensityRegionsStatistics +vtkmodules.vtkFiltersStatistics.vtkKMeansDistanceFunctor +vtkmodules.vtkFiltersStatistics.vtkKMeansDistanceFunctorCalculator +vtkmodules.vtkFiltersStatistics.vtkKMeansStatistics +vtkmodules.vtkFiltersStatistics.vtkLengthDistribution +vtkmodules.vtkFiltersStatistics.vtkMultiCorrelativeStatistics +vtkmodules.vtkFiltersStatistics.vtkOrderStatistics +vtkmodules.vtkFiltersStatistics.vtkPCAStatistics +vtkmodules.vtkFiltersStatistics.vtkStatisticsAlgorithm +vtkmodules.vtkFiltersStatistics.vtkStrahlerMetric +vtkmodules.vtkFiltersStatistics.vtkStreamingStatistics +vtkmodules.vtkFiltersTexture.vtkImplicitTextureCoords +vtkmodules.vtkFiltersTexture.vtkScalarsToTextureFilter +vtkmodules.vtkFiltersTexture.vtkTextureMapToCylinder +vtkmodules.vtkFiltersTexture.vtkTextureMapToPlane +vtkmodules.vtkFiltersTexture.vtkTextureMapToSphere +vtkmodules.vtkFiltersTexture.vtkThresholdTextureCoords +vtkmodules.vtkFiltersTexture.vtkTransformTextureCoords +vtkmodules.vtkFiltersTexture.vtkTriangularTCoords +vtkmodules.vtkFiltersTopology.vtkFiberSurface +vtkmodules.vtkFiltersVerdict.vtkCellQuality +vtkmodules.vtkFiltersVerdict.vtkCellSizeFilter +vtkmodules.vtkFiltersVerdict.vtkMatrixMathFilter +vtkmodules.vtkFiltersVerdict.vtkMeshQuality +vtkmodules.vtkGeovisCore.vtkCompassRepresentation +vtkmodules.vtkGeovisCore.vtkCompassWidget +vtkmodules.vtkGeovisCore.vtkGeoProjection +vtkmodules.vtkGeovisCore.vtkGeoTransform +vtkmodules.vtkIOAMR.vtkAMRBaseParticlesReader +vtkmodules.vtkIOAMR.vtkAMRBaseReader +vtkmodules.vtkIOAMR.vtkAMRDataSetCache +vtkmodules.vtkIOAMR.vtkAMREnzoParticlesReader +vtkmodules.vtkIOAMR.vtkAMREnzoReader +vtkmodules.vtkIOAMR.vtkAMRFlashParticlesReader +vtkmodules.vtkIOAMR.vtkAMRFlashReader +vtkmodules.vtkIOAMR.vtkAMRVelodyneReader +vtkmodules.vtkIOAMR.vtkAMReXGridReader +vtkmodules.vtkIOAMR.vtkAMReXParticlesReader +vtkmodules.vtkIOAsynchronous.vtkThreadedImageWriter +vtkmodules.vtkIOCGNSReader.vtkCGNSFileSeriesReader +vtkmodules.vtkIOCGNSReader.vtkCGNSReader +vtkmodules.vtkIOCONVERGECFD.vtkCONVERGECFDReader +vtkmodules.vtkIOCesium3DTiles.vtkCesium3DTilesWriter +vtkmodules.vtkIOCesium3DTiles.vtkCesiumPointCloudWriter +vtkmodules.vtkIOChemistry.vtkCMLMoleculeReader +vtkmodules.vtkIOChemistry.vtkGaussianCubeReader +vtkmodules.vtkIOChemistry.vtkGaussianCubeReader2 +vtkmodules.vtkIOChemistry.vtkMoleculeReaderBase +vtkmodules.vtkIOChemistry.vtkPDBReader +vtkmodules.vtkIOChemistry.vtkVASPAnimationReader +vtkmodules.vtkIOChemistry.vtkVASPTessellationReader +vtkmodules.vtkIOChemistry.vtkXYZMolReader +vtkmodules.vtkIOChemistry.vtkXYZMolReader2 +vtkmodules.vtkIOCityGML.vtkCityGMLReader +vtkmodules.vtkIOCore.VTK_ASCII +vtkmodules.vtkIOCore.VTK_BINARY +vtkmodules.vtkIOCore.vtkASCIITextCodec +vtkmodules.vtkIOCore.vtkAbstractParticleWriter +vtkmodules.vtkIOCore.vtkAbstractPolyDataReader +vtkmodules.vtkIOCore.vtkArrayDataReader +vtkmodules.vtkIOCore.vtkArrayDataWriter +vtkmodules.vtkIOCore.vtkArrayReader +vtkmodules.vtkIOCore.vtkArrayWriter +vtkmodules.vtkIOCore.vtkBase64InputStream +vtkmodules.vtkIOCore.vtkBase64OutputStream +vtkmodules.vtkIOCore.vtkBase64Utilities +vtkmodules.vtkIOCore.vtkDataCompressor +vtkmodules.vtkIOCore.vtkDelimitedTextWriter +vtkmodules.vtkIOCore.vtkGlobFileNames +vtkmodules.vtkIOCore.vtkInputStream +vtkmodules.vtkIOCore.vtkJavaScriptDataWriter +vtkmodules.vtkIOCore.vtkLZ4DataCompressor +vtkmodules.vtkIOCore.vtkLZMADataCompressor +vtkmodules.vtkIOCore.vtkNumberToString +vtkmodules.vtkIOCore.vtkOutputStream +vtkmodules.vtkIOCore.vtkSortFileNames +vtkmodules.vtkIOCore.vtkTextCodec +vtkmodules.vtkIOCore.vtkTextCodecFactory +vtkmodules.vtkIOCore.vtkUTF16TextCodec +vtkmodules.vtkIOCore.vtkUTF8TextCodec +vtkmodules.vtkIOCore.vtkWriter +vtkmodules.vtkIOCore.vtkZLibDataCompressor +vtkmodules.vtkIOEnSight.EnsightReaderCellIdMode +vtkmodules.vtkIOEnSight.IMPLICIT_STRUCTURED_MODE +vtkmodules.vtkIOEnSight.NON_SPARSE_MODE +vtkmodules.vtkIOEnSight.SINGLE_PROCESS_MODE +vtkmodules.vtkIOEnSight.SPARSE_MODE +vtkmodules.vtkIOEnSight.vtkEnSight6BinaryReader +vtkmodules.vtkIOEnSight.vtkEnSight6Reader +vtkmodules.vtkIOEnSight.vtkEnSightGoldBinaryReader +vtkmodules.vtkIOEnSight.vtkEnSightGoldReader +vtkmodules.vtkIOEnSight.vtkEnSightMasterServerReader +vtkmodules.vtkIOEnSight.vtkEnSightReader +vtkmodules.vtkIOEnSight.vtkGenericEnSightReader +vtkmodules.vtkIOExodus.vtkCPExodusIIElementBlock +vtkmodules.vtkIOExodus.vtkCPExodusIIElementBlockImpl +vtkmodules.vtkIOExodus.vtkCPExodusIIInSituReader +vtkmodules.vtkIOExodus.vtkExodusIICache +vtkmodules.vtkIOExodus.vtkExodusIICacheEntry +vtkmodules.vtkIOExodus.vtkExodusIICacheKey +vtkmodules.vtkIOExodus.vtkExodusIIReader +vtkmodules.vtkIOExodus.vtkExodusIIReaderParser +vtkmodules.vtkIOExodus.vtkExodusIIWriter +vtkmodules.vtkIOExodus.vtkModelMetadata +vtkmodules.vtkIOExport.vtkExporter +vtkmodules.vtkIOExport.vtkGLTFExporter +vtkmodules.vtkIOExport.vtkIVExporter +vtkmodules.vtkIOExport.vtkJSONDataSetWriter +vtkmodules.vtkIOExport.vtkJSONRenderWindowExporter +vtkmodules.vtkIOExport.vtkJSONSceneExporter +vtkmodules.vtkIOExport.vtkOBJExporter +vtkmodules.vtkIOExport.vtkOOGLExporter +vtkmodules.vtkIOExport.vtkPOVExporter +vtkmodules.vtkIOExport.vtkRIBExporter +vtkmodules.vtkIOExport.vtkRIBLight +vtkmodules.vtkIOExport.vtkRIBProperty +vtkmodules.vtkIOExport.vtkSVGContextDevice2D +vtkmodules.vtkIOExport.vtkSVGExporter +vtkmodules.vtkIOExport.vtkSingleVTPExporter +vtkmodules.vtkIOExport.vtkVRMLExporter +vtkmodules.vtkIOExport.vtkX3D +vtkmodules.vtkIOExport.vtkX3DExporter +vtkmodules.vtkIOExport.vtkX3DExporterFIWriter +vtkmodules.vtkIOExport.vtkX3DExporterWriter +vtkmodules.vtkIOExport.vtkX3DExporterXMLWriter +vtkmodules.vtkIOExportGL2PS.vtkGL2PSExporter +vtkmodules.vtkIOExportGL2PS.vtkOpenGLGL2PSExporter +vtkmodules.vtkIOExportPDF.vtkPDFContextDevice2D +vtkmodules.vtkIOExportPDF.vtkPDFExporter +vtkmodules.vtkIOGeoJSON.vtkGeoJSONFeature +vtkmodules.vtkIOGeoJSON.vtkGeoJSONReader +vtkmodules.vtkIOGeoJSON.vtkGeoJSONWriter +vtkmodules.vtkIOGeometry.VTK_FILE_BYTE_ORDER_BIG_ENDIAN +vtkmodules.vtkIOGeometry.VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN +vtkmodules.vtkIOGeometry.vtkAVSucdReader +vtkmodules.vtkIOGeometry.vtkBYUReader +vtkmodules.vtkIOGeometry.vtkBYUWriter +vtkmodules.vtkIOGeometry.vtkChacoReader +vtkmodules.vtkIOGeometry.vtkFLUENTReader +vtkmodules.vtkIOGeometry.vtkFacetWriter +vtkmodules.vtkIOGeometry.vtkGAMBITReader +vtkmodules.vtkIOGeometry.vtkGLTFDocumentLoader +vtkmodules.vtkIOGeometry.vtkGLTFReader +vtkmodules.vtkIOGeometry.vtkGLTFWriter +vtkmodules.vtkIOGeometry.vtkHoudiniPolyDataWriter +vtkmodules.vtkIOGeometry.vtkIVWriter +vtkmodules.vtkIOGeometry.vtkMCubesReader +vtkmodules.vtkIOGeometry.vtkMCubesWriter +vtkmodules.vtkIOGeometry.vtkMFIXReader +vtkmodules.vtkIOGeometry.vtkOBJReader +vtkmodules.vtkIOGeometry.vtkOBJWriter +vtkmodules.vtkIOGeometry.vtkOpenFOAMReader +vtkmodules.vtkIOGeometry.vtkPTSReader +vtkmodules.vtkIOGeometry.vtkParticleReader +vtkmodules.vtkIOGeometry.vtkProStarReader +vtkmodules.vtkIOGeometry.vtkSTLReader +vtkmodules.vtkIOGeometry.vtkSTLWriter +vtkmodules.vtkIOGeometry.vtkTecplotReader +vtkmodules.vtkIOGeometry.vtkWindBladeReader +vtkmodules.vtkIOH5Rage.vtkH5RageReader +vtkmodules.vtkIOH5part.vtkH5PartReader +vtkmodules.vtkIOHDF.vtkHDFReader +vtkmodules.vtkIOIOSS.vtkIOSSReader +vtkmodules.vtkIOIOSS.vtkIOSSWriter +vtkmodules.vtkIOImage.VTK_FILE_BYTE_ORDER_BIG_ENDIAN +vtkmodules.vtkIOImage.VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN +vtkmodules.vtkIOImage.vtkBMPReader +vtkmodules.vtkIOImage.vtkBMPWriter +vtkmodules.vtkIOImage.vtkDEMReader +vtkmodules.vtkIOImage.vtkDICOMImageReader +vtkmodules.vtkIOImage.vtkGESignaReader +vtkmodules.vtkIOImage.vtkHDRReader +vtkmodules.vtkIOImage.vtkImageExport +vtkmodules.vtkIOImage.vtkImageImport +vtkmodules.vtkIOImage.vtkImageImportExecutive +vtkmodules.vtkIOImage.vtkImageReader +vtkmodules.vtkIOImage.vtkImageReader2 +vtkmodules.vtkIOImage.vtkImageReader2Collection +vtkmodules.vtkIOImage.vtkImageReader2Factory +vtkmodules.vtkIOImage.vtkImageWriter +vtkmodules.vtkIOImage.vtkJPEGReader +vtkmodules.vtkIOImage.vtkJPEGWriter +vtkmodules.vtkIOImage.vtkJSONImageWriter +vtkmodules.vtkIOImage.vtkMRCReader +vtkmodules.vtkIOImage.vtkMedicalImageProperties +vtkmodules.vtkIOImage.vtkMedicalImageReader2 +vtkmodules.vtkIOImage.vtkMetaImageReader +vtkmodules.vtkIOImage.vtkMetaImageWriter +vtkmodules.vtkIOImage.vtkNIFTIImageHeader +vtkmodules.vtkIOImage.vtkNIFTIImageReader +vtkmodules.vtkIOImage.vtkNIFTIImageWriter +vtkmodules.vtkIOImage.vtkNrrdReader +vtkmodules.vtkIOImage.vtkOMETIFFReader +vtkmodules.vtkIOImage.vtkPNGReader +vtkmodules.vtkIOImage.vtkPNGWriter +vtkmodules.vtkIOImage.vtkPNMReader +vtkmodules.vtkIOImage.vtkPNMWriter +vtkmodules.vtkIOImage.vtkPostScriptWriter +vtkmodules.vtkIOImage.vtkSEPReader +vtkmodules.vtkIOImage.vtkSLCReader +vtkmodules.vtkIOImage.vtkTGAReader +vtkmodules.vtkIOImage.vtkTIFFReader +vtkmodules.vtkIOImage.vtkTIFFWriter +vtkmodules.vtkIOImage.vtkVolume16Reader +vtkmodules.vtkIOImage.vtkVolumeReader +vtkmodules.vtkIOImport.vtk3DSCamera_t +vtkmodules.vtkIOImport.vtk3DSChunk_t +vtkmodules.vtkIOImport.vtk3DSColour_t +vtkmodules.vtkIOImport.vtk3DSColour_t_24 +vtkmodules.vtkIOImport.vtk3DSFace_t +vtkmodules.vtkIOImport.vtk3DSImporter +vtkmodules.vtkIOImport.vtk3DSList_t +vtkmodules.vtkIOImport.vtk3DSMatProp_t +vtkmodules.vtkIOImport.vtk3DSMaterial_t +vtkmodules.vtkIOImport.vtk3DSMesh_t +vtkmodules.vtkIOImport.vtk3DSOmniLight_t +vtkmodules.vtkIOImport.vtk3DSSpotLight_t +vtkmodules.vtkIOImport.vtk3DSSummary_t +vtkmodules.vtkIOImport.vtkGLTFImporter +vtkmodules.vtkIOImport.vtkImporter +vtkmodules.vtkIOImport.vtkOBJImporter +vtkmodules.vtkIOImport.vtkVRMLImporter +vtkmodules.vtkIOInfovis.vtkBiomTableReader +vtkmodules.vtkIOInfovis.vtkChacoGraphReader +vtkmodules.vtkIOInfovis.vtkDIMACSGraphReader +vtkmodules.vtkIOInfovis.vtkDIMACSGraphWriter +vtkmodules.vtkIOInfovis.vtkDelimitedTextReader +vtkmodules.vtkIOInfovis.vtkFixedWidthTextReader +vtkmodules.vtkIOInfovis.vtkISIReader +vtkmodules.vtkIOInfovis.vtkMultiNewickTreeReader +vtkmodules.vtkIOInfovis.vtkNewickTreeReader +vtkmodules.vtkIOInfovis.vtkNewickTreeWriter +vtkmodules.vtkIOInfovis.vtkPhyloXMLTreeReader +vtkmodules.vtkIOInfovis.vtkPhyloXMLTreeWriter +vtkmodules.vtkIOInfovis.vtkRISReader +vtkmodules.vtkIOInfovis.vtkTemporalDelimitedTextReader +vtkmodules.vtkIOInfovis.vtkTulipReader +vtkmodules.vtkIOInfovis.vtkXGMLReader +vtkmodules.vtkIOInfovis.vtkXMLTreeReader +vtkmodules.vtkIOLSDyna.VTK_LSDYNA_BADFILE +vtkmodules.vtkIOLSDyna.vtkLSDynaReader +vtkmodules.vtkIOLSDyna.vtkLSDynaSummaryParser +vtkmodules.vtkIOLegacy.VTK_ASCII +vtkmodules.vtkIOLegacy.VTK_BINARY +vtkmodules.vtkIOLegacy.vtkCompositeDataReader +vtkmodules.vtkIOLegacy.vtkCompositeDataWriter +vtkmodules.vtkIOLegacy.vtkDataObjectReader +vtkmodules.vtkIOLegacy.vtkDataObjectWriter +vtkmodules.vtkIOLegacy.vtkDataReader +vtkmodules.vtkIOLegacy.vtkDataSetReader +vtkmodules.vtkIOLegacy.vtkDataSetWriter +vtkmodules.vtkIOLegacy.vtkDataWriter +vtkmodules.vtkIOLegacy.vtkGenericDataObjectReader +vtkmodules.vtkIOLegacy.vtkGenericDataObjectWriter +vtkmodules.vtkIOLegacy.vtkGraphReader +vtkmodules.vtkIOLegacy.vtkGraphWriter +vtkmodules.vtkIOLegacy.vtkPixelExtentIO +vtkmodules.vtkIOLegacy.vtkPolyDataReader +vtkmodules.vtkIOLegacy.vtkPolyDataWriter +vtkmodules.vtkIOLegacy.vtkRectilinearGridReader +vtkmodules.vtkIOLegacy.vtkRectilinearGridWriter +vtkmodules.vtkIOLegacy.vtkSimplePointsReader +vtkmodules.vtkIOLegacy.vtkSimplePointsWriter +vtkmodules.vtkIOLegacy.vtkStructuredGridReader +vtkmodules.vtkIOLegacy.vtkStructuredGridWriter +vtkmodules.vtkIOLegacy.vtkStructuredPointsReader +vtkmodules.vtkIOLegacy.vtkStructuredPointsWriter +vtkmodules.vtkIOLegacy.vtkTableReader +vtkmodules.vtkIOLegacy.vtkTableWriter +vtkmodules.vtkIOLegacy.vtkTreeReader +vtkmodules.vtkIOLegacy.vtkTreeWriter +vtkmodules.vtkIOLegacy.vtkUnstructuredGridReader +vtkmodules.vtkIOLegacy.vtkUnstructuredGridWriter +vtkmodules.vtkIOMINC.vtkMINCImageAttributes +vtkmodules.vtkIOMINC.vtkMINCImageReader +vtkmodules.vtkIOMINC.vtkMINCImageWriter +vtkmodules.vtkIOMINC.vtkMNIObjectReader +vtkmodules.vtkIOMINC.vtkMNIObjectWriter +vtkmodules.vtkIOMINC.vtkMNITagPointReader +vtkmodules.vtkIOMINC.vtkMNITagPointWriter +vtkmodules.vtkIOMINC.vtkMNITransformReader +vtkmodules.vtkIOMINC.vtkMNITransformWriter +vtkmodules.vtkIOMotionFX.vtkMotionFXCFGReader +vtkmodules.vtkIOMovie.vtkGenericMovieWriter +vtkmodules.vtkIONetCDF.vtkMPASReader +vtkmodules.vtkIONetCDF.vtkNetCDFCAMReader +vtkmodules.vtkIONetCDF.vtkNetCDFCFReader +vtkmodules.vtkIONetCDF.vtkNetCDFCFWriter +vtkmodules.vtkIONetCDF.vtkNetCDFPOPReader +vtkmodules.vtkIONetCDF.vtkNetCDFReader +vtkmodules.vtkIONetCDF.vtkSLACParticleReader +vtkmodules.vtkIONetCDF.vtkSLACReader +vtkmodules.vtkIOOMF.vtkOMFReader +vtkmodules.vtkIOOggTheora.vtkOggTheoraWriter +vtkmodules.vtkIOPIO.MAX_CHILD +vtkmodules.vtkIOPIO.MAX_DIM +vtkmodules.vtkIOPIO.NZero0 +vtkmodules.vtkIOPIO.NZero1 +vtkmodules.vtkIOPIO.NZero2 +vtkmodules.vtkIOPIO.Ncylin +vtkmodules.vtkIOPIO.Nd0 +vtkmodules.vtkIOPIO.Nd1 +vtkmodules.vtkIOPIO.Nd2 +vtkmodules.vtkIOPIO.Nmesh0 +vtkmodules.vtkIOPIO.Nmesh1 +vtkmodules.vtkIOPIO.Nmesh2 +vtkmodules.vtkIOPIO.Nnumdim +vtkmodules.vtkIOPIO.Nsphere +vtkmodules.vtkIOPIO.Ntime +vtkmodules.vtkIOPIO.vtkPIOReader +vtkmodules.vtkIOPLY.VTK_BIG_ENDIAN +vtkmodules.vtkIOPLY.VTK_COLOR_MODE_DEFAULT +vtkmodules.vtkIOPLY.VTK_COLOR_MODE_OFF +vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_CELL_COLOR +vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_COLOR +vtkmodules.vtkIOPLY.VTK_COLOR_MODE_UNIFORM_POINT_COLOR +vtkmodules.vtkIOPLY.VTK_LITTLE_ENDIAN +vtkmodules.vtkIOPLY.VTK_TEXTURECOORDS_TEXTUREUV +vtkmodules.vtkIOPLY.VTK_TEXTURECOORDS_UV +vtkmodules.vtkIOPLY.vtkPLY +vtkmodules.vtkIOPLY.vtkPLYReader +vtkmodules.vtkIOPLY.vtkPLYWriter +vtkmodules.vtkIOSQL.VTK_SQL_ALLBACKENDS +vtkmodules.vtkIOSQL.VTK_SQL_DEFAULT_COLUMN_SIZE +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_BATCH_OPERATIONS +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_BLOB +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_LAST_INSERT_ID +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_NAMED_PLACEHOLDERS +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_POSITIONAL_PLACEHOLDERS +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_PREPARED_QUERIES +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_QUERY_SIZE +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_TRANSACTIONS +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_TRIGGERS +vtkmodules.vtkIOSQL.VTK_SQL_FEATURE_UNICODE +vtkmodules.vtkIOSQL.VTK_SQL_MYSQL +vtkmodules.vtkIOSQL.VTK_SQL_POSTGRESQL +vtkmodules.vtkIOSQL.VTK_SQL_SQLITE +vtkmodules.vtkIOSQL.vtkDatabaseToTableReader +vtkmodules.vtkIOSQL.vtkRowQuery +vtkmodules.vtkIOSQL.vtkRowQueryToTable +vtkmodules.vtkIOSQL.vtkSQLDatabase +vtkmodules.vtkIOSQL.vtkSQLDatabaseSchema +vtkmodules.vtkIOSQL.vtkSQLDatabaseTableSource +vtkmodules.vtkIOSQL.vtkSQLQuery +vtkmodules.vtkIOSQL.vtkSQLiteDatabase +vtkmodules.vtkIOSQL.vtkSQLiteQuery +vtkmodules.vtkIOSQL.vtkSQLiteToTableReader +vtkmodules.vtkIOSQL.vtkTableToDatabaseWriter +vtkmodules.vtkIOSQL.vtkTableToSQLiteWriter +vtkmodules.vtkIOSegY.vtkSegYReader +vtkmodules.vtkIOTRUCHAS.vtkTRUCHASReader +vtkmodules.vtkIOTecplotTable.vtkTecplotTableReader +vtkmodules.vtkIOVPIC.vtkVPICReader +vtkmodules.vtkIOVeraOut.vtkVeraOutReader +vtkmodules.vtkIOVideo.vtkVideoSource +vtkmodules.vtkIOXML.vtkRTXMLPolyDataReader +vtkmodules.vtkIOXML.vtkXMLCompositeDataReader +vtkmodules.vtkIOXML.vtkXMLCompositeDataWriter +vtkmodules.vtkIOXML.vtkXMLDataObjectWriter +vtkmodules.vtkIOXML.vtkXMLDataReader +vtkmodules.vtkIOXML.vtkXMLDataSetWriter +vtkmodules.vtkIOXML.vtkXMLFileReadTester +vtkmodules.vtkIOXML.vtkXMLGenericDataObjectReader +vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataFileConverter +vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataReader +vtkmodules.vtkIOXML.vtkXMLHierarchicalBoxDataWriter +vtkmodules.vtkIOXML.vtkXMLHierarchicalDataReader +vtkmodules.vtkIOXML.vtkXMLHyperTreeGridReader +vtkmodules.vtkIOXML.vtkXMLHyperTreeGridWriter +vtkmodules.vtkIOXML.vtkXMLImageDataReader +vtkmodules.vtkIOXML.vtkXMLImageDataWriter +vtkmodules.vtkIOXML.vtkXMLMultiBlockDataReader +vtkmodules.vtkIOXML.vtkXMLMultiBlockDataWriter +vtkmodules.vtkIOXML.vtkXMLMultiGroupDataReader +vtkmodules.vtkIOXML.vtkXMLPDataObjectReader +vtkmodules.vtkIOXML.vtkXMLPDataReader +vtkmodules.vtkIOXML.vtkXMLPHyperTreeGridReader +vtkmodules.vtkIOXML.vtkXMLPImageDataReader +vtkmodules.vtkIOXML.vtkXMLPPolyDataReader +vtkmodules.vtkIOXML.vtkXMLPRectilinearGridReader +vtkmodules.vtkIOXML.vtkXMLPStructuredDataReader +vtkmodules.vtkIOXML.vtkXMLPStructuredGridReader +vtkmodules.vtkIOXML.vtkXMLPTableReader +vtkmodules.vtkIOXML.vtkXMLPUnstructuredDataReader +vtkmodules.vtkIOXML.vtkXMLPUnstructuredGridReader +vtkmodules.vtkIOXML.vtkXMLPartitionedDataSetCollectionReader +vtkmodules.vtkIOXML.vtkXMLPartitionedDataSetReader +vtkmodules.vtkIOXML.vtkXMLPolyDataReader +vtkmodules.vtkIOXML.vtkXMLPolyDataWriter +vtkmodules.vtkIOXML.vtkXMLReader +vtkmodules.vtkIOXML.vtkXMLRectilinearGridReader +vtkmodules.vtkIOXML.vtkXMLRectilinearGridWriter +vtkmodules.vtkIOXML.vtkXMLStructuredDataReader +vtkmodules.vtkIOXML.vtkXMLStructuredDataWriter +vtkmodules.vtkIOXML.vtkXMLStructuredGridReader +vtkmodules.vtkIOXML.vtkXMLStructuredGridWriter +vtkmodules.vtkIOXML.vtkXMLTableReader +vtkmodules.vtkIOXML.vtkXMLTableWriter +vtkmodules.vtkIOXML.vtkXMLUniformGridAMRReader +vtkmodules.vtkIOXML.vtkXMLUniformGridAMRWriter +vtkmodules.vtkIOXML.vtkXMLUnstructuredDataReader +vtkmodules.vtkIOXML.vtkXMLUnstructuredDataWriter +vtkmodules.vtkIOXML.vtkXMLUnstructuredGridReader +vtkmodules.vtkIOXML.vtkXMLUnstructuredGridWriter +vtkmodules.vtkIOXML.vtkXMLWriter +vtkmodules.vtkIOXML.vtkXMLWriterBase +vtkmodules.vtkIOXMLParser.vtkXMLDataParser +vtkmodules.vtkIOXMLParser.vtkXMLParser +vtkmodules.vtkIOXMLParser.vtkXMLUtilities +vtkmodules.vtkIOXdmf2.vtkSILBuilder +vtkmodules.vtkIOXdmf2.vtkXdmfDataArray +vtkmodules.vtkIOXdmf2.vtkXdmfReader +vtkmodules.vtkIOXdmf2.vtkXdmfWriter +vtkmodules.vtkImagingColor.vtkImageHSIToRGB +vtkmodules.vtkImagingColor.vtkImageHSVToRGB +vtkmodules.vtkImagingColor.vtkImageLuminance +vtkmodules.vtkImagingColor.vtkImageMapToRGBA +vtkmodules.vtkImagingColor.vtkImageMapToWindowLevelColors +vtkmodules.vtkImagingColor.vtkImageQuantizeRGBToIndex +vtkmodules.vtkImagingColor.vtkImageRGBToHSI +vtkmodules.vtkImagingColor.vtkImageRGBToHSV +vtkmodules.vtkImagingColor.vtkImageRGBToYIQ +vtkmodules.vtkImagingColor.vtkImageYIQToRGB +vtkmodules.vtkImagingCore.VTK_BLACKMAN_HARRIS3 +vtkmodules.vtkImagingCore.VTK_BLACKMAN_HARRIS4 +vtkmodules.vtkImagingCore.VTK_BLACKMAN_NUTTALL3 +vtkmodules.vtkImagingCore.VTK_BLACKMAN_NUTTALL4 +vtkmodules.vtkImagingCore.VTK_BLACKMAN_WINDOW +vtkmodules.vtkImagingCore.VTK_COSINE_WINDOW +vtkmodules.vtkImagingCore.VTK_HAMMING_WINDOW +vtkmodules.vtkImagingCore.VTK_HANN_WINDOW +vtkmodules.vtkImagingCore.VTK_IMAGE_BLEND_MODE_COMPOUND +vtkmodules.vtkImagingCore.VTK_IMAGE_BLEND_MODE_NORMAL +vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_CLAMP +vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_MIRROR +vtkmodules.vtkImagingCore.VTK_IMAGE_BORDER_REPEAT +vtkmodules.vtkImagingCore.VTK_IMAGE_BSPLINE_DEGREE_MAX +vtkmodules.vtkImagingCore.VTK_KAISER_WINDOW +vtkmodules.vtkImagingCore.VTK_LANCZOS_WINDOW +vtkmodules.vtkImagingCore.VTK_NUTTALL_WINDOW +vtkmodules.vtkImagingCore.VTK_RESLICE_CUBIC +vtkmodules.vtkImagingCore.VTK_RESLICE_LINEAR +vtkmodules.vtkImagingCore.VTK_RESLICE_NEAREST +vtkmodules.vtkImagingCore.VTK_SINC_KERNEL_SIZE_MAX +vtkmodules.vtkImagingCore.vtkAbstractImageInterpolator +vtkmodules.vtkImagingCore.vtkExtractVOI +vtkmodules.vtkImagingCore.vtkGenericImageInterpolator +vtkmodules.vtkImagingCore.vtkImageAppendComponents +vtkmodules.vtkImagingCore.vtkImageBSplineCoefficients +vtkmodules.vtkImagingCore.vtkImageBSplineInternals +vtkmodules.vtkImagingCore.vtkImageBSplineInterpolator +vtkmodules.vtkImagingCore.vtkImageBlend +vtkmodules.vtkImagingCore.vtkImageBorderMode +vtkmodules.vtkImagingCore.vtkImageCacheFilter +vtkmodules.vtkImagingCore.vtkImageCast +vtkmodules.vtkImagingCore.vtkImageChangeInformation +vtkmodules.vtkImagingCore.vtkImageClip +vtkmodules.vtkImagingCore.vtkImageConstantPad +vtkmodules.vtkImagingCore.vtkImageDataStreamer +vtkmodules.vtkImagingCore.vtkImageDecomposeFilter +vtkmodules.vtkImagingCore.vtkImageDifference +vtkmodules.vtkImagingCore.vtkImageExtractComponents +vtkmodules.vtkImagingCore.vtkImageFlip +vtkmodules.vtkImagingCore.vtkImageInterpolator +vtkmodules.vtkImagingCore.vtkImageIterateFilter +vtkmodules.vtkImagingCore.vtkImageMagnify +vtkmodules.vtkImagingCore.vtkImageMapToColors +vtkmodules.vtkImagingCore.vtkImageMask +vtkmodules.vtkImagingCore.vtkImageMirrorPad +vtkmodules.vtkImagingCore.vtkImagePadFilter +vtkmodules.vtkImagingCore.vtkImagePermute +vtkmodules.vtkImagingCore.vtkImagePointDataIterator +vtkmodules.vtkImagingCore.vtkImagePointIterator +vtkmodules.vtkImagingCore.vtkImageProbeFilter +vtkmodules.vtkImagingCore.vtkImageResample +vtkmodules.vtkImagingCore.vtkImageResize +vtkmodules.vtkImagingCore.vtkImageReslice +vtkmodules.vtkImagingCore.vtkImageResliceToColors +vtkmodules.vtkImagingCore.vtkImageShiftScale +vtkmodules.vtkImagingCore.vtkImageShrink3D +vtkmodules.vtkImagingCore.vtkImageSincInterpolator +vtkmodules.vtkImagingCore.vtkImageStencilAlgorithm +vtkmodules.vtkImagingCore.vtkImageStencilData +vtkmodules.vtkImagingCore.vtkImageStencilRaster +vtkmodules.vtkImagingCore.vtkImageStencilSource +vtkmodules.vtkImagingCore.vtkImageThreshold +vtkmodules.vtkImagingCore.vtkImageTranslateExtent +vtkmodules.vtkImagingCore.vtkImageWrapPad +vtkmodules.vtkImagingCore.vtkRTAnalyticSource +vtkmodules.vtkImagingFourier.vtkImageButterworthHighPass +vtkmodules.vtkImagingFourier.vtkImageButterworthLowPass +vtkmodules.vtkImagingFourier.vtkImageComplex_t +vtkmodules.vtkImagingFourier.vtkImageFFT +vtkmodules.vtkImagingFourier.vtkImageFourierCenter +vtkmodules.vtkImagingFourier.vtkImageFourierFilter +vtkmodules.vtkImagingFourier.vtkImageIdealHighPass +vtkmodules.vtkImagingFourier.vtkImageIdealLowPass +vtkmodules.vtkImagingFourier.vtkImageRFFT +vtkmodules.vtkImagingGeneral.VTK_EDT_SAITO +vtkmodules.vtkImagingGeneral.VTK_EDT_SAITO_CACHED +vtkmodules.vtkImagingGeneral.vtkImageAnisotropicDiffusion2D +vtkmodules.vtkImagingGeneral.vtkImageAnisotropicDiffusion3D +vtkmodules.vtkImagingGeneral.vtkImageCheckerboard +vtkmodules.vtkImagingGeneral.vtkImageCityBlockDistance +vtkmodules.vtkImagingGeneral.vtkImageConvolve +vtkmodules.vtkImagingGeneral.vtkImageCorrelation +vtkmodules.vtkImagingGeneral.vtkImageEuclideanDistance +vtkmodules.vtkImagingGeneral.vtkImageEuclideanToPolar +vtkmodules.vtkImagingGeneral.vtkImageGaussianSmooth +vtkmodules.vtkImagingGeneral.vtkImageGradient +vtkmodules.vtkImagingGeneral.vtkImageGradientMagnitude +vtkmodules.vtkImagingGeneral.vtkImageHybridMedian2D +vtkmodules.vtkImagingGeneral.vtkImageLaplacian +vtkmodules.vtkImagingGeneral.vtkImageMedian3D +vtkmodules.vtkImagingGeneral.vtkImageNormalize +vtkmodules.vtkImagingGeneral.vtkImageRange3D +vtkmodules.vtkImagingGeneral.vtkImageSeparableConvolution +vtkmodules.vtkImagingGeneral.vtkImageSlab +vtkmodules.vtkImagingGeneral.vtkImageSlabReslice +vtkmodules.vtkImagingGeneral.vtkImageSobel2D +vtkmodules.vtkImagingGeneral.vtkImageSobel3D +vtkmodules.vtkImagingGeneral.vtkImageSpatialAlgorithm +vtkmodules.vtkImagingGeneral.vtkImageVariance3D +vtkmodules.vtkImagingGeneral.vtkSimpleImageFilterExample +vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_MAX +vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_MIN +vtkmodules.vtkImagingHybrid.VTK_ACCUMULATION_MODE_SUM +vtkmodules.vtkImagingHybrid.VTK_WIPE_HORIZONTAL +vtkmodules.vtkImagingHybrid.VTK_WIPE_LOWER_LEFT +vtkmodules.vtkImagingHybrid.VTK_WIPE_LOWER_RIGHT +vtkmodules.vtkImagingHybrid.VTK_WIPE_QUAD +vtkmodules.vtkImagingHybrid.VTK_WIPE_UPPER_LEFT +vtkmodules.vtkImagingHybrid.VTK_WIPE_UPPER_RIGHT +vtkmodules.vtkImagingHybrid.VTK_WIPE_VERTICAL +vtkmodules.vtkImagingHybrid.vtkBooleanTexture +vtkmodules.vtkImagingHybrid.vtkCheckerboardSplatter +vtkmodules.vtkImagingHybrid.vtkFastSplatter +vtkmodules.vtkImagingHybrid.vtkGaussianSplatter +vtkmodules.vtkImagingHybrid.vtkImageCursor3D +vtkmodules.vtkImagingHybrid.vtkImageRectilinearWipe +vtkmodules.vtkImagingHybrid.vtkImageToPoints +vtkmodules.vtkImagingHybrid.vtkPointLoad +vtkmodules.vtkImagingHybrid.vtkSampleFunction +vtkmodules.vtkImagingHybrid.vtkShepardMethod +vtkmodules.vtkImagingHybrid.vtkSliceCubes +vtkmodules.vtkImagingHybrid.vtkSurfaceReconstructionFilter +vtkmodules.vtkImagingHybrid.vtkTriangularTexture +vtkmodules.vtkImagingHybrid.vtkVoxelModeller +vtkmodules.vtkImagingMath.VTK_ABS +vtkmodules.vtkImagingMath.VTK_ADD +vtkmodules.vtkImagingMath.VTK_ADDC +vtkmodules.vtkImagingMath.VTK_AND +vtkmodules.vtkImagingMath.VTK_ATAN +vtkmodules.vtkImagingMath.VTK_ATAN2 +vtkmodules.vtkImagingMath.VTK_COMPLEX_MULTIPLY +vtkmodules.vtkImagingMath.VTK_CONJUGATE +vtkmodules.vtkImagingMath.VTK_COS +vtkmodules.vtkImagingMath.VTK_DIVIDE +vtkmodules.vtkImagingMath.VTK_EXP +vtkmodules.vtkImagingMath.VTK_INVERT +vtkmodules.vtkImagingMath.VTK_LOG +vtkmodules.vtkImagingMath.VTK_MAX +vtkmodules.vtkImagingMath.VTK_MIN +vtkmodules.vtkImagingMath.VTK_MULTIPLY +vtkmodules.vtkImagingMath.VTK_MULTIPLYBYK +vtkmodules.vtkImagingMath.VTK_NAND +vtkmodules.vtkImagingMath.VTK_NOP +vtkmodules.vtkImagingMath.VTK_NOR +vtkmodules.vtkImagingMath.VTK_NOT +vtkmodules.vtkImagingMath.VTK_OR +vtkmodules.vtkImagingMath.VTK_REPLACECBYK +vtkmodules.vtkImagingMath.VTK_SIN +vtkmodules.vtkImagingMath.VTK_SQR +vtkmodules.vtkImagingMath.VTK_SQRT +vtkmodules.vtkImagingMath.VTK_SUBTRACT +vtkmodules.vtkImagingMath.VTK_XOR +vtkmodules.vtkImagingMath.vtkImageDivergence +vtkmodules.vtkImagingMath.vtkImageDotProduct +vtkmodules.vtkImagingMath.vtkImageLogarithmicScale +vtkmodules.vtkImagingMath.vtkImageLogic +vtkmodules.vtkImagingMath.vtkImageMagnitude +vtkmodules.vtkImagingMath.vtkImageMaskBits +vtkmodules.vtkImagingMath.vtkImageMathematics +vtkmodules.vtkImagingMath.vtkImageWeightedSum +vtkmodules.vtkImagingMorphological.VTK_IMAGE_NON_MAXIMUM_SUPPRESSION_MAGNITUDE_INPUT +vtkmodules.vtkImagingMorphological.VTK_IMAGE_NON_MAXIMUM_SUPPRESSION_VECTOR_INPUT +vtkmodules.vtkImagingMorphological.vtkImage2DIslandPixel_t +vtkmodules.vtkImagingMorphological.vtkImageConnectivityFilter +vtkmodules.vtkImagingMorphological.vtkImageConnector +vtkmodules.vtkImagingMorphological.vtkImageConnectorSeed +vtkmodules.vtkImagingMorphological.vtkImageContinuousDilate3D +vtkmodules.vtkImagingMorphological.vtkImageContinuousErode3D +vtkmodules.vtkImagingMorphological.vtkImageDilateErode3D +vtkmodules.vtkImagingMorphological.vtkImageIslandRemoval2D +vtkmodules.vtkImagingMorphological.vtkImageNonMaximumSuppression +vtkmodules.vtkImagingMorphological.vtkImageOpenClose3D +vtkmodules.vtkImagingMorphological.vtkImageSeedConnectivity +vtkmodules.vtkImagingMorphological.vtkImageSkeleton2D +vtkmodules.vtkImagingMorphological.vtkImageThresholdConnectivity +vtkmodules.vtkImagingOpenGL2.vtkOpenGLImageGradient +vtkmodules.vtkImagingSources.vtkImageCanvasSource2D +vtkmodules.vtkImagingSources.vtkImageEllipsoidSource +vtkmodules.vtkImagingSources.vtkImageGaussianSource +vtkmodules.vtkImagingSources.vtkImageGridSource +vtkmodules.vtkImagingSources.vtkImageMandelbrotSource +vtkmodules.vtkImagingSources.vtkImageNoiseSource +vtkmodules.vtkImagingSources.vtkImageSinusoidSource +vtkmodules.vtkImagingStatistics.vtkImageAccumulate +vtkmodules.vtkImagingStatistics.vtkImageHistogram +vtkmodules.vtkImagingStatistics.vtkImageHistogramStatistics +vtkmodules.vtkImagingStencil.vtkImageStencil +vtkmodules.vtkImagingStencil.vtkImageStencilToImage +vtkmodules.vtkImagingStencil.vtkImageToImageStencil +vtkmodules.vtkImagingStencil.vtkImplicitFunctionToImageStencil +vtkmodules.vtkImagingStencil.vtkLassoStencilSource +vtkmodules.vtkImagingStencil.vtkPolyDataToImageStencil +vtkmodules.vtkImagingStencil.vtkROIStencilSource +vtkmodules.vtkInfovisCore.vtkAddMembershipArray +vtkmodules.vtkInfovisCore.vtkAdjacencyMatrixToEdgeTable +vtkmodules.vtkInfovisCore.vtkArrayNorm +vtkmodules.vtkInfovisCore.vtkArrayToTable +vtkmodules.vtkInfovisCore.vtkCollapseGraph +vtkmodules.vtkInfovisCore.vtkCollapseVerticesByArray +vtkmodules.vtkInfovisCore.vtkContinuousScatterplot +vtkmodules.vtkInfovisCore.vtkDataObjectToTable +vtkmodules.vtkInfovisCore.vtkDotProductSimilarity +vtkmodules.vtkInfovisCore.vtkEdgeCenters +vtkmodules.vtkInfovisCore.vtkExpandSelectedGraph +vtkmodules.vtkInfovisCore.vtkExtractSelectedGraph +vtkmodules.vtkInfovisCore.vtkExtractSelectedTree +vtkmodules.vtkInfovisCore.vtkGenerateIndexArray +vtkmodules.vtkInfovisCore.vtkGraphHierarchicalBundleEdges +vtkmodules.vtkInfovisCore.vtkGroupLeafVertices +vtkmodules.vtkInfovisCore.vtkKCoreDecomposition +vtkmodules.vtkInfovisCore.vtkMergeColumns +vtkmodules.vtkInfovisCore.vtkMergeGraphs +vtkmodules.vtkInfovisCore.vtkMergeTables +vtkmodules.vtkInfovisCore.vtkMutableGraphHelper +vtkmodules.vtkInfovisCore.vtkNetworkHierarchy +vtkmodules.vtkInfovisCore.vtkPipelineGraphSource +vtkmodules.vtkInfovisCore.vtkPruneTreeFilter +vtkmodules.vtkInfovisCore.vtkRandomGraphSource +vtkmodules.vtkInfovisCore.vtkReduceTable +vtkmodules.vtkInfovisCore.vtkRemoveHiddenData +vtkmodules.vtkInfovisCore.vtkRemoveIsolatedVertices +vtkmodules.vtkInfovisCore.vtkSparseArrayToTable +vtkmodules.vtkInfovisCore.vtkStreamGraph +vtkmodules.vtkInfovisCore.vtkStringToCategory +vtkmodules.vtkInfovisCore.vtkStringToNumeric +vtkmodules.vtkInfovisCore.vtkTableToArray +vtkmodules.vtkInfovisCore.vtkTableToGraph +vtkmodules.vtkInfovisCore.vtkTableToSparseArray +vtkmodules.vtkInfovisCore.vtkTableToTreeFilter +vtkmodules.vtkInfovisCore.vtkThresholdGraph +vtkmodules.vtkInfovisCore.vtkThresholdTable +vtkmodules.vtkInfovisCore.vtkTransferAttributes +vtkmodules.vtkInfovisCore.vtkTransposeMatrix +vtkmodules.vtkInfovisCore.vtkTreeDifferenceFilter +vtkmodules.vtkInfovisCore.vtkTreeFieldAggregator +vtkmodules.vtkInfovisCore.vtkTreeLevelsFilter +vtkmodules.vtkInfovisCore.vtkVertexDegree +vtkmodules.vtkInfovisCore.vtkWordCloud +vtkmodules.vtkInfovisLayout.vtkArcParallelEdgeStrategy +vtkmodules.vtkInfovisLayout.vtkAreaLayout +vtkmodules.vtkInfovisLayout.vtkAreaLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkAssignCoordinates +vtkmodules.vtkInfovisLayout.vtkAssignCoordinatesLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkAttributeClustering2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkBoxLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkCirclePackFrontChainLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkCirclePackLayout +vtkmodules.vtkInfovisLayout.vtkCirclePackLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkCirclePackToPolyData +vtkmodules.vtkInfovisLayout.vtkCircularLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkClustering2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkCommunity2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkConeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkConstrained2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkCosmicTreeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkEdgeLayout +vtkmodules.vtkInfovisLayout.vtkEdgeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkFast2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkForceDirectedLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkGeoEdgeStrategy +vtkmodules.vtkInfovisLayout.vtkGeoMath +vtkmodules.vtkInfovisLayout.vtkGraphLayout +vtkmodules.vtkInfovisLayout.vtkGraphLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkIncrementalForceLayout +vtkmodules.vtkInfovisLayout.vtkKCoreLayout +vtkmodules.vtkInfovisLayout.vtkPassThroughEdgeStrategy +vtkmodules.vtkInfovisLayout.vtkPassThroughLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkPerturbCoincidentVertices +vtkmodules.vtkInfovisLayout.vtkRandomLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkSimple2DLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkSimple3DCirclesStrategy +vtkmodules.vtkInfovisLayout.vtkSliceAndDiceLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkSpanTreeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkSplineGraphEdges +vtkmodules.vtkInfovisLayout.vtkSquarifyLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkStackedTreeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkTreeLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkTreeMapLayout +vtkmodules.vtkInfovisLayout.vtkTreeMapLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkTreeMapToPolyData +vtkmodules.vtkInfovisLayout.vtkTreeOrbitLayoutStrategy +vtkmodules.vtkInfovisLayout.vtkTreeRingToPolyData +vtkmodules.vtkInteractionImage.vtkImageViewer +vtkmodules.vtkInteractionImage.vtkImageViewer2 +vtkmodules.vtkInteractionImage.vtkResliceImageViewer +vtkmodules.vtkInteractionImage.vtkResliceImageViewerMeasurements +vtkmodules.vtkInteractionStyle.VTKIS_ACTOR +vtkmodules.vtkInteractionStyle.VTKIS_CAMERA +vtkmodules.vtkInteractionStyle.VTKIS_IMAGE2D +vtkmodules.vtkInteractionStyle.VTKIS_IMAGE3D +vtkmodules.vtkInteractionStyle.VTKIS_IMAGE_SLICING +vtkmodules.vtkInteractionStyle.VTKIS_JOYSTICK +vtkmodules.vtkInteractionStyle.VTKIS_SLICE +vtkmodules.vtkInteractionStyle.VTKIS_TRACKBALL +vtkmodules.vtkInteractionStyle.VTKIS_USERINTERACTION +vtkmodules.vtkInteractionStyle.VTKIS_WINDOW_LEVEL +vtkmodules.vtkInteractionStyle.VTK_UNICAM_BUTTON_LEFT +vtkmodules.vtkInteractionStyle.VTK_UNICAM_BUTTON_MIDDLE +vtkmodules.vtkInteractionStyle.VTK_UNICAM_BUTTON_RIGHT +vtkmodules.vtkInteractionStyle.VTK_UNICAM_CAM_INT_CHOOSE +vtkmodules.vtkInteractionStyle.VTK_UNICAM_CAM_INT_DOLLY +vtkmodules.vtkInteractionStyle.VTK_UNICAM_CAM_INT_PAN +vtkmodules.vtkInteractionStyle.VTK_UNICAM_CAM_INT_ROT +vtkmodules.vtkInteractionStyle.VTK_UNICAM_NONE +vtkmodules.vtkInteractionStyle.vtkInteractorStyleDrawPolygon +vtkmodules.vtkInteractionStyle.vtkInteractorStyleFlight +vtkmodules.vtkInteractionStyle.vtkInteractorStyleImage +vtkmodules.vtkInteractionStyle.vtkInteractorStyleJoystickActor +vtkmodules.vtkInteractionStyle.vtkInteractorStyleJoystickCamera +vtkmodules.vtkInteractionStyle.vtkInteractorStyleMultiTouchCamera +vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBand2D +vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBand3D +vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBandPick +vtkmodules.vtkInteractionStyle.vtkInteractorStyleRubberBandZoom +vtkmodules.vtkInteractionStyle.vtkInteractorStyleSwitch +vtkmodules.vtkInteractionStyle.vtkInteractorStyleTerrain +vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackball +vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackballActor +vtkmodules.vtkInteractionStyle.vtkInteractorStyleTrackballCamera +vtkmodules.vtkInteractionStyle.vtkInteractorStyleUnicam +vtkmodules.vtkInteractionStyle.vtkInteractorStyleUser +vtkmodules.vtkInteractionStyle.vtkParallelCoordinatesInteractorStyle +vtkmodules.vtkInteractionWidgets.VTK_CUBIC_RESLICE +vtkmodules.vtkInteractionWidgets.VTK_IMAGE_PLANE_WIDGET_MAX_TEXTBUFF +vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_XY +vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_XZ +vtkmodules.vtkInteractionWidgets.VTK_ITW_PROJECTION_YZ +vtkmodules.vtkInteractionWidgets.VTK_ITW_SNAP_CELLS +vtkmodules.vtkInteractionWidgets.VTK_ITW_SNAP_POINTS +vtkmodules.vtkInteractionWidgets.VTK_LINEAR_RESLICE +vtkmodules.vtkInteractionWidgets.VTK_MAX_CYL_RESOLUTION +vtkmodules.vtkInteractionWidgets.VTK_NEAREST_RESLICE +vtkmodules.vtkInteractionWidgets.VTK_PLANE_OFF +vtkmodules.vtkInteractionWidgets.VTK_PLANE_OUTLINE +vtkmodules.vtkInteractionWidgets.VTK_PLANE_SURFACE +vtkmodules.vtkInteractionWidgets.VTK_PLANE_WIREFRAME +vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_OBLIQUE +vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_XY +vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_XZ +vtkmodules.vtkInteractionWidgets.VTK_PROJECTION_YZ +vtkmodules.vtkInteractionWidgets.VTK_RESLICE_CURSOR_REPRESENTATION_MAX_TEXTBUFF +vtkmodules.vtkInteractionWidgets.VTK_SPHERE_OFF +vtkmodules.vtkInteractionWidgets.VTK_SPHERE_SURFACE +vtkmodules.vtkInteractionWidgets.VTK_SPHERE_WIREFRAME +vtkmodules.vtkInteractionWidgets.vtk3DWidget +vtkmodules.vtkInteractionWidgets.vtkAbstractPolygonalHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkAbstractSplineRepresentation +vtkmodules.vtkInteractionWidgets.vtkAbstractWidget +vtkmodules.vtkInteractionWidgets.vtkAffineRepresentation +vtkmodules.vtkInteractionWidgets.vtkAffineRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkAffineWidget +vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation +vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkAngleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkAngleWidget +vtkmodules.vtkInteractionWidgets.vtkAxesTransformRepresentation +vtkmodules.vtkInteractionWidgets.vtkAxesTransformWidget +vtkmodules.vtkInteractionWidgets.vtkBalloonRepresentation +vtkmodules.vtkInteractionWidgets.vtkBalloonWidget +vtkmodules.vtkInteractionWidgets.vtkBezierContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkBiDimensionalRepresentation +vtkmodules.vtkInteractionWidgets.vtkBiDimensionalRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkBiDimensionalWidget +vtkmodules.vtkInteractionWidgets.vtkBorderRepresentation +vtkmodules.vtkInteractionWidgets.vtkBorderWidget +vtkmodules.vtkInteractionWidgets.vtkBoundedPlanePointPlacer +vtkmodules.vtkInteractionWidgets.vtkBoxRepresentation +vtkmodules.vtkInteractionWidgets.vtkBoxWidget +vtkmodules.vtkInteractionWidgets.vtkBoxWidget2 +vtkmodules.vtkInteractionWidgets.vtkBrokenLineWidget +vtkmodules.vtkInteractionWidgets.vtkButtonRepresentation +vtkmodules.vtkInteractionWidgets.vtkButtonWidget +vtkmodules.vtkInteractionWidgets.vtkCameraHandleSource +vtkmodules.vtkInteractionWidgets.vtkCameraOrientationRepresentation +vtkmodules.vtkInteractionWidgets.vtkCameraOrientationWidget +vtkmodules.vtkInteractionWidgets.vtkCameraPathRepresentation +vtkmodules.vtkInteractionWidgets.vtkCameraPathWidget +vtkmodules.vtkInteractionWidgets.vtkCameraRepresentation +vtkmodules.vtkInteractionWidgets.vtkCameraWidget +vtkmodules.vtkInteractionWidgets.vtkCaptionRepresentation +vtkmodules.vtkInteractionWidgets.vtkCaptionWidget +vtkmodules.vtkInteractionWidgets.vtkCellCentersPointPlacer +vtkmodules.vtkInteractionWidgets.vtkCenteredSliderRepresentation +vtkmodules.vtkInteractionWidgets.vtkCenteredSliderWidget +vtkmodules.vtkInteractionWidgets.vtkCheckerboardRepresentation +vtkmodules.vtkInteractionWidgets.vtkCheckerboardWidget +vtkmodules.vtkInteractionWidgets.vtkClosedSurfacePointPlacer +vtkmodules.vtkInteractionWidgets.vtkConstrainedPointHandleRepresentation +vtkmodules.vtkInteractionWidgets.vtkContinuousValueWidget +vtkmodules.vtkInteractionWidgets.vtkContinuousValueWidgetRepresentation +vtkmodules.vtkInteractionWidgets.vtkContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkContourRepresentation +vtkmodules.vtkInteractionWidgets.vtkContourRepresentationInternals +vtkmodules.vtkInteractionWidgets.vtkContourRepresentationNode +vtkmodules.vtkInteractionWidgets.vtkContourRepresentationPoint +vtkmodules.vtkInteractionWidgets.vtkContourWidget +vtkmodules.vtkInteractionWidgets.vtkCoordinateFrameRepresentation +vtkmodules.vtkInteractionWidgets.vtkCoordinateFrameWidget +vtkmodules.vtkInteractionWidgets.vtkCurveRepresentation +vtkmodules.vtkInteractionWidgets.vtkDijkstraImageContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkDisplaySizedImplicitPlaneRepresentation +vtkmodules.vtkInteractionWidgets.vtkDisplaySizedImplicitPlaneWidget +vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation +vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkDistanceRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkDistanceWidget +vtkmodules.vtkInteractionWidgets.vtkEllipsoidTensorProbeRepresentation +vtkmodules.vtkInteractionWidgets.vtkEqualizerContextItem +vtkmodules.vtkInteractionWidgets.vtkEvent +vtkmodules.vtkInteractionWidgets.vtkFinitePlaneRepresentation +vtkmodules.vtkInteractionWidgets.vtkFinitePlaneWidget +vtkmodules.vtkInteractionWidgets.vtkFixedSizeHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkFocalPlaneContourRepresentation +vtkmodules.vtkInteractionWidgets.vtkFocalPlanePointPlacer +vtkmodules.vtkInteractionWidgets.vtkHandleRepresentation +vtkmodules.vtkInteractionWidgets.vtkHandleWidget +vtkmodules.vtkInteractionWidgets.vtkHoverWidget +vtkmodules.vtkInteractionWidgets.vtkImageActorPointPlacer +vtkmodules.vtkInteractionWidgets.vtkImageCroppingRegionsWidget +vtkmodules.vtkInteractionWidgets.vtkImageOrthoPlanes +vtkmodules.vtkInteractionWidgets.vtkImagePlaneWidget +vtkmodules.vtkInteractionWidgets.vtkImageTracerWidget +vtkmodules.vtkInteractionWidgets.vtkImplicitCylinderRepresentation +vtkmodules.vtkInteractionWidgets.vtkImplicitCylinderWidget +vtkmodules.vtkInteractionWidgets.vtkImplicitImageRepresentation +vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneRepresentation +vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneWidget +vtkmodules.vtkInteractionWidgets.vtkImplicitPlaneWidget2 +vtkmodules.vtkInteractionWidgets.vtkLightRepresentation +vtkmodules.vtkInteractionWidgets.vtkLightWidget +vtkmodules.vtkInteractionWidgets.vtkLineRepresentation +vtkmodules.vtkInteractionWidgets.vtkLineWidget +vtkmodules.vtkInteractionWidgets.vtkLineWidget2 +vtkmodules.vtkInteractionWidgets.vtkLinearContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkLogoRepresentation +vtkmodules.vtkInteractionWidgets.vtkLogoWidget +vtkmodules.vtkInteractionWidgets.vtkMagnifierRepresentation +vtkmodules.vtkInteractionWidgets.vtkMagnifierWidget +vtkmodules.vtkInteractionWidgets.vtkMeasurementCubeHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkOrientationMarkerWidget +vtkmodules.vtkInteractionWidgets.vtkOrientedGlyphContourRepresentation +vtkmodules.vtkInteractionWidgets.vtkOrientedGlyphFocalPlaneContourRepresentation +vtkmodules.vtkInteractionWidgets.vtkOrientedPolygonalHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkParallelopipedRepresentation +vtkmodules.vtkInteractionWidgets.vtkParallelopipedWidget +vtkmodules.vtkInteractionWidgets.vtkPlaneWidget +vtkmodules.vtkInteractionWidgets.vtkPlaybackRepresentation +vtkmodules.vtkInteractionWidgets.vtkPlaybackWidget +vtkmodules.vtkInteractionWidgets.vtkPointCloudRepresentation +vtkmodules.vtkInteractionWidgets.vtkPointCloudWidget +vtkmodules.vtkInteractionWidgets.vtkPointHandleRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkPointHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkPointPlacer +vtkmodules.vtkInteractionWidgets.vtkPointWidget +vtkmodules.vtkInteractionWidgets.vtkPolyDataContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkPolyDataPointPlacer +vtkmodules.vtkInteractionWidgets.vtkPolyDataSourceWidget +vtkmodules.vtkInteractionWidgets.vtkPolyLineRepresentation +vtkmodules.vtkInteractionWidgets.vtkPolyLineWidget +vtkmodules.vtkInteractionWidgets.vtkPolygonalHandleRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfaceContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfacePointPlacer +vtkmodules.vtkInteractionWidgets.vtkPolygonalSurfacePointPlacerNode +vtkmodules.vtkInteractionWidgets.vtkProgressBarRepresentation +vtkmodules.vtkInteractionWidgets.vtkProgressBarWidget +vtkmodules.vtkInteractionWidgets.vtkProp3DButtonRepresentation +vtkmodules.vtkInteractionWidgets.vtkRectilinearWipeRepresentation +vtkmodules.vtkInteractionWidgets.vtkRectilinearWipeWidget +vtkmodules.vtkInteractionWidgets.vtkResliceCursor +vtkmodules.vtkInteractionWidgets.vtkResliceCursorActor +vtkmodules.vtkInteractionWidgets.vtkResliceCursorLineRepresentation +vtkmodules.vtkInteractionWidgets.vtkResliceCursorPicker +vtkmodules.vtkInteractionWidgets.vtkResliceCursorPolyDataAlgorithm +vtkmodules.vtkInteractionWidgets.vtkResliceCursorRepresentation +vtkmodules.vtkInteractionWidgets.vtkResliceCursorThickLineRepresentation +vtkmodules.vtkInteractionWidgets.vtkResliceCursorWidget +vtkmodules.vtkInteractionWidgets.vtkScalarBarRepresentation +vtkmodules.vtkInteractionWidgets.vtkScalarBarWidget +vtkmodules.vtkInteractionWidgets.vtkSeedRepresentation +vtkmodules.vtkInteractionWidgets.vtkSeedWidget +vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation +vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkSliderRepresentation3D +vtkmodules.vtkInteractionWidgets.vtkSliderWidget +vtkmodules.vtkInteractionWidgets.vtkSphereHandleRepresentation +vtkmodules.vtkInteractionWidgets.vtkSphereRepresentation +vtkmodules.vtkInteractionWidgets.vtkSphereWidget +vtkmodules.vtkInteractionWidgets.vtkSphereWidget2 +vtkmodules.vtkInteractionWidgets.vtkSplineRepresentation +vtkmodules.vtkInteractionWidgets.vtkSplineWidget +vtkmodules.vtkInteractionWidgets.vtkSplineWidget2 +vtkmodules.vtkInteractionWidgets.vtkTensorProbeRepresentation +vtkmodules.vtkInteractionWidgets.vtkTensorProbeWidget +vtkmodules.vtkInteractionWidgets.vtkTensorRepresentation +vtkmodules.vtkInteractionWidgets.vtkTensorWidget +vtkmodules.vtkInteractionWidgets.vtkTerrainContourLineInterpolator +vtkmodules.vtkInteractionWidgets.vtkTerrainDataPointPlacer +vtkmodules.vtkInteractionWidgets.vtkTextRepresentation +vtkmodules.vtkInteractionWidgets.vtkTextWidget +vtkmodules.vtkInteractionWidgets.vtkTexturedButtonRepresentation +vtkmodules.vtkInteractionWidgets.vtkTexturedButtonRepresentation2D +vtkmodules.vtkInteractionWidgets.vtkWidgetCallbackMapper +vtkmodules.vtkInteractionWidgets.vtkWidgetEvent +vtkmodules.vtkInteractionWidgets.vtkWidgetEventTranslator +vtkmodules.vtkInteractionWidgets.vtkWidgetRepresentation +vtkmodules.vtkInteractionWidgets.vtkWidgetSet +vtkmodules.vtkInteractionWidgets.vtkXYPlotWidget +vtkmodules.vtkPythonContext2D.vtkPythonItem +vtkmodules.vtkRenderingAnnotation.VTK_DEFAULT_NUMBER_OF_RADIAL_AXES +vtkmodules.vtkRenderingAnnotation.VTK_IV_COLUMN +vtkmodules.vtkRenderingAnnotation.VTK_IV_ROW +vtkmodules.vtkRenderingAnnotation.VTK_MAXIMUM_NUMBER_OF_POLAR_AXIS_TICKS +vtkmodules.vtkRenderingAnnotation.VTK_MAXIMUM_NUMBER_OF_RADIAL_AXES +vtkmodules.vtkRenderingAnnotation.VTK_MAXIMUM_RATIO +vtkmodules.vtkRenderingAnnotation.VTK_ORIENT_HORIZONTAL +vtkmodules.vtkRenderingAnnotation.VTK_ORIENT_VERTICAL +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_FIELD_DATA +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_NORMALS +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_SCALARS +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_TCOORDS +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_TENSORS +vtkmodules.vtkRenderingAnnotation.VTK_PLOT_VECTORS +vtkmodules.vtkRenderingAnnotation.VTK_POLAR_ARC_RESOLUTION_PER_DEG +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_ARC_LENGTH +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_COLUMN +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_INDEX +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_NORMALIZED_ARC_LENGTH +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_ROW +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_VALUE +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_HCENTER +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_TOP +vtkmodules.vtkRenderingAnnotation.VTK_XYPLOT_Y_AXIS_VCENTER +vtkmodules.vtkRenderingAnnotation.vtkAnnotatedCubeActor +vtkmodules.vtkRenderingAnnotation.vtkArcPlotter +vtkmodules.vtkRenderingAnnotation.vtkAxesActor +vtkmodules.vtkRenderingAnnotation.vtkAxisActor +vtkmodules.vtkRenderingAnnotation.vtkAxisActor2D +vtkmodules.vtkRenderingAnnotation.vtkAxisFollower +vtkmodules.vtkRenderingAnnotation.vtkBarChartActor +vtkmodules.vtkRenderingAnnotation.vtkCaptionActor2D +vtkmodules.vtkRenderingAnnotation.vtkConvexHull2D +vtkmodules.vtkRenderingAnnotation.vtkCornerAnnotation +vtkmodules.vtkRenderingAnnotation.vtkCubeAxesActor +vtkmodules.vtkRenderingAnnotation.vtkCubeAxesActor2D +vtkmodules.vtkRenderingAnnotation.vtkGraphAnnotationLayersFilter +vtkmodules.vtkRenderingAnnotation.vtkLeaderActor2D +vtkmodules.vtkRenderingAnnotation.vtkLegendBoxActor +vtkmodules.vtkRenderingAnnotation.vtkLegendScaleActor +vtkmodules.vtkRenderingAnnotation.vtkParallelCoordinatesActor +vtkmodules.vtkRenderingAnnotation.vtkPieChartActor +vtkmodules.vtkRenderingAnnotation.vtkPolarAxesActor +vtkmodules.vtkRenderingAnnotation.vtkProp3DAxisFollower +vtkmodules.vtkRenderingAnnotation.vtkScalarBarActor +vtkmodules.vtkRenderingAnnotation.vtkSpiderPlotActor +vtkmodules.vtkRenderingAnnotation.vtkXYPlotActor +vtkmodules.vtkRenderingContext2D.vtkAbstractContextBufferId +vtkmodules.vtkRenderingContext2D.vtkAbstractContextItem +vtkmodules.vtkRenderingContext2D.vtkBlockItem +vtkmodules.vtkRenderingContext2D.vtkBrush +vtkmodules.vtkRenderingContext2D.vtkContext2D +vtkmodules.vtkRenderingContext2D.vtkContext3D +vtkmodules.vtkRenderingContext2D.vtkContextActor +vtkmodules.vtkRenderingContext2D.vtkContextClip +vtkmodules.vtkRenderingContext2D.vtkContextDevice2D +vtkmodules.vtkRenderingContext2D.vtkContextDevice3D +vtkmodules.vtkRenderingContext2D.vtkContextItem +vtkmodules.vtkRenderingContext2D.vtkContextKeyEvent +vtkmodules.vtkRenderingContext2D.vtkContextMapper2D +vtkmodules.vtkRenderingContext2D.vtkContextMouseEvent +vtkmodules.vtkRenderingContext2D.vtkContextScene +vtkmodules.vtkRenderingContext2D.vtkContextTransform +vtkmodules.vtkRenderingContext2D.vtkImageItem +vtkmodules.vtkRenderingContext2D.vtkLabeledContourPolyDataItem +vtkmodules.vtkRenderingContext2D.vtkMarkerUtilities +vtkmodules.vtkRenderingContext2D.vtkPen +vtkmodules.vtkRenderingContext2D.vtkPolyDataItem +vtkmodules.vtkRenderingContext2D.vtkPropItem +vtkmodules.vtkRenderingContext2D.vtkTooltipItem +vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextActor +vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextBufferId +vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextDevice2D +vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLContextDevice3D +vtkmodules.vtkRenderingContextOpenGL2.vtkOpenGLPropItem +vtkmodules.vtkRenderingCore.VTKIS_ANIM_OFF +vtkmodules.vtkRenderingCore.VTKIS_ANIM_ON +vtkmodules.vtkRenderingCore.VTKIS_CLIP +vtkmodules.vtkRenderingCore.VTKIS_DOLLY +vtkmodules.vtkRenderingCore.VTKIS_ELEVATION +vtkmodules.vtkRenderingCore.VTKIS_ENV_ROTATE +vtkmodules.vtkRenderingCore.VTKIS_EXIT +vtkmodules.vtkRenderingCore.VTKIS_FORWARDFLY +vtkmodules.vtkRenderingCore.VTKIS_GESTURE +vtkmodules.vtkRenderingCore.VTKIS_GROUNDMOVEMENT +vtkmodules.vtkRenderingCore.VTKIS_LOAD_CAMERA_POSE +vtkmodules.vtkRenderingCore.VTKIS_MENU +vtkmodules.vtkRenderingCore.VTKIS_NONE +vtkmodules.vtkRenderingCore.VTKIS_PAN +vtkmodules.vtkRenderingCore.VTKIS_PICK +vtkmodules.vtkRenderingCore.VTKIS_POSITION_PROP +vtkmodules.vtkRenderingCore.VTKIS_REVERSEFLY +vtkmodules.vtkRenderingCore.VTKIS_ROTATE +vtkmodules.vtkRenderingCore.VTKIS_SPIN +vtkmodules.vtkRenderingCore.VTKIS_START +vtkmodules.vtkRenderingCore.VTKIS_TIMER +vtkmodules.vtkRenderingCore.VTKIS_TOGGLE_DRAW_CONTROLS +vtkmodules.vtkRenderingCore.VTKIS_TWO_POINTER +vtkmodules.vtkRenderingCore.VTKIS_USCALE +vtkmodules.vtkRenderingCore.VTKIS_ZOOM +vtkmodules.vtkRenderingCore.VTKI_MAX_POINTERS +vtkmodules.vtkRenderingCore.VTKI_TIMER_FIRST +vtkmodules.vtkRenderingCore.VTKI_TIMER_UPDATE +vtkmodules.vtkRenderingCore.VTK_BACKGROUND_LOCATION +vtkmodules.vtkRenderingCore.VTK_CTF_DIVERGING +vtkmodules.vtkRenderingCore.VTK_CTF_HSV +vtkmodules.vtkRenderingCore.VTK_CTF_LAB +vtkmodules.vtkRenderingCore.VTK_CTF_LAB_CIEDE2000 +vtkmodules.vtkRenderingCore.VTK_CTF_LINEAR +vtkmodules.vtkRenderingCore.VTK_CTF_LOG10 +vtkmodules.vtkRenderingCore.VTK_CTF_RGB +vtkmodules.vtkRenderingCore.VTK_CTF_STEP +vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_BACK_TO_FRONT +vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_FRONT_TO_BACK +vtkmodules.vtkRenderingCore.VTK_CULLER_SORT_NONE +vtkmodules.vtkRenderingCore.VTK_CURSOR_ARROW +vtkmodules.vtkRenderingCore.VTK_CURSOR_CROSSHAIR +vtkmodules.vtkRenderingCore.VTK_CURSOR_CUSTOM +vtkmodules.vtkRenderingCore.VTK_CURSOR_DEFAULT +vtkmodules.vtkRenderingCore.VTK_CURSOR_HAND +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZEALL +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENE +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENS +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZENW +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZESE +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZESW +vtkmodules.vtkRenderingCore.VTK_CURSOR_SIZEWE +vtkmodules.vtkRenderingCore.VTK_DISPLAY +vtkmodules.vtkRenderingCore.VTK_FLAT +vtkmodules.vtkRenderingCore.VTK_FOREGROUND_LOCATION +vtkmodules.vtkRenderingCore.VTK_GET_ARRAY_BY_ID +vtkmodules.vtkRenderingCore.VTK_GET_ARRAY_BY_NAME +vtkmodules.vtkRenderingCore.VTK_GOURAUD +vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_CAMERA_LIGHT +vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_HEADLIGHT +vtkmodules.vtkRenderingCore.VTK_LIGHT_TYPE_SCENE_LIGHT +vtkmodules.vtkRenderingCore.VTK_MARKER_CIRCLE +vtkmodules.vtkRenderingCore.VTK_MARKER_CROSS +vtkmodules.vtkRenderingCore.VTK_MARKER_DIAMOND +vtkmodules.vtkRenderingCore.VTK_MARKER_NONE +vtkmodules.vtkRenderingCore.VTK_MARKER_PLUS +vtkmodules.vtkRenderingCore.VTK_MARKER_SQUARE +vtkmodules.vtkRenderingCore.VTK_MARKER_UNKNOWN +vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_AMBIENT +vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE +vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_DEFAULT +vtkmodules.vtkRenderingCore.VTK_MATERIALMODE_DIFFUSE +vtkmodules.vtkRenderingCore.VTK_NORMALIZED_DISPLAY +vtkmodules.vtkRenderingCore.VTK_NORMALIZED_VIEWPORT +vtkmodules.vtkRenderingCore.VTK_PBR +vtkmodules.vtkRenderingCore.VTK_PHONG +vtkmodules.vtkRenderingCore.VTK_POINTS +vtkmodules.vtkRenderingCore.VTK_POSE +vtkmodules.vtkRenderingCore.VTK_RESOLVE_OFF +vtkmodules.vtkRenderingCore.VTK_RESOLVE_POLYGON_OFFSET +vtkmodules.vtkRenderingCore.VTK_RESOLVE_SHIFT_ZBUFFER +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_DEFAULT +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_CELL_DATA +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_CELL_FIELD_DATA +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_FIELD_DATA +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_POINT_DATA +vtkmodules.vtkRenderingCore.VTK_SCALAR_MODE_USE_POINT_FIELD_DATA +vtkmodules.vtkRenderingCore.VTK_STEREO_ANAGLYPH +vtkmodules.vtkRenderingCore.VTK_STEREO_CHECKERBOARD +vtkmodules.vtkRenderingCore.VTK_STEREO_CRYSTAL_EYES +vtkmodules.vtkRenderingCore.VTK_STEREO_DRESDEN +vtkmodules.vtkRenderingCore.VTK_STEREO_EMULATE +vtkmodules.vtkRenderingCore.VTK_STEREO_FAKE +vtkmodules.vtkRenderingCore.VTK_STEREO_INTERLACED +vtkmodules.vtkRenderingCore.VTK_STEREO_LEFT +vtkmodules.vtkRenderingCore.VTK_STEREO_RED_BLUE +vtkmodules.vtkRenderingCore.VTK_STEREO_RIGHT +vtkmodules.vtkRenderingCore.VTK_STEREO_SPLITVIEWPORT_HORIZONTAL +vtkmodules.vtkRenderingCore.VTK_SURFACE +vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_16BIT +vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_32BIT +vtkmodules.vtkRenderingCore.VTK_TEXTURE_QUALITY_DEFAULT +vtkmodules.vtkRenderingCore.VTK_USERDEFINED +vtkmodules.vtkRenderingCore.VTK_VIEW +vtkmodules.vtkRenderingCore.VTK_VIEWPORT +vtkmodules.vtkRenderingCore.VTK_WIREFRAME +vtkmodules.vtkRenderingCore.VTK_WORLD +vtkmodules.vtkRenderingCore.VTK_ZBUFFER +vtkmodules.vtkRenderingCore.vtkAbstractHyperTreeGridMapper +vtkmodules.vtkRenderingCore.vtkAbstractInteractionDevice +vtkmodules.vtkRenderingCore.vtkAbstractMapper +vtkmodules.vtkRenderingCore.vtkAbstractMapper3D +vtkmodules.vtkRenderingCore.vtkAbstractPicker +vtkmodules.vtkRenderingCore.vtkAbstractPropPicker +vtkmodules.vtkRenderingCore.vtkAbstractRenderDevice +vtkmodules.vtkRenderingCore.vtkAbstractVolumeMapper +vtkmodules.vtkRenderingCore.vtkActor +vtkmodules.vtkRenderingCore.vtkActor2D +vtkmodules.vtkRenderingCore.vtkActor2DCollection +vtkmodules.vtkRenderingCore.vtkActorCollection +vtkmodules.vtkRenderingCore.vtkAreaPicker +vtkmodules.vtkRenderingCore.vtkAssembly +vtkmodules.vtkRenderingCore.vtkAssemblyNode +vtkmodules.vtkRenderingCore.vtkAssemblyPath +vtkmodules.vtkRenderingCore.vtkAssemblyPaths +vtkmodules.vtkRenderingCore.vtkAvatar +vtkmodules.vtkRenderingCore.vtkBackgroundColorMonitor +vtkmodules.vtkRenderingCore.vtkBillboardTextActor3D +vtkmodules.vtkRenderingCore.vtkCamera +vtkmodules.vtkRenderingCore.vtkCameraActor +vtkmodules.vtkRenderingCore.vtkCameraInterpolator +vtkmodules.vtkRenderingCore.vtkCellCenterDepthSort +vtkmodules.vtkRenderingCore.vtkCellPicker +vtkmodules.vtkRenderingCore.vtkColorTransferFunction +vtkmodules.vtkRenderingCore.vtkCompositeDataDisplayAttributes +vtkmodules.vtkRenderingCore.vtkCompositeDataDisplayAttributesLegacy +vtkmodules.vtkRenderingCore.vtkCompositePolyDataMapper +vtkmodules.vtkRenderingCore.vtkCoordinate +vtkmodules.vtkRenderingCore.vtkCuller +vtkmodules.vtkRenderingCore.vtkCullerCollection +vtkmodules.vtkRenderingCore.vtkDataSetMapper +vtkmodules.vtkRenderingCore.vtkDiscretizableColorTransferFunction +vtkmodules.vtkRenderingCore.vtkDistanceToCamera +vtkmodules.vtkRenderingCore.vtkFXAAOptions +vtkmodules.vtkRenderingCore.vtkFlagpoleLabel +vtkmodules.vtkRenderingCore.vtkFollower +vtkmodules.vtkRenderingCore.vtkFrameBufferObjectBase +vtkmodules.vtkRenderingCore.vtkFrustumCoverageCuller +vtkmodules.vtkRenderingCore.vtkGPUInfo +vtkmodules.vtkRenderingCore.vtkGPUInfoList +vtkmodules.vtkRenderingCore.vtkGPUInfoListArray +vtkmodules.vtkRenderingCore.vtkGenericVertexAttributeMapping +vtkmodules.vtkRenderingCore.vtkGlyph3DMapper +vtkmodules.vtkRenderingCore.vtkGraphMapper +vtkmodules.vtkRenderingCore.vtkGraphToGlyphs +vtkmodules.vtkRenderingCore.vtkGraphicsFactory +vtkmodules.vtkRenderingCore.vtkHardwarePicker +vtkmodules.vtkRenderingCore.vtkHardwareSelector +vtkmodules.vtkRenderingCore.vtkHardwareWindow +vtkmodules.vtkRenderingCore.vtkHierarchicalPolyDataMapper +vtkmodules.vtkRenderingCore.vtkImageActor +vtkmodules.vtkRenderingCore.vtkImageMapper +vtkmodules.vtkRenderingCore.vtkImageMapper3D +vtkmodules.vtkRenderingCore.vtkImageProperty +vtkmodules.vtkRenderingCore.vtkImageSlice +vtkmodules.vtkRenderingCore.vtkImageSliceMapper +vtkmodules.vtkRenderingCore.vtkInteractorEventRecorder +vtkmodules.vtkRenderingCore.vtkInteractorObserver +vtkmodules.vtkRenderingCore.vtkInteractorStyle +vtkmodules.vtkRenderingCore.vtkInteractorStyle3D +vtkmodules.vtkRenderingCore.vtkInteractorStyleSwitchBase +vtkmodules.vtkRenderingCore.vtkLODProp3D +vtkmodules.vtkRenderingCore.vtkLODProp3DEntry_t +vtkmodules.vtkRenderingCore.vtkLabeledContourMapper +vtkmodules.vtkRenderingCore.vtkLight +vtkmodules.vtkRenderingCore.vtkLightActor +vtkmodules.vtkRenderingCore.vtkLightCollection +vtkmodules.vtkRenderingCore.vtkLightKit +vtkmodules.vtkRenderingCore.vtkLogLookupTable +vtkmodules.vtkRenderingCore.vtkLookupTableWithEnabling +vtkmodules.vtkRenderingCore.vtkMapArrayValues +vtkmodules.vtkRenderingCore.vtkMapper +vtkmodules.vtkRenderingCore.vtkMapper2D +vtkmodules.vtkRenderingCore.vtkMapperCollection +vtkmodules.vtkRenderingCore.vtkMaxPythagoreanQuadrupleId +vtkmodules.vtkRenderingCore.vtkObserverMediator +vtkmodules.vtkRenderingCore.vtkPicker +vtkmodules.vtkRenderingCore.vtkPickingManager +vtkmodules.vtkRenderingCore.vtkPointGaussianMapper +vtkmodules.vtkRenderingCore.vtkPointPicker +vtkmodules.vtkRenderingCore.vtkPolyDataMapper +vtkmodules.vtkRenderingCore.vtkPolyDataMapper2D +vtkmodules.vtkRenderingCore.vtkProp +vtkmodules.vtkRenderingCore.vtkProp3D +vtkmodules.vtkRenderingCore.vtkProp3DCollection +vtkmodules.vtkRenderingCore.vtkProp3DFollower +vtkmodules.vtkRenderingCore.vtkPropAssembly +vtkmodules.vtkRenderingCore.vtkPropCollection +vtkmodules.vtkRenderingCore.vtkPropPicker +vtkmodules.vtkRenderingCore.vtkProperty +vtkmodules.vtkRenderingCore.vtkProperty2D +vtkmodules.vtkRenderingCore.vtkRayCastRayInfo_t +vtkmodules.vtkRenderingCore.vtkRenderPass +vtkmodules.vtkRenderingCore.vtkRenderState +vtkmodules.vtkRenderingCore.vtkRenderTimerLog +vtkmodules.vtkRenderingCore.vtkRenderWidget +vtkmodules.vtkRenderingCore.vtkRenderWindow +vtkmodules.vtkRenderingCore.vtkRenderWindowCollection +vtkmodules.vtkRenderingCore.vtkRenderWindowInteractor +vtkmodules.vtkRenderingCore.vtkRenderWindowInteractor3D +vtkmodules.vtkRenderingCore.vtkRenderedAreaPicker +vtkmodules.vtkRenderingCore.vtkRenderer +vtkmodules.vtkRenderingCore.vtkRendererCollection +vtkmodules.vtkRenderingCore.vtkRendererDelegate +vtkmodules.vtkRenderingCore.vtkRendererSource +vtkmodules.vtkRenderingCore.vtkResizingWindowToImageFilter +vtkmodules.vtkRenderingCore.vtkScenePicker +vtkmodules.vtkRenderingCore.vtkSelectVisiblePoints +vtkmodules.vtkRenderingCore.vtkShaderProperty +vtkmodules.vtkRenderingCore.vtkSkybox +vtkmodules.vtkRenderingCore.vtkStateStorage +vtkmodules.vtkRenderingCore.vtkStereoCompositor +vtkmodules.vtkRenderingCore.vtkStringToImage +vtkmodules.vtkRenderingCore.vtkTDxInteractorStyle +vtkmodules.vtkRenderingCore.vtkTDxInteractorStyleCamera +vtkmodules.vtkRenderingCore.vtkTDxInteractorStyleSettings +vtkmodules.vtkRenderingCore.vtkTDxMotionEventInfo +vtkmodules.vtkRenderingCore.vtkTextActor +vtkmodules.vtkRenderingCore.vtkTextActor3D +vtkmodules.vtkRenderingCore.vtkTextMapper +vtkmodules.vtkRenderingCore.vtkTextProperty +vtkmodules.vtkRenderingCore.vtkTextPropertyCollection +vtkmodules.vtkRenderingCore.vtkTextRenderer +vtkmodules.vtkRenderingCore.vtkTextRendererCleanup +vtkmodules.vtkRenderingCore.vtkTexture +vtkmodules.vtkRenderingCore.vtkTexturedActor2D +vtkmodules.vtkRenderingCore.vtkTransformCoordinateSystems +vtkmodules.vtkRenderingCore.vtkTransformInterpolator +vtkmodules.vtkRenderingCore.vtkTupleInterpolator +vtkmodules.vtkRenderingCore.vtkUniforms +vtkmodules.vtkRenderingCore.vtkViewDependentErrorMetric +vtkmodules.vtkRenderingCore.vtkViewport +vtkmodules.vtkRenderingCore.vtkVisibilitySort +vtkmodules.vtkRenderingCore.vtkVolume +vtkmodules.vtkRenderingCore.vtkVolumeCollection +vtkmodules.vtkRenderingCore.vtkVolumeProperty +vtkmodules.vtkRenderingCore.vtkWindowLevelLookupTable +vtkmodules.vtkRenderingCore.vtkWindowToImageFilter +vtkmodules.vtkRenderingCore.vtkWorldPointPicker +vtkmodules.vtkRenderingExternal.ExternalVTKWidget +vtkmodules.vtkRenderingExternal.vtkExternalLight +vtkmodules.vtkRenderingExternal.vtkExternalOpenGLCamera +vtkmodules.vtkRenderingExternal.vtkExternalOpenGLRenderWindow +vtkmodules.vtkRenderingExternal.vtkExternalOpenGLRenderer +vtkmodules.vtkRenderingFreeType.vtkFreeTypeStringToImage +vtkmodules.vtkRenderingFreeType.vtkFreeTypeTools +vtkmodules.vtkRenderingFreeType.vtkFreeTypeToolsCleanup +vtkmodules.vtkRenderingFreeType.vtkMathTextFreeTypeTextRenderer +vtkmodules.vtkRenderingFreeType.vtkMathTextUtilities +vtkmodules.vtkRenderingFreeType.vtkMathTextUtilitiesCleanup +vtkmodules.vtkRenderingFreeType.vtkScaledTextActor +vtkmodules.vtkRenderingFreeType.vtkTextRendererStringToImage +vtkmodules.vtkRenderingFreeType.vtkVectorText +vtkmodules.vtkRenderingGL2PSOpenGL2.vtkOpenGLGL2PSHelperImpl +vtkmodules.vtkRenderingHyperTreeGrid.vtkHyperTreeGridMapper +vtkmodules.vtkRenderingImage.vtkDepthImageToPointCloud +vtkmodules.vtkRenderingImage.vtkImageResliceMapper +vtkmodules.vtkRenderingImage.vtkImageSliceCollection +vtkmodules.vtkRenderingImage.vtkImageStack +vtkmodules.vtkRenderingLICOpenGL2.vtkCompositeSurfaceLICMapper +vtkmodules.vtkRenderingLICOpenGL2.vtkImageDataLIC2D +vtkmodules.vtkRenderingLICOpenGL2.vtkLineIntegralConvolution2D +vtkmodules.vtkRenderingLICOpenGL2.vtkPainterCommunicator +vtkmodules.vtkRenderingLICOpenGL2.vtkStructuredGridLIC2D +vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICComposite +vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICInterface +vtkmodules.vtkRenderingLICOpenGL2.vtkSurfaceLICMapper +vtkmodules.vtkRenderingLICOpenGL2.vtkTextureIO +vtkmodules.vtkRenderingLOD.vtkLODActor +vtkmodules.vtkRenderingLOD.vtkQuadricLODActor +vtkmodules.vtkRenderingLabel.VTK_LABEL_FIELD_DATA +vtkmodules.vtkRenderingLabel.VTK_LABEL_IDS +vtkmodules.vtkRenderingLabel.VTK_LABEL_NORMALS +vtkmodules.vtkRenderingLabel.VTK_LABEL_SCALARS +vtkmodules.vtkRenderingLabel.VTK_LABEL_TCOORDS +vtkmodules.vtkRenderingLabel.VTK_LABEL_TENSORS +vtkmodules.vtkRenderingLabel.VTK_LABEL_VECTORS +vtkmodules.vtkRenderingLabel.vtkDynamic2DLabelMapper +vtkmodules.vtkRenderingLabel.vtkFreeTypeLabelRenderStrategy +vtkmodules.vtkRenderingLabel.vtkLabelHierarchy +vtkmodules.vtkRenderingLabel.vtkLabelHierarchyAlgorithm +vtkmodules.vtkRenderingLabel.vtkLabelHierarchyCompositeIterator +vtkmodules.vtkRenderingLabel.vtkLabelHierarchyIterator +vtkmodules.vtkRenderingLabel.vtkLabelPlacementMapper +vtkmodules.vtkRenderingLabel.vtkLabelPlacer +vtkmodules.vtkRenderingLabel.vtkLabelRenderStrategy +vtkmodules.vtkRenderingLabel.vtkLabelSizeCalculator +vtkmodules.vtkRenderingLabel.vtkLabeledDataMapper +vtkmodules.vtkRenderingLabel.vtkLabeledTreeMapDataMapper +vtkmodules.vtkRenderingLabel.vtkPointSetToLabelHierarchy +vtkmodules.vtkRenderingMatplotlib.vtkMatplotlibMathTextUtilities +vtkmodules.vtkRenderingOpenGL2.vtkCameraPass +vtkmodules.vtkRenderingOpenGL2.vtkClearRGBPass +vtkmodules.vtkRenderingOpenGL2.vtkClearZPass +vtkmodules.vtkRenderingOpenGL2.vtkCocoaRenderWindow +vtkmodules.vtkRenderingOpenGL2.vtkCompositePolyDataMapper2 +vtkmodules.vtkRenderingOpenGL2.vtkDataTransferHelper +vtkmodules.vtkRenderingOpenGL2.vtkDefaultPass +vtkmodules.vtkRenderingOpenGL2.vtkDepthImageProcessingPass +vtkmodules.vtkRenderingOpenGL2.vtkDepthOfFieldPass +vtkmodules.vtkRenderingOpenGL2.vtkDepthPeelingPass +vtkmodules.vtkRenderingOpenGL2.vtkDualDepthPeelingPass +vtkmodules.vtkRenderingOpenGL2.vtkDummyGPUInfoList +vtkmodules.vtkRenderingOpenGL2.vtkEDLShading +vtkmodules.vtkRenderingOpenGL2.vtkEquirectangularToCubeMapTexture +vtkmodules.vtkRenderingOpenGL2.vtkFourByteUnion +vtkmodules.vtkRenderingOpenGL2.vtkFramebufferPass +vtkmodules.vtkRenderingOpenGL2.vtkGaussianBlurPass +vtkmodules.vtkRenderingOpenGL2.vtkGenericOpenGLRenderWindow +vtkmodules.vtkRenderingOpenGL2.vtkHiddenLineRemovalPass +vtkmodules.vtkRenderingOpenGL2.vtkImageProcessingPass +vtkmodules.vtkRenderingOpenGL2.vtkLightingMapPass +vtkmodules.vtkRenderingOpenGL2.vtkLightsPass +vtkmodules.vtkRenderingOpenGL2.vtkOpaquePass +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLActor +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLBillboardTextActor3D +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLBufferObject +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCamera +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLCellToVTKCellMap +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFXAAFilter +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFXAAPass +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFluidMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLFramebufferObject +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGL2PSHelper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGlyph3DHelper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLGlyph3DMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHardwareSelector +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHelper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLHyperTreeGridMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageAlgorithmCallback +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageAlgorithmHelper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLImageSliceMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLIndexBufferObject +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLInstanceCulling +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLLabeledContourMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLLight +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPointGaussianMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPolyDataMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLPolyDataMapper2D +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLProperty +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLQuadHelper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderPass +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderTimer +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderTimerLog +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderUtilities +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderWindow +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLRenderer +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLShaderCache +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLShaderProperty +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLSkybox +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLSphereMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLState +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLStickMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextActor +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextActor3D +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTextMapper +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLTexture +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLUniforms +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexArrayObject +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObject +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObjectCache +vtkmodules.vtkRenderingOpenGL2.vtkOpenGLVertexBufferObjectGroup +vtkmodules.vtkRenderingOpenGL2.vtkOrderIndependentTranslucentPass +vtkmodules.vtkRenderingOpenGL2.vtkOutlineGlowPass +vtkmodules.vtkRenderingOpenGL2.vtkOverlayPass +vtkmodules.vtkRenderingOpenGL2.vtkPBRIrradianceTexture +vtkmodules.vtkRenderingOpenGL2.vtkPBRLUTTexture +vtkmodules.vtkRenderingOpenGL2.vtkPBRPrefilterTexture +vtkmodules.vtkRenderingOpenGL2.vtkPanoramicProjectionPass +vtkmodules.vtkRenderingOpenGL2.vtkPixelBufferObject +vtkmodules.vtkRenderingOpenGL2.vtkPointFillPass +vtkmodules.vtkRenderingOpenGL2.vtkRenderPassCollection +vtkmodules.vtkRenderingOpenGL2.vtkRenderStepsPass +vtkmodules.vtkRenderingOpenGL2.vtkRenderbuffer +vtkmodules.vtkRenderingOpenGL2.vtkSSAAPass +vtkmodules.vtkRenderingOpenGL2.vtkSSAOPass +vtkmodules.vtkRenderingOpenGL2.vtkSequencePass +vtkmodules.vtkRenderingOpenGL2.vtkShader +vtkmodules.vtkRenderingOpenGL2.vtkShaderProgram +vtkmodules.vtkRenderingOpenGL2.vtkShadowMapBakerPass +vtkmodules.vtkRenderingOpenGL2.vtkShadowMapPass +vtkmodules.vtkRenderingOpenGL2.vtkSimpleMotionBlurPass +vtkmodules.vtkRenderingOpenGL2.vtkSobelGradientMagnitudePass +vtkmodules.vtkRenderingOpenGL2.vtkTextureObject +vtkmodules.vtkRenderingOpenGL2.vtkTextureUnitManager +vtkmodules.vtkRenderingOpenGL2.vtkToneMappingPass +vtkmodules.vtkRenderingOpenGL2.vtkTransformFeedback +vtkmodules.vtkRenderingOpenGL2.vtkTranslucentPass +vtkmodules.vtkRenderingOpenGL2.vtkValuePass +vtkmodules.vtkRenderingOpenGL2.vtkVolumetricPass +vtkmodules.vtkRenderingSceneGraph.vtkActorNode +vtkmodules.vtkRenderingSceneGraph.vtkCameraNode +vtkmodules.vtkRenderingSceneGraph.vtkLightNode +vtkmodules.vtkRenderingSceneGraph.vtkMapperNode +vtkmodules.vtkRenderingSceneGraph.vtkPolyDataMapperNode +vtkmodules.vtkRenderingSceneGraph.vtkRendererNode +vtkmodules.vtkRenderingSceneGraph.vtkViewNode +vtkmodules.vtkRenderingSceneGraph.vtkViewNodeFactory +vtkmodules.vtkRenderingSceneGraph.vtkVolumeMapperNode +vtkmodules.vtkRenderingSceneGraph.vtkVolumeNode +vtkmodules.vtkRenderingSceneGraph.vtkWindowNode +vtkmodules.vtkRenderingUI.vtkCocoaRenderWindowInteractor +vtkmodules.vtkRenderingUI.vtkGenericRenderWindowInteractor +vtkmodules.vtkRenderingVR.vtkOpenGLAvatar +vtkmodules.vtkRenderingVR.vtkVRCamera +vtkmodules.vtkRenderingVR.vtkVRControlsHelper +vtkmodules.vtkRenderingVR.vtkVRFollower +vtkmodules.vtkRenderingVR.vtkVRHMDCamera +vtkmodules.vtkRenderingVR.vtkVRHardwarePicker +vtkmodules.vtkRenderingVR.vtkVRInteractorStyle +vtkmodules.vtkRenderingVR.vtkVRMenuRepresentation +vtkmodules.vtkRenderingVR.vtkVRMenuWidget +vtkmodules.vtkRenderingVR.vtkVRModel +vtkmodules.vtkRenderingVR.vtkVRPanelRepresentation +vtkmodules.vtkRenderingVR.vtkVRPanelWidget +vtkmodules.vtkRenderingVR.vtkVRRay +vtkmodules.vtkRenderingVR.vtkVRRenderWindow +vtkmodules.vtkRenderingVR.vtkVRRenderWindowInteractor +vtkmodules.vtkRenderingVR.vtkVRRenderer +vtkmodules.vtkRenderingVolume.VTKKW_FPMM_SHIFT +vtkmodules.vtkRenderingVolume.VTKKW_FP_MASK +vtkmodules.vtkRenderingVolume.VTKKW_FP_SCALE +vtkmodules.vtkRenderingVolume.VTKKW_FP_SHIFT +vtkmodules.vtkRenderingVolume.VTK_BUNYKRCF_ARRAY_SIZE +vtkmodules.vtkRenderingVolume.VTK_BUNYKRCF_MAX_ARRAYS +vtkmodules.vtkRenderingVolume.VTK_CROP_CROSS +vtkmodules.vtkRenderingVolume.VTK_CROP_FENCE +vtkmodules.vtkRenderingVolume.VTK_CROP_INVERTED_CROSS +vtkmodules.vtkRenderingVolume.VTK_CROP_INVERTED_FENCE +vtkmodules.vtkRenderingVolume.VTK_CROP_SUBVOLUME +vtkmodules.vtkRenderingVolume.VTK_MAX_SHADING_TABLES +vtkmodules.vtkRenderingVolume.vtkDirectionEncoder +vtkmodules.vtkRenderingVolume.vtkEncodedGradientEstimator +vtkmodules.vtkRenderingVolume.vtkEncodedGradientShader +vtkmodules.vtkRenderingVolume.vtkFiniteDifferenceGradientEstimator +vtkmodules.vtkRenderingVolume.vtkFixedPointRayCastImage +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeGOHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeGOShadeHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastCompositeShadeHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastMIPHelper +vtkmodules.vtkRenderingVolume.vtkFixedPointVolumeRayCastMapper +vtkmodules.vtkRenderingVolume.vtkGPUVolumeRayCastMapper +vtkmodules.vtkRenderingVolume.vtkMultiVolume +vtkmodules.vtkRenderingVolume.vtkOSPRayVolumeInterface +vtkmodules.vtkRenderingVolume.vtkProjectedTetrahedraMapper +vtkmodules.vtkRenderingVolume.vtkRayCastImageDisplayHelper +vtkmodules.vtkRenderingVolume.vtkRecursiveSphereDirectionEncoder +vtkmodules.vtkRenderingVolume.vtkSphericalDirectionEncoder +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridBunykRayCastFunction +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridHomogeneousRayIntegrator +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridLinearRayIntegrator +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridPartialPreIntegration +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridPreIntegration +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeMapper +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastFunction +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastIterator +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayCastMapper +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeRayIntegrator +vtkmodules.vtkRenderingVolume.vtkUnstructuredGridVolumeZSweepMapper +vtkmodules.vtkRenderingVolume.vtkVolumeMapper +vtkmodules.vtkRenderingVolume.vtkVolumeOutlineSource +vtkmodules.vtkRenderingVolume.vtkVolumePicker +vtkmodules.vtkRenderingVolume.vtkVolumeRayCastSpaceLeapingImageFilter +vtkmodules.vtkRenderingVolumeAMR.vtkAMRVolumeMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkMultiBlockUnstructuredGridVolumeMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkMultiBlockVolumeMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLGPUVolumeRayCastMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLProjectedTetrahedraMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkOpenGLRayCastImageDisplayHelper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkSmartVolumeMapper +vtkmodules.vtkRenderingVolumeOpenGL2.vtkVolumeTexture +vtkmodules.vtkRenderingVtkJS.vtkVtkJSSceneGraphSerializer +vtkmodules.vtkRenderingVtkJS.vtkVtkJSViewNodeFactory +vtkmodules.vtkTestingRendering.VTK_SKIP_RETURN_CODE +vtkmodules.vtkTestingRendering.vtkTesting +vtkmodules.vtkTestingRendering.vtkTestingInteractor +vtkmodules.vtkTestingRendering.vtkTestingObjectFactory +vtkmodules.vtkViewsContext2D.vtkContextInteractorStyle +vtkmodules.vtkViewsContext2D.vtkContextView +vtkmodules.vtkViewsCore.vtkConvertSelectionDomain +vtkmodules.vtkViewsCore.vtkDataRepresentation +vtkmodules.vtkViewsCore.vtkEmptyRepresentation +vtkmodules.vtkViewsCore.vtkRenderViewBase +vtkmodules.vtkViewsCore.vtkView +vtkmodules.vtkViewsCore.vtkViewTheme +vtkmodules.vtkViewsInfovis.vtkApplyColors +vtkmodules.vtkViewsInfovis.vtkApplyIcons +vtkmodules.vtkViewsInfovis.vtkDendrogramItem +vtkmodules.vtkViewsInfovis.vtkGraphItem +vtkmodules.vtkViewsInfovis.vtkGraphLayoutView +vtkmodules.vtkViewsInfovis.vtkHeatmapItem +vtkmodules.vtkViewsInfovis.vtkHierarchicalGraphPipeline +vtkmodules.vtkViewsInfovis.vtkHierarchicalGraphView +vtkmodules.vtkViewsInfovis.vtkIcicleView +vtkmodules.vtkViewsInfovis.vtkInteractorStyleAreaSelectHover +vtkmodules.vtkViewsInfovis.vtkInteractorStyleTreeMapHover +vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesHistogramRepresentation +vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesRepresentation +vtkmodules.vtkViewsInfovis.vtkParallelCoordinatesView +vtkmodules.vtkViewsInfovis.vtkRenderView +vtkmodules.vtkViewsInfovis.vtkRenderedGraphRepresentation +vtkmodules.vtkViewsInfovis.vtkRenderedHierarchyRepresentation +vtkmodules.vtkViewsInfovis.vtkRenderedRepresentation +vtkmodules.vtkViewsInfovis.vtkRenderedSurfaceRepresentation +vtkmodules.vtkViewsInfovis.vtkRenderedTreeAreaRepresentation +vtkmodules.vtkViewsInfovis.vtkSCurveSpline +vtkmodules.vtkViewsInfovis.vtkTanglegramItem +vtkmodules.vtkViewsInfovis.vtkTreeAreaView +vtkmodules.vtkViewsInfovis.vtkTreeHeatmapItem +vtkmodules.vtkViewsInfovis.vtkTreeMapView +vtkmodules.vtkViewsInfovis.vtkTreeRingView +vtkmodules.vtkViewsInfovis.vtkViewUpdater +vtkmodules.vtkWebCore.vtkDataEncoder +vtkmodules.vtkWebCore.vtkObjectIdMap +vtkmodules.vtkWebCore.vtkWebApplication +vtkmodules.vtkWebCore.vtkWebInteractionEvent +vtkmodules.vtkWebCore.vtkWebUtilities +vtkmodules.vtkWebGLExporter.VTK_ONLYCAMERA +vtkmodules.vtkWebGLExporter.VTK_ONLYWIDGET +vtkmodules.vtkWebGLExporter.VTK_PARSEALL +vtkmodules.vtkWebGLExporter.WebGLObjectTypes +vtkmodules.vtkWebGLExporter.vtkPVWebGLExporter +vtkmodules.vtkWebGLExporter.vtkWebGLDataSet +vtkmodules.vtkWebGLExporter.vtkWebGLExporter +vtkmodules.vtkWebGLExporter.vtkWebGLObject +vtkmodules.vtkWebGLExporter.vtkWebGLPolyData +vtkmodules.vtkWebGLExporter.vtkWebGLWidget +vtkmodules.vtkWebGLExporter.wLINES +vtkmodules.vtkWebGLExporter.wPOINTS +vtkmodules.vtkWebGLExporter.wTRIANGLES +vtkmodules.web.arrayTypesMapping +vtkmodules.web.base64 +vtkmodules.web.base64Encode +vtkmodules.web.getJSArrayType +vtkmodules.web.getReferenceId +vtkmodules.web.hashDataArray +vtkmodules.web.hashlib +vtkmodules.web.iteritems +vtkmodules.web.javascriptMapping From c28fcd7d540710eeb7eaf693f8ccd0f8ec7cbf6a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 12:52:48 +0200 Subject: [PATCH 155/251] fix lineartranform import --- vedo/vtkclasses.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index bb6109c4..4bd17281 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -224,11 +224,13 @@ def get(module_name="", cls_name=""): from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, + vtkLinearTransform, vtkThinPlateSplineTransform, vtkTransform, ) location["vtkHomogeneousTransform"] = "vtkCommonTransforms" location["vtkLandmarkTransform"] = "vtkCommonTransforms" +location["vtkLinearTransform"] = "vtkCommonTransforms" location["vtkThinPlateSplineTransform"] = "vtkCommonTransforms" location["vtkTransform"] = "vtkCommonTransforms" From 09ce154ce9890c34f40956ed7895536992060044 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 13:06:33 +0200 Subject: [PATCH 156/251] add dump_hierarchy_to_file() --- vedo/vtkclasses.py | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 4bd17281..4ee976dc 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -3,7 +3,7 @@ """ Subset of vtk classes to be imported directly """ -import importlib +from importlib import import_module location = dict() @@ -11,18 +11,67 @@ def get(module_name="", cls_name=""): + """ + Get a vtk class from its name. + + Example: + ```python + from vedo import vtkclasses as vtk + print(vtk.vtkActor) + print(vtk.location["vtkActor"]) + print(vtk.get("vtkActor")) + print(vtk.get("vtkRenderingCore","vtkActor")) + ``` + """ if not cls_name: cls_name = module_name module_name = location[cls_name] module_name = "vtkmodules." + module_name if module_name not in module_cache: - module = importlib.import_module(module_name) + module = import_module(module_name) module_cache[module_name] = module if cls_name: return getattr(module_cache[module_name], cls_name) else: return module_cache[module_name] +def dump_hierarchy_to_file(): + """ + Print all available vtk classes. + Dumps the list to a file named `vtkmodules__hierarchy.txt` + """ + try: + import pkgutil + from vtkmodules.all import vtkVersion + ver = vtkVersion() + except AttributeError: + print("Unable to detect VTK version.") + return + major = ver.GetVTKMajorVersion() + minor = ver.GetVTKMinorVersion() + patch = ver.GetVTKBuildVersion() + vtkvers = f"{major}.{minor}.{patch}" + + fname = f"vtkmodules_{vtkvers}_hierarchy.txt" + with open(fname,"w") as w: + for pkg in pkgutil.walk_packages( + vtkmodules.__path__, vtkmodules.__name__ + "."): + try: + module = import_module(pkg.name) + except ImportError: + continue + for subitem in sorted(dir(module)): + if "all" in module.__name__: + continue + if ".web." in module.__name__: + continue + if ".test." in module.__name__: + continue + if ".tk." in module.__name__: + continue + if "__" in module.__name__ or "__" in subitem: + continue + w.write(f"{module.__name__}.{subitem}\n") #################################################### From 3e19842c45846884d75fdb5294ec40c24cf3f3b5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 16:15:48 +0200 Subject: [PATCH 157/251] lazy load of many classes --- vedo/addons.py | 4 +- vedo/applications.py | 7 +- vedo/colors.py | 17 ++-- vedo/core.py | 9 +- vedo/file_io.py | 126 +++++++++++------------ vedo/image.py | 12 +-- vedo/interactor_modes.py | 9 +- vedo/mesh.py | 23 ++--- vedo/plotter.py | 55 +++++----- vedo/pyplot.py | 22 ++-- vedo/shapes.py | 70 ++++++------- vedo/tetmesh.py | 9 +- vedo/utils.py | 7 +- vedo/version.py | 2 +- vedo/visual.py | 9 +- vedo/volume.py | 11 +- vedo/vtkclasses.py | 213 ++++++++++++--------------------------- 17 files changed, 243 insertions(+), 362 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 24ac95ff..cfa9a839 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4420,11 +4420,11 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 14: try: - cow = vtk.vtkCameraOrientationWidget() + cow = vtk.get("CameraOrientationWidget")() cow.SetParentRenderer(plt.renderer) cow.On() plt.axes_instances[r] = cow - except AttributeError: + except ImportError: vedo.logger.warning("axes mode 14 is unavailable in this vtk version") else: diff --git a/vedo/applications.py b/vedo/applications.py index 268de44c..e271e28c 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -6,10 +6,7 @@ import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo.colors import color_map, get_color @@ -478,7 +475,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): self.volume.actor = vtk.vtkImageSlice() self.volume.properties = self.volume.actor.GetProperty() - self.volume.mapper = vtk.vtkImageResliceMapper() + self.volume.mapper = vtk.get("ImageResliceMapper")() self.volume.mapper.SliceFacesCameraOn() self.volume.mapper.SliceAtFocalPointOn() self.volume.mapper.SetAutoAdjustImageQuality(False) diff --git a/vedo/colors.py b/vedo/colors.py index 4dd967a6..d96ed276 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -5,12 +5,7 @@ import time import numpy as np - -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk - +import vedo.vtkclasses as vtk import vedo __docformat__ = "google" @@ -801,7 +796,7 @@ def get_color(rgb=None, hsv=None): return tuple(rgbh) else: # vtk name color - namedColors = vtk.vtkNamedColors() + namedColors = vtk.get("NamedColors") rgba = [0, 0, 0, 0] namedColors.GetColor(c, rgba) return (rgba[0] / 255.0, rgba[1] / 255.0, rgba[2] / 255.0) @@ -828,7 +823,7 @@ def get_color_name(c): def hsv2rgb(hsv): """Convert HSV to RGB color.""" - ma = vtk.vtkMath() + ma = vtk.get("Math")() rgb = [0, 0, 0] ma.HSVToRGB(hsv, rgb) return rgb @@ -836,7 +831,7 @@ def hsv2rgb(hsv): def rgb2hsv(rgb): """Convert RGB to HSV color.""" - ma = vtk.vtkMath() + ma = vtk.get("Math")() hsv = [0, 0, 0] ma.RGBToHSV(get_color(rgb), hsv) return hsv @@ -1024,7 +1019,7 @@ def build_lut( ![](https://vedo.embl.es/images/basic/mesh_lut.png) """ - ctf = vtk.vtkColorTransferFunction() + ctf = vtk.get("ColorTransferFunction")() ctf.SetColorSpaceToRGB() ctf.SetScaleToLinear() alpha_x, alpha_vals = [], [] @@ -1039,7 +1034,7 @@ def build_lut( alpha_x.append(scalar) alpha_vals.append(alf) - lut = vtk.vtkLookupTable() + lut = vtk.get("LookupTable")() lut.SetNumberOfTableValues(256) x0, x1 = ctf.GetRange() # range of the introduced values diff --git a/vedo/core.py b/vedo/core.py index cce5d8e1..ac9fc2fe 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import colors @@ -1237,7 +1234,7 @@ def compute_cell_size(self): Array names are: `Area`, `Volume`, `Length`. """ - csf = vtk.vtkCellSizeFilter() + csf = vtk.get("CellSizeFilter")() csf.SetInputData(self.dataset) csf.SetComputeArea(1) csf.SetComputeVolume(1) @@ -1866,7 +1863,7 @@ def clean(self): """ Cleanup unused points and empty cells """ - cl = vtk.vtkStaticCleanUnstructuredGrid() + cl = vtk.get("StaticCleanUnstructuredGrid")() cl.SetInputData(self.dataset) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() diff --git a/vedo/file_io.py b/vedo/file_io.py index 9237de8c..560846ee 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -228,7 +228,7 @@ def load(inputobj, unpack=True, force=False): elif os.path.isdir(fod): ### it's a directory or DICOM flist = os.listdir(fod) if ".dcm" in flist[0]: ### it's DICOM - reader = vtk.vtkDICOMImageReader() + reader = vtk.get("DICOMImageReader")() reader.SetDirectoryName(fod) reader.Update() image = reader.GetOutput() @@ -294,7 +294,7 @@ def _load_file(filename, unpack): elif fl.endswith(".3ds"): # 3ds format actor = load3DS(filename) elif fl.endswith(".wrl"): - importer = vtk.vtkVRMLImporter() + importer = vtk.get("VRMLImporter")() importer.SetFileName(filename) importer.Read() importer.Update() @@ -329,11 +329,11 @@ def _load_file(filename, unpack): or fl.endswith(".gif") ): if ".png" in fl: - picr = vtk.vtkPNGReader() + picr = vtk.get("vtkPNGReader")() elif ".jpg" in fl or ".jpeg" in fl: - picr = vtk.vtkJPEGReader() + picr = vtk.get("vtkJPEGReader")() elif ".bmp" in fl: - picr = vtk.vtkBMPReader() + picr = vtk.get("vtkBMPReader")() elif ".gif" in fl: from PIL import Image, ImageSequence @@ -351,7 +351,7 @@ def _load_file(filename, unpack): ################################################################# multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): - read = vtk.vtkXMLMultiBlockDataReader() + read = vtk.get("XMLMultiBlockDataReader")() read.SetFileName(filename) read.Update() mb = read.GetOutput() @@ -396,7 +396,7 @@ def _load_file(filename, unpack): # output can be: # PolyData, StructuredGrid, StructuredPoints, UnstructuredGrid, RectilinearGrid - reader = vtk.vtkDataSetReader() + reader = vtk.get("vtkDataSetReader")() reader.ReadAllScalarsOn() reader.ReadAllVectorsOn() reader.ReadAllTensorsOn() @@ -405,33 +405,33 @@ def _load_file(filename, unpack): reader.ReadAllColorScalarsOn() elif fl.endswith(".ply"): - reader = vtk.vtkPLYReader() + reader = vtk.get("vtkPLYReader")() elif fl.endswith(".obj"): - reader = vtk.vtkOBJReader() + reader = vtk.get("vtkOBJReader")() elif fl.endswith(".stl"): - reader = vtk.vtkSTLReader() + reader = vtk.get("STLReader")() elif fl.endswith(".byu") or fl.endswith(".g"): - reader = vtk.vtkBYUReader() + reader = vtk.get("BYUReader")() elif fl.endswith(".foam"): # OpenFoam - reader = vtk.vtkOpenFOAMReader() + reader = vtk.get("OpenFOAMReader")() elif fl.endswith(".pvd"): - reader = vtk.vtkXMLGenericDataObjectReader() + reader = vtk.get("XMLGenericDataObjectReader")() elif fl.endswith(".vtp"): - reader = vtk.vtkXMLPolyDataReader() + reader = vtk.get("XMLPolyDataReader")() elif fl.endswith(".vts"): - reader = vtk.vtkXMLStructuredGridReader() + reader = vtk.get("XMLStructuredGridReader")() elif fl.endswith(".vtu"): - reader = vtk.vtkXMLUnstructuredGridReader() + reader = vtk.get("XMLUnstructuredGridReader")() elif fl.endswith(".vtr"): - reader = vtk.vtkXMLRectilinearGridReader() + reader = vtk.get("XMLRectilinearGridReader")() elif fl.endswith(".pvtr"): - reader = vtk.vtkXMLPRectilinearGridReader() + reader = vtk.get("XMLPRectilinearGridReader")() elif fl.endswith("pvtu"): - reader = vtk.vtkXMLPUnstructuredGridReader() + reader = vtk.get("XMLPUnstructuredGridReader")() elif fl.endswith(".txt") or fl.endswith(".xyz"): - reader = vtk.vtkParticleReader() # (format is x, y, z, scalar) + reader = vtk.get("ParticleReader")() # (format is x, y, z, scalar) elif fl.endswith(".facet"): - reader = vtk.vtkFacetReader() + reader = vtk.get("FacetReader")() else: return None @@ -546,7 +546,7 @@ def loadStructuredPoints(filename, as_points=True): If `as_points` is True, return a `Points` object instead of `vtkStructuredPoints`. """ - reader = vtk.vtkStructuredPointsReader() + reader = vtk.get("StructuredPointsReader")() reader.SetFileName(filename) reader.Update() if as_points: @@ -561,9 +561,9 @@ def loadStructuredPoints(filename, as_points=True): def loadStructuredGrid(filename): """Load and return a `vtkStructuredGrid` object from file.""" if filename.endswith(".vts"): - reader = vtk.vtkXMLStructuredGridReader() + reader = vtk.get("XMLStructuredGridReader")() else: - reader = vtk.vtkStructuredGridReader() + reader = vtk.get("StructuredGridReader")() reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -572,9 +572,9 @@ def loadStructuredGrid(filename): def loadUnStructuredGrid(filename): """Load and return a `vtkunStructuredGrid` object from file.""" if filename.endswith(".vtu"): - reader = vtk.vtkXMLUnstructuredGridReader() + reader = vtk.get("XMLUnstructuredGridReader")() else: - reader = vtk.vtkUnstructuredGridReader() + reader = vtk.get("UnstructuredGridReader")() reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -583,9 +583,9 @@ def loadUnStructuredGrid(filename): def loadRectilinearGrid(filename): """Load and return a `vtkRectilinearGrid` object from file.""" if filename.endswith(".vtr"): - reader = vtk.vtkXMLRectilinearGridReader() + reader = vtk.get("XMLRectilinearGridReader")() else: - reader = vtk.vtkRectilinearGridReader() + reader = vtk.get("RectilinearGridReader")() reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -593,7 +593,7 @@ def loadRectilinearGrid(filename): def loadXMLData(filename): """Read any type of vtk data object encoded in XML format.""" - reader = vtk.vtkXMLGenericDataObjectReader() + reader = vtk.get("XMLGenericDataObjectReader")() reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -609,7 +609,7 @@ def load3DS(filename): renWin = vtk.vtkRenderWindow() renWin.AddRenderer(renderer) - importer = vtk.vtk3DSImporter() + importer = vtk.get("3DSImporter")() importer.SetFileName(filename) importer.ComputeNormalsOn() importer.SetRenderWindow(renWin) @@ -674,7 +674,7 @@ def loadOFF(filename): def loadGeoJSON(filename): """Load GeoJSON files.""" - jr = vtk.vtkGeoJSONReader() + jr = vtk.get("GeoJSONReader")() jr.SetFileName(filename) jr.Update() return Mesh(jr.GetOutput()) @@ -1196,24 +1196,24 @@ def _buildmesh(d): def loadImageData(filename): """Read and return a `vtkImageData` object from file.""" if ".tif" in filename.lower(): - reader = vtk.vtkTIFFReader() + reader = vtk.get("TIFFReader")() # print("GetOrientationType ", reader.GetOrientationType()) reader.SetOrientationType(settings.tiff_orientation_type) elif ".slc" in filename.lower(): - reader = vtk.vtkSLCReader() + reader = vtk.get("SLCReader")() if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad SLC file {filename}") return None elif ".vti" in filename.lower(): - reader = vtk.vtkXMLImageDataReader() + reader = vtk.get("XMLImageDataReader")() elif ".mhd" in filename.lower(): - reader = vtk.vtkMetaImageReader() + reader = vtk.get("MetaImageReader")() elif ".dem" in filename.lower(): - reader = vtk.vtkDEMReader() + reader = vtk.get("DEMReader")() elif ".nii" in filename.lower(): - reader = vtk.vtkNIFTIImageReader() + reader = vtk.get("NIFTIImageReader")() elif ".nrrd" in filename.lower(): - reader = vtk.vtkNrrdReader() + reader = vtk.get("NrrdReader")() if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad NRRD file {filename}") return None @@ -1244,9 +1244,9 @@ def write(objct, fileoutput, binary=True): fr = fileoutput.lower() if fr.endswith(".vtk"): - writer = vtk.vtkDataSetWriter() + writer = vtk.get("DataSetWriter")() elif fr.endswith(".ply"): - writer = vtk.vtkPLYWriter() + writer = vtk.get("PLYWriter")() writer.AddComment("PLY file generated by vedo") lut = objct.mapper.GetLookupTable() if lut: @@ -1257,41 +1257,41 @@ def write(objct, fileoutput, binary=True): writer.SetArrayName(pscal.GetName()) writer.SetLookupTable(lut) elif fr.endswith(".stl"): - writer = vtk.vtkSTLWriter() + writer = vtk.get("STLWriter")() elif fr.endswith(".vtp"): - writer = vtk.vtkXMLPolyDataWriter() + writer = vtk.get("XMLPolyDataWriter")() elif fr.endswith(".vtu"): - writer = vtk.vtkXMLUnstructuredGridWriter() + writer = vtk.get("XMLUnstructuredGridWriter")() elif fr.endswith(".vtm"): - g = vtk.vtkMultiBlockDataGroupFilter() + g = vtk.get("MultiBlockDataGroupFilter")() for ob in objct: if isinstance(ob, (Points, Volume)): # picks transformation g.AddInputData(ob) g.Update() mb = g.GetOutputDataObject(0) - wri = vtk.vtkXMLMultiBlockDataWriter() + wri = vtk.get("XMLMultiBlockDataWriter")() wri.SetInputData(mb) wri.SetFileName(fileoutput) wri.Write() return mb elif fr.endswith(".xyz"): - writer = vtk.vtkSimplePointsWriter() + writer = vtk.get("SimplePointsWriter")() elif fr.endswith(".facet"): - writer = vtk.vtkFacetWriter() + writer = vtk.get("FacetWriter")() elif fr.endswith(".vti"): - writer = vtk.vtkXMLImageDataWriter() + writer = vtk.get("XMLImageDataWriter")() elif fr.endswith(".mhd"): - writer = vtk.vtkMetaImageWriter() + writer = vtk.get("MetaImageWriter")() elif fr.endswith(".nii"): - writer = vtk.vtkNIFTIImageWriter() + writer = vtk.get("NIFTIImageWriter")() elif fr.endswith(".png"): - writer = vtk.vtkPNGWriter() + writer = vtk.get("PNGWriter")() elif fr.endswith(".jpg"): - writer = vtk.vtkJPEGWriter() + writer = vtk.get("JPEGWriter")() elif fr.endswith(".bmp"): - writer = vtk.vtkBMPWriter() + writer = vtk.get("BMPWriter")() elif fr.endswith(".tif") or fr.endswith(".tiff"): - writer = vtk.vtkTIFFWriter() + writer = vtk.get("TIFFWriter")() writer.SetFileDimensionality(len(obj.GetDimensions())) elif fr.endswith(".npy") or fr.endswith(".npz"): if utils.is_sequence(objct): @@ -1565,7 +1565,7 @@ def export_window(fileoutput, binary=False): vedo.plotter_instance.render() - exporter = vtk.vtkX3DExporter() + exporter = vtk.get("X3DExporter")() exporter.SetBinary(binary) exporter.FastestOff() exporter.SetInput(vedo.plotter_instance.window) @@ -1720,7 +1720,7 @@ def import_window(fileinput, mtl_file=None, texture_path=None): renderer = vtk.vtkRenderer() window.AddRenderer(renderer) - importer = vtk.vtkOBJImporter() + importer = vtk.get("OBJImporter")() importer.SetFileName(fileinput) if mtl_file is not False: if mtl_file is None: @@ -1777,7 +1777,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): filename = str(filename) if filename.endswith(".pdf"): - writer = vtk.vtkGL2PSExporter() + writer = vtk.get("GL2PSExporter")() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1788,7 +1788,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## elif filename.endswith(".svg"): - writer = vtk.vtkGL2PSExporter() + writer = vtk.get("GL2PSExporter")() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1799,7 +1799,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## elif filename.endswith(".eps"): - writer = vtk.vtkGL2PSExporter() + writer = vtk.get("GL2PSExporter")() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1810,7 +1810,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## if settings.screeshot_large_image: - w2if = vtk.vtkRenderLargeImage() + w2if = vtk.get("RenderLargeImage")() w2if.SetInput(vedo.plotter_instance.renderer) w2if.SetMagnification(scale) else: @@ -1833,17 +1833,17 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return npdata ########################### if filename.lower().endswith(".png"): - writer = vtk.vtkPNGWriter() + writer = vtk.get("PNGWriter")() writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() elif filename.lower().endswith(".jpg") or filename.lower().endswith(".jpeg"): - writer = vtk.vtkJPEGWriter() + writer = vtk.get("JPEGWriter")() writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() else: # add .png - writer = vtk.vtkPNGWriter() + writer = vtk.get("PNGWriter")() writer.SetFileName(filename + ".png") writer.SetInputData(w2if.GetOutput()) writer.Write() diff --git a/vedo/image.py b/vedo/image.py index 6bfb8f2e..21beb0f9 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -32,13 +32,13 @@ def _get_img(obj, flip=False, translate=()): fname = obj.lower() if fname.endswith(".png"): - picr = vtk.vtkPNGReader() + picr = vtk.get("PNGReader")() elif fname.endswith(".jpg") or fname.endswith(".jpeg"): - picr = vtk.vtkJPEGReader() + picr = vtk.get("JPEGReader")() elif fname.endswith(".bmp"): - picr = vtk.vtkBMPReader() + picr = vtk.get("BMPReader")() elif fname.endswith(".tif") or fname.endswith(".tiff"): - picr = vtk.vtkTIFFReader() + picr = vtk.get("TIFFReader")() picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand image format", obj, c="r") @@ -1232,7 +1232,7 @@ def add_rectangle(self, xspan, yspan, c="green5", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.vtkImageCanvasSource2D() + canvas_source = vtk.get("ImageCanvasSource2D")() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) @@ -1273,7 +1273,7 @@ def add_line(self, p1, p2, lw=2, c="k2", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.vtkImageCanvasSource2D() + canvas_source = vtk.get("ImageCanvasSource2D")() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index 80889294..13b7e4f2 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -3,17 +3,14 @@ from dataclasses import dataclass import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk __docformat__ = "google" __doc__ = """Submodule to customize interaction modes.""" -class MousePan(vtk.vtkInteractorStyleUser): +class MousePan(vtk.get("InteractorStyleUser")): """ Interaction mode to pan the scene by dragging the mouse. @@ -160,7 +157,7 @@ def __init__(self): ############################################### -class BlenderStyle(vtk.vtkInteractorStyleUser): +class BlenderStyle(vtk.get("InteractorStyleUser")): """ Create an interaction style using the Blender default key-bindings. diff --git a/vedo/mesh.py b/vedo/mesh.py index 6382de4f..6ebf75db 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -3,10 +3,7 @@ import os import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo.colors import get_color @@ -358,11 +355,11 @@ def texture( fnl = fn.lower() if ".jpg" in fnl or ".jpeg" in fnl: - reader = vtk.vtkJPEGReader() + reader = vtk.get("JPEGReader")() elif ".png" in fnl: - reader = vtk.vtkPNGReader() + reader = vtk.get("PNGReader")() elif ".bmp" in fnl: - reader = vtk.vtkBMPReader() + reader = vtk.get("BMPReader")() else: vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") return self @@ -417,7 +414,7 @@ def texture( else: # last resource is automatic mapping - tmapper = vtk.vtkTextureMapToPlane() + tmapper = vtk.get("vtkTextureMapToPlane")() tmapper.AutomaticPlaneGenerationOn() tmapper.SetInputData(pd) tmapper.Update() @@ -1003,7 +1000,7 @@ def triangulate(self, verts=True, lines=True): def compute_cell_vertex_count(self): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" - csf = vtk.vtkCellSizeFilter() + csf = vtk.get("CellSizeFilter")() csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(False) @@ -1062,7 +1059,7 @@ def compute_quality(self, metric=6): ![](https://vedo.embl.es/images/advanced/meshquality.png) """ - qf = vtk.vtkMeshQuality() + qf = vtk.get("MeshQuality")() qf.SetInputData(self.dataset) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() @@ -2167,7 +2164,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): plane.SetOrigin(origin) plane.SetNormal(normal) - cutter = vtk.vtkPolyDataPlaneCutter() + cutter = vtk.get("PolyDataPlaneCutter")() cutter.SetInputData(self.dataset) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() @@ -2346,7 +2343,7 @@ def binarize( whiteImage.GetPointData().GetScalars().Fill(inval) # polygonal data --> image stencil: - pol2stenc = vtk.vtkPolyDataToImageStencil() + pol2stenc = vtk.get("PolyDataToImageStencil")() pol2stenc.SetInputData(pd) pol2stenc.SetOutputOrigin(whiteImage.GetOrigin()) pol2stenc.SetOutputSpacing(whiteImage.GetSpacing()) @@ -2356,7 +2353,7 @@ def binarize( # cut the corresponding white image and set the background: outval = fg_value if invert else bg_value - imgstenc = vtk.vtkImageStencil() + imgstenc = vtk.get("ImageStencil")() imgstenc.SetInputData(whiteImage) imgstenc.SetStencilConnection(pol2stenc.GetOutputPort()) imgstenc.SetReverseStencil(invert) diff --git a/vedo/plotter.py b/vedo/plotter.py index 17e24afd..ef90626c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -6,10 +6,7 @@ from typing import Callable import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import transformations @@ -706,7 +703,7 @@ def __init__( self.interactor = self.window.GetInteractor() for r in self.renderers: self.window.AddRenderer(r) - self.wx_widget.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) + self.wx_widget.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera()")) ######################## return ################ ######################## @@ -749,7 +746,7 @@ def __init__( self.interactor = vtk.vtkRenderWindowInteractor() self.interactor.SetRenderWindow(self.window) - vsty = vtk.vtkInteractorStyleTrackballCamera() + vsty = vtk.get("InteractorStyleTrackballCamera")() self.interactor.SetInteractorStyle(vsty) if settings.enable_default_keyboard_callbacks: @@ -835,7 +832,7 @@ def add(self, *objs, at=None): if ren: - if isinstance(a, vtk.vtkInteractorObserver): + if isinstance(a, vtk.get("InteractorObserver")): a.add_to(self) # from cutters continue @@ -912,7 +909,7 @@ def remove(self, *objs, at=None): if ren: ### remove it from the renderer - if isinstance(ob, vtk.vtkInteractorObserver): + if isinstance(ob, vtk.get("InteractorObserver")): ob.remove_from(self) # from cutters continue @@ -2049,7 +2046,7 @@ def _add_skybox(self, hdrfile): # many hdr files are at https://polyhaven.com/all if utils.vtk_version_at_least(9): - reader = vtk.vtkHDRReader() + reader = vtk.get("HDRReader")() # Check the image can be read. if not reader.CanReadFile(hdrfile): vedo.logger.error(f"Cannot read HDR file {hdrfile}") @@ -2308,7 +2305,7 @@ def add_scale_indicator( vedo.logger.warning("add_scale_indicator called with use_parallel_projection OFF. Skip.") return None - rlabel = vtk.vtkVectorText() + rlabel = vtk.get("VectorText")() rlabel.SetText("scale") tf = vtk.vtkTransformPolyDataFilter() tf.SetInputConnection(rlabel.GetOutputPort()) @@ -2885,7 +2882,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(b, vtk.vtkImageData): scanned_acts.append(vedo.Volume(b).actor) - elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): + elif isinstance(a, (vtk.vtkProp, vtk.get("InteractorObserver"))): scanned_acts.append(a) elif "trimesh" in str(type(a)): @@ -3335,33 +3332,33 @@ def user_mode(self, mode): # see https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html if mode in (0, "TrackballCamera"): if self.qt_widget: - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) elif mode in (1, "TrackballActor"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballActor()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTrackballActor")()) elif mode in (2, "JoystickCamera"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleJoystickCamera()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleJoystickCamera")()) elif mode in (3, "JoystickActor"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleJoystickActor()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleJoystickActor")()) elif mode in (4, "Flight"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleFlight()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleFlight")()) elif mode in (5, "RubberBand2D"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBand2D()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBand2D")()) elif mode in (6, "RubberBand3D"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBand3D()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBand3D")()) elif mode in (7, "RubberBandZoom"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBandZoom()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBandZoom")()) elif mode in (8, "Terrain"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTerrain()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTerrain")()) elif mode in (9, "Unicam"): - self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleUnicam()) + self.interactor.SetInteractorStyle(vtk.get("InteractorStyleUnicam")()) elif mode in (10, "Image", "image", "2d"): - astyle = vtk.vtkInteractorStyleImage() + astyle = vtk.get("InteractorStyleImage")() astyle.SetInteractionModeToImage3D() self.interactor.SetInteractorStyle(astyle) else: vedo.logger.warning(f"Unknown interaction mode: {mode}") - elif isinstance(mode, vtk.vtkInteractorStyleUser): + elif isinstance(mode, vtk.get("InteractorStyleUser")): # set a custom interactor style mode.interactor = self.interactor mode.renderer = self.renderer @@ -3770,15 +3767,15 @@ def _keypress(self, iren, event): elif key == "a": iren.ExitCallback() cur = iren.GetInteractorStyle() - if isinstance(cur, vtk.vtkInteractorStyleTrackballCamera): + if isinstance(cur, vtk.get("InteractorStyleTrackballCamera")): msg = "\nInteractor style changed to TrackballActor\n" msg += " you can now move and rotate individual meshes:\n" msg += " press X twice to save the repositioned mesh\n" msg += " press 'a' to go back to normal style" vedo.printc(msg) - iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballActor()) + iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballActor")()) else: - iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) + iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) iren.Start() return @@ -3813,12 +3810,12 @@ def _keypress(self, iren, event): elif key == "j": iren.ExitCallback() cur = iren.GetInteractorStyle() - if isinstance(cur, vtk.vtkInteractorStyleJoystickCamera): - iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) + if isinstance(cur, vtk.get("InteractorStyleJoystickCamera")): + iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) else: vedo.printc("\nInteractor style changed to Joystick,", end="") vedo.printc(" press j to go back to normal.") - iren.SetInteractorStyle(vtk.vtkInteractorStyleJoystickCamera()) + iren.SetInteractorStyle(vtk.get("InteractorStyleJoystickCamera")()) iren.Start() return diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 389c8d61..ba7791c8 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -4137,7 +4137,7 @@ def __init__(self, **kargs): self.edge_label_scale = None - self.mdg = vtk.vtkMutableDirectedGraph() + self.mdg = vtk.get("MutableDirectedGraph")() n = kargs.pop("n", 0) for _ in range(n): @@ -4145,7 +4145,7 @@ def __init__(self, **kargs): self._c = kargs.pop("c", (0.3, 0.3, 0.3)) - self.gl = vtk.vtkGraphLayout() + self.gl = vtk.get("GraphLayout")() self.font = kargs.pop("font", "") @@ -4157,11 +4157,11 @@ def __init__(self, **kargs): if "2d" in s: if "clustering" in s: - self.strategy = vtk.vtkClustering2DLayoutStrategy() + self.strategy = vtk.get("Clustering2DLayoutStrategy")() elif "fast" in s: - self.strategy = vtk.vtkFast2DLayoutStrategy() + self.strategy = vtk.get("Fast2DLayoutStrategy")() else: - self.strategy = vtk.vtkSimple2DLayoutStrategy() + self.strategy = vtk.get("Simple2DLayoutStrategy")() self.rotX = 180 opt = kargs.pop("rest_distance", None) if opt is not None: @@ -4176,7 +4176,7 @@ def __init__(self, **kargs): elif "circ" in s: if "3d" in s: - self.strategy = vtk.vtkSimple3DCirclesStrategy() + self.strategy = vtk.get("Simple3DCirclesStrategy")() self.strategy.SetDirection(0, 0, -1) self.strategy.SetAutoHeight(True) self.strategy.SetMethod(1) @@ -4190,11 +4190,11 @@ def __init__(self, **kargs): self.strategy.SetAutoHeight(False) self.strategy.SetHeight(opt) # float else: - self.strategy = vtk.vtkCircularLayoutStrategy() + self.strategy = vtk.get("CircularLayoutStrategy")() self.zrange = kargs.pop("zrange", 0) elif "cone" in s: - self.strategy = vtk.vtkConeLayoutStrategy() + self.strategy = vtk.get("ConeLayoutStrategy")() self.rotX = 180 opt = kargs.pop("compactness", None) if opt is not None: @@ -4207,7 +4207,7 @@ def __init__(self, **kargs): self.strategy.SetSpacing(opt) elif "force" in s: - self.strategy = vtk.vtkForceDirectedLayoutStrategy() + self.strategy = vtk.get("ForceDirectedLayoutStrategy")() opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) @@ -4226,7 +4226,7 @@ def __init__(self, **kargs): self.strategy.SetRandomInitialPoints(opt) # bool elif "tree" in s: - self.strategy = vtk.vtkSpanTreeLayoutStrategy() + self.strategy = vtk.get("SpanTreeLayoutStrategy")() self.rotX = 180 else: @@ -4289,7 +4289,7 @@ def build(self): self.gl.SetInputData(self.mdg) self.gl.Update() - gr2poly = vtk.vtkGraphToPolyData() + gr2poly = vtk.get("GraphToPolyData")() gr2poly.EdgeGlyphOutputOn() gr2poly.SetEdgeGlyphPosition(self.edge_glyph_position) gr2poly.SetInputData(self.gl.GetOutput()) diff --git a/vedo/shapes.py b/vedo/shapes.py index a9013baf..8b72b81c 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4,11 +4,7 @@ from functools import lru_cache import numpy as np - -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import settings @@ -937,6 +933,7 @@ def _getpts(pts, revd=False): vct = vtk.vtkContourTriangulator() vct.SetInputData(poly) vct.Update() + super().__init__(vct.GetOutput(), c, alpha) self.flat() self.properties.LightingOff() @@ -1173,9 +1170,10 @@ def __init__(self, points, points = utils.make3d(points).astype(float) - xspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() - yspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() - zspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() + vtkKochanekSpline = vtk.get("KochanekSpline") + xspline = vtkKochanekSpline() + yspline = vtkKochanekSpline() + zspline = vtkKochanekSpline() for s in [xspline, yspline, zspline]: if bias: s.SetDefaultBias(bias) @@ -1235,9 +1233,10 @@ def __init__(self, points, closed=False, res=None): points = utils.make3d(points).astype(float) - xspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() - yspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() - zspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() + vtkCardinalSpline = vtk.get("CardinalSpline") + xspline = vtkCardinalSpline() + yspline = vtkCardinalSpline() + zspline = vtkCardinalSpline() for s in [xspline, yspline, zspline]: s.SetClosed(closed) @@ -2839,7 +2838,7 @@ def __init__(self, style=1, r=1.0): tss.Update() super().__init__(tss.GetOutput(), c="w") atext = vtk.vtkTexture() - pnm_reader = vtk.vtkJPEGReader() + pnm_reader = vtk.get("JPEGReader")() fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) @@ -3382,7 +3381,7 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al else: tbs.SetBounds(0, n * spacing[0], 0, n * spacing[1], 0, n * spacing[2]) tbs.QuadsOn() - tbs.SetOutputPointsPrecision(vtk.vtkAlgorithm.SINGLE_PRECISION) + #tbs.SetOutputPointsPrecision(vtk.vtkAlgorithm.SINGLE_PRECISION) tbs.Update() poly = tbs.GetOutput() super().__init__(poly, c=c, alpha=alpha) @@ -3595,8 +3594,8 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow super().__init__([pts, faces], c, alpha) else: - - rs = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricTorus() + vtkParametricTorus = vtk.get('vtkParametricTorus') + rs = vtkParametricTorus() rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) pfs = vtk.vtkParametricFunctionSource() @@ -3604,6 +3603,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) pfs.Update() + super().__init__(pfs.GetOutput(), c, alpha) self.phong() @@ -3969,58 +3969,58 @@ def __init__(self, name, res=51, n=25, seed=1): name = shapes[name] if name == "Boy": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBoy() + ps = vtk.get("ParametricBoy")() elif name == "ConicSpiral": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricConicSpiral() + ps = vtk.get("ParametricConicSpiral")() elif name == "CrossCap": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricCrossCap() + ps = vtk.get("ParametricCrossCap")() elif name == "Dini": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricDini() + ps = vtk.get("ParametricDini")() elif name == "Enneper": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricEnneper() + ps = vtk.get("ParametricEnneper")() elif name == "Figure8Klein": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricFigure8Klein() + ps = vtk.get("ParametricFigure8Klein")() elif name == "Klein": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricKlein() + ps = vtk.get("ParametricKlein")() elif name == "Mobius": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricMobius() + ps = vtk.get("ParametricMobius")() ps.SetRadius(2.0) ps.SetMinimumV(-0.5) ps.SetMaximumV(0.5) elif name == "RandomHills": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricRandomHills() + ps = vtk.get("ParametricRandomHills")() ps.AllowRandomGenerationOn() ps.SetRandomSeed(seed) ps.SetNumberOfHills(n) elif name == "Roman": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricRoman() + ps = vtk.get("ParametricRoman")() elif name == "SuperEllipsoid": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperEllipsoid() + ps = vtk.get("ParametricSuperEllipsoid")() ps.SetN1(0.5) ps.SetN2(0.4) elif name == "BohemianDome": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBohemianDome() + ps = vtk.get("ParametricBohemianDome")() ps.SetA(5.0) ps.SetB(1.0) ps.SetC(2.0) elif name == "Bour": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBour() + ps = vtk.get("ParametricBour")() elif name == "CatalanMinimal": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricCatalanMinimal() + ps = vtk.get("ParametricCatalanMinimal")() elif name == "Henneberg": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricHenneberg() + ps = vtk.get("ParametricHenneberg")() elif name == "Kuen": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricKuen() + ps = vtk.get("ParametricKuen")() ps.SetDeltaV0(0.001) elif name == "PluckerConoid": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricPluckerConoid() + ps = vtk.get("ParametricPluckerConoid")() elif name == "Pseudosphere": - ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricPseudosphere() + ps = vtk.get("ParametricPseudosphere")() else: vedo.logger.error(f"unknown ParametricShape {name}") return - pfs = vtk.vtkParametricFunctionSource() + pfs = vtk.get("ParametricFunctionSource")() pfs.SetParametricFunction(ps) pfs.SetUResolution(res) pfs.SetVResolution(res) @@ -4248,7 +4248,7 @@ def _get_text3d_poly( txt = str(txt) if font == "VTK": ####################################### - vtt = vtk.vtkVectorText() + vtt = vtk.get("vtkVectorText")() vtt.SetText(txt) vtt.Update() tpoly = vtt.GetOutput() diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 5f3f5828..dae68c49 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -1,10 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import numpy as np import vedo @@ -338,7 +335,7 @@ def compute_quality(self, metric=7): See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html) for an explanation of the meaning of each metric.. """ - qf = vtk.vtkMeshQuality() + qf = vtk.get("MeshQuality")() qf.SetInputData(self.dataset) qf.SetTetQualityMeasure(metric) qf.SaveCellQualityOn() @@ -348,7 +345,7 @@ def compute_quality(self, metric=7): def compute_tets_volume(self): """Add to this mesh a cell data array containing the tetrahedron volume.""" - csf = vtk.vtkCellSizeFilter() + csf = vtk.get("CellSizeFilter")() csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(True) diff --git a/vedo/utils.py b/vedo/utils.py index c487d448..a89ebb3f 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -4,10 +4,7 @@ import time import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.numpy_support import numpy_to_vtkIdTypeArray @@ -2064,7 +2061,7 @@ def camera_from_quaternion(pos, quaternion, distance=10000, ngl_correct=True): camera = vtk.vtkCamera() # define the quaternion in vtk, note the swapped order # w,x,y,z instead of x,y,z,w - quat_vtk = vtk.vtkQuaternion(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) + quat_vtk = vtk.get("Quaternion")(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) # use this to define a rotation matrix in x,y,z # right handed units M = np.zeros((3, 3), dtype=np.float32) diff --git a/vedo/version.py b/vedo/version.py index 818dc7ac..f5099c47 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev20a' +_version = '2023.5.0+dev21a' diff --git a/vedo/visual.py b/vedo/visual.py index 68b91a43..fc9dbc57 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import colors @@ -1350,7 +1347,7 @@ def labels( continue if font == "VTK": - tx = vtk.vtkVectorText() + tx = vtk.get("VectorText")() tx.SetText(txt_lab) tx.Update() tx_poly = tx.GetOutput() @@ -1482,7 +1479,7 @@ def labels2d( return None self.pointdata.select(content) - mp = vtk.vtkLabeledDataMapper() + mp = vtk.get("LabeledDataMapper")() if content == "id": mp.SetLabelModeToLabelIds() diff --git a/vedo/volume.py b/vedo/volume.py index dce63779..cc36d3a4 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -3,10 +3,7 @@ import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import utils @@ -176,7 +173,7 @@ def __init__( f = inputobj[i] if "_rec_spr.bmp" in f: continue - picr = vtk.vtkBMPReader() + picr = vtk.get("BMPReader")() picr.SetFileName(f) picr.Update() mgf = vtk.vtkImageMagnitude() @@ -1132,7 +1129,7 @@ def erode(self, neighbours=(2, 2, 2)): ![](https://vedo.embl.es/images/volumetric/erode_dilate.png) """ - ver = vtk.vtkImageContinuousErode3D() + ver = vtk.get("ImageContinuousErode3D")() ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() @@ -1150,7 +1147,7 @@ def dilate(self, neighbours=(2, 2, 2)): Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) """ - ver = vtk.vtkImageContinuousDilate3D() + ver = vtk.get("ImageContinuousDilate3D")() ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 4ee976dc..34b96c62 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Subset of vtk classes to be imported directly +Subset of vtk classes to be imported directly or lazily. """ from importlib import import_module @@ -10,7 +10,7 @@ module_cache = {} -def get(module_name="", cls_name=""): +def get(cls_name="", module_name=""): """ Get a vtk class from its name. @@ -20,11 +20,12 @@ def get(module_name="", cls_name=""): print(vtk.vtkActor) print(vtk.location["vtkActor"]) print(vtk.get("vtkActor")) - print(vtk.get("vtkRenderingCore","vtkActor")) + print(vtk.get("vtkActor", "vtkRenderingCore")) ``` """ - if not cls_name: - cls_name = module_name + if cls_name and not cls_name.startswith("vtk"): + cls_name = "vtk" + cls_name + if not module_name: module_name = location[cls_name] module_name = "vtkmodules." + module_name if module_name not in module_cache: @@ -35,13 +36,14 @@ def get(module_name="", cls_name=""): else: return module_cache[module_name] -def dump_hierarchy_to_file(): +def dump_hierarchy_to_file(fname=""): """ Print all available vtk classes. Dumps the list to a file named `vtkmodules__hierarchy.txt` """ try: import pkgutil + import vtkmodules from vtkmodules.all import vtkVersion ver = vtkVersion() except AttributeError: @@ -51,8 +53,8 @@ def dump_hierarchy_to_file(): minor = ver.GetVTKMinorVersion() patch = ver.GetVTKBuildVersion() vtkvers = f"{major}.{minor}.{patch}" - - fname = f"vtkmodules_{vtkvers}_hierarchy.txt" + if not fname: + fname = f"vtkmodules_{vtkvers}_hierarchy.txt" with open(fname,"w") as w: for pkg in pkgutil.walk_packages( vtkmodules.__path__, vtkmodules.__name__ + "."): @@ -73,13 +75,39 @@ def dump_hierarchy_to_file(): continue w.write(f"{module.__name__}.{subitem}\n") -#################################################### - +###################################################################### +as_strings = [ + "vtkKochanekSpline", + "vtkCardinalSpline", + "vtkParametricSpline", + "vtkParametricFunctionSource", + "vtkParametricTorus", + "vtkParametricBoy", + "vtkParametricConicSpiral", + "vtkParametricCrossCap", + "vtkParametricDini", + "vtkParametricEllipsoid", + "vtkParametricEnneper", + "vtkParametricFigure8Klein", + "vtkParametricKlein", + "vtkParametricMobius", + "vtkParametricRandomHills", + "vtkParametricRoman", + "vtkParametricSuperEllipsoid", + "vtkParametricSuperToroid", + "vtkParametricBohemianDome", + "vtkParametricBour", + "vtkParametricCatalanMinimal", + "vtkParametricHenneberg", + "vtkParametricKuen", + "vtkParametricPluckerConoid", + "vtkParametricPseudosphere", +] +for name in as_strings: + location[name] = "vtkCommonComputationalGeometry" -import vtkmodules.vtkCommonComputationalGeometry from vtkmodules.vtkCommonColor import vtkNamedColors - location["vtkNamedColors"] = "vtkCommonColor" @@ -119,7 +147,6 @@ def dump_hierarchy_to_file(): vtkVariantArray, vtkVersion, ) - as_strings = [ "mutable", "VTK_UNSIGNED_CHAR", @@ -159,6 +186,11 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkCommonCore" +from vtkmodules.vtkCommonDataModel import ( + vtkPolyData, + vtkImageData, + vtkUnstructuredGrid, +) from vtkmodules.vtkCommonDataModel import ( VTK_HEXAHEDRON, @@ -178,7 +210,6 @@ def dump_hierarchy_to_file(): vtkFieldData, vtkHexagonalPrism, vtkHexahedron, - vtkImageData, vtkImplicitDataSet, vtkImplicitSelectionLoop, vtkImplicitWindowFunction, @@ -190,7 +221,6 @@ def dump_hierarchy_to_file(): vtkPlane, vtkPlanes, vtkPointLocator, - vtkPolyData, vtkPolyLine, vtkPolyPlane, vtkPolygon, @@ -205,11 +235,9 @@ def dump_hierarchy_to_file(): vtkStructuredGrid, vtkTetra, vtkTriangle, - vtkUnstructuredGrid, vtkVoxel, vtkWedge, ) - as_strings = [ "VTK_HEXAHEDRON", "VTK_TETRA", @@ -262,11 +290,7 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkCommonDataModel" - -from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm -location["vtkAlgorithm"] = "vtkCommonExecutionModel" - -from vtkmodules.vtkCommonMath import vtkMatrix4x4, vtkQuaternion +from vtkmodules.vtkCommonMath import vtkMatrix4x4 location["vtkMatrix4x4"] = "vtkCommonMath" location["vtkQuaternion"] = "vtkCommonMath" @@ -277,11 +301,15 @@ def dump_hierarchy_to_file(): vtkThinPlateSplineTransform, vtkTransform, ) -location["vtkHomogeneousTransform"] = "vtkCommonTransforms" -location["vtkLandmarkTransform"] = "vtkCommonTransforms" -location["vtkLinearTransform"] = "vtkCommonTransforms" -location["vtkThinPlateSplineTransform"] = "vtkCommonTransforms" -location["vtkTransform"] = "vtkCommonTransforms" +as_strings = [ + "vtkHomogeneousTransform", + "vtkLandmarkTransform", + "vtkLinearTransform", + "vtkThinPlateSplineTransform", + "vtkTransform", +] +for name in as_strings: + location[name] = "vtkCommonTransforms" from vtkmodules.vtkFiltersCore import ( VTK_BEST_FITTING_PLANE, @@ -325,7 +353,6 @@ def dump_hierarchy_to_file(): vtkVoronoi2D, vtkWindowedSincPolyDataFilter, ) - as_strings = [ "VTK_BEST_FITTING_PLANE", "vtk3DLinearGridCrinkleExtractor", @@ -371,17 +398,8 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkFiltersCore" - -try: - from vtkmodules.vtkFiltersCore import ( - vtkStaticCleanUnstructuredGrid, - vtkPolyDataPlaneCutter, - ) - location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" - location["vtkPolyDataPlaneCutter"] = "vtkFiltersCore" -except ImportError: - pass - +location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" +location["vtkPolyDataPlaneCutter"] = "vtkFiltersCore" from vtkmodules.vtkFiltersExtraction import ( vtkExtractCellsByType, @@ -484,11 +502,9 @@ def dump_hierarchy_to_file(): from vtkmodules.vtkFiltersHybrid import ( - vtkFacetReader, vtkImplicitModeller, vtkPolyDataSilhouette, vtkProcrustesAlignmentFilter, - vtkRenderLargeImage, ) as_strings = [ "vtkFacetReader", @@ -604,7 +620,6 @@ def dump_hierarchy_to_file(): vtkGraphToPolyData, vtkLineSource, vtkOutlineCornerFilter, - vtkParametricFunctionSource, vtkPlaneSource, vtkPointSource, vtkProgrammableSource, @@ -635,32 +650,17 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkFiltersSources" - -from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane location["vtkTextureMapToPlane"] = "vtkFiltersTexture" -from vtkmodules.vtkFiltersVerdict import vtkMeshQuality, vtkCellSizeFilter location["vtkMeshQuality"] = "vtkFiltersVerdict" location["vtkCellSizeFilter"] = "vtkFiltersVerdict" -from vtkmodules.vtkImagingStencil import vtkPolyDataToImageStencil location["vtkPolyDataToImageStencil"] = "vtkImagingStencil" -from vtkmodules.vtkIOExport import vtkX3DExporter location["vtkX3DExporter"] = "vtkIOExport" -from vtkmodules.vtkIOExportGL2PS import vtkGL2PSExporter location["vtkGL2PSExporter"] = "vtkIOExportGL2PS" -from vtkmodules.vtkIOGeometry import ( - vtkBYUReader, - vtkFacetWriter, - vtkOBJReader, - vtkOpenFOAMReader, - vtkParticleReader, - vtkSTLReader, - vtkSTLWriter, -) as_strings = [ "vtkBYUReader", "vtkFacetWriter", @@ -673,26 +673,6 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkIOGeometry" - -from vtkmodules.vtkIOImage import ( - vtkBMPReader, - vtkBMPWriter, - vtkDEMReader, - vtkDICOMImageReader, - vtkHDRReader, - vtkJPEGReader, - vtkJPEGWriter, - vtkMetaImageReader, - vtkMetaImageWriter, - vtkNIFTIImageReader, - vtkNIFTIImageWriter, - vtkNrrdReader, - vtkPNGReader, - vtkPNGWriter, - vtkSLCReader, - vtkTIFFReader, - vtkTIFFWriter, -) as_strings = [ "vtkBMPReader", "vtkBMPWriter", @@ -715,26 +695,10 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkIOImage" -from vtkmodules.vtkIOImport import ( - vtk3DSImporter, - vtkOBJImporter, - vtkVRMLImporter, -) location["vtk3DSImporter"] = "vtkIOImport" location["vtkOBJImporter"] = "vtkIOImport" location["vtkVRMLImporter"] = "vtkIOImport" - -from vtkmodules.vtkIOLegacy import ( - vtkSimplePointsWriter, - vtkStructuredGridReader, - vtkStructuredPointsReader, - vtkDataSetReader, - vtkDataSetWriter, - vtkPolyDataWriter, - vtkRectilinearGridReader, - vtkUnstructuredGridReader, -) as_strings = [ "vtkSimplePointsWriter", "vtkStructuredGridReader", @@ -749,25 +713,9 @@ def dump_hierarchy_to_file(): location[name] = "vtkIOLegacy" -from vtkmodules.vtkIOPLY import vtkPLYReader, vtkPLYWriter location["vtkPLYReader"] = "vtkIOPLY" location["vtkPLYWriter"] = "vtkIOPLY" -from vtkmodules.vtkIOXML import ( - vtkXMLGenericDataObjectReader, - vtkXMLImageDataReader, - vtkXMLImageDataWriter, - vtkXMLMultiBlockDataReader, - vtkXMLMultiBlockDataWriter, - vtkXMLPRectilinearGridReader, - vtkXMLPUnstructuredGridReader, - vtkXMLPolyDataReader, - vtkXMLPolyDataWriter, - vtkXMLRectilinearGridReader, - vtkXMLStructuredGridReader, - vtkXMLUnstructuredGridReader, - vtkXMLUnstructuredGridWriter, -) as_strings = [ "vtkXMLGenericDataObjectReader", "vtkXMLImageDataReader", @@ -871,6 +819,10 @@ def dump_hierarchy_to_file(): location[name] = "vtkImagingGeneral" from vtkmodules.vtkImagingHybrid import vtkImageToPoints, vtkSampleFunction +as_strings = ["vtkImageToPoints", "vtkSampleFunction"] +for name in as_strings: + location[name] = "vtkImagingHybrid" + from vtkmodules.vtkImagingMath import ( vtkImageDivergence, vtkImageDotProduct, @@ -888,10 +840,6 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkImagingMath" -from vtkmodules.vtkImagingMorphological import ( - vtkImageContinuousDilate3D, - vtkImageContinuousErode3D, -) as_strings = [ "vtkImageContinuousDilate3D", "vtkImageContinuousErode3D", @@ -899,23 +847,10 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkImagingMorphological" -from vtkmodules.vtkImagingSources import vtkImageCanvasSource2D location["vtkImageCanvasSource2D"] = "vtkImagingSources" -from vtkmodules.vtkImagingStencil import vtkImageStencil location["vtkImageStencil"] = "vtkImagingStencil" -from vtkmodules.vtkInfovisLayout import ( - vtkCircularLayoutStrategy, - vtkClustering2DLayoutStrategy, - vtkConeLayoutStrategy, - vtkFast2DLayoutStrategy, - vtkForceDirectedLayoutStrategy, - vtkGraphLayout, - vtkSimple2DLayoutStrategy, - vtkSimple3DCirclesStrategy, - vtkSpanTreeLayoutStrategy, -) as_strings = [ "vtkCircularLayoutStrategy", "vtkClustering2DLayoutStrategy", @@ -930,21 +865,6 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkInfovisLayout" -from vtkmodules.vtkInteractionStyle import ( - vtkInteractorStyleFlight, - vtkInteractorStyleImage, - vtkInteractorStyleJoystickActor, - vtkInteractorStyleJoystickCamera, - vtkInteractorStyleRubberBand2D, - vtkInteractorStyleRubberBand3D, - vtkInteractorStyleRubberBandZoom, - vtkInteractorStyleTerrain, - vtkInteractorStyleTrackballActor, - vtkInteractorStyleTrackballCamera, - vtkInteractorStyleUnicam, - vtkInteractorStyleUser, -) - as_strings = [ "vtkInteractorStyleFlight", "vtkInteractorStyleImage", @@ -978,7 +898,6 @@ def dump_hierarchy_to_file(): vtkSliderWidget, vtkSphereWidget, ) - as_strings = [ "vtkBalloonRepresentation", "vtkBalloonWidget", @@ -998,11 +917,8 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkInteractionWidgets" -try: - from vtkmodules.vtkInteractionWidgets import vtkCameraOrientationWidget - location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" -except ImportError: - pass +location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" + from vtkmodules.vtkRenderingAnnotation import ( vtkAnnotatedCubeActor, @@ -1133,13 +1049,10 @@ def dump_hierarchy_to_file(): for name in as_strings: location[name] = "vtkRenderingCore" -from vtkmodules.vtkRenderingFreeType import vtkVectorText location["vtkVectorText"] = "vtkRenderingFreeType" -from vtkmodules.vtkRenderingImage import vtkImageResliceMapper location["vtkImageResliceMapper"] = "vtkRenderingImage" -from vtkmodules.vtkRenderingLabel import vtkLabeledDataMapper location["vtkLabeledDataMapper"] = "vtkRenderingLabel" from vtkmodules.vtkRenderingOpenGL2 import ( From cead1a5db6ff944b7b8b6ba56b0e24aa21103408 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 16:19:28 +0200 Subject: [PATCH 158/251] put back vtkcommon --- vedo/vtkclasses.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 34b96c62..bc7139e5 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -134,6 +134,7 @@ def dump_hierarchy_to_file(fname=""): vtkIdTypeArray, vtkBitArray, vtkCharArray, + vtkCommand, vtkDoubleArray, vtkFloatArray, vtkIdList, @@ -170,6 +171,7 @@ def dump_hierarchy_to_file(fname=""): "vtkIdTypeArray", "vtkBitArray", "vtkCharArray", + "vtkCommand", "vtkDoubleArray", "vtkFloatArray", "vtkIdList", From 33f8cd41e8be54368cfbddced32ae136b8500011 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 20:18:11 +0200 Subject: [PATCH 159/251] require vtk9.0 and other fixes --- docs/changes.md | 3 + requirements.txt | 2 +- vedo/assembly.py | 20 +---- vedo/backends.py | 12 ++- vedo/cli.py | 18 ++--- vedo/dolfin.py | 5 +- vedo/image.py | 5 +- vedo/mesh.py | 2 +- vedo/pointcloud.py | 7 +- vedo/pyplot.py | 5 +- vedo/shapes.py | 2 +- vedo/transformations.py | 6 +- vedo/ugrid.py | 5 +- vedo/vtkclasses.py | 165 ++++++++++++++++------------------------ 14 files changed, 92 insertions(+), 165 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 03771bbb..87af655d 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -20,10 +20,12 @@ see `examples/pyplot/embed_matplotlib.py`. - improvements to method `mesh.clone2d()` - name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` +- reformat how vtk classes are imported (allow some laziness) ### Breaking changes +- requires vtk=>9.0 - plt.actors must become plt.objects - change .points() to .vertices - change .cell_centers() to .cell_centers @@ -80,3 +82,4 @@ examples/basic/cells_within_bounds.py because of clone() - analysis_plots.visualize_clones_as_timecourse_with_fit not working + diff --git a/requirements.txt b/requirements.txt index 44dbeaeb..ec672579 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -vtk +vtk>=9.0 Pygments diff --git a/vedo/assembly.py b/vedo/assembly.py index cd1235ed..9e9579d1 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -22,18 +22,6 @@ __all__ = ["Group", "Assembly", "procrustes_alignment"] -################################################# -def _is_sequence(arg): - """Check if the input is iterable.""" - if hasattr(arg, "strip"): - return False - if hasattr(arg, "__getslice__"): - return True - if hasattr(arg, "__iter__"): - return True - return False - - ################################################# def procrustes_alignment(sources, rigid=False): """ @@ -57,13 +45,13 @@ def procrustes_alignment(sources, rigid=False): ![](https://vedo.embl.es/images/basic/align4.png) """ - group = vtk.vtkMultiBlockDataGroupFilter() + group = vtk.get("MultiBlockDataGroupFilter")() for source in sources: if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() group.AddInputData(source.dataset) - procrustes = vtk.vtkProcrustesAlignmentFilter() + procrustes = vtk.get("ProcrustesAlignmentFilter")() procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) if rigid: @@ -254,7 +242,7 @@ def __init__(self, *meshs): scalarbars = [] for a in self.actors: - if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): + if isinstance(a, vtk.get("Prop3D")): # and a.GetNumberOfPoints(): self.AddPart(a) if hasattr(a, "scalarbar") and a.scalarbar is not None: scalarbars.append(a.scalarbar) @@ -339,7 +327,7 @@ def __add__(self, obj): """ Add an object to the assembly """ - if isinstance(obj, vtk.vtkProp3D): + if isinstance(obj, vtk.get("Prop3D")): self.objects.append(obj) self.actors.append(obj.actor) diff --git a/vedo/backends.py b/vedo/backends.py index 209f86dd..846fe991 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -3,18 +3,16 @@ import os import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk -import vedo -from vedo import settings -from vedo import utils from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume +import vedo +from vedo import settings +from vedo import utils + __doc__ = """Submodule to delegate jupyter notebook rendering""" __all__ = [] diff --git a/vedo/cli.py b/vedo/cli.py index 5e9a168c..23d49f47 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -25,19 +25,9 @@ import sys import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk -import vedo -from vedo.utils import humansort -from vedo.utils import is_sequence -from vedo.utils import print_info -from vedo import __version__ -from vedo import file_io -from vedo import load -from vedo import settings +from vedo.utils import humansort, is_sequence, print_info from vedo.colors import get_color, printc from vedo.mesh import Mesh from vedo.image import Image @@ -45,6 +35,10 @@ from vedo.tetmesh import TetMesh from vedo.ugrid import UGrid from vedo.volume import Volume + +import vedo +from vedo import __version__ +from vedo import file_io, load, settings from vedo import applications __all__ = [] diff --git a/vedo/dolfin.py b/vedo/dolfin.py index 794d0c14..5db8cb87 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo.colors import printc diff --git a/vedo/image.py b/vedo/image.py index 21beb0f9..df6fe86c 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import colors diff --git a/vedo/mesh.py b/vedo/mesh.py index 6ebf75db..1ae0a51e 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1717,7 +1717,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): ![](https://vedo.embl.es/images/basic/silhouette1.png) """ - sil = vtk.vtkPolyDataSilhouette() + sil = vtk.get("PolyDataSilhouette")() sil.SetInputData(self.dataset) sil.SetBorderEdges(border_edges) if feature_angle is False: diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index a902b241..b70da6b1 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -3,10 +3,7 @@ import time import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import colors @@ -2471,7 +2468,7 @@ def generate_surface_halo( if not maxdist: maxdist = self.diagonal_size() / 2 - imp = vtk.vtkImplicitModeller() + imp = vtk.get("ImplicitModeller")() imp.SetInputData(self.dataset) imp.SetSampleDimensions(res) if maxdist: diff --git a/vedo/pyplot.py b/vedo/pyplot.py index ba7791c8..9d599bf5 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -3,10 +3,7 @@ import warnings import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import settings diff --git a/vedo/shapes.py b/vedo/shapes.py index 8b72b81c..ec7deac2 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1561,7 +1561,7 @@ def read_points(): src.SetExecuteMethod(read_points) src.Update() - st = vtk.vtkStreamTracer() + st = vtk.get("StreamTracer")() try: st.SetInputDataObject(grid.dataset) except AttributeError: diff --git a/vedo/transformations.py b/vedo/transformations.py index 5c576f5f..43356695 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -2,11 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk - +import vedo.vtkclasses as vtk __docformat__ = "google" diff --git a/vedo/ugrid.py b/vedo/ugrid.py index cca056bc..c64c4ae6 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import utils diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index bc7139e5..e97653be 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -5,11 +5,12 @@ """ from importlib import import_module +###################################################################### -location = dict() +location = {} module_cache = {} - +###################################################################### def get(cls_name="", module_name=""): """ Get a vtk class from its name. @@ -76,7 +77,7 @@ def dump_hierarchy_to_file(fname=""): w.write(f"{module.__name__}.{subitem}\n") ###################################################################### -as_strings = [ +for name in [ "vtkKochanekSpline", "vtkCardinalSpline", "vtkParametricSpline", @@ -102,12 +103,10 @@ def dump_hierarchy_to_file(fname=""): "vtkParametricKuen", "vtkParametricPluckerConoid", "vtkParametricPseudosphere", -] -for name in as_strings: +]: location[name] = "vtkCommonComputationalGeometry" -from vtkmodules.vtkCommonColor import vtkNamedColors location["vtkNamedColors"] = "vtkCommonColor" @@ -148,7 +147,7 @@ def dump_hierarchy_to_file(fname=""): vtkVariantArray, vtkVersion, ) -as_strings = [ +for name in [ "mutable", "VTK_UNSIGNED_CHAR", "VTK_UNSIGNED_SHORT", @@ -184,14 +183,15 @@ def dump_hierarchy_to_file(fname=""): "vtkVariant", "vtkVariantArray", "vtkVersion", -] -for name in as_strings: +]: location[name] = "vtkCommonCore" from vtkmodules.vtkCommonDataModel import ( vtkPolyData, vtkImageData, vtkUnstructuredGrid, + vtkRectilinearGrid, + vtkStructuredGrid, ) from vtkmodules.vtkCommonDataModel import ( @@ -228,19 +228,17 @@ def dump_hierarchy_to_file(fname=""): vtkPolygon, vtkPyramid, vtkQuadric, - vtkRectilinearGrid, vtkSelection, vtkSelectionNode, vtkSphere, vtkStaticCellLocator, vtkStaticPointLocator, - vtkStructuredGrid, vtkTetra, vtkTriangle, vtkVoxel, vtkWedge, ) -as_strings = [ +for name in [ "VTK_HEXAHEDRON", "VTK_TETRA", "VTK_VOXEL", @@ -288,8 +286,7 @@ def dump_hierarchy_to_file(fname=""): "vtkUnstructuredGrid", "vtkVoxel", "vtkWedge", -] -for name in as_strings: +]: location[name] = "vtkCommonDataModel" from vtkmodules.vtkCommonMath import vtkMatrix4x4 @@ -303,14 +300,13 @@ def dump_hierarchy_to_file(fname=""): vtkThinPlateSplineTransform, vtkTransform, ) -as_strings = [ +for name in [ "vtkHomogeneousTransform", "vtkLandmarkTransform", "vtkLinearTransform", "vtkThinPlateSplineTransform", "vtkTransform", -] -for name in as_strings: +]: location[name] = "vtkCommonTransforms" from vtkmodules.vtkFiltersCore import ( @@ -355,7 +351,7 @@ def dump_hierarchy_to_file(fname=""): vtkVoronoi2D, vtkWindowedSincPolyDataFilter, ) -as_strings = [ +for name in [ "VTK_BEST_FITTING_PLANE", "vtk3DLinearGridCrinkleExtractor", "vtkAppendPolyData", @@ -396,8 +392,7 @@ def dump_hierarchy_to_file(fname=""): "vtkUnstructuredGridQuadricDecimation", "vtkVoronoi2D", "vtkWindowedSincPolyDataFilter", -] -for name in as_strings: +]: location[name] = "vtkFiltersCore" location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" @@ -409,13 +404,12 @@ def dump_hierarchy_to_file(fname=""): vtkExtractPolyDataGeometry, vtkExtractSelection, ) -as_strings = [ +for name in [ "vtkExtractCellsByType", "vtkExtractGeometry", "vtkExtractPolyDataGeometry", "vtkExtractSelection", -] -for name in as_strings: +]: location[name] = "vtkFiltersExtraction" try: @@ -425,7 +419,7 @@ def dump_hierarchy_to_file(fname=""): from vtkmodules.vtkFiltersCore import vtkExtractEdges # vtk9.2 location["vtkExtractEdges"] = "vtkFiltersCore" -from vtkmodules.vtkFiltersFlowPaths import vtkStreamTracer + location["vtkStreamTracer"] = "vtkFiltersFlowPaths" @@ -443,7 +437,6 @@ def dump_hierarchy_to_file(fname=""): vtkGradientFilter, vtkIntersectionPolyDataFilter, vtkLoopBooleanPolyDataFilter, - vtkMultiBlockDataGroupFilter, vtkTransformPolyDataFilter, vtkOBBTree, vtkQuantizePolyDataPoints, @@ -453,7 +446,7 @@ def dump_hierarchy_to_file(fname=""): vtkRectilinearGridToTetrahedra, vtkVertexGlyphFilter, ) -as_strings = [ +for name in [ "vtkBooleanOperationPolyDataFilter", "vtkBoxClipDataSet", "vtkCellValidator", @@ -476,8 +469,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShrinkPolyData", "vtkRectilinearGridToTetrahedra", "vtkVertexGlyphFilter", -] -for name in as_strings: +]: location[name] = "vtkFiltersGeneral" try: @@ -503,19 +495,13 @@ def dump_hierarchy_to_file(fname=""): pass -from vtkmodules.vtkFiltersHybrid import ( - vtkImplicitModeller, - vtkPolyDataSilhouette, - vtkProcrustesAlignmentFilter, -) -as_strings = [ +for name in [ "vtkFacetReader", "vtkImplicitModeller", "vtkPolyDataSilhouette", "vtkProcrustesAlignmentFilter", "vtkRenderLargeImage", -] -for name in as_strings: +]: location[name] = "vtkFiltersHybrid" @@ -539,7 +525,7 @@ def dump_hierarchy_to_file(fname=""): vtkSelectPolyData, vtkSubdivideTetra, ) -as_strings = [ +for name in [ "vtkAdaptiveSubdivisionFilter", "vtkBandedPolyDataContourFilter", "vtkButterflySubdivisionFilter", @@ -558,8 +544,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSelectEnclosedPoints", "vtkSelectPolyData", "vtkSubdivideTetra", -] -for name in as_strings: +]: location[name] = "vtkFiltersModeling" try: @@ -590,7 +575,7 @@ def dump_hierarchy_to_file(fname=""): vtkSignedDistance, vtkVoronoiKernel, ) -as_strings = [ +for name in [ "vtkConnectedPointsFilter", "vtkDensifyPointCloudFilter", "vtkEuclideanClusterExtraction", @@ -605,8 +590,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShepardKernel", "vtkSignedDistance", "vtkVoronoiKernel", -] -for name in as_strings: +]: location[name] = "vtkFiltersPoints" @@ -629,7 +613,7 @@ def dump_hierarchy_to_file(fname=""): vtkTexturedSphereSource, vtkTessellatedBoxSource, ) -as_strings = [ +for name in [ "vtkArcSource", "vtkArrowSource", "vtkConeSource", @@ -648,8 +632,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSphereSource", "vtkTexturedSphereSource", "vtkTessellatedBoxSource", -] -for name in as_strings: +]: location[name] = "vtkFiltersSources" location["vtkTextureMapToPlane"] = "vtkFiltersTexture" @@ -663,7 +646,7 @@ def dump_hierarchy_to_file(fname=""): location["vtkGL2PSExporter"] = "vtkIOExportGL2PS" -as_strings = [ +for name in [ "vtkBYUReader", "vtkFacetWriter", "vtkOBJReader", @@ -671,11 +654,10 @@ def dump_hierarchy_to_file(fname=""): "vtkParticleReader", "vtkSTLReader", "vtkSTLWriter", -] -for name in as_strings: +]: location[name] = "vtkIOGeometry" -as_strings = [ +for name in [ "vtkBMPReader", "vtkBMPWriter", "vtkDEMReader", @@ -693,15 +675,14 @@ def dump_hierarchy_to_file(fname=""): "vtkSLCReader", "vtkTIFFReader", "vtkTIFFWriter", -] -for name in as_strings: +]: location[name] = "vtkIOImage" location["vtk3DSImporter"] = "vtkIOImport" location["vtkOBJImporter"] = "vtkIOImport" location["vtkVRMLImporter"] = "vtkIOImport" -as_strings = [ +for name in [ "vtkSimplePointsWriter", "vtkStructuredGridReader", "vtkStructuredPointsReader", @@ -710,15 +691,14 @@ def dump_hierarchy_to_file(fname=""): "vtkPolyDataWriter", "vtkRectilinearGridReader", "vtkUnstructuredGridReader", -] -for name in as_strings: +]: location[name] = "vtkIOLegacy" location["vtkPLYReader"] = "vtkIOPLY" location["vtkPLYWriter"] = "vtkIOPLY" -as_strings = [ +for name in [ "vtkXMLGenericDataObjectReader", "vtkXMLImageDataReader", "vtkXMLImageDataWriter", @@ -732,8 +712,7 @@ def dump_hierarchy_to_file(fname=""): "vtkXMLStructuredGridReader", "vtkXMLUnstructuredGridReader", "vtkXMLUnstructuredGridWriter", -] -for name in as_strings: +]: location[name] = "vtkIOXML" @@ -761,7 +740,7 @@ def dump_hierarchy_to_file(fname=""): vtkImageThreshold, vtkImageTranslateExtent, ) -as_strings = [ +for name in [ "vtkImageAppendComponents", "vtkImageBlend", "vtkImageCast", @@ -776,8 +755,7 @@ def dump_hierarchy_to_file(fname=""): "vtkImageReslice", "vtkImageThreshold", "vtkImageTranslateExtent", -] -for name in as_strings: +]: location[name] = "vtkImagingCore" from vtkmodules.vtkImagingFourier import ( @@ -787,14 +765,13 @@ def dump_hierarchy_to_file(fname=""): vtkImageFourierCenter, vtkImageRFFT, ) -as_strings = [ +for name in [ "vtkImageButterworthHighPass", "vtkImageButterworthLowPass", "vtkImageFFT", "vtkImageFourierCenter", "vtkImageRFFT", -] -for name in as_strings: +]: location[name] = "vtkImagingFourier" from vtkmodules.vtkImagingGeneral import ( @@ -807,7 +784,7 @@ def dump_hierarchy_to_file(fname=""): vtkImageMedian3D, vtkImageNormalize, ) -as_strings = [ +for name in [ "vtkImageCorrelation", "vtkImageEuclideanDistance", "vtkImageGaussianSmooth", @@ -816,13 +793,11 @@ def dump_hierarchy_to_file(fname=""): "vtkImageLaplacian", "vtkImageMedian3D", "vtkImageNormalize", -] -for name in as_strings: +]: location[name] = "vtkImagingGeneral" from vtkmodules.vtkImagingHybrid import vtkImageToPoints, vtkSampleFunction -as_strings = ["vtkImageToPoints", "vtkSampleFunction"] -for name in as_strings: +for name in ["vtkImageToPoints", "vtkSampleFunction"]: location[name] = "vtkImagingHybrid" from vtkmodules.vtkImagingMath import ( @@ -832,28 +807,26 @@ def dump_hierarchy_to_file(fname=""): vtkImageMagnitude, vtkImageMathematics, ) -as_strings = [ +for name in [ "vtkImageDivergence", "vtkImageDotProduct", "vtkImageLogarithmicScale", "vtkImageMagnitude", "vtkImageMathematics", -] -for name in as_strings: +]: location[name] = "vtkImagingMath" -as_strings = [ +for name in [ "vtkImageContinuousDilate3D", "vtkImageContinuousErode3D", -] -for name in as_strings: +]: location[name] = "vtkImagingMorphological" location["vtkImageCanvasSource2D"] = "vtkImagingSources" location["vtkImageStencil"] = "vtkImagingStencil" -as_strings = [ +for name in [ "vtkCircularLayoutStrategy", "vtkClustering2DLayoutStrategy", "vtkConeLayoutStrategy", @@ -863,11 +836,10 @@ def dump_hierarchy_to_file(fname=""): "vtkSimple2DLayoutStrategy", "vtkSimple3DCirclesStrategy", "vtkSpanTreeLayoutStrategy", -] -for name in as_strings: +]: location[name] = "vtkInfovisLayout" -as_strings = [ +for name in [ "vtkInteractorStyleFlight", "vtkInteractorStyleImage", "vtkInteractorStyleJoystickActor", @@ -880,8 +852,7 @@ def dump_hierarchy_to_file(fname=""): "vtkInteractorStyleTrackballCamera", "vtkInteractorStyleUnicam", "vtkInteractorStyleUser", -] -for name in as_strings: +]: location[name] = "vtkInteractionStyle" from vtkmodules.vtkInteractionWidgets import ( @@ -900,7 +871,7 @@ def dump_hierarchy_to_file(fname=""): vtkSliderWidget, vtkSphereWidget, ) -as_strings = [ +for name in [ "vtkBalloonRepresentation", "vtkBalloonWidget", "vtkBoxWidget", @@ -915,8 +886,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSliderRepresentation3D", "vtkSliderWidget", "vtkSphereWidget", -] -for name in as_strings: +]: location[name] = "vtkInteractionWidgets" location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" @@ -935,7 +905,7 @@ def dump_hierarchy_to_file(fname=""): vtkScalarBarActor, vtkXYPlotActor, ) -as_strings = [ +for name in [ "vtkAnnotatedCubeActor", "vtkAxesActor", "vtkAxisActor2D", @@ -947,8 +917,7 @@ def dump_hierarchy_to_file(fname=""): "vtkPolarAxesActor", "vtkScalarBarActor", "vtkXYPlotActor", -] -for name in as_strings: +]: location[name] = "vtkRenderingAnnotation" @@ -980,7 +949,6 @@ def dump_hierarchy_to_file(fname=""): vtkPolyDataMapper, vtkPolyDataMapper2D, vtkProp, - vtkProp3D, vtkPropAssembly, vtkPropCollection, vtkPropPicker, @@ -1000,7 +968,7 @@ def dump_hierarchy_to_file(fname=""): vtkVolumeProperty, vtkWindowToImageFilter, ) -as_strings = [ +for name in [ "vtkActor", "vtkActor2D", "vtkAreaPicker", @@ -1047,8 +1015,7 @@ def dump_hierarchy_to_file(fname=""): "vtkVolume", "vtkVolumeProperty", "vtkWindowToImageFilter", -] -for name in as_strings: +]: location[name] = "vtkRenderingCore" location["vtkVectorText"] = "vtkRenderingFreeType" @@ -1073,7 +1040,7 @@ def dump_hierarchy_to_file(fname=""): vtkTranslucentPass, vtkVolumetricPass, ) -as_strings = [ +for name in [ "vtkDepthOfFieldPass", "vtkCameraPass", "vtkDualDepthPeelingPass", @@ -1088,8 +1055,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShadowMapPass", "vtkTranslucentPass", "vtkVolumetricPass", -] -for name in as_strings: +]: location[name] = "vtkRenderingOpenGL2" from vtkmodules.vtkRenderingVolume import ( @@ -1099,28 +1065,25 @@ def dump_hierarchy_to_file(fname=""): vtkUnstructuredGridVolumeRayCastMapper, vtkUnstructuredGridVolumeZSweepMapper, ) -as_strings = [ +for name in [ "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", "vtkProjectedTetrahedraMapper", "vtkUnstructuredGridVolumeRayCastMapper", "vtkUnstructuredGridVolumeZSweepMapper", -] -for name in as_strings: +]: location[name] = "vtkRenderingVolume" from vtkmodules.vtkRenderingVolumeOpenGL2 import ( vtkOpenGLGPUVolumeRayCastMapper, vtkSmartVolumeMapper, ) -as_strings = [ +for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", -] -for name in as_strings: +]: location[name] = "vtkRenderingVolumeOpenGL2" ######################################################### # print("successfully finished importing vtkmodules") -del as_strings -del name +######################################################### \ No newline at end of file From ce3e651a1f731bbe6e8c04e60c547fbdb856fca8 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 20:30:42 +0200 Subject: [PATCH 160/251] aggressive substitution to vtk.get() --- vedo/pointcloud.py | 124 ++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index b70da6b1..a5205797 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -58,7 +58,7 @@ def merge(*meshs, flag=False): return None idarr = [] - polyapp = vtk.vtkAppendPolyData() + polyapp = vtk.get("AppendPolyData")() for i, ob in enumerate(objs): polyapp.AddInputData(ob.dataset) if flag: @@ -782,7 +782,7 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): flip all normals """ poly = self.dataset - pcan = vtk.vtkPCANormalEstimation() + pcan = vtk.get("PCANormalEstimation")() pcan.SetInputData(poly) pcan.SetSampleSize(n) @@ -869,7 +869,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): poly1 = self.dataset poly2 = pcloud.dataset - df = vtk.vtkDistancePolyDataFilter() + df = vtk.get("DistancePolyDataFilter")() df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) df.SetInputData(1, poly2) @@ -885,7 +885,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") if not pcloud.point_locator: - pcloud.point_locator = vtk.vtkPointLocator() + pcloud.point_locator = vtk.get("PointLocator")() pcloud.point_locator.SetDataSet(pcloud) pcloud.point_locator.BuildLocator() @@ -919,7 +919,7 @@ def clean(self): """ Clean pointcloud or mesh by removing coincident points. """ - cpd = vtk.vtkCleanPolyData() + cpd = vtk.get("CleanPolyData")() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -956,7 +956,7 @@ def subsample(self, fraction, absolute=False): if fraction <= 0: return self - cpd = vtk.vtkCleanPolyData() + cpd = vtk.get("CleanPolyData")() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -998,7 +998,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): Examples: - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ - thres = vtk.vtkThreshold() + thres = vtk.get("Threshold")() thres.SetInputData(self.dataset) if on.startswith("c"): @@ -1028,7 +1028,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): thres.Update() - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(thres.GetOutput()) gf.Update() self._update(gf.GetOutput()) @@ -1040,7 +1040,7 @@ def quantize(self, value): The user should input a value and all {x,y,z} coordinates will be quantized to that absolute grain size. """ - qp = vtk.vtkQuantizePolyDataPoints() + qp = vtk.get("QuantizePolyDataPoints")() qp.SetInputData(self.dataset) qp.SetQFactor(value) qp.Update() @@ -1084,7 +1084,7 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F ![](https://vedo.embl.es/images/basic/align2.png) """ - icp = vtk.vtkIterativeClosestPointTransform() + icp = vtk.get("IterativeClosestPointTransform")() icp.SetSource(self.dataset) icp.SetTarget(target.dataset) if invert: @@ -1281,7 +1281,7 @@ def mirror(self, axis="x", origin=True): def flip_normals(self): """Flip all normals.""" - rs = vtk.vtkReverseSense() + rs = vtk.get("ReverseSense")() rs.SetInputData(self.dataset) rs.ReverseCellsOff() rs.ReverseNormalsOn() @@ -1352,7 +1352,7 @@ def closest_point( poly = None if not self.point_locator: poly = self.dataset - self.point_locator = vtk.vtkStaticPointLocator() + self.point_locator = vtk.get("StaticPointLocator")() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() @@ -1393,9 +1393,9 @@ def closest_point( # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 if vedo.vtk_version[0] >= 9 and vedo.vtk_version[1] > 0: - self.cell_locator = vtk.vtkStaticCellLocator() + self.cell_locator = vtk.get("StaticCellLocator")() else: - self.cell_locator = vtk.vtkCellLocator() + self.cell_locator = vtk.get("CellLocator")() self.cell_locator.SetDataSet(poly) self.cell_locator.BuildLocator() @@ -1441,7 +1441,7 @@ def hausdorff_distance(self, points): ``` ![](https://vedo.embl.es/images/feats/heart.png) """ - hp = vtk.vtkHausdorffDistancePointSetFilter() + hp = vtk.get("HausdorffDistancePointSetFilter")() hp.SetInputData(0, self.dataset) hp.SetInputData(1, points.dataset) hp.SetTargetDistanceMethodToPointToCell() @@ -1465,11 +1465,11 @@ def chamfer_distance(self, pcloud): """ # Definition of Chamfer distance may vary, here we use the average if not pcloud.point_locator: - pcloud.point_locator = vtk.vtkPointLocator() + pcloud.point_locator = vtk.get("PointLocator")() pcloud.point_locator.SetDataSet(pcloud.dataset) pcloud.point_locator.BuildLocator() if not self.point_locator: - self.point_locator = vtk.vtkPointLocator() + self.point_locator = vtk.get("PointLocator")() self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() @@ -1507,7 +1507,7 @@ def remove_outliers(self, radius, neighbors=5): ![](https://vedo.embl.es/images/basic/clustering.png) """ - removal = vtk.vtkRadiusOutlierRemoval() + removal = vtk.get("RadiusOutlierRemoval")() removal.SetInputData(self.dataset) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) @@ -1893,7 +1893,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): plane.SetOrigin(origin) plane.SetNormal(normal) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() @@ -1930,7 +1930,7 @@ def cut_with_planes(self, origins, normals, invert=False): planes.SetPoints(vpoints) planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) # must be True clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) @@ -1970,14 +1970,14 @@ def cut_with_box(self, bounds, invert=False): if isinstance(bounds, Points): bounds = bounds.bounds() - box = vtk.vtkBox() + box = vtk.get("Box")() if utils.is_sequence(bounds[0]): for bs in bounds: box.AddBounds(bs) else: box.SetBounds(bounds) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) @@ -1999,7 +1999,7 @@ def cut_with_line(self, points, invert=False, closed=True): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ - pplane = vtk.vtkPolyPlane() + pplane = vtk.get("PolyPlane")() if isinstance(points, Points): points = points.vertices.tolist() @@ -2015,14 +2015,14 @@ def cut_with_line(self, points, invert=False, closed=True): vpoints.InsertNextPoint(p) n = len(points) - polyline = vtk.vtkPolyLine() + polyline = vtk.get("PolyLine")() polyline.Initialize(n, vpoints) polyline.GetPointIds().SetNumberOfIds(n) for i in range(n): polyline.GetPointIds().SetId(i, i) pplane.SetPolyLine(polyline) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) @@ -2084,19 +2084,19 @@ def cut_with_cookiecutter(self, lines): poly = lines # if invert: # not working - # rev = vtk.vtkReverseSense() + # rev = vtk.get("ReverseSense")() # rev.ReverseCellsOn() # rev.SetInputData(poly) # rev.Update() # poly = rev.GetOutput() # Build loops from the polyline - build_loops = vtk.vtkContourLoopExtraction() + build_loops = vtk.get("ContourLoopExtraction")() build_loops.SetInputData(poly) build_loops.Update() boundaryPoly = build_loops.GetOutput() - ccut = vtk.vtkCookieCutter() + ccut = vtk.get("CookieCutter")() ccut.SetInputData(self.dataset) ccut.SetLoopsData(boundaryPoly) ccut.SetPointInterpolationToMeshEdges() @@ -2145,12 +2145,12 @@ def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) axis = (0, 1, 0) elif "z" in s: axis = (0, 0, 1) - cyl = vtk.vtkCylinder() + cyl = vtk.get("Cylinder")() cyl.SetCenter(center) cyl.SetAxis(axis[0], axis[1], axis[2]) cyl.SetRadius(r) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) @@ -2187,11 +2187,11 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ - sph = vtk.vtkSphere() + sph = vtk.get("Sphere")() sph.SetCenter(center) sph.SetRadius(r) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) @@ -2236,7 +2236,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): signed_distances.SetName("SignedDistances") # implicit function that will be used to slice the mesh - ippd = vtk.vtkImplicitPolyDataDistance() + ippd = vtk.get("ImplicitPolyDataDistance")() ippd.SetInput(polymesh) # Evaluate the signed distance function at all of the grid points @@ -2252,7 +2252,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): poly.GetPointData().AddArray(signed_distances) poly.GetPointData().SetActiveScalars("SignedDistances") - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(poly) clipper.SetInsideOut(not invert) clipper.SetGenerateClippedOutput(keep) @@ -2321,22 +2321,22 @@ def cut_with_point_loop( vpts.InsertNextPoint(p) if "cell" in on: - ippd = vtk.vtkImplicitSelectionLoop() + ippd = vtk.get("ImplicitSelectionLoop")() ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() - clipper = vtk.vtkExtractPolyDataGeometry() + clipper = vtk.get("ExtractPolyDataGeometry")() clipper.SetInputData(self.dataset) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) else: - spol = vtk.vtkSelectPolyData() + spol = vtk.get("SelectPolyData")() spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() spol.SetInputData(self.dataset) spol.Update() - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(spol.GetOutput()) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) @@ -2374,7 +2374,7 @@ def cut_with_scalar(self, value, name="", invert=False): """ if name: self.pointdata.select(name) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetValue(value) clipper.GenerateClippedOutputOff() @@ -2412,7 +2412,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No ``` ![](https://user-images.githubusercontent.com/32848391/57081955-0ef1e800-6cf6-11e9-99de-b45220939bc9.png) """ - cu = vtk.vtkBox() + cu = vtk.get("Box")() pos = np.array(self.pos()) x0, x1, y0, y1, z0, z1 = self.bounds() x0, y0, z0 = [x0, y0, z0] - pos @@ -2435,7 +2435,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No cu.SetBounds(bounds) - clipper = vtk.vtkClipPolyData() + clipper = vtk.get("ClipPolyData")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(cu) clipper.InsideOutOn() @@ -2475,7 +2475,7 @@ def generate_surface_halo( imp.SetMaximumDistance(maxdist) if len(bounds) == 6: imp.SetModelBounds(bounds) - contour = vtk.vtkContourFilter() + contour = vtk.get("ContourFilter")() contour.SetInputConnection(imp.GetOutputPort()) contour.SetValue(0, distance) contour.Update() @@ -2657,7 +2657,7 @@ def reconstruct_surface( if not utils.is_sequence(dims): dims = (dims, dims, dims) - sdf = vtk.vtkSignedDistance() + sdf = vtk.get("SignedDistance")() if len(bounds) == 6: sdf.SetBounds(bounds) @@ -2685,7 +2685,7 @@ def reconstruct_surface( if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) else: - normals = vtk.vtkPCANormalEstimation() + normals = vtk.get("PCANormalEstimation")() normals.SetInputData(pd) if not sample_size: sample_size = int(pd.GetNumberOfPoints() / 50) @@ -2702,7 +2702,7 @@ def reconstruct_surface( sdf.SetDimensions(dims) sdf.Update() - surface = vtk.vtkExtractSurface() + surface = vtk.get("ExtractSurface")() surface.SetRadius(radius * 0.99) surface.SetHoleFilling(hole_filling) surface.ComputeNormalsOff() @@ -2729,7 +2729,7 @@ def compute_clustering(self, radius): ![](https://vedo.embl.es/images/basic/clustering.png) """ - cluster = vtk.vtkEuclideanClusterExtraction() + cluster = vtk.get("EuclideanClusterExtraction")() cluster.SetInputData(self.dataset) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) @@ -2790,7 +2790,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( within this angle threshold (expressed in degrees). """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html - cpf = vtk.vtkConnectedPointsFilter() + cpf = vtk.get("ConnectedPointsFilter")() cpf.SetInputData(self.dataset) cpf.SetRadius(radius) if mode == 0: # Extract all regions @@ -2833,7 +2833,7 @@ def compute_camera_distance(self): """ if vedo.plotter_instance.renderer: poly = self.dataset - dc = vtk.vtkDistanceToCamera() + dc = vtk.get("DistanceToCamera")() dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() @@ -2867,7 +2867,7 @@ def density( ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ - pdf = vtk.vtkPointDensityFilter() + pdf = vtk.get("PointDensityFilter")() pdf.SetInputData(self.dataset) if not utils.is_sequence(dims): @@ -2941,7 +2941,7 @@ def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=No It is also recommended that a N closest neighborhood is used. """ - src = vtk.vtkProgrammableSource() + src = vtk.get("ProgrammableSource")() opts = self.vertices def _read_points(): @@ -2953,7 +2953,7 @@ def _read_points(): src.SetExecuteMethod(_read_points) - dens = vtk.vtkDensifyPointCloudFilter() + dens = vtk.get("DensifyPointCloudFilter")() dens.SetInputConnection(src.GetOutputPort()) dens.InterpolateAttributeDataOn() dens.SetTargetDistance(target_distance) @@ -3011,7 +3011,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu bounds = self.bounds() if maxradius is None: maxradius = self.diagonal_size() / 2 - dist = vtk.vtkSignedDistance() + dist = vtk.get("SignedDistance")() dist.SetInputData(self.dataset) dist.SetRadius(maxradius) dist.SetBounds(bounds) @@ -3019,7 +3019,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu dist.Update() img = dist.GetOutput() if invert: - mat = vtk.vtkImageMathematics() + mat = vtk.get("ImageMathematics")() mat.SetInput1Data(img) mat.SetOperationToMultiplyByK() mat.SetConstantK(-1) @@ -3089,17 +3089,17 @@ def tovolume( ) if not self.point_locator: - self.point_locator = vtk.vtkPointLocator() + self.point_locator = vtk.get("PointLocator")() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() if kernel == "shepard": - kern = vtk.vtkShepardKernel() + kern = vtk.get("ShepardKernel")() kern.SetPowerParameter(2) elif kernel == "gaussian": - kern = vtk.vtkGaussianKernel() + kern = vtk.get("GaussianKernel")() elif kernel == "linear": - kern = vtk.vtkLinearKernel() + kern = vtk.get("LinearKernel")() else: vedo.logger.error("Error in tovolume(), available kernels are:") vedo.logger.error(" [shepard, gaussian, linear]") @@ -3108,7 +3108,7 @@ def tovolume( if radius: kern.SetRadius(radius) - interpolator = vtk.vtkPointInterpolator() + interpolator = vtk.get("PointInterpolator")() interpolator.SetInputData(probe) interpolator.SetSourceData(poly) interpolator.SetKernel(kern) @@ -3138,7 +3138,7 @@ def tovolume( def generate_random_data(self): """Fill a dataset with random attributes""" - gen = vtk.vtkRandomAttributeGenerator() + gen = vtk.get("RandomAttributeGenerator")() gen.SetInputData(self.dataset) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() @@ -3205,7 +3205,7 @@ def generate_delaunay2d( vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) pd.SetPoints(vpts) - delny = vtk.vtkDelaunay2D() + delny = vtk.get("Delaunay2D")() delny.SetInputData(pd) if tol: delny.SetTolerance(tol) @@ -3311,7 +3311,7 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.locator = None elif method == "vtk": - vor = vtk.vtkVoronoi2D() + vor = vtk.get("Voronoi2D")() if isinstance(pts, Points): vor.SetInputData(pts) else: @@ -3381,7 +3381,7 @@ def visible_points(self, area=(), tol=None, invert=False): ``` ![](https://vedo.embl.es/images/feats/visible_points.png) """ - svp = vtk.vtkSelectVisiblePoints() + svp = vtk.get("SelectVisiblePoints")() svp.SetInputData(self.dataset) ren = None From 25743cf56a91390a3864799c6183794958e375c1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 20:42:51 +0200 Subject: [PATCH 161/251] aggressive substitution to vtk.get() mesh.py --- vedo/mesh.py | 142 +++++++++++++++++++++++++-------------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index 1ae0a51e..ee609211 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -87,7 +87,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): self.filename = inputobj elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() @@ -120,7 +120,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): else: try: - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() @@ -241,7 +241,7 @@ def edges(self): """ Return an array containing the edges connectivity. """ - extractEdges = vtk.vtkExtractEdges() + extractEdges = vtk.get("ExtractEdges")() extractEdges.SetInputData(self.dataset) # eed.UseAllPointsOn() extractEdges.Update() @@ -501,7 +501,7 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ - pdnorm = vtk.vtkPolyDataNormals() + pdnorm = vtk.get("PolyDataNormals")() pdnorm.SetInputData(self.dataset) pdnorm.SetComputePointNormals(points) pdnorm.SetComputeCellNormals(cells) @@ -538,7 +538,7 @@ def reverse(self, cells=True, normals=False): poly.GetCellData().Modified() return self ############## - rev = vtk.vtkReverseSense() + rev = vtk.get("ReverseSense")() if cells: rev.ReverseCellsOn() else: @@ -555,7 +555,7 @@ def reverse(self, cells=True, normals=False): def volume(self): """Get/set the volume occupied by mesh.""" - mass = vtk.vtkMassProperties() + mass = vtk.get("MassProperties")() mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() @@ -567,7 +567,7 @@ def area(self): The mesh must be triangular for this to work. See also `mesh.triangulate()`. """ - mass = vtk.vtkMassProperties() + mass = vtk.get("MassProperties")() mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() @@ -575,7 +575,7 @@ def area(self): def is_closed(self): """Return `True` if the mesh is watertight.""" - fe = vtk.vtkFeatureEdges() + fe = vtk.get("FeatureEdges")() fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() @@ -586,7 +586,7 @@ def is_closed(self): def is_manifold(self): """Return `True` if the mesh is manifold.""" - fe = vtk.vtkFeatureEdges() + fe = vtk.get("FeatureEdges")() fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() @@ -690,7 +690,7 @@ def shrink(self, fraction=0.85): ![](https://vedo.embl.es/images/basic/shrink.png) """ # Overriding base class method core.shrink() - shrink = vtk.vtkShrinkPolyData() + shrink = vtk.get("ShrinkPolyData")() shrink.SetInputData(self.dataset) shrink.SetShrinkFactor(fraction) shrink.Update() @@ -748,7 +748,7 @@ def cap(self, return_cap=False): See also: `join()`, `join_segments()`, `slice()`. """ - fe = vtk.vtkFeatureEdges() + fe = vtk.get("FeatureEdges")() fe.SetInputData(self.dataset) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() @@ -756,7 +756,7 @@ def cap(self, return_cap=False): fe.ManifoldEdgesOff() fe.Update() - stripper = vtk.vtkStripper() + stripper = vtk.get("Stripper")() stripper.SetInputData(fe.GetOutput()) stripper.JoinContiguousSegmentsOn() stripper.Update() @@ -765,12 +765,12 @@ def cap(self, return_cap=False): boundary_poly.SetPoints(stripper.GetOutput().GetPoints()) boundary_poly.SetPolys(stripper.GetOutput().GetLines()) - rev = vtk.vtkReverseSense() + rev = vtk.get("ReverseSense")() rev.ReverseCellsOn() rev.SetInputData(boundary_poly) rev.Update() - tf = vtk.vtkTriangleFilter() + tf = vtk.get("TriangleFilter")() tf.SetInputData(rev.GetOutput()) tf.Update() @@ -781,7 +781,7 @@ def cap(self, return_cap=False): ) return m - polyapp = vtk.vtkAppendPolyData() + polyapp = vtk.get("AppendPolyData")() polyapp.AddInputData(self.dataset) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() @@ -832,7 +832,7 @@ def join(self, polys=True, reset=False): ``` ![](https://vedo.embl.es/images/feats/line_join.png) """ - sf = vtk.vtkStripper() + sf = vtk.get("Stripper")() sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) @@ -840,7 +840,7 @@ def join(self, polys=True, reset=False): sf.Update() if reset: poly = sf.GetOutput() - cpd = vtk.vtkCleanPolyData() + cpd = vtk.get("CleanPolyData")() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -974,13 +974,13 @@ def triangulate(self, verts=True, lines=True): """ if self.dataset.GetNumberOfPolys() or self.dataset.GetNumberOfStrips(): # print("vtkTriangleFilter") - tf = vtk.vtkTriangleFilter() + tf = vtk.get("TriangleFilter")() tf.SetPassLines(lines) tf.SetPassVerts(verts) elif self.dataset.GetNumberOfLines(): # print("vtkContourTriangulator") - tf = vtk.vtkContourTriangulator() + tf = vtk.get("ContourTriangulator")() tf.TriangulationErrorDisplayOn() else: @@ -1070,7 +1070,7 @@ def compute_quality(self, metric=6): def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" - vc = vtk.vtkCountVertices() + vc = vtk.get("CountVertices")() vc.SetInputData(self.dataset) vc.SetOutputArrayName("VertexCount") vc.Update() @@ -1093,7 +1093,7 @@ def check_validity(self, tol=0): value is used as an epsilon for floating point equality checks throughout the cell checking process. """ - vald = vtk.vtkCellValidator() + vald = vtk.get("CellValidator")() if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) @@ -1118,7 +1118,7 @@ def compute_curvature(self, method=0): ``` ![](https://user-images.githubusercontent.com/32848391/51934810-c2e88c00-2404-11e9-8e7e-ca0b7984bbb7.png) """ - curve = vtk.vtkCurvatures() + curve = vtk.get("Curvatures")() curve.SetInputData(self.dataset) curve.SetCurvatureType(method) curve.Update() @@ -1146,7 +1146,7 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ``` ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ - ef = vtk.vtkElevationFilter() + ef = vtk.get("ElevationFilter")() ef.SetInputData(self.dataset) ef.SetLowPoint(low) ef.SetHighPoint(high) @@ -1168,23 +1168,23 @@ def subdivide(self, n=1, method=0, mel=None): mel : (float) Maximum Edge Length (applicable to Adaptive method only). """ - triangles = vtk.vtkTriangleFilter() + triangles = vtk.get("TriangleFilter")() triangles.SetInputData(self.dataset) triangles.Update() tri_mesh = triangles.GetOutput() if method == 0: - sdf = vtk.vtkLoopSubdivisionFilter() + sdf = vtk.get("LoopSubdivisionFilter")() elif method == 1: - sdf = vtk.vtkLinearSubdivisionFilter() + sdf = vtk.get("LinearSubdivisionFilter")() elif method == 2: - sdf = vtk.vtkAdaptiveSubdivisionFilter() + sdf = vtk.get("AdaptiveSubdivisionFilter")() if mel is None: mel = self.diagonal_size() / np.sqrt(self.dataset.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: - sdf = vtk.vtkButterflySubdivisionFilter() + sdf = vtk.get("ButterflySubdivisionFilter")() elif method == 4: - sdf = vtk.vtkDensifyPolyData() + sdf = vtk.get("DensifyPolyData")() else: vedo.logger.error(f"in subdivide() unknown method {method}") raise RuntimeError() @@ -1231,11 +1231,11 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): return self if "quad" in method: - decimate = vtk.vtkQuadricDecimation() + decimate = vtk.get("QuadricDecimation")() # decimate.SetVolumePreservation(True) else: - decimate = vtk.vtkDecimatePro() + decimate = vtk.get("DecimatePro")() decimate.PreserveTopologyOn() if boundaries: decimate.BoundaryVertexDeletionOff() @@ -1329,10 +1329,10 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ - cl = vtk.vtkCleanPolyData() + cl = vtk.get("CleanPolyData")() cl.SetInputData(self.dataset) cl.Update() - smf = vtk.vtkWindowedSincPolyDataFilter() + smf = vtk.get("WindowedSincPolyDataFilter")() smf.SetInputData(cl.GetOutput()) smf.SetNumberOfIterations(niter) smf.SetEdgeAngle(edge_angle) @@ -1364,7 +1364,7 @@ def fill_holes(self, size=None): Examples: - [fillholes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fillholes.py) """ - fh = vtk.vtkFillHolesFilter() + fh = vtk.get("FillHolesFilter")() if not size: mb = self.diagonal_size() size = mb / 10 @@ -1401,7 +1401,7 @@ def contains(self, point, tol=1e-05): points.InsertNextPoint(point) poly = vtk.vtkPolyData() poly.SetPoints(points) - sep = vtk.vtkSelectEnclosedPoints() + sep = vtk.get("SelectEnclosedPoints")() sep.SetTolerance(tol) sep.CheckSurfaceOff() sep.SetInputData(poly) @@ -1434,8 +1434,8 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): poly = vtk.vtkPolyData() poly.SetPoints(vpoints) - sep = vtk.vtkSelectEnclosedPoints() - # sep = vtk.vtkExtractEnclosedPoints() + sep = vtk.get("SelectEnclosedPoints")() + # sep = vtk.get("ExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(poly) sep.SetSurfaceData(self.dataset) @@ -1499,7 +1499,7 @@ def boundaries( ![](https://vedo.embl.es/images/basic/boundaries.png) """ - fe = vtk.vtkFeatureEdges() + fe = vtk.get("FeatureEdges")() fe.SetBoundaryEdges(boundary_edges) fe.SetNonManifoldEdges(non_manifold_edges) fe.SetManifoldEdges(manifold_edges) @@ -1514,7 +1514,7 @@ def boundaries( fe.SetFeatureAngle(feature_angle) if return_point_ids or return_cell_ids: - idf = vtk.vtkIdFilter() + idf = vtk.get("IdFilter")() idf.SetInputData(self.dataset) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) @@ -1581,15 +1581,15 @@ def imprint(self, loopline, tol=0.01): ``` ![](https://vedo.embl.es/images/feats/imprint.png) """ - loop = vtk.vtkContourLoopExtraction() + loop = vtk.get("ContourLoopExtraction")() loop.SetInputData(loopline) loop.Update() - clean_loop = vtk.vtkCleanPolyData() + clean_loop = vtk.get("CleanPolyData")() clean_loop.SetInputData(loop.GetOutput()) clean_loop.Update() - imp = vtk.vtkImprintFilter() + imp = vtk.get("ImprintFilter")() imp.SetTargetData(self.dataset) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) @@ -1637,9 +1637,9 @@ def extract_cells(self, ids): """ Extract a subset of cells from a mesh and return it as a new mesh. """ - selectCells = vtk.vtkSelectionNode() - selectCells.SetFieldType(vtk.vtkSelectionNode.CELL) - selectCells.SetContentType(vtk.vtkSelectionNode.INDICES) + selectCells = vtk.get("SelectionNode")() + selectCells.SetFieldType(vtk.get("SelectionNode").CELL) + selectCells.SetContentType(vtk.get("SelectionNode").INDICES) idarr = vtk.vtkIdTypeArray() idarr.SetNumberOfComponents(1) idarr.SetNumberOfValues(len(ids)) @@ -1647,15 +1647,15 @@ def extract_cells(self, ids): idarr.SetValue(i, v) selectCells.SetSelectionList(idarr) - selection = vtk.vtkSelection() + selection = vtk.get("Selection")() selection.AddNode(selectCells) - extractSelection = vtk.vtkExtractSelection() + extractSelection = vtk.get("ExtractSelection")() extractSelection.SetInputData(0, self.dataset) extractSelection.SetInputData(1, selection) extractSelection.Update() - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(extractSelection.GetOutput()) gf.Update() msh = Mesh(gf.GetOutput()) @@ -1680,17 +1680,17 @@ def connected_cells(self, index, return_ids=False): if return_ids: return rids - selection_node = vtk.vtkSelectionNode() - selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) - selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) + selection_node = vtk.get("SelectionNode")() + selection_node.SetFieldType(vtk.get("SelectionNode").CELL) + selection_node.SetContentType(vtk.get("SelectionNode").INDICES) selection_node.SetSelectionList(ids) - selection = vtk.vtkSelection() + selection = vtk.get("Selection")() selection.AddNode(selection_node) - extractSelection = vtk.vtkExtractSelection() + extractSelection = vtk.get("ExtractSelection")() extractSelection.SetInputData(0, dpoly) extractSelection.SetInputData(1, selection) extractSelection.Update() - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(extractSelection.GetOutput()) gf.Update() return Mesh(gf.GetOutput()).lw(1) @@ -1801,7 +1801,7 @@ def isobands(self, n=10, vmin=None, vmax=None): for i in range(values.GetNumberOfTuples()): lut.SetAnnotation(i, values.GetValue(i).ToString()) - bcf = vtk.vtkBandedPolyDataContourFilter() + bcf = vtk.get("BandedPolyDataContourFilter")() bcf.SetInputData(self.dataset) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): @@ -1841,7 +1841,7 @@ def isolines(self, n=10, vmin=None, vmax=None): ![](https://vedo.embl.es/images/pyplot/isolines.png) """ - bcf = vtk.vtkContourFilter() + bcf = vtk.get("ContourFilter")() bcf.SetInputData(self.dataset) r0, r1 = self.dataset.GetScalarRange() if vmin is None: @@ -1850,11 +1850,11 @@ def isolines(self, n=10, vmin=None, vmax=None): vmax = r1 bcf.GenerateValues(n, vmin, vmax) bcf.Update() - sf = vtk.vtkStripper() + sf = vtk.get("Stripper")() sf.SetJoinContiguousSegments(True) sf.SetInputData(bcf.GetOutput()) sf.Update() - cl = vtk.vtkCleanPolyData() + cl = vtk.get("CleanPolyData")() cl.SetInputData(sf.GetOutput()) cl.Update() msh = Mesh(cl.GetOutput(), c="k").lighting("off") @@ -1894,7 +1894,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # ms = [] # todo # poly0 = self.clone().dataset # for i in range(len(zshift)-1): - # rf = vtk.vtkRotationalExtrusionFilter() + # rf = vtk.get("RotationalExtrusionFilter")() # rf.SetInputData(poly0) # rf.SetResolution(res) # rf.SetCapping(0) @@ -1905,8 +1905,8 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # poly1 = rf.GetOutput() raise NotImplementedError("todo") - rf = vtk.vtkRotationalExtrusionFilter() - # rf = vtk.vtkLinearExtrusionFilter() + rf = vtk.get("RotationalExtrusionFilter")() + # rf = vtk.get("LinearExtrusionFilter")() rf.SetInputData(self.dataset) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) @@ -1950,10 +1950,10 @@ def split( if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") return [self] - cf = vtk.vtkPolyDataEdgeConnectivityFilter() + cf = vtk.get("PolyDataEdgeConnectivityFilter")() cf.BarrierEdgesOff() else: - cf = vtk.vtkPolyDataConnectivityFilter() + cf = vtk.get("PolyDataConnectivityFilter")() cf.SetInputData(pd) cf.SetExtractionModeToAllRegions() @@ -2012,7 +2012,7 @@ def extract_largest_region(self): Examples: - [largestregion.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/largestregion.py) """ - conn = vtk.vtkPolyDataConnectivityFilter() + conn = vtk.get("PolyDataConnectivityFilter")() conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() conn.SetInputData(self.dataset) @@ -2040,9 +2040,9 @@ def boolean(self, operation, mesh2, method=0, tol=None): ![](https://vedo.embl.es/images/basic/boolean.png) """ if method == 0: - bf = vtk.vtkBooleanOperationPolyDataFilter() + bf = vtk.get("BooleanOperationPolyDataFilter")() elif method == 1: - bf = vtk.vtkLoopBooleanPolyDataFilter() + bf = vtk.get("LoopBooleanPolyDataFilter")() else: raise ValueError(f"Unknown method={method}") @@ -2084,7 +2084,7 @@ def intersect_with(self, mesh2, tol=1e-06): ![](https://vedo.embl.es/images/basic/surfIntersect.png) """ - bf = vtk.vtkIntersectionPolyDataFilter() + bf = vtk.get("IntersectionPolyDataFilter")() bf.SetGlobalWarningDisplay(0) bf.SetTolerance(tol) bf.SetInputData(0, self.dataset) @@ -2160,7 +2160,7 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): ``` ![](https://vedo.embl.es/images/feats/intersect_plane.png) """ - plane = vtk.vtkPlane() + plane = vtk.get("Plane")() plane.SetOrigin(origin) plane.SetNormal(normal) @@ -2186,7 +2186,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): Collide this Mesh with the input surface. Information is stored in `ContactCells1` and `ContactCells2`. """ - ipdf = vtk.vtkCollisionDetectionFilter() + ipdf = vtk.get("CollisionDetectionFilter")() # ipdf.SetGlobalWarningDisplay(0) transform0 = vtk.vtkTransform() @@ -2249,7 +2249,7 @@ def geodesic(self, start, end): start = pa.closest_point(start, return_point_id=True) end = pa.closest_point(end, return_point_id=True) - dijkstra = vtk.vtkDijkstraGraphGeodesicPath() + dijkstra = vtk.get("DijkstraGraphGeodesicPath")() dijkstra.SetInputData(self.dataset) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) @@ -2401,7 +2401,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu img.SetOrigin(bounds[0], bounds[2], bounds[4]) img.AllocateScalars(vtk.VTK_FLOAT, 1) - imp = vtk.vtkImplicitPolyDataDistance() + imp = vtk.get("ImplicitPolyDataDistance")() imp.SetInput(self.dataset) b2 = bounds[2] b4 = bounds[4] From 11e19ac6eab9bb23a725047ea9f940ca7a586da7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 20:48:01 +0200 Subject: [PATCH 162/251] aggressive substitution to vtk.get() sddons.py --- vedo/addons.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index cfa9a839..9f077ddd 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1397,7 +1397,7 @@ def __init__( if value is None or value < xmin: value = xmin - slider_rep = vtk.vtkSliderRepresentation2D() + slider_rep = vtk.get("SliderRepresentation2D")() slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) @@ -1595,7 +1595,7 @@ def __init__( if value is None or value < xmin: value = xmin - slider_rep = vtk.vtkSliderRepresentation3D() + slider_rep = vtk.get("SliderRepresentation3D")() slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) @@ -1758,10 +1758,10 @@ def __init__( self._alpha = alpha self._keypress_id = None - self._implicit_func = vtk.vtkPlane() + self._implicit_func = vtk.get("Plane")() poly = mesh.dataset - self.clipper = vtk.vtkClipPolyData() + self.clipper = vtk.get("ClipPolyData")() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -1769,7 +1769,7 @@ def __init__( self.clipper.GenerateClippedOutputOn() self.clipper.Update() - self.widget = vtk.vtkImplicitPlaneWidget() + self.widget = vtk.get("ImplicitPlaneWidget")() # self.widget.KeyPressActivationOff() # self.widget.SetKeyPressActivationValue('i') @@ -1902,11 +1902,11 @@ def __init__( else: self._init_bounds = initial_bounds - self._implicit_func = vtk.vtkPlanes() + self._implicit_func = vtk.get("Planes")() self._implicit_func.SetBounds(self._init_bounds) poly = mesh.dataset - self.clipper = vtk.vtkClipPolyData() + self.clipper = vtk.get("ClipPolyData")() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -2012,7 +2012,7 @@ def __init__( self._alpha = alpha self._keypress_id = None - self._implicit_func = vtk.vtkSphere() + self._implicit_func = vtk.get("Sphere")() if len(origin) == 3: self._implicit_func.SetCenter(origin) @@ -2027,7 +2027,7 @@ def __init__( self._implicit_func.SetRadius(radius) poly = mesh.dataset - self.clipper = vtk.vtkClipPolyData() + self.clipper = vtk.get("ClipPolyData")() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -2127,9 +2127,9 @@ def __init__(self, c="k", alpha=None, lw=None, padding=None): pd.SetPoints(ppoints) pd.SetLines(lines) - mapper = vtk.vtkPolyDataMapper2D() + mapper = vtk.get("PolyDataMapper2D")() mapper.SetInputData(pd) - cs = vtk.vtkCoordinate() + cs = vtk.get("Coordinate")() cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) @@ -2181,7 +2181,7 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): pd.SetLines(lines) self._data = pd - mapper = vtk.vtkPolyDataMapper2D() + mapper = vtk.get("PolyDataMapper2D")() mapper.SetInputData(pd) cs = vtk.vtkCoordinate() cs.SetCoordinateSystemToNormalizedViewport() @@ -4211,7 +4211,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.widgets.append(icn) elif plt.axes == 5: - axact = vtk.vtkAnnotatedCubeActor() + axact = vtk.get("AnnotatedCubeActor")() axact.GetCubeProperty().SetColor(get_color(settings.annotated_cube_color)) axact.SetTextEdgesVisibility(0) axact.SetFaceTextScale(settings.annotated_cube_text_scale) @@ -4248,7 +4248,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.widgets.append(icn) elif plt.axes == 6: - ocf = vtk.vtkOutlineCornerFilter() + ocf = vtk.get("OutlineCornerFilter")() ocf.SetCornerFactor(0.1) largestact, sz = None, -1 for a in plt.objects: @@ -4273,7 +4273,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): return ocf.Update() - oc_mapper = vtk.vtkHierarchicalPolyDataMapper() + oc_mapper = vtk.get("HierarchicalPolyDataMapper")() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) oc_actor = vtk.vtkActor() oc_actor.SetMapper(oc_mapper) @@ -4300,7 +4300,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 8: vbb = compute_visible_bounds()[0] - ca = vtk.vtkCubeAxesActor() + ca = vtk.get("CubeAxesActor")() ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) ca.GetXAxesLinesProperty().SetColor(c) @@ -4321,7 +4321,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 9: vbb = compute_visible_bounds()[0] - src = vtk.vtkCubeSource() + src = vtk.get("CubeSource")() src.SetXLength(vbb[1] - vbb[0]) src.SetYLength(vbb[3] - vbb[2]) src.SetZLength(vbb[5] - vbb[4]) @@ -4363,7 +4363,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.add(gr) elif plt.axes == 12: - polaxes = vtk.vtkPolarAxesActor() + polaxes = vtk.get("PolarAxesActor")() vbb = compute_visible_bounds()[0] polaxes.SetPolarAxisTitle("radial distance") @@ -4395,7 +4395,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 13: # draws a simple ruler at the bottom of the window - ls = vtk.vtkLegendScaleActor() + ls = vtk.get("LegendScaleActor")() ls.RightAxisVisibilityOff() ls.TopAxisVisibilityOff() ls.LeftAxisVisibilityOff() From f79cdf7c9e8fd834341542d65f84c0c5280f88ed Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 20:49:16 +0200 Subject: [PATCH 163/251] aggressive substitution to vtk.get() applications.py --- vedo/applications.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vedo/applications.py b/vedo/applications.py index e271e28c..22be9a3a 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -472,7 +472,7 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): orig_volume = vol.clone(deep=False) self.volume = vol - self.volume.actor = vtk.vtkImageSlice() + self.volume.actor = vtk.get("ImageSlice")() self.volume.properties = self.volume.actor.GetProperty() self.volume.mapper = vtk.get("ImageResliceMapper")() From 109e3879fef0f3d0168f91552ad8dc59a5638c7e Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:01:28 +0200 Subject: [PATCH 164/251] aggressive substitution to vtk.get() shapes.py --- vedo/shapes.py | 148 ++++++++++++++++++++++++------------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/vedo/shapes.py b/vedo/shapes.py index ec7deac2..796bb444 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -333,18 +333,18 @@ def __init__( src = source.normalize() else: if "ellip" in source: - src = vtk.vtkSphereSource() + src = vtk.get("SphereSource")() src.SetPhiResolution(24) src.SetThetaResolution(12) elif "cyl" in source: - src = vtk.vtkCylinderSource() + src = vtk.get("CylinderSource")() src.SetResolution(48) src.CappingOn() elif source == "cube": - src = vtk.vtkCubeSource() + src = vtk.get("CubeSource")() src.Update() - tg = vtk.vtkTensorGlyph() + tg = vtk.get("TensorGlyph")() if isinstance(domain, vtk.vtkPolyData): tg.SetInputData(domain) else: @@ -373,7 +373,7 @@ def __init__( max_scale = scale * 10 tg.SetMaxScaleFactor(max_scale) tg.Update() - tgn = vtk.vtkPolyDataNormals() + tgn = vtk.get("PolyDataNormals")() tgn.SetInputData(tg.GetOutput()) tgn.Update() super().__init__(tgn.GetOutput(), c, alpha) @@ -445,7 +445,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): else: # or just 2 points to link - line_source = vtk.vtkLineSource() + line_source = vtk.get("LineSource")() p0 = utils.make3d(p0) p1 = utils.make3d(p1) line_source.SetPoint1(p0) @@ -820,12 +820,12 @@ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1 break qs.append(qi) - polylns = vtk.vtkAppendPolyData() + polylns = vtk.get("AppendPolyData")() for i, q1 in enumerate(qs): if not i % 2: continue q0 = qs[i - 1] - line_source = vtk.vtkLineSource() + line_source = vtk.get("LineSource")() line_source.SetPoint1(q0) line_source.SetPoint2(q1) line_source.Update() @@ -930,7 +930,7 @@ def _getpts(pts, revd=False): poly = vtk.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) - vct = vtk.vtkContourTriangulator() + vct = vtk.get("ContourTriangulator")() vct.SetInputData(poly) vct.Update() @@ -974,7 +974,7 @@ def __init__( """ if utils.is_sequence(start_pts) and len(start_pts)>1 and isinstance(start_pts[0], Line): # passing a list of Line, see tests/issues/issue_950.py - polylns = vtk.vtkAppendPolyData() + polylns = vtk.get("AppendPolyData")() for ln in start_pts: polylns.AddInputData(ln.dataset) polylns.Update() @@ -995,12 +995,12 @@ def __init__( if end_pts is not None: start_pts = np.stack((start_pts, end_pts), axis=1) - polylns = vtk.vtkAppendPolyData() + polylns = vtk.get("AppendPolyData")() if not utils.is_ragged(start_pts): for twopts in start_pts: - line_source = vtk.vtkLineSource() + line_source = vtk.get("LineSource")() line_source.SetResolution(res) if len(twopts[0]) == 2: line_source.SetPoint1(twopts[0][0], twopts[0][1], 0.0) @@ -1021,7 +1021,7 @@ def __init__( else: - polylns = vtk.vtkAppendPolyData() + polylns = vtk.get("AppendPolyData")() for t in start_pts: t = utils.make3d(t) ppoints = vtk.vtkPoints() # Generate the polyline @@ -1329,18 +1329,18 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): poly = msh.clone().compute_normals().dataset if "cell" in on: - centers = vtk.vtkCellCenters() + centers = vtk.get("CellCenters")() centers.SetInputData(poly) centers.Update() poly = centers.GetOutput() - mask_pts = vtk.vtkMaskPoints() + mask_pts = vtk.get("MaskPoints")() mask_pts.SetInputData(poly) mask_pts.SetOnRatio(ratio) mask_pts.RandomModeOff() mask_pts.Update() - ln = vtk.vtkLineSource() + ln = vtk.get("LineSource")() ln.SetPoint1(0, 0, 0) ln.SetPoint2(1, 0, 0) ln.Update() @@ -1400,24 +1400,24 @@ def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=Non if radius is None: radius = 2.5 * np.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) - locator = vtk.vtkStaticPointLocator() + locator = vtk.get("StaticPointLocator")() locator.SetDataSet(mesh.dataset) locator.BuildLocator() if kernel == "gaussian": - kern = vtk.vtkGaussianKernel() + kern = vtk.get("GaussianKernel")() kern.SetRadius(radius) elif kernel == "voronoi": - kern = vtk.vtkVoronoiKernel() + kern = vtk.get("VoronoiKernel")() elif kernel == "linear": - kern = vtk.vtkLinearKernel() + kern = vtk.get("LinearKernel")() kern.SetRadius(radius) else: - kern = vtk.vtkShepardKernel() + kern = vtk.get("ShepardKernel")() kern.SetPowerParameter(2) kern.SetRadius(radius) - interpolator = vtk.vtkPointInterpolator() + interpolator = vtk.get("PointInterpolator")() interpolator.SetInputData(domain) interpolator.SetSourceData(mesh.dataset) interpolator.SetKernel(kern) @@ -1549,7 +1549,7 @@ def StreamLines( else: pts = probe.clean().vertices - src = vtk.vtkProgrammableSource() + src = vtk.get("ProgrammableSource")() def read_points(): output = src.GetPolyDataOutput() @@ -1596,7 +1596,7 @@ def read_points(): output = st.GetOutput() if ribbons: - scalar_surface = vtk.vtkRuledSurfaceFilter() + scalar_surface = vtk.get("RuledSurfaceFilter")() scalar_surface.SetInputConnection(st.GetOutputPort()) scalar_surface.SetOnRatio(int(ribbons)) scalar_surface.SetRuledModeToPointWalk() @@ -1618,7 +1618,7 @@ def read_points(): if tubes: vedo.logger.warning(f"in StreamLines unknown 'tubes' parameters: {tubes}") - stream_tube = vtk.vtkTubeFilter() + stream_tube = vtk.get("TubeFilter")() stream_tube.SetNumberOfSides(res) stream_tube.SetRadius(radius) stream_tube.SetCapping(cap) @@ -1698,7 +1698,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): idx = len(points) for p in points: vpoints.InsertNextPoint(p) - line = vtk.vtkPolyLine() + line = vtk.get("PolyLine")() line.GetPointIds().SetNumberOfIds(idx) for i in range(idx): line.GetPointIds().SetId(i, i) @@ -1708,7 +1708,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): polyln.SetPoints(vpoints) polyln.SetLines(lines) - tuf = vtk.vtkTubeFilter() + tuf = vtk.get("TubeFilter")() tuf.SetCapping(cap) tuf.SetNumberOfSides(res) tuf.SetInputData(polyln) @@ -1845,7 +1845,7 @@ def __init__( elif line2 is None: ############################################# - ribbon_filter = vtk.vtkRibbonFilter() + ribbon_filter = vtk.get("RibbonFilter")() aline = Line(line1) ribbon_filter.SetInputData(aline.dataset) if width is None: @@ -1913,12 +1913,12 @@ def __init__( polygon2.SetPoints(ppoints2) polygon2.SetLines(lines2) - merged_pd = vtk.vtkAppendPolyData() + merged_pd = vtk.get("AppendPolyData")() merged_pd.AddInputData(polygon1) merged_pd.AddInputData(polygon2) merged_pd.Update() - rsf = vtk.vtkRuledSurfaceFilter() + rsf = vtk.get("RuledSurfaceFilter")() rsf.CloseSurfaceOff() rsf.SetRuledMode(mode) rsf.SetResolution(res[0], res[1]) @@ -1972,7 +1972,7 @@ def __init__( else: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) - self.source = vtk.vtkArrowSource() + self.source = vtk.get("ArrowSource")() self.source.SetShaftResolution(res) self.source.SetTipResolution(res) @@ -2008,7 +2008,7 @@ def __init__( t.Scale(length, sz, sz) else: t.Scale(length, length, length) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(self.source.GetOutput()) tf.SetTransform(t) tf.Update() @@ -2082,7 +2082,7 @@ def __init__( start_pts = utils.make3d(start_pts) end_pts = utils.make3d(end_pts) - arr = vtk.vtkArrowSource() + arr = vtk.get("ArrowSource")() arr.SetShaftResolution(res) arr.SetTipResolution(res) @@ -2211,7 +2211,7 @@ def __init__( t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z t.Scale(length, length, length) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(poly) tf.SetTransform(t) tf.Update() @@ -2502,9 +2502,9 @@ def __init__( res_r, res_phi = res, 12 * res if len(angle_range) == 0: - ps = vtk.vtkDiskSource() + ps = vtk.get("DiskSource")() else: - ps = vtk.vtkSectorSource() + ps = vtk.get("SectorSource")() ps.SetStartAngle(angle_range[0]) ps.SetEndAngle(angle_range[1]) @@ -2554,7 +2554,7 @@ def __init__( self.base = point1 self.top = point2 - ar = vtk.vtkArcSource() + ar = vtk.get("ArcSource")() if point2 is not None: self.top = point2 point2 = point2 - np.asarray(point1) @@ -2683,7 +2683,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) img.SetDimensions(res - 1, res - 1, res - 1) rs = 1.0 / (res - 2) img.SetSpacing(rs, rs, rs) - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(img) gf.Update() super().__init__(gf.GetOutput(), c, alpha) @@ -2706,7 +2706,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) else: res_t, res_phi = 2 * res, res - ss = vtk.vtkSphereSource() + ss = vtk.get("SphereSource")() ss.SetRadius(r) ss.SetThetaResolution(res_t) ss.SetPhiResolution(res_phi) @@ -2762,7 +2762,7 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): vedo.logger.error("Limitation: c and r cannot be both sequences.") raise RuntimeError() - src = vtk.vtkSphereSource() + src = vtk.get("SphereSource")() if not risseq: src.SetRadius(r) if utils.is_sequence(res): @@ -2774,7 +2774,7 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): src.SetPhiResolution(res_phi) src.Update() - psrc = vtk.vtkPointSource() + psrc = vtk.get("PointSource")() psrc.SetNumberOfPoints(len(centers)) psrc.Update() pd = psrc.GetOutput() @@ -2831,7 +2831,7 @@ def __init__(self, style=1, r=1.0): ![](https://vedo.embl.es/images/advanced/geodesic.png) """ - tss = vtk.vtkTexturedSphereSource() + tss = vtk.get("TexturedSphereSource")() tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) @@ -2890,7 +2890,7 @@ def __init__( else: res_t, res_phi = 2 * res, res - elli_source = vtk.vtkSphereSource() + elli_source = vtk.get("SphereSource")() elli_source.SetThetaResolution(res_t) elli_source.SetPhiResolution(res_phi) elli_source.Update() @@ -2913,7 +2913,7 @@ def __init__( t.RotateX(np.rad2deg(angle)) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(elli_source.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3066,13 +3066,13 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. super().__init__([verts, faces], c, alpha) else: - ps = vtk.vtkPlaneSource() + ps = vtk.get("PlaneSource")() ps.SetResolution(resx, resy) ps.Update() poly0 = ps.GetOutput() t0 = vtk.vtkTransform() t0.Scale(sx, sy, 1) - tf0 = vtk.vtkTransformPolyDataFilter() + tf0 = vtk.get("TransformPolyDataFilter")() tf0.SetInputData(poly0) tf0.SetTransform(t0) tf0.Update() @@ -3102,9 +3102,9 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra pos = utils.make3d(pos) normal = np.asarray(normal, dtype=float) - ps = vtk.vtkPlaneSource() + ps = vtk.get("PlaneSource")() ps.SetResolution(res[0], res[1]) - tri = vtk.vtkTriangleFilter() + tri = vtk.get("TriangleFilter")() tri.SetInputConnection(ps.GetOutputPort()) tri.Update() @@ -3116,7 +3116,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra t.Scale(s[0], s[1], 1) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(tri.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3296,7 +3296,7 @@ def __init__( elif len(size) == 3: length, width, height = size - src = vtk.vtkCubeSource() + src = vtk.get("CubeSource")() src.SetXLength(length) src.SetYLength(width) src.SetZLength(height) @@ -3368,13 +3368,13 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al img = vtk.vtkImageData() img.SetDimensions(n[0] + 1, n[1] + 1, n[2] + 1) img.SetSpacing(spacing) - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(img) gf.Update() poly = gf.GetOutput() else: # fast n -= 1 - tbs = vtk.vtkTessellatedBoxSource() + tbs = vtk.get("TessellatedBoxSource")() tbs.SetLevel(n) if len(bounds): tbs.SetBounds(bounds) @@ -3445,11 +3445,11 @@ def __init__( t = vtk.vtkTransform() t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(sp.dataset) tf.SetTransform(t) tf.Update() - tuf = vtk.vtkTubeFilter() + tuf = vtk.get("TubeFilter")() tuf.SetNumberOfSides(12) tuf.CappingOn() tuf.SetInputData(tf.GetOutput()) @@ -3494,7 +3494,7 @@ def __init__( base = pos - axis * height / 2 top = pos + axis * height / 2 - cyl = vtk.vtkCylinderSource() + cyl = vtk.get("CylinderSource")() cyl.SetResolution(res) cyl.SetRadius(r) cyl.SetHeight(height) @@ -3508,7 +3508,7 @@ def __init__( t.RotateX(90) # put it along Z t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3528,7 +3528,7 @@ class Cone(Mesh): def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), res=48, c="green3", alpha=1.0): """Build a cone of specified radius `r` and `height`, centered at `pos`.""" - con = vtk.vtkConeSource() + con = vtk.get("ConeSource")() con.SetResolution(res) con.SetRadius(r) con.SetHeight(height) @@ -3598,7 +3598,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow rs = vtkParametricTorus() rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) - pfs = vtk.vtkParametricFunctionSource() + pfs = vtk.get("ParametricFunctionSource")() pfs.SetParametricFunction(rs) pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) @@ -3627,16 +3627,16 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): ![](https://user-images.githubusercontent.com/32848391/51211547-260ef480-1916-11e9-95f6-4a677e37e355.png) """ - quadric = vtk.vtkQuadric() + quadric = vtk.get("Quadric")() quadric.SetCoefficients(1, 1, 0, 0, 0, 0, 0, 0, height / 4, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 - sample = vtk.vtkSampleFunction() + sample = vtk.get("SampleFunction")() sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(quadric) - contours = vtk.vtkContourFilter() + contours = vtk.get("ContourFilter")() contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, 0.01, 0.01) contours.Update() @@ -3660,16 +3660,16 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` """ - q = vtk.vtkQuadric() + q = vtk.get("Quadric")() q.SetCoefficients(2, 2, -1 / a2, 0, 0, 0, 0, 0, 0, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 - sample = vtk.vtkSampleFunction() + sample = vtk.get("SampleFunction")() sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(q) - contours = vtk.vtkContourFilter() + contours = vtk.get("ContourFilter")() contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, value, value) contours.Update() @@ -3854,7 +3854,7 @@ def __init__( tr.Translate(padding1 * d, 0, 0) pscale = 1 tr.Scale(pscale / (y1 - y0) * d, pscale / (y1 - y0) * d, 1) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() @@ -4362,7 +4362,7 @@ def _get_text3d_poly( tr.Scale(pscale, pscale, pscale) if italic: tr.Concatenate([1, italic * 0.15, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() @@ -4380,7 +4380,7 @@ def _get_text3d_poly( if len(polyletters) == 1: tpoly = polyletters[0] else: - polyapp = vtk.vtkAppendPolyData() + polyapp = vtk.get("AppendPolyData")() for polyd in polyletters: polyapp.AddInputData(polyd) polyapp.Update() @@ -4403,14 +4403,14 @@ def _get_text3d_poly( t.PostMultiply() t.Scale(s, s, s) t.Translate(shift) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(tpoly) tf.SetTransform(t) tf.Update() tpoly = tf.GetOutput() if depth: - extrude = vtk.vtkLinearExtrusionFilter() + extrude = vtk.get("LinearExtrusionFilter")() extrude.SetInputData(tpoly) extrude.SetExtrusionTypeToVectorExtrusion() extrude.SetVector(0, 0, 1) @@ -4629,7 +4629,7 @@ def __init__( """ super().__init__() - self.mapper = vtk.vtkTextMapper() + self.mapper = vtk.get("TextMapper")() self.SetMapper(self.mapper) self.properties = self.mapper.GetTextProperty() @@ -4922,18 +4922,18 @@ def __init__(self, pts): z0, z1 = mesh.zbounds() d = mesh.diagonal_size() if (z1 - z0) / d > 0.0001: - delaunay = vtk.vtkDelaunay3D() + delaunay = vtk.get("Delaunay3D")() delaunay.SetInputData(apoly) delaunay.Update() - surfaceFilter = vtk.vtkDataSetSurfaceFilter() + surfaceFilter = vtk.get("DataSetSurfaceFilter")() surfaceFilter.SetInputConnection(delaunay.GetOutputPort()) surfaceFilter.Update() out = surfaceFilter.GetOutput() else: - delaunay = vtk.vtkDelaunay2D() + delaunay = vtk.get("Delaunay2D")() delaunay.SetInputData(apoly) delaunay.Update() - fe = vtk.vtkFeatureEdges() + fe = vtk.get("FeatureEdges")() fe.SetInputConnection(delaunay.GetOutputPort()) fe.BoundaryEdgesOn() fe.Update() From 3d33b4bd5ad724ef8bee910338fdd0d8a7f06ff4 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:03:06 +0200 Subject: [PATCH 165/251] aggressive substitution to vtk.get() backends.py --- vedo/backends.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vedo/backends.py b/vedo/backends.py index 846fe991..f168bf75 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -163,7 +163,7 @@ def start_k3d(actors2show): vtkdata = iapoly.GetCellData() vtkscals = vtkdata.GetScalars() if vtkscals is not None: - c2p = vtk.vtkCellDataToPointData() + c2p = vtk.get("CellDataToPointData")() c2p.SetInputData(iapoly) c2p.Update() iapoly = c2p.GetOutput() From 667b957d9e813c3dd438818f99a31208a793c63b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:11:00 +0200 Subject: [PATCH 166/251] aggressive substitution to vtk.get() core.py --- vedo/core.py | 118 +++++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index ac9fc2fe..7ef9407f 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -527,7 +527,7 @@ def average_size(self): def center_of_mass(self): """Get the center of mass of mesh.""" - cmf = vtk.vtkCenterOfMass() + cmf = vtk.get("CenterOfMass")() cmf.SetInputData(self.dataset) cmf.Update() c = cmf.GetCenter() @@ -622,7 +622,7 @@ def cell_centers(self): Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) """ - vcen = vtk.vtkCellCenters() + vcen = vtk.get("CellCenters")() vcen.SetInputData(self.dataset) vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) @@ -665,7 +665,7 @@ def mark_boundaries(self): Mark cells and vertices of the mesh if they lie on a boundary. A new array called `BoundaryCells` is added to the mesh. """ - mb = vtk.vtkMarkBoundaryFilter() + mb = vtk.get("MarkBoundaryFilter")() mb.SetInputData(self.dataset) mb.Update() self.dataset.DeepCopy(mb.GetOutput()) @@ -692,7 +692,7 @@ def find_cells_in_bounds(self, xbounds=(), ybounds=(), zbounds=()): cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator = vtk.get("CellTreeLocator")() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cell_ids) @@ -708,7 +708,7 @@ def find_cells_along_line(self, p0, p1, tol=0.001): """ cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator = vtk.get("CellTreeLocator")() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongLine(p0, p1, tol, cell_ids) @@ -724,7 +724,7 @@ def find_cells_along_plane(self, origin, normal, tol=0.001): """ cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.vtkCellTreeLocator() + self.cell_locator = vtk.get("CellTreeLocator")() self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cell_ids) @@ -770,7 +770,7 @@ def map_cells_to_points(self, arrays=(), move=False): Set `move=True` to delete the original `celldata` array. """ - c2p = vtk.vtkCellDataToPointData() + c2p = vtk.get("CellDataToPointData")() c2p.SetInputData(self.dataset) if not move: c2p.PassCellDataOn() @@ -797,7 +797,7 @@ def vertices(self): except AttributeError: try: # valid for rectilinear/structured grid, image data - v2p = vtk.vtkImageToPoints() + v2p = vtk.get("ImageToPoints")() v2p.SetInputData(self.dataset) v2p.Update() varr = v2p.GetOutput().GetPoints().GetData() @@ -871,7 +871,7 @@ def map_points_to_cells(self, arrays=(), move=False): Examples: - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ - p2c = vtk.vtkPointDataToCellData() + p2c = vtk.get("PointDataToCellData")() p2c.SetInputData(self.dataset) if not move: p2c.PassPointDataOn() @@ -914,7 +914,7 @@ def resample_data_from(self, source, tol=None, categorical=False): show(m1, m2 , N=2, axes=1) ``` """ - rs = vtk.vtkResampleWithDataSet() + rs = vtk.get("ResampleWithDataSet")() rs.SetInputData(self.dataset) rs.SetSourceData(source.dataset) @@ -983,7 +983,7 @@ def interpolate_data_from( if on == "points": points = source.dataset elif on == "cells": - c2p = vtk.vtkCellDataToPointData() + c2p = vtk.get("CellDataToPointData")() # poly2 = vtk.vtkPolyData() # poly2.ShallowCopy(source.dataset) c2p.SetInputData(source.dataset) @@ -993,20 +993,20 @@ def interpolate_data_from( vedo.logger.error("in interpolate_data_from(), on must be on points or cells") raise RuntimeError() - locator = vtk.vtkPointLocator() + locator = vtk.get("PointLocator")() locator.SetDataSet(points) locator.BuildLocator() if kernel.lower() == "shepard": - kern = vtk.vtkShepardKernel() + kern = vtk.get("ShepardKernel")() kern.SetPowerParameter(2) elif kernel.lower() == "gaussian": - kern = vtk.vtkGaussianKernel() + kern = vtk.get("GaussianKernel")() kern.SetSharpness(2) elif kernel.lower() == "linear": - kern = vtk.vtkLinearKernel() + kern = vtk.get("LinearKernel")() # elif kernel.lower() == "voronoi": - # kern = vtk.vtkProbabilisticVoronoiKernel() + # kern = vtk.get("ProbabilisticVoronoiKernel")() else: vedo.logger.error("available kernels are: [shepard, gaussian, linear, voronoi]") raise RuntimeError() @@ -1018,7 +1018,7 @@ def interpolate_data_from( kern.SetRadius(radius) kern.SetKernelFootprintToRadius() - interpolator = vtk.vtkPointInterpolator() + interpolator = vtk.get("PointInterpolator")() interpolator.SetInputData(self.dataset) interpolator.SetSourceData(points) interpolator.SetKernel(kern) @@ -1032,7 +1032,7 @@ def interpolate_data_from( interpolator.Update() if on == "cells": - p2c = vtk.vtkPointDataToCellData() + p2c = vtk.get("PointDataToCellData")() p2c.SetInputData(interpolator.GetOutput()) p2c.Update() cpoly = p2c.GetOutput() @@ -1046,7 +1046,7 @@ def interpolate_data_from( def add_ids(self): """Generate point and cell ids arrays.""" - ids = vtk.vtkIdFilter() + ids = vtk.get("IdFilter")() ids.SetInputData(self.dataset) ids.PointIdsOn() ids.CellIdsOn() @@ -1077,7 +1077,7 @@ def gradient(self, input_array=None, on="points", fast=False): ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) """ - gra = vtk.vtkGradientFilter() + gra = vtk.get("GradientFilter")() if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1123,7 +1123,7 @@ def divergence(self, array_name=None, on="points", fast=False): if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ - div = vtk.vtkGradientFilter() + div = vtk.get("GradientFilter")() if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1169,7 +1169,7 @@ def vorticity(self, array_name=None, on="points", fast=False): if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ - vort = vtk.vtkGradientFilter() + vort = vtk.get("GradientFilter")() if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1217,7 +1217,7 @@ def probe(self, source): ![](https://vedo.embl.es/images/volumetric/probePoints.png) """ - probe_filter = vtk.vtkProbeFilter() + probe_filter = vtk.get("ProbeFilter")() probe_filter.SetSourceData(source.dataset) probe_filter.SetInputData(self.dataset) probe_filter.Update() @@ -1257,7 +1257,7 @@ def write(self, filename, binary=True): def tomesh(self, bounds=()): """Extract boundary geometry from dataset (or convert data to polygonal type).""" - geo = vtk.vtkGeometryFilter() + geo = vtk.get("GeometryFilter")() geo.SetInputData(self.dataset) geo.SetPassThroughCellIds(1) geo.SetPassThroughPointIds(1) @@ -1279,7 +1279,7 @@ def shrink(self, fraction=0.8): ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ - sf = vtk.vtkShrinkFilter() + sf = vtk.get("ShrinkFilter")() sf.SetInputData(self.dataset) sf.SetShrinkFactor(fraction) sf.Update() @@ -1358,7 +1358,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.transform = LinearTransform() ################ - tp = vtk.vtkTransformPolyDataFilter() + tp = vtk.get("TransformPolyDataFilter")() tp.SetTransform(tr) tp.SetInputData(self.dataset) tp.Update() @@ -1557,10 +1557,10 @@ def isosurface(self, value=None, flying_edges=True): scrange = self.dataset.GetScalarRange() if flying_edges: - cf = vtk.vtkFlyingEdges3D() + cf = vtk.get("FlyingEdges3D")() cf.InterpolateAttributesOn() else: - cf = vtk.vtkContourFilter() + cf = vtk.get("ContourFilter")() cf.UseScalarTreeOn() cf.SetInputData(self.dataset) @@ -1618,9 +1618,9 @@ def legosurface( ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ - imp_dataset = vtk.vtkImplicitDataSet() + imp_dataset = vtk.get("ImplicitDataSet")() imp_dataset.SetDataSet(self.dataset) - window = vtk.vtkImplicitWindowFunction() + window = vtk.get("ImplicitWindowFunction")() window.SetImplicitFunction(imp_dataset) srng = list(self.dataset.GetScalarRange()) @@ -1633,14 +1633,14 @@ def legosurface( srng[1] += tol window.SetWindowRange(srng) - extract = vtk.vtkExtractGeometry() + extract = vtk.get("ExtractGeometry")() extract.SetInputData(self.dataset) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) extract.Update() - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(extract.GetOutput()) gf.Update() @@ -1666,9 +1666,9 @@ def tomesh(self, fill=True, shrink=1.0): If `fill=False`, only the boundary faces will be generated. """ - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() if fill: - sf = vtk.vtkShrinkFilter() + sf = vtk.get("ShrinkFilter")() sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() @@ -1676,7 +1676,7 @@ def tomesh(self, fill=True, shrink=1.0): gf.Update() poly = gf.GetOutput() if shrink == 1.0: - clean_poly = vtk.vtkCleanPolyData() + clean_poly = vtk.get("CleanPolyData")() clean_poly.PointMergingOn() clean_poly.ConvertLinesToPointsOn() clean_poly.ConvertPolysToLinesOn() @@ -1736,10 +1736,10 @@ def isosurface(self, value=None, flying_edges=True): scrange = self.dataset.GetScalarRange() if flying_edges: - cf = vtk.vtkFlyingEdges3D() + cf = vtk.get("FlyingEdges3D")() cf.InterpolateAttributesOn() else: - cf = vtk.vtkContourFilter() + cf = vtk.get("ContourFilter")() cf.UseScalarTreeOn() cf.SetInputData(self.dataset) @@ -1779,9 +1779,9 @@ def tomesh(self, fill=True, shrink=1.0): If `fill=False`, only the boundary faces will be generated. """ - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() if fill: - sf = vtk.vtkShrinkFilter() + sf = vtk.get("ShrinkFilter")() sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() @@ -1789,7 +1789,7 @@ def tomesh(self, fill=True, shrink=1.0): gf.Update() poly = gf.GetOutput() if shrink == 1.0: - clean_poly = vtk.vtkCleanPolyData() + clean_poly = vtk.get("CleanPolyData")() clean_poly.PointMergingOn() clean_poly.ConvertLinesToPointsOn() clean_poly.ConvertPolysToLinesOn() @@ -1815,19 +1815,19 @@ def tomesh(self, fill=True, shrink=1.0): def extract_cells_by_id(self, idlist, use_point_ids=False): """Return a new UGrid composed of the specified subset of indices.""" - selection_node = vtk.vtkSelectionNode() + selection_node = vtk.get("SelectionNode")() if use_point_ids: - selection_node.SetFieldType(vtk.vtkSelectionNode.POINT) - contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() + selection_node.SetFieldType(vtk.get("SelectionNode").POINT) + contcells = vtk.get("SelectionNode").CONTAINING_CELLS() selection_node.GetProperties().Set(contcells, 1) else: - selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) - selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) + selection_node.SetFieldType(vtk.get("SelectionNode").CELL) + selection_node.SetContentType(vtk.get("SelectionNode").INDICES) vidlist = utils.numpy2vtk(idlist, dtype="id") selection_node.SetSelectionList(vidlist) - selection = vtk.vtkSelection() + selection = vtk.get("Selection")() selection.AddNode(selection_node) - es = vtk.vtkExtractSelection() + es = vtk.get("ExtractSelection")() es.SetInputData(0, self) es.SetInputData(1, selection) es.Update() @@ -1883,13 +1883,13 @@ def extract_cells_on_plane(self, origin, normal): """ Extract cells that are lying of the specified surface. """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf = vtk.get("3DLinearGridCrinkleExtractor")() bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - plane = vtk.vtkPlane() + plane = vtk.get("Plane")() plane.SetOrigin(origin) plane.SetNormal(normal) bf.SetImplicitFunction(plane) @@ -1908,13 +1908,13 @@ def extract_cells_on_sphere(self, center, radius): """ Extract cells that are lying of the specified surface. """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf = vtk.get("3DLinearGridCrinkleExtractor")() bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - sph = vtk.vtkSphere() + sph = vtk.get("Sphere")() sph.SetRadius(radius) sph.SetCenter(center) bf.SetImplicitFunction(sph) @@ -1933,13 +1933,13 @@ def extract_cells_on_cylinder(self, center, axis, radius): """ Extract cells that are lying of the specified surface. """ - bf = vtk.vtk3DLinearGridCrinkleExtractor() + bf = vtk.get("3DLinearGridCrinkleExtractor")() bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - cyl = vtk.vtkCylinder() + cyl = vtk.get("Cylinder")() cyl.SetRadius(radius) cyl.SetCenter(center) cyl.SetAxis(axis) @@ -1975,10 +1975,10 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) - plane = vtk.vtkPlane() + plane = vtk.get("Plane")() plane.SetOrigin(origin) plane.SetNormal(normal) - clipper = vtk.vtkClipDataSet() + clipper = vtk.get("ClipDataSet")() clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() @@ -2020,7 +2020,7 @@ def cut_with_box(self, box): ``` ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ - bc = vtk.vtkBoxClipDataSet() + bc = vtk.get("BoxClipDataSet")() bc.SetInputData(self.dataset) try: boxb = box.bounds() @@ -2047,11 +2047,11 @@ def cut_with_mesh( """ ug = self.dataset - ippd = vtk.vtkImplicitPolyDataDistance() + ippd = vtk.get("ImplicitPolyDataDistance")() ippd.SetInput(mesh.dataset) if whole_cells or only_boundary: - clipper = vtk.vtkExtractGeometry() + clipper = vtk.get("ExtractGeometry")() clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) @@ -2069,7 +2069,7 @@ def cut_with_mesh( signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) ug.GetPointData().SetActiveScalars("SignedDistance") - clipper = vtk.vtkClipDataSet() + clipper = vtk.get("ClipDataSet")() clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) From 535191fa1a675f8a8b7e367399422078df98805d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:12:23 +0200 Subject: [PATCH 167/251] aggressive substitution to vtk.get() dolfin.py --- vedo/dolfin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vedo/dolfin.py b/vedo/dolfin.py index 5db8cb87..2006afe7 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -366,15 +366,15 @@ def plot(*inputobj, **options): if vedo.plotter_instance: if xtitle != "x": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): + if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): aet[at].SetXTitle(xtitle) if ytitle != "y": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): + if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): aet[at].SetYTitle(ytitle) if ztitle != "z": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): + if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): aet[at].SetZTitle(ztitle) # change some default to emulate standard behaviours From 2a84b529b2abbcd98caa8a7b0d17826d1b25490b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:14:18 +0200 Subject: [PATCH 168/251] aggressive substitution to vtk.get() fileio.py --- vedo/file_io.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vedo/file_io.py b/vedo/file_io.py index 560846ee..1db7e936 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -550,7 +550,7 @@ def loadStructuredPoints(filename, as_points=True): reader.SetFileName(filename) reader.Update() if as_points: - v2p = vtk.vtkImageToPoints() + v2p = vtk.get("ImageToPoints")() v2p.SetInputData(reader.GetOutput()) v2p.Update() pts = Points(v2p.GetOutput()) @@ -699,7 +699,7 @@ def loadDolfin(filename, exterior=False): else: polyb = utils.buildPolyData(bm.coordinates(), bm.cells(), tetras=True) polym = utils.buildPolyData(m.coordinates(), m.cells(), tetras=True) - app = vtk.vtkAppendPolyData() + app = vtk.get("AppendPolyData")() app.AddInputData(polym) app.AddInputData(polyb) app.Update() @@ -1814,7 +1814,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): w2if.SetInput(vedo.plotter_instance.renderer) w2if.SetMagnification(scale) else: - w2if = vtk.vtkWindowToImageFilter() + w2if = vtk.get("WindowToImageFilter")() w2if.SetInput(vedo.plotter_instance.window) if hasattr(w2if, "SetScale"): w2if.SetScale(int(scale), int(scale)) From 15f1ad184283fd930465c33be53611bf25e45946 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:19:59 +0200 Subject: [PATCH 169/251] aggressive substitution to vtk.get() image.py --- vedo/image.py | 100 +++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/vedo/image.py b/vedo/image.py index df6fe86c..99751044 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -48,7 +48,7 @@ def _get_img(obj, flip=False, translate=()): obj = np.asarray(obj) if obj.ndim == 3: # has shape (nx,ny, ncolor_alpha_chan) - iac = vtk.vtkImageAppendComponents() + iac = vtk.get("ImageAppendComponents")() nchan = obj.shape[2] # get number of channels in inputimage (L/LA/RGB/RGBA) for i in range(nchan): if flip: @@ -79,7 +79,7 @@ def _get_img(obj, flip=False, translate=()): img.GetPointData().SetActiveScalars("RGBA") if len(translate) > 0: - translate_extent = vtk.vtkImageTranslateExtent() + translate_extent = vtk.get("ImageTranslateExtent")() translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() @@ -127,7 +127,7 @@ def _set_justification(img, pos): if len(translate) > 0: translate = np.array(translate).astype(int) - translate_extent = vtk.vtkImageTranslateExtent() + translate_extent = vtk.get("ImageTranslateExtent")() translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() @@ -201,7 +201,7 @@ def __init__(self, obj=None, channels=3): nchans = len(channels) n = img.GetPointData().GetScalars().GetNumberOfComponents() if nchans and n > nchans: - pec = vtk.vtkImageExtractComponents() + pec = vtk.get("ImageExtractComponents")() pec.SetInputData(img) if nchans == 4: pec.SetComponents(channels[0], channels[1], channels[2], channels[3]) @@ -362,7 +362,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): if scale != 1: newsize = np.array(self.dataset.GetDimensions()[:2]) * scale newsize = newsize.astype(int) - rsz = vtk.vtkImageResize() + rsz = vtk.get("ImageResize")() rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize[0], newsize[1], 1) @@ -374,7 +374,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): else: pic.dataset, pos = _set_justification(pic.dataset, pos) - pic.mapper = vtk.vtkImageMapper() + pic.mapper = vtk.get("ImageMapper")() pic.SetMapper(pic.mapper) pic.mapper.SetInputData(pic.dataset) pic.mapper.SetColorWindow(255) @@ -416,7 +416,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): pixels : (bool) units are pixels """ - extractVOI = vtk.vtkExtractVOI() + extractVOI = vtk.get("ExtractVOI")() extractVOI.SetInputData(self.dataset) extractVOI.IncludeBoundaryOn() @@ -450,7 +450,7 @@ def pad(self, pixels=10, value=255): intensity value (gray-scale color) of the padding """ x0, x1, y0, y1, _z0, _z1 = self.dataset.GetExtent() - pf = vtk.vtkImageConstantPad() + pf = vtk.get("ImageConstantPad")() pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(pixels): @@ -485,7 +485,7 @@ def tile(self, nx=4, ny=4, shift=(0, 0)): shift in x and y in pixels """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() - constant_pad = vtk.vtkImageMirrorPad() + constant_pad = vtk.get("ImageMirrorPad")() constant_pad.SetInputData(self.dataset) constant_pad.SetOutputWholeExtent( int(x0 + shift[0] + 0.5), @@ -531,7 +531,7 @@ def append(self, images, axis="z", preserve_extents=False): ``` ![](https://vedo.embl.es/images/feats/pict_append.png) """ - ima = vtk.vtkImageAppend() + ima = vtk.get("ImageAppend")() ima.SetInputData(self.dataset) if not utils.is_sequence(images): images = [images] @@ -572,7 +572,7 @@ def resize(self, newsize): newsize = [int(newsize[1] * ar + 0.5), newsize[1]] newsize = [newsize[0], newsize[1], old_dims[2]] - rsz = vtk.vtkImageResize() + rsz = vtk.get("ImageResize")() rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize) @@ -587,7 +587,7 @@ def resize(self, newsize): def mirror(self, axis="x"): """Mirror image along x or y axis. Same as `flip()`.""" - ff = vtk.vtkImageFlip() + ff = vtk.get("ImageFlip")() ff.SetInputData(self.dataset) if axis.lower() == "x": ff.SetFilteredAxis(0) @@ -607,7 +607,7 @@ def flip(self, axis="y"): def select(self, component): """Select one single component of the rgb image.""" - ec = vtk.vtkImageExtractComponents() + ec = vtk.get("ImageExtractComponents")() ec.SetInputData(self.dataset) ec.SetComponents(component) ec.Update() @@ -621,7 +621,7 @@ def bw(self): """Make it black and white using luminance calibration.""" n = self.dataset.GetPointData().GetNumberOfComponents() if n == 4: - ecr = vtk.vtkImageExtractComponents() + ecr = vtk.get("ImageExtractComponents")() ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() @@ -629,7 +629,7 @@ def bw(self): else: img = self.dataset - ecr = vtk.vtkImageLuminance() + ecr = vtk.get("ImageLuminance")() ecr.SetInputData(img) ecr.Update() self._update(ecr.GetOutput()) @@ -646,7 +646,7 @@ def smooth(self, sigma=3, radius=None): radius : (float) how far out the gaussian kernel will go before being clamped to zero """ - gsf = vtk.vtkImageGaussianSmooth() + gsf = vtk.get("ImageGaussianSmooth")() gsf.SetDimensionality(2) gsf.SetInputData(self.dataset) if radius is not None: @@ -675,7 +675,7 @@ def median(self): It then computes the median of these two values plus the center pixel. This result of this second median is the output pixel value. """ - medf = vtk.vtkImageHybridMedian2D() + medf = vtk.get("ImageHybridMedian2D")() medf.SetInputData(self.dataset) medf.Update() self._update(medf.GetOutput()) @@ -697,17 +697,17 @@ def enhance(self): img = self.dataset scalarRange = img.GetPointData().GetScalars().GetRange() - cast = vtk.vtkImageCast() + cast = vtk.get("ImageCast")() cast.SetInputData(img) cast.SetOutputScalarTypeToDouble() cast.Update() - laplacian = vtk.vtkImageLaplacian() + laplacian = vtk.get("ImageLaplacian")() laplacian.SetInputData(cast.GetOutput()) laplacian.SetDimensionality(2) laplacian.Update() - subtr = vtk.vtkImageMathematics() + subtr = vtk.get("ImageMathematics")() subtr.SetInputData(0, cast.GetOutput()) subtr.SetInputData(1, laplacian.GetOutput()) subtr.SetOperationToSubtract() @@ -715,7 +715,7 @@ def enhance(self): color_window = scalarRange[1] - scalarRange[0] color_level = color_window / 2 - original_color = vtk.vtkImageMapToWindowLevelColors() + original_color = vtk.get("ImageMapToWindowLevelColors")() original_color.SetWindow(color_window) original_color.SetLevel(color_level) original_color.SetInputData(subtr.GetOutput()) @@ -738,23 +738,23 @@ def fft(self, mode="magnitude", logscale=12, center=True): shift constant zero-frequency to the center of the image for display. (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ - ffti = vtk.vtkImageFFT() + ffti = vtk.get("ImageFFT")() ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: - mag = vtk.vtkImageMagnitude() + mag = vtk.get("ImageMagnitude")() mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: - erf = vtk.vtkImageExtractComponents() + erf = vtk.get("ImageExtractComponents")() erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: - eimf = vtk.vtkImageExtractComponents() + eimf = vtk.get("ImageExtractComponents")() eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() @@ -766,14 +766,14 @@ def fft(self, mode="magnitude", logscale=12, center=True): raise RuntimeError() if center: - center = vtk.vtkImageFourierCenter() + center = vtk.get("ImageFourierCenter")() center.SetInputData(out) center.Update() out = center.GetOutput() if "complex" not in mode: if logscale: - ils = vtk.vtkImageLogarithmicScale() + ils = vtk.get("ImageLogarithmicScale")() ils.SetInputData(out) ils.SetConstant(logscale) ils.Update() @@ -786,23 +786,23 @@ def fft(self, mode="magnitude", logscale=12, center=True): def rfft(self, mode="magnitude"): """Reverse Fast Fourier transform of a image.""" - ffti = vtk.vtkImageRFFT() + ffti = vtk.get("ImageRFFT")() ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: - mag = vtk.vtkImageMagnitude() + mag = vtk.get("ImageMagnitude")() mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: - erf = vtk.vtkImageExtractComponents() + erf = vtk.get("ImageExtractComponents")() erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: - eimf = vtk.vtkImageExtractComponents() + eimf = vtk.get("ImageExtractComponents")() eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() @@ -837,13 +837,13 @@ def filterpass(self, lowcutoff=None, highcutoff=None, order=3): order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass - fft = vtk.vtkImageFFT() + fft = vtk.get("ImageFFT")() fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if highcutoff: - blp = vtk.vtkImageButterworthLowPass() + blp = vtk.get("ImageButterworthLowPass")() blp.SetInputData(out) blp.SetCutOff(highcutoff) blp.SetOrder(order) @@ -851,23 +851,23 @@ def filterpass(self, lowcutoff=None, highcutoff=None, order=3): out = blp.GetOutput() if lowcutoff: - bhp = vtk.vtkImageButterworthHighPass() + bhp = vtk.get("ImageButterworthHighPass")() bhp.SetInputData(out) bhp.SetCutOff(lowcutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() - rfft = vtk.vtkImageRFFT() + rfft = vtk.get("ImageRFFT")() rfft.SetInputData(out) rfft.Update() - ecomp = vtk.vtkImageExtractComponents() + ecomp = vtk.get("ImageExtractComponents")() ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() - caster = vtk.vtkImageCast() + caster = vtk.get("ImageCast")() caster.SetOutputScalarTypeToUnsignedChar() caster.SetInputData(ecomp.GetOutput()) caster.Update() @@ -880,7 +880,7 @@ def blend(self, pic, alpha1=0.5, alpha2=0.5): Take L, LA, RGB, or RGBA images as input and blends them according to the alpha values and/or the opacity setting for each input. """ - blf = vtk.vtkImageBlend() + blf = vtk.get("ImageBlend")() blf.AddInputData(self.dataset) blf.AddInputData(pic.dataset) blf.SetOpacity(0, alpha1) @@ -958,7 +958,7 @@ def warp( # ignore source and target pass - reslice = vtk.vtkImageReslice() + reslice = vtk.get("ImageReslice")() reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) reslice.SetResliceTransform(transform) @@ -1041,10 +1041,10 @@ def threshold(self, value=None, flip=False): Returns: A polygonal mesh. """ - mgf = vtk.vtkImageMagnitude() + mgf = vtk.get("ImageMagnitude")() mgf.SetInputData(self.dataset) mgf.Update() - msq = vtk.vtkMarchingSquares() + msq = vtk.get("MarchingSquares")() msq.SetInputData(mgf.GetOutput()) if value is None: r0, r1 = self.dataset.GetScalarRange() @@ -1052,7 +1052,7 @@ def threshold(self, value=None, flip=False): msq.SetValue(0, value) msq.Update() if flip: - rs = vtk.vtkReverseSense() + rs = vtk.get("ReverseSense")() rs.SetInputData(msq.GetOutput()) rs.ReverseCellsOn() rs.ReverseNormalsOff() @@ -1060,7 +1060,7 @@ def threshold(self, value=None, flip=False): output = rs.GetOutput() else: output = msq.GetOutput() - ctr = vtk.vtkContourTriangulator() + ctr = vtk.get("ContourTriangulator")() ctr.SetInputData(output) ctr.Update() out = vedo.Mesh(ctr.GetOutput(), c="k").bc("t").lighting("off") @@ -1074,11 +1074,11 @@ def cmap(self, name, vmin=None, vmax=None): """Colorize a image with a colormap representing pixel intensity""" n = self.dataset.GetPointData().GetNumberOfComponents() if n > 1: - ecr = vtk.vtkImageExtractComponents() + ecr = vtk.get("ImageExtractComponents")() ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() - ilum = vtk.vtkImageMagnitude() + ilum = vtk.get("ImageMagnitude")() ilum.SetInputData(self.dataset) ilum.Update() img = ilum.GetOutput() @@ -1100,7 +1100,7 @@ def cmap(self, name, vmin=None, vmax=None): lut.SetTableValue(i, *c) lut.Build() - imap = vtk.vtkImageMapToColors() + imap = vtk.get("ImageMapToColors")() imap.SetLookupTable(lut) imap.SetInputData(img) imap.Update() @@ -1136,7 +1136,7 @@ def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): transform.Scale(1 / scale, 1 / scale, 1) transform.Translate(-pc[0], -pc[1], -pc[2]) - reslice = vtk.vtkImageReslice() + reslice = vtk.get("ImageReslice")() reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) @@ -1315,7 +1315,7 @@ def add_triangle(self, p1, p2, p3, c="red3", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.vtkImageCanvasSource2D() + canvas_source = vtk.get("ImageCanvasSource2D")() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) @@ -1378,7 +1378,7 @@ def add_text( tp.SetFrameColor(bgcol) tp.FrameOn() - tr = vtk.vtkTextRenderer() + tr = vtk.get("TextRenderer")() # GetConstrainedFontSize (const vtkUnicodeString &str, # vtkTextProperty(*tprop, int targetWidth, int targetHeight, int dpi) fs = tr.GetConstrainedFontSize(txt, tp, width, height, dpi) @@ -1390,7 +1390,7 @@ def add_text( # RenderString (vtkTextProperty *tprop, const vtkStdString &str, # vtkImageData *data, int textDims[2], int dpi, int backend=Default) - blf = vtk.vtkImageBlend() + blf = vtk.get("ImageBlend")() blf.AddInputData(self.dataset) blf.AddInputData(img) blf.SetOpacity(0, 1) From 94f86bfbf866f9b1d13e80bfb5a8fa4edbad2d38 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:21:26 +0200 Subject: [PATCH 170/251] aggressive substitution to vtk.get() intmodes.py --- vedo/interactor_modes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index 13b7e4f2..5223fc49 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -1358,7 +1358,7 @@ def DrawLine(self, x1, x2, y1, y2): # # # can we add something to the window here? - # freeType = vtk.vtkFreeTypeTools.GetInstance() + # freeType = vtk.get("FreeTypeTools.GetInstance() # textProperty = vtk.vtkTextProperty() # textProperty.SetJustificationToLeft() # textProperty.SetFontSize(24) @@ -1381,7 +1381,7 @@ def UpdateMiddleMouseButtonLockActor(self): if self.middle_mouse_lock_actor is None: # create the actor # Create a text on the top-rightcenter - textMapper = vtk.vtkTextMapper() + textMapper = vtk.get("TextMapper")() textMapper.SetInput("Middle mouse lock [m or space] active") textProp = textMapper.GetTextProperty() textProp.SetFontSize(12) From 73cd7a84d6aec7a7d0876bf28937c521b354ab22 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:30:04 +0200 Subject: [PATCH 171/251] aggressive substitution to vtk.get() plotter.py --- vedo/plotter.py | 76 ++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index ef90626c..18a3d72a 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -832,7 +832,7 @@ def add(self, *objs, at=None): if ren: - if isinstance(a, vtk.get("InteractorObserver")): + if isinstance(a, vtk.vtkInteractorObserver): a.add_to(self) # from cutters continue @@ -909,7 +909,7 @@ def remove(self, *objs, at=None): if ren: ### remove it from the renderer - if isinstance(ob, vtk.get("InteractorObserver")): + if isinstance(ob, vtk.vtkInteractorObserver): ob.remove_from(self) # from cutters continue @@ -1296,7 +1296,7 @@ def move_camera(self, cameras, t=0, times=(), smooth=True, output_times=()): assert len(times) == nc - cin = vtk.vtkCameraInterpolator() + cin = vtk.get("CameraInterpolator")() # cin.SetInterpolationTypeToLinear() # bugged? if nc > 2 and smooth: @@ -1384,7 +1384,7 @@ def record(self, filename=".vedo_recorded_events.log"): if not self.interactor: vedo.logger.warning("Cannot record events, no interactor defined.") return self - erec = vtk.vtkInteractorEventRecorder() + erec = vtk.get("InteractorEventRecorder")() erec.SetInteractor(self.interactor) erec.SetFileName(filename) erec.SetKeyPressActivationValue("R") @@ -1415,7 +1415,7 @@ def play(self, events=".vedo_recorded_events.log", repeats=0): vedo.logger.warning("Cannot play events, no interactor defined.") return self - erec = vtk.vtkInteractorEventRecorder() + erec = vtk.get("InteractorEventRecorder")() erec.SetInteractor(self.interactor) if events.endswith(".log"): @@ -1944,13 +1944,13 @@ def add_hint( def add_shadows(self): """Add shadows at the current renderer.""" if self.renderer: - shadows = vtk.vtkShadowMapPass() - seq = vtk.vtkSequencePass() - passes = vtk.vtkRenderPassCollection() + shadows = vtk.get("ShadowMapPass")() + seq = vtk.get("SequencePass")() + passes = vtk.get("RenderPassCollection")() passes.AddItem(shadows.GetShadowMapBakerPass()) passes.AddItem(shadows) seq.SetPasses(passes) - camerapass = vtk.vtkCameraPass() + camerapass = vtk.get("CameraPass")() camerapass.SetDelegatePass(seq) self.renderer.SetPass(camerapass) return self @@ -1978,39 +1978,39 @@ def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): ![](https://vedo.embl.es/images/basic/ssao.jpg) """ - lights = vtk.vtkLightsPass() + lights = vtk.get("LightsPass")() - opaque = vtk.vtkOpaquePass() + opaque = vtk.get("OpaquePass")() - ssaoCam = vtk.vtkCameraPass() + ssaoCam = vtk.get("CameraPass")() ssaoCam.SetDelegatePass(opaque) - ssao = vtk.vtkSSAOPass() + ssao = vtk.get("SSAOPass")() ssao.SetRadius(radius) ssao.SetBias(bias) ssao.SetBlur(blur) ssao.SetKernelSize(samples) ssao.SetDelegatePass(ssaoCam) - translucent = vtk.vtkTranslucentPass() + translucent = vtk.get("TranslucentPass")() - volpass = vtk.vtkVolumetricPass() - ddp = vtk.vtkDualDepthPeelingPass() + volpass = vtk.get("VolumetricPass")() + ddp = vtk.get("DualDepthPeelingPass")() ddp.SetTranslucentPass(translucent) ddp.SetVolumetricPass(volpass) - over = vtk.vtkOverlayPass() + over = vtk.get("OverlayPass")() - collection = vtk.vtkRenderPassCollection() + collection = vtk.get("RenderPassCollection")() collection.AddItem(lights) collection.AddItem(ssao) collection.AddItem(ddp) collection.AddItem(over) - sequence = vtk.vtkSequencePass() + sequence = vtk.get("SequencePass")() sequence.SetPasses(collection) - cam = vtk.vtkCameraPass() + cam = vtk.get("")() cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) @@ -2018,25 +2018,25 @@ def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): def add_depth_of_field(self, autofocus=True): """Add a depth of field effect in the scene.""" - lights = vtk.vtkLightsPass() + lights = vtk.get("LightsPass")() - opaque = vtk.vtkOpaquePass() + opaque = vtk.get("OpaquePass")() - dofCam = vtk.vtkCameraPass() + dofCam = vtk.get("CameraPass")() dofCam.SetDelegatePass(opaque) - dof = vtk.vtkDepthOfFieldPass() + dof = vtk.get("DepthOfFieldPass")() dof.SetAutomaticFocalDistance(autofocus) dof.SetDelegatePass(dofCam) - collection = vtk.vtkRenderPassCollection() + collection = vtk.get("RenderPassCollection")() collection.AddItem(lights) collection.AddItem(dof) - sequence = vtk.vtkSequencePass() + sequence = vtk.get("SequencePass")() sequence.SetPasses(collection) - cam = vtk.vtkCameraPass() + cam = vtk.get("CameraPass")() cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) @@ -2059,7 +2059,7 @@ def _add_skybox(self, hdrfile): texture.SetInputData(reader.GetOutput()) # Convert to a cube map - tcm = vtk.vtkEquirectangularToCubeMapTexture() + tcm = vtk.get("EquirectangularToCubeMapTexture")() tcm.SetInputTexture(texture) # Enable mipmapping to handle HDR image tcm.MipmapOn() @@ -2067,7 +2067,7 @@ def _add_skybox(self, hdrfile): self.renderer.SetEnvironmentTexture(tcm) self.renderer.UseImageBasedLightingOn() - self.skybox = vtk.vtkSkybox() + self.skybox = vtk.get("Skybox")() self.skybox.SetTexture(tcm) self.renderer.AddActor(self.skybox) @@ -2307,17 +2307,17 @@ def add_scale_indicator( rlabel = vtk.get("VectorText")() rlabel.SetText("scale") - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputConnection(rlabel.GetOutputPort()) t = vtk.vtkTransform() t.Scale(s * wsy / wsx, s, 1) tf.SetTransform(t) - app = vtk.vtkAppendPolyData() + app = vtk.get("AppendPolyData")() app.AddInputConnection(tf.GetOutputPort()) app.AddInputData(pd) - mapper = vtk.vtkPolyDataMapper2D() + mapper = vtk.get("PolyDataMapper2D")() mapper.SetInputConnection(app.GetOutputPort()) cs = vtk.vtkCoordinate() cs.SetCoordinateSystem(1) @@ -2767,7 +2767,7 @@ def mode_select(objs): area_picker.AreaPick(pos1[0], pos1[1], pos2[0], pos2[1], ren) planes = area_picker.GetFrustum() - fru = vtk.vtkFrustumSource() + fru = vtk.get("FrustumSource")() fru.SetPlanes(planes) fru.ShowLinesOff() fru.Update() @@ -2874,7 +2874,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(a, vtk.vtkImageData): scanned_acts.append(vedo.Volume(a).actor) - elif isinstance(a, vtk.vtkMultiBlockDataSet): + elif isinstance(a, vtk.get("MultiBlockDataSet")): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) if isinstance(b, vtk.vtkPolyData): @@ -2882,7 +2882,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(b, vtk.vtkImageData): scanned_acts.append(vedo.Volume(b).actor) - elif isinstance(a, (vtk.vtkProp, vtk.get("InteractorObserver"))): + elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): scanned_acts.append(a) elif "trimesh" in str(type(a)): @@ -3451,11 +3451,11 @@ def toimage(self, scale=1): set image magnification as an integer multiplicating factor """ if settings.screeshot_large_image: - w2if = vtk.vtkRenderLargeImage() + w2if = vtk.get("RenderLargeImage")() w2if.SetInput(self.renderer) w2if.SetMagnification(scale) else: - w2if = vtk.vtkWindowToImageFilter() + w2if = vtk.get("WindowToImageFilter")() w2if.SetInput(self.window) if hasattr(w2if, "SetScale"): w2if.SetScale(scale, scale) @@ -3478,7 +3478,7 @@ def export(self, filename="scene.npz", binary=False): def color_picker(self, xy, verbose=False): """Pick color of specific (x,y) pixel on the screen.""" - w2if = vtk.vtkWindowToImageFilter() + w2if = vtk.get("WindowToImageFilter")() w2if.SetInput(self.window) w2if.ReadFrontBufferOff() w2if.Update() From 8657c430b787a9372a812864a65b133424dced6b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:35:17 +0200 Subject: [PATCH 172/251] aggressive substitution to vtk.get() tetmesh.py --- vedo/tetmesh.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index dae68c49..b18b481a 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -40,7 +40,7 @@ def delaunay3d(mesh, radius=0, tol=None): This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. """ - deln = vtk.vtkDelaunay3D() + deln = vtk.get("Delaunay3D")() if utils.is_sequence(mesh): pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() @@ -147,7 +147,7 @@ def __init__( self.dataset = inputobj.dataset elif isinstance(inputobj, vtk.vtkRectilinearGrid): - r2t = vtk.vtkRectilinearGridToTetrahedra() + r2t = vtk.get("RectilinearGridToTetrahedra")() r2t.SetInputData(inputobj) r2t.RememberVoxelIdOn() r2t.SetTetraPerCellTo6() @@ -155,7 +155,7 @@ def __init__( self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): - r2t = vtk.vtkDataSetTriangleFilter() + r2t = vtk.get("DataSetTriangleFilter")() r2t.SetInputData(inputobj) # r2t.TetrahedraOnlyOn() r2t.Update() @@ -166,7 +166,7 @@ def __init__( if "https://" in inputobj: inputobj = download(inputobj, verbose=False) ug = loadUnStructuredGrid(inputobj) - tt = vtk.vtkDataSetTriangleFilter() + tt = vtk.get("DataSetTriangleFilter")() tt.SetInputData(ug) tt.SetTetrahedraOnly(True) tt.Update() @@ -177,12 +177,12 @@ def __init__( ################### if "tetra" in mapper: - self.mapper = vtk.vtkProjectedTetrahedraMapper() + self.mapper = vtk.get("ProjectedTetrahedraMapper")() elif "ray" in mapper: - self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() + self.mapper = vtk.get("UnstructuredGridVolumeRayCastMapper")() elif "zs" in mapper: - self.mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper() - elif isinstance(mapper, vtk.vtkMapper): + self.mapper = vtk.get("UnstructuredGridVolumeZSweepMapper")() + elif isinstance(mapper, vtk.get("Mapper")): self.mapper = mapper else: vedo.logger.error(f"Unknown mapper type {type(mapper)}") @@ -374,7 +374,7 @@ def check_validity(self, tol=0): This value is used as an epsilon for floating point equality checks throughout the cell checking process. """ - vald = vtk.vtkCellValidator() + vald = vtk.get("CellValidator")() if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) @@ -392,7 +392,7 @@ def threshold(self, name=None, above=None, below=None, on="cells"): Set keyword "on" to either "cells" or "points". """ - th = vtk.vtkThreshold() + th = vtk.get("Threshold")() th.SetInputData(self.dataset) if name is None: @@ -433,7 +433,7 @@ def decimate(self, scalars_name, fraction=0.5, n=0): .. note:: setting `fraction=0.1` leaves 10% of the original nr of tets. """ - decimate = vtk.vtkUnstructuredGridQuadricDecimation() + decimate = vtk.get("UnstructuredGridQuadricDecimation")() decimate.SetInputData(self.dataset) decimate.SetScalarsName(scalars_name) @@ -454,7 +454,7 @@ def subdvide(self): Increase the number of tets of a `TetMesh`. Subdivide one tetrahedron into twelve for every tetra. """ - sd = vtk.vtkSubdivideTetra() + sd = vtk.get("SubdivideTetra")() sd.SetInputData(self.dataset) sd.Update() self._update(sd.GetOutput()) @@ -472,7 +472,7 @@ def isosurface(self, value=True): if not self.dataset.GetPointData().GetScalars(): self.map_cells_to_points() scrange = self.dataset.GetPointData().GetScalars().GetRange() - cf = vtk.vtkContourFilter() # vtk.vtkContourGrid() + cf = vtk.get("ContourFilter")() # vtk.get("ContourGrid")() cf.SetInputData(self.dataset) if utils.is_sequence(value): @@ -486,7 +486,7 @@ def isosurface(self, value=True): cf.SetValue(0, value) cf.Update() - clp = vtk.vtkCleanPolyData() + clp = vtk.get("CleanPolyData")() clp.SetInputData(cf.GetOutput()) clp.Update() msh = Mesh(clp.GetOutput(), c=None).phong() @@ -505,11 +505,11 @@ def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) - plane = vtk.vtkPlane() + plane = vtk.get("Plane")() plane.SetOrigin(origin) plane.SetNormal(normal) - cc = vtk.vtkCutter() + cc = vtk.get("Cutter")() cc.SetInputData(self.dataset) cc.SetCutFunction(plane) cc.Update() From 750218576450d718dee7cb47cc5aa8667d2766fd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:36:39 +0200 Subject: [PATCH 173/251] aggressive substitution to vtk.get() transf.py --- vedo/transformations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vedo/transformations.py b/vedo/transformations.py index 43356695..1e9b396b 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -146,7 +146,7 @@ def apply_to(self, obj): if np.allclose(M - np.eye(4), 0): return - tp = vtk.vtkTransformPolyDataFilter() + tp = vtk.get("TransformPolyDataFilter")() tp.SetTransform(self.T) tp.SetInputData(obj.dataset) tp.Update() @@ -679,7 +679,7 @@ def apply_to(self, obj): obj.transform = self - tp = vtk.vtkTransformPolyDataFilter() + tp = vtk.get("TransformPolyDataFilter")() tp.SetTransform(self.T) tp.SetInputData(obj.dataset) tp.Update() From 23f7746cff13b2605f1a87e3db752a723d057981 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:38:06 +0200 Subject: [PATCH 174/251] aggressive substitution to vtk.get() ugrid.py --- vedo/ugrid.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vedo/ugrid.py b/vedo/ugrid.py index c64c4ae6..8e62d320 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -127,7 +127,7 @@ def __init__(self, inputobj=None): vedo.logger.error(f"cannot understand input type {inputtype}") return - self.mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() + self.mapper = vtk.get("UnstructuredGridVolumeRayCastMapper")() self.actor.SetMapper(self.mapper) self.mapper.SetInputData(self.dataset) ###NOT HERE? @@ -235,13 +235,13 @@ def extract_cell_type(self, ctype): uarr = self.dataset.GetCellTypesArray() ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") - selection_node = vtk.vtkSelectionNode() - selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) - selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) + selection_node = vtk.get("SelectionNode")() + selection_node.SetFieldType(vtk.get("SelectionNode").CELL) + selection_node.SetContentType(vtk.get("SelectionNode").INDICES) selection_node.SetSelectionList(uarrtyp) - selection = vtk.vtkSelection() + selection = vtk.get("Selection")() selection.AddNode(selection_node) - es = vtk.vtkExtractSelection() + es = vtk.get("ExtractSelection")() es.SetInputData(0, self.dataset) es.SetInputData(1, selection) es.Update() From ba851180afc80bdda185d4922bf300455a91a410 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:40:31 +0200 Subject: [PATCH 175/251] aggressive substitution to vtk.get() visual.py --- vedo/visual.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vedo/visual.py b/vedo/visual.py index fc9dbc57..80282043 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -90,7 +90,7 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation actor = self.actor if isinstance(self, vedo.UGrid): - geo = vtk.vtkGeometryFilter() + geo = vtk.get("GeometryFilter")() geo.SetInputData(self.dataset) geo.Update() actor = vedo.Mesh(geo.GetOutput()).cmap("rainbow").actor @@ -492,7 +492,7 @@ def clone2d(self, scale=None): vrange = self.mapper.GetScalarRange() sm = self.mapper.GetScalarMode() - mapper2d = vtk.vtkPolyDataMapper2D() + mapper2d = vtk.get("PolyDataMapper2D")() mapper2d.ShallowCopy(self.mapper) mapper2d.SetInputData(poly) mapper2d.SetColorMode(cm) @@ -1328,7 +1328,7 @@ def labels( vedo.logger.error("in labels(), array not found for points or cells") return None - tapp = vtk.vtkAppendPolyData() + tapp = vtk.get("AppendPolyData")() ninputs = 0 for i, e in enumerate(elems): @@ -1391,7 +1391,7 @@ def labels( T.RotateZ(zrot) T.Scale(scale, scale, scale) T.Translate(e) - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(tx_poly) tf.SetTransform(T) tf.Update() @@ -1839,7 +1839,7 @@ def caption( capt.SetAttachmentPoint(point) capt.SetBorder(True) capt.SetLeader(True) - sph = vtk.vtkSphereSource() + sph = vtk.get("SphereSource")() sph.Update() capt.SetLeaderGlyphData(sph.GetOutput()) capt.SetMaximumLeaderGlyphSize(5) From 0870f6ba4066aece47a2526142a408fac1502cb6 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:42:31 +0200 Subject: [PATCH 176/251] aggressive substitution to vtk.get() utils.py --- vedo/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vedo/utils.py b/vedo/utils.py index a89ebb3f..9d4f427b 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -515,7 +515,7 @@ def geometry(obj, extent=None): Set `extent` as the `[xmin,xmax, ymin,ymax, zmin,zmax]` bounding box to clip data. """ - gf = vtk.vtkGeometryFilter() + gf = vtk.get("GeometryFilter")() gf.SetInputData(obj) if extent is not None: gf.SetExtent(extent) @@ -536,7 +536,7 @@ def extract_cells_by_type(obj, types=()): Return: a `vtkDataSet` object which can be wrapped. """ - ef = vtk.vtkExtractCellsByType() + ef = vtk.get("ExtractCellsByType")() try: ef.SetInputData(obj.dataset) except AttributeError: From 861f61312f3e1d39808da22ab30b6a83a6023322 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 21:47:13 +0200 Subject: [PATCH 177/251] aggressive substitution to vtk.get() volum.py --- vedo/volume.py | 82 +++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/vedo/volume.py b/vedo/volume.py index cc36d3a4..a32505b9 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -139,14 +139,14 @@ def __init__( ################### if "gpu" in mapper: - self.mapper = vtk.vtkGPUVolumeRayCastMapper() + self.mapper = vtk.get("GPUVolumeRayCastMapper")() elif "opengl_gpu" in mapper: - self.mapper = vtk.vtkOpenGLGPUVolumeRayCastMapper() + self.mapper = vtk.get("OpenGLGPUVolumeRayCastMapper")() elif "smart" in mapper: - self.mapper = vtk.vtkSmartVolumeMapper() + self.mapper = vtk.get("SmartVolumeMapper")() elif "fixed" in mapper: - self.mapper = vtk.vtkFixedPointVolumeRayCastMapper() - elif isinstance(mapper, vtk.vtkMapper): + self.mapper = vtk.get("FixedPointVolumeRayCastMapper")() + elif isinstance(mapper, vtk.get("Mapper")): self.mapper = mapper else: print("Error unknown mapper type", [mapper]) @@ -166,7 +166,7 @@ def __init__( if isinstance(inputobj[0], str) and ".bmp" in inputobj[0].lower(): # scan sequence of BMP files - ima = vtk.vtkImageAppend() + ima = vtk.get("ImageAppend")() ima.SetAppendAxis(2) pb = utils.ProgressBar(0, len(inputobj)) for i in pb.range(): @@ -176,7 +176,7 @@ def __init__( picr = vtk.get("BMPReader")() picr.SetFileName(f) picr.Update() - mgf = vtk.vtkImageMagnitude() + mgf = vtk.get("ImageMagnitude")() mgf.SetInputData(picr.GetOutput()) mgf.Update() ima.AddInputData(mgf.GetOutput()) @@ -356,7 +356,7 @@ def component_weight(self, i, weight): def xslice(self, i): """Extract the slice at index `i` of volume along x-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() + vslice = vtk.get("ImageDataGeometryFilter")() vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if i > nx - 1: @@ -369,7 +369,7 @@ def xslice(self, i): def yslice(self, j): """Extract the slice at index `j` of volume along y-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() + vslice = vtk.get("ImageDataGeometryFilter")() vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if j > ny - 1: @@ -382,7 +382,7 @@ def yslice(self, j): def zslice(self, k): """Extract the slice at index `i` of volume along z-axis.""" - vslice = vtk.vtkImageDataGeometryFilter() + vslice = vtk.get("ImageDataGeometryFilter")() vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if k > nz - 1: @@ -402,7 +402,7 @@ def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) """ - reslice = vtk.vtkImageReslice() + reslice = vtk.get("ImageReslice")() reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) newaxis = utils.versor(normal) @@ -419,7 +419,7 @@ def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): reslice.SetInterpolationModeToLinear() reslice.SetAutoCropOutput(not autocrop) reslice.Update() - vslice = vtk.vtkImageDataGeometryFilter() + vslice = vtk.get("ImageDataGeometryFilter")() vslice.SetInputData(reslice.GetOutput()) vslice.Update() msh = Mesh(vslice.GetOutput()) @@ -505,7 +505,7 @@ def apply_transform(self, T, fit=False): tr.SetMatrix(M) T = tr - reslice = vtk.vtkImageReslice() + reslice = vtk.get("ImageReslice")() reslice.SetInputData(self.dataset) reslice.SetResliceTransform(T) reslice.SetOutputDimensionality(3) @@ -619,7 +619,7 @@ def permute_axes(self, x, y, z): Reorder the axes of the Volume by specifying the input axes which are supposed to become the new X, Y, and Z. """ - imp = vtk.vtkImagePermute() + imp = vtk.get("ImagePermute")() imp.SetFilteredAxes(x, y, z) imp.SetInputData(self.dataset) imp.Update() @@ -642,7 +642,7 @@ def resample(self, new_spacing, interpolation=1): interpolation : (int) 0=nearest_neighbor, 1=linear, 2=cubic """ - rsp = vtk.vtkImageResample() + rsp = vtk.get("ImageResample")() oldsp = self.spacing() for i in range(3): if oldsp[i] != new_spacing[i]: @@ -664,7 +664,7 @@ def threshold(self, above=None, below=None, replace=None, replace_value=None): Find the voxels that contain a value above/below the input values and replace them with a new value (default is 0). """ - th = vtk.vtkImageThreshold() + th = vtk.get("ImageThreshold")() th.SetInputData(self.dataset) # sanity checks @@ -726,7 +726,7 @@ def crop(self, left=None, right=None, back=None, front=None, bottom=None, top=No Example: `vol.crop(VOI=(xmin, xmax, ymin, ymax, zmin, zmax)) # all integers nrs` """ - extractVOI = vtk.vtkExtractVOI() + extractVOI = vtk.get("ExtractVOI")() extractVOI.SetInputData(self.dataset) if VOI: @@ -775,7 +775,7 @@ def append(self, volumes, axis="z", preserve_extents=False): ``` ![](https://vedo.embl.es/images/feats/volume_append.png) """ - ima = vtk.vtkImageAppend() + ima = vtk.get("ImageAppend")() ima.SetInputData(self.dataset) if not utils.is_sequence(volumes): volumes = [volumes] @@ -825,7 +825,7 @@ def pad(self, voxels=10, value=0): ![](https://vedo.embl.es/images/volumetric/volume_pad.png) """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() - pf = vtk.vtkImageConstantPad() + pf = vtk.get("ImageConstantPad")() pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(voxels): @@ -851,7 +851,7 @@ def resize(self, *newdims): """Increase or reduce the number of voxels of a Volume with interpolation.""" old_dims = np.array(self.dataset.GetDimensions()) old_spac = np.array(self.dataset.GetSpacing()) - rsz = vtk.vtkImageResize() + rsz = vtk.get("ImageResize")() rsz.SetResizeMethodToOutputDimensions() rsz.SetInputData(self.dataset) rsz.SetOutputDimensions(newdims) @@ -867,7 +867,7 @@ def resize(self, *newdims): def normalize(self): """Normalize that scalar components for each point.""" - norm = vtk.vtkImageNormalize() + norm = vtk.get("ImageNormalize")() norm.SetInputData(self.dataset) norm.Update() self._update(norm.GetOutput()) @@ -880,7 +880,7 @@ def mirror(self, axis="x"): """ img = self.dataset - ff = vtk.vtkImageFlip() + ff = vtk.get("ImageFlip")() ff.SetInputData(img) if axis.lower() == "x": ff.SetFilteredAxis(0) @@ -916,24 +916,24 @@ def operation(self, operation, volume2=None): mf = None if op in ["median"]: - mf = vtk.vtkImageMedian3D() + mf = vtk.get("ImageMedian3D")() mf.SetInputData(image1) elif op in ["mag"]: - mf = vtk.vtkImageMagnitude() + mf = vtk.get("ImageMagnitude")() mf.SetInputData(image1) elif op in ["dot", "dotproduct"]: - mf = vtk.vtkImageDotProduct() + mf = vtk.get("ImageDotProduct")() mf.SetInput1Data(image1) mf.SetInput2Data(volume2.dataset) elif op in ["grad", "gradient"]: - mf = vtk.vtkImageGradient() + mf = vtk.get("ImageGradient")() mf.SetDimensionality(3) mf.SetInputData(image1) elif op in ["div", "divergence"]: - mf = vtk.vtkImageDivergence() + mf = vtk.get("ImageDivergence")() mf.SetInputData(image1) elif op in ["laplacian"]: - mf = vtk.vtkImageLaplacian() + mf = vtk.get("ImageLaplacian")() mf.SetDimensionality(3) mf.SetInputData(image1) @@ -945,7 +945,7 @@ def operation(self, operation, volume2=None): ) return vol ########################### - mat = vtk.vtkImageMathematics() + mat = vtk.get("ImageMathematics")() mat.SetInput1Data(image1) K = None @@ -1041,13 +1041,13 @@ def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass - fft = vtk.vtkImageFFT() + fft = vtk.get("ImageFFT")() fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if high_cutoff: - blp = vtk.vtkImageButterworthLowPass() + blp = vtk.get("ImageButterworthLowPass")() blp.SetInputData(out) blp.SetCutOff(high_cutoff) blp.SetOrder(order) @@ -1055,18 +1055,18 @@ def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): out = blp.GetOutput() if low_cutoff: - bhp = vtk.vtkImageButterworthHighPass() + bhp = vtk.get("ImageButterworthHighPass")() bhp.SetInputData(out) bhp.SetCutOff(low_cutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() - rfft = vtk.vtkImageRFFT() + rfft = vtk.get("ImageRFFT")() rfft.SetInputData(out) rfft.Update() - ecomp = vtk.vtkImageExtractComponents() + ecomp = vtk.get("ImageExtractComponents")() ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() @@ -1086,7 +1086,7 @@ def smooth_gaussian(self, sigma=(2, 2, 2), radius=None): radius factor(s) determine how far out the gaussian kernel will go before being clamped to zero. A list can be given too. """ - gsf = vtk.vtkImageGaussianSmooth() + gsf = vtk.get("ImageGaussianSmooth")() gsf.SetDimensionality(3) gsf.SetInputData(self.dataset) if utils.is_sequence(sigma): @@ -1108,7 +1108,7 @@ def smooth_median(self, neighbours=(2, 2, 2)): Median filter that replaces each pixel with the median value from a rectangular neighborhood around that pixel. """ - imgm = vtk.vtkImageMedian3D() + imgm = vtk.get("ImageMedian3D")() imgm.SetInputData(self.dataset) if utils.is_sequence(neighbours): imgm.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) @@ -1157,7 +1157,7 @@ def dilate(self, neighbours=(2, 2, 2)): def magnitude(self): """Colapses components with magnitude function.""" - imgm = vtk.vtkImageMagnitude() + imgm = vtk.get("ImageMagnitude")() imgm.SetInputData(self.dataset) imgm.Update() self._update(imgm.GetOutput()) @@ -1173,7 +1173,7 @@ def topoints(self): Examples: - [vol2points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/vol2points.py) """ - v2p = vtk.vtkImageToPoints() + v2p = vtk.get("ImageToPoints")() v2p.SetInputData(self.dataset) v2p.Update() mpts = vedo.Points(v2p.GetOutput()) @@ -1199,7 +1199,7 @@ def euclidean_distance(self, anisotropy=False, max_distance=None): Examples: - [euclidian_dist.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/euclidian_dist.py) """ - euv = vtk.vtkImageEuclideanDistance() + euv = vtk.get("ImageEuclideanDistance")() euv.SetInputData(self.dataset) euv.SetConsiderAnisotropy(anisotropy) if max_distance is not None: @@ -1220,7 +1220,7 @@ def correlation_with(self, vol2, dim=2): The output size will match the size of the first input. The second input is considered the correlation kernel. """ - imc = vtk.vtkImageCorrelation() + imc = vtk.get("ImageCorrelation")() imc.SetInput1Data(self.dataset) imc.SetInput2Data(vol2.dataset) imc.SetDimensionality(dim) @@ -1232,7 +1232,7 @@ def correlation_with(self, vol2, dim=2): def scale_voxels(self, scale=1): """Scale the voxel content by factor `scale`.""" - rsl = vtk.vtkImageReslice() + rsl = vtk.get("ImageReslice")() rsl.SetInputData(self.dataset) rsl.SetScalarScale(scale) rsl.Update() From eb1a32a5820e912ad2e20ce42cca70d62b316cea Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 25 Oct 2023 22:08:58 +0200 Subject: [PATCH 178/251] removal of imports in vtkclasses --- vedo/mesh.py | 2 +- vedo/pointcloud.py | 2 +- vedo/vtkclasses.py | 270 ++------------------------------------------- 3 files changed, 9 insertions(+), 265 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index ee609211..96ce2023 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -2120,7 +2120,7 @@ def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): p0, p1 = p0.vertices if not self.line_locator: - self.line_locator = vtk.vtkOBBTree() + self.line_locator = vtk.get("OBBTree")() self.line_locator.SetDataSet(self.dataset) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index a5205797..616e2230 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -3229,7 +3229,7 @@ def generate_delaunay2d( delny.SetSourceData(boundary) if mode == "fit": - delny.SetProjectionPlaneMode(vtk.VTK_BEST_FITTING_PLANE) + delny.SetProjectionPlaneMode(vtk.get("VTK_BEST_FITTING_PLANE")) delny.Update() msh = vedo.mesh.Mesh(delny.GetOutput()) diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index e97653be..fa64808f 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -139,7 +139,6 @@ def dump_hierarchy_to_file(fname=""): vtkIdList, vtkIntArray, vtkLookupTable, - vtkMath, vtkPoints, vtkStringArray, vtkUnsignedCharArray, @@ -203,22 +202,13 @@ def dump_hierarchy_to_file(fname=""): VTK_HEXAGONAL_PRISM, VTK_PENTAGONAL_PRISM, vtkCellArray, - vtkBox, - vtkCellLocator, - vtkCylinder, vtkDataSetAttributes, vtkDataObject, vtkDataSet, vtkFieldData, vtkHexagonalPrism, vtkHexahedron, - vtkImplicitDataSet, - vtkImplicitSelectionLoop, - vtkImplicitWindowFunction, - vtkIterativeClosestPointTransform, vtkLine, - vtkMultiBlockDataSet, - vtkMutableDirectedGraph, vtkPentagonalPrism, vtkPlane, vtkPlanes, @@ -228,11 +218,6 @@ def dump_hierarchy_to_file(fname=""): vtkPolygon, vtkPyramid, vtkQuadric, - vtkSelection, - vtkSelectionNode, - vtkSphere, - vtkStaticCellLocator, - vtkStaticPointLocator, vtkTetra, vtkTriangle, vtkVoxel, @@ -309,48 +294,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkCommonTransforms" -from vtkmodules.vtkFiltersCore import ( - VTK_BEST_FITTING_PLANE, - vtk3DLinearGridCrinkleExtractor, - vtkAppendPolyData, - vtkCellCenters, - vtkCellDataToPointData, - vtkCenterOfMass, - vtkCleanPolyData, - vtkClipPolyData, - vtkPolyDataConnectivityFilter, - vtkPolyDataEdgeConnectivityFilter, - vtkContourFilter, - vtkContourGrid, - vtkCutter, - vtkDecimatePro, - vtkDelaunay2D, - vtkDelaunay3D, - vtkElevationFilter, - vtkFeatureEdges, - vtkFlyingEdges3D, - vtkGlyph3D, - vtkIdFilter, - vtkImageAppend, - vtkImplicitPolyDataDistance, - vtkMarchingSquares, - vtkMaskPoints, - vtkMassProperties, - vtkPointDataToCellData, - vtkPolyDataNormals, - vtkProbeFilter, - vtkQuadricDecimation, - vtkResampleWithDataSet, - vtkReverseSense, - vtkStripper, - vtkTensorGlyph, - vtkThreshold, - vtkTriangleFilter, - vtkTubeFilter, - vtkUnstructuredGridQuadricDecimation, - vtkVoronoi2D, - vtkWindowedSincPolyDataFilter, -) + for name in [ "VTK_BEST_FITTING_PLANE", "vtk3DLinearGridCrinkleExtractor", @@ -398,12 +342,6 @@ def dump_hierarchy_to_file(fname=""): location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" location["vtkPolyDataPlaneCutter"] = "vtkFiltersCore" -from vtkmodules.vtkFiltersExtraction import ( - vtkExtractCellsByType, - vtkExtractGeometry, - vtkExtractPolyDataGeometry, - vtkExtractSelection, -) for name in [ "vtkExtractCellsByType", "vtkExtractGeometry", @@ -412,40 +350,12 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkFiltersExtraction" -try: - from vtkmodules.vtkFiltersExtraction import vtkExtractEdges # vtk9.0 - location["vtkExtractEdges"] = "vtkFiltersExtraction" -except ImportError: - from vtkmodules.vtkFiltersCore import vtkExtractEdges # vtk9.2 - location["vtkExtractEdges"] = "vtkFiltersCore" +location["vtkExtractEdges"] = "vtkFiltersCore" location["vtkStreamTracer"] = "vtkFiltersFlowPaths" -from vtkmodules.vtkFiltersGeneral import ( - vtkBooleanOperationPolyDataFilter, - vtkBoxClipDataSet, - vtkCellValidator, - vtkClipDataSet, - vtkCountVertices, - vtkContourTriangulator, - vtkCurvatures, - vtkDataSetTriangleFilter, - vtkDensifyPolyData, - vtkDistancePolyDataFilter, - vtkGradientFilter, - vtkIntersectionPolyDataFilter, - vtkLoopBooleanPolyDataFilter, - vtkTransformPolyDataFilter, - vtkOBBTree, - vtkQuantizePolyDataPoints, - vtkRandomAttributeGenerator, - vtkShrinkFilter, - vtkShrinkPolyData, - vtkRectilinearGridToTetrahedra, - vtkVertexGlyphFilter, -) for name in [ "vtkBooleanOperationPolyDataFilter", "vtkBoxClipDataSet", @@ -479,21 +389,11 @@ def dump_hierarchy_to_file(fname=""): from vtkmodules.vtkFiltersGeneral import vtkCellTreeLocator location["vtkCellTreeLocator"] = "vtkFiltersGeneral" -from vtkmodules.vtkFiltersGeometry import ( - vtkGeometryFilter, - vtkDataSetSurfaceFilter, - vtkImageDataGeometryFilter, -) + location["vtkGeometryFilter"] = "vtkFiltersGeometry" location["vtkDataSetSurfaceFilter"] = "vtkFiltersGeometry" location["vtkImageDataGeometryFilter"] = "vtkFiltersGeometry" -try: - from vtkmodules.vtkFiltersGeometry import vtkMarkBoundaryFilter - location["vtkMarkBoundaryFilter"] = "vtkFiltersGeometry" -except ImportError: - pass - for name in [ "vtkFacetReader", @@ -505,26 +405,6 @@ def dump_hierarchy_to_file(fname=""): location[name] = "vtkFiltersHybrid" -from vtkmodules.vtkFiltersModeling import ( - vtkAdaptiveSubdivisionFilter, - vtkBandedPolyDataContourFilter, - vtkButterflySubdivisionFilter, - vtkContourLoopExtraction, - vtkCookieCutter, - vtkDijkstraGraphGeodesicPath, - vtkFillHolesFilter, - vtkHausdorffDistancePointSetFilter, - vtkLinearExtrusionFilter, - vtkLinearSubdivisionFilter, - vtkLoopSubdivisionFilter, - vtkRibbonFilter, - vtkRotationalExtrusionFilter, - vtkRuledSurfaceFilter, - vtkSectorSource, - vtkSelectEnclosedPoints, - vtkSelectPolyData, - vtkSubdivideTetra, -) for name in [ "vtkAdaptiveSubdivisionFilter", "vtkBandedPolyDataContourFilter", @@ -547,34 +427,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkFiltersModeling" -try: - from vtkmodules.vtkFiltersModeling import vtkCollisionDetectionFilter - location["vtkCollisionDetectionFilter"] = "vtkFiltersModeling" -except ImportError: - pass -try: - from vtkmodules.vtkFiltersModeling import vtkImprintFilter - location["vtkImprintFilter"] = "vtkFiltersModeling" -except ImportError: - pass - -from vtkmodules.vtkFiltersPoints import ( - vtkConnectedPointsFilter, - vtkDensifyPointCloudFilter, - vtkEuclideanClusterExtraction, - vtkExtractEnclosedPoints, - vtkExtractSurface, - vtkGaussianKernel, - vtkLinearKernel, - vtkPCANormalEstimation, - vtkPointDensityFilter, - vtkPointInterpolator, - vtkRadiusOutlierRemoval, - vtkShepardKernel, - vtkSignedDistance, - vtkVoronoiKernel, -) for name in [ "vtkConnectedPointsFilter", "vtkDensifyPointCloudFilter", @@ -594,25 +447,6 @@ def dump_hierarchy_to_file(fname=""): location[name] = "vtkFiltersPoints" -from vtkmodules.vtkFiltersSources import ( - vtkArcSource, - vtkArrowSource, - vtkConeSource, - vtkCubeSource, - vtkCylinderSource, - vtkDiskSource, - vtkFrustumSource, - vtkGlyphSource2D, - vtkGraphToPolyData, - vtkLineSource, - vtkOutlineCornerFilter, - vtkPlaneSource, - vtkPointSource, - vtkProgrammableSource, - vtkSphereSource, - vtkTexturedSphereSource, - vtkTessellatedBoxSource, -) for name in [ "vtkArcSource", "vtkArrowSource", @@ -716,30 +550,9 @@ def dump_hierarchy_to_file(fname=""): location[name] = "vtkIOXML" -from vtkmodules.vtkImagingColor import ( - vtkImageLuminance, - vtkImageMapToWindowLevelColors, -) location["vtkImageLuminance"] = "vtkImagingColor" location["vtkImageMapToWindowLevelColors"] = "vtkImagingColor" -from vtkmodules.vtkImagingCore import ( - vtkExtractVOI, - vtkImageAppendComponents, - vtkImageBlend, - vtkImageCast, - vtkImageConstantPad, - vtkImageExtractComponents, - vtkImageFlip, - vtkImageMapToColors, - vtkImageMirrorPad, - vtkImagePermute, - vtkImageResample, - vtkImageResize, - vtkImageReslice, - vtkImageThreshold, - vtkImageTranslateExtent, -) for name in [ "vtkImageAppendComponents", "vtkImageBlend", @@ -758,13 +571,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkImagingCore" -from vtkmodules.vtkImagingFourier import ( - vtkImageButterworthHighPass, - vtkImageButterworthLowPass, - vtkImageFFT, - vtkImageFourierCenter, - vtkImageRFFT, -) + for name in [ "vtkImageButterworthHighPass", "vtkImageButterworthLowPass", @@ -774,16 +581,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkImagingFourier" -from vtkmodules.vtkImagingGeneral import ( - vtkImageCorrelation, - vtkImageEuclideanDistance, - vtkImageGaussianSmooth, - vtkImageGradient, - vtkImageHybridMedian2D, - vtkImageLaplacian, - vtkImageMedian3D, - vtkImageNormalize, -) + for name in [ "vtkImageCorrelation", "vtkImageEuclideanDistance", @@ -796,17 +594,10 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkImagingGeneral" -from vtkmodules.vtkImagingHybrid import vtkImageToPoints, vtkSampleFunction for name in ["vtkImageToPoints", "vtkSampleFunction"]: location[name] = "vtkImagingHybrid" -from vtkmodules.vtkImagingMath import ( - vtkImageDivergence, - vtkImageDotProduct, - vtkImageLogarithmicScale, - vtkImageMagnitude, - vtkImageMathematics, -) + for name in [ "vtkImageDivergence", "vtkImageDotProduct", @@ -856,7 +647,6 @@ def dump_hierarchy_to_file(fname=""): location[name] = "vtkInteractionStyle" from vtkmodules.vtkInteractionWidgets import ( - vtkBalloonRepresentation, vtkBalloonWidget, vtkBoxWidget, vtkContourWidget, @@ -866,8 +656,6 @@ def dump_hierarchy_to_file(fname=""): vtkOrientationMarkerWidget, vtkOrientedGlyphContourRepresentation, vtkPolygonalSurfacePointPlacer, - vtkSliderRepresentation2D, - vtkSliderRepresentation3D, vtkSliderWidget, vtkSphereWidget, ) @@ -893,15 +681,12 @@ def dump_hierarchy_to_file(fname=""): from vtkmodules.vtkRenderingAnnotation import ( - vtkAnnotatedCubeActor, vtkAxesActor, vtkAxisActor2D, vtkCaptionActor2D, vtkCornerAnnotation, - vtkCubeAxesActor, vtkLegendBoxActor, vtkLegendScaleActor, - vtkPolarAxesActor, vtkScalarBarActor, vtkXYPlotActor, ) @@ -928,26 +713,16 @@ def dump_hierarchy_to_file(fname=""): vtkAssembly, vtkBillboardTextActor3D, vtkCamera, - vtkCameraInterpolator, - vtkColorTransferFunction, vtkCoordinate, vtkDataSetMapper, - vtkDistanceToCamera, vtkFlagpoleLabel, vtkFollower, - vtkHierarchicalPolyDataMapper, vtkImageActor, - vtkImageMapper, vtkImageProperty, vtkImageSlice, - vtkInteractorEventRecorder, vtkInteractorObserver, vtkLight, vtkLogLookupTable, - vtkMapper, - vtkPointGaussianMapper, - vtkPolyDataMapper, - vtkPolyDataMapper2D, vtkProp, vtkPropAssembly, vtkPropCollection, @@ -956,17 +731,12 @@ def dump_hierarchy_to_file(fname=""): vtkRenderWindow, vtkRenderer, vtkRenderWindowInteractor, - vtkSelectVisiblePoints, - vtkSkybox, vtkTextActor, - vtkTextMapper, vtkTextProperty, - vtkTextRenderer, vtkTexture, vtkViewport, vtkVolume, vtkVolumeProperty, - vtkWindowToImageFilter, ) for name in [ "vtkActor", @@ -1024,22 +794,6 @@ def dump_hierarchy_to_file(fname=""): location["vtkLabeledDataMapper"] = "vtkRenderingLabel" -from vtkmodules.vtkRenderingOpenGL2 import ( - vtkDepthOfFieldPass, - vtkCameraPass, - vtkDualDepthPeelingPass, - vtkEquirectangularToCubeMapTexture, - vtkLightsPass, - vtkOpaquePass, - vtkOverlayPass, - vtkRenderPassCollection, - vtkSSAOPass, - vtkSequencePass, - vtkShader, - vtkShadowMapPass, - vtkTranslucentPass, - vtkVolumetricPass, -) for name in [ "vtkDepthOfFieldPass", "vtkCameraPass", @@ -1058,13 +812,6 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkRenderingOpenGL2" -from vtkmodules.vtkRenderingVolume import ( - vtkFixedPointVolumeRayCastMapper, - vtkGPUVolumeRayCastMapper, - vtkProjectedTetrahedraMapper, - vtkUnstructuredGridVolumeRayCastMapper, - vtkUnstructuredGridVolumeZSweepMapper, -) for name in [ "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", @@ -1074,10 +821,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkRenderingVolume" -from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLGPUVolumeRayCastMapper, - vtkSmartVolumeMapper, -) + for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", From 5ebb232b65b37b04a45fe6a9e7f7fe8055d72d77 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 26 Oct 2023 00:11:43 +0200 Subject: [PATCH 179/251] fix vtk.vtkPolyDataMapper --- vedo/pointcloud.py | 2 +- vedo/vtkclasses.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 616e2230..e22dcd7c 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -535,7 +535,7 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.properties = self.actor.GetProperty() self.properties_backface = self.actor.GetBackfaceProperty() - self.mapper = vtk.vtkPolyDataMapper() + self.mapper = vtk.get("PolyDataMapper")() self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() self.actor.data = self # so Actor can access this object diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index fa64808f..1e6e7df6 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -112,7 +112,6 @@ def dump_hierarchy_to_file(fname=""): from vtkmodules.vtkCommonCore import ( mutable, - VTK_UNSIGNED_CHAR, VTK_UNSIGNED_SHORT, VTK_UNSIGNED_INT, VTK_UNSIGNED_LONG, From a1de19ae95815827935e88f78659325f06368fb1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 26 Oct 2023 01:01:10 +0200 Subject: [PATCH 180/251] fix some silly mistakes --- docs/changes.md | 4 +++- vedo/colors.py | 2 +- vedo/plotter.py | 2 +- vedo/pyplot.py | 22 +++++++++++----------- vedo/version.py | 2 +- vedo/vtkclasses.py | 17 +++++++++++++---- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 87af655d..2a92d695 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -69,7 +69,9 @@ tests/issues/discussion_800.py tests/issues/issue_905.py slice_plane1.py -examples/basic/cells_within_bounds.py because of clone() + +background_image.py + ``` ### TODO diff --git a/vedo/colors.py b/vedo/colors.py index d96ed276..1984e082 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -796,7 +796,7 @@ def get_color(rgb=None, hsv=None): return tuple(rgbh) else: # vtk name color - namedColors = vtk.get("NamedColors") + namedColors = vtk.get("NamedColors")() rgba = [0, 0, 0, 0] namedColors.GetColor(c, rgba) return (rgba[0] / 255.0, rgba[1] / 255.0, rgba[2] / 255.0) diff --git a/vedo/plotter.py b/vedo/plotter.py index 18a3d72a..f0ebef90 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2010,7 +2010,7 @@ def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): sequence = vtk.get("SequencePass")() sequence.SetPasses(collection) - cam = vtk.get("")() + cam = vtk.get("CameraPass")() cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 9d599bf5..2d996648 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -45,7 +45,7 @@ ########################################################################## def _to2d(obj, offset, scale): - tp = vtk.vtkTransformPolyDataFilter() + tp = vtk.get("TransformPolyDataFilter")() transform = vtk.vtkTransform() transform.Scale(scale, scale, scale) transform.Translate(-offset[0], -offset[1], 0) @@ -55,7 +55,7 @@ def _to2d(obj, offset, scale): poly = tp.GetOutput() - mapper2d = vtk.vtkPolyDataMapper2D() + mapper2d = vtk.get("PolyDataMapper2D")() mapper2d.SetInputData(poly) act2d = vtk.vtkActor2D() @@ -2711,7 +2711,7 @@ def _plot_fxy( if c is not None: texture = None # disable - ps = vtk.vtkPlaneSource() + ps = vtk.get("PlaneSource")() ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() @@ -2746,7 +2746,7 @@ def _plot_fxy( for j in range(cellIds.GetNumberOfIds()): poly.DeleteCell(cellIds.GetId(j)) # flag cell poly.RemoveDeletedCells() - cl = vtk.vtkCleanPolyData() + cl = vtk.get("CleanPolyData")() cl.SetInputData(poly) cl.Update() poly = cl.GetOutput() @@ -2777,13 +2777,13 @@ def _plot_fxy( acts = [mesh] if zlevels: - elevation = vtk.vtkElevationFilter() + elevation = vtk.get("ElevationFilter")() elevation.SetInputData(poly) bounds = poly.GetBounds() elevation.SetLowPoint(0, 0, bounds[4]) elevation.SetHighPoint(0, 0, bounds[5]) elevation.Update() - bcf = vtk.vtkBandedPolyDataContourFilter() + bcf = vtk.get("BandedPolyDataContourFilter")() bcf.SetInputData(elevation.GetOutput()) bcf.SetScalarModeToValue() bcf.GenerateContourEdgesOn() @@ -2828,7 +2828,7 @@ def _plot_fz( bins=(75, 75), axes=True, ): - ps = vtk.vtkPlaneSource() + ps = vtk.get("PlaneSource")() ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() @@ -3140,7 +3140,7 @@ def _histogram_hex_bin( r = 0.47 / n * 1.2 * dx for i in range(n + 3): for j in range(m + 2): - cyl = vtk.vtkCylinderSource() + cyl = vtk.get("CylinderSource")() cyl.SetResolution(6) cyl.CappingOn() cyl.SetRadius(0.5) @@ -3159,7 +3159,7 @@ def _histogram_hex_bin( else: t.Translate(p[0], p[1], ne) t.RotateX(90) # put it along Z - tf = vtk.vtkTransformPolyDataFilter() + tf = vtk.get("TransformPolyDataFilter")() tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3908,7 +3908,7 @@ def CornerPlot(points, pos=1, s=0.2, title="", c="b", bg="k", lines=True, dots=T data = vtk.vtkDataObject() data.SetFieldData(field) - xyplot = vtk.vtkXYPlotActor() + xyplot = vtk.get("XYPlotActor")() xyplot.AddDataObjectInput(data) xyplot.SetDataObjectXComponent(0, 0) xyplot.SetDataObjectYComponent(0, 1) @@ -4315,7 +4315,7 @@ def build(self): # Use Glyph3D to repeat the glyph on all edges. arrows = None if self.arrow_scale: - arrow_source = vtk.vtkGlyphSource2D() + arrow_source = vtk.get("GlyphSource2D")() arrow_source.SetGlyphTypeToEdgeArrow() arrow_source.SetScale(self.arrow_scale) arrow_source.Update() diff --git a/vedo/version.py b/vedo/version.py index f5099c47..d4effb02 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev21a' +_version = '2023.5.0+dev22a' diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 1e6e7df6..76a34f8a 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -77,6 +77,10 @@ def dump_hierarchy_to_file(fname=""): w.write(f"{module.__name__}.{subitem}\n") ###################################################################### + +import vtkmodules.vtkRenderingOpenGL2 + + for name in [ "vtkKochanekSpline", "vtkCardinalSpline", @@ -335,11 +339,12 @@ def dump_hierarchy_to_file(fname=""): "vtkUnstructuredGridQuadricDecimation", "vtkVoronoi2D", "vtkWindowedSincPolyDataFilter", + "vtkStaticCleanUnstructuredGrid", + "vtkPolyDataPlaneCutter" ]: location[name] = "vtkFiltersCore" +from vtkmodules.vtkFiltersCore import vtkGlyph3D -location["vtkStaticCleanUnstructuredGrid"] = "vtkFiltersCore" -location["vtkPolyDataPlaneCutter"] = "vtkFiltersCore" for name in [ "vtkExtractCellsByType", @@ -567,6 +572,7 @@ def dump_hierarchy_to_file(fname=""): "vtkImageReslice", "vtkImageThreshold", "vtkImageTranslateExtent", + "vtkExtractVOI", ]: location[name] = "vtkImagingCore" @@ -687,7 +693,6 @@ def dump_hierarchy_to_file(fname=""): vtkLegendBoxActor, vtkLegendScaleActor, vtkScalarBarActor, - vtkXYPlotActor, ) for name in [ "vtkAnnotatedCubeActor", @@ -811,6 +816,7 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkRenderingOpenGL2" + for name in [ "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", @@ -820,7 +826,10 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkRenderingVolume" - +from vtkmodules.vtkRenderingVolumeOpenGL2 import ( + vtkOpenGLGPUVolumeRayCastMapper, + vtkSmartVolumeMapper, +) for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", From 7eb52a5c40b4567c70294a1711b27e2bd2afd8b7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 26 Oct 2023 14:22:47 +0200 Subject: [PATCH 181/251] add keyword add examples/pyplot/plot_fxy2.py --- docs/changes.md | 2 + examples/pyplot/{plot_fxy.py => plot_fxy1.py} | 0 examples/pyplot/plot_fxy2.py | 88 +++++++++++++++++++ vedo/file_io.py | 4 +- vedo/plotter.py | 34 ++++++- vedo/pyplot.py | 4 +- 6 files changed, 128 insertions(+), 4 deletions(-) rename examples/pyplot/{plot_fxy.py => plot_fxy1.py} (100%) create mode 100644 examples/pyplot/plot_fxy2.py diff --git a/docs/changes.md b/docs/changes.md index 2a92d695..f50bffcd 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -21,6 +21,7 @@ see `examples/pyplot/embed_matplotlib.py`. - improvements to method `mesh.clone2d()` - name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` - reformat how vtk classes are imported (allow some laziness) +- add `.show(..., screenshot="myfile.png")` keyword @@ -59,6 +60,7 @@ examples/simulations/lorenz.py examples/volumetric/slicer1.py examples/other/flag_labels1.py examples/pyplot/embed_matplotlib.py +examples/pyplot/plot_fxy2.py ``` diff --git a/examples/pyplot/plot_fxy.py b/examples/pyplot/plot_fxy1.py similarity index 100% rename from examples/pyplot/plot_fxy.py rename to examples/pyplot/plot_fxy1.py diff --git a/examples/pyplot/plot_fxy2.py b/examples/pyplot/plot_fxy2.py new file mode 100644 index 00000000..4f9b53dc --- /dev/null +++ b/examples/pyplot/plot_fxy2.py @@ -0,0 +1,88 @@ +import numpy as np +from scipy import special +from scipy.special import jn_zeros +from vedo import ScalarBar3D, Line, show, settings +from vedo.colors import color_map, build_lut +from vedo.pyplot import plot + +Nr = 1 +Nθ = 3 + +settings.default_font = "Theemim" +settings.interpolate_scalars_before_mapping = False +axes_opts = dict( + xtitle="x", ytitle="y", ztitle="|f(x,y)|", + xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, + xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, + ztitle_offset=0.03, +) + +def custom_lut_surface(name, vmin=0, vmax=1, N=256): + # Create a custom look-up-table for the surface + table = [] + x = np.linspace(vmin, vmax, N) + for i in range(N): + rgb = color_map(i, name, 0, N-1) + table.append([x[i], rgb]) + return build_lut(table) + +def custom_table_scalarbar(name): + # Create a custom table of colors and labels for the scalarbar + table = [] + x = np.linspace(-np.pi,np.pi, 401) + labs = ["-:pi" , "-3:pi/4", "-:pi/2", "-:pi/4", "0", + "+:pi/4", "+:pi/2", "+3:pi/4","+:pi"] + for i in range(401): + rgb = color_map(i, name, 0, 400) + if i%50 == 0: + table.append([x[i], rgb, 1, labs[i//50]]) + else: + table.append([x[i], rgb]) + return table + +def f(x, y): + d2 = x**2 + y**2 + if d2 > 1: + return np.nan + else: + r = np.sqrt(d2) + θ = np.arctan2(y, x) + kr = jn_zeros(Nθ, 4)[Nr] + return special.jn(Nθ, kr * r) * np.exp(1j * Nθ * θ) + +p1 = plot( + lambda x,y: np.abs(f(x,y)), + xlim=[-1, 1], ylim=[-1, 1], + bins=(100, 100), + show_nan=False, + axes=axes_opts, +) + +# Unpack the plot objects to customize them +msh = p1.unpack(0).triangulate().lighting('glossy') + +pts = msh.vertices # get the points +zvals = pts[:,2] # get the z values +θvals = [np.angle(f(*p[:2])) for p in pts] # get the phases + +lut = custom_lut_surface("hsv", vmin=-np.pi, vmax=np.pi) +msh.cmap(lut, θvals) # apply the color map + +table = custom_table_scalarbar("hsv") +lut = build_lut(table, vmin=-np.pi,vmax=np.pi) +line = Line([(1,-1), (1,1)]) # a dummy line to attach the scalarbar to +line.cmap("hsv", line.vertices[:,2]) +scbar = ScalarBar3D( + line, title=f"N_r ={Nr}, N_θ ={Nθ}, phase :phi in radians", + label_rotation=90, c='black', + categories=table, +) + +# Set a specific camera position and orientation (press shift-C to see it) +cam = dict( + position=(3.88583, 0.155949, 3.88584), + focal_point=(0, 0, 0), + viewup=(-0.7, 0, 0.7), + distance=5.4, +) +show(p1, scbar, camera=cam).close() diff --git a/vedo/file_io.py b/vedo/file_io.py index 1db7e936..690a998d 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -335,9 +335,9 @@ def _load_file(filename, unpack): elif ".bmp" in fl: picr = vtk.get("vtkBMPReader")() elif ".gif" in fl: - from PIL import Image, ImageSequence + from PIL import Image as PILImage, ImageSequence - img = Image.open(filename) + img = PILImage.open(filename) frames = [] for frame in ImageSequence.Iterator(img): a = np.array(frame.convert("RGB").getdata(), dtype=np.uint8) diff --git a/vedo/plotter.py b/vedo/plotter.py index f0ebef90..22fe564a 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -110,6 +110,7 @@ def show( roll=0.0, camera=None, mode=0, + screenshot="", new=False, ): """ @@ -268,6 +269,7 @@ def show( camera=camera, interactive=False, mode=mode, + screenshot=screenshot, bg=bg, bg2=bg2, axes=axes, @@ -296,6 +298,7 @@ def show( camera=camera, interactive=interactive, mode=mode, + screenshot=screenshot, bg=bg, bg2=bg2, axes=axes, @@ -2925,6 +2928,7 @@ def show( bg2=None, size=None, title=None, + screenshot="", ): """ Render a list of objects. @@ -3008,6 +3012,21 @@ def show( - 9 = Unicam - 10 = Image - Check out `vedo.interaction_modes` for more options. + + bg : (str, list) + background color in RGB format, or string name + + bg2 : (str, list) + second background color to create a gradient background + + size : (str, list) + size of the window, e.g. size="fullscreen", or size=[600,400] + + title : (str) + window title text + + screenshot : (str) + save a screenshot of the window to file """ if self.wx_widget: return self @@ -3193,6 +3212,9 @@ def show( self.user_mode(mode) + if screenshot: + self.screenshot(screenshot) + if self._interactive: self.interactor.Start() @@ -3432,13 +3454,23 @@ def camera(self, cam): def screenshot(self, filename="screenshot.png", scale=1, asarray=False): """ - Take a screenshot of the Plotter window. + Take a screenshot of the Plotter window. Arguments: scale : (int) set image magnification as an integer multiplicating factor asarray : (bool) return a numpy array of the image instead of writing a file + + Example: + ```py + from vedo import * + sphere = Sphere().linewidth(1) + plt = show(sphere, interactive=False) + plt.screenhot('anotherimage.png') + plt.interactive() + plt.close() + ``` """ return vedo.file_io.screenshot(filename, scale, asarray) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 2d996648..abbda004 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -2035,9 +2035,11 @@ def plot(*args, **kwargs): number of bins in x and y Examples: - - [plot_fxy.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy.py) + - [plot_fxy1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy1.py) ![](https://vedo.embl.es/images/pyplot/plot_fxy.png) + + - [plot_fxy2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy2.py) -------------------------------------------------------------------- From 6bf4dcbd6d743cfc68ee5987509d9d8863a85976 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 26 Oct 2023 15:25:59 +0200 Subject: [PATCH 182/251] fix notebook Image --- examples/notebooks/test_types.ipynb | 58 ++++++++++++++++------------- examples/pyplot/plot_fxy2.py | 36 +++++++++--------- examples/volumetric/densifycloud.py | 2 +- vedo/addons.py | 3 -- vedo/version.py | 2 +- 5 files changed, 53 insertions(+), 48 deletions(-) diff --git a/examples/notebooks/test_types.ipynb b/examples/notebooks/test_types.ipynb index 113bc9b3..08d86ed0 100644 --- a/examples/notebooks/test_types.ipynb +++ b/examples/notebooks/test_types.ipynb @@ -27,7 +27,7 @@ "
" ], "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -71,7 +71,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "b22e6d01", "metadata": {}, "outputs": [ @@ -101,7 +101,7 @@ "\n", "\n", "
\n", - " Domestic Cat:   vedo.picture.Picture
(...onalGeographic_2572187_2x3.jpg)\n", + " Domestic Cat:   vedo.image.Image
(...onalGeographic_2572187_2x3.jpg)\n", "\n", "\n", "\n", @@ -113,24 +113,24 @@ "
shape (2048, 3072)
in memory size 18432 KB
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from vedo import Picture\n", - "pic = Picture(\"https://i.natgeofe.com/n/548467d8-c5f1-4551-9f58-6817a8d2c45e/NationalGeographic_2572187_2x3.jpg\")\n", + "from vedo import Image\n", + "pic = Image(\"https://i.natgeofe.com/n/548467d8-c5f1-4551-9f58-6817a8d2c45e/NationalGeographic_2572187_2x3.jpg\")\n", "pic.name = \"Domestic Cat\"\n", "pic" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "id": "ddd6fbb6", "metadata": {}, "outputs": [ @@ -140,7 +140,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " MouseLimb:   vedo.tetmesh.TetMesh
(...s/examples/data/limb_ugrid.vtk)\n", @@ -154,10 +154,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 1, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -171,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "221660dc", "metadata": {}, "outputs": [ @@ -195,10 +195,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 2, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -212,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "id": "24f64426", "metadata": {}, "outputs": [ @@ -235,10 +235,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -251,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "id": "5ab995ad", "metadata": {}, "outputs": [ @@ -261,24 +261,24 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Histogram1D:   vedo.pyplot.Figure\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "
nr. of parts 43
position (0.0, 0.0, 0.0)
x-limits (-3.661, 3.074)
y-limits (0, 146.0)
world bounds
(x/y/z)
-4.029 ... 3.074
-0.2098 ... 5.222
0 ... 1.347e-3
x-limits (-3.516, 3.068)
y-limits (0, 145.0)
world bounds
(x/y/z)
-3.876 ... 3.068
-0.2051 ... 5.105
0 ... 1.317e-3
\n", "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -297,6 +297,14 @@ "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5edacf6", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/examples/pyplot/plot_fxy2.py b/examples/pyplot/plot_fxy2.py index 4f9b53dc..c4412a55 100644 --- a/examples/pyplot/plot_fxy2.py +++ b/examples/pyplot/plot_fxy2.py @@ -1,3 +1,5 @@ +"""Draw a z = BesselJ(x,y) surface with a custom color map +and a custom scalar bar with labels in radians""" import numpy as np from scipy import special from scipy.special import jn_zeros @@ -11,10 +13,10 @@ settings.default_font = "Theemim" settings.interpolate_scalars_before_mapping = False axes_opts = dict( - xtitle="x", ytitle="y", ztitle="|f(x,y)|", - xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, - xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, - ztitle_offset=0.03, + xtitle="x", ytitle="y", ztitle="|f(x,y)|", + xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, + xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, + ztitle_offset=0.03, ) def custom_lut_surface(name, vmin=0, vmax=1, N=256): @@ -38,8 +40,9 @@ def custom_table_scalarbar(name): table.append([x[i], rgb, 1, labs[i//50]]) else: table.append([x[i], rgb]) - return table + return table, build_lut(table) +###################################################################### def f(x, y): d2 = x**2 + y**2 if d2 > 1: @@ -58,31 +61,28 @@ def f(x, y): axes=axes_opts, ) -# Unpack the plot objects to customize them +# Unpack the surface from the plot to customize it msh = p1.unpack(0).triangulate().lighting('glossy') -pts = msh.vertices # get the points -zvals = pts[:,2] # get the z values +pts = msh.vertices # get the points +zvals = pts[:,2] # get the z values θvals = [np.angle(f(*p[:2])) for p in pts] # get the phases lut = custom_lut_surface("hsv", vmin=-np.pi, vmax=np.pi) msh.cmap(lut, θvals) # apply the color map -table = custom_table_scalarbar("hsv") -lut = build_lut(table, vmin=-np.pi,vmax=np.pi) -line = Line([(1,-1), (1,1)]) # a dummy line to attach the scalarbar to -line.cmap("hsv", line.vertices[:,2]) +table, lut = custom_table_scalarbar("hsv") +line = Line((1,-1), (1,1)) # a dummy line to attach the scalarbar to +line.cmap("hsv", [0, 1]) scbar = ScalarBar3D( - line, title=f"N_r ={Nr}, N_θ ={Nθ}, phase :phi in radians", + line, title=f"N_r ={Nr}, N_θ ={Nθ}, phase :theta in radians", label_rotation=90, c='black', categories=table, ) -# Set a specific camera position and orientation (press shift-C to see it) +# Set a specific camera position and orientation (shift-C to see it) cam = dict( position=(3.88583, 0.155949, 3.88584), - focal_point=(0, 0, 0), - viewup=(-0.7, 0, 0.7), - distance=5.4, + focal_point=(0, 0, 0), viewup=(-0.7, 0, 0.7), distance=5.4, ) -show(p1, scbar, camera=cam).close() +show(p1, scbar, __doc__, camera=cam).close() diff --git a/examples/volumetric/densifycloud.py b/examples/volumetric/densifycloud.py index 9693b709..b75fbf27 100644 --- a/examples/volumetric/densifycloud.py +++ b/examples/volumetric/densifycloud.py @@ -12,6 +12,6 @@ pts.pointdata["scals"] = scals densecloud = pts.densify(0.1, nclosest=10, niter=1) # return a new pointcloud.Points -printc('nr. points increased', pts.npoints, '\rightarrow ', densecloud.npoints, c='lg') +printc('nr. points increased', pts.npoints, ':rightarrow:', densecloud.npoints, c='lg') show([(pts, __doc__), densecloud], N=2, axes=1).close() diff --git a/vedo/addons.py b/vedo/addons.py index 9f077ddd..eaf4df84 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1039,9 +1039,6 @@ def ScalarBar3D( lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() - elif utils.is_sequence(obj): - vmin, vmax = np.min(obj), np.max(obj) - else: vedo.logger.error("in ScalarBar3D(): input must be a vedo object with bounds.") return obj diff --git a/vedo/version.py b/vedo/version.py index d4effb02..a0873b0c 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev22a' +_version = '2023.5.0+dev23a' From 1ebd289b1bd37214c264773ad4ea75b5fb7693dc Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 26 Oct 2023 19:46:40 +0200 Subject: [PATCH 183/251] add examples/simulations/springs_fem.py --- docs/changes.md | 1 + examples/simulations/springs_fem.py | 70 +++++++++++++++++++++++++++++ vedo/shapes.py | 5 ++- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 examples/simulations/springs_fem.py diff --git a/docs/changes.md b/docs/changes.md index f50bffcd..adde38a9 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -61,6 +61,7 @@ examples/volumetric/slicer1.py examples/other/flag_labels1.py examples/pyplot/embed_matplotlib.py examples/pyplot/plot_fxy2.py +examples/simulations/springs_fem.py ``` diff --git a/examples/simulations/springs_fem.py b/examples/simulations/springs_fem.py new file mode 100644 index 00000000..8a62fb35 --- /dev/null +++ b/examples/simulations/springs_fem.py @@ -0,0 +1,70 @@ +"""Solving a system of springs using the finite element method.""" +import numpy as np +from vedo import * +# np.random.seed(0) + +num_springs = 7 +k = 1.0 # Stiffness of the springs + +# Define applied forces at each node +num_nodes = num_springs + 1 # One more node than springs +F = np.random.randn(num_nodes) /5 + +# Discretize the system +nodes = np.arange(num_nodes) +elements = list(zip(nodes[:-1], nodes[1:])) + +# Assemble global stiffness matrix and force vector +K = np.zeros((num_nodes, num_nodes)) +for element in elements: + i, j = element + K[i, i] += k + K[j, j] += k + K[i, j] -= k + K[j, i] -= k + +# Apply boundary conditions (fixed nodes at both ends) +fixed_nodes = [0, num_nodes - 1] +for node in fixed_nodes: + K[node, :] = 0 + K[:, node] = 0 + K[node, node] = 1 + F[node] = 0 + +# Solve for displacements +u = np.linalg.solve(K, F) + +yvals = np.zeros(num_nodes) +nodes = np.c_[nodes, yvals] +u = np.c_[u, yvals] +F = np.c_[F, yvals] + +nodes_displaced = nodes + u + +vnodes1 = Points(nodes, r=20, c="k", alpha=0.25) +vline1 = Line(nodes, c="k", alpha=0.25) + +arr_disp = Arrows2D(nodes, nodes_displaced).y(0.4) +arr_force= Arrows2D(nodes, nodes + F).y(-0.25) +arr_disp.c("red4").alpha(0.8).legend('Displacements') +arr_force.c("blue4").alpha(0.8).legend('Forces') + +vnodes2 = Points(nodes_displaced, r=20, c="k").y(0.1) +vline2 = Lines(vnodes1, vnodes2, c="k", alpha=0.25) + +springs = [] +for i in range(num_springs): + s = Spring(nodes_displaced[i], nodes_displaced[i+1], r1=0.04).y(0.1) + s.lighting("metallic") + springs.append(s) + +lbox = LegendBox([arr_disp, arr_force], width=0.2, height=0.25, markers='s') +lbox.font("Calco") + +show( + __doc__, lbox, + vnodes1, vnodes2, vline1, vline2, arr_disp, arr_force, springs, + axes=8, size=(1900, 490), zoom=3.6, +).close() + + diff --git a/vedo/shapes.py b/vedo/shapes.py index 796bb444..8919906f 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -3421,7 +3421,10 @@ def __init__( thickness : (float) thickness of the coil section """ - diff = end_pt - np.array(start_pt, dtype=float) + start_pt = utils.make3d(start_pt) + end_pt = utils.make3d(end_pt) + + diff = end_pt - start_pt length = np.linalg.norm(diff) if not length: return From b62513a03c987ec91871c338a6f476cd6744925a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 27 Oct 2023 20:08:36 +0200 Subject: [PATCH 184/251] add `object.coordinates` same as `object.vertices` fixing to non linear tranforms mode. Now it can be instantiated with a dictionary add `eval()` to evaluate single points --- docs/changes.md | 3 ++ vedo/core.py | 12 ++++++ vedo/plotter.py | 14 ++++++- vedo/transformations.py | 93 ++++++++++++++++++++++++++++++++++++----- 4 files changed, 110 insertions(+), 12 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index adde38a9..eae5bb42 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -22,6 +22,9 @@ see `examples/pyplot/embed_matplotlib.py`. - name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` - reformat how vtk classes are imported (allow some laziness) - add `.show(..., screenshot="myfile.png")` keyword +- add `object.coordinates` same as `object.vertices` +- fixing to non linear tranforms mode. Now it can be instantiated with a dictionary + add `eval()` to evaluate single points diff --git a/vedo/core.py b/vedo/core.py index 7ef9407f..74a35c27 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -827,6 +827,18 @@ def vertices(self, pts): self.transform = LinearTransform() return self + + @property + def coordinates(self): + """Return the vertices (points) coordinates. Same as `vertices`.""" + return self.vertices + + @coordinates.setter + def coordinates(self, pts): + """Set vertices (points) coordinates. Same as `vertices`.""" + self.vertices = pts + + @property def cells(self): """ diff --git a/vedo/plotter.py b/vedo/plotter.py index 22fe564a..436987b5 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3461,7 +3461,19 @@ def screenshot(self, filename="screenshot.png", scale=1, asarray=False): set image magnification as an integer multiplicating factor asarray : (bool) return a numpy array of the image instead of writing a file - + + Warning: + If you get black screenshots try to set `interactive=False` in `show()` + then call `screenshot()` and `plt.interactive()`: + ```python + from vedo import * + sphere = Sphere().linewidth(1) + plt = show(sphere, interactive=False) + plt.screenhot('image.png') + plt.interactive() + plt.close() + ``` + Example: ```py from vedo import * diff --git a/vedo/transformations.py b/vedo/transformations.py index 1e9b396b..11919ea6 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -496,13 +496,33 @@ def reorient( class NonLinearTransform: """Work with non-linear transformations.""" - def __init__(self, T=None): + def __init__(self, T=None, **kwargs): + """ + Define a non-linear transformation. + Can be saved to file and reloaded. + + Arguments: + T : (vtk.vtkThinPlateSplineTransform, str, dict) + vtk transformation. + If T is a string, it is assumed to be a filename. + If T is a dictionary, it is assumed to be a set of keyword arguments. + Defaults to None. + **kwargs : (dict) + keyword arguments to define the transformation. + The following keywords are accepted: + - name : (str) name of the transformation + - comment : (str) comment + - source_points : (list) source points + - target_points : (list) target points + - mode : (str) either '2d' or '3d' + - sigma : (float) sigma parameter + """ self.name = "NonLinearTransform" self.filename = "" self.comment = "" - if T is None: + if T is None and len(kwargs) == 0: T = vtk.vtkThinPlateSplineTransform() elif isinstance(T, vtk.vtkThinPlateSplineTransform): @@ -531,14 +551,50 @@ def __init__(self, T=None): T = vtk.vtkThinPlateSplineTransform() vptss = vtk.vtkPoints() for p in source: - vptss.InsertNextPoint(p[0], p[1], p[2]) + if len(p) == 2: + p = [p[0], p[1], 0.0] + vptss.InsertNextPoint(p) + T.SetSourceLandmarks(vptss) + vptst = vtk.vtkPoints() + for p in target: + if len(p) == 2: + p = [p[0], p[1], 0.0] + vptst.InsertNextPoint(p) + T.SetTargetLandmarks(vptst) + T.SetSigma(sigma) + if mode == "2d": + T.SetBasisToR2LogR() + elif mode == "3d": + T.SetBasisToR() + else: + print(f'In {filename} mode can be either "2d" or "3d"') + + elif len(kwargs) > 0: + T = kwargs.copy() + self.name = T.pop("name", "NonLinearTransform") + self.comment = T.pop("comment", "") + source = T.pop("source_points", []) + target = T.pop("target_points", []) + mode = T.pop("mode", "3d") + sigma = T.pop("sigma", 1.0) + if len(T) > 0: + print("Warning: NonLinearTransform got unexpected keyword arguments:") + print(T) + + T = vtk.vtkThinPlateSplineTransform() + vptss = vtk.vtkPoints() + for p in source: + if len(p) == 2: + p = [p[0], p[1], 0.0] + vptss.InsertNextPoint(p) T.SetSourceLandmarks(vptss) vptst = vtk.vtkPoints() for p in target: - vptst.InsertNextPoint(p[0], p[1], p[2]) + if len(p) == 2: + p = [p[0], p[1], 0.0] + vptst.InsertNextPoint(p) T.SetTargetLandmarks(vptst) T.SetSigma(sigma) - # mode if mode == "2d": T.SetBasisToR2LogR() elif mode == "3d": @@ -575,8 +631,9 @@ def source_points(self): """Get the source points.""" pts = self.T.GetSourceLandmarks() vpts = [] - for i in range(pts.GetNumberOfPoints()): - vpts.append(pts.GetPoint(i)) + if pts: + for i in range(pts.GetNumberOfPoints()): + vpts.append(pts.GetPoint(i)) return np.array(vpts, dtype=np.float32) @property @@ -597,7 +654,9 @@ def source_points(self, pts): pts = pts.vertices vpts = vtk.vtkPoints() for p in pts: - vpts.InsertNextPoint(p[0], p[1], p[2]) + if len(p) == 2: + p = [p[0], p[1], 0.0] + vpts.InsertNextPoint(p) self.T.SetSourceLandmarks(vpts) @target_points.setter @@ -609,7 +668,9 @@ def target_points(self, pts): pts = pts.vertices vpts = vtk.vtkPoints() for p in pts: - vpts.InsertNextPoint(p[0], p[1], p[2]) + if len(p) == 2: + p = [p[0], p[1], 0.0] + vpts.InsertNextPoint(p) self.T.SetTargetLandmarks(vpts) @property @@ -626,10 +687,13 @@ def sigma(self, s): def mode(self) -> str: """Get mode.""" m = self.T.GetBasis() - if m == 0: + # print("T.GetBasis()", m, self.T.GetBasisAsString()) + if m == 2: return "2d" elif m == 1: return "3d" + else: + print("Warning: NonLinearTransform has no valid mode.") @mode.setter def mode(self, m): @@ -689,7 +753,14 @@ def apply_to(self, obj): obj.point_locator = None obj.cell_locator = None obj.line_locator = None - + + def eval(self, pt): + """Evaluate the transformation at point `pt`.""" + if len(pt) == 2: + pt = [pt[0], pt[1], 0] + q = self.T.TransformDoublePoint(pt) + return np.array(q) + ######################################################################## # 2d ###### From 001691e97407589e93590ce607e7e1f9dc3298df Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 28 Oct 2023 13:12:38 +0200 Subject: [PATCH 185/251] add `copy()` as alias to `clone()` --- docs/changes.md | 4 +-- vedo/assembly.py | 24 +++++++------ vedo/core.py | 2 +- vedo/image.py | 8 +++-- vedo/plotter.py | 4 +-- vedo/pointcloud.py | 7 ++-- vedo/tetmesh.py | 3 ++ vedo/transformations.py | 79 ++++++++++++++++++----------------------- vedo/ugrid.py | 4 +++ vedo/volume.py | 6 +++- 10 files changed, 76 insertions(+), 65 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index eae5bb42..80afcd43 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -24,8 +24,8 @@ see `examples/pyplot/embed_matplotlib.py`. - add `.show(..., screenshot="myfile.png")` keyword - add `object.coordinates` same as `object.vertices` - fixing to non linear tranforms mode. Now it can be instantiated with a dictionary - add `eval()` to evaluate single points - + add `move()` to move single points or objects +- add `copy()` as alias to `clone()` ### Breaking changes diff --git a/vedo/assembly.py b/vedo/assembly.py index 9e9579d1..588daa12 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -25,15 +25,15 @@ ################################################# def procrustes_alignment(sources, rigid=False): """ - Return an ``Assembly`` of aligned source meshes with the `Procrustes` algorithm. - The output ``Assembly`` is normalized in size. + Return an `Assembly` of aligned source meshes with the `Procrustes` algorithm. + The output `Assembly` is normalized in size. The `Procrustes` algorithm takes N set of points and aligns them in a least-squares sense to their mutual mean. The algorithm is iterated until convergence, as the mean must be recomputed after each alignment. The set of average points generated by the algorithm can be accessed with - ``algoutput.info['mean']`` as a numpy array. + `algoutput.info['mean']` as a numpy array. Arguments: rigid : bool @@ -193,13 +193,13 @@ def bounds(self): def show(self, **options): """ - Create on the fly an instance of class ``Plotter`` or use the last existing one to + Create on the fly an instance of class `Plotter` or use the last existing one to show one single object. This method is meant as a shortcut. If more than one object needs to be visualised please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - Returns the ``Plotter`` class instance. + Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) @@ -352,7 +352,7 @@ def unpack_group(scalarbar): return self def __contains__(self, obj): - """Allows to use ``in`` to check if an object is in the `Assembly`.""" + """Allows to use `in` to check if an object is in the `Assembly`.""" return obj in self.objects @@ -505,6 +505,10 @@ def use_bounds(self, value): return self + def copy(self): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone() + def clone(self): """Make a clone copy of the object.""" newlist = [] @@ -513,9 +517,9 @@ def clone(self): return Assembly(newlist) def unpack(self, i=None): - """Unpack the list of objects from a ``Assembly``. + """Unpack the list of objects from a `Assembly`. - If `i` is given, get `i-th` object from a ``Assembly``. + If `i` is given, get `i-th` object from a `Assembly`. Input can be a string, in this case returns the first object whose name contains the given string. @@ -566,13 +570,13 @@ def pickable(self, value=True): def show(self, **options): """ - Create on the fly an instance of class ``Plotter`` or use the last existing one to + Create on the fly an instance of class `Plotter` or use the last existing one to show one single object. This method is meant as a shortcut. If more than one object needs to be visualised please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - Returns the ``Plotter`` class instance. + Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) diff --git a/vedo/core.py b/vedo/core.py index 74a35c27..8b59a594 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -428,7 +428,7 @@ def memory_size(self): return self.dataset.GetActualMemorySize() def modified(self): - """Use in conjunction with ``tonumpy()`` to update any modifications to the image array""" + """Use in conjunction with `tonumpy()` to update any modifications to the image array""" self.dataset.GetPointData().Modified() self.dataset.GetPointData().GetScalars().Modified() return self diff --git a/vedo/image.py b/vedo/image.py index 99751044..8aa8a7ea 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -317,6 +317,10 @@ def channels(self): """Return the number of channels in image""" return self.dataset.GetPointData().GetScalars().GetNumberOfComponents() + def copy(self): + """Return a copy of the image. Alias of `clone()`.""" + return self.clone() + def clone(self): """Return an exact copy of the input Image. If transform is True, it is given the same scaling and position.""" @@ -1184,7 +1188,7 @@ def tonumpy(self): Example: arr[:] = arr - 15 If the array is modified call: - ``image.modified()`` + `image.modified()` when all your modifications are completed. """ nx, ny, _ = self.dataset.GetDimensions() @@ -1405,7 +1409,7 @@ def add_text( return self def modified(self): - """Use in conjunction with ``tonumpy()`` to update any modifications to the image array""" + """Use in conjunction with `tonumpy()` to update any modifications to the image array""" self.dataset.GetPointData().GetScalars().Modified() return self diff --git a/vedo/plotter.py b/vedo/plotter.py index 436987b5..75d89904 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -1027,7 +1027,7 @@ def use_depth_peeling(self, at=None, value=True): def background(self, c1=None, c2=None, at=None, mode=0): """Set the color of the background for the current renderer. - A different renderer index can be specified by keyword ``at``. + A different renderer index can be specified by keyword `at`. Arguments: c1 : (list) @@ -2967,7 +2967,7 @@ def show( camera : (dict, vtkCamera) camera parameters can further be specified with a dictionary - assigned to the ``camera`` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): + assigned to the `camera` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): - pos, `(list)`, the position of the camera in world coordinates - focal_point `(list)`, the focal point of the camera in world coordinates - viewup `(list)`, the view up direction for the camera diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index e22dcd7c..2cb6c021 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -721,17 +721,20 @@ def polydata(self, **kwargs): """ Obsolete. Use property `.dataset` instead. - Returns the underlying ``vtkPolyData`` object. + Returns the underlying `vtkPolyData` object. """ colors.printc( "WARNING: call to .polydata() is obsolete, use property .dataset instead.", c="y") return self.dataset + def copy(self, deep=True): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone(deep=deep) def clone(self, deep=True): """ - Clone a `PointCloud` or `Mesh` object to make an exact copy of it. + Clone a `PointCloud` or `Mesh` object to make an exact copy of it. Alias of `copy()`. Arguments: deep : (bool) diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index b18b481a..abb4af60 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -296,6 +296,9 @@ def _repr_html_(self): ] return "\n".join(allt) + def copy(self, mapper="tetra"): + """Return a copy of the mesh. Alias of `clone()`.""" + return self.clone(mapper=mapper) def clone(self, mapper="tetra"): """Clone the `TetMesh` object to yield an exact copy.""" diff --git a/vedo/transformations.py b/vedo/transformations.py index 11919ea6..feae269d 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -62,7 +62,7 @@ def __init__(self, T=None): print("Sphere before", s1.transform) s1.apply_transform(LT) # same as: - # LT.apply_to(s1) + # LT.move(s1) print("Sphere after ", s1.transform) zero = Point([0,0,0]) @@ -133,29 +133,15 @@ def __str__(self): def __repr__(self): return self.__str__() - def apply_to(self, obj): + def move(self, obj): """Apply transformation.""" if _is_sequence(obj): - v = self.T.TransformFloatPoint(obj) - return np.array(v) + if len(obj) == 2: + obj = [obj[0], obj[1], 0] + return np.array(self.T.TransformFloatPoint(obj)) - obj.transform = self - - m = self.T.GetMatrix() - M = [[m.GetElement(i, j) for j in range(4)] for i in range(4)] - if np.allclose(M - np.eye(4), 0): - return - - tp = vtk.get("TransformPolyDataFilter")() - tp.SetTransform(self.T) - tp.SetInputData(obj.dataset) - tp.Update() - out = tp.GetOutput() - - obj.dataset.DeepCopy(out) - obj.point_locator = None - obj.cell_locator = None - obj.line_locator = None + obj.apply_transform(self) + return def reset(self): """Reset transformation.""" @@ -188,6 +174,10 @@ def compute_inverse(self): t.invert() return t + def copy(self): + """Return a copy of the transformation. Alias of `clone()`.""" + return self.clone() + def clone(self): """Clone transformation to make an exact copy.""" return LinearTransform(self.T) @@ -605,6 +595,22 @@ def __init__(self, T=None, **kwargs): self.T = T self.inverse_flag = False + def __str__(self): + s = "Non Linear Transformation: " + self.__class__.__name__ + "\n" + if self.filename: + s += " filename: " + self.filename + "\n" + if self.name: + s += " name : " + self.name + "\n" + if self.comment: + s += " comment : " + self.comment + "\n" + s += f" mode : {self.mode}\n" + s += f" sigma : {self.sigma}\n" + s += f" sources : {self.source_points.size}\n" + s += f" targets : {self.source_points.size}" + return s + + def __repr__(self): + return self.__str__() @property def position(self): @@ -735,32 +741,15 @@ def compute_inverse(self): t.invert() return t - def apply_to(self, obj): - """Apply transformation.""" + def move(self, obj): + """Apply transformation to object or single point.""" if _is_sequence(obj): - v = self.T.TransformFloatPoint(obj) - return np.array(v) - - obj.transform = self - - tp = vtk.get("TransformPolyDataFilter")() - tp.SetTransform(self.T) - tp.SetInputData(obj.dataset) - tp.Update() - out = tp.GetOutput() - - obj.dataset.DeepCopy(out) - obj.point_locator = None - obj.cell_locator = None - obj.line_locator = None - - def eval(self, pt): - """Evaluate the transformation at point `pt`.""" - if len(pt) == 2: - pt = [pt[0], pt[1], 0] - q = self.T.TransformDoublePoint(pt) - return np.array(q) + if len(obj) == 2: + obj = [obj[0], obj[1], 0] + return np.array(self.T.TransformFloatPoint(obj)) + obj.apply_transform(self) + return ######################################################################## # 2d ###### diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 8e62d320..cc6eed3f 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -211,6 +211,10 @@ def _repr_html_(self): ] return "\n".join(all) + def copy(self, deep=True): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone(deep=deep) + def clone(self, deep=True): """Clone the UGrid object to yield an exact copy.""" ug = vtk.vtkUnstructuredGrid() diff --git a/vedo/volume.py b/vedo/volume.py index a32505b9..e919238a 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -331,8 +331,12 @@ def _repr_html_(self): ] return "\n".join(allt) + def copy(self, deep=True): + """Return a copy of the Volume. Alias of `clone()`.""" + return self.clone(deep=deep) + def clone(self, deep=True): - """Return a clone copy of the Volume.""" + """Return a clone copy of the Volume. Alias of `copy()`.""" if deep: newimg = vtk.vtkImageData() newimg.CopyStructure(self.dataset) From 55dbfe8b6291a2d1dfab14f2cfa533fe867b4b93 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 28 Oct 2023 13:57:21 +0200 Subject: [PATCH 186/251] improvents to transformations doc --- vedo/transformations.py | 82 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/vedo/transformations.py b/vedo/transformations.py index feae269d..1734b264 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -71,6 +71,7 @@ def __init__(self, T=None): """ self.name = "LinearTransform" + self.filename = "" self.comment = "" if T is None: @@ -108,7 +109,8 @@ def __init__(self, T=None): elif isinstance(T, str): import json - with open(T, "r") as read_file: + self.filename = str(T) + with open(self.filename, "r") as read_file: D = json.load(read_file) self.name = D["name"] self.comment = D["comment"] @@ -125,8 +127,16 @@ def __init__(self, T=None): self.inverse_flag = False def __str__(self): - s = "Transformation Matrix 4x4:\n" - s += str(self.matrix) + s = f"Linear Transformation {self.__class__}" + if self.name: + s += "\nName: " + self.name + if self.filename: + s += "\nFilename: " + self.filename + if self.comment: + s += "\nComment: " + self.comment + if self.inverse_flag: + s += "\nInverse transformation flag is True" + s += "\n" + str(self.matrix) s += f"\n({self.n_concatenated_transforms} concatenated transforms)" return s @@ -134,9 +144,34 @@ def __repr__(self): return self.__str__() def move(self, obj): - """Apply transformation.""" + """ + Apply transformation to object or single point. + + Note: + When applying a transformation to a mesh, the mesh is modified in place. + If you want to keep the original mesh unchanged, use `clone()` method. + + Example: + ```python + from vedo import * + settings.use_parallel_projection = True + + LT = LinearTransform() + LT.translate([3,0,1]).rotate_z(45) + print(LT) + + s = Sphere(r=0.2) + LT.move(s) + # same as: + # s.apply_transform(LT) + + zero = Point([0,0,0]) + show(s, zero, axes=1).close() + ``` + """ if _is_sequence(obj): - if len(obj) == 2: + n = len(obj) + if n == 2: obj = [obj[0], obj[1], 0] return np.array(self.T.TransformFloatPoint(obj)) @@ -596,7 +631,7 @@ def __init__(self, T=None, **kwargs): self.inverse_flag = False def __str__(self): - s = "Non Linear Transformation: " + self.__class__.__name__ + "\n" + s = self.__class__.__name__ + ":\n" if self.filename: s += " filename: " + self.filename + "\n" if self.name: @@ -605,8 +640,10 @@ def __str__(self): s += " comment : " + self.comment + "\n" s += f" mode : {self.mode}\n" s += f" sigma : {self.sigma}\n" - s += f" sources : {self.source_points.size}\n" - s += f" targets : {self.source_points.size}" + p = self.source_points + q = self.target_points + s += f" sources : {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" + s += f" targets : {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" return s def __repr__(self): @@ -742,7 +779,34 @@ def compute_inverse(self): return t def move(self, obj): - """Apply transformation to object or single point.""" + """ + Apply transformation to object or single point. + + Note: + When applying a transformation to a mesh, the mesh is modified in place. + If you want to keep the original mesh unchanged, use `clone()` method. + + Example: + ```python + from vedo import * + np.random.seed(0) + settings.use_parallel_projection = True + + NLT = NonLinearTransform() + NLT.source_points = [[-2,0,0], [1,2,1], [2,-2,2]] + NLT.target_points = NLT.source_points + np.random.randn(3,3)*0.5 + NLT.mode = '3d' + print(NLT) + + s1 = Sphere() + NLT.move(s1) + # same as: + # s1.apply_transform(NLT) + + arrs = Arrows(NLT.source_points, NLT.target_points) + show(s1, arrs, Sphere().alpha(0.1), axes=1).close() + ``` + """ if _is_sequence(obj): if len(obj) == 2: obj = [obj[0], obj[1], 0] From 3f757e9fdd64469ab616c530057bd00cf0b7c955 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 28 Oct 2023 16:03:42 +0200 Subject: [PATCH 187/251] fix cut_with_cookiecutter --- vedo/pointcloud.py | 9 +++++---- vedo/transformations.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 2cb6c021..1e8cc780 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2084,7 +2084,7 @@ def cut_with_cookiecutter(self, lines): iline = list(range(len(lines))) + [0] poly = utils.buildPolyData(lines, lines=[iline]) else: - poly = lines + poly = lines.dataset # if invert: # not working # rev = vtk.get("ReverseSense")() @@ -2095,17 +2095,18 @@ def cut_with_cookiecutter(self, lines): # Build loops from the polyline build_loops = vtk.get("ContourLoopExtraction")() + build_loops.SetGlobalWarningDisplay(0) build_loops.SetInputData(poly) build_loops.Update() - boundaryPoly = build_loops.GetOutput() + boundary_poly = build_loops.GetOutput() ccut = vtk.get("CookieCutter")() ccut.SetInputData(self.dataset) - ccut.SetLoopsData(boundaryPoly) + ccut.SetLoopsData(boundary_poly) ccut.SetPointInterpolationToMeshEdges() # ccut.SetPointInterpolationToLoopEdges() ccut.PassCellDataOn() - # ccut.PassPointDataOn() + ccut.PassPointDataOn() ccut.Update() self._update(ccut.GetOutput()) diff --git a/vedo/transformations.py b/vedo/transformations.py index 1734b264..88255dfb 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -176,7 +176,7 @@ def move(self, obj): return np.array(self.T.TransformFloatPoint(obj)) obj.apply_transform(self) - return + return obj def reset(self): """Reset transformation.""" @@ -813,7 +813,7 @@ def move(self, obj): return np.array(self.T.TransformFloatPoint(obj)) obj.apply_transform(self) - return + return obj ######################################################################## # 2d ###### From 14b7f8844ecf625e0a1f6ca332c565826d2703fb Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 28 Oct 2023 16:50:20 +0200 Subject: [PATCH 188/251] remove `file_io.load_transform()` LinearTransform("file.mat") substitutes this --- docs/changes.md | 1 + vedo/file_io.py | 32 +------------------------ vedo/transformations.py | 52 ++++++++++++++++++++++++++++++----------- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 80afcd43..8f5e58bc 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -26,6 +26,7 @@ see `examples/pyplot/embed_matplotlib.py`. - fixing to non linear tranforms mode. Now it can be instantiated with a dictionary add `move()` to move single points or objects - add `copy()` as alias to `clone()` +- remove `file_io.load_transform()` LinearTransform("file.mat") substitutes this ### Breaking changes diff --git a/vedo/file_io.py b/vedo/file_io.py index 690a998d..5664b9bb 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -35,8 +35,7 @@ "loadStructuredGrid", "loadRectilinearGrid", "loadUnStructuredGrid", - "load_transform", - "write_transform", + # "load_transform", # LinearTransform("file.mat") substitutes this "write", "export_window", "import_window", @@ -1430,35 +1429,6 @@ def write_transform(inobj, filename="transform.mat", comment=""): f.write('\n') -def load_transform(filename): - """ - Load a transformation from a file `.mat`. - - Returns: - - `vtkTransform` - The transformation to be applied to some object (`use apply_transform()`). - - `str`, a comment string associated to this transformation file. - """ - with open(filename, "r", encoding="UTF-8") as f: - lines = f.readlines() - M = vtk.vtkMatrix4x4() - i = 0 - comment = "" - for l in lines: - if l.startswith("#"): - comment = l.replace("#", "").replace("\n", "") - continue - vals = l.split(" ") - if len(vals) == 4: - for j in range(4): - v = vals[j].replace("\n", "") - M.SetElement(i, j, float(v)) - i += 1 - T = vtk.vtkTransform() - T.SetMatrix(M) - return (T, comment) - - ############################################################################### def export_window(fileoutput, binary=False): """ diff --git a/vedo/transformations.py b/vedo/transformations.py index 88255dfb..036a16a6 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -110,11 +110,34 @@ def __init__(self, T=None): elif isinstance(T, str): import json self.filename = str(T) - with open(self.filename, "r") as read_file: - D = json.load(read_file) - self.name = D["name"] - self.comment = D["comment"] - matrix = np.array(D["matrix"]) + try: + with open(self.filename, "r") as read_file: + D = json.load(read_file) + self.name = D["name"] + self.comment = D["comment"] + matrix = np.array(D["matrix"]) + except json.decoder.JSONDecodeError: + ### assuming legacy vedo format E.g.: + #aligned by manual_align.py + # 0.8026854838223 -0.0789823873914 -0.508476844097 38.17377632072 + # 0.0679734082661 0.9501827489452 -0.040289803376 -69.53864247951 + # 0.5100652300642 -0.0023313569781 0.805555043665 -81.20317788519 + # 0.0 0.0 0.0 1.0 + with open(self.filename, "r", encoding="UTF-8") as read_file: + lines = read_file.readlines() + i = 0 + matrix = np.eye(4) + for l in lines: + if l.startswith("#"): + self.comment = l.replace("#", "").replace("\n", "") + continue + vals = l.split(" ") + if len(vals) == 4: + for j in range(4): + v = vals[j].replace("\n", "") + matrix[i, j] = float(v) + i += 1 + T = vtk.vtkTransform() m = vtk.vtkMatrix4x4() for i in range(4): @@ -127,13 +150,13 @@ def __init__(self, T=None): self.inverse_flag = False def __str__(self): - s = f"Linear Transformation {self.__class__}" + s = f"\x1b[7m\x1b[1mLinear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m" if self.name: s += "\nName: " + self.name if self.filename: s += "\nFilename: " + self.filename if self.comment: - s += "\nComment: " + self.comment + s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' if self.inverse_flag: s += "\nInverse transformation flag is True" s += "\n" + str(self.matrix) @@ -631,19 +654,20 @@ def __init__(self, T=None, **kwargs): self.inverse_flag = False def __str__(self): + s = f"\x1b[7m\x1b[1mNon-Linear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m" s = self.__class__.__name__ + ":\n" if self.filename: - s += " filename: " + self.filename + "\n" + s += "Filename: " + self.filename + "\n" if self.name: - s += " name : " + self.name + "\n" + s += "Name : " + self.name + "\n" if self.comment: - s += " comment : " + self.comment + "\n" - s += f" mode : {self.mode}\n" - s += f" sigma : {self.sigma}\n" + s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' + s += f"Mode : {self.mode}\n" + s += f"Sigma : {self.sigma}\n" p = self.source_points q = self.target_points - s += f" sources : {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" - s += f" targets : {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" + s += f"Sources: {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" + s += f"Targets: {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" return s def __repr__(self): From bc8d66730afb8ea43ef3da749827d54c6b525584 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 28 Oct 2023 18:47:06 +0200 Subject: [PATCH 189/251] fix image.write() --- vedo/image.py | 2 +- vedo/plotter.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/vedo/image.py b/vedo/image.py index 8aa8a7ea..12901d1d 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -1415,7 +1415,7 @@ def modified(self): def write(self, filename): """Write image to file as png or jpg.""" - vedo.file_io.write(self.dataset, filename) + vedo.file_io.write(self, filename) self.pipeline = utils.OperationNode( "write", comment=filename[:15], diff --git a/vedo/plotter.py b/vedo/plotter.py index 75d89904..4757be86 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3191,6 +3191,13 @@ def show( self.window.SetWindowName(self.title) + # pic = vedo.Image(vedo.dataurl+'images/vtk_logo.png') + # pic = vedo.Image('/home/musy/Downloads/icons8-3d-96.png') + # Array 0 name PNGImage + # /home/musy/Downloads/icons8-3d-96.png + # print(pic.dataset) + # self.window.SetIcon(pic.dataset) + try: # Needs "pip install pyobjc" on Mac OSX if ( From f7089368c82eb8693cbd8fb04dd6b79de6ab6e40 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 12:47:50 +0100 Subject: [PATCH 190/251] bump version --- vedo/plotter.py | 11 +++++------ vedo/version.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 4757be86..ca27fb98 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -881,16 +881,15 @@ def remove(self, *objs, at=None): if has_str or has_actor: # need to get the actors to search for - # acts = self.get_meshes(include_non_pickables=True, unpack_assemblies=False) - # acts+= self.get_volumes(include_non_pickables=True) - acts = self.get_actors(include_non_pickables=True) - for a in set(acts): + for a in self.get_actors(include_non_pickables=True): # print("PARSING", [a]) try: if (a.name and a.name in objs) or a in objs: + # if (a.name and any(x in a.name for x in objs)) or a in objs: # print('a.name',a.name) - objs.append(a) - except AttributeError: + objs.append(a) + except AttributeError: # no .name + # passing the actor so get back the object with .data try: if (a.data.name and a.data.name in objs) or a.data in objs: # print('a.data.name',a.data.name) diff --git a/vedo/version.py b/vedo/version.py index a0873b0c..d1cc2af7 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev23a' +_version = '2023.5.0+dev24a' From ce92c6437eba99995cce550bc5829f14e137888d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 14:44:29 +0100 Subject: [PATCH 191/251] fix self.actor.retrieve_object = weak_ref_to(self) --- examples/basic/mousehover1.py | 12 +++++----- vedo/addons.py | 4 ++-- vedo/image.py | 3 ++- vedo/plotter.py | 42 ++++++++++++++++++----------------- vedo/pointcloud.py | 5 ++++- vedo/utils.py | 31 +++++++++++++------------- vedo/visual.py | 3 ++- vedo/volume.py | 3 ++- 8 files changed, 55 insertions(+), 48 deletions(-) diff --git a/examples/basic/mousehover1.py b/examples/basic/mousehover1.py index afe1614c..954b1a9e 100644 --- a/examples/basic/mousehover1.py +++ b/examples/basic/mousehover1.py @@ -15,13 +15,11 @@ def func(evt): ### called every time mouse moves! f"Ground speed: {precision(evt.speed3d*100,2)}") msg.text(txt) # update text message - arw = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') - fpo = msh.flagpole( + ar = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') + fp = msh.flagpole( txt, point=pt, offset=(0.4,0.6), s=0.04, c='k', font="VictorMono", - ) - fpo.follow_camera() # make it always face the camera - plt.remove("FlagPole") # remove the old flagpole - plt.add(arw, fpo) # add Arrow and the new flagpole + ).follow_camera() # make it always face the camera + plt.remove("FlagPole").add(ar, fp) # remove the old flagpole, add the new plt.render() msg = Text2D(pos='bottom-left', font="VictorMono") # an empty text @@ -31,7 +29,7 @@ def func(evt): ### called every time mouse moves! settings.use_parallel_projection = True # avoid perspective effects plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse move', func) # add the callback function -plt.add_callback('keyboard', lambda evt: plt.remove(plt.objects[3:]).render()) +plt.add_callback('keyboard', lambda _: plt.remove("Arrow").render()) plt.show(hil, msg, __doc__, viewup='z') plt.close() diff --git a/vedo/addons.py b/vedo/addons.py index eaf4df84..af5ca4b2 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2176,7 +2176,7 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): pd = vtk.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) - self._data = pd + self.dataset = pd mapper = vtk.get("PolyDataMapper2D")() mapper.SetInputData(pd) @@ -2222,7 +2222,7 @@ def update(self, fraction=None): psqr = [[0, 0, 0], [fraction, 0, 0]] vpts = utils.numpy2vtk(psqr, dtype=np.float32) - self._data.GetPoints().SetData(vpts) + self.dataset.GetPoints().SetData(vpts) return self def reset(self): diff --git a/vedo/image.py b/vedo/image.py index 12901d1d..10a4d274 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np +from weakref import ref as weak_ref_to import vedo.vtkclasses as vtk @@ -161,7 +162,7 @@ def __init__(self, obj=None, channels=3): self.pipeline = None self.actor = vtk.vtkImageActor() - self.actor.data = self # so it can be picked + self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() if utils.is_sequence(obj) and len(obj) > 0: # passing array diff --git a/vedo/plotter.py b/vedo/plotter.py index ca27fb98..d1045549 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -889,11 +889,12 @@ def remove(self, *objs, at=None): # print('a.name',a.name) objs.append(a) except AttributeError: # no .name - # passing the actor so get back the object with .data + # passing the actor so get back the object with .retrieve_object() try: - if (a.data.name and a.data.name in objs) or a.data in objs: - # print('a.data.name',a.data.name) - objs.append(a.data) + vobj = a.retrieve_object() + if (vobj.name and vobj.name in objs) or vobj in objs: + # print('vobj.name', vobj.name) + objs.append(vobj) except AttributeError: pass @@ -1118,7 +1119,7 @@ def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=Tru if has_global_axes and a in self.axes_instances[at].actors: continue try: - objs.append(a.data) + objs.append(a.retrieve_object()) except AttributeError: pass return objs @@ -1146,7 +1147,7 @@ def get_volumes(self, at=None, include_non_pickables=False): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): try: - vols.append(a.data) + vols.append(a.retrieve_object()) except AttributeError: pass return vols @@ -1174,7 +1175,7 @@ def get_actors(self, at=None, include_non_pickables=False): a = acs.GetNextProp() if include_non_pickables or a.GetPickable(): # try: - # acts.append(a.data) + # acts.append(a.retrieve_object()) # except AttributeError: acts.append(a) return acts @@ -2399,29 +2400,30 @@ def fill_event(self, ename="", pos=(), enable_picking=True): self.picker.PickProp(x, y, self.renderer) actor = self.picker.GetProp3D() - # if not actor: # GetProp3D already picks Assembly - # actor = picker.GetAssembly() + #Note that GetProp3D already picks Assembly + + xp, yp = self.interactor.GetLastEventPosition() + dx, dy = x - xp, y - yp delta3d = np.array([0, 0, 0]) + if actor: picked3d = np.array(self.picker.GetPickPosition()) - # if hasattr(actor.data, "picked3d"): - # if actor.data.picked3d is not None: - # delta3d = picked3d - actor.data.picked3d + try: - delta3d = picked3d - actor.data.picked3d - actor.data.picked3d = picked3d + vobj = actor.retrieve_object() + old_pt = np.asarray(vobj.picked3d) + vobj.picked3d = picked3d + delta3d = picked3d - old_pt except (AttributeError, TypeError): pass + else: picked3d = None if not actor: # try 2D actor = self.picker.GetActor2D() - xp, yp = self.interactor.GetLastEventPosition() - dx, dy = x - xp, y - yp - event = Event() event.name = ename event.title = self.title @@ -2433,11 +2435,11 @@ def fill_event(self, ename="", pos=(), enable_picking=True): event.keypress = key if enable_picking: try: - event.object = actor.data + event.object = actor.retrieve_object() except AttributeError: event.object = actor try: - event.actor = actor.data # obsolete use object instead + event.actor = actor.retrieve_object() # obsolete use object instead except AttributeError: event.actor = actor event.picked3d = picked3d @@ -3610,7 +3612,7 @@ def _mouseleftclick(self, iren, event): self.clicked_actor = clicked_actor if hasattr(clicked_actor, "data"): # might be not a vedo obj - self.clicked_object = clicked_actor.data + self.clicked_object = clicked_actor.retrieve_object() # save this info in the object itself self.clicked_object.picked3d = self.picked3d self.clicked_object.picked2d = self.picked2d diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 1e8cc780..235f9322 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import time import numpy as np +from weakref import ref as weak_ref_to import vedo.vtkclasses as vtk @@ -538,7 +539,9 @@ def fibonacci_sphere(n): self.mapper = vtk.get("PolyDataMapper")() self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() - self.actor.data = self # so Actor can access this object + + # Create weakref so actor can access this object (eg to pick/remove): + self.actor.retrieve_object = weak_ref_to(self) self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI diff --git a/vedo/utils.py b/vedo/utils.py index 9d4f427b..4eb51620 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1630,7 +1630,7 @@ def _print_vtkactor(obj): vedo.printc("UGrid".ljust(70), c=cf, bold=True, invert=True) pos = obj.GetPosition() bnds = obj.GetBounds() - ug = obj.inputdata() + ug = obj.dataset vedo.printc("nr. of cells".ljust(14) + ": ", c=cf, bold=True, end="") vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") @@ -1798,7 +1798,7 @@ def print_histogram( logscale=False, minbin=0, horizontal=False, - char="\u2588", + char=" ", c=None, bold=True, title="histogram", @@ -1847,27 +1847,28 @@ def print_histogram( if not horizontal: # better aspect ratio bins *= 2 - isimg = isinstance(data, vtk.vtkImageData) - isvol = isinstance(data, vtk.vtkVolume) - if isimg or isvol: - if isvol: - img = data.dataset - else: - img = data - dims = img.GetDimensions() + try: + data = data.dataset + except AttributeError: + # already an array + data = np.asarray(data) + + if isinstance(data, vtk.vtkImageData): + dims = data.GetDimensions() nvx = min(100000, dims[0] * dims[1] * dims[2]) idxs = np.random.randint(0, min(dims), size=(nvx, 3)) data = [] for ix, iy, iz in idxs: - d = img.GetScalarComponentAsFloat(ix, iy, iz, 0) + d = data.GetScalarComponentAsFloat(ix, iy, iz, 0) data.append(d) - elif isinstance(data, vtk.vtkActor): - arr = data.polydata().GetPointData().GetScalars() + data = np.array(data) + + elif isinstance(data, vtk.vtkPolydata): + arr = data.dataset.GetPointData().GetScalars() if not arr: - arr = data.polydata().GetCellData().GetScalars() + arr = data.dataset.GetCellData().GetScalars() if not arr: return None - data = vtk2numpy(arr) try: diff --git a/vedo/visual.py b/vedo/visual.py index 80282043..00b4dd69 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np +from weakref import ref as weak_ref_to import vedo.vtkclasses as vtk @@ -1926,7 +1927,7 @@ def follow_camera(self, camera=None, origin=None): factor.SetCamera(plt.renderer.GetActiveCamera()) self.actor = None - factor.data = self + factor.retrieve_object = weak_ref_to(self) self.actor = factor return self diff --git a/vedo/volume.py b/vedo/volume.py index e919238a..30b53cf7 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -1,5 +1,6 @@ import glob import os +from weakref import ref as weak_ref_to import numpy as np @@ -119,7 +120,7 @@ def __init__( as a transfer function along the range of the scalar. """ self.actor = vtk.vtkVolume() - self.actor.data = self + self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() self.dataset = None self.mapper = None From 974877420e025c39023d6fbc21f238de4fee89a1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:26:21 +0100 Subject: [PATCH 192/251] vtkclasses get() -> new() vedo/pointcloud.py mesh.py --- vedo/mesh.py | 164 ++++++++++++++++++++++----------------------- vedo/pointcloud.py | 130 +++++++++++++++++------------------ vedo/vtkclasses.py | 22 +++++- 3 files changed, 166 insertions(+), 150 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index 96ce2023..658a3c86 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -87,7 +87,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): self.filename = inputobj elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() @@ -120,7 +120,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): else: try: - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(inputobj) gf.Update() self.dataset = gf.GetOutput() @@ -241,7 +241,7 @@ def edges(self): """ Return an array containing the edges connectivity. """ - extractEdges = vtk.get("ExtractEdges")() + extractEdges = vtk.new("ExtractEdges") extractEdges.SetInputData(self.dataset) # eed.UseAllPointsOn() extractEdges.Update() @@ -355,11 +355,11 @@ def texture( fnl = fn.lower() if ".jpg" in fnl or ".jpeg" in fnl: - reader = vtk.get("JPEGReader")() + reader = vtk.new("JPEGReader") elif ".png" in fnl: - reader = vtk.get("PNGReader")() + reader = vtk.new("PNGReader") elif ".bmp" in fnl: - reader = vtk.get("BMPReader")() + reader = vtk.new("BMPReader") else: vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") return self @@ -414,7 +414,7 @@ def texture( else: # last resource is automatic mapping - tmapper = vtk.get("vtkTextureMapToPlane")() + tmapper = vtk.new("vtkTextureMapToPlane") tmapper.AutomaticPlaneGenerationOn() tmapper.SetInputData(pd) tmapper.Update() @@ -501,7 +501,7 @@ def compute_normals(self, points=True, cells=True, feature_angle=None, consisten If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ - pdnorm = vtk.get("PolyDataNormals")() + pdnorm = vtk.new("PolyDataNormals") pdnorm.SetInputData(self.dataset) pdnorm.SetComputePointNormals(points) pdnorm.SetComputeCellNormals(cells) @@ -538,7 +538,7 @@ def reverse(self, cells=True, normals=False): poly.GetCellData().Modified() return self ############## - rev = vtk.get("ReverseSense")() + rev = vtk.new("ReverseSense") if cells: rev.ReverseCellsOn() else: @@ -555,7 +555,7 @@ def reverse(self, cells=True, normals=False): def volume(self): """Get/set the volume occupied by mesh.""" - mass = vtk.get("MassProperties")() + mass = vtk.new("MassProperties") mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() @@ -567,7 +567,7 @@ def area(self): The mesh must be triangular for this to work. See also `mesh.triangulate()`. """ - mass = vtk.get("MassProperties")() + mass = vtk.new("MassProperties") mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.dataset) mass.Update() @@ -575,7 +575,7 @@ def area(self): def is_closed(self): """Return `True` if the mesh is watertight.""" - fe = vtk.get("FeatureEdges")() + fe = vtk.new("FeatureEdges") fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() @@ -586,7 +586,7 @@ def is_closed(self): def is_manifold(self): """Return `True` if the mesh is manifold.""" - fe = vtk.get("FeatureEdges")() + fe = vtk.new("FeatureEdges") fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() @@ -690,7 +690,7 @@ def shrink(self, fraction=0.85): ![](https://vedo.embl.es/images/basic/shrink.png) """ # Overriding base class method core.shrink() - shrink = vtk.get("ShrinkPolyData")() + shrink = vtk.new("ShrinkPolyData") shrink.SetInputData(self.dataset) shrink.SetShrinkFactor(fraction) shrink.Update() @@ -748,7 +748,7 @@ def cap(self, return_cap=False): See also: `join()`, `join_segments()`, `slice()`. """ - fe = vtk.get("FeatureEdges")() + fe = vtk.new("FeatureEdges") fe.SetInputData(self.dataset) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() @@ -756,7 +756,7 @@ def cap(self, return_cap=False): fe.ManifoldEdgesOff() fe.Update() - stripper = vtk.get("Stripper")() + stripper = vtk.new("Stripper") stripper.SetInputData(fe.GetOutput()) stripper.JoinContiguousSegmentsOn() stripper.Update() @@ -765,12 +765,12 @@ def cap(self, return_cap=False): boundary_poly.SetPoints(stripper.GetOutput().GetPoints()) boundary_poly.SetPolys(stripper.GetOutput().GetLines()) - rev = vtk.get("ReverseSense")() + rev = vtk.new("ReverseSense") rev.ReverseCellsOn() rev.SetInputData(boundary_poly) rev.Update() - tf = vtk.get("TriangleFilter")() + tf = vtk.new("TriangleFilter") tf.SetInputData(rev.GetOutput()) tf.Update() @@ -781,7 +781,7 @@ def cap(self, return_cap=False): ) return m - polyapp = vtk.get("AppendPolyData")() + polyapp = vtk.new("AppendPolyData") polyapp.AddInputData(self.dataset) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() @@ -832,7 +832,7 @@ def join(self, polys=True, reset=False): ``` ![](https://vedo.embl.es/images/feats/line_join.png) """ - sf = vtk.get("Stripper")() + sf = vtk.new("Stripper") sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) @@ -840,7 +840,7 @@ def join(self, polys=True, reset=False): sf.Update() if reset: poly = sf.GetOutput() - cpd = vtk.get("CleanPolyData")() + cpd = vtk.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -974,13 +974,13 @@ def triangulate(self, verts=True, lines=True): """ if self.dataset.GetNumberOfPolys() or self.dataset.GetNumberOfStrips(): # print("vtkTriangleFilter") - tf = vtk.get("TriangleFilter")() + tf = vtk.new("TriangleFilter") tf.SetPassLines(lines) tf.SetPassVerts(verts) elif self.dataset.GetNumberOfLines(): # print("vtkContourTriangulator") - tf = vtk.get("ContourTriangulator")() + tf = vtk.new("ContourTriangulator") tf.TriangulationErrorDisplayOn() else: @@ -1000,7 +1000,7 @@ def triangulate(self, verts=True, lines=True): def compute_cell_vertex_count(self): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" - csf = vtk.get("CellSizeFilter")() + csf = vtk.new("CellSizeFilter") csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(False) @@ -1059,7 +1059,7 @@ def compute_quality(self, metric=6): ![](https://vedo.embl.es/images/advanced/meshquality.png) """ - qf = vtk.get("MeshQuality")() + qf = vtk.new("MeshQuality") qf.SetInputData(self.dataset) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() @@ -1070,7 +1070,7 @@ def compute_quality(self, metric=6): def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" - vc = vtk.get("CountVertices")() + vc = vtk.new("CountVertices") vc.SetInputData(self.dataset) vc.SetOutputArrayName("VertexCount") vc.Update() @@ -1093,7 +1093,7 @@ def check_validity(self, tol=0): value is used as an epsilon for floating point equality checks throughout the cell checking process. """ - vald = vtk.get("CellValidator")() + vald = vtk.new("CellValidator") if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) @@ -1118,7 +1118,7 @@ def compute_curvature(self, method=0): ``` ![](https://user-images.githubusercontent.com/32848391/51934810-c2e88c00-2404-11e9-8e7e-ca0b7984bbb7.png) """ - curve = vtk.get("Curvatures")() + curve = vtk.new("Curvatures") curve.SetInputData(self.dataset) curve.SetCurvatureType(method) curve.Update() @@ -1146,7 +1146,7 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): ``` ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ - ef = vtk.get("ElevationFilter")() + ef = vtk.new("ElevationFilter") ef.SetInputData(self.dataset) ef.SetLowPoint(low) ef.SetHighPoint(high) @@ -1168,23 +1168,23 @@ def subdivide(self, n=1, method=0, mel=None): mel : (float) Maximum Edge Length (applicable to Adaptive method only). """ - triangles = vtk.get("TriangleFilter")() + triangles = vtk.new("TriangleFilter") triangles.SetInputData(self.dataset) triangles.Update() tri_mesh = triangles.GetOutput() if method == 0: - sdf = vtk.get("LoopSubdivisionFilter")() + sdf = vtk.new("LoopSubdivisionFilter") elif method == 1: - sdf = vtk.get("LinearSubdivisionFilter")() + sdf = vtk.new("LinearSubdivisionFilter") elif method == 2: - sdf = vtk.get("AdaptiveSubdivisionFilter")() + sdf = vtk.new("AdaptiveSubdivisionFilter") if mel is None: mel = self.diagonal_size() / np.sqrt(self.dataset.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: - sdf = vtk.get("ButterflySubdivisionFilter")() + sdf = vtk.new("ButterflySubdivisionFilter") elif method == 4: - sdf = vtk.get("DensifyPolyData")() + sdf = vtk.new("DensifyPolyData") else: vedo.logger.error(f"in subdivide() unknown method {method}") raise RuntimeError() @@ -1231,11 +1231,11 @@ def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): return self if "quad" in method: - decimate = vtk.get("QuadricDecimation")() + decimate = vtk.new("QuadricDecimation") # decimate.SetVolumePreservation(True) else: - decimate = vtk.get("DecimatePro")() + decimate = vtk.new("DecimatePro") decimate.PreserveTopologyOn() if boundaries: decimate.BoundaryVertexDeletionOff() @@ -1329,10 +1329,10 @@ def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, bound ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ - cl = vtk.get("CleanPolyData")() + cl = vtk.new("CleanPolyData") cl.SetInputData(self.dataset) cl.Update() - smf = vtk.get("WindowedSincPolyDataFilter")() + smf = vtk.new("WindowedSincPolyDataFilter") smf.SetInputData(cl.GetOutput()) smf.SetNumberOfIterations(niter) smf.SetEdgeAngle(edge_angle) @@ -1364,7 +1364,7 @@ def fill_holes(self, size=None): Examples: - [fillholes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fillholes.py) """ - fh = vtk.get("FillHolesFilter")() + fh = vtk.new("FillHolesFilter") if not size: mb = self.diagonal_size() size = mb / 10 @@ -1401,7 +1401,7 @@ def contains(self, point, tol=1e-05): points.InsertNextPoint(point) poly = vtk.vtkPolyData() poly.SetPoints(points) - sep = vtk.get("SelectEnclosedPoints")() + sep = vtk.new("SelectEnclosedPoints") sep.SetTolerance(tol) sep.CheckSurfaceOff() sep.SetInputData(poly) @@ -1434,8 +1434,8 @@ def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): poly = vtk.vtkPolyData() poly.SetPoints(vpoints) - sep = vtk.get("SelectEnclosedPoints")() - # sep = vtk.get("ExtractEnclosedPoints() + sep = vtk.new("SelectEnclosedPoints") + # sep = vtk.new("ExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(poly) sep.SetSurfaceData(self.dataset) @@ -1499,7 +1499,7 @@ def boundaries( ![](https://vedo.embl.es/images/basic/boundaries.png) """ - fe = vtk.get("FeatureEdges")() + fe = vtk.new("FeatureEdges") fe.SetBoundaryEdges(boundary_edges) fe.SetNonManifoldEdges(non_manifold_edges) fe.SetManifoldEdges(manifold_edges) @@ -1514,7 +1514,7 @@ def boundaries( fe.SetFeatureAngle(feature_angle) if return_point_ids or return_cell_ids: - idf = vtk.get("IdFilter")() + idf = vtk.new("IdFilter") idf.SetInputData(self.dataset) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) @@ -1581,15 +1581,15 @@ def imprint(self, loopline, tol=0.01): ``` ![](https://vedo.embl.es/images/feats/imprint.png) """ - loop = vtk.get("ContourLoopExtraction")() + loop = vtk.new("ContourLoopExtraction") loop.SetInputData(loopline) loop.Update() - clean_loop = vtk.get("CleanPolyData")() + clean_loop = vtk.new("CleanPolyData") clean_loop.SetInputData(loop.GetOutput()) clean_loop.Update() - imp = vtk.get("ImprintFilter")() + imp = vtk.new("ImprintFilter") imp.SetTargetData(self.dataset) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) @@ -1637,9 +1637,9 @@ def extract_cells(self, ids): """ Extract a subset of cells from a mesh and return it as a new mesh. """ - selectCells = vtk.get("SelectionNode")() - selectCells.SetFieldType(vtk.get("SelectionNode").CELL) - selectCells.SetContentType(vtk.get("SelectionNode").INDICES) + selectCells = vtk.new("SelectionNode") + selectCells.SetFieldType(vtk.get_class("SelectionNode").CELL) + selectCells.SetContentType(vtk.get_class("SelectionNode").INDICES) idarr = vtk.vtkIdTypeArray() idarr.SetNumberOfComponents(1) idarr.SetNumberOfValues(len(ids)) @@ -1647,15 +1647,15 @@ def extract_cells(self, ids): idarr.SetValue(i, v) selectCells.SetSelectionList(idarr) - selection = vtk.get("Selection")() + selection = vtk.new("Selection") selection.AddNode(selectCells) - extractSelection = vtk.get("ExtractSelection")() + extractSelection = vtk.new("ExtractSelection") extractSelection.SetInputData(0, self.dataset) extractSelection.SetInputData(1, selection) extractSelection.Update() - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(extractSelection.GetOutput()) gf.Update() msh = Mesh(gf.GetOutput()) @@ -1680,17 +1680,17 @@ def connected_cells(self, index, return_ids=False): if return_ids: return rids - selection_node = vtk.get("SelectionNode")() - selection_node.SetFieldType(vtk.get("SelectionNode").CELL) - selection_node.SetContentType(vtk.get("SelectionNode").INDICES) + selection_node = vtk.new("SelectionNode") + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) selection_node.SetSelectionList(ids) - selection = vtk.get("Selection")() + selection = vtk.new("Selection") selection.AddNode(selection_node) - extractSelection = vtk.get("ExtractSelection")() + extractSelection = vtk.new("ExtractSelection") extractSelection.SetInputData(0, dpoly) extractSelection.SetInputData(1, selection) extractSelection.Update() - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(extractSelection.GetOutput()) gf.Update() return Mesh(gf.GetOutput()).lw(1) @@ -1717,7 +1717,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): ![](https://vedo.embl.es/images/basic/silhouette1.png) """ - sil = vtk.get("PolyDataSilhouette")() + sil = vtk.new("PolyDataSilhouette") sil.SetInputData(self.dataset) sil.SetBorderEdges(border_edges) if feature_angle is False: @@ -1801,7 +1801,7 @@ def isobands(self, n=10, vmin=None, vmax=None): for i in range(values.GetNumberOfTuples()): lut.SetAnnotation(i, values.GetValue(i).ToString()) - bcf = vtk.get("BandedPolyDataContourFilter")() + bcf = vtk.new("BandedPolyDataContourFilter") bcf.SetInputData(self.dataset) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): @@ -1841,7 +1841,7 @@ def isolines(self, n=10, vmin=None, vmax=None): ![](https://vedo.embl.es/images/pyplot/isolines.png) """ - bcf = vtk.get("ContourFilter")() + bcf = vtk.new("ContourFilter") bcf.SetInputData(self.dataset) r0, r1 = self.dataset.GetScalarRange() if vmin is None: @@ -1850,11 +1850,11 @@ def isolines(self, n=10, vmin=None, vmax=None): vmax = r1 bcf.GenerateValues(n, vmin, vmax) bcf.Update() - sf = vtk.get("Stripper")() + sf = vtk.new("Stripper") sf.SetJoinContiguousSegments(True) sf.SetInputData(bcf.GetOutput()) sf.Update() - cl = vtk.get("CleanPolyData")() + cl = vtk.new("CleanPolyData") cl.SetInputData(sf.GetOutput()) cl.Update() msh = Mesh(cl.GetOutput(), c="k").lighting("off") @@ -1894,7 +1894,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # ms = [] # todo # poly0 = self.clone().dataset # for i in range(len(zshift)-1): - # rf = vtk.get("RotationalExtrusionFilter")() + # rf = vtk.new("RotationalExtrusionFilter") # rf.SetInputData(poly0) # rf.SetResolution(res) # rf.SetCapping(0) @@ -1905,8 +1905,8 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): # poly1 = rf.GetOutput() raise NotImplementedError("todo") - rf = vtk.get("RotationalExtrusionFilter")() - # rf = vtk.get("LinearExtrusionFilter")() + rf = vtk.new("RotationalExtrusionFilter") + # rf = vtk.new("LinearExtrusionFilter") rf.SetInputData(self.dataset) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) @@ -1950,10 +1950,10 @@ def split( if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") return [self] - cf = vtk.get("PolyDataEdgeConnectivityFilter")() + cf = vtk.new("PolyDataEdgeConnectivityFilter") cf.BarrierEdgesOff() else: - cf = vtk.get("PolyDataConnectivityFilter")() + cf = vtk.new("PolyDataConnectivityFilter") cf.SetInputData(pd) cf.SetExtractionModeToAllRegions() @@ -2012,7 +2012,7 @@ def extract_largest_region(self): Examples: - [largestregion.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/largestregion.py) """ - conn = vtk.get("PolyDataConnectivityFilter")() + conn = vtk.new("PolyDataConnectivityFilter") conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() conn.SetInputData(self.dataset) @@ -2040,9 +2040,9 @@ def boolean(self, operation, mesh2, method=0, tol=None): ![](https://vedo.embl.es/images/basic/boolean.png) """ if method == 0: - bf = vtk.get("BooleanOperationPolyDataFilter")() + bf = vtk.new("BooleanOperationPolyDataFilter") elif method == 1: - bf = vtk.get("LoopBooleanPolyDataFilter")() + bf = vtk.new("LoopBooleanPolyDataFilter") else: raise ValueError(f"Unknown method={method}") @@ -2084,7 +2084,7 @@ def intersect_with(self, mesh2, tol=1e-06): ![](https://vedo.embl.es/images/basic/surfIntersect.png) """ - bf = vtk.get("IntersectionPolyDataFilter")() + bf = vtk.new("IntersectionPolyDataFilter") bf.SetGlobalWarningDisplay(0) bf.SetTolerance(tol) bf.SetInputData(0, self.dataset) @@ -2120,7 +2120,7 @@ def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): p0, p1 = p0.vertices if not self.line_locator: - self.line_locator = vtk.get("OBBTree")() + self.line_locator = vtk.new("OBBTree") self.line_locator.SetDataSet(self.dataset) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 @@ -2160,11 +2160,11 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): ``` ![](https://vedo.embl.es/images/feats/intersect_plane.png) """ - plane = vtk.get("Plane")() + plane = vtk.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) - cutter = vtk.get("PolyDataPlaneCutter")() + cutter = vtk.new("PolyDataPlaneCutter") cutter.SetInputData(self.dataset) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() @@ -2186,7 +2186,7 @@ def collide_with(self, mesh2, tol=0, return_bool=False): Collide this Mesh with the input surface. Information is stored in `ContactCells1` and `ContactCells2`. """ - ipdf = vtk.get("CollisionDetectionFilter")() + ipdf = vtk.new("CollisionDetectionFilter") # ipdf.SetGlobalWarningDisplay(0) transform0 = vtk.vtkTransform() @@ -2249,7 +2249,7 @@ def geodesic(self, start, end): start = pa.closest_point(start, return_point_id=True) end = pa.closest_point(end, return_point_id=True) - dijkstra = vtk.get("DijkstraGraphGeodesicPath")() + dijkstra = vtk.new("DijkstraGraphGeodesicPath") dijkstra.SetInputData(self.dataset) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) @@ -2343,7 +2343,7 @@ def binarize( whiteImage.GetPointData().GetScalars().Fill(inval) # polygonal data --> image stencil: - pol2stenc = vtk.get("PolyDataToImageStencil")() + pol2stenc = vtk.new("PolyDataToImageStencil") pol2stenc.SetInputData(pd) pol2stenc.SetOutputOrigin(whiteImage.GetOrigin()) pol2stenc.SetOutputSpacing(whiteImage.GetSpacing()) @@ -2353,7 +2353,7 @@ def binarize( # cut the corresponding white image and set the background: outval = fg_value if invert else bg_value - imgstenc = vtk.get("ImageStencil")() + imgstenc = vtk.new("ImageStencil") imgstenc.SetInputData(whiteImage) imgstenc.SetStencilConnection(pol2stenc.GetOutputPort()) imgstenc.SetReverseStencil(invert) @@ -2401,7 +2401,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu img.SetOrigin(bounds[0], bounds[2], bounds[4]) img.AllocateScalars(vtk.VTK_FLOAT, 1) - imp = vtk.get("ImplicitPolyDataDistance")() + imp = vtk.new("ImplicitPolyDataDistance") imp.SetInput(self.dataset) b2 = bounds[2] b4 = bounds[4] diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 235f9322..76a845b7 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -59,7 +59,7 @@ def merge(*meshs, flag=False): return None idarr = [] - polyapp = vtk.get("AppendPolyData")() + polyapp = vtk.new("AppendPolyData") for i, ob in enumerate(objs): polyapp.AddInputData(ob.dataset) if flag: @@ -536,7 +536,7 @@ def fibonacci_sphere(n): self.actor = vtk.vtkActor() self.properties = self.actor.GetProperty() self.properties_backface = self.actor.GetBackfaceProperty() - self.mapper = vtk.get("PolyDataMapper")() + self.mapper = vtk.new("PolyDataMapper") self.dataset = vtk.vtkPolyData() self.transform = LinearTransform() @@ -788,7 +788,7 @@ def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): flip all normals """ poly = self.dataset - pcan = vtk.get("PCANormalEstimation")() + pcan = vtk.new("PCANormalEstimation") pcan.SetInputData(poly) pcan.SetSampleSize(n) @@ -875,7 +875,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): poly1 = self.dataset poly2 = pcloud.dataset - df = vtk.get("DistancePolyDataFilter")() + df = vtk.new("DistancePolyDataFilter") df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) df.SetInputData(1, poly2) @@ -891,7 +891,7 @@ def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): vedo.logger.warning("distance_to() called with signed=True but input object has no polygons") if not pcloud.point_locator: - pcloud.point_locator = vtk.get("PointLocator")() + pcloud.point_locator = vtk.new("PointLocator") pcloud.point_locator.SetDataSet(pcloud) pcloud.point_locator.BuildLocator() @@ -925,7 +925,7 @@ def clean(self): """ Clean pointcloud or mesh by removing coincident points. """ - cpd = vtk.get("CleanPolyData")() + cpd = vtk.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -962,7 +962,7 @@ def subsample(self, fraction, absolute=False): if fraction <= 0: return self - cpd = vtk.get("CleanPolyData")() + cpd = vtk.new("CleanPolyData") cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() @@ -1004,7 +1004,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): Examples: - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ - thres = vtk.get("Threshold")() + thres = vtk.new("Threshold") thres.SetInputData(self.dataset) if on.startswith("c"): @@ -1034,7 +1034,7 @@ def threshold(self, scalars, above=None, below=None, on="points"): thres.Update() - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(thres.GetOutput()) gf.Update() self._update(gf.GetOutput()) @@ -1046,7 +1046,7 @@ def quantize(self, value): The user should input a value and all {x,y,z} coordinates will be quantized to that absolute grain size. """ - qp = vtk.get("QuantizePolyDataPoints")() + qp = vtk.new("QuantizePolyDataPoints") qp.SetInputData(self.dataset) qp.SetQFactor(value) qp.Update() @@ -1090,7 +1090,7 @@ def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=F ![](https://vedo.embl.es/images/basic/align2.png) """ - icp = vtk.get("IterativeClosestPointTransform")() + icp = vtk.new("IterativeClosestPointTransform") icp.SetSource(self.dataset) icp.SetTarget(target.dataset) if invert: @@ -1287,7 +1287,7 @@ def mirror(self, axis="x", origin=True): def flip_normals(self): """Flip all normals.""" - rs = vtk.get("ReverseSense")() + rs = vtk.new("ReverseSense") rs.SetInputData(self.dataset) rs.ReverseCellsOff() rs.ReverseNormalsOn() @@ -1358,7 +1358,7 @@ def closest_point( poly = None if not self.point_locator: poly = self.dataset - self.point_locator = vtk.get("StaticPointLocator")() + self.point_locator = vtk.new("StaticPointLocator") self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() @@ -1399,9 +1399,9 @@ def closest_point( # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 if vedo.vtk_version[0] >= 9 and vedo.vtk_version[1] > 0: - self.cell_locator = vtk.get("StaticCellLocator")() + self.cell_locator = vtk.new("StaticCellLocator") else: - self.cell_locator = vtk.get("CellLocator")() + self.cell_locator = vtk.new("CellLocator") self.cell_locator.SetDataSet(poly) self.cell_locator.BuildLocator() @@ -1447,7 +1447,7 @@ def hausdorff_distance(self, points): ``` ![](https://vedo.embl.es/images/feats/heart.png) """ - hp = vtk.get("HausdorffDistancePointSetFilter")() + hp = vtk.new("HausdorffDistancePointSetFilter") hp.SetInputData(0, self.dataset) hp.SetInputData(1, points.dataset) hp.SetTargetDistanceMethodToPointToCell() @@ -1471,11 +1471,11 @@ def chamfer_distance(self, pcloud): """ # Definition of Chamfer distance may vary, here we use the average if not pcloud.point_locator: - pcloud.point_locator = vtk.get("PointLocator")() + pcloud.point_locator = vtk.new("PointLocator") pcloud.point_locator.SetDataSet(pcloud.dataset) pcloud.point_locator.BuildLocator() if not self.point_locator: - self.point_locator = vtk.get("PointLocator")() + self.point_locator = vtk.new("PointLocator") self.point_locator.SetDataSet(self.dataset) self.point_locator.BuildLocator() @@ -1513,7 +1513,7 @@ def remove_outliers(self, radius, neighbors=5): ![](https://vedo.embl.es/images/basic/clustering.png) """ - removal = vtk.get("RadiusOutlierRemoval")() + removal = vtk.new("RadiusOutlierRemoval") removal.SetInputData(self.dataset) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) @@ -1899,7 +1899,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): plane.SetOrigin(origin) plane.SetNormal(normal) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() @@ -1936,7 +1936,7 @@ def cut_with_planes(self, origins, normals, invert=False): planes.SetPoints(vpoints) planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) # must be True clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) @@ -1976,14 +1976,14 @@ def cut_with_box(self, bounds, invert=False): if isinstance(bounds, Points): bounds = bounds.bounds() - box = vtk.get("Box")() + box = vtk.new("Box") if utils.is_sequence(bounds[0]): for bs in bounds: box.AddBounds(bs) else: box.SetBounds(bounds) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) @@ -2005,7 +2005,7 @@ def cut_with_line(self, points, invert=False, closed=True): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ - pplane = vtk.get("PolyPlane")() + pplane = vtk.new("PolyPlane") if isinstance(points, Points): points = points.vertices.tolist() @@ -2021,14 +2021,14 @@ def cut_with_line(self, points, invert=False, closed=True): vpoints.InsertNextPoint(p) n = len(points) - polyline = vtk.get("PolyLine")() + polyline = vtk.new("PolyLine") polyline.Initialize(n, vpoints) polyline.GetPointIds().SetNumberOfIds(n) for i in range(n): polyline.GetPointIds().SetId(i, i) pplane.SetPolyLine(polyline) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) @@ -2090,20 +2090,20 @@ def cut_with_cookiecutter(self, lines): poly = lines.dataset # if invert: # not working - # rev = vtk.get("ReverseSense")() + # rev = vtk.new("ReverseSense") # rev.ReverseCellsOn() # rev.SetInputData(poly) # rev.Update() # poly = rev.GetOutput() # Build loops from the polyline - build_loops = vtk.get("ContourLoopExtraction")() + build_loops = vtk.new("ContourLoopExtraction") build_loops.SetGlobalWarningDisplay(0) build_loops.SetInputData(poly) build_loops.Update() boundary_poly = build_loops.GetOutput() - ccut = vtk.get("CookieCutter")() + ccut = vtk.new("CookieCutter") ccut.SetInputData(self.dataset) ccut.SetLoopsData(boundary_poly) ccut.SetPointInterpolationToMeshEdges() @@ -2152,12 +2152,12 @@ def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) axis = (0, 1, 0) elif "z" in s: axis = (0, 0, 1) - cyl = vtk.get("Cylinder")() + cyl = vtk.new("Cylinder") cyl.SetCenter(center) cyl.SetAxis(axis[0], axis[1], axis[2]) cyl.SetRadius(r) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) @@ -2194,11 +2194,11 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ - sph = vtk.get("Sphere")() + sph = vtk.new("Sphere") sph.SetCenter(center) sph.SetRadius(r) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) @@ -2243,7 +2243,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): signed_distances.SetName("SignedDistances") # implicit function that will be used to slice the mesh - ippd = vtk.get("ImplicitPolyDataDistance")() + ippd = vtk.new("ImplicitPolyDataDistance") ippd.SetInput(polymesh) # Evaluate the signed distance function at all of the grid points @@ -2259,7 +2259,7 @@ def cut_with_mesh(self, mesh, invert=False, keep=False): poly.GetPointData().AddArray(signed_distances) poly.GetPointData().SetActiveScalars("SignedDistances") - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(poly) clipper.SetInsideOut(not invert) clipper.SetGenerateClippedOutput(keep) @@ -2328,22 +2328,22 @@ def cut_with_point_loop( vpts.InsertNextPoint(p) if "cell" in on: - ippd = vtk.get("ImplicitSelectionLoop")() + ippd = vtk.new("ImplicitSelectionLoop") ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() - clipper = vtk.get("ExtractPolyDataGeometry")() + clipper = vtk.new("ExtractPolyDataGeometry") clipper.SetInputData(self.dataset) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) else: - spol = vtk.get("SelectPolyData")() + spol = vtk.new("SelectPolyData") spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() spol.SetInputData(self.dataset) spol.Update() - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(spol.GetOutput()) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) @@ -2381,7 +2381,7 @@ def cut_with_scalar(self, value, name="", invert=False): """ if name: self.pointdata.select(name) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetValue(value) clipper.GenerateClippedOutputOff() @@ -2419,7 +2419,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No ``` ![](https://user-images.githubusercontent.com/32848391/57081955-0ef1e800-6cf6-11e9-99de-b45220939bc9.png) """ - cu = vtk.get("Box")() + cu = vtk.new("Box") pos = np.array(self.pos()) x0, x1, y0, y1, z0, z1 = self.bounds() x0, y0, z0 = [x0, y0, z0] - pos @@ -2442,7 +2442,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=No cu.SetBounds(bounds) - clipper = vtk.get("ClipPolyData")() + clipper = vtk.new("ClipPolyData") clipper.SetInputData(self.dataset) clipper.SetClipFunction(cu) clipper.InsideOutOn() @@ -2475,14 +2475,14 @@ def generate_surface_halo( if not maxdist: maxdist = self.diagonal_size() / 2 - imp = vtk.get("ImplicitModeller")() + imp = vtk.new("ImplicitModeller") imp.SetInputData(self.dataset) imp.SetSampleDimensions(res) if maxdist: imp.SetMaximumDistance(maxdist) if len(bounds) == 6: imp.SetModelBounds(bounds) - contour = vtk.get("ContourFilter")() + contour = vtk.new("ContourFilter") contour.SetInputConnection(imp.GetOutputPort()) contour.SetValue(0, distance) contour.Update() @@ -2664,7 +2664,7 @@ def reconstruct_surface( if not utils.is_sequence(dims): dims = (dims, dims, dims) - sdf = vtk.get("SignedDistance")() + sdf = vtk.new("SignedDistance") if len(bounds) == 6: sdf.SetBounds(bounds) @@ -2692,7 +2692,7 @@ def reconstruct_surface( if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) else: - normals = vtk.get("PCANormalEstimation")() + normals = vtk.new("PCANormalEstimation") normals.SetInputData(pd) if not sample_size: sample_size = int(pd.GetNumberOfPoints() / 50) @@ -2709,7 +2709,7 @@ def reconstruct_surface( sdf.SetDimensions(dims) sdf.Update() - surface = vtk.get("ExtractSurface")() + surface = vtk.new("ExtractSurface") surface.SetRadius(radius * 0.99) surface.SetHoleFilling(hole_filling) surface.ComputeNormalsOff() @@ -2736,7 +2736,7 @@ def compute_clustering(self, radius): ![](https://vedo.embl.es/images/basic/clustering.png) """ - cluster = vtk.get("EuclideanClusterExtraction")() + cluster = vtk.new("EuclideanClusterExtraction") cluster.SetInputData(self.dataset) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) @@ -2797,7 +2797,7 @@ def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=( within this angle threshold (expressed in degrees). """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html - cpf = vtk.get("ConnectedPointsFilter")() + cpf = vtk.new("ConnectedPointsFilter") cpf.SetInputData(self.dataset) cpf.SetRadius(radius) if mode == 0: # Extract all regions @@ -2840,7 +2840,7 @@ def compute_camera_distance(self): """ if vedo.plotter_instance.renderer: poly = self.dataset - dc = vtk.get("DistanceToCamera")() + dc = vtk.new("DistanceToCamera") dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() @@ -2874,7 +2874,7 @@ def density( ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ - pdf = vtk.get("PointDensityFilter")() + pdf = vtk.new("PointDensityFilter") pdf.SetInputData(self.dataset) if not utils.is_sequence(dims): @@ -2948,7 +2948,7 @@ def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=No It is also recommended that a N closest neighborhood is used. """ - src = vtk.get("ProgrammableSource")() + src = vtk.new("ProgrammableSource") opts = self.vertices def _read_points(): @@ -2960,7 +2960,7 @@ def _read_points(): src.SetExecuteMethod(_read_points) - dens = vtk.get("DensifyPointCloudFilter")() + dens = vtk.new("DensifyPointCloudFilter") dens.SetInputConnection(src.GetOutputPort()) dens.InterpolateAttributeDataOn() dens.SetTargetDistance(target_distance) @@ -3018,7 +3018,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu bounds = self.bounds() if maxradius is None: maxradius = self.diagonal_size() / 2 - dist = vtk.get("SignedDistance")() + dist = vtk.new("SignedDistance") dist.SetInputData(self.dataset) dist.SetRadius(maxradius) dist.SetBounds(bounds) @@ -3026,7 +3026,7 @@ def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradiu dist.Update() img = dist.GetOutput() if invert: - mat = vtk.get("ImageMathematics")() + mat = vtk.new("ImageMathematics") mat.SetInput1Data(img) mat.SetOperationToMultiplyByK() mat.SetConstantK(-1) @@ -3096,17 +3096,17 @@ def tovolume( ) if not self.point_locator: - self.point_locator = vtk.get("PointLocator")() + self.point_locator = vtk.new("PointLocator") self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() if kernel == "shepard": - kern = vtk.get("ShepardKernel")() + kern = vtk.new("ShepardKernel") kern.SetPowerParameter(2) elif kernel == "gaussian": - kern = vtk.get("GaussianKernel")() + kern = vtk.new("GaussianKernel") elif kernel == "linear": - kern = vtk.get("LinearKernel")() + kern = vtk.new("LinearKernel") else: vedo.logger.error("Error in tovolume(), available kernels are:") vedo.logger.error(" [shepard, gaussian, linear]") @@ -3115,7 +3115,7 @@ def tovolume( if radius: kern.SetRadius(radius) - interpolator = vtk.get("PointInterpolator")() + interpolator = vtk.new("PointInterpolator") interpolator.SetInputData(probe) interpolator.SetSourceData(poly) interpolator.SetKernel(kern) @@ -3145,7 +3145,7 @@ def tovolume( def generate_random_data(self): """Fill a dataset with random attributes""" - gen = vtk.get("RandomAttributeGenerator")() + gen = vtk.new("RandomAttributeGenerator") gen.SetInputData(self.dataset) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() @@ -3212,7 +3212,7 @@ def generate_delaunay2d( vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) pd.SetPoints(vpts) - delny = vtk.get("Delaunay2D")() + delny = vtk.new("Delaunay2D") delny.SetInputData(pd) if tol: delny.SetTolerance(tol) @@ -3236,7 +3236,7 @@ def generate_delaunay2d( delny.SetSourceData(boundary) if mode == "fit": - delny.SetProjectionPlaneMode(vtk.get("VTK_BEST_FITTING_PLANE")) + delny.SetProjectionPlaneMode(vtk.get_class("VTK_BEST_FITTING_PLANE")) delny.Update() msh = vedo.mesh.Mesh(delny.GetOutput()) @@ -3318,7 +3318,7 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.locator = None elif method == "vtk": - vor = vtk.get("Voronoi2D")() + vor = vtk.new("Voronoi2D") if isinstance(pts, Points): vor.SetInputData(pts) else: @@ -3388,7 +3388,7 @@ def visible_points(self, area=(), tol=None, invert=False): ``` ![](https://vedo.embl.es/images/feats/visible_points.png) """ - svp = vtk.get("SelectVisiblePoints")() + svp = vtk.new("SelectVisiblePoints") svp.SetInputData(self.dataset) ren = None diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 76a34f8a..f91f1b4f 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -11,7 +11,7 @@ module_cache = {} ###################################################################### -def get(cls_name="", module_name=""): +def get_class(cls_name="", module_name=""): """ Get a vtk class from its name. @@ -20,8 +20,8 @@ def get(cls_name="", module_name=""): from vedo import vtkclasses as vtk print(vtk.vtkActor) print(vtk.location["vtkActor"]) - print(vtk.get("vtkActor")) - print(vtk.get("vtkActor", "vtkRenderingCore")) + print(vtk.get_class("vtkActor")) + print(vtk.get_class("vtkActor", "vtkRenderingCore")) ``` """ if cls_name and not cls_name.startswith("vtk"): @@ -37,6 +37,22 @@ def get(cls_name="", module_name=""): else: return module_cache[module_name] +def get(*args): + return get_class(*args) + +def new(cls_name="", module_name=""): + """ + Create a new vtk object from its name. + + Example: + ```python + from vedo import vtkclasses as vtk + a = vtk.new("Actor") + ``` + """ + return get_class(cls_name, module_name)() + + def dump_hierarchy_to_file(fname=""): """ Print all available vtk classes. From 28c4ad6d2a5556c4d64d8cbb3eeceafdf8c53d79 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:35:47 +0100 Subject: [PATCH 193/251] vtkclasses get() -> new() vedo/core.py --- vedo/addons.py | 40 +++++++------- vedo/applications.py | 4 +- vedo/assembly.py | 8 +-- vedo/backends.py | 2 +- vedo/colors.py | 10 ++-- vedo/core.py | 122 +++++++++++++++++++++---------------------- 6 files changed, 93 insertions(+), 93 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index af5ca4b2..0fddac1a 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1394,7 +1394,7 @@ def __init__( if value is None or value < xmin: value = xmin - slider_rep = vtk.get("SliderRepresentation2D")() + slider_rep = vtk.new("SliderRepresentation2D") slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) @@ -1592,7 +1592,7 @@ def __init__( if value is None or value < xmin: value = xmin - slider_rep = vtk.get("SliderRepresentation3D")() + slider_rep = vtk.new("SliderRepresentation3D") slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) @@ -1755,10 +1755,10 @@ def __init__( self._alpha = alpha self._keypress_id = None - self._implicit_func = vtk.get("Plane")() + self._implicit_func = vtk.new("Plane") poly = mesh.dataset - self.clipper = vtk.get("ClipPolyData")() + self.clipper = vtk.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -1766,7 +1766,7 @@ def __init__( self.clipper.GenerateClippedOutputOn() self.clipper.Update() - self.widget = vtk.get("ImplicitPlaneWidget")() + self.widget = vtk.new("ImplicitPlaneWidget") # self.widget.KeyPressActivationOff() # self.widget.SetKeyPressActivationValue('i') @@ -1899,11 +1899,11 @@ def __init__( else: self._init_bounds = initial_bounds - self._implicit_func = vtk.get("Planes")() + self._implicit_func = vtk.new("Planes") self._implicit_func.SetBounds(self._init_bounds) poly = mesh.dataset - self.clipper = vtk.get("ClipPolyData")() + self.clipper = vtk.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -2009,7 +2009,7 @@ def __init__( self._alpha = alpha self._keypress_id = None - self._implicit_func = vtk.get("Sphere")() + self._implicit_func = vtk.new("Sphere") if len(origin) == 3: self._implicit_func.SetCenter(origin) @@ -2024,7 +2024,7 @@ def __init__( self._implicit_func.SetRadius(radius) poly = mesh.dataset - self.clipper = vtk.get("ClipPolyData")() + self.clipper = vtk.new("ClipPolyData") self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) @@ -2124,9 +2124,9 @@ def __init__(self, c="k", alpha=None, lw=None, padding=None): pd.SetPoints(ppoints) pd.SetLines(lines) - mapper = vtk.get("PolyDataMapper2D")() + mapper = vtk.new("PolyDataMapper2D") mapper.SetInputData(pd) - cs = vtk.get("Coordinate")() + cs = vtk.new("Coordinate") cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) @@ -2178,7 +2178,7 @@ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): pd.SetLines(lines) self.dataset = pd - mapper = vtk.get("PolyDataMapper2D")() + mapper = vtk.new("PolyDataMapper2D") mapper.SetInputData(pd) cs = vtk.vtkCoordinate() cs.SetCoordinateSystemToNormalizedViewport() @@ -4208,7 +4208,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.widgets.append(icn) elif plt.axes == 5: - axact = vtk.get("AnnotatedCubeActor")() + axact = vtk.new("AnnotatedCubeActor") axact.GetCubeProperty().SetColor(get_color(settings.annotated_cube_color)) axact.SetTextEdgesVisibility(0) axact.SetFaceTextScale(settings.annotated_cube_text_scale) @@ -4245,7 +4245,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.widgets.append(icn) elif plt.axes == 6: - ocf = vtk.get("OutlineCornerFilter")() + ocf = vtk.new("OutlineCornerFilter") ocf.SetCornerFactor(0.1) largestact, sz = None, -1 for a in plt.objects: @@ -4270,7 +4270,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): return ocf.Update() - oc_mapper = vtk.get("HierarchicalPolyDataMapper")() + oc_mapper = vtk.new("HierarchicalPolyDataMapper") oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) oc_actor = vtk.vtkActor() oc_actor.SetMapper(oc_mapper) @@ -4297,7 +4297,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 8: vbb = compute_visible_bounds()[0] - ca = vtk.get("CubeAxesActor")() + ca = vtk.new("CubeAxesActor") ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) ca.GetXAxesLinesProperty().SetColor(c) @@ -4318,7 +4318,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 9: vbb = compute_visible_bounds()[0] - src = vtk.get("CubeSource")() + src = vtk.new("CubeSource") src.SetXLength(vbb[1] - vbb[0]) src.SetYLength(vbb[3] - vbb[2]) src.SetZLength(vbb[5] - vbb[4]) @@ -4360,7 +4360,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): plt.add(gr) elif plt.axes == 12: - polaxes = vtk.get("PolarAxesActor")() + polaxes = vtk.new("PolarAxesActor") vbb = compute_visible_bounds()[0] polaxes.SetPolarAxisTitle("radial distance") @@ -4392,7 +4392,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 13: # draws a simple ruler at the bottom of the window - ls = vtk.get("LegendScaleActor")() + ls = vtk.new("LegendScaleActor") ls.RightAxisVisibilityOff() ls.TopAxisVisibilityOff() ls.LeftAxisVisibilityOff() @@ -4417,7 +4417,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): elif plt.axes == 14: try: - cow = vtk.get("CameraOrientationWidget")() + cow = vtk.new("CameraOrientationWidget") cow.SetParentRenderer(plt.renderer) cow.On() plt.axes_instances[r] = cow diff --git a/vedo/applications.py b/vedo/applications.py index 22be9a3a..c229ad2a 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -472,10 +472,10 @@ def __init__(self, vol, levels=(None, None), histo_color="red5", **kwargs): orig_volume = vol.clone(deep=False) self.volume = vol - self.volume.actor = vtk.get("ImageSlice")() + self.volume.actor = vtk.new("ImageSlice") self.volume.properties = self.volume.actor.GetProperty() - self.volume.mapper = vtk.get("ImageResliceMapper")() + self.volume.mapper = vtk.new("ImageResliceMapper") self.volume.mapper.SliceFacesCameraOn() self.volume.mapper.SliceAtFocalPointOn() self.volume.mapper.SetAutoAdjustImageQuality(False) diff --git a/vedo/assembly.py b/vedo/assembly.py index 588daa12..514ce856 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -45,13 +45,13 @@ def procrustes_alignment(sources, rigid=False): ![](https://vedo.embl.es/images/basic/align4.png) """ - group = vtk.get("MultiBlockDataGroupFilter")() + group = vtk.new("MultiBlockDataGroupFilter") for source in sources: if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() group.AddInputData(source.dataset) - procrustes = vtk.get("ProcrustesAlignmentFilter")() + procrustes = vtk.new("ProcrustesAlignmentFilter") procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) if rigid: @@ -242,7 +242,7 @@ def __init__(self, *meshs): scalarbars = [] for a in self.actors: - if isinstance(a, vtk.get("Prop3D")): # and a.GetNumberOfPoints(): + if isinstance(a, vtk.get_class("Prop3D")): # and a.GetNumberOfPoints(): self.AddPart(a) if hasattr(a, "scalarbar") and a.scalarbar is not None: scalarbars.append(a.scalarbar) @@ -327,7 +327,7 @@ def __add__(self, obj): """ Add an object to the assembly """ - if isinstance(obj, vtk.get("Prop3D")): + if isinstance(obj, vtk.get_class("Prop3D")): self.objects.append(obj) self.actors.append(obj.actor) diff --git a/vedo/backends.py b/vedo/backends.py index f168bf75..60cdaeed 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -163,7 +163,7 @@ def start_k3d(actors2show): vtkdata = iapoly.GetCellData() vtkscals = vtkdata.GetScalars() if vtkscals is not None: - c2p = vtk.get("CellDataToPointData")() + c2p = vtk.new("CellDataToPointData") c2p.SetInputData(iapoly) c2p.Update() iapoly = c2p.GetOutput() diff --git a/vedo/colors.py b/vedo/colors.py index 1984e082..8cc0a33d 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -796,7 +796,7 @@ def get_color(rgb=None, hsv=None): return tuple(rgbh) else: # vtk name color - namedColors = vtk.get("NamedColors")() + namedColors = vtk.new("NamedColors") rgba = [0, 0, 0, 0] namedColors.GetColor(c, rgba) return (rgba[0] / 255.0, rgba[1] / 255.0, rgba[2] / 255.0) @@ -823,7 +823,7 @@ def get_color_name(c): def hsv2rgb(hsv): """Convert HSV to RGB color.""" - ma = vtk.get("Math")() + ma = vtk.new("Math") rgb = [0, 0, 0] ma.HSVToRGB(hsv, rgb) return rgb @@ -831,7 +831,7 @@ def hsv2rgb(hsv): def rgb2hsv(rgb): """Convert RGB to HSV color.""" - ma = vtk.get("Math")() + ma = vtk.new("Math") hsv = [0, 0, 0] ma.RGBToHSV(get_color(rgb), hsv) return hsv @@ -1019,7 +1019,7 @@ def build_lut( ![](https://vedo.embl.es/images/basic/mesh_lut.png) """ - ctf = vtk.get("ColorTransferFunction")() + ctf = vtk.new("ColorTransferFunction") ctf.SetColorSpaceToRGB() ctf.SetScaleToLinear() alpha_x, alpha_vals = [], [] @@ -1034,7 +1034,7 @@ def build_lut( alpha_x.append(scalar) alpha_vals.append(alf) - lut = vtk.get("LookupTable")() + lut = vtk.new("LookupTable") lut.SetNumberOfTableValues(256) x0, x1 = ctf.GetRange() # range of the introduced values diff --git a/vedo/core.py b/vedo/core.py index 8b59a594..b11e70b8 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -527,7 +527,7 @@ def average_size(self): def center_of_mass(self): """Get the center of mass of mesh.""" - cmf = vtk.get("CenterOfMass")() + cmf = vtk.new("CenterOfMass") cmf.SetInputData(self.dataset) cmf.Update() c = cmf.GetCenter() @@ -622,7 +622,7 @@ def cell_centers(self): Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) """ - vcen = vtk.get("CellCenters")() + vcen = vtk.new("CellCenters") vcen.SetInputData(self.dataset) vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) @@ -665,7 +665,7 @@ def mark_boundaries(self): Mark cells and vertices of the mesh if they lie on a boundary. A new array called `BoundaryCells` is added to the mesh. """ - mb = vtk.get("MarkBoundaryFilter")() + mb = vtk.new("MarkBoundaryFilter") mb.SetInputData(self.dataset) mb.Update() self.dataset.DeepCopy(mb.GetOutput()) @@ -692,7 +692,7 @@ def find_cells_in_bounds(self, xbounds=(), ybounds=(), zbounds=()): cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.get("CellTreeLocator")() + self.cell_locator = vtk.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cell_ids) @@ -708,7 +708,7 @@ def find_cells_along_line(self, p0, p1, tol=0.001): """ cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.get("CellTreeLocator")() + self.cell_locator = vtk.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongLine(p0, p1, tol, cell_ids) @@ -724,7 +724,7 @@ def find_cells_along_plane(self, origin, normal, tol=0.001): """ cell_ids = vtk.vtkIdList() if not self.cell_locator: - self.cell_locator = vtk.get("CellTreeLocator")() + self.cell_locator = vtk.new("CellTreeLocator") self.cell_locator.SetDataSet(self.dataset) self.cell_locator.BuildLocator() self.cell_locator.FindCellsAlongPlane(origin, normal, tol, cell_ids) @@ -770,7 +770,7 @@ def map_cells_to_points(self, arrays=(), move=False): Set `move=True` to delete the original `celldata` array. """ - c2p = vtk.get("CellDataToPointData")() + c2p = vtk.new("CellDataToPointData") c2p.SetInputData(self.dataset) if not move: c2p.PassCellDataOn() @@ -797,7 +797,7 @@ def vertices(self): except AttributeError: try: # valid for rectilinear/structured grid, image data - v2p = vtk.get("ImageToPoints")() + v2p = vtk.new("ImageToPoints") v2p.SetInputData(self.dataset) v2p.Update() varr = v2p.GetOutput().GetPoints().GetData() @@ -883,7 +883,7 @@ def map_points_to_cells(self, arrays=(), move=False): Examples: - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ - p2c = vtk.get("PointDataToCellData")() + p2c = vtk.new("PointDataToCellData") p2c.SetInputData(self.dataset) if not move: p2c.PassPointDataOn() @@ -926,7 +926,7 @@ def resample_data_from(self, source, tol=None, categorical=False): show(m1, m2 , N=2, axes=1) ``` """ - rs = vtk.get("ResampleWithDataSet")() + rs = vtk.new("ResampleWithDataSet") rs.SetInputData(self.dataset) rs.SetSourceData(source.dataset) @@ -995,7 +995,7 @@ def interpolate_data_from( if on == "points": points = source.dataset elif on == "cells": - c2p = vtk.get("CellDataToPointData")() + c2p = vtk.new("CellDataToPointData") # poly2 = vtk.vtkPolyData() # poly2.ShallowCopy(source.dataset) c2p.SetInputData(source.dataset) @@ -1005,20 +1005,20 @@ def interpolate_data_from( vedo.logger.error("in interpolate_data_from(), on must be on points or cells") raise RuntimeError() - locator = vtk.get("PointLocator")() + locator = vtk.new("PointLocator") locator.SetDataSet(points) locator.BuildLocator() if kernel.lower() == "shepard": - kern = vtk.get("ShepardKernel")() + kern = vtk.new("ShepardKernel") kern.SetPowerParameter(2) elif kernel.lower() == "gaussian": - kern = vtk.get("GaussianKernel")() + kern = vtk.new("GaussianKernel") kern.SetSharpness(2) elif kernel.lower() == "linear": - kern = vtk.get("LinearKernel")() + kern = vtk.new("LinearKernel") # elif kernel.lower() == "voronoi": - # kern = vtk.get("ProbabilisticVoronoiKernel")() + # kern = vtk.new("ProbabilisticVoronoiKernel") else: vedo.logger.error("available kernels are: [shepard, gaussian, linear, voronoi]") raise RuntimeError() @@ -1030,7 +1030,7 @@ def interpolate_data_from( kern.SetRadius(radius) kern.SetKernelFootprintToRadius() - interpolator = vtk.get("PointInterpolator")() + interpolator = vtk.new("PointInterpolator") interpolator.SetInputData(self.dataset) interpolator.SetSourceData(points) interpolator.SetKernel(kern) @@ -1044,7 +1044,7 @@ def interpolate_data_from( interpolator.Update() if on == "cells": - p2c = vtk.get("PointDataToCellData")() + p2c = vtk.new("PointDataToCellData") p2c.SetInputData(interpolator.GetOutput()) p2c.Update() cpoly = p2c.GetOutput() @@ -1058,7 +1058,7 @@ def interpolate_data_from( def add_ids(self): """Generate point and cell ids arrays.""" - ids = vtk.get("IdFilter")() + ids = vtk.new("IdFilter") ids.SetInputData(self.dataset) ids.PointIdsOn() ids.CellIdsOn() @@ -1089,7 +1089,7 @@ def gradient(self, input_array=None, on="points", fast=False): ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) """ - gra = vtk.get("GradientFilter")() + gra = vtk.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1135,7 +1135,7 @@ def divergence(self, array_name=None, on="points", fast=False): if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ - div = vtk.get("GradientFilter")() + div = vtk.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1181,7 +1181,7 @@ def vorticity(self, array_name=None, on="points", fast=False): if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ - vort = vtk.get("GradientFilter")() + vort = vtk.new("GradientFilter") if on.startswith("p"): varr = self.dataset.GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS @@ -1229,7 +1229,7 @@ def probe(self, source): ![](https://vedo.embl.es/images/volumetric/probePoints.png) """ - probe_filter = vtk.get("ProbeFilter")() + probe_filter = vtk.new("ProbeFilter") probe_filter.SetSourceData(source.dataset) probe_filter.SetInputData(self.dataset) probe_filter.Update() @@ -1246,7 +1246,7 @@ def compute_cell_size(self): Array names are: `Area`, `Volume`, `Length`. """ - csf = vtk.get("CellSizeFilter")() + csf = vtk.new("CellSizeFilter") csf.SetInputData(self.dataset) csf.SetComputeArea(1) csf.SetComputeVolume(1) @@ -1269,7 +1269,7 @@ def write(self, filename, binary=True): def tomesh(self, bounds=()): """Extract boundary geometry from dataset (or convert data to polygonal type).""" - geo = vtk.get("GeometryFilter")() + geo = vtk.new("GeometryFilter") geo.SetInputData(self.dataset) geo.SetPassThroughCellIds(1) geo.SetPassThroughPointIds(1) @@ -1291,7 +1291,7 @@ def shrink(self, fraction=0.8): ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ - sf = vtk.get("ShrinkFilter")() + sf = vtk.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(fraction) sf.Update() @@ -1370,7 +1370,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.transform = LinearTransform() ################ - tp = vtk.get("TransformPolyDataFilter")() + tp = vtk.new("TransformPolyDataFilter") tp.SetTransform(tr) tp.SetInputData(self.dataset) tp.Update() @@ -1569,10 +1569,10 @@ def isosurface(self, value=None, flying_edges=True): scrange = self.dataset.GetScalarRange() if flying_edges: - cf = vtk.get("FlyingEdges3D")() + cf = vtk.new("FlyingEdges3D") cf.InterpolateAttributesOn() else: - cf = vtk.get("ContourFilter")() + cf = vtk.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) @@ -1630,9 +1630,9 @@ def legosurface( ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ - imp_dataset = vtk.get("ImplicitDataSet")() + imp_dataset = vtk.new("ImplicitDataSet") imp_dataset.SetDataSet(self.dataset) - window = vtk.get("ImplicitWindowFunction")() + window = vtk.new("ImplicitWindowFunction") window.SetImplicitFunction(imp_dataset) srng = list(self.dataset.GetScalarRange()) @@ -1645,14 +1645,14 @@ def legosurface( srng[1] += tol window.SetWindowRange(srng) - extract = vtk.get("ExtractGeometry")() + extract = vtk.new("ExtractGeometry") extract.SetInputData(self.dataset) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) extract.Update() - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(extract.GetOutput()) gf.Update() @@ -1678,9 +1678,9 @@ def tomesh(self, fill=True, shrink=1.0): If `fill=False`, only the boundary faces will be generated. """ - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") if fill: - sf = vtk.get("ShrinkFilter")() + sf = vtk.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() @@ -1688,7 +1688,7 @@ def tomesh(self, fill=True, shrink=1.0): gf.Update() poly = gf.GetOutput() if shrink == 1.0: - clean_poly = vtk.get("CleanPolyData")() + clean_poly = vtk.new("CleanPolyData") clean_poly.PointMergingOn() clean_poly.ConvertLinesToPointsOn() clean_poly.ConvertPolysToLinesOn() @@ -1748,10 +1748,10 @@ def isosurface(self, value=None, flying_edges=True): scrange = self.dataset.GetScalarRange() if flying_edges: - cf = vtk.get("FlyingEdges3D")() + cf = vtk.new("FlyingEdges3D") cf.InterpolateAttributesOn() else: - cf = vtk.get("ContourFilter")() + cf = vtk.new("ContourFilter") cf.UseScalarTreeOn() cf.SetInputData(self.dataset) @@ -1791,9 +1791,9 @@ def tomesh(self, fill=True, shrink=1.0): If `fill=False`, only the boundary faces will be generated. """ - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") if fill: - sf = vtk.get("ShrinkFilter")() + sf = vtk.new("ShrinkFilter") sf.SetInputData(self.dataset) sf.SetShrinkFactor(shrink) sf.Update() @@ -1801,7 +1801,7 @@ def tomesh(self, fill=True, shrink=1.0): gf.Update() poly = gf.GetOutput() if shrink == 1.0: - clean_poly = vtk.get("CleanPolyData")() + clean_poly = vtk.new("CleanPolyData") clean_poly.PointMergingOn() clean_poly.ConvertLinesToPointsOn() clean_poly.ConvertPolysToLinesOn() @@ -1827,19 +1827,19 @@ def tomesh(self, fill=True, shrink=1.0): def extract_cells_by_id(self, idlist, use_point_ids=False): """Return a new UGrid composed of the specified subset of indices.""" - selection_node = vtk.get("SelectionNode")() + selection_node = vtk.new("SelectionNode") if use_point_ids: - selection_node.SetFieldType(vtk.get("SelectionNode").POINT) - contcells = vtk.get("SelectionNode").CONTAINING_CELLS() + selection_node.SetFieldType(vtk.get_class("SelectionNode").POINT) + contcells = vtk.get_class("SelectionNode").CONTAINING_CELLS() selection_node.GetProperties().Set(contcells, 1) else: - selection_node.SetFieldType(vtk.get("SelectionNode").CELL) - selection_node.SetContentType(vtk.get("SelectionNode").INDICES) + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) vidlist = utils.numpy2vtk(idlist, dtype="id") selection_node.SetSelectionList(vidlist) - selection = vtk.get("Selection")() + selection = vtk.new("Selection") selection.AddNode(selection_node) - es = vtk.get("ExtractSelection")() + es = vtk.new("ExtractSelection") es.SetInputData(0, self) es.SetInputData(1, selection) es.Update() @@ -1875,7 +1875,7 @@ def clean(self): """ Cleanup unused points and empty cells """ - cl = vtk.get("StaticCleanUnstructuredGrid")() + cl = vtk.new("StaticCleanUnstructuredGrid") cl.SetInputData(self.dataset) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() @@ -1895,13 +1895,13 @@ def extract_cells_on_plane(self, origin, normal): """ Extract cells that are lying of the specified surface. """ - bf = vtk.get("3DLinearGridCrinkleExtractor")() + bf = vtk.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - plane = vtk.get("Plane")() + plane = vtk.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) bf.SetImplicitFunction(plane) @@ -1920,13 +1920,13 @@ def extract_cells_on_sphere(self, center, radius): """ Extract cells that are lying of the specified surface. """ - bf = vtk.get("3DLinearGridCrinkleExtractor")() + bf = vtk.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - sph = vtk.get("Sphere")() + sph = vtk.new("Sphere") sph.SetRadius(radius) sph.SetCenter(center) bf.SetImplicitFunction(sph) @@ -1945,13 +1945,13 @@ def extract_cells_on_cylinder(self, center, axis, radius): """ Extract cells that are lying of the specified surface. """ - bf = vtk.get("3DLinearGridCrinkleExtractor")() + bf = vtk.new("3DLinearGridCrinkleExtractor") bf.SetInputData(self.dataset) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() - cyl = vtk.get("Cylinder")() + cyl = vtk.new("Cylinder") cyl.SetRadius(radius) cyl.SetCenter(center) cyl.SetAxis(axis) @@ -1987,10 +1987,10 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) - plane = vtk.get("Plane")() + plane = vtk.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) - clipper = vtk.get("ClipDataSet")() + clipper = vtk.new("ClipDataSet") clipper.SetInputData(self.dataset) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() @@ -2032,7 +2032,7 @@ def cut_with_box(self, box): ``` ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ - bc = vtk.get("BoxClipDataSet")() + bc = vtk.new("BoxClipDataSet") bc.SetInputData(self.dataset) try: boxb = box.bounds() @@ -2059,11 +2059,11 @@ def cut_with_mesh( """ ug = self.dataset - ippd = vtk.get("ImplicitPolyDataDistance")() + ippd = vtk.new("ImplicitPolyDataDistance") ippd.SetInput(mesh.dataset) if whole_cells or only_boundary: - clipper = vtk.get("ExtractGeometry")() + clipper = vtk.new("ExtractGeometry") clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) @@ -2081,7 +2081,7 @@ def cut_with_mesh( signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) ug.GetPointData().SetActiveScalars("SignedDistance") - clipper = vtk.get("ClipDataSet")() + clipper = vtk.new("ClipDataSet") clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) From bfe3bf05fc1d67209e40d91fe4f6dded3e3725c0 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:38:56 +0100 Subject: [PATCH 194/251] vtkclasses get() -> new() vedo/file_io.py --- vedo/dolfin.py | 6 +-- vedo/file_io.py | 132 ++++++++++++++++++++++++------------------------ 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/vedo/dolfin.py b/vedo/dolfin.py index 2006afe7..5fc670a4 100644 --- a/vedo/dolfin.py +++ b/vedo/dolfin.py @@ -366,15 +366,15 @@ def plot(*inputobj, **options): if vedo.plotter_instance: if xtitle != "x": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): + if len(aet) > at and isinstance(aet[at], vtk.get_class("CubeAxesActor")): aet[at].SetXTitle(xtitle) if ytitle != "y": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): + if len(aet) > at and isinstance(aet[at], vtk.get_class("CubeAxesActor")): aet[at].SetYTitle(ytitle) if ztitle != "z": aet = vedo.plotter_instance.axes_instances - if len(aet) > at and isinstance(aet[at], vtk.get("CubeAxesActor")): + if len(aet) > at and isinstance(aet[at], vtk.get_class("CubeAxesActor")): aet[at].SetZTitle(ztitle) # change some default to emulate standard behaviours diff --git a/vedo/file_io.py b/vedo/file_io.py index 5664b9bb..2ef857c8 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -227,7 +227,7 @@ def load(inputobj, unpack=True, force=False): elif os.path.isdir(fod): ### it's a directory or DICOM flist = os.listdir(fod) if ".dcm" in flist[0]: ### it's DICOM - reader = vtk.get("DICOMImageReader")() + reader = vtk.new("DICOMImageReader") reader.SetDirectoryName(fod) reader.Update() image = reader.GetOutput() @@ -293,7 +293,7 @@ def _load_file(filename, unpack): elif fl.endswith(".3ds"): # 3ds format actor = load3DS(filename) elif fl.endswith(".wrl"): - importer = vtk.get("VRMLImporter")() + importer = vtk.new("VRMLImporter") importer.SetFileName(filename) importer.Read() importer.Update() @@ -328,11 +328,11 @@ def _load_file(filename, unpack): or fl.endswith(".gif") ): if ".png" in fl: - picr = vtk.get("vtkPNGReader")() + picr = vtk.new("PNGReader") elif ".jpg" in fl or ".jpeg" in fl: - picr = vtk.get("vtkJPEGReader")() + picr = vtk.new("JPEGReader") elif ".bmp" in fl: - picr = vtk.get("vtkBMPReader")() + picr = vtk.new("BMPReader") elif ".gif" in fl: from PIL import Image as PILImage, ImageSequence @@ -350,7 +350,7 @@ def _load_file(filename, unpack): ################################################################# multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): - read = vtk.get("XMLMultiBlockDataReader")() + read = vtk.new("XMLMultiBlockDataReader") read.SetFileName(filename) read.Update() mb = read.GetOutput() @@ -395,7 +395,7 @@ def _load_file(filename, unpack): # output can be: # PolyData, StructuredGrid, StructuredPoints, UnstructuredGrid, RectilinearGrid - reader = vtk.get("vtkDataSetReader")() + reader = vtk.new("DataSetReader") reader.ReadAllScalarsOn() reader.ReadAllVectorsOn() reader.ReadAllTensorsOn() @@ -404,33 +404,33 @@ def _load_file(filename, unpack): reader.ReadAllColorScalarsOn() elif fl.endswith(".ply"): - reader = vtk.get("vtkPLYReader")() + reader = vtk.new("PLYReader") elif fl.endswith(".obj"): - reader = vtk.get("vtkOBJReader")() + reader = vtk.new("OBJReader") elif fl.endswith(".stl"): - reader = vtk.get("STLReader")() + reader = vtk.new("STLReader") elif fl.endswith(".byu") or fl.endswith(".g"): - reader = vtk.get("BYUReader")() + reader = vtk.new("BYUReader") elif fl.endswith(".foam"): # OpenFoam - reader = vtk.get("OpenFOAMReader")() + reader = vtk.new("OpenFOAMReader") elif fl.endswith(".pvd"): - reader = vtk.get("XMLGenericDataObjectReader")() + reader = vtk.new("XMLGenericDataObjectReader") elif fl.endswith(".vtp"): - reader = vtk.get("XMLPolyDataReader")() + reader = vtk.new("XMLPolyDataReader") elif fl.endswith(".vts"): - reader = vtk.get("XMLStructuredGridReader")() + reader = vtk.new("XMLStructuredGridReader") elif fl.endswith(".vtu"): - reader = vtk.get("XMLUnstructuredGridReader")() + reader = vtk.new("XMLUnstructuredGridReader") elif fl.endswith(".vtr"): - reader = vtk.get("XMLRectilinearGridReader")() + reader = vtk.new("XMLRectilinearGridReader") elif fl.endswith(".pvtr"): - reader = vtk.get("XMLPRectilinearGridReader")() + reader = vtk.new("XMLPRectilinearGridReader") elif fl.endswith("pvtu"): - reader = vtk.get("XMLPUnstructuredGridReader")() + reader = vtk.new("XMLPUnstructuredGridReader") elif fl.endswith(".txt") or fl.endswith(".xyz"): - reader = vtk.get("ParticleReader")() # (format is x, y, z, scalar) + reader = vtk.new("ParticleReader") # (format is x, y, z, scalar) elif fl.endswith(".facet"): - reader = vtk.get("FacetReader")() + reader = vtk.new("FacetReader") else: return None @@ -545,11 +545,11 @@ def loadStructuredPoints(filename, as_points=True): If `as_points` is True, return a `Points` object instead of `vtkStructuredPoints`. """ - reader = vtk.get("StructuredPointsReader")() + reader = vtk.new("StructuredPointsReader") reader.SetFileName(filename) reader.Update() if as_points: - v2p = vtk.get("ImageToPoints")() + v2p = vtk.new("ImageToPoints") v2p.SetInputData(reader.GetOutput()) v2p.Update() pts = Points(v2p.GetOutput()) @@ -560,9 +560,9 @@ def loadStructuredPoints(filename, as_points=True): def loadStructuredGrid(filename): """Load and return a `vtkStructuredGrid` object from file.""" if filename.endswith(".vts"): - reader = vtk.get("XMLStructuredGridReader")() + reader = vtk.new("XMLStructuredGridReader") else: - reader = vtk.get("StructuredGridReader")() + reader = vtk.new("StructuredGridReader") reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -571,9 +571,9 @@ def loadStructuredGrid(filename): def loadUnStructuredGrid(filename): """Load and return a `vtkunStructuredGrid` object from file.""" if filename.endswith(".vtu"): - reader = vtk.get("XMLUnstructuredGridReader")() + reader = vtk.new("XMLUnstructuredGridReader") else: - reader = vtk.get("UnstructuredGridReader")() + reader = vtk.new("UnstructuredGridReader") reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -582,9 +582,9 @@ def loadUnStructuredGrid(filename): def loadRectilinearGrid(filename): """Load and return a `vtkRectilinearGrid` object from file.""" if filename.endswith(".vtr"): - reader = vtk.get("XMLRectilinearGridReader")() + reader = vtk.new("XMLRectilinearGridReader") else: - reader = vtk.get("RectilinearGridReader")() + reader = vtk.new("RectilinearGridReader") reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -592,7 +592,7 @@ def loadRectilinearGrid(filename): def loadXMLData(filename): """Read any type of vtk data object encoded in XML format.""" - reader = vtk.get("XMLGenericDataObjectReader")() + reader = vtk.new("XMLGenericDataObjectReader") reader.SetFileName(filename) reader.Update() return reader.GetOutput() @@ -608,7 +608,7 @@ def load3DS(filename): renWin = vtk.vtkRenderWindow() renWin.AddRenderer(renderer) - importer = vtk.get("3DSImporter")() + importer = vtk.new("3DSImporter") importer.SetFileName(filename) importer.ComputeNormalsOn() importer.SetRenderWindow(renWin) @@ -673,7 +673,7 @@ def loadOFF(filename): def loadGeoJSON(filename): """Load GeoJSON files.""" - jr = vtk.get("GeoJSONReader")() + jr = vtk.new("GeoJSONReader") jr.SetFileName(filename) jr.Update() return Mesh(jr.GetOutput()) @@ -698,7 +698,7 @@ def loadDolfin(filename, exterior=False): else: polyb = utils.buildPolyData(bm.coordinates(), bm.cells(), tetras=True) polym = utils.buildPolyData(m.coordinates(), m.cells(), tetras=True) - app = vtk.get("AppendPolyData")() + app = vtk.new("AppendPolyData") app.AddInputData(polym) app.AddInputData(polyb) app.Update() @@ -1195,24 +1195,24 @@ def _buildmesh(d): def loadImageData(filename): """Read and return a `vtkImageData` object from file.""" if ".tif" in filename.lower(): - reader = vtk.get("TIFFReader")() + reader = vtk.new("TIFFReader") # print("GetOrientationType ", reader.GetOrientationType()) reader.SetOrientationType(settings.tiff_orientation_type) elif ".slc" in filename.lower(): - reader = vtk.get("SLCReader")() + reader = vtk.new("SLCReader") if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad SLC file {filename}") return None elif ".vti" in filename.lower(): - reader = vtk.get("XMLImageDataReader")() + reader = vtk.new("XMLImageDataReader") elif ".mhd" in filename.lower(): - reader = vtk.get("MetaImageReader")() + reader = vtk.new("MetaImageReader") elif ".dem" in filename.lower(): - reader = vtk.get("DEMReader")() + reader = vtk.new("DEMReader") elif ".nii" in filename.lower(): - reader = vtk.get("NIFTIImageReader")() + reader = vtk.new("NIFTIImageReader") elif ".nrrd" in filename.lower(): - reader = vtk.get("NrrdReader")() + reader = vtk.new("NrrdReader") if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad NRRD file {filename}") return None @@ -1243,9 +1243,9 @@ def write(objct, fileoutput, binary=True): fr = fileoutput.lower() if fr.endswith(".vtk"): - writer = vtk.get("DataSetWriter")() + writer = vtk.new("DataSetWriter") elif fr.endswith(".ply"): - writer = vtk.get("PLYWriter")() + writer = vtk.new("PLYWriter") writer.AddComment("PLY file generated by vedo") lut = objct.mapper.GetLookupTable() if lut: @@ -1256,41 +1256,41 @@ def write(objct, fileoutput, binary=True): writer.SetArrayName(pscal.GetName()) writer.SetLookupTable(lut) elif fr.endswith(".stl"): - writer = vtk.get("STLWriter")() + writer = vtk.new("STLWriter") elif fr.endswith(".vtp"): - writer = vtk.get("XMLPolyDataWriter")() + writer = vtk.new("XMLPolyDataWriter") elif fr.endswith(".vtu"): - writer = vtk.get("XMLUnstructuredGridWriter")() + writer = vtk.new("XMLUnstructuredGridWriter") elif fr.endswith(".vtm"): - g = vtk.get("MultiBlockDataGroupFilter")() + g = vtk.new("MultiBlockDataGroupFilter") for ob in objct: if isinstance(ob, (Points, Volume)): # picks transformation g.AddInputData(ob) g.Update() mb = g.GetOutputDataObject(0) - wri = vtk.get("XMLMultiBlockDataWriter")() + wri = vtk.new("XMLMultiBlockDataWriter") wri.SetInputData(mb) wri.SetFileName(fileoutput) wri.Write() return mb elif fr.endswith(".xyz"): - writer = vtk.get("SimplePointsWriter")() + writer = vtk.new("SimplePointsWriter") elif fr.endswith(".facet"): - writer = vtk.get("FacetWriter")() + writer = vtk.new("FacetWriter") elif fr.endswith(".vti"): - writer = vtk.get("XMLImageDataWriter")() + writer = vtk.new("XMLImageDataWriter") elif fr.endswith(".mhd"): - writer = vtk.get("MetaImageWriter")() + writer = vtk.new("MetaImageWriter") elif fr.endswith(".nii"): - writer = vtk.get("NIFTIImageWriter")() + writer = vtk.new("NIFTIImageWriter") elif fr.endswith(".png"): - writer = vtk.get("PNGWriter")() + writer = vtk.new("PNGWriter") elif fr.endswith(".jpg"): - writer = vtk.get("JPEGWriter")() + writer = vtk.new("JPEGWriter") elif fr.endswith(".bmp"): - writer = vtk.get("BMPWriter")() + writer = vtk.new("BMPWriter") elif fr.endswith(".tif") or fr.endswith(".tiff"): - writer = vtk.get("TIFFWriter")() + writer = vtk.new("TIFFWriter") writer.SetFileDimensionality(len(obj.GetDimensions())) elif fr.endswith(".npy") or fr.endswith(".npz"): if utils.is_sequence(objct): @@ -1535,7 +1535,7 @@ def export_window(fileoutput, binary=False): vedo.plotter_instance.render() - exporter = vtk.get("X3DExporter")() + exporter = vtk.new("X3DExporter") exporter.SetBinary(binary) exporter.FastestOff() exporter.SetInput(vedo.plotter_instance.window) @@ -1690,7 +1690,7 @@ def import_window(fileinput, mtl_file=None, texture_path=None): renderer = vtk.vtkRenderer() window.AddRenderer(renderer) - importer = vtk.get("OBJImporter")() + importer = vtk.new("OBJImporter") importer.SetFileName(fileinput) if mtl_file is not False: if mtl_file is None: @@ -1747,7 +1747,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): filename = str(filename) if filename.endswith(".pdf"): - writer = vtk.get("GL2PSExporter")() + writer = vtk.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1758,7 +1758,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## elif filename.endswith(".svg"): - writer = vtk.get("GL2PSExporter")() + writer = vtk.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1769,7 +1769,7 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## elif filename.endswith(".eps"): - writer = vtk.get("GL2PSExporter")() + writer = vtk.new("GL2PSExporter") writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() @@ -1780,11 +1780,11 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return vedo.plotter_instance ########## if settings.screeshot_large_image: - w2if = vtk.get("RenderLargeImage")() + w2if = vtk.new("RenderLargeImage") w2if.SetInput(vedo.plotter_instance.renderer) w2if.SetMagnification(scale) else: - w2if = vtk.get("WindowToImageFilter")() + w2if = vtk.new("WindowToImageFilter") w2if.SetInput(vedo.plotter_instance.window) if hasattr(w2if, "SetScale"): w2if.SetScale(int(scale), int(scale)) @@ -1803,17 +1803,17 @@ def screenshot(filename="screenshot.png", scale=1, asarray=False): return npdata ########################### if filename.lower().endswith(".png"): - writer = vtk.get("PNGWriter")() + writer = vtk.new("PNGWriter") writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() elif filename.lower().endswith(".jpg") or filename.lower().endswith(".jpeg"): - writer = vtk.get("JPEGWriter")() + writer = vtk.new("JPEGWriter") writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() else: # add .png - writer = vtk.get("PNGWriter")() + writer = vtk.new("PNGWriter") writer.SetFileName(filename + ".png") writer.SetInputData(w2if.GetOutput()) writer.Write() From c0b1e8757d631c54d24127753503af7895fcf88d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:40:59 +0100 Subject: [PATCH 195/251] vtkclasses get() -> new() vedo/image.py --- vedo/image.py | 112 +++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/vedo/image.py b/vedo/image.py index 10a4d274..b9a2247a 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -30,13 +30,13 @@ def _get_img(obj, flip=False, translate=()): fname = obj.lower() if fname.endswith(".png"): - picr = vtk.get("PNGReader")() + picr = vtk.new("PNGReader") elif fname.endswith(".jpg") or fname.endswith(".jpeg"): - picr = vtk.get("JPEGReader")() + picr = vtk.new("JPEGReader") elif fname.endswith(".bmp"): - picr = vtk.get("BMPReader")() + picr = vtk.new("BMPReader") elif fname.endswith(".tif") or fname.endswith(".tiff"): - picr = vtk.get("TIFFReader")() + picr = vtk.new("TIFFReader") picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand image format", obj, c="r") @@ -49,7 +49,7 @@ def _get_img(obj, flip=False, translate=()): obj = np.asarray(obj) if obj.ndim == 3: # has shape (nx,ny, ncolor_alpha_chan) - iac = vtk.get("ImageAppendComponents")() + iac = vtk.new("ImageAppendComponents") nchan = obj.shape[2] # get number of channels in inputimage (L/LA/RGB/RGBA) for i in range(nchan): if flip: @@ -80,7 +80,7 @@ def _get_img(obj, flip=False, translate=()): img.GetPointData().SetActiveScalars("RGBA") if len(translate) > 0: - translate_extent = vtk.get("ImageTranslateExtent")() + translate_extent = vtk.new("ImageTranslateExtent") translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() @@ -128,7 +128,7 @@ def _set_justification(img, pos): if len(translate) > 0: translate = np.array(translate).astype(int) - translate_extent = vtk.get("ImageTranslateExtent")() + translate_extent = vtk.new("ImageTranslateExtent") translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() @@ -202,7 +202,7 @@ def __init__(self, obj=None, channels=3): nchans = len(channels) n = img.GetPointData().GetScalars().GetNumberOfComponents() if nchans and n > nchans: - pec = vtk.get("ImageExtractComponents")() + pec = vtk.new("ImageExtractComponents") pec.SetInputData(img) if nchans == 4: pec.SetComponents(channels[0], channels[1], channels[2], channels[3]) @@ -367,7 +367,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): if scale != 1: newsize = np.array(self.dataset.GetDimensions()[:2]) * scale newsize = newsize.astype(int) - rsz = vtk.get("ImageResize")() + rsz = vtk.new("ImageResize") rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize[0], newsize[1], 1) @@ -379,7 +379,7 @@ def clone2d(self, pos=(0, 0), scale=1, justify=""): else: pic.dataset, pos = _set_justification(pic.dataset, pos) - pic.mapper = vtk.get("ImageMapper")() + pic.mapper = vtk.new("ImageMapper") pic.SetMapper(pic.mapper) pic.mapper.SetInputData(pic.dataset) pic.mapper.SetColorWindow(255) @@ -421,7 +421,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): pixels : (bool) units are pixels """ - extractVOI = vtk.get("ExtractVOI")() + extractVOI = vtk.new("ExtractVOI") extractVOI.SetInputData(self.dataset) extractVOI.IncludeBoundaryOn() @@ -455,7 +455,7 @@ def pad(self, pixels=10, value=255): intensity value (gray-scale color) of the padding """ x0, x1, y0, y1, _z0, _z1 = self.dataset.GetExtent() - pf = vtk.get("ImageConstantPad")() + pf = vtk.new("ImageConstantPad") pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(pixels): @@ -490,7 +490,7 @@ def tile(self, nx=4, ny=4, shift=(0, 0)): shift in x and y in pixels """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() - constant_pad = vtk.get("ImageMirrorPad")() + constant_pad = vtk.new("ImageMirrorPad") constant_pad.SetInputData(self.dataset) constant_pad.SetOutputWholeExtent( int(x0 + shift[0] + 0.5), @@ -536,7 +536,7 @@ def append(self, images, axis="z", preserve_extents=False): ``` ![](https://vedo.embl.es/images/feats/pict_append.png) """ - ima = vtk.get("ImageAppend")() + ima = vtk.new("ImageAppend") ima.SetInputData(self.dataset) if not utils.is_sequence(images): images = [images] @@ -577,7 +577,7 @@ def resize(self, newsize): newsize = [int(newsize[1] * ar + 0.5), newsize[1]] newsize = [newsize[0], newsize[1], old_dims[2]] - rsz = vtk.get("ImageResize")() + rsz = vtk.new("ImageResize") rsz.SetInputData(self.dataset) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize) @@ -592,7 +592,7 @@ def resize(self, newsize): def mirror(self, axis="x"): """Mirror image along x or y axis. Same as `flip()`.""" - ff = vtk.get("ImageFlip")() + ff = vtk.new("ImageFlip") ff.SetInputData(self.dataset) if axis.lower() == "x": ff.SetFilteredAxis(0) @@ -612,7 +612,7 @@ def flip(self, axis="y"): def select(self, component): """Select one single component of the rgb image.""" - ec = vtk.get("ImageExtractComponents")() + ec = vtk.new("ImageExtractComponents") ec.SetInputData(self.dataset) ec.SetComponents(component) ec.Update() @@ -626,7 +626,7 @@ def bw(self): """Make it black and white using luminance calibration.""" n = self.dataset.GetPointData().GetNumberOfComponents() if n == 4: - ecr = vtk.get("ImageExtractComponents")() + ecr = vtk.new("ImageExtractComponents") ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() @@ -634,7 +634,7 @@ def bw(self): else: img = self.dataset - ecr = vtk.get("ImageLuminance")() + ecr = vtk.new("ImageLuminance") ecr.SetInputData(img) ecr.Update() self._update(ecr.GetOutput()) @@ -651,7 +651,7 @@ def smooth(self, sigma=3, radius=None): radius : (float) how far out the gaussian kernel will go before being clamped to zero """ - gsf = vtk.get("ImageGaussianSmooth")() + gsf = vtk.new("ImageGaussianSmooth") gsf.SetDimensionality(2) gsf.SetInputData(self.dataset) if radius is not None: @@ -680,7 +680,7 @@ def median(self): It then computes the median of these two values plus the center pixel. This result of this second median is the output pixel value. """ - medf = vtk.get("ImageHybridMedian2D")() + medf = vtk.new("ImageHybridMedian2D") medf.SetInputData(self.dataset) medf.Update() self._update(medf.GetOutput()) @@ -702,17 +702,17 @@ def enhance(self): img = self.dataset scalarRange = img.GetPointData().GetScalars().GetRange() - cast = vtk.get("ImageCast")() + cast = vtk.new("ImageCast") cast.SetInputData(img) cast.SetOutputScalarTypeToDouble() cast.Update() - laplacian = vtk.get("ImageLaplacian")() + laplacian = vtk.new("ImageLaplacian") laplacian.SetInputData(cast.GetOutput()) laplacian.SetDimensionality(2) laplacian.Update() - subtr = vtk.get("ImageMathematics")() + subtr = vtk.new("ImageMathematics") subtr.SetInputData(0, cast.GetOutput()) subtr.SetInputData(1, laplacian.GetOutput()) subtr.SetOperationToSubtract() @@ -720,7 +720,7 @@ def enhance(self): color_window = scalarRange[1] - scalarRange[0] color_level = color_window / 2 - original_color = vtk.get("ImageMapToWindowLevelColors")() + original_color = vtk.new("ImageMapToWindowLevelColors") original_color.SetWindow(color_window) original_color.SetLevel(color_level) original_color.SetInputData(subtr.GetOutput()) @@ -743,23 +743,23 @@ def fft(self, mode="magnitude", logscale=12, center=True): shift constant zero-frequency to the center of the image for display. (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ - ffti = vtk.get("ImageFFT")() + ffti = vtk.new("ImageFFT") ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: - mag = vtk.get("ImageMagnitude")() + mag = vtk.new("ImageMagnitude") mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: - erf = vtk.get("ImageExtractComponents")() + erf = vtk.new("ImageExtractComponents") erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: - eimf = vtk.get("ImageExtractComponents")() + eimf = vtk.new("ImageExtractComponents") eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() @@ -771,14 +771,14 @@ def fft(self, mode="magnitude", logscale=12, center=True): raise RuntimeError() if center: - center = vtk.get("ImageFourierCenter")() + center = vtk.new("ImageFourierCenter") center.SetInputData(out) center.Update() out = center.GetOutput() if "complex" not in mode: if logscale: - ils = vtk.get("ImageLogarithmicScale")() + ils = vtk.new("ImageLogarithmicScale") ils.SetInputData(out) ils.SetConstant(logscale) ils.Update() @@ -791,23 +791,23 @@ def fft(self, mode="magnitude", logscale=12, center=True): def rfft(self, mode="magnitude"): """Reverse Fast Fourier transform of a image.""" - ffti = vtk.get("ImageRFFT")() + ffti = vtk.new("ImageRFFT") ffti.SetInputData(self.dataset) ffti.Update() if "mag" in mode: - mag = vtk.get("ImageMagnitude")() + mag = vtk.new("ImageMagnitude") mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: - erf = vtk.get("ImageExtractComponents")() + erf = vtk.new("ImageExtractComponents") erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: - eimf = vtk.get("ImageExtractComponents")() + eimf = vtk.new("ImageExtractComponents") eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() @@ -842,13 +842,13 @@ def filterpass(self, lowcutoff=None, highcutoff=None, order=3): order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass - fft = vtk.get("ImageFFT")() + fft = vtk.new("ImageFFT") fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if highcutoff: - blp = vtk.get("ImageButterworthLowPass")() + blp = vtk.new("ImageButterworthLowPass") blp.SetInputData(out) blp.SetCutOff(highcutoff) blp.SetOrder(order) @@ -856,23 +856,23 @@ def filterpass(self, lowcutoff=None, highcutoff=None, order=3): out = blp.GetOutput() if lowcutoff: - bhp = vtk.get("ImageButterworthHighPass")() + bhp = vtk.new("ImageButterworthHighPass") bhp.SetInputData(out) bhp.SetCutOff(lowcutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() - rfft = vtk.get("ImageRFFT")() + rfft = vtk.new("ImageRFFT") rfft.SetInputData(out) rfft.Update() - ecomp = vtk.get("ImageExtractComponents")() + ecomp = vtk.new("ImageExtractComponents") ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() - caster = vtk.get("ImageCast")() + caster = vtk.new("ImageCast") caster.SetOutputScalarTypeToUnsignedChar() caster.SetInputData(ecomp.GetOutput()) caster.Update() @@ -885,7 +885,7 @@ def blend(self, pic, alpha1=0.5, alpha2=0.5): Take L, LA, RGB, or RGBA images as input and blends them according to the alpha values and/or the opacity setting for each input. """ - blf = vtk.get("ImageBlend")() + blf = vtk.new("ImageBlend") blf.AddInputData(self.dataset) blf.AddInputData(pic.dataset) blf.SetOpacity(0, alpha1) @@ -963,7 +963,7 @@ def warp( # ignore source and target pass - reslice = vtk.get("ImageReslice")() + reslice = vtk.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) reslice.SetResliceTransform(transform) @@ -1046,10 +1046,10 @@ def threshold(self, value=None, flip=False): Returns: A polygonal mesh. """ - mgf = vtk.get("ImageMagnitude")() + mgf = vtk.new("ImageMagnitude") mgf.SetInputData(self.dataset) mgf.Update() - msq = vtk.get("MarchingSquares")() + msq = vtk.new("MarchingSquares") msq.SetInputData(mgf.GetOutput()) if value is None: r0, r1 = self.dataset.GetScalarRange() @@ -1057,7 +1057,7 @@ def threshold(self, value=None, flip=False): msq.SetValue(0, value) msq.Update() if flip: - rs = vtk.get("ReverseSense")() + rs = vtk.new("ReverseSense") rs.SetInputData(msq.GetOutput()) rs.ReverseCellsOn() rs.ReverseNormalsOff() @@ -1065,7 +1065,7 @@ def threshold(self, value=None, flip=False): output = rs.GetOutput() else: output = msq.GetOutput() - ctr = vtk.get("ContourTriangulator")() + ctr = vtk.new("ContourTriangulator") ctr.SetInputData(output) ctr.Update() out = vedo.Mesh(ctr.GetOutput(), c="k").bc("t").lighting("off") @@ -1079,11 +1079,11 @@ def cmap(self, name, vmin=None, vmax=None): """Colorize a image with a colormap representing pixel intensity""" n = self.dataset.GetPointData().GetNumberOfComponents() if n > 1: - ecr = vtk.get("ImageExtractComponents")() + ecr = vtk.new("ImageExtractComponents") ecr.SetInputData(self.dataset) ecr.SetComponents(0, 1, 2) ecr.Update() - ilum = vtk.get("ImageMagnitude")() + ilum = vtk.new("ImageMagnitude") ilum.SetInputData(self.dataset) ilum.Update() img = ilum.GetOutput() @@ -1105,7 +1105,7 @@ def cmap(self, name, vmin=None, vmax=None): lut.SetTableValue(i, *c) lut.Build() - imap = vtk.get("ImageMapToColors")() + imap = vtk.new("ImageMapToColors") imap.SetLookupTable(lut) imap.SetInputData(img) imap.Update() @@ -1141,7 +1141,7 @@ def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): transform.Scale(1 / scale, 1 / scale, 1) transform.Translate(-pc[0], -pc[1], -pc[2]) - reslice = vtk.get("ImageReslice")() + reslice = vtk.new("ImageReslice") reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) @@ -1234,7 +1234,7 @@ def add_rectangle(self, xspan, yspan, c="green5", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.get("ImageCanvasSource2D")() + canvas_source = vtk.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) @@ -1275,7 +1275,7 @@ def add_line(self, p1, p2, lw=2, c="k2", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.get("ImageCanvasSource2D")() + canvas_source = vtk.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) @@ -1320,7 +1320,7 @@ def add_triangle(self, p1, p2, p3, c="red3", alpha=1): nchan = self.channels() narrayA = self.tonumpy() - canvas_source = vtk.get("ImageCanvasSource2D")() + canvas_source = vtk.new("ImageCanvasSource2D") canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) @@ -1383,7 +1383,7 @@ def add_text( tp.SetFrameColor(bgcol) tp.FrameOn() - tr = vtk.get("TextRenderer")() + tr = vtk.new("TextRenderer") # GetConstrainedFontSize (const vtkUnicodeString &str, # vtkTextProperty(*tprop, int targetWidth, int targetHeight, int dpi) fs = tr.GetConstrainedFontSize(txt, tp, width, height, dpi) @@ -1395,7 +1395,7 @@ def add_text( # RenderString (vtkTextProperty *tprop, const vtkStdString &str, # vtkImageData *data, int textDims[2], int dpi, int backend=Default) - blf = vtk.get("ImageBlend")() + blf = vtk.new("ImageBlend") blf.AddInputData(self.dataset) blf.AddInputData(img) blf.SetOpacity(0, 1) From a21f6a48f379a173b1f9f66ca8fa248a624847fb Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:51:52 +0100 Subject: [PATCH 196/251] vtkclasses get() -> new() vedo/plotter.py --- vedo/interactor_modes.py | 9 ++-- vedo/plotter.py | 114 +++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 62 deletions(-) diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index 5223fc49..b4c19df2 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -10,7 +10,7 @@ __doc__ = """Submodule to customize interaction modes.""" -class MousePan(vtk.get("InteractorStyleUser")): +class MousePan(vtk.get_class("InteractorStyleUser")): """ Interaction mode to pan the scene by dragging the mouse. @@ -157,7 +157,7 @@ def __init__(self): ############################################### -class BlenderStyle(vtk.get("InteractorStyleUser")): +class BlenderStyle(vtk.get_class("InteractorStyleUser")): """ Create an interaction style using the Blender default key-bindings. @@ -1356,9 +1356,8 @@ def DrawLine(self, x1, x2, y1, y2): if self.callback_measure: self.callback_measure(meters) - # # # can we add something to the window here? - # freeType = vtk.get("FreeTypeTools.GetInstance() + # freeType = vtk.FreeTypeTools.GetInstance() # textProperty = vtk.vtkTextProperty() # textProperty.SetJustificationToLeft() # textProperty.SetFontSize(24) @@ -1381,7 +1380,7 @@ def UpdateMiddleMouseButtonLockActor(self): if self.middle_mouse_lock_actor is None: # create the actor # Create a text on the top-rightcenter - textMapper = vtk.get("TextMapper")() + textMapper = vtk.new("TextMapper") textMapper.SetInput("Middle mouse lock [m or space] active") textProp = textMapper.GetTextProperty() textProp.SetFontSize(12) diff --git a/vedo/plotter.py b/vedo/plotter.py index d1045549..73a74cd9 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -706,7 +706,7 @@ def __init__( self.interactor = self.window.GetInteractor() for r in self.renderers: self.window.AddRenderer(r) - self.wx_widget.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera()")) + self.wx_widget.SetInteractorStyle(vtk.new("InteractorStyleTrackballCamera")) ######################## return ################ ######################## @@ -749,7 +749,7 @@ def __init__( self.interactor = vtk.vtkRenderWindowInteractor() self.interactor.SetRenderWindow(self.window) - vsty = vtk.get("InteractorStyleTrackballCamera")() + vsty = vtk.new("InteractorStyleTrackballCamera") self.interactor.SetInteractorStyle(vsty) if settings.enable_default_keyboard_callbacks: @@ -1299,7 +1299,7 @@ def move_camera(self, cameras, t=0, times=(), smooth=True, output_times=()): assert len(times) == nc - cin = vtk.get("CameraInterpolator")() + cin = vtk.new("CameraInterpolator") # cin.SetInterpolationTypeToLinear() # bugged? if nc > 2 and smooth: @@ -1387,7 +1387,7 @@ def record(self, filename=".vedo_recorded_events.log"): if not self.interactor: vedo.logger.warning("Cannot record events, no interactor defined.") return self - erec = vtk.get("InteractorEventRecorder")() + erec = vtk.new("InteractorEventRecorder") erec.SetInteractor(self.interactor) erec.SetFileName(filename) erec.SetKeyPressActivationValue("R") @@ -1418,7 +1418,7 @@ def play(self, events=".vedo_recorded_events.log", repeats=0): vedo.logger.warning("Cannot play events, no interactor defined.") return self - erec = vtk.get("InteractorEventRecorder")() + erec = vtk.new("InteractorEventRecorder") erec.SetInteractor(self.interactor) if events.endswith(".log"): @@ -1947,13 +1947,13 @@ def add_hint( def add_shadows(self): """Add shadows at the current renderer.""" if self.renderer: - shadows = vtk.get("ShadowMapPass")() - seq = vtk.get("SequencePass")() - passes = vtk.get("RenderPassCollection")() + shadows = vtk.new("ShadowMapPass") + seq = vtk.new("SequencePass") + passes = vtk.new("RenderPassCollection") passes.AddItem(shadows.GetShadowMapBakerPass()) passes.AddItem(shadows) seq.SetPasses(passes) - camerapass = vtk.get("CameraPass")() + camerapass = vtk.new("CameraPass") camerapass.SetDelegatePass(seq) self.renderer.SetPass(camerapass) return self @@ -1981,39 +1981,39 @@ def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): ![](https://vedo.embl.es/images/basic/ssao.jpg) """ - lights = vtk.get("LightsPass")() + lights = vtk.new("LightsPass") - opaque = vtk.get("OpaquePass")() + opaque = vtk.new("OpaquePass") - ssaoCam = vtk.get("CameraPass")() + ssaoCam = vtk.new("CameraPass") ssaoCam.SetDelegatePass(opaque) - ssao = vtk.get("SSAOPass")() + ssao = vtk.new("SSAOPass") ssao.SetRadius(radius) ssao.SetBias(bias) ssao.SetBlur(blur) ssao.SetKernelSize(samples) ssao.SetDelegatePass(ssaoCam) - translucent = vtk.get("TranslucentPass")() + translucent = vtk.new("TranslucentPass") - volpass = vtk.get("VolumetricPass")() - ddp = vtk.get("DualDepthPeelingPass")() + volpass = vtk.new("VolumetricPass") + ddp = vtk.new("DualDepthPeelingPass") ddp.SetTranslucentPass(translucent) ddp.SetVolumetricPass(volpass) - over = vtk.get("OverlayPass")() + over = vtk.new("OverlayPass") - collection = vtk.get("RenderPassCollection")() + collection = vtk.new("RenderPassCollection") collection.AddItem(lights) collection.AddItem(ssao) collection.AddItem(ddp) collection.AddItem(over) - sequence = vtk.get("SequencePass")() + sequence = vtk.new("SequencePass") sequence.SetPasses(collection) - cam = vtk.get("CameraPass")() + cam = vtk.new("CameraPass") cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) @@ -2021,25 +2021,25 @@ def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): def add_depth_of_field(self, autofocus=True): """Add a depth of field effect in the scene.""" - lights = vtk.get("LightsPass")() + lights = vtk.new("LightsPass") - opaque = vtk.get("OpaquePass")() + opaque = vtk.new("OpaquePass") - dofCam = vtk.get("CameraPass")() + dofCam = vtk.new("CameraPass") dofCam.SetDelegatePass(opaque) - dof = vtk.get("DepthOfFieldPass")() + dof = vtk.new("DepthOfFieldPass") dof.SetAutomaticFocalDistance(autofocus) dof.SetDelegatePass(dofCam) - collection = vtk.get("RenderPassCollection")() + collection = vtk.new("RenderPassCollection") collection.AddItem(lights) collection.AddItem(dof) - sequence = vtk.get("SequencePass")() + sequence = vtk.new("SequencePass") sequence.SetPasses(collection) - cam = vtk.get("CameraPass")() + cam = vtk.new("CameraPass") cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) @@ -2049,7 +2049,7 @@ def _add_skybox(self, hdrfile): # many hdr files are at https://polyhaven.com/all if utils.vtk_version_at_least(9): - reader = vtk.get("HDRReader")() + reader = vtk.new("HDRReader") # Check the image can be read. if not reader.CanReadFile(hdrfile): vedo.logger.error(f"Cannot read HDR file {hdrfile}") @@ -2062,7 +2062,7 @@ def _add_skybox(self, hdrfile): texture.SetInputData(reader.GetOutput()) # Convert to a cube map - tcm = vtk.get("EquirectangularToCubeMapTexture")() + tcm = vtk.new("EquirectangularToCubeMapTexture") tcm.SetInputTexture(texture) # Enable mipmapping to handle HDR image tcm.MipmapOn() @@ -2070,7 +2070,7 @@ def _add_skybox(self, hdrfile): self.renderer.SetEnvironmentTexture(tcm) self.renderer.UseImageBasedLightingOn() - self.skybox = vtk.get("Skybox")() + self.skybox = vtk.new("Skybox") self.skybox.SetTexture(tcm) self.renderer.AddActor(self.skybox) @@ -2308,19 +2308,19 @@ def add_scale_indicator( vedo.logger.warning("add_scale_indicator called with use_parallel_projection OFF. Skip.") return None - rlabel = vtk.get("VectorText")() + rlabel = vtk.new("VectorText") rlabel.SetText("scale") - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputConnection(rlabel.GetOutputPort()) t = vtk.vtkTransform() t.Scale(s * wsy / wsx, s, 1) tf.SetTransform(t) - app = vtk.get("AppendPolyData")() + app = vtk.new("AppendPolyData") app.AddInputConnection(tf.GetOutputPort()) app.AddInputData(pd) - mapper = vtk.get("PolyDataMapper2D")() + mapper = vtk.new("PolyDataMapper2D") mapper.SetInputConnection(app.GetOutputPort()) cs = vtk.vtkCoordinate() cs.SetCoordinateSystem(1) @@ -2771,7 +2771,7 @@ def mode_select(objs): area_picker.AreaPick(pos1[0], pos1[1], pos2[0], pos2[1], ren) planes = area_picker.GetFrustum() - fru = vtk.get("FrustumSource")() + fru = vtk.new("FrustumSource") fru.SetPlanes(planes) fru.ShowLinesOff() fru.Update() @@ -2878,7 +2878,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(a, vtk.vtkImageData): scanned_acts.append(vedo.Volume(a).actor) - elif isinstance(a, vtk.get("MultiBlockDataSet")): + elif isinstance(a, vtk.get_class("MultiBlockDataSet")): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) if isinstance(b, vtk.vtkPolyData): @@ -3362,33 +3362,33 @@ def user_mode(self, mode): # see https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html if mode in (0, "TrackballCamera"): if self.qt_widget: - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleTrackballCamera")) elif mode in (1, "TrackballActor"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTrackballActor")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleTrackballActor")) elif mode in (2, "JoystickCamera"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleJoystickCamera")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleJoystickCamera")) elif mode in (3, "JoystickActor"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleJoystickActor")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleJoystickActor")) elif mode in (4, "Flight"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleFlight")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleFlight")) elif mode in (5, "RubberBand2D"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBand2D")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleRubberBand2D")) elif mode in (6, "RubberBand3D"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBand3D")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleRubberBand3D")) elif mode in (7, "RubberBandZoom"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleRubberBandZoom")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleRubberBandZoom")) elif mode in (8, "Terrain"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleTerrain")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleTerrain")) elif mode in (9, "Unicam"): - self.interactor.SetInteractorStyle(vtk.get("InteractorStyleUnicam")()) + self.interactor.SetInteractorStyle(vtk.new("InteractorStyleUnicam")) elif mode in (10, "Image", "image", "2d"): - astyle = vtk.get("InteractorStyleImage")() + astyle = vtk.new("InteractorStyleImage") astyle.SetInteractionModeToImage3D() self.interactor.SetInteractorStyle(astyle) else: vedo.logger.warning(f"Unknown interaction mode: {mode}") - elif isinstance(mode, vtk.get("InteractorStyleUser")): + elif isinstance(mode, vtk.get_class("InteractorStyleUser")): # set a custom interactor style mode.interactor = self.interactor mode.renderer = self.renderer @@ -3503,11 +3503,11 @@ def toimage(self, scale=1): set image magnification as an integer multiplicating factor """ if settings.screeshot_large_image: - w2if = vtk.get("RenderLargeImage")() + w2if = vtk.new("RenderLargeImage") w2if.SetInput(self.renderer) w2if.SetMagnification(scale) else: - w2if = vtk.get("WindowToImageFilter")() + w2if = vtk.new("WindowToImageFilter") w2if.SetInput(self.window) if hasattr(w2if, "SetScale"): w2if.SetScale(scale, scale) @@ -3530,7 +3530,7 @@ def export(self, filename="scene.npz", binary=False): def color_picker(self, xy, verbose=False): """Pick color of specific (x,y) pixel on the screen.""" - w2if = vtk.get("WindowToImageFilter")() + w2if = vtk.new("WindowToImageFilter") w2if.SetInput(self.window) w2if.ReadFrontBufferOff() w2if.Update() @@ -3819,15 +3819,15 @@ def _keypress(self, iren, event): elif key == "a": iren.ExitCallback() cur = iren.GetInteractorStyle() - if isinstance(cur, vtk.get("InteractorStyleTrackballCamera")): + if isinstance(cur, vtk.get_class("InteractorStyleTrackballCamera")): msg = "\nInteractor style changed to TrackballActor\n" msg += " you can now move and rotate individual meshes:\n" msg += " press X twice to save the repositioned mesh\n" msg += " press 'a' to go back to normal style" vedo.printc(msg) - iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballActor")()) + iren.SetInteractorStyle(vtk.new("InteractorStyleTrackballActor")) else: - iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) + iren.SetInteractorStyle(vtk.new("InteractorStyleTrackballCamera")) iren.Start() return @@ -3862,12 +3862,12 @@ def _keypress(self, iren, event): elif key == "j": iren.ExitCallback() cur = iren.GetInteractorStyle() - if isinstance(cur, vtk.get("InteractorStyleJoystickCamera")): - iren.SetInteractorStyle(vtk.get("InteractorStyleTrackballCamera")()) + if isinstance(cur, vtk.get_class("InteractorStyleJoystickCamera")): + iren.SetInteractorStyle(vtk.new("InteractorStyleTrackballCamera")) else: vedo.printc("\nInteractor style changed to Joystick,", end="") vedo.printc(" press j to go back to normal.") - iren.SetInteractorStyle(vtk.get("InteractorStyleJoystickCamera")()) + iren.SetInteractorStyle(vtk.new("InteractorStyleJoystickCamera")) iren.Start() return From 74492af6960f41da8f0a9da1e888a5f00fd9e0c5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 15:56:16 +0100 Subject: [PATCH 197/251] vtkclasses get() -> new() vedo/shapes.py --- vedo/pyplot.py | 44 +++++------ vedo/shapes.py | 199 ++++++++++++++++++++++++------------------------- 2 files changed, 121 insertions(+), 122 deletions(-) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index abbda004..7e65ae98 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -45,7 +45,7 @@ ########################################################################## def _to2d(obj, offset, scale): - tp = vtk.get("TransformPolyDataFilter")() + tp = vtk.new("TransformPolyDataFilter") transform = vtk.vtkTransform() transform.Scale(scale, scale, scale) transform.Translate(-offset[0], -offset[1], 0) @@ -55,7 +55,7 @@ def _to2d(obj, offset, scale): poly = tp.GetOutput() - mapper2d = vtk.get("PolyDataMapper2D")() + mapper2d = vtk.new("PolyDataMapper2D") mapper2d.SetInputData(poly) act2d = vtk.vtkActor2D() @@ -2713,7 +2713,7 @@ def _plot_fxy( if c is not None: texture = None # disable - ps = vtk.get("PlaneSource")() + ps = vtk.new("PlaneSource") ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() @@ -2748,7 +2748,7 @@ def _plot_fxy( for j in range(cellIds.GetNumberOfIds()): poly.DeleteCell(cellIds.GetId(j)) # flag cell poly.RemoveDeletedCells() - cl = vtk.get("CleanPolyData")() + cl = vtk.new("CleanPolyData") cl.SetInputData(poly) cl.Update() poly = cl.GetOutput() @@ -2779,13 +2779,13 @@ def _plot_fxy( acts = [mesh] if zlevels: - elevation = vtk.get("ElevationFilter")() + elevation = vtk.new("ElevationFilter") elevation.SetInputData(poly) bounds = poly.GetBounds() elevation.SetLowPoint(0, 0, bounds[4]) elevation.SetHighPoint(0, 0, bounds[5]) elevation.Update() - bcf = vtk.get("BandedPolyDataContourFilter")() + bcf = vtk.new("BandedPolyDataContourFilter") bcf.SetInputData(elevation.GetOutput()) bcf.SetScalarModeToValue() bcf.GenerateContourEdgesOn() @@ -2830,7 +2830,7 @@ def _plot_fz( bins=(75, 75), axes=True, ): - ps = vtk.get("PlaneSource")() + ps = vtk.new("PlaneSource") ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() @@ -3142,7 +3142,7 @@ def _histogram_hex_bin( r = 0.47 / n * 1.2 * dx for i in range(n + 3): for j in range(m + 2): - cyl = vtk.get("CylinderSource")() + cyl = vtk.new("CylinderSource") cyl.SetResolution(6) cyl.CappingOn() cyl.SetRadius(0.5) @@ -3161,7 +3161,7 @@ def _histogram_hex_bin( else: t.Translate(p[0], p[1], ne) t.RotateX(90) # put it along Z - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3910,7 +3910,7 @@ def CornerPlot(points, pos=1, s=0.2, title="", c="b", bg="k", lines=True, dots=T data = vtk.vtkDataObject() data.SetFieldData(field) - xyplot = vtk.get("XYPlotActor")() + xyplot = vtk.new("XYPlotActor") xyplot.AddDataObjectInput(data) xyplot.SetDataObjectXComponent(0, 0) xyplot.SetDataObjectYComponent(0, 1) @@ -4136,7 +4136,7 @@ def __init__(self, **kargs): self.edge_label_scale = None - self.mdg = vtk.get("MutableDirectedGraph")() + self.mdg = vtk.new("MutableDirectedGraph") n = kargs.pop("n", 0) for _ in range(n): @@ -4144,7 +4144,7 @@ def __init__(self, **kargs): self._c = kargs.pop("c", (0.3, 0.3, 0.3)) - self.gl = vtk.get("GraphLayout")() + self.gl = vtk.new("GraphLayout") self.font = kargs.pop("font", "") @@ -4156,11 +4156,11 @@ def __init__(self, **kargs): if "2d" in s: if "clustering" in s: - self.strategy = vtk.get("Clustering2DLayoutStrategy")() + self.strategy = vtk.new("Clustering2DLayoutStrategy") elif "fast" in s: - self.strategy = vtk.get("Fast2DLayoutStrategy")() + self.strategy = vtk.new("Fast2DLayoutStrategy") else: - self.strategy = vtk.get("Simple2DLayoutStrategy")() + self.strategy = vtk.new("Simple2DLayoutStrategy") self.rotX = 180 opt = kargs.pop("rest_distance", None) if opt is not None: @@ -4175,7 +4175,7 @@ def __init__(self, **kargs): elif "circ" in s: if "3d" in s: - self.strategy = vtk.get("Simple3DCirclesStrategy")() + self.strategy = vtk.new("Simple3DCirclesStrategy") self.strategy.SetDirection(0, 0, -1) self.strategy.SetAutoHeight(True) self.strategy.SetMethod(1) @@ -4189,11 +4189,11 @@ def __init__(self, **kargs): self.strategy.SetAutoHeight(False) self.strategy.SetHeight(opt) # float else: - self.strategy = vtk.get("CircularLayoutStrategy")() + self.strategy = vtk.new("CircularLayoutStrategy") self.zrange = kargs.pop("zrange", 0) elif "cone" in s: - self.strategy = vtk.get("ConeLayoutStrategy")() + self.strategy = vtk.new("ConeLayoutStrategy") self.rotX = 180 opt = kargs.pop("compactness", None) if opt is not None: @@ -4206,7 +4206,7 @@ def __init__(self, **kargs): self.strategy.SetSpacing(opt) elif "force" in s: - self.strategy = vtk.get("ForceDirectedLayoutStrategy")() + self.strategy = vtk.new("ForceDirectedLayoutStrategy") opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) @@ -4225,7 +4225,7 @@ def __init__(self, **kargs): self.strategy.SetRandomInitialPoints(opt) # bool elif "tree" in s: - self.strategy = vtk.get("SpanTreeLayoutStrategy")() + self.strategy = vtk.new("SpanTreeLayoutStrategy") self.rotX = 180 else: @@ -4288,7 +4288,7 @@ def build(self): self.gl.SetInputData(self.mdg) self.gl.Update() - gr2poly = vtk.get("GraphToPolyData")() + gr2poly = vtk.new("GraphToPolyData") gr2poly.EdgeGlyphOutputOn() gr2poly.SetEdgeGlyphPosition(self.edge_glyph_position) gr2poly.SetInputData(self.gl.GetOutput()) @@ -4317,7 +4317,7 @@ def build(self): # Use Glyph3D to repeat the glyph on all edges. arrows = None if self.arrow_scale: - arrow_source = vtk.get("GlyphSource2D")() + arrow_source = vtk.new("GlyphSource2D") arrow_source.SetGlyphTypeToEdgeArrow() arrow_source.SetScale(self.arrow_scale) arrow_source.Update() diff --git a/vedo/shapes.py b/vedo/shapes.py index 8919906f..17eb6a0f 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -333,18 +333,18 @@ def __init__( src = source.normalize() else: if "ellip" in source: - src = vtk.get("SphereSource")() + src = vtk.new("SphereSource") src.SetPhiResolution(24) src.SetThetaResolution(12) elif "cyl" in source: - src = vtk.get("CylinderSource")() + src = vtk.new("CylinderSource") src.SetResolution(48) src.CappingOn() elif source == "cube": - src = vtk.get("CubeSource")() + src = vtk.new("CubeSource") src.Update() - tg = vtk.get("TensorGlyph")() + tg = vtk.new("TensorGlyph") if isinstance(domain, vtk.vtkPolyData): tg.SetInputData(domain) else: @@ -373,7 +373,7 @@ def __init__( max_scale = scale * 10 tg.SetMaxScaleFactor(max_scale) tg.Update() - tgn = vtk.get("PolyDataNormals")() + tgn = vtk.new("PolyDataNormals") tgn.SetInputData(tg.GetOutput()) tgn.Update() super().__init__(tgn.GetOutput(), c, alpha) @@ -445,7 +445,7 @@ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): else: # or just 2 points to link - line_source = vtk.get("LineSource")() + line_source = vtk.new("LineSource") p0 = utils.make3d(p0) p1 = utils.make3d(p1) line_source.SetPoint1(p0) @@ -820,12 +820,12 @@ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1 break qs.append(qi) - polylns = vtk.get("AppendPolyData")() + polylns = vtk.new("AppendPolyData") for i, q1 in enumerate(qs): if not i % 2: continue q0 = qs[i - 1] - line_source = vtk.get("LineSource")() + line_source = vtk.new("LineSource") line_source.SetPoint1(q0) line_source.SetPoint2(q1) line_source.Update() @@ -930,7 +930,7 @@ def _getpts(pts, revd=False): poly = vtk.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) - vct = vtk.get("ContourTriangulator")() + vct = vtk.new("ContourTriangulator") vct.SetInputData(poly) vct.Update() @@ -974,7 +974,7 @@ def __init__( """ if utils.is_sequence(start_pts) and len(start_pts)>1 and isinstance(start_pts[0], Line): # passing a list of Line, see tests/issues/issue_950.py - polylns = vtk.get("AppendPolyData")() + polylns = vtk.new("AppendPolyData") for ln in start_pts: polylns.AddInputData(ln.dataset) polylns.Update() @@ -995,12 +995,12 @@ def __init__( if end_pts is not None: start_pts = np.stack((start_pts, end_pts), axis=1) - polylns = vtk.get("AppendPolyData")() + polylns = vtk.new("AppendPolyData") if not utils.is_ragged(start_pts): for twopts in start_pts: - line_source = vtk.get("LineSource")() + line_source = vtk.new("LineSource") line_source.SetResolution(res) if len(twopts[0]) == 2: line_source.SetPoint1(twopts[0][0], twopts[0][1], 0.0) @@ -1021,7 +1021,7 @@ def __init__( else: - polylns = vtk.get("AppendPolyData")() + polylns = vtk.new("AppendPolyData") for t in start_pts: t = utils.make3d(t) ppoints = vtk.vtkPoints() # Generate the polyline @@ -1170,7 +1170,7 @@ def __init__(self, points, points = utils.make3d(points).astype(float) - vtkKochanekSpline = vtk.get("KochanekSpline") + vtkKochanekSpline = vtk.get_class("KochanekSpline") xspline = vtkKochanekSpline() yspline = vtkKochanekSpline() zspline = vtkKochanekSpline() @@ -1233,7 +1233,7 @@ def __init__(self, points, closed=False, res=None): points = utils.make3d(points).astype(float) - vtkCardinalSpline = vtk.get("CardinalSpline") + vtkCardinalSpline = vtk.get_class("CardinalSpline") xspline = vtkCardinalSpline() yspline = vtkCardinalSpline() zspline = vtkCardinalSpline() @@ -1329,18 +1329,18 @@ def __init__(self, msh, ratio=1, on="cells", scale=1.0): poly = msh.clone().compute_normals().dataset if "cell" in on: - centers = vtk.get("CellCenters")() + centers = vtk.new("CellCenters") centers.SetInputData(poly) centers.Update() poly = centers.GetOutput() - mask_pts = vtk.get("MaskPoints")() + mask_pts = vtk.new("MaskPoints") mask_pts.SetInputData(poly) mask_pts.SetOnRatio(ratio) mask_pts.RandomModeOff() mask_pts.Update() - ln = vtk.get("LineSource")() + ln = vtk.new("LineSource") ln.SetPoint1(0, 0, 0) ln.SetPoint2(1, 0, 0) ln.Update() @@ -1400,24 +1400,24 @@ def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=Non if radius is None: radius = 2.5 * np.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) - locator = vtk.get("StaticPointLocator")() + locator = vtk.new("StaticPointLocator") locator.SetDataSet(mesh.dataset) locator.BuildLocator() if kernel == "gaussian": - kern = vtk.get("GaussianKernel")() + kern = vtk.new("GaussianKernel") kern.SetRadius(radius) elif kernel == "voronoi": - kern = vtk.get("VoronoiKernel")() + kern = vtk.new("VoronoiKernel") elif kernel == "linear": - kern = vtk.get("LinearKernel")() + kern = vtk.new("LinearKernel") kern.SetRadius(radius) else: - kern = vtk.get("ShepardKernel")() + kern = vtk.new("ShepardKernel") kern.SetPowerParameter(2) kern.SetRadius(radius) - interpolator = vtk.get("PointInterpolator")() + interpolator = vtk.new("PointInterpolator") interpolator.SetInputData(domain) interpolator.SetSourceData(mesh.dataset) interpolator.SetKernel(kern) @@ -1549,7 +1549,7 @@ def StreamLines( else: pts = probe.clean().vertices - src = vtk.get("ProgrammableSource")() + src = vtk.new("ProgrammableSource") def read_points(): output = src.GetPolyDataOutput() @@ -1561,7 +1561,7 @@ def read_points(): src.SetExecuteMethod(read_points) src.Update() - st = vtk.get("StreamTracer")() + st = vtk.new("StreamTracer") try: st.SetInputDataObject(grid.dataset) except AttributeError: @@ -1596,7 +1596,7 @@ def read_points(): output = st.GetOutput() if ribbons: - scalar_surface = vtk.get("RuledSurfaceFilter")() + scalar_surface = vtk.new("RuledSurfaceFilter") scalar_surface.SetInputConnection(st.GetOutputPort()) scalar_surface.SetOnRatio(int(ribbons)) scalar_surface.SetRuledModeToPointWalk() @@ -1618,7 +1618,7 @@ def read_points(): if tubes: vedo.logger.warning(f"in StreamLines unknown 'tubes' parameters: {tubes}") - stream_tube = vtk.get("TubeFilter")() + stream_tube = vtk.new("TubeFilter") stream_tube.SetNumberOfSides(res) stream_tube.SetRadius(radius) stream_tube.SetCapping(cap) @@ -1698,7 +1698,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): idx = len(points) for p in points: vpoints.InsertNextPoint(p) - line = vtk.get("PolyLine")() + line = vtk.new("PolyLine") line.GetPointIds().SetNumberOfIds(idx) for i in range(idx): line.GetPointIds().SetId(i, i) @@ -1708,7 +1708,7 @@ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): polyln.SetPoints(vpoints) polyln.SetLines(lines) - tuf = vtk.get("TubeFilter")() + tuf = vtk.new("TubeFilter") tuf.SetCapping(cap) tuf.SetNumberOfSides(res) tuf.SetInputData(polyln) @@ -1845,7 +1845,7 @@ def __init__( elif line2 is None: ############################################# - ribbon_filter = vtk.get("RibbonFilter")() + ribbon_filter = vtk.new("RibbonFilter") aline = Line(line1) ribbon_filter.SetInputData(aline.dataset) if width is None: @@ -1913,12 +1913,12 @@ def __init__( polygon2.SetPoints(ppoints2) polygon2.SetLines(lines2) - merged_pd = vtk.get("AppendPolyData")() + merged_pd = vtk.new("AppendPolyData") merged_pd.AddInputData(polygon1) merged_pd.AddInputData(polygon2) merged_pd.Update() - rsf = vtk.get("RuledSurfaceFilter")() + rsf = vtk.new("RuledSurfaceFilter") rsf.CloseSurfaceOff() rsf.SetRuledMode(mode) rsf.SetResolution(res[0], res[1]) @@ -1972,7 +1972,7 @@ def __init__( else: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) - self.source = vtk.get("ArrowSource")() + self.source = vtk.new("ArrowSource") self.source.SetShaftResolution(res) self.source.SetTipResolution(res) @@ -2008,7 +2008,7 @@ def __init__( t.Scale(length, sz, sz) else: t.Scale(length, length, length) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(self.source.GetOutput()) tf.SetTransform(t) tf.Update() @@ -2082,7 +2082,7 @@ def __init__( start_pts = utils.make3d(start_pts) end_pts = utils.make3d(end_pts) - arr = vtk.get("ArrowSource")() + arr = vtk.new("ArrowSource") arr.SetShaftResolution(res) arr.SetTipResolution(res) @@ -2211,7 +2211,7 @@ def __init__( t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z t.Scale(length, length, length) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(t) tf.Update() @@ -2502,9 +2502,9 @@ def __init__( res_r, res_phi = res, 12 * res if len(angle_range) == 0: - ps = vtk.get("DiskSource")() + ps = vtk.new("DiskSource") else: - ps = vtk.get("SectorSource")() + ps = vtk.new("SectorSource") ps.SetStartAngle(angle_range[0]) ps.SetEndAngle(angle_range[1]) @@ -2554,7 +2554,7 @@ def __init__( self.base = point1 self.top = point2 - ar = vtk.get("ArcSource")() + ar = vtk.new("ArcSource") if point2 is not None: self.top = point2 point2 = point2 - np.asarray(point1) @@ -2683,7 +2683,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) img.SetDimensions(res - 1, res - 1, res - 1) rs = 1.0 / (res - 2) img.SetSpacing(rs, rs, rs) - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(img) gf.Update() super().__init__(gf.GetOutput(), c, alpha) @@ -2706,7 +2706,7 @@ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0) else: res_t, res_phi = 2 * res, res - ss = vtk.get("SphereSource")() + ss = vtk.new("SphereSource") ss.SetRadius(r) ss.SetThetaResolution(res_t) ss.SetPhiResolution(res_phi) @@ -2762,7 +2762,7 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): vedo.logger.error("Limitation: c and r cannot be both sequences.") raise RuntimeError() - src = vtk.get("SphereSource")() + src = vtk.new("SphereSource") if not risseq: src.SetRadius(r) if utils.is_sequence(res): @@ -2774,7 +2774,7 @@ def __init__(self, centers, r=1.0, res=8, c="red5", alpha=1): src.SetPhiResolution(res_phi) src.Update() - psrc = vtk.get("PointSource")() + psrc = vtk.new("PointSource") psrc.SetNumberOfPoints(len(centers)) psrc.Update() pd = psrc.GetOutput() @@ -2831,14 +2831,14 @@ def __init__(self, style=1, r=1.0): ![](https://vedo.embl.es/images/advanced/geodesic.png) """ - tss = vtk.get("TexturedSphereSource")() + tss = vtk.new("TexturedSphereSource") tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) tss.Update() super().__init__(tss.GetOutput(), c="w") atext = vtk.vtkTexture() - pnm_reader = vtk.get("JPEGReader")() + pnm_reader = vtk.new("JPEGReader") fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) @@ -2890,7 +2890,7 @@ def __init__( else: res_t, res_phi = 2 * res, res - elli_source = vtk.get("SphereSource")() + elli_source = vtk.new("SphereSource") elli_source.SetThetaResolution(res_t) elli_source.SetPhiResolution(res_phi) elli_source.Update() @@ -2913,7 +2913,7 @@ def __init__( t.RotateX(np.rad2deg(angle)) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(elli_source.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3066,13 +3066,13 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. super().__init__([verts, faces], c, alpha) else: - ps = vtk.get("PlaneSource")() + ps = vtk.new("PlaneSource") ps.SetResolution(resx, resy) ps.Update() poly0 = ps.GetOutput() t0 = vtk.vtkTransform() t0.Scale(sx, sy, 1) - tf0 = vtk.get("TransformPolyDataFilter")() + tf0 = vtk.new("TransformPolyDataFilter") tf0.SetInputData(poly0) tf0.SetTransform(t0) tf0.Update() @@ -3102,9 +3102,9 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra pos = utils.make3d(pos) normal = np.asarray(normal, dtype=float) - ps = vtk.get("PlaneSource")() + ps = vtk.new("PlaneSource") ps.SetResolution(res[0], res[1]) - tri = vtk.get("TriangleFilter")() + tri = vtk.new("TriangleFilter") tri.SetInputConnection(ps.GetOutputPort()) tri.Update() @@ -3116,7 +3116,7 @@ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gra t.Scale(s[0], s[1], 1) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(tri.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3296,7 +3296,7 @@ def __init__( elif len(size) == 3: length, width, height = size - src = vtk.get("CubeSource")() + src = vtk.new("CubeSource") src.SetXLength(length) src.SetYLength(width) src.SetZLength(height) @@ -3368,13 +3368,13 @@ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", al img = vtk.vtkImageData() img.SetDimensions(n[0] + 1, n[1] + 1, n[2] + 1) img.SetSpacing(spacing) - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(img) gf.Update() poly = gf.GetOutput() else: # fast n -= 1 - tbs = vtk.get("TessellatedBoxSource")() + tbs = vtk.new("TessellatedBoxSource") tbs.SetLevel(n) if len(bounds): tbs.SetBounds(bounds) @@ -3448,11 +3448,11 @@ def __init__( t = vtk.vtkTransform() t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(sp.dataset) tf.SetTransform(t) tf.Update() - tuf = vtk.get("TubeFilter")() + tuf = vtk.new("TubeFilter") tuf.SetNumberOfSides(12) tuf.CappingOn() tuf.SetInputData(tf.GetOutput()) @@ -3497,7 +3497,7 @@ def __init__( base = pos - axis * height / 2 top = pos + axis * height / 2 - cyl = vtk.get("CylinderSource")() + cyl = vtk.new("CylinderSource") cyl.SetResolution(res) cyl.SetRadius(r) cyl.SetHeight(height) @@ -3511,7 +3511,7 @@ def __init__( t.RotateX(90) # put it along Z t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() @@ -3531,7 +3531,7 @@ class Cone(Mesh): def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), res=48, c="green3", alpha=1.0): """Build a cone of specified radius `r` and `height`, centered at `pos`.""" - con = vtk.get("ConeSource")() + con = vtk.new("ConeSource") con.SetResolution(res) con.SetRadius(r) con.SetHeight(height) @@ -3597,11 +3597,10 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow super().__init__([pts, faces], c, alpha) else: - vtkParametricTorus = vtk.get('vtkParametricTorus') - rs = vtkParametricTorus() + rs = vtk.new("vtkParametricTorus") rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) - pfs = vtk.get("ParametricFunctionSource")() + pfs = vtk.new("ParametricFunctionSource") pfs.SetParametricFunction(rs) pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) @@ -3630,16 +3629,16 @@ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): ![](https://user-images.githubusercontent.com/32848391/51211547-260ef480-1916-11e9-95f6-4a677e37e355.png) """ - quadric = vtk.get("Quadric")() + quadric = vtk.new("Quadric") quadric.SetCoefficients(1, 1, 0, 0, 0, 0, 0, 0, height / 4, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 - sample = vtk.get("SampleFunction")() + sample = vtk.new("SampleFunction") sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(quadric) - contours = vtk.get("ContourFilter")() + contours = vtk.new("ContourFilter") contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, 0.01, 0.01) contours.Update() @@ -3663,16 +3662,16 @@ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1 Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` """ - q = vtk.get("Quadric")() + q = vtk.new("Quadric") q.SetCoefficients(2, 2, -1 / a2, 0, 0, 0, 0, 0, 0, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 - sample = vtk.get("SampleFunction")() + sample = vtk.new("SampleFunction") sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(q) - contours = vtk.get("ContourFilter")() + contours = vtk.new("ContourFilter") contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, value, value) contours.Update() @@ -3857,7 +3856,7 @@ def __init__( tr.Translate(padding1 * d, 0, 0) pscale = 1 tr.Scale(pscale / (y1 - y0) * d, pscale / (y1 - y0) * d, 1) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() @@ -3972,58 +3971,58 @@ def __init__(self, name, res=51, n=25, seed=1): name = shapes[name] if name == "Boy": - ps = vtk.get("ParametricBoy")() + ps = vtk.new("ParametricBoy") elif name == "ConicSpiral": - ps = vtk.get("ParametricConicSpiral")() + ps = vtk.new("ParametricConicSpiral") elif name == "CrossCap": - ps = vtk.get("ParametricCrossCap")() + ps = vtk.new("ParametricCrossCap") elif name == "Dini": - ps = vtk.get("ParametricDini")() + ps = vtk.new("ParametricDini") elif name == "Enneper": - ps = vtk.get("ParametricEnneper")() + ps = vtk.new("ParametricEnneper") elif name == "Figure8Klein": - ps = vtk.get("ParametricFigure8Klein")() + ps = vtk.new("ParametricFigure8Klein") elif name == "Klein": - ps = vtk.get("ParametricKlein")() + ps = vtk.new("ParametricKlein") elif name == "Mobius": - ps = vtk.get("ParametricMobius")() + ps = vtk.new("ParametricMobius") ps.SetRadius(2.0) ps.SetMinimumV(-0.5) ps.SetMaximumV(0.5) elif name == "RandomHills": - ps = vtk.get("ParametricRandomHills")() + ps = vtk.new("ParametricRandomHills") ps.AllowRandomGenerationOn() ps.SetRandomSeed(seed) ps.SetNumberOfHills(n) elif name == "Roman": - ps = vtk.get("ParametricRoman")() + ps = vtk.new("ParametricRoman") elif name == "SuperEllipsoid": - ps = vtk.get("ParametricSuperEllipsoid")() + ps = vtk.new("ParametricSuperEllipsoid") ps.SetN1(0.5) ps.SetN2(0.4) elif name == "BohemianDome": - ps = vtk.get("ParametricBohemianDome")() + ps = vtk.new("ParametricBohemianDome") ps.SetA(5.0) ps.SetB(1.0) ps.SetC(2.0) elif name == "Bour": - ps = vtk.get("ParametricBour")() + ps = vtk.new("ParametricBour") elif name == "CatalanMinimal": - ps = vtk.get("ParametricCatalanMinimal")() + ps = vtk.new("ParametricCatalanMinimal") elif name == "Henneberg": - ps = vtk.get("ParametricHenneberg")() + ps = vtk.new("ParametricHenneberg") elif name == "Kuen": - ps = vtk.get("ParametricKuen")() + ps = vtk.new("ParametricKuen") ps.SetDeltaV0(0.001) elif name == "PluckerConoid": - ps = vtk.get("ParametricPluckerConoid")() + ps = vtk.new("ParametricPluckerConoid") elif name == "Pseudosphere": - ps = vtk.get("ParametricPseudosphere")() + ps = vtk.new("ParametricPseudosphere") else: vedo.logger.error(f"unknown ParametricShape {name}") return - pfs = vtk.get("ParametricFunctionSource")() + pfs = vtk.new("ParametricFunctionSource") pfs.SetParametricFunction(ps) pfs.SetUResolution(res) pfs.SetVResolution(res) @@ -4251,7 +4250,7 @@ def _get_text3d_poly( txt = str(txt) if font == "VTK": ####################################### - vtt = vtk.get("vtkVectorText")() + vtt = vtk.new("vtkVectorText") vtt.SetText(txt) vtt.Update() tpoly = vtt.GetOutput() @@ -4365,7 +4364,7 @@ def _get_text3d_poly( tr.Scale(pscale, pscale, pscale) if italic: tr.Concatenate([1, italic * 0.15, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() @@ -4383,7 +4382,7 @@ def _get_text3d_poly( if len(polyletters) == 1: tpoly = polyletters[0] else: - polyapp = vtk.get("AppendPolyData")() + polyapp = vtk.new("AppendPolyData") for polyd in polyletters: polyapp.AddInputData(polyd) polyapp.Update() @@ -4406,14 +4405,14 @@ def _get_text3d_poly( t.PostMultiply() t.Scale(s, s, s) t.Translate(shift) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(tpoly) tf.SetTransform(t) tf.Update() tpoly = tf.GetOutput() if depth: - extrude = vtk.get("LinearExtrusionFilter")() + extrude = vtk.new("LinearExtrusionFilter") extrude.SetInputData(tpoly) extrude.SetExtrusionTypeToVectorExtrusion() extrude.SetVector(0, 0, 1) @@ -4632,7 +4631,7 @@ def __init__( """ super().__init__() - self.mapper = vtk.get("TextMapper")() + self.mapper = vtk.new("TextMapper") self.SetMapper(self.mapper) self.properties = self.mapper.GetTextProperty() @@ -4925,18 +4924,18 @@ def __init__(self, pts): z0, z1 = mesh.zbounds() d = mesh.diagonal_size() if (z1 - z0) / d > 0.0001: - delaunay = vtk.get("Delaunay3D")() + delaunay = vtk.new("Delaunay3D") delaunay.SetInputData(apoly) delaunay.Update() - surfaceFilter = vtk.get("DataSetSurfaceFilter")() + surfaceFilter = vtk.new("DataSetSurfaceFilter") surfaceFilter.SetInputConnection(delaunay.GetOutputPort()) surfaceFilter.Update() out = surfaceFilter.GetOutput() else: - delaunay = vtk.get("Delaunay2D")() + delaunay = vtk.new("Delaunay2D") delaunay.SetInputData(apoly) delaunay.Update() - fe = vtk.get("FeatureEdges")() + fe = vtk.new("FeatureEdges") fe.SetInputConnection(delaunay.GetOutputPort()) fe.BoundaryEdgesOn() fe.Update() From 982efc287d7f64b4b11f3af3d9b538cebc4d75fc Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 29 Oct 2023 19:12:36 +0100 Subject: [PATCH 198/251] check examples and other small fixes dev25a --- docs/changes.md | 9 ++- examples/advanced/line2mesh_tri.py | 8 +-- examples/other/run_all.sh | 3 - examples/simulations/drag_chain.py | 1 + examples/simulations/mag_field2.py | 36 ------------ examples/simulations/springs_fem.py | 2 + tests/issues/test_fxy_bessel2.py | 74 ------------------------ vedo/addons.py | 6 +- vedo/file_io.py | 2 +- vedo/mesh.py | 2 +- vedo/plotter.py | 76 ++++++++++--------------- vedo/shapes.py | 4 +- vedo/tetmesh.py | 36 ++++++------ vedo/ugrid.py | 12 ++-- vedo/utils.py | 7 ++- vedo/version.py | 2 +- vedo/visual.py | 14 ++--- vedo/volume.py | 88 ++++++++++++++--------------- vedo/vtkclasses.py | 24 ++++---- 19 files changed, 143 insertions(+), 263 deletions(-) delete mode 100644 examples/simulations/mag_field2.py delete mode 100644 tests/issues/test_fxy_bessel2.py diff --git a/docs/changes.md b/docs/changes.md index 8f5e58bc..4562fd8a 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -79,6 +79,11 @@ slice_plane1.py background_image.py +gyroscope1.py broken +tet_cut2.py broken +markpoint.py +plot_spheric.py + ``` ### TODO @@ -89,6 +94,4 @@ background_image.py - revisit splines and other widgets - merge does something strange with flagpost - analysis_plots.visualize_clones_as_timecourse_with_fit not working - - - +- load series as animation viewer diff --git a/examples/advanced/line2mesh_tri.py b/examples/advanced/line2mesh_tri.py index e0a0b724..3dba3cf2 100644 --- a/examples/advanced/line2mesh_tri.py +++ b/examples/advanced/line2mesh_tri.py @@ -10,7 +10,7 @@ msh = shape.generate_mesh(invert=True) msh.smooth() # make the triangles more uniform msh.compute_quality() # add a measure of triangle quality -msh.cmap(cmap, on="cells").add_scalarbar3d() +msh.cmap(cmap, on="cells") contour = Line(shape).c("red4").lw(5) labels = contour.labels("id") @@ -18,8 +18,8 @@ histo = histogram( msh.celldata["Quality"], xtitle="triangle mesh quality", - aspect=3/4, + aspect=25/9, c=cmap, -) +).clone2d("bottom-right") -show([(contour, labels, msh, __doc__), histo], N=2, sharecam=0).close() +show(contour, labels, msh, histo, __doc__, sharecam=0).close() diff --git a/examples/other/run_all.sh b/examples/other/run_all.sh index b8fb0c48..97f1bd85 100755 --- a/examples/other/run_all.sh +++ b/examples/other/run_all.sh @@ -25,9 +25,6 @@ python3 iminuit1.py echo Running inset.py python3 inset.py -echo Running vpolyscope.py -python3 vpolyscope.py - echo Running meshio_read.py python3 meshio_read.py diff --git a/examples/simulations/drag_chain.py b/examples/simulations/drag_chain.py index 1f20f905..3c0100ca 100644 --- a/examples/simulations/drag_chain.py +++ b/examples/simulations/drag_chain.py @@ -18,6 +18,7 @@ def func(evt): surf = Plane(s=[60, 60]) line = Line([l*n/2, 0], [-l*n/2, 0], res=n, lw=12) +line.render_lines_as_tubes() nodes= line.clone().c('red3').point_size(15) plt = Plotter() diff --git a/examples/simulations/mag_field2.py b/examples/simulations/mag_field2.py deleted file mode 100644 index 87cf51c9..00000000 --- a/examples/simulations/mag_field2.py +++ /dev/null @@ -1,36 +0,0 @@ -import magpylib # pip install magpylib -import numpy as np -import vedo - -coil1 = magpylib.Collection() -for z in np.linspace(-8, 8, 16): - winding = magpylib.current.Loop( - current=100, - diameter=10, - position=(0,0,z), - ) - coil1.add(winding) - -##################### -volume = vedo.Volume( - dims=(41, 41, 41), - spacing=(2, 2, 2), - origin=(-40, -40, -40), -) - -# compute B-field and add as pointdata to volume -volume.pointdata['B'] = coil1.getB(volume.vertices) - -# compute field lines -seeds = vedo.Disc(r1=1, r2=5.2, res=(3,12)) - -streamlines = vedo.StreamLines( - volume, - seeds, - max_propagation=180, - initial_step_size=0.1, - direction="both", -) -streamlines.cmap("RdBu_r", "B").lw(5).add_scalarbar("mT") - -vedo.show(streamlines, axes=1) diff --git a/examples/simulations/springs_fem.py b/examples/simulations/springs_fem.py index 8a62fb35..2baa2b9f 100644 --- a/examples/simulations/springs_fem.py +++ b/examples/simulations/springs_fem.py @@ -1,4 +1,5 @@ """Solving a system of springs using the finite element method.""" +# https://www.youtube.com/watch?v=YqpIEDWJCwc import numpy as np from vedo import * # np.random.seed(0) @@ -41,6 +42,7 @@ nodes_displaced = nodes + u +# Visualize the solution vnodes1 = Points(nodes, r=20, c="k", alpha=0.25) vline1 = Line(nodes, c="k", alpha=0.25) diff --git a/tests/issues/test_fxy_bessel2.py b/tests/issues/test_fxy_bessel2.py deleted file mode 100644 index 66f408de..00000000 --- a/tests/issues/test_fxy_bessel2.py +++ /dev/null @@ -1,74 +0,0 @@ -import numpy as np -import colorsys -from scipy import special -from scipy.special import jn_zeros -from vedo import ScalarBar3D, show, settings -from vedo.colors import color_map, build_lut -from vedo.pyplot import plot - -Nr = 2 -Nθ = 1 - -settings.default_font = "Theemim" -settings.interpolate_scalars_before_mapping = False - -def custom_lut(name, vmin=0, vmax=1, scale_l=0.05, N=256): - # Create a custom look-up-table - lut = [] - x = np.linspace(vmin, vmax, N) - for i in range(N): - r, g, b = color_map(i, name, 0, N-1) - h, l, s = colorsys.rgb_to_hls(r,g,b) - ###### do something here ###### - l = min(1, l * (1 + 5 * scale_l)) - rgb = colorsys.hls_to_rgb(h, l, s) - lut.append([x[i], rgb]) - return build_lut(lut) - -def f(x, y): - d2 = x**2 + y**2 - if d2 > 1: - return np.nan - else: - r = np.sqrt(d2) - θ = np.arctan2(y, x) - kr = jn_zeros(Nθ, 4)[Nr] - return special.jn(Nθ, kr * r) * np.exp(1j * Nθ * θ) - -p1 = plot( - lambda x,y: np.abs(f(x,y)), - xlim=[-1, 1], ylim=[-1, 1], - bins=(200, 200), - show_nan=False, - axes=dict( - xtitle="x", ytitle="y", ztitle="|f(x,y)|", - xlabel_rotation=90, ylabel_rotation=90, zlabel_rotation=90, - xtitle_rotation=90, ytitle_rotation=90, zaxis_rotation=45, - ztitle_offset=0.03, - ), -) - -# Unpack the plot objects to customize them -msh = p1.unpack(0).triangulate().lighting('glossy') -msh.cut_with_sphere((0,0,0), 0.99, invert=0) - -pts = msh.vertices # get the points -zvals = pts[:,2] # get the z values -θvals = [np.angle(f(*p[:2])) for p in pts] # get the phases - -lut = custom_lut("hsv", vmin=-np.pi/10, vmax=np.pi) - -msh.cmap(lut, θvals) # apply the color map -scbar = ScalarBar3D( - msh, title=f"Bessel Function Nr={Nr} Nθ={Nθ}", - label_rotation=90, c="black", -) - -# Set a specific camera position and orientation (press shift-C to see it) -cam = dict( - position=(3.88583, 0.155949, 3.88584), - focal_point=(0, 0, 0), - viewup=(-0.7, 0, 0.7), - distance=5.4, -) -show(p1, scbar, camera=cam).close() diff --git a/vedo/addons.py b/vedo/addons.py index 0fddac1a..9c7c40c6 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -1837,8 +1837,8 @@ def _keypress(self, vobj, event): elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): - printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") + printc(":save: saved mesh to vedo_clipped.vtk") class BoxCutter(vtk.vtkBoxWidget, BaseCutter): @@ -1952,8 +1952,8 @@ def _keypress(self, vobj, event): elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): - printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") + printc(":save: saved mesh to vedo_clipped.vtk") class SphereCutter(vtk.vtkSphereWidget, BaseCutter): @@ -2073,8 +2073,8 @@ def _keypress(self, vobj, event): elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): - printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") + printc(":save: saved mesh to vedo_clipped.vtk") ##################################################################### diff --git a/vedo/file_io.py b/vedo/file_io.py index 2ef857c8..dc2643af 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1903,7 +1903,7 @@ def __init__(self, name="movie.mp4", duration=None, fps=24, backend="imageio"): self.frames = [] self.tmp_dir = TemporaryDirectory() self.get_filename = lambda x: os.path.join(self.tmp_dir.name, x) - colors.printc(":video: Video file", self.name, "is open... ", c="m", end="") + colors.printc(":video: Video file", self.name, "is open... ", c="m", end="") def add_frame(self): """Add frame to current video.""" diff --git a/vedo/mesh.py b/vedo/mesh.py index 658a3c86..4acbaf6f 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -414,7 +414,7 @@ def texture( else: # last resource is automatic mapping - tmapper = vtk.new("vtkTextureMapToPlane") + tmapper = vtk.new("TextureMapToPlane") tmapper.AutomaticPlaneGenerationOn() tmapper.SetInputData(pd) tmapper.Update() diff --git a/vedo/plotter.py b/vedo/plotter.py index 73a74cd9..00e5df51 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3611,11 +3611,13 @@ def _mouseleftclick(self, iren, event): self.justremoved = None self.clicked_actor = clicked_actor - if hasattr(clicked_actor, "data"): # might be not a vedo obj + try: # might not be a vedo obj self.clicked_object = clicked_actor.retrieve_object() # save this info in the object itself self.clicked_object.picked3d = self.picked3d self.clicked_object.picked2d = self.picked2d + except AttributeError: + pass # ----------- if "Histogram1D" in picker.GetAssembly().__class__.__name__: @@ -3768,12 +3770,12 @@ def _keypress(self, iren, event): " ============================================================\n" " | Press: i print info about selected object |\n" " | I print the RGB color under the mouse |\n" - " | y show the pipeline for this object as a graph |\n" + " | Y show the pipeline for this object as a graph |\n" " | <--> use arrows to reduce/increase opacity |\n" - " | w/s toggle wireframe/surface style |\n" - " | p/P change point size of vertices |\n" - " | l toggle edges visibility |\n" " | x toggle mesh visibility |\n" + " | w toggle wireframe/surface style |\n" + " | l toggle edges visibility |\n" + " | p/P change size of vertices |\n" " | X invoke a cutter widget tool |\n" " | 1-3 change mesh color |\n" " | 4 use data array as colors, if present |\n" @@ -3786,7 +3788,6 @@ def _keypress(self, iren, event): " | o/O add/remove light to scene and rotate it |\n" " | n show surface mesh normals |\n" " | a toggle interaction to Actor Mode |\n" - " | j toggle interaction to Joystick Mode |\n" " | U toggle perspective/parallel projection |\n" " | r reset camera position |\n" " | R reset camera orientation to orthogonal view |\n" @@ -3834,14 +3835,14 @@ def _keypress(self, iren, event): elif key == "A": # toggle antialiasing msam = self.window.GetMultiSamples() if not msam: - self.window.SetMultiSamples(8) + self.window.SetMultiSamples(16) else: self.window.SetMultiSamples(0) msam = self.window.GetMultiSamples() if msam: - vedo.printc(f"Antialiasing is now set to {msam} samples", c=bool(msam)) + vedo.printc(f"Antialiasing set to {msam} samples", c=bool(msam)) else: - vedo.printc("Antialiasing is now disabled", c=bool(msam)) + vedo.printc("Antialiasing disabled", c=bool(msam)) elif key == "D": # toggle depthpeeling udp = not renderer.GetUseDepthPeeling() @@ -3854,23 +3855,11 @@ def _keypress(self, iren, event): self.interactor.Render() wasUsed = renderer.GetLastRenderingUsedDepthPeeling() rnr = self.renderers.index(renderer) - vedo.printc(f"Depth peeling is now set to {udp} for renderer nr.{rnr}", c=udp) + vedo.printc(f"Depth peeling set to {udp} for renderer nr.{rnr}", c=udp) if not wasUsed and udp: vedo.printc("\t...but last rendering did not actually used it!", c=udp, invert=True) return - elif key == "j": - iren.ExitCallback() - cur = iren.GetInteractorStyle() - if isinstance(cur, vtk.get_class("InteractorStyleJoystickCamera")): - iren.SetInteractorStyle(vtk.new("InteractorStyleTrackballCamera")) - else: - vedo.printc("\nInteractor style changed to Joystick,", end="") - vedo.printc(" press j to go back to normal.") - iren.SetInteractorStyle(vtk.new("InteractorStyleJoystickCamera")) - iren.Start() - return - elif key == "period": if self.picked3d: self.fly_to(self.picked3d) @@ -3905,19 +3894,13 @@ def _keypress(self, iren, event): elif key == "R": self.reset_viewup() - elif key == "s": - try: - if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.wireframe(False) - else: - for a in self.get_meshes(): - a.wireframe() - except AttributeError: - pass # Points dont have wireframe - elif key == "w": if self.clicked_object and self.clicked_object in self.get_meshes(): - self.clicked_object.properties.SetRepresentationToWireframe() + # self.clicked_object.properties.SetRepresentationToWireframe() + if self.clicked_object.properties.GetRepresentation() == 1: # toggle + self.clicked_object.properties.SetRepresentationToSurface() + else: + self.clicked_object.properties.SetRepresentationToWireframe() else: for a in self.get_meshes(): if a.properties.GetRepresentation() == 1: # toggle @@ -4125,9 +4108,9 @@ def _keypress(self, iren, event): if not self._extralight: vup = renderer.GetActiveCamera().GetViewUp() pos = cm + utils.vector(vup) * utils.mag(sizes) - self._extralight = addons.Light(pos, focal_point=cm) + self._extralight = addons.Light(pos, focal_point=cm, intensity=0.4) renderer.AddLight(self._extralight) - print("Press again o to rotate light source, or O to remove it.") + vedo.printc("Press 'o' again to rotate light source, or 'O' to remove it.", c='y') else: cpos = utils.vector(self._extralight.GetPosition()) x, y, z = self._extralight.GetPosition() - cm @@ -4139,8 +4122,6 @@ def _keypress(self, iren, event): cpos = transformations.spher2cart(r, th, ph).T + cm self._extralight.SetPosition(cpos) - self.window.Render() - elif key == "l": if self.clicked_object in self.get_meshes(): objs = [self.clicked_object] @@ -4184,11 +4165,12 @@ def _keypress(self, iren, event): ia.properties.SetInterpolation(2) # phong elif key == "n": # show normals to an actor + self.remove("added_auto_normals") if self.clicked_object in self.get_meshes(): if self.clicked_actor.GetPickable(): norml = vedo.shapes.NormalLines(self.clicked_object) + norml.name = "added_auto_normals" self.add(norml) - iren.Render() elif key == "x": if self.justremoved is None: @@ -4199,7 +4181,6 @@ def _keypress(self, iren, event): self.renderer.RemoveActor(self.clicked_actor) else: self.renderer.AddActor(self.justremoved) - self.renderer.Render() self.justremoved = None elif key == "X": @@ -4207,20 +4188,25 @@ def _keypress(self, iren, event): if not self.cutter_widget: self.cutter_widget = addons.BoxCutter(self.clicked_object) self.add(self.cutter_widget) - print("Press Shift+X to close the cutter box widget, Ctrl+s to save the cut section.") + vedo.printc("Press i to toggle the cutter on/off", c='g', dim=1) + vedo.printc(" u to flip selection", c='g', dim=1) + vedo.printc(" r to reset cutting planes", c='g', dim=1) + vedo.printc(" Shift+X to close the cutter box widget", c='g', dim=1) + vedo.printc(" Ctrl+S to save the cut section to file.", c='g', dim=1) else: self.remove(self.cutter_widget) self.cutter_widget = None - vedo.printc("Click object and press X to open the cutter box widget.", c=4) + vedo.printc("Click object and press X to open the cutter box widget.", c='g') elif key == "E": - vedo.printc(r":camera: Exporting 3D window to file", c="blue", end="") + vedo.printc(r":camera: Exporting 3D window to file", c="b", end="") vedo.file_io.export_window("scene.npz") - vedo.printc(". Try:\n> vedo scene.npz", c="blue") + vedo.printc(". Try:\n> vedo scene.npz", c="b") + return elif key == "F": vedo.file_io.export_window("scene.x3d") - vedo.printc(":idea: Try: firefox scene.html", c="blue") + vedo.printc(":idea: Try: firefox scene.html", c="b") elif key == "i": # print info if self.clicked_object: @@ -4232,7 +4218,7 @@ def _keypress(self, iren, event): x, y = iren.GetEventPosition() self.color_picker([x, y], verbose=True) - elif key == "y": + elif key == "Y": if self.clicked_object and self.clicked_object.pipeline: self.clicked_object.pipeline.show() diff --git a/vedo/shapes.py b/vedo/shapes.py index 17eb6a0f..df070f5b 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -3597,7 +3597,7 @@ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow super().__init__([pts, faces], c, alpha) else: - rs = vtk.new("vtkParametricTorus") + rs = vtk.new("ParametricTorus") rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) pfs = vtk.new("ParametricFunctionSource") @@ -4250,7 +4250,7 @@ def _get_text3d_poly( txt = str(txt) if font == "VTK": ####################################### - vtt = vtk.new("vtkVectorText") + vtt = vtk.new("VectorText") vtt.SetText(txt) vtt.Update() tpoly = vtt.GetOutput() diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index abb4af60..ff394bb3 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -40,7 +40,7 @@ def delaunay3d(mesh, radius=0, tol=None): This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. """ - deln = vtk.get("Delaunay3D")() + deln = vtk.new("Delaunay3D") if utils.is_sequence(mesh): pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() @@ -147,7 +147,7 @@ def __init__( self.dataset = inputobj.dataset elif isinstance(inputobj, vtk.vtkRectilinearGrid): - r2t = vtk.get("RectilinearGridToTetrahedra")() + r2t = vtk.new("RectilinearGridToTetrahedra") r2t.SetInputData(inputobj) r2t.RememberVoxelIdOn() r2t.SetTetraPerCellTo6() @@ -155,7 +155,7 @@ def __init__( self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): - r2t = vtk.get("DataSetTriangleFilter")() + r2t = vtk.new("DataSetTriangleFilter") r2t.SetInputData(inputobj) # r2t.TetrahedraOnlyOn() r2t.Update() @@ -166,7 +166,7 @@ def __init__( if "https://" in inputobj: inputobj = download(inputobj, verbose=False) ug = loadUnStructuredGrid(inputobj) - tt = vtk.get("DataSetTriangleFilter")() + tt = vtk.new("DataSetTriangleFilter") tt.SetInputData(ug) tt.SetTetrahedraOnly(True) tt.Update() @@ -177,12 +177,12 @@ def __init__( ################### if "tetra" in mapper: - self.mapper = vtk.get("ProjectedTetrahedraMapper")() + self.mapper = vtk.new("ProjectedTetrahedraMapper") elif "ray" in mapper: - self.mapper = vtk.get("UnstructuredGridVolumeRayCastMapper")() + self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") elif "zs" in mapper: - self.mapper = vtk.get("UnstructuredGridVolumeZSweepMapper")() - elif isinstance(mapper, vtk.get("Mapper")): + self.mapper = vtk.new("UnstructuredGridVolumeZSweepMapper") + elif isinstance(mapper, vtk.get_class("Mapper")): self.mapper = mapper else: vedo.logger.error(f"Unknown mapper type {type(mapper)}") @@ -338,7 +338,7 @@ def compute_quality(self, metric=7): See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html) for an explanation of the meaning of each metric.. """ - qf = vtk.get("MeshQuality")() + qf = vtk.new("MeshQuality") qf.SetInputData(self.dataset) qf.SetTetQualityMeasure(metric) qf.SaveCellQualityOn() @@ -348,7 +348,7 @@ def compute_quality(self, metric=7): def compute_tets_volume(self): """Add to this mesh a cell data array containing the tetrahedron volume.""" - csf = vtk.get("CellSizeFilter")() + csf = vtk.new("CellSizeFilter") csf.SetInputData(self.dataset) csf.SetComputeArea(False) csf.SetComputeVolume(True) @@ -377,7 +377,7 @@ def check_validity(self, tol=0): This value is used as an epsilon for floating point equality checks throughout the cell checking process. """ - vald = vtk.get("CellValidator")() + vald = vtk.new("CellValidator") if tol: vald.SetTolerance(tol) vald.SetInputData(self.dataset) @@ -395,7 +395,7 @@ def threshold(self, name=None, above=None, below=None, on="cells"): Set keyword "on" to either "cells" or "points". """ - th = vtk.get("Threshold")() + th = vtk.new("Threshold") th.SetInputData(self.dataset) if name is None: @@ -436,7 +436,7 @@ def decimate(self, scalars_name, fraction=0.5, n=0): .. note:: setting `fraction=0.1` leaves 10% of the original nr of tets. """ - decimate = vtk.get("UnstructuredGridQuadricDecimation")() + decimate = vtk.new("UnstructuredGridQuadricDecimation") decimate.SetInputData(self.dataset) decimate.SetScalarsName(scalars_name) @@ -457,7 +457,7 @@ def subdvide(self): Increase the number of tets of a `TetMesh`. Subdivide one tetrahedron into twelve for every tetra. """ - sd = vtk.get("SubdivideTetra")() + sd = vtk.new("SubdivideTetra") sd.SetInputData(self.dataset) sd.Update() self._update(sd.GetOutput()) @@ -475,7 +475,7 @@ def isosurface(self, value=True): if not self.dataset.GetPointData().GetScalars(): self.map_cells_to_points() scrange = self.dataset.GetPointData().GetScalars().GetRange() - cf = vtk.get("ContourFilter")() # vtk.get("ContourGrid")() + cf = vtk.new("ContourFilter") # vtk.new("ContourGrid") cf.SetInputData(self.dataset) if utils.is_sequence(value): @@ -489,7 +489,7 @@ def isosurface(self, value=True): cf.SetValue(0, value) cf.Update() - clp = vtk.get("CleanPolyData")() + clp = vtk.new("CleanPolyData") clp.SetInputData(cf.GetOutput()) clp.Update() msh = Mesh(clp.GetOutput(), c=None).phong() @@ -508,11 +508,11 @@ def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) - plane = vtk.get("Plane")() + plane = vtk.new("Plane") plane.SetOrigin(origin) plane.SetNormal(normal) - cc = vtk.get("Cutter")() + cc = vtk.new("Cutter") cc.SetInputData(self.dataset) cc.SetCutFunction(plane) cc.Update() diff --git a/vedo/ugrid.py b/vedo/ugrid.py index cc6eed3f..b72dbe76 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -127,7 +127,7 @@ def __init__(self, inputobj=None): vedo.logger.error(f"cannot understand input type {inputtype}") return - self.mapper = vtk.get("UnstructuredGridVolumeRayCastMapper")() + self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") self.actor.SetMapper(self.mapper) self.mapper.SetInputData(self.dataset) ###NOT HERE? @@ -239,13 +239,13 @@ def extract_cell_type(self, ctype): uarr = self.dataset.GetCellTypesArray() ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") - selection_node = vtk.get("SelectionNode")() - selection_node.SetFieldType(vtk.get("SelectionNode").CELL) - selection_node.SetContentType(vtk.get("SelectionNode").INDICES) + selection_node = vtk.new("SelectionNode") + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) selection_node.SetSelectionList(uarrtyp) - selection = vtk.get("Selection")() + selection = vtk.new("Selection") selection.AddNode(selection_node) - es = vtk.get("ExtractSelection")() + es = vtk.new("ExtractSelection") es.SetInputData(0, self.dataset) es.SetInputData(1, selection) es.Update() diff --git a/vedo/utils.py b/vedo/utils.py index 4eb51620..af1f58b5 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -515,7 +515,7 @@ def geometry(obj, extent=None): Set `extent` as the `[xmin,xmax, ymin,ymax, zmin,zmax]` bounding box to clip data. """ - gf = vtk.get("GeometryFilter")() + gf = vtk.new("GeometryFilter") gf.SetInputData(obj) if extent is not None: gf.SetExtent(extent) @@ -536,7 +536,7 @@ def extract_cells_by_type(obj, types=()): Return: a `vtkDataSet` object which can be wrapped. """ - ef = vtk.get("ExtractCellsByType")() + ef = vtk.new("ExtractCellsByType") try: ef.SetInputData(obj.dataset) except AttributeError: @@ -2062,7 +2062,8 @@ def camera_from_quaternion(pos, quaternion, distance=10000, ngl_correct=True): camera = vtk.vtkCamera() # define the quaternion in vtk, note the swapped order # w,x,y,z instead of x,y,z,w - quat_vtk = vtk.get("Quaternion")(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) + quat_vtk = vtk.get_class("Quaternion")( + quaternion[3], quaternion[0], quaternion[1], quaternion[2]) # use this to define a rotation matrix in x,y,z # right handed units M = np.zeros((3, 3), dtype=np.float32) diff --git a/vedo/version.py b/vedo/version.py index d1cc2af7..ed727bb4 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev24a' +_version = '2023.5.0+dev25a' diff --git a/vedo/visual.py b/vedo/visual.py index 00b4dd69..ac7f0166 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -91,7 +91,7 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation actor = self.actor if isinstance(self, vedo.UGrid): - geo = vtk.get("GeometryFilter")() + geo = vtk.new("GeometryFilter") geo.SetInputData(self.dataset) geo.Update() actor = vedo.Mesh(geo.GetOutput()).cmap("rainbow").actor @@ -493,7 +493,7 @@ def clone2d(self, scale=None): vrange = self.mapper.GetScalarRange() sm = self.mapper.GetScalarMode() - mapper2d = vtk.get("PolyDataMapper2D")() + mapper2d = vtk.new("PolyDataMapper2D") mapper2d.ShallowCopy(self.mapper) mapper2d.SetInputData(poly) mapper2d.SetColorMode(cm) @@ -1329,7 +1329,7 @@ def labels( vedo.logger.error("in labels(), array not found for points or cells") return None - tapp = vtk.get("AppendPolyData")() + tapp = vtk.new("AppendPolyData") ninputs = 0 for i, e in enumerate(elems): @@ -1348,7 +1348,7 @@ def labels( continue if font == "VTK": - tx = vtk.get("VectorText")() + tx = vtk.new("VectorText") tx.SetText(txt_lab) tx.Update() tx_poly = tx.GetOutput() @@ -1392,7 +1392,7 @@ def labels( T.RotateZ(zrot) T.Scale(scale, scale, scale) T.Translate(e) - tf = vtk.get("TransformPolyDataFilter")() + tf = vtk.new("TransformPolyDataFilter") tf.SetInputData(tx_poly) tf.SetTransform(T) tf.Update() @@ -1480,7 +1480,7 @@ def labels2d( return None self.pointdata.select(content) - mp = vtk.get("LabeledDataMapper")() + mp = vtk.new("LabeledDataMapper") if content == "id": mp.SetLabelModeToLabelIds() @@ -1840,7 +1840,7 @@ def caption( capt.SetAttachmentPoint(point) capt.SetBorder(True) capt.SetLeader(True) - sph = vtk.get("SphereSource")() + sph = vtk.new("SphereSource") sph.Update() capt.SetLeaderGlyphData(sph.GetOutput()) capt.SetMaximumLeaderGlyphSize(5) diff --git a/vedo/volume.py b/vedo/volume.py index 30b53cf7..8f8ee6cd 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -140,14 +140,14 @@ def __init__( ################### if "gpu" in mapper: - self.mapper = vtk.get("GPUVolumeRayCastMapper")() + self.mapper = vtk.new("GPUVolumeRayCastMapper") elif "opengl_gpu" in mapper: - self.mapper = vtk.get("OpenGLGPUVolumeRayCastMapper")() + self.mapper = vtk.new("OpenGLGPUVolumeRayCastMapper") elif "smart" in mapper: - self.mapper = vtk.get("SmartVolumeMapper")() + self.mapper = vtk.new("SmartVolumeMapper") elif "fixed" in mapper: - self.mapper = vtk.get("FixedPointVolumeRayCastMapper")() - elif isinstance(mapper, vtk.get("Mapper")): + self.mapper = vtk.new("FixedPointVolumeRayCastMapper") + elif isinstance(mapper, vtk.get_class("Mapper")): self.mapper = mapper else: print("Error unknown mapper type", [mapper]) @@ -167,17 +167,17 @@ def __init__( if isinstance(inputobj[0], str) and ".bmp" in inputobj[0].lower(): # scan sequence of BMP files - ima = vtk.get("ImageAppend")() + ima = vtk.new("ImageAppend") ima.SetAppendAxis(2) pb = utils.ProgressBar(0, len(inputobj)) for i in pb.range(): f = inputobj[i] if "_rec_spr.bmp" in f: continue - picr = vtk.get("BMPReader")() + picr = vtk.new("BMPReader") picr.SetFileName(f) picr.Update() - mgf = vtk.get("ImageMagnitude")() + mgf = vtk.new("ImageMagnitude") mgf.SetInputData(picr.GetOutput()) mgf.Update() ima.AddInputData(mgf.GetOutput()) @@ -361,7 +361,7 @@ def component_weight(self, i, weight): def xslice(self, i): """Extract the slice at index `i` of volume along x-axis.""" - vslice = vtk.get("ImageDataGeometryFilter")() + vslice = vtk.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if i > nx - 1: @@ -374,7 +374,7 @@ def xslice(self, i): def yslice(self, j): """Extract the slice at index `j` of volume along y-axis.""" - vslice = vtk.get("ImageDataGeometryFilter")() + vslice = vtk.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if j > ny - 1: @@ -387,7 +387,7 @@ def yslice(self, j): def zslice(self, k): """Extract the slice at index `i` of volume along z-axis.""" - vslice = vtk.get("ImageDataGeometryFilter")() + vslice = vtk.new("ImageDataGeometryFilter") vslice.SetInputData(self.dataset) nx, ny, nz = self.dataset.GetDimensions() if k > nz - 1: @@ -407,7 +407,7 @@ def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) """ - reslice = vtk.get("ImageReslice")() + reslice = vtk.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetOutputDimensionality(2) newaxis = utils.versor(normal) @@ -424,7 +424,7 @@ def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): reslice.SetInterpolationModeToLinear() reslice.SetAutoCropOutput(not autocrop) reslice.Update() - vslice = vtk.get("ImageDataGeometryFilter")() + vslice = vtk.new("ImageDataGeometryFilter") vslice.SetInputData(reslice.GetOutput()) vslice.Update() msh = Mesh(vslice.GetOutput()) @@ -510,7 +510,7 @@ def apply_transform(self, T, fit=False): tr.SetMatrix(M) T = tr - reslice = vtk.get("ImageReslice")() + reslice = vtk.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetResliceTransform(T) reslice.SetOutputDimensionality(3) @@ -624,7 +624,7 @@ def permute_axes(self, x, y, z): Reorder the axes of the Volume by specifying the input axes which are supposed to become the new X, Y, and Z. """ - imp = vtk.get("ImagePermute")() + imp = vtk.new("ImagePermute") imp.SetFilteredAxes(x, y, z) imp.SetInputData(self.dataset) imp.Update() @@ -647,7 +647,7 @@ def resample(self, new_spacing, interpolation=1): interpolation : (int) 0=nearest_neighbor, 1=linear, 2=cubic """ - rsp = vtk.get("ImageResample")() + rsp = vtk.new("ImageResample") oldsp = self.spacing() for i in range(3): if oldsp[i] != new_spacing[i]: @@ -669,7 +669,7 @@ def threshold(self, above=None, below=None, replace=None, replace_value=None): Find the voxels that contain a value above/below the input values and replace them with a new value (default is 0). """ - th = vtk.get("ImageThreshold")() + th = vtk.new("ImageThreshold") th.SetInputData(self.dataset) # sanity checks @@ -731,7 +731,7 @@ def crop(self, left=None, right=None, back=None, front=None, bottom=None, top=No Example: `vol.crop(VOI=(xmin, xmax, ymin, ymax, zmin, zmax)) # all integers nrs` """ - extractVOI = vtk.get("ExtractVOI")() + extractVOI = vtk.new("ExtractVOI") extractVOI.SetInputData(self.dataset) if VOI: @@ -780,7 +780,7 @@ def append(self, volumes, axis="z", preserve_extents=False): ``` ![](https://vedo.embl.es/images/feats/volume_append.png) """ - ima = vtk.get("ImageAppend")() + ima = vtk.new("ImageAppend") ima.SetInputData(self.dataset) if not utils.is_sequence(volumes): volumes = [volumes] @@ -830,7 +830,7 @@ def pad(self, voxels=10, value=0): ![](https://vedo.embl.es/images/volumetric/volume_pad.png) """ x0, x1, y0, y1, z0, z1 = self.dataset.GetExtent() - pf = vtk.get("ImageConstantPad")() + pf = vtk.new("ImageConstantPad") pf.SetInputData(self.dataset) pf.SetConstant(value) if utils.is_sequence(voxels): @@ -856,7 +856,7 @@ def resize(self, *newdims): """Increase or reduce the number of voxels of a Volume with interpolation.""" old_dims = np.array(self.dataset.GetDimensions()) old_spac = np.array(self.dataset.GetSpacing()) - rsz = vtk.get("ImageResize")() + rsz = vtk.new("ImageResize") rsz.SetResizeMethodToOutputDimensions() rsz.SetInputData(self.dataset) rsz.SetOutputDimensions(newdims) @@ -872,7 +872,7 @@ def resize(self, *newdims): def normalize(self): """Normalize that scalar components for each point.""" - norm = vtk.get("ImageNormalize")() + norm = vtk.new("ImageNormalize") norm.SetInputData(self.dataset) norm.Update() self._update(norm.GetOutput()) @@ -885,7 +885,7 @@ def mirror(self, axis="x"): """ img = self.dataset - ff = vtk.get("ImageFlip")() + ff = vtk.new("ImageFlip") ff.SetInputData(img) if axis.lower() == "x": ff.SetFilteredAxis(0) @@ -921,24 +921,24 @@ def operation(self, operation, volume2=None): mf = None if op in ["median"]: - mf = vtk.get("ImageMedian3D")() + mf = vtk.new("ImageMedian3D") mf.SetInputData(image1) elif op in ["mag"]: - mf = vtk.get("ImageMagnitude")() + mf = vtk.new("ImageMagnitude") mf.SetInputData(image1) elif op in ["dot", "dotproduct"]: - mf = vtk.get("ImageDotProduct")() + mf = vtk.new("ImageDotProduct") mf.SetInput1Data(image1) mf.SetInput2Data(volume2.dataset) elif op in ["grad", "gradient"]: - mf = vtk.get("ImageGradient")() + mf = vtk.new("ImageGradient") mf.SetDimensionality(3) mf.SetInputData(image1) elif op in ["div", "divergence"]: - mf = vtk.get("ImageDivergence")() + mf = vtk.new("ImageDivergence") mf.SetInputData(image1) elif op in ["laplacian"]: - mf = vtk.get("ImageLaplacian")() + mf = vtk.new("ImageLaplacian") mf.SetDimensionality(3) mf.SetInputData(image1) @@ -950,7 +950,7 @@ def operation(self, operation, volume2=None): ) return vol ########################### - mat = vtk.get("ImageMathematics")() + mat = vtk.new("ImageMathematics") mat.SetInput1Data(image1) K = None @@ -1046,13 +1046,13 @@ def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass - fft = vtk.get("ImageFFT")() + fft = vtk.new("ImageFFT") fft.SetInputData(self.dataset) fft.Update() out = fft.GetOutput() if high_cutoff: - blp = vtk.get("ImageButterworthLowPass")() + blp = vtk.new("ImageButterworthLowPass") blp.SetInputData(out) blp.SetCutOff(high_cutoff) blp.SetOrder(order) @@ -1060,18 +1060,18 @@ def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): out = blp.GetOutput() if low_cutoff: - bhp = vtk.get("ImageButterworthHighPass")() + bhp = vtk.new("ImageButterworthHighPass") bhp.SetInputData(out) bhp.SetCutOff(low_cutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() - rfft = vtk.get("ImageRFFT")() + rfft = vtk.new("ImageRFFT") rfft.SetInputData(out) rfft.Update() - ecomp = vtk.get("ImageExtractComponents")() + ecomp = vtk.new("ImageExtractComponents") ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() @@ -1091,7 +1091,7 @@ def smooth_gaussian(self, sigma=(2, 2, 2), radius=None): radius factor(s) determine how far out the gaussian kernel will go before being clamped to zero. A list can be given too. """ - gsf = vtk.get("ImageGaussianSmooth")() + gsf = vtk.new("ImageGaussianSmooth") gsf.SetDimensionality(3) gsf.SetInputData(self.dataset) if utils.is_sequence(sigma): @@ -1113,7 +1113,7 @@ def smooth_median(self, neighbours=(2, 2, 2)): Median filter that replaces each pixel with the median value from a rectangular neighborhood around that pixel. """ - imgm = vtk.get("ImageMedian3D")() + imgm = vtk.new("ImageMedian3D") imgm.SetInputData(self.dataset) if utils.is_sequence(neighbours): imgm.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) @@ -1134,7 +1134,7 @@ def erode(self, neighbours=(2, 2, 2)): ![](https://vedo.embl.es/images/volumetric/erode_dilate.png) """ - ver = vtk.get("ImageContinuousErode3D")() + ver = vtk.new("ImageContinuousErode3D") ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() @@ -1152,7 +1152,7 @@ def dilate(self, neighbours=(2, 2, 2)): Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) """ - ver = vtk.get("ImageContinuousDilate3D")() + ver = vtk.new("ImageContinuousDilate3D") ver.SetInputData(self.dataset) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() @@ -1162,7 +1162,7 @@ def dilate(self, neighbours=(2, 2, 2)): def magnitude(self): """Colapses components with magnitude function.""" - imgm = vtk.get("ImageMagnitude")() + imgm = vtk.new("ImageMagnitude") imgm.SetInputData(self.dataset) imgm.Update() self._update(imgm.GetOutput()) @@ -1178,7 +1178,7 @@ def topoints(self): Examples: - [vol2points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/vol2points.py) """ - v2p = vtk.get("ImageToPoints")() + v2p = vtk.new("ImageToPoints") v2p.SetInputData(self.dataset) v2p.Update() mpts = vedo.Points(v2p.GetOutput()) @@ -1204,7 +1204,7 @@ def euclidean_distance(self, anisotropy=False, max_distance=None): Examples: - [euclidian_dist.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/euclidian_dist.py) """ - euv = vtk.get("ImageEuclideanDistance")() + euv = vtk.new("ImageEuclideanDistance") euv.SetInputData(self.dataset) euv.SetConsiderAnisotropy(anisotropy) if max_distance is not None: @@ -1225,7 +1225,7 @@ def correlation_with(self, vol2, dim=2): The output size will match the size of the first input. The second input is considered the correlation kernel. """ - imc = vtk.get("ImageCorrelation")() + imc = vtk.new("ImageCorrelation") imc.SetInput1Data(self.dataset) imc.SetInput2Data(vol2.dataset) imc.SetDimensionality(dim) @@ -1237,7 +1237,7 @@ def correlation_with(self, vol2, dim=2): def scale_voxels(self, scale=1): """Scale the voxel content by factor `scale`.""" - rsl = vtk.get("ImageReslice")() + rsl = vtk.new("ImageReslice") rsl.SetInputData(self.dataset) rsl.SetScalarScale(scale) rsl.Update() diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index f91f1b4f..3182c644 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -37,8 +37,6 @@ def get_class(cls_name="", module_name=""): else: return module_cache[module_name] -def get(*args): - return get_class(*args) def new(cls_name="", module_name=""): """ @@ -96,6 +94,17 @@ def dump_hierarchy_to_file(fname=""): import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkRenderingVolumeOpenGL2 import ( + vtkOpenGLGPUVolumeRayCastMapper, + vtkSmartVolumeMapper, +) +for name in [ + "vtkOpenGLGPUVolumeRayCastMapper", + "vtkSmartVolumeMapper", +]: + location[name] = "vtkRenderingVolumeOpenGL2" + +###################################################################### for name in [ "vtkKochanekSpline", @@ -359,6 +368,7 @@ def dump_hierarchy_to_file(fname=""): "vtkPolyDataPlaneCutter" ]: location[name] = "vtkFiltersCore" + from vtkmodules.vtkFiltersCore import vtkGlyph3D @@ -842,16 +852,6 @@ def dump_hierarchy_to_file(fname=""): ]: location[name] = "vtkRenderingVolume" -from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLGPUVolumeRayCastMapper, - vtkSmartVolumeMapper, -) -for name in [ - "vtkOpenGLGPUVolumeRayCastMapper", - "vtkSmartVolumeMapper", -]: - location[name] = "vtkRenderingVolumeOpenGL2" - ######################################################### # print("successfully finished importing vtkmodules") ######################################################### \ No newline at end of file From 6d7f5e6ae9aa7dab0b997e3c451fcf76e8211da7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 31 Oct 2023 17:26:33 +0100 Subject: [PATCH 199/251] b/vedo/transformations.py docs --- vedo/transformations.py | 50 ++++++++++++++++++++++++++++------------- vedo/version.py | 2 +- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/vedo/transformations.py b/vedo/transformations.py index 036a16a6..9c32eabc 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -129,15 +129,15 @@ def __init__(self, T=None): matrix = np.eye(4) for l in lines: if l.startswith("#"): - self.comment = l.replace("#", "").replace("\n", "") + self.comment = l.replace("#", "").strip() continue vals = l.split(" ") - if len(vals) == 4: - for j in range(4): - v = vals[j].replace("\n", "") + print(vals) + for j in range(len(vals)): + v = vals[j].replace("\n", "") + if v != "": matrix[i, j] = float(v) - i += 1 - + i += 1 T = vtk.vtkTransform() m = vtk.vtkMatrix4x4() for i in range(4): @@ -157,10 +157,11 @@ def __str__(self): s += "\nFilename: " + self.filename if self.comment: s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' + if self.n_concatenated_transforms > 1: + s += f"\Concatenations: {self.n_concatenated_transforms}" if self.inverse_flag: s += "\nInverse transformation flag is True" s += "\n" + str(self.matrix) - s += f"\n({self.n_concatenated_transforms} concatenated transforms)" return s def __repr__(self): @@ -550,7 +551,7 @@ def __init__(self, T=None, **kwargs): Can be saved to file and reloaded. Arguments: - T : (vtk.vtkThinPlateSplineTransform, str, dict) + T : (vtkThinPlateSplineTransform, str, dict) vtk transformation. If T is a string, it is assumed to be a filename. If T is a dictionary, it is assumed to be a set of keyword arguments. @@ -563,7 +564,27 @@ def __init__(self, T=None, **kwargs): - source_points : (list) source points - target_points : (list) target points - mode : (str) either '2d' or '3d' - - sigma : (float) sigma parameter + - sigma : (float) sigma parameter + + Example: + ```python + from vedo import * + settings.use_parallel_projection = True + + NLT = NonLinearTransform() + NLT.source_points = [[-2,0,0], [1,2,1], [2,-2,2]] + NLT.target_points = NLT.source_points + np.random.randn(3,3)*0.5 + NLT.mode = '3d' + print(NLT) + + s1 = Sphere() + NLT.move(s1) + # same as: + # s1.apply_transform(NLT) + + arrs = Arrows(NLT.source_points, NLT.target_points) + show(s1, arrs, Sphere().alpha(0.1), axes=1).close() + ``` """ self.name = "NonLinearTransform" @@ -654,20 +675,19 @@ def __init__(self, T=None, **kwargs): self.inverse_flag = False def __str__(self): - s = f"\x1b[7m\x1b[1mNon-Linear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m" - s = self.__class__.__name__ + ":\n" + s = f"\x1b[7m\x1b[1mNon-Linear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m\n" if self.filename: s += "Filename: " + self.filename + "\n" if self.name: s += "Name : " + self.name + "\n" if self.comment: s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' - s += f"Mode : {self.mode}\n" - s += f"Sigma : {self.sigma}\n" + s += f"Mode : {self.mode}\n" + s += f"Sigma : {self.sigma}\n" p = self.source_points q = self.target_points - s += f"Sources: {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" - s += f"Targets: {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" + s += f"Sources : {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" + s += f"Targets : {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" return s def __repr__(self): diff --git a/vedo/version.py b/vedo/version.py index ed727bb4..60d615e8 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev25a' +_version = '2023.5.0+dev26a' From 51764c0c9df73f7c88fc8002bccaa629e6daef79 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 31 Oct 2023 17:52:07 +0100 Subject: [PATCH 200/251] trick to run all examples in silent mode by adding settings.dry_run_mode --- .../snippets/test_closewindow.py | 0 vedo/file_io.py | 27 +++++-------------- vedo/plotter.py | 22 +++++++++++++-- vedo/settings.py | 10 ++++--- 4 files changed, 34 insertions(+), 25 deletions(-) rename examples/basic/closewindow.py => tests/snippets/test_closewindow.py (100%) diff --git a/examples/basic/closewindow.py b/tests/snippets/test_closewindow.py similarity index 100% rename from examples/basic/closewindow.py rename to tests/snippets/test_closewindow.py diff --git a/vedo/file_io.py b/vedo/file_io.py index dc2643af..d6462fc6 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1506,32 +1506,19 @@ def export_window(fileoutput, binary=False): #################################################################### elif fr.endswith(".x3d"): - obj = list(set(vedo.plotter_instance.get_meshes() + vedo.plotter_instance.actors)) - if vedo.plotter_instance.axes_instances: - obj.append(vedo.plotter_instance.axes_instances[0]) + obj = vedo.plotter_instance.get_actors() + # if vedo.plotter_instance.axes_instances: + # obj.append(vedo.plotter_instance.axes_instances[0]) for a in obj: if isinstance(a, Mesh): - newa = a.clone(transformed=True) - vedo.plotter_instance.remove(a).add(newa) + # newa = a.clone() + # vedo.plotter_instance.remove(a).add(newa) + pass elif isinstance(a, Assembly): vedo.plotter_instance.remove(a) - for b in a.unpack(): - if b: - if a.name == "Axes": - newb = b.clone(transformed=True) - else: - # newb = b.clone(transformed=True) # BUG?? - - newb = b.clone(transformed=False) - tt = vtk.vtkTransform() - tt.Concatenate(a.GetMatrix()) - tt.Concatenate(b.GetMatrix()) - newb.PokeMatrix(vtk.vtkMatrix4x4()) - newb.SetUserTransform(tt) - - vedo.plotter_instance.add(newb) + vedo.plotter_instance.add(a.unpack()) vedo.plotter_instance.render() diff --git a/vedo/plotter.py b/vedo/plotter.py index 00e5df51..b9ed3bbc 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -251,6 +251,9 @@ def show( bg2=bg2, ) + if settings.dry_run_mode >= 2: + return plt + # use _plt_to_return because plt.show() can return a k3d plot _plt_to_return = None @@ -975,6 +978,10 @@ def pop(self, at=None): def render(self, resetcam=False): """Render the scene. This method is typically used in loops or callback functions.""" + + if settings.dry_run_mode >= 2: + return self + if not self.window: return self @@ -1008,6 +1015,8 @@ def interactive(self): Start window interaction. Analogous to `show(..., interactive=True)`. """ + if settings.dry_run_mode >= 1: + return self self.initialize_interactor() if self.interactor: self.interactor.Start() @@ -2533,7 +2542,10 @@ def func(evt): from vtkmodules.util.misc import calldata_type if not self.interactor: - return None + return 0 + + if settings.dry_run_mode >= 1: + return 0 ######################################### @calldata_type(vtk.VTK_INT) @@ -3029,6 +3041,10 @@ def show( screenshot : (str) save a screenshot of the window to file """ + + if settings.dry_run_mode >= 2: + return self + if self.wx_widget: return self @@ -3415,6 +3431,9 @@ def close_window(self): self.hint_widget = None self.cutter_widget = None + if settings.dry_run_mode >= 2: + return self + for r in self.renderers: r.RemoveAllObservers() if hasattr(self, "window") and self.window: @@ -3425,7 +3444,6 @@ def close_window(self): except AttributeError: pass self.interactor.TerminateApp() - # self.interactor = None self.window.Finalize() # this must be done here diff --git a/vedo/settings.py b/vedo/settings.py index 17469ff8..67fbf198 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -133,7 +133,6 @@ class Settings: # Restrict the attributes so accidental typos will generate an AttributeError exception __slots__ = [ - "_level", "default_font", "default_backend", "palette", @@ -189,11 +188,16 @@ class Settings: "k3d_point_shader", "k3d_line_shader", "font_parameters", + "dry_run_mode", ] - def __init__(self, level=0): + def __init__(self): - self._level = level + # Dry run mode (for test purposes only) + # 0 = normal + # 1 = do not hold execution + # 2 = do not show any window + self.dry_run_mode = 0 # Default font self.default_font = "Normografo" From 15b8dcc2332a46b73ce12f650218412a80087261 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 31 Oct 2023 19:04:23 +0100 Subject: [PATCH 201/251] fix ugrid scalarbar --- examples/volumetric/tet_cut2.py | 5 ++-- vedo/__init__.py | 2 +- vedo/addons.py | 6 ++--- vedo/backends.py | 8 ------ vedo/file_io.py | 44 ++++++--------------------------- vedo/plotter.py | 16 +++++++----- 6 files changed, 24 insertions(+), 57 deletions(-) diff --git a/examples/volumetric/tet_cut2.py b/examples/volumetric/tet_cut2.py index 3483b79b..46bc1221 100644 --- a/examples/volumetric/tet_cut2.py +++ b/examples/volumetric/tet_cut2.py @@ -17,15 +17,14 @@ # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True).cmap("jet") - # Cut tetm, but the output will keep only the tets on the boundary: tetm3 = tetm.clone().cut_with_mesh(sphere, only_boundary=True) -tetm3.cmap("jet").add_scalarbar3d(c='k') +tetm3.cmap("bone").add_scalarbar3d() show([ (msh1, sphere, __doc__), (tetm2.tomesh(), "Keep only tets that lie\ncompletely outside the Sphere"), - (tetm3.tomesh(), sphere, "Keep only tets that lie\nexactly on the Sphere"), + (tetm3, sphere, "Keep only tets that lie\nexactly on the Sphere"), ], N=3, axes=dict(xtitle='x in :mum'), diff --git a/vedo/__init__.py b/vedo/__init__.py index 9b260374..c6e55be2 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -22,7 +22,7 @@ from vedo.version import _version as __version__ from vedo.settings import Settings -settings = Settings(level=0) +settings = Settings() from vedo.colors import * from vedo.transformations import * diff --git a/vedo/addons.py b/vedo/addons.py index 9c7c40c6..03dc6882 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -865,7 +865,7 @@ def ScalarBar( if not lut: return None - elif isinstance(obj, (Volume, TetMesh)): + elif isinstance(obj, (Volume, TetMesh, vedo.UGrid)): lut = utils.ctf2lut(obj) elif utils.is_sequence(obj) and len(obj) == 2: @@ -1035,13 +1035,13 @@ def ScalarBar3D( lut = obj.mapper.GetLookupTable() vmin, vmax = lut.GetRange() - elif isinstance(obj, (Volume, TetMesh)): + elif isinstance(obj, (Volume, TetMesh, vedo.UGrid)): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() else: vedo.logger.error("in ScalarBar3D(): input must be a vedo object with bounds.") - return obj + return None bns = obj.bounds() sx, sy = size diff --git a/vedo/backends.py b/vedo/backends.py index 60cdaeed..d1674680 100644 --- a/vedo/backends.py +++ b/vedo/backends.py @@ -98,15 +98,7 @@ def start_k3d(actors2show): grid_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), label_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), axes_helper=settings.k3d_axes_helper, - # axes_helper_colors=[_rgb2int(vedo.get_color("red5")), # not working - # _rgb2int(vedo.get_color("green5")), - # _rgb2int(vedo.get_color("blue5"))], ) - # vedo.notebook_plotter.axes_helper_colors = [ - # vedo.backends._rgb2int(vedo.get_color("red5")), # not working - # vedo.backends._rgb2int(vedo.get_color("green5")), - # vedo.backends._rgb2int(vedo.get_color("blue5")) - # ] # set k3d camera vedo.notebook_plotter.camera_auto_fit = settings.k3d_camera_autofit diff --git a/vedo/file_io.py b/vedo/file_io.py index d6462fc6..d73ed4dd 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -46,7 +46,7 @@ # example web page for X3D -_x3d_html = """ +_x3d_html_template = """ @@ -1510,15 +1510,10 @@ def export_window(fileoutput, binary=False): # if vedo.plotter_instance.axes_instances: # obj.append(vedo.plotter_instance.axes_instances[0]) - for a in obj: - if isinstance(a, Mesh): - # newa = a.clone() - # vedo.plotter_instance.remove(a).add(newa) - pass - - elif isinstance(a, Assembly): - vedo.plotter_instance.remove(a) - vedo.plotter_instance.add(a.unpack()) + # for a in obj: + # if isinstance(a, Assembly): + # vedo.plotter_instance.remove(a) + # vedo.plotter_instance.add(a.unpack()) vedo.plotter_instance.render() @@ -1531,43 +1526,20 @@ def export_window(fileoutput, binary=False): exporter.Update() exporter.Write() - # this can reduce the size by more than half... - # outstring = exporter.GetOutputString().decode("utf-8") # this fails though - # from vedo.utils import isInteger, isNumber, precision - # newlines = [] - # for l in outstring.splitlines(True): - # ls = l.lstrip() - # content = ls.split() - # newls = "" - # for c in content: - # c2 = c.replace(',','') - # if isNumber(c2) and not isInteger(c2): - # newc = precision(float(c2), 4) - # if ',' in c: - # newls += newc + ',' - # else: - # newls += newc + ' ' - # else: - # newls += c + ' ' - # newlines.append(newls.lstrip()+'\n') - # with open("fileoutput", 'w', encoding='UTF-8') as f: - # l = "".join(newlines) - # f.write(l) - - x3d_html = _x3d_html.replace("~fileoutput", fileoutput) + x3d_html = _x3d_html_template.replace("~fileoutput", fileoutput) wsize = vedo.plotter_instance.window.GetSize() x3d_html = x3d_html.replace("~width", str(wsize[0])) x3d_html = x3d_html.replace("~height", str(wsize[1])) with open(fileoutput.replace(".x3d", ".html"), "w", encoding="UTF-8") as outF: outF.write(x3d_html) - vedo.logger.info(f"Saved files {fileoutput} and {fileoutput.replace('.x3d','.html')}") #################################################################### elif fr.endswith(".html"): savebk = vedo.notebook_backend vedo.notebook_backend = "k3d" vedo.settings.default_backend = "k3d" - plt = vedo.backends.get_notebook_backend(vedo.plotter_instance.actors) + # acts = vedo.plotter_instance.get_actors() + plt = vedo.backends.get_notebook_backend(vedo.plotter_instance.objects) with open(fileoutput, "w", encoding="UTF-8") as fp: fp.write(plt.get_snapshot()) diff --git a/vedo/plotter.py b/vedo/plotter.py index b9ed3bbc..04606ab0 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3415,11 +3415,7 @@ def user_mode(self, mode): return self def close_window(self): - """Close the current or the input rendering window. - - Examples: - - [closewindow.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/closewindow.py) - """ + """Close the current or the input rendering window.""" vedo.last_figure = None self.sliders = [] self.buttons = [] @@ -4224,7 +4220,15 @@ def _keypress(self, iren, event): elif key == "F": vedo.file_io.export_window("scene.x3d") - vedo.printc(":idea: Try: firefox scene.html", c="b") + vedo.printc(r":camera: Exporting 3D window to file", c="b", end="") + vedo.file_io.export_window("scene.npz") + vedo.printc(". Try:\n> firefox scene.html", c="b") + + # elif key == "G": # not working with last version of k3d + # vedo.file_io.export_window("scene.html") + # vedo.printc(r":camera: Exporting K3D window to file", c="b", end="") + # vedo.file_io.export_window("scene.html") + # vedo.printc(". Try:\n> firefox scene.html", c="b") elif key == "i": # print info if self.clicked_object: From de9a47413a14f10502e80df238ae5ca3d46870dd Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 31 Oct 2023 21:02:21 +0100 Subject: [PATCH 202/251] fix a couple of bugs --- vedo/core.py | 4 ++-- vedo/file_io.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index b11e70b8..6160200a 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1338,7 +1338,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): if LT.is_identity(): return self - elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform, np.ndarray)): + elif isinstance(LT, (vtk.vtkMatrix4x4, vtk.vtkLinearTransform)) or utils.is_sequence(LT): LT_is_linear = True LT = LinearTransform(LT) tr = LT.T @@ -1356,7 +1356,7 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.transform = NonLinearTransform(LT) # reset else: - vedo.logger.error("apply_transform(), unknown input type", type(LT)) + vedo.logger.error(f"apply_transform(), unknown input type:\n{LT}") return self ################ diff --git a/vedo/file_io.py b/vedo/file_io.py index d73ed4dd..29e92edc 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1311,7 +1311,7 @@ def write(objct, fileoutput, binary=True): for p in objct.vertices: outF.write("v {:.5g} {:.5g} {:.5g}\n".format(*p)) - ptxt = objct.GetPointData().GetTCoords() + ptxt = objct.dataset.GetPointData().GetTCoords() if ptxt: ntxt = utils.vtk2numpy(ptxt) for vt in ntxt: From 7a0157503fb6198859cdddd34ae17e60d7fc3c65 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 1 Nov 2023 14:36:46 +0100 Subject: [PATCH 203/251] improvements to volume.py, remove visuals from init --- examples/volumetric/numpy2volume2.py | 6 +- vedo/core.py | 1 - vedo/volume.py | 235 +++++++++++++-------------- 3 files changed, 119 insertions(+), 123 deletions(-) diff --git a/examples/volumetric/numpy2volume2.py b/examples/volumetric/numpy2volume2.py index a3ede4a6..3262b0e9 100644 --- a/examples/volumetric/numpy2volume2.py +++ b/examples/volumetric/numpy2volume2.py @@ -7,10 +7,12 @@ data_matrix[30:50, 30:60, 30:70] = 2 data_matrix[50:70, 60:80, 70:90] = 3 -vol = Volume(data_matrix, c=['white','b','g','r'], mode=1) +vol = Volume(data_matrix) +vol.cmap(['white','b','g','r']).mode(1) vol.add_scalarbar3d() -# optionally mask some parts of the volume (needs mapper='gpu'): +# optionally mask some parts of the volume +# vol.mapper = 'gpu' # data_mask = np.zeros_like(data_matrix) # data_mask[10:65, 10:65, 20:75] = 1 # vol.mask(data_mask) diff --git a/vedo/core.py b/vedo/core.py index 6160200a..bb9805bf 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1456,7 +1456,6 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ - # self.rotate(angle, axis, point, rad) LT = LinearTransform() LT.rotate(angle, axis, point, rad) return self.apply_transform(LT) diff --git a/vedo/volume.py b/vedo/volume.py index 8f8ee6cd..042a481b 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -7,6 +7,7 @@ import vedo.vtkclasses as vtk import vedo +from vedo import transformations from vedo import utils from vedo.mesh import Mesh from vedo.core import VolumeAlgorithms @@ -27,77 +28,27 @@ ########################################################################## class Volume(VolumeVisual, VolumeAlgorithms): """ - Class to describe dataset that are defined on "voxels": + Class to describe dataset that are defined on "voxels", the 3D equivalent of 2D pixels. """ - def __init__( self, inputobj=None, - c="RdBu_r", - alpha=(0.0, 0.0, 0.2, 0.4, 0.8, 1.0), - alpha_gradient=None, - alpha_unit=1, - mode=0, - spacing=None, dims=None, origin=None, - mapper="smart", + spacing=None, ): """ - This class can be initialized with a numpy object, a `vtkImageData` - or a list of 2D bmp files. + This class can be initialized with a numpy object, + a `vtkImageData` or a list of 2D bmp files. Arguments: - c : (list, str) - sets colors along the scalar range, or a matplotlib color map name - alphas : (float, list) - sets transparencies along the scalar range - alpha_unit : (float) - low values make composite rendering look brighter and denser origin : (list) set volume origin coordinates spacing : (list) voxel dimensions in x, y and z. dims : (list) specify the dimensions of the volume. - mapper : (str) - either 'gpu', 'opengl_gpu', 'fixed' or 'smart' - mode : (int) - define the volumetric rendering style: - - 0, composite rendering - - 1, maximum projection - - 2, minimum projection - - 3, average projection - - 4, additive mode - -
The default mode is "composite" where the scalar values are sampled through - the volume and composited in a front-to-back scheme through alpha blending. - The final color and opacity is determined using the color and opacity transfer - functions specified in alpha keyword. - - Maximum and minimum intensity blend modes use the maximum and minimum - scalar values, respectively, along the sampling ray. - The final color and opacity is determined by passing the resultant value - through the color and opacity transfer functions. - - Additive blend mode accumulates scalar values by passing each value - through the opacity transfer function and then adding up the product - of the value and its opacity. In other words, the scalar values are scaled - using the opacity transfer function and summed to derive the final color. - Note that the resulting image is always grayscale i.e. aggregated values - are not passed through the color transfer function. - This is because the final value is a derived value and not a real data value - along the sampling ray. - - Average intensity blend mode works similar to the additive blend mode where - the scalar values are multiplied by opacity calculated from the opacity - transfer function and then added. - The additional step here is to divide the sum by the number of samples - taken through the volume. - As is the case with the additive intensity projection, the final image will - always be grayscale i.e. the aggregated values are not passed through the - color transfer function. Example: ```python @@ -119,42 +70,23 @@ def __init__( if a `list` of values is used for `alphas` this is interpreted as a transfer function along the range of the scalar. """ + self.name = "Volume" + self.filename = "" + self.info = {} + self.actor = vtk.vtkVolume() self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() - self.dataset = None - self.mapper = None - self.pipeline = None - self.info = {} - self.name = "Volume" - self.filename = "" ################### if isinstance(inputobj, str): if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath elif os.path.isfile(inputobj): - pass + self.filename = inputobj else: inputobj = sorted(glob.glob(inputobj)) - ################### - if "gpu" in mapper: - self.mapper = vtk.new("GPUVolumeRayCastMapper") - elif "opengl_gpu" in mapper: - self.mapper = vtk.new("OpenGLGPUVolumeRayCastMapper") - elif "smart" in mapper: - self.mapper = vtk.new("SmartVolumeMapper") - elif "fixed" in mapper: - self.mapper = vtk.new("FixedPointVolumeRayCastMapper") - elif isinstance(mapper, vtk.get_class("Mapper")): - self.mapper = mapper - else: - print("Error unknown mapper type", [mapper]) - raise RuntimeError() - - self.actor.SetMapper(self.mapper) - ################### inputtype = str(type(inputobj)) @@ -172,7 +104,7 @@ def __init__( pb = utils.ProgressBar(0, len(inputobj)) for i in pb.range(): f = inputobj[i] - if "_rec_spr.bmp" in f: + if "_rec_spr" in f: # OPT specific continue picr = vtk.new("BMPReader") picr.SetFileName(f) @@ -220,27 +152,63 @@ def __init__( img.SetDimensions(dims) if origin is not None: - img.SetOrigin(origin) ### DIFFERENT from volume.origin()! + img.SetOrigin(origin) if spacing is not None: img.SetSpacing(spacing) self.dataset = img - self.mapper.SetInputData(img) + self.transform = None + + ##################################### + mapper = vtk.new("SmartVolumeMapper") + mapper.SetInputData(img) + self.actor.SetMapper(mapper) if img.GetPointData().GetScalars(): if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: - self.mode(mode).color(c).alpha(alpha).alpha_gradient(alpha_gradient) self.properties.SetShade(True) self.properties.SetInterpolationType(1) - self.properties.SetScalarOpacityUnitDistance(alpha_unit) - + self.cmap("RdBu_r") + self.alpha([0.0, 0.0, 0.2, 0.4, 0.8, 1.0]) + self.alpha_gradient(None) + self.properties.SetScalarOpacityUnitDistance(1.0) self.pipeline = utils.OperationNode( "Volume", comment=f"dims={tuple(self.dimensions())}", c="#4cc9f0" ) ####################################################################### + @property + def mapper(self): + """Return the underlying `vtkMapper` object.""" + return self.actor.GetMapper() + + @mapper.setter + def mapper(self, mapper): + """ + Set the underlying `vtkMapper` object. + + Arguments: + mapper : (str, vtkMapper) + either 'gpu', 'opengl_gpu', 'fixed' or 'smart' + """ + if "gpu" in mapper: + mapper = vtk.new("GPUVolumeRayCastMapper") + elif "opengl_gpu" in mapper: + mapper = vtk.new("OpenGLGPUVolumeRayCastMapper") + elif "smart" in mapper: + mapper = vtk.new("SmartVolumeMapper") + elif "fixed" in mapper: + mapper = vtk.new("FixedPointVolumeRayCastMapper") + elif isinstance(mapper, vtk.get_class("Mapper")): + pass + else: + print("Error unknown mapper type", [mapper]) + raise RuntimeError() + self.actor.SetMapper(mapper) + + def _update(self, data): self.dataset = data self.mapper.SetInputData(data) @@ -303,7 +271,7 @@ def _repr_html_(self): name = self.dataset.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" - img = self.mapper.GetInput() + img = self.dataset allt = [ "", @@ -428,8 +396,6 @@ def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): vslice.SetInputData(reslice.GetOutput()) vslice.Update() msh = Mesh(vslice.GetOutput()) - # msh.SetOrientation(T.GetOrientation()) - # msh.SetPosition(pos) msh.apply_transform(T) msh.pipeline = utils.OperationNode("slice_plane", parents=[self], c="#4cc9f0:#e9c46a") return msh @@ -452,36 +418,14 @@ def warp(self, source, target, sigma=1, mode="3d", fit=False): if isinstance(target, vedo.Points): target = target.vertices - ns = len(source) - ptsou = vtk.vtkPoints() - ptsou.SetNumberOfPoints(ns) - for i in range(ns): - ptsou.SetPoint(i, source[i]) - - nt = len(target) - if ns != nt: - vedo.logger.error(f"#source {ns} != {nt} #target points") - raise RuntimeError() - - pttar = vtk.vtkPoints() - pttar.SetNumberOfPoints(nt) - for i in range(ns): - pttar.SetPoint(i, target[i]) - - T = vtk.vtkThinPlateSplineTransform() - if mode.lower() == "3d": - T.SetBasisToR() - elif mode.lower() == "2d": - T.SetBasisToR2LogR() - else: - vedo.logger.error(f"unknown mode {mode}") - raise RuntimeError() + NLT = transformations.NonLinearTransform() + NLT.source_points = source + NLT.target_points = target + NLT.sigma = sigma + NLT.mode = mode + NLT.invert() - T.SetSigma(sigma) - T.SetSourceLandmarks(ptsou) - T.SetTargetLandmarks(pttar) - T.Inverse() - self.apply_transform(T, fit=fit) + self.apply_transform(NLT, fit=fit) self.pipeline = utils.OperationNode("warp", parents=[self], c="#4cc9f0") return self @@ -495,6 +439,9 @@ def apply_transform(self, T, fit=False): fit : (bool) fit/adapt the old bounding box to the warped geometry """ + if isinstance(T, transformations.NonLinearTransform): + T = T.T + if isinstance(T, vtk.vtkMatrix4x4): tr = vtk.vtkTransform() tr.SetMatrix(T) @@ -513,6 +460,7 @@ def apply_transform(self, T, fit=False): reslice = vtk.new("ImageReslice") reslice.SetInputData(self.dataset) reslice.SetResliceTransform(T) + self.transform = T reslice.SetOutputDimensionality(3) reslice.SetInterpolationModeToLinear() @@ -557,6 +505,22 @@ def imagedata(self): """ print("Volume.imagedata() is deprecated, use Volume.dataset instead") return self.dataset + + def modified(self): + """ + Mark the object as modified. + + Example: + ```python + from vedo import Volume + vol = Volume("path/to/mydata/data.tif") + arr = vol.tonumpy() + arr[:] = arr*2 + 15 + vol.modified() + ``` + """ + self.dataset.GetPointData().GetScalars().Modified() + return self def tonumpy(self): """ @@ -569,7 +533,7 @@ def tonumpy(self): `arr[:] = arr*2 + 15` If the array is modified add a call to: - `volume.dataset.GetPointData().GetScalars().Modified()` + `volume.modified()` when all your modifications are completed. """ narray_shape = tuple(reversed(self.dataset.GetDimensions())) @@ -588,6 +552,11 @@ def tonumpy(self): return narray + @property + def shape(self): + """Return the nr. of voxels in the 3 dimensions.""" + return np.array(self.dataset.GetDimensions()) + def dimensions(self): """Return the nr. of voxels in the 3 dimensions.""" return np.array(self.dataset.GetDimensions()) @@ -604,9 +573,15 @@ def spacing(self, s=None): return np.array(self.dataset.GetSpacing()) def origin(self, s=None): - """Set/get the origin of the volumetric dataset.""" - ### supersedes base.origin() - ### DIFFERENT from base.origin()! + """ + Set/get the origin of the volumetric dataset. + + The origin is the position in world coordinates of the point index (0,0,0). + This point does not have to be part of the dataset, in other words, + the dataset extent does not have to start at (0,0,0) and the origin + can be outside of the dataset bounding box. + The origin plus spacing determine the position in space of the points. + """ if s is not None: self.dataset.SetOrigin(s) return self @@ -618,6 +593,26 @@ def center(self, p=None): self.dataset.SetCenter(p) return self return np.array(self.dataset.GetCenter()) + + def get_cell_from_ijk(self, ijk): + """ + Get the voxel id number at the given ijk coordinates. + + Arguments: + ijk : (list) + the ijk coordinates of the voxel + """ + return self.ComputeCellId(ijk) + + def get_point_from_ijk(self, ijk): + """ + Get the point id number at the given ijk coordinates. + + Arguments: + ijk : (list) + the ijk coordinates of the voxel + """ + return self.ComputePointId(ijk) def permute_axes(self, x, y, z): """ From 555d5e69b5a64ee6e79f4683a038b37a9892f3f7 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 1 Nov 2023 21:47:22 +0100 Subject: [PATCH 204/251] add transorfm.update() --- examples/basic/mousehover1.py | 7 +++---- vedo/addons.py | 2 +- vedo/transformations.py | 5 +++++ vedo/version.py | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/basic/mousehover1.py b/examples/basic/mousehover1.py index 954b1a9e..337c1618 100644 --- a/examples/basic/mousehover1.py +++ b/examples/basic/mousehover1.py @@ -7,7 +7,6 @@ def func(evt): ### called every time mouse moves! msh = evt.object # get the mesh that triggered the event if not msh: return # mouse hits nothing, return. - pt = evt.picked3d # 3d coords of point under mouse pid = msh.closest_point(pt, return_point_id=True) txt =(f"Point: {precision(pt[:2] ,2)}\n" @@ -17,8 +16,9 @@ def func(evt): ### called every time mouse moves! ar = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') fp = msh.flagpole( - txt, point=pt, offset=(0.4,0.6), s=0.04, c='k', font="VictorMono", - ).follow_camera() # make it always face the camera + txt, point=pt,s=0.04, c='k', font="VictorMono", + ) + fp.follow_camera() # make it always face the camera plt.remove("FlagPole").add(ar, fp) # remove the old flagpole, add the new plt.render() @@ -26,7 +26,6 @@ def func(evt): ### called every time mouse moves! hil = ParametricShape('RandomHills').cmap('terrain').add_scalarbar() arr = hil.pointdata["Scalars"] # numpy array with heights -settings.use_parallel_projection = True # avoid perspective effects plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse move', func) # add the callback function plt.add_callback('keyboard', lambda _: plt.remove("Arrow").render()) diff --git a/vedo/addons.py b/vedo/addons.py index 03dc6882..1d0ff2a3 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -4266,7 +4266,7 @@ def add_global_axes(axtype=None, c=None, bounds=()): except TypeError: try: ocf.SetInputData(largestact.dataset) - except TypeError: + except (TypeError, AttributeError): return ocf.Update() diff --git a/vedo/transformations.py b/vedo/transformations.py index 9c32eabc..05064e8a 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -693,6 +693,11 @@ def __str__(self): def __repr__(self): return self.__str__() + def update(self): + """Update transformation.""" + self.T.Update() + return self + @property def position(self): """ diff --git a/vedo/version.py b/vedo/version.py index 60d615e8..3a77e80e 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev26a' +_version = '2023.5.0+dev27a' From 5572f44c78b9480a947cff31513a3636ba35ae4f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 18:02:07 +0100 Subject: [PATCH 205/251] new print(Points/Mesh) --- docs/changes.md | 18 ------ vedo/mesh.py | 39 ------------ vedo/pointcloud.py | 97 +++++++++++++++++++++++++++- vedo/utils.py | 156 +++++---------------------------------------- 4 files changed, 113 insertions(+), 197 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 4562fd8a..90c7209c 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -46,8 +46,6 @@ see `examples/pyplot/embed_matplotlib.py`. - added `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz - - ------------------------- ## New/Revised Examples ``` @@ -71,27 +69,11 @@ examples/simulations/springs_fem.py ### Broken Examples ``` -tests/issues/discussion_751.py tests/issues/discussion_800.py tests/issues/issue_905.py -slice_plane1.py - -background_image.py - gyroscope1.py broken tet_cut2.py broken markpoint.py plot_spheric.py - ``` - -### TODO -- TextBase maybe useless can go into Actor2D -- Mesh([points, faces, lines]) -- reimplement actor rotations, - try disable .position .rotations to check -- revisit splines and other widgets -- merge does something strange with flagpost -- analysis_plots.visualize_clones_as_timecourse_with_fit not working -- load series as animation viewer diff --git a/vedo/mesh.py b/vedo/mesh.py index 4acbaf6f..d2102170 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -698,45 +698,6 @@ def shrink(self, fraction=0.85): self.pipeline = OperationNode("shrink", parents=[self]) return self - # def stretch(self, q1, q2): - # """ - # Stretch mesh between points `q1` and `q2`. - - # .. note:: - # for `Mesh` objects, two vectors `mesh.base`, and `mesh.top` must be defined. - # """ - # if self.base is None: - # vedo.logger.error("in stretch() must define vectors mesh.base and mesh.top at creation") - # raise RuntimeError() - - # p1, p2 = self.base, self.top - # q1, q2, z = np.asarray(q1), np.asarray(q2), np.array([0, 0, 1]) - # a = p2 - p1 - # b = q2 - q1 - # plength = np.linalg.norm(a) - # qlength = np.linalg.norm(b) - # T = vtk.vtkTransform() - # T.PostMultiply() - # T.Translate(-p1) - # cosa = np.dot(a, z) / plength - # n = np.cross(a, z) - # if np.linalg.norm(n): - # T.RotateWXYZ(np.rad2deg(np.arccos(cosa)), n) - # T.Scale(1, 1, qlength / plength) - - # cosa = np.dot(b, z) / qlength - # n = np.cross(b, z) - # if np.linalg.norm(n): - # T.RotateWXYZ(-np.rad2deg(np.arccos(cosa)), n) - # else: - # if np.dot(b, z) < 0: - # T.RotateWXYZ(180, [1, 0, 0]) - - # T.Translate(q1) - - # self.apply_transform(T) - # return self - def cap(self, return_cap=False): """ Generate a "cap" on a clipped mesh, or caps sharp edges. diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 76a845b7..c84340dc 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -9,7 +9,7 @@ import vedo from vedo import colors from vedo import utils -from vedo.transformations import LinearTransform, NonLinearTransform +from vedo.transformations import LinearTransform from vedo.core import PointAlgorithms from vedo.visual import PointsVisual @@ -630,6 +630,101 @@ def _update(self, polydata, reset_locators=True): self.cell_locator = None return self + def __str__(self): + """Print a description of the Points/Mesh.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), + c="g", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\x1b[32;1m" + + if self.name: + out += "name".ljust(14) + ": " + self.name + if "legend" in self.info.keys() and self.info["legend"]: + out+= f", legend='{self.info['legend']}'" + out += "\n" + + if self.filename: + out+= "file name".ljust(14) + ": " + self.filename + "\n" + + if not self.mapper.GetScalarVisibility(): + col = utils.precision(self.properties.GetColor(), 3) + cname = vedo.colors.get_color_name(self.properties.GetColor()) + out+= "color".ljust(14) + ": " + cname + out+= f", rgb={col}, alpha={self.properties.GetOpacity()}\n" + if self.actor.GetBackfaceProperty(): + bcol = self.actor.GetBackfaceProperty().GetDiffuseColor() + cname = vedo.colors.get_color_name(bcol) + out+= "backface color".ljust(14) + ": " + out+= f"{cname}, rgb={utils.precision(bcol,3)}\n" + + npt = self.dataset.GetNumberOfPoints() + npo, nln = self.dataset.GetNumberOfPolys(), self.dataset.GetNumberOfLines() + out+= "elements".ljust(14) + f": vertices={npt:,} polys={npo:,} lines={nln:,}\n" + + out+= "position".ljust(14) + ": " + f"{utils.precision(self.pos(), 6)}\n" + out+= "scaling".ljust(14) + ": " + out+= utils.precision(self.transform.get_scale(), 6) + "\n" + + if self.npoints: + out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) + out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" + out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" + + bnds = self.bounds() + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + out+= "bounds".ljust(14) + ":" + out+= " x=(" + bx1 + ", " + bx2 + ")," + out+= " y=(" + by1 + ", " + by2 + ")," + out+= " z=(" + bz1 + ", " + bz2 + ")\n" + + for key in self.pointdata.keys(): + arr = self.pointdata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "pointdata" + if self.dataset.GetPointData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetPointData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetPointData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.celldata.keys(): + arr = self.celldata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "celldata" + if self.dataset.GetCellData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetCellData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetCellData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.metadata.keys(): + arr = self.metadata[key] + out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' + + if self.picked3d is not None: + idp = self.closest_point(self.picked3d, return_point_id=True) + idc = self.closest_point(self.picked3d, return_cell_id=True) + out+= "clicked point".ljust(14) + ": " + utils.precision(self.picked3d, 6) + out+= f", pointID={idp}, cellID={idc}\n" + + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print a description of the Points/Mesh.""" + print(self.__str__()) + return self + def _repr_html_(self): """ HTML representation of the Point cloud object for Jupyter Notebooks. diff --git a/vedo/utils.py b/vedo/utils.py index af1f58b5..6f051e6e 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1464,149 +1464,27 @@ def _print_data(poly, c): vedo.printc("mesh data".ljust(14) + ":", c=c, bold=True, end=" ") vedo.printc("no point or cell data is present.", c=c, bold=False) - ################################ - def _print_vtkactor(obj): - poly = obj.dataset - actor = obj.dataset - mapper = obj.mapper - pro = obj.properties - - if not obj.actor.GetPickable(): - return - - pro = obj.properties - pos = obj.pos() - bnds = obj.bounds() - col = precision(pro.GetColor(), 3) - alpha = pro.GetOpacity() - npt = poly.GetNumberOfPoints() - npl = poly.GetNumberOfPolys() - nln = poly.GetNumberOfLines() - - vedo.printc("Mesh/Points".ljust(70), c="g", bold=True, invert=True, dim=1, end="") - - if hasattr(actor, "info") and "legend" in actor.info.keys() and actor.info["legend"]: - vedo.printc("legend".ljust(14) + ": ", c="g", bold=True, end="") - vedo.printc(actor.info["legend"], c="g", bold=False) - else: - print() - - if hasattr(actor, "name") and actor.name: - vedo.printc("name".ljust(14) + ": ", c="g", bold=True, end="") - vedo.printc(actor.name, c="g", bold=False) - - if hasattr(actor, "filename") and actor.filename: - vedo.printc("file name".ljust(14) + ": ", c="g", bold=True, end="") - vedo.printc(actor.filename, c="g", bold=False) - - if not mapper.GetScalarVisibility(): - vedo.printc("color".ljust(14) + ": ", c="g", bold=True, end="") - cname = vedo.colors.get_color_name(pro.GetColor()) - vedo.printc(f"{cname}, rgb={col}, alpha={alpha}", c="g", bold=False) - - if obj.actor.GetBackfaceProperty(): - bcol = obj.actor.GetBackfaceProperty().GetDiffuseColor() - cname = vedo.colors.get_color_name(bcol) - vedo.printc("back color".ljust(14) + ": ", c="g", bold=True, end="") - vedo.printc(f"{cname}, rgb={precision(bcol,3)}", c="g", bold=False) - - vedo.printc("points".ljust(14) + ":", f"{npt:,}", c="g", bold=True) - # ncl = poly.GetNumberOfCells() - # vedo.printc("cells".ljust(14)+":", f"{ncl:,}", c="g", bold=True) - vedo.printc("polygons".ljust(14) + ":", f"{npl:,}", c="g", bold=True) - if nln: - vedo.printc("lines".ljust(14) + ":", f"{nln:,}", c="g", bold=True) - vedo.printc("position".ljust(14) + ":", pos, c="g", bold=True) - - if hasattr(actor, "GetScale"): - vedo.printc("scale".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc(precision(actor.GetScale(), 3), c="g", bold=False) - - if obj.npoints: - vedo.printc("center of mass".ljust(14) + ":", c="g", bold=True, end=" ") - cm = tuple(obj.center_of_mass()) - vedo.printc(precision(cm, 3), c="g", bold=False) - - vedo.printc("average size".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc(precision(obj.average_size(), 6), c="g", bold=False) - - vedo.printc("diagonal size".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc(precision(obj.diagonal_size(), 6), c="g", bold=False) - - bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - vedo.printc("bounds".ljust(14) + ":", c="g", bold=True, end=" ") - vedo.printc( "x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) - - _print_data(poly, "g") - - if hasattr(obj, "picked3d") and obj.picked3d is not None: - idpt = obj.closest_point(obj.picked3d, return_point_id=True) - idcell = obj.closest_point(obj.picked3d, return_cell_id=True) - vedo.printc( - "clicked point".ljust(14) + ":", - precision(obj.picked3d, 6), - f"pointID={idpt}, cellID={idcell}", - c="g", - bold=True, - ) if obj is None: return - if isinstance(obj, np.ndarray): - cf = "y" - vedo.printc("Numpy Array".ljust(70), c=cf, invert=True) - vedo.printc(obj, c=cf) - vedo.printc("shape".ljust(8) + ":", obj.shape, c=cf) - vedo.printc("range".ljust(8) + f": ({np.min(obj)}, {np.max(obj)})", c=cf) - vedo.printc("mean".ljust(8) + ":", np.mean(obj), c=cf) - vedo.printc("std_dev".ljust(8) + ":", np.std(obj), c=cf) - if len(obj.shape) >= 2: - vedo.printc("Axis 0".ljust(8) + ":", c=cf, italic=1) - vedo.printc("\tmin :", np.min(obj, axis=0), c=cf) - vedo.printc("\tmax :", np.max(obj, axis=0), c=cf) - vedo.printc("\tmean:", np.mean(obj, axis=0), c=cf) - if obj.shape[1] > 3: - vedo.printc("Axis 1".ljust(8) + ":", c=cf, italic=1) - tmin = str(np.min(obj, axis=1).tolist()[:2]).replace("]", ", ...") - tmax = str(np.max(obj, axis=1).tolist()[:2]).replace("]", ", ...") - tmea = str(np.mean(obj, axis=1).tolist()[:2]).replace("]", ", ...") - vedo.printc(f"\tmin : {tmin}", c=cf) - vedo.printc(f"\tmax : {tmax}", c=cf) - vedo.printc(f"\tmean: {tmea}", c=cf) - - elif isinstance(obj, vedo.Points): - _print_vtkactor(obj) - - elif isinstance(obj, vedo.Assembly): - vedo.printc("Assembly".ljust(75), c="g", bold=True, invert=True) - - pos = obj.GetPosition() - bnds = obj.GetBounds() - vedo.printc("position".ljust(14) + ": ", c="g", bold=True, end="") - vedo.printc(pos, c="g", bold=False) + # if isinstance(obj, vedo.Assembly): + # vedo.printc("Assembly".ljust(75), c="g", bold=True, invert=True) - vedo.printc("bounds".ljust(14) + ": ", c="g", bold=True, end="") - bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") - by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") - bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) + # pos = obj.GetPosition() + # bnds = obj.GetBounds() + # vedo.printc("position".ljust(14) + ": ", c="g", bold=True, end="") + # vedo.printc(pos, c="g", bold=False) - cl = vtk.vtkPropCollection() - obj.GetActors(cl) - cl.InitTraversal() - for _ in range(obj.GetNumberOfPaths()): - act = vtk.vtkActor.SafeDownCast(cl.GetNextProp()) - if isinstance(act, vtk.vtkActor): - _print_vtkactor(act) + # vedo.printc("bounds".ljust(14) + ": ", c="g", bold=True, end="") + # bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) + # vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") + # by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) + # vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") + # bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) + # vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) - elif isinstance(obj, vedo.TetMesh): + if isinstance(obj, vedo.TetMesh): ug = obj.dataset # cf = "m" # vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) @@ -1797,8 +1675,8 @@ def print_histogram( height=10, logscale=False, minbin=0, - horizontal=False, - char=" ", + horizontal=True, + char="\U00002589", c=None, bold=True, title="histogram", @@ -1863,7 +1741,7 @@ def print_histogram( data.append(d) data = np.array(data) - elif isinstance(data, vtk.vtkPolydata): + elif isinstance(data, vtk.vtkPolyData): arr = data.dataset.GetPointData().GetScalars() if not arr: arr = data.dataset.GetCellData().GetScalars() From 0b9e657e69c1931a26b309cac3326615e0a48581 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 18:25:47 +0100 Subject: [PATCH 206/251] new print(Assembly) --- vedo/assembly.py | 41 +++++++++++++++++++++++++++++++++++++++++ vedo/utils.py | 16 ---------------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index 514ce856..f54475f1 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -260,6 +260,47 @@ def __init__(self, *meshs): ) ########################################## + def __str__(self): + """Print info about Assembly object.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(id(self))})".ljust(75), + bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m" + + if self.name: + out += "name".ljust(14) + ": " + self.name + if "legend" in self.info.keys() and self.info["legend"]: + out+= f", legend='{self.info['legend']}'" + out += "\n" + + n = len(self.unpack()) + out += "n. of objects".ljust(14) + ": " + str(n) + " " + names = [a.name for a in self.unpack() if a.name] + if names: + out += str(names).replace("'","")[:56] + out += "\n" + + pos = self.GetPosition() + out += "position".ljust(14) + ": " + str(pos) + "\n" + + bnds = self.GetBounds() + bx1, bx2 = vedo.utils.precision(bnds[0], 3), vedo.utils.precision(bnds[1], 3) + by1, by2 = vedo.utils.precision(bnds[2], 3), vedo.utils.precision(bnds[3], 3) + bz1, bz2 = vedo.utils.precision(bnds[4], 3), vedo.utils.precision(bnds[5], 3) + out+= "bounds".ljust(14) + ":" + out+= " x=(" + bx1 + ", " + bx2 + ")," + out+= " y=(" + by1 + ", " + by2 + ")," + out+= " z=(" + bz1 + ", " + bz2 + ")\n" + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print info about Assembly object.""" + print(self.__str__()) + return self + def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. diff --git a/vedo/utils.py b/vedo/utils.py index 6f051e6e..6e8dda29 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1468,22 +1468,6 @@ def _print_data(poly, c): if obj is None: return - # if isinstance(obj, vedo.Assembly): - # vedo.printc("Assembly".ljust(75), c="g", bold=True, invert=True) - - # pos = obj.GetPosition() - # bnds = obj.GetBounds() - # vedo.printc("position".ljust(14) + ": ", c="g", bold=True, end="") - # vedo.printc(pos, c="g", bold=False) - - # vedo.printc("bounds".ljust(14) + ": ", c="g", bold=True, end="") - # bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - # vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") - # by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - # vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") - # bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - # vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) - if isinstance(obj, vedo.TetMesh): ug = obj.dataset # cf = "m" From 97aa7d94309be86602d7c06a21079f21e1cca0f8 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 18:47:09 +0100 Subject: [PATCH 207/251] new print(Volume) --- vedo/utils.py | 118 ++----------------------------------------------- vedo/volume.py | 41 +++++++++++++++++ 2 files changed, 44 insertions(+), 115 deletions(-) diff --git a/vedo/utils.py b/vedo/utils.py index 6e8dda29..ad24d8b2 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1390,81 +1390,6 @@ def grep(filename, tag, column=None, first_occurrence_only=False): def print_info(obj): """Print information about a `vedo` object.""" - def _print_data(poly, c): - ptdata = poly.GetPointData() - cldata = poly.GetCellData() - fldata = poly.GetFieldData() - if ptdata.GetNumberOfArrays() + cldata.GetNumberOfArrays(): - - for i in range(ptdata.GetNumberOfArrays()): - name = ptdata.GetArrayName(i) - if name and ptdata.GetArray(i): - vedo.printc("pointdata".ljust(14) + ": ", c=c, bold=True, end="") - try: - tt, _ = array_types[ptdata.GetArray(i).GetDataType()] - except: - tt = "VTKTYPE" + str(ptdata.GetArray(i).GetDataType()) - ncomp = ptdata.GetArray(i).GetNumberOfComponents() - rng = ptdata.GetArray(i).GetRange() - vedo.printc(f'"{name}" ({ncomp} {tt}),', c=c, bold=False, end="") - vedo.printc( - " range=(" + precision(rng[0], 3) + "," + precision(rng[1], 3) + ")", - c=c, - bold=False, - ) - - if ptdata.GetScalars(): - vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(f'"{ptdata.GetScalars().GetName()}"', "(pointdata) ", c=c, bold=False) - - if ptdata.GetVectors(): - vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(f'"{ptdata.GetVectors().GetName()}"', "(pointdata) ", c=c, bold=False) - - if ptdata.GetTensors(): - vedo.printc("active tensors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(f'"{ptdata.GetTensors().GetName()}"', "(pointdata) ", c=c, bold=False) - - # same for cells - for i in range(cldata.GetNumberOfArrays()): - name = cldata.GetArrayName(i) - if name and cldata.GetArray(i): - vedo.printc("celldata".ljust(14) + ": ", c=c, bold=True, end="") - try: - tt, _ = array_types[cldata.GetArray(i).GetDataType()] - except: - tt = cldata.GetArray(i).GetDataType() - ncomp = cldata.GetArray(i).GetNumberOfComponents() - rng = cldata.GetArray(i).GetRange() - vedo.printc(f'"{name}" ({ncomp} {tt}),', c=c, bold=False, end="") - vedo.printc( - " range=(" + precision(rng[0], 4) + "," + precision(rng[1], 4) + ")", - c=c, - bold=False, - ) - - if cldata.GetScalars(): - vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(f'"{cldata.GetScalars().GetName()}"', "(celldata)", c=c, bold=False) - - if cldata.GetVectors(): - vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") - vedo.printc(f'"{cldata.GetVectors().GetName()}"', "(celldata)", c=c, bold=False) - - for i in range(fldata.GetNumberOfArrays()): - name = fldata.GetArrayName(i) - if name and fldata.GetAbstractArray(i): - arr = fldata.GetAbstractArray(i) - vedo.printc("metadata".ljust(14) + ": ", c=c, bold=True, end="") - ncomp = arr.GetNumberOfComponents() - nvals = arr.GetNumberOfValues() - vedo.printc(f'"{name}" ({ncomp} components, {nvals} values)', c=c, bold=False) - - else: - vedo.printc("mesh data".ljust(14) + ":", c=c, bold=True, end=" ") - vedo.printc("no point or cell data is present.", c=c, bold=False) - - if obj is None: return @@ -1485,7 +1410,7 @@ def _print_data(poly, c): # bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) # vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) obj.__str__() - _print_data(ug, 'm') + # _print_data(ug, 'm') elif isinstance(obj, vedo.UGrid): cf = "m" @@ -1504,44 +1429,7 @@ def _print_data(poly, c): vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) - _print_data(ug, cf) - - elif isinstance(obj, vedo.volume.Volume): - vedo.printc("Volume".ljust(70), c="b", bold=True, invert=True) - - img = obj.dataset - vedo.printc("origin".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(precision(obj.origin(), 6), c="b", bold=False) - - vedo.printc("center".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(precision(obj.center(), 6), c="b", bold=False) - - vedo.printc("dimensions".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(img.GetDimensions(), c="b", bold=False) - vedo.printc("spacing".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(precision(img.GetSpacing(), 6), c="b", bold=False) - # vedo.printc("data dimension".ljust(14) + ": ", c="b", bold=True, end="") - # vedo.printc(img.GetDataDimension(), c="b", bold=False) - - vedo.printc("memory size".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(int(img.GetActualMemorySize() / 1024), "MB", c="b", bold=False) - - vedo.printc("scalar #bytes".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(img.GetScalarSize(), c="b", bold=False) - - bnds = obj.bounds() - vedo.printc("bounds".ljust(14) + ": ", c="b", bold=True, end="") - bx1, bx2 = precision(bnds[0], 4), precision(bnds[1], 4) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="b", bold=False, end="") - by1, by2 = precision(bnds[2], 4), precision(bnds[3], 4) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="b", bold=False, end="") - bz1, bz2 = precision(bnds[4], 4), precision(bnds[5], 4) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="b", bold=False) - - vedo.printc("scalar range".ljust(14) + ": ", c="b", bold=True, end="") - vedo.printc(img.GetScalarRange(), c="b", bold=False) - - # print_histogram(obj, horizontal=True, logscale=True, bins=8, height=15, c="b", bold=True) + # _print_data(ug, cf) elif isinstance(obj, vedo.Plotter) and obj.interactor: # dumps Plotter info axtype = { @@ -1710,7 +1598,7 @@ def print_histogram( bins *= 2 try: - data = data.dataset + data = vtk2numpy(data.dataset.GetPointData().GetScalars()) except AttributeError: # already an array data = np.asarray(data) diff --git a/vedo/volume.py b/vedo/volume.py index 042a481b..f6573148 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -217,6 +217,47 @@ def _update(self, data): self.mapper.Update() return self + def __str__(self): + """Print a summary for the Volume object.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), + c="b", bold=True, invert=True, return_string=True, + ) + out += "\x1b[34;1m" + + out+= "dimensions".ljust(14) + ": " + str(self.shape) + "\n" + + out+= "origin".ljust(14) + ": " + out+= utils.precision(self.origin(), 6) + "\n" + + out+= "center".ljust(14) + ": " + out+= utils.precision(self.center(), 6) + "\n" + + out+= "spacing".ljust(14) + ": " + out+= utils.precision(self.spacing(), 6) + "\n" + + bnds = self.bounds() + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + out+= "bounds".ljust(14) + ":" + out+= " x=(" + bx1 + ", " + bx2 + ")," + out+= " y=(" + by1 + ", " + by2 + ")," + out+= " z=(" + bz1 + ", " + bz2 + ")\n" + + out+= "memory size".ljust(14) + ": " + out+= str(int(self.dataset.GetActualMemorySize()/1024+0.5))+" MB\n" + + out+= "scalar size".ljust(14) + ": " + out+= str(self.dataset.GetScalarSize()) + " bytes\n" + out+= "scalar range".ljust(14) + ": " + out+= str(self.dataset.GetScalarRange()) + "\n" + + #utils.print_histogram(self, logscale=True, bins=8, height=15, c="b", bold=True) + return out.rstrip() + "\x1b[0m" + def _repr_html_(self): """ From 46636609ff9e079085e19f3e464349de85d06578 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 19:20:50 +0100 Subject: [PATCH 208/251] new print(Plotter) --- vedo/plotter.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ vedo/utils.py | 64 -------------------------------------------- vedo/volume.py | 4 +++ 3 files changed, 74 insertions(+), 64 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index 04606ab0..298e8b6c 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -762,6 +762,76 @@ def __init__( ##################################################################### ..init ends here. + def __str__(self): + """Return Plotter info.""" + axtype = { + 0: "(no axes)", + 1: "(customizable grid walls)", + 2: "(cartesian axes from origin", + 3: "(positive range of cartesian axes from origin", + 4: "(axes triad at bottom left)", + 5: "(oriented cube at bottom left)", + 6: "(mark the corners of the bounding box)", + 7: "(3D ruler at each side of the cartesian axes)", + 8: "(the vtkCubeAxesActor object)", + 9: "(the bounding box outline)", + 10: "(circles of maximum bounding box range)", + 11: "(show a large grid on the x-y plane)", + 12: "(show polar axes)", + 13: "(simple ruler at the bottom of the window)", + 14: "(the vtkCameraOrientationWidget object)", + } + + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(id(self))})".ljust(75), + c="c", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\u001b[36m" + if self.interactor: + out+= "window title".ljust(14) + ": " + self.title + "\n" + out+= "window size".ljust(14) + f": {self.window.GetSize()}" + out+= f", full_screen={self.window.GetScreenSize()}\n" + out+= "activ renderer".ljust(14) + ": nr." + str(self.renderers.index(self.renderer)) + out+= f" (out of {len(self.renderers)} renderers)\n" + + bns, totpt = [], 0 + for a in self.objects: + print([a.bounds()]) + try: + b = a.bounds() + bns.append(b) + except AttributeError: + pass + try: + totpt += a.npoints + except AttributeError: + pass + out+= "n. of objects".ljust(14) + f": {len(self.objects)}" + out+= f" ({totpt} vertices)\n" if totpt else "\n" + + if len(bns)>0: + min_bns = np.min(bns, axis=0) + max_bns = np.max(bns, axis=0) + bx1, bx2 = utils.precision(min_bns[0], 3), utils.precision(max_bns[1], 3) + by1, by2 = utils.precision(min_bns[2], 3), utils.precision(max_bns[3], 3) + bz1, bz2 = utils.precision(min_bns[4], 3), utils.precision(max_bns[5], 3) + out+= "bounds".ljust(14) + ": " + out+= " x=(" + bx1 + ", " + bx2 + ")," + out+= " y=(" + by1 + ", " + by2 + ")," + out+= " z=(" + bz1 + ", " + bz2 + ")\n" + + if utils.is_integer(self.axes): + out+= "axes style".ljust(14) + f": {self.axes} {axtype[self.axes]}\n" + else: + out+= "axes style".ljust(14) + f": {[self.axes]}\n" + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print information about the current instance.""" + print(self.__str__()) + return self def __iadd__(self, objects): self.add(objects) diff --git a/vedo/utils.py b/vedo/utils.py index ad24d8b2..24482553 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1431,70 +1431,6 @@ def print_info(obj): vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) # _print_data(ug, cf) - elif isinstance(obj, vedo.Plotter) and obj.interactor: # dumps Plotter info - axtype = { - 0: "(no axes)", - 1: "(three customizable gray grid walls)", - 2: "(cartesian axes from origin", - 3: "(positive range of cartesian axes from origin", - 4: "(axes triad at bottom left)", - 5: "(oriented cube at bottom left)", - 6: "(mark the corners of the bounding box)", - 7: "(3D ruler at each side of the cartesian axes)", - 8: "(the vtkCubeAxesActor object)", - 9: "(the bounding box outline)", - 10: "(circles of maximum bounding box range)", - 11: "(show a large grid on the x-y plane)", - 12: "(show polar axes)", - 13: "(simple ruler at the bottom of the window)", - 14: "(the vtkCameraOrientationWidget object)", - } - bns, totpt = [], 0 - for a in obj.actors: - b = a.GetBounds() - if a.GetBounds() is not None: - if isinstance(a, vtk.vtkActor) and a.GetMapper(): - totpt += a.GetMapper().GetInput().GetNumberOfPoints() - bns.append(b) - if len(bns) == 0: - return - vedo.printc("Plotter".ljust(70), invert=True, dim=1, c="c") - otit = obj.title - if not otit: - otit = None - vedo.printc("window title".ljust(14) + ":", otit, bold=False, c="c") - vedo.printc( - "window size".ljust(14) + ":", - obj.window.GetSize(), - "- full screen size:", - obj.window.GetScreenSize(), - bold=False, - c="c", - ) - vedo.printc( - "actv renderer".ljust(14) + ":", - "nr.", - obj.renderers.index(obj.renderer), - f"(of {len(obj.renderers)} renderers)", - bold=False, - c="c", - ) - vedo.printc("nr. of actors".ljust(14) + ":", len(obj.actors), bold=False, c="c", end="") - vedo.printc(" (" + str(totpt), "vertices)", bold=False, c="c") - max_bns = np.max(bns, axis=0) - min_bns = np.min(bns, axis=0) - vedo.printc("max bounds".ljust(14) + ": ", c="c", bold=False, end="") - bx1, bx2 = precision(min_bns[0], 3), precision(max_bns[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="c", bold=False, end="") - by1, by2 = precision(min_bns[2], 3), precision(max_bns[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="c", bold=False, end="") - bz1, bz2 = precision(min_bns[4], 3), precision(max_bns[5], 3) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="c", bold=False) - if isinstance(obj.axes, dict): - obj.axes = 1 - if obj.axes: - vedo.printc("axes style".ljust(14) + ":", obj.axes, axtype[obj.axes], bold=False, c="c") - elif isinstance(obj, vedo.Image): # dumps Image info vedo.printc("Image".ljust(70), c="y", bold=True, invert=True) # try: diff --git a/vedo/volume.py b/vedo/volume.py index f6573148..b06d0f23 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -258,6 +258,10 @@ def __str__(self): #utils.print_histogram(self, logscale=True, bins=8, height=15, c="b", bold=True) return out.rstrip() + "\x1b[0m" + def print(self): + """Print a description of the Volume.""" + print(self.__str__()) + return self def _repr_html_(self): """ From 3a8b88001e010fc15d34ac4e2dfe1483089363a9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 19:39:06 +0100 Subject: [PATCH 209/251] new print(Image) --- vedo/image.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++- vedo/utils.py | 45 ----------------------------------------- 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/vedo/image.py b/vedo/image.py index b9a2247a..51a1e371 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -222,7 +222,61 @@ def __init__(self, obj=None, channels=3): sx, sy, _ = self.dataset.GetDimensions() shape = np.array([sx, sy]) self.pipeline = utils.OperationNode("Image", comment=f"#shape {shape}", c="#f28482") - ###################################################################### + + ###################################################################### + + def __str__(self): + """Print a description of the Image class.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(id(self))})".ljust(75), + c="y", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\x1b[33;1m" + + out+= "dimensions".ljust(14) + f": {self.shape}\n" + out+= "memory size".ljust(14) + ": " + out+= str(int(self.memory_size())) + " kB\n" + + bnds = self.bounds() + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + out+= "position".ljust(14) + f": {self.pos()}\n" + out+= "bounds".ljust(14) + ":" + out+= " x=(" + bx1 + ", " + bx2 + ")," + out+= " y=(" + by1 + ", " + by2 + ")," + out+= " z=(" + bz1 + ", " + bz2 + ")\n" + + out+= "intensty range".ljust(14) + f": {self.scalar_range()}\n" + out+= "level/window".ljust(14) + ": " + out+= str(self.level()) + " / " + str(self.window()) + "\n" + + thumb = "" + try: + # generate a print thumbnail + w = 75 + width, height = self.shape + h = int(height / width * (w - 1) * 0.5 + 0.5) + img_arr = self.clone().resize([w, h]).tonumpy() + h, w = img_arr.shape[:2] + for x in range(h): + for y in range(w): + pix = img_arr[x][y] + r, g, b = pix[:3] + thumb+= f"\x1b[48;2;{r};{g};{b}m " + thumb+= "\x1b[0m\n" + except: + pass + + out += thumb + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print a description of the Image class.""" + print(self.__str__()) + return self def _repr_html_(self): """ diff --git a/vedo/utils.py b/vedo/utils.py index 24482553..9f728401 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1431,51 +1431,6 @@ def print_info(obj): vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) # _print_data(ug, cf) - elif isinstance(obj, vedo.Image): # dumps Image info - vedo.printc("Image".ljust(70), c="y", bold=True, invert=True) - # try: - # # generate a print thumbnail - # width, height = obj.dimensions() - # w = 45 - # h = int(height / width * (w - 1) * 0.5 + 0.5) - # img_arr = obj.clone().resize([w, h]).tonumpy() - # h, w = img_arr.shape[:2] - # for x in range(h): - # for y in range(w): - # pix = img_arr[x][y] - # r, g, b = pix[:3] - # print(f"\x1b[48;2;{r};{g};{b}m", end=" ") - # print("\x1b[0m") - # except: - # pass - - vedo.printc("position".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(obj.pos(), c="y", bold=False) - - vedo.printc("dimensions".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(obj.shape, c="y", bold=False) - - vedo.printc("memory size".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(int(obj.memory_size()), "kB", c="y", bold=False) - - bnds = obj.bounds() - vedo.printc("bounds".ljust(14) + ": ", c="y", bold=True, end="") - bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="y", bold=False, end="") - by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="y", bold=False, end="") - bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="y", bold=False) - - vedo.printc("intensty range".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(obj.scalar_range(), c="y", bold=False) - vedo.printc("level / window".ljust(14) + ": ", c="y", bold=True, end="") - vedo.printc(obj.level(), "/", obj.window(), c="y", bold=False) - - else: - vedo.printc(str(type(obj)).ljust(70), invert=True) - vedo.printc(obj) - def print_histogram( data, From a0d01deff1e37d8c7dc6a63a61a7cf740763fd7b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 20:09:13 +0100 Subject: [PATCH 210/251] new print(ugrid tetmesh) --- vedo/cli.py | 16 +++++++---- vedo/core.py | 5 ---- vedo/image.py | 63 +++++++++++++++++++++--------------------- vedo/plotter.py | 4 +-- vedo/tetmesh.py | 73 ++++++++++++++++++++++++++++++++++++++++--------- vedo/ugrid.py | 66 ++++++++++++++++++++++++++++++++++++++++++++ vedo/utils.py | 51 ++-------------------------------- 7 files changed, 171 insertions(+), 107 deletions(-) diff --git a/vedo/cli.py b/vedo/cli.py index 23d49f47..89a09b5e 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -27,7 +27,7 @@ import vedo.vtkclasses as vtk -from vedo.utils import humansort, is_sequence, print_info +from vedo.utils import humansort, is_sequence from vedo.colors import get_color, printc from vedo.mesh import Mesh from vedo.image import Image @@ -141,13 +141,17 @@ def system_info(): file = sys.argv[i] try: A = load(file) - if isinstance(A, np.ndarray): - print_info(A) - elif is_sequence(A): + if is_sequence(A): for a in A: - print_info(a) + try: + a.print() + except: + pass else: - print_info(A) + try: + A.print() + except: + pass except: vedo.logger.error(f"Could not load {file}, skip.") diff --git a/vedo/core.py b/vedo/core.py index bb9805bf..15651768 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -545,11 +545,6 @@ def copy_data_from(self, obj): ) return self - def print(self): - """Print information about an object.""" - utils.print_info(self) - return self - def inputdata(self): """Obsolete, use `.dataset` instead.""" colors.printc("WARNING: 'inputdata()' is obsolete, use '.dataset' instead.", c="y") diff --git a/vedo/image.py b/vedo/image.py index 51a1e371..9e59d47d 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -227,50 +227,49 @@ def __init__(self, obj=None, channels=3): def __str__(self): """Print a description of the Image class.""" + module = self.__class__.__module__ name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), c="y", bold=True, invert=True, return_string=True, ) - out += "\x1b[0m\x1b[33;1m" - out+= "dimensions".ljust(14) + f": {self.shape}\n" - out+= "memory size".ljust(14) + ": " - out+= str(int(self.memory_size())) + " kB\n" + if vedo.colors._terminal_has_colors: + thumb = "" + try: # to generate a terminal thumbnail + w = 75 + width, height = self.shape + h = int(height / width * (w - 1) * 0.5 + 0.5) + img_arr = self.clone().resize([w, h]).tonumpy() + h, w = img_arr.shape[:2] + for x in range(h): + for y in range(w): + pix = img_arr[x][y] + r, g, b = pix[:3] + thumb += f"\x1b[48;2;{r};{g};{b}m " + thumb += "\x1b[0m\n" + except: + pass + out += thumb + + out += "\x1b[0m\x1b[33;1m" + out += "dimensions".ljust(14) + f": {self.shape}\n" + out += "memory size".ljust(14) + ": " + out += str(int(self.memory_size())) + " kB\n" bnds = self.bounds() bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) - out+= "position".ljust(14) + f": {self.pos()}\n" - out+= "bounds".ljust(14) + ":" - out+= " x=(" + bx1 + ", " + bx2 + ")," - out+= " y=(" + by1 + ", " + by2 + ")," - out+= " z=(" + bz1 + ", " + bz2 + ")\n" - - out+= "intensty range".ljust(14) + f": {self.scalar_range()}\n" - out+= "level/window".ljust(14) + ": " - out+= str(self.level()) + " / " + str(self.window()) + "\n" - - thumb = "" - try: - # generate a print thumbnail - w = 75 - width, height = self.shape - h = int(height / width * (w - 1) * 0.5 + 0.5) - img_arr = self.clone().resize([w, h]).tonumpy() - h, w = img_arr.shape[:2] - for x in range(h): - for y in range(w): - pix = img_arr[x][y] - r, g, b = pix[:3] - thumb+= f"\x1b[48;2;{r};{g};{b}m " - thumb+= "\x1b[0m\n" - except: - pass - - out += thumb + out += "position".ljust(14) + f": {self.pos()}\n" + out += "bounds".ljust(14) + ":" + out += " x=(" + bx1 + ", " + bx2 + ")," + out += " y=(" + by1 + ", " + by2 + ")," + out += " z=(" + bz1 + ", " + bz2 + ")\n" + out += "intensty range".ljust(14) + f": {self.scalar_range()}\n" + out += "level/window".ljust(14) + ": " + out += str(self.level()) + " / " + str(self.window()) + "\n" return out.rstrip() + "\x1b[0m" def print(self): diff --git a/vedo/plotter.py b/vedo/plotter.py index 298e8b6c..511ceeb4 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -4302,9 +4302,9 @@ def _keypress(self, iren, event): elif key == "i": # print info if self.clicked_object: - utils.print_info(self.clicked_object) + print(self.clicked_object) else: - utils.print_info(self) + print(self) elif key == "I": # print color under the mouse x, y = iren.GetEventPosition() diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index ff394bb3..b6a16072 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -157,7 +157,7 @@ def __init__( elif isinstance(inputobj, vtk.vtkDataSet): r2t = vtk.new("DataSetTriangleFilter") r2t.SetInputData(inputobj) - # r2t.TetrahedraOnlyOn() + r2t.TetrahedraOnlyOn() r2t.Update() self.dataset = r2t.GetOutput() @@ -205,25 +205,72 @@ def __init__( self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) - # ----------------------------------------------------------- + + ################################################################## def __str__(self): """Print a string summary of the `TetMesh` object.""" - opts = dict(c='m', return_string=True) + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), + c="m", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\u001b[35m" + + out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" + out += "nr. of tetras".ljust(14)+ ": " + str(self.ncells) + "\n" + + if self.npoints: + out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) + out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" + out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" + bnds = self.bounds() - ug = self.dataset bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) - s = vedo.printc("TetMesh".ljust(70), bold=True, invert=True, **opts) - s+= vedo.printc("nr. of tetras".ljust(14) + ": ", bold=True, end="", **opts) - s+= vedo.printc(ug.GetNumberOfCells(), bold=False, **opts) - s+= vedo.printc("bounds".ljust(14) + ": ", bold=True, end="", **opts) - s+= vedo.printc("x=(" + bx1 + ", " + bx2 + ")", bold=False, end="", **opts) - s+= vedo.printc(" y=(" + by1 + ", " + by2 + ")", bold=False, end="", **opts) - s+= vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", bold=False, **opts) - # _print_data(ug, cf) #TODO - return s + out += "bounds".ljust(14) + ":" + out += " x=(" + bx1 + ", " + bx2 + ")," + out += " y=(" + by1 + ", " + by2 + ")," + out += " z=(" + bz1 + ", " + bz2 + ")\n" + + for key in self.pointdata.keys(): + arr = self.pointdata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "pointdata" + if self.dataset.GetPointData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetPointData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetPointData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.celldata.keys(): + arr = self.celldata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "celldata" + if self.dataset.GetCellData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetCellData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetCellData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.metadata.keys(): + arr = self.metadata[key] + out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' + + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print a description of the TetMesh.""" + print(self.__str__()) + return self def _repr_html_(self): """ diff --git a/vedo/ugrid.py b/vedo/ugrid.py index b72dbe76..e3cc3b8f 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -138,6 +138,72 @@ def __init__(self, inputobj=None): ) # ------------------------------------------------------------------ + + def __str__(self): + """Print a string summary of the `UGrid` object.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), + c="m", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\u001b[35m" + + out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" + out += "nr. of cells".ljust(14)+ ": " + str(self.ncells) + "\n" + + if self.npoints: + out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) + out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" + out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" + + bnds = self.bounds() + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + out += "bounds".ljust(14) + ":" + out += " x=(" + bx1 + ", " + bx2 + ")," + out += " y=(" + by1 + ", " + by2 + ")," + out += " z=(" + bz1 + ", " + bz2 + ")\n" + + for key in self.pointdata.keys(): + arr = self.pointdata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "pointdata" + if self.dataset.GetPointData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetPointData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetPointData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.celldata.keys(): + arr = self.celldata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "celldata" + if self.dataset.GetCellData().GetScalars().GetName() == key: + mark_active += " *" + elif self.dataset.GetCellData().GetVectors().GetName() == key: + mark_active += " **" + elif self.dataset.GetCellData().GetTensors().GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.metadata.keys(): + arr = self.metadata[key] + out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' + + return out.rstrip() + "\x1b[0m" + + def print(self): + """Print a description of the UGrid.""" + print(self.__str__()) + return self + + def _repr_html_(self): """ HTML representation of the UGrid object for Jupyter Notebooks. diff --git a/vedo/utils.py b/vedo/utils.py index 9f728401..cb08480b 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -34,7 +34,6 @@ "point_line_distance", "closest", "grep", - "print_info", "make_bands", "pack_spheres", "humansort", @@ -1386,52 +1385,6 @@ def grep(filename, tag, column=None, first_occurrence_only=False): break return content - -def print_info(obj): - """Print information about a `vedo` object.""" - - if obj is None: - return - - if isinstance(obj, vedo.TetMesh): - ug = obj.dataset - # cf = "m" - # vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) - # bnds = obj.bounds() - # vedo.printc("nr. of tetras".ljust(14) + ": ", c=cf, bold=True, end="") - # vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) - # # vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") - # # vedo.printc(pos, c=cf, bold=False) - # vedo.printc("bounds".ljust(14) + ": ", c=cf, bold=True, end="") - # bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - # vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c=cf, bold=False, end="") - # by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - # vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") - # bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - # vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) - obj.__str__() - # _print_data(ug, 'm') - - elif isinstance(obj, vedo.UGrid): - cf = "m" - vedo.printc("UGrid".ljust(70), c=cf, bold=True, invert=True) - pos = obj.GetPosition() - bnds = obj.GetBounds() - ug = obj.dataset - vedo.printc("nr. of cells".ljust(14) + ": ", c=cf, bold=True, end="") - vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) - vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") - vedo.printc(pos, c=cf, bold=False) - vedo.printc("bounds".ljust(14) + ": ", c=cf, bold=True, end="") - bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) - vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c=cf, bold=False, end="") - by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) - vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") - bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) - vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) - # _print_data(ug, cf) - - def print_histogram( data, bins=10, @@ -1476,8 +1429,8 @@ def print_histogram( from vedo import print_histogram import numpy as np d = np.random.normal(size=1000) - data = print_histogram(d, c='blue', logscale=True, title='my scalars') - data = print_histogram(d, c=1, horizontal=1) + data = print_histogram(d, c='b', logscale=True, title='my scalars') + data = print_histogram(d, c='o') print(np.mean(data)) # data here is same as d ``` ![](https://vedo.embl.es/images/feats/print_histogram.png) From 151771f8bdd9a4b70a40c76150cc76b71212fc89 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 20:45:50 +0100 Subject: [PATCH 211/251] version dev28a --- vedo/cli.py | 25 +++---------------------- vedo/version.py | 2 +- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/vedo/cli.py b/vedo/cli.py index 89a09b5e..1b47bf80 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -25,9 +25,7 @@ import sys import numpy as np -import vedo.vtkclasses as vtk - -from vedo.utils import humansort, is_sequence +from vedo.utils import humansort from vedo.colors import get_color, printc from vedo.mesh import Mesh from vedo.image import Image @@ -136,29 +134,12 @@ def get_parser(): ################################################################################################# def system_info(): - - for i in range(2, len(sys.argv)): - file = sys.argv[i] - try: - A = load(file) - if is_sequence(A): - for a in A: - try: - a.print() - except: - pass - else: - try: - A.print() - except: - pass - except: - vedo.logger.error(f"Could not load {file}, skip.") + from vtkmodules.all import vtkVersion printc("_" * 65, bold=False) printc("vedo version :", __version__, invert=1, end=" ") printc("https://vedo.embl.es", underline=1, italic=1) - printc("vtk version :", vtk.vtkVersion().GetVTKVersion()) + printc("vtk version :", vtkVersion().GetVTKVersion()) printc("numpy version :", np.__version__) printc("python version :", sys.version.replace("\n", "")) printc("python interpreter:", sys.executable) diff --git a/vedo/version.py b/vedo/version.py index 3a77e80e..d2445bc6 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev27a' +_version = '2023.5.0+dev28a' From 17d64d505342242f5bd449e051343f8df4219b99 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 3 Nov 2023 21:12:40 +0100 Subject: [PATCH 212/251] fixes to print() and to gpu volume.mapper --- examples/volumetric/tensors.py | 2 +- vedo/pointcloud.py | 18 ++++++++++++------ vedo/tetmesh.py | 18 ++++++++++++------ vedo/ugrid.py | 18 ++++++++++++------ vedo/volume.py | 9 ++++++--- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/examples/volumetric/tensors.py b/examples/volumetric/tensors.py index 16fcf322..be268bbe 100644 --- a/examples/volumetric/tensors.py +++ b/examples/volumetric/tensors.py @@ -11,7 +11,7 @@ pl.SetModelBounds(-10,10,-10,10,-10,10) pl.Update() -vol = Volume(pl.GetOutput(), mode=1) +vol = Volume(pl.GetOutput()).mode(1) print(vol.pointdata) # Extract a slice of the volume data at index 3 diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index c84340dc..2695e41d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -686,11 +686,14 @@ def __str__(self): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" - if self.dataset.GetPointData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetPointData().GetScalars() + a_vectors = self.dataset.GetPointData().GetVectors() + a_tensors = self.dataset.GetPointData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetPointData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetPointData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" @@ -699,11 +702,14 @@ def __str__(self): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" - if self.dataset.GetCellData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetCellData().GetScalars() + a_vectors = self.dataset.GetCellData().GetVectors() + a_tensors = self.dataset.GetCellData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetCellData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetCellData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index b6a16072..08fab44b 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -239,11 +239,14 @@ def __str__(self): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" - if self.dataset.GetPointData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetPointData().GetScalars() + a_vectors = self.dataset.GetPointData().GetVectors() + a_tensors = self.dataset.GetPointData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetPointData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetPointData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" @@ -252,11 +255,14 @@ def __str__(self): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" - if self.dataset.GetCellData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetCellData().GetScalars() + a_vectors = self.dataset.GetCellData().GetVectors() + a_tensors = self.dataset.GetCellData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetCellData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetCellData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" diff --git a/vedo/ugrid.py b/vedo/ugrid.py index e3cc3b8f..5b7ff38d 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -170,11 +170,14 @@ def __str__(self): arr = self.pointdata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "pointdata" - if self.dataset.GetPointData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetPointData().GetScalars() + a_vectors = self.dataset.GetPointData().GetVectors() + a_tensors = self.dataset.GetPointData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetPointData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetPointData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" @@ -183,11 +186,14 @@ def __str__(self): arr = self.celldata[key] rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) mark_active = "celldata" - if self.dataset.GetCellData().GetScalars().GetName() == key: + a_scalars = self.dataset.GetCellData().GetScalars() + a_vectors = self.dataset.GetCellData().GetVectors() + a_tensors = self.dataset.GetCellData().GetTensors() + if a_scalars and a_scalars.GetName() == key: mark_active += " *" - elif self.dataset.GetCellData().GetVectors().GetName() == key: + elif a_vectors and a_vectors.GetName() == key: mark_active += " **" - elif self.dataset.GetCellData().GetTensors().GetName() == key: + elif a_tensors and a_tensors.GetName() == key: mark_active += " ***" out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' out += f", range=({rng})\n" diff --git a/vedo/volume.py b/vedo/volume.py index b06d0f23..72127bc9 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -193,7 +193,12 @@ def mapper(self, mapper): mapper : (str, vtkMapper) either 'gpu', 'opengl_gpu', 'fixed' or 'smart' """ - if "gpu" in mapper: + if isinstance(mapper, + (vtk.get_class("Mapper"), + vtk.get_class("ImageResliceMapper", + ) )): + pass + elif "gpu" in mapper: mapper = vtk.new("GPUVolumeRayCastMapper") elif "opengl_gpu" in mapper: mapper = vtk.new("OpenGLGPUVolumeRayCastMapper") @@ -201,8 +206,6 @@ def mapper(self, mapper): mapper = vtk.new("SmartVolumeMapper") elif "fixed" in mapper: mapper = vtk.new("FixedPointVolumeRayCastMapper") - elif isinstance(mapper, vtk.get_class("Mapper")): - pass else: print("Error unknown mapper type", [mapper]) raise RuntimeError() From a8f2622db3f214ce8548857789ba3738a92d01ae Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 4 Nov 2023 02:05:05 +0100 Subject: [PATCH 213/251] fixes to print() --- vedo/image.py | 34 +++++++++++++++++----------------- vedo/plotter.py | 7 +++---- vedo/volume.py | 11 ++++++++--- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/vedo/image.py b/vedo/image.py index 9e59d47d..18abb179 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -235,23 +235,23 @@ def __str__(self): c="y", bold=True, invert=True, return_string=True, ) - if vedo.colors._terminal_has_colors: - thumb = "" - try: # to generate a terminal thumbnail - w = 75 - width, height = self.shape - h = int(height / width * (w - 1) * 0.5 + 0.5) - img_arr = self.clone().resize([w, h]).tonumpy() - h, w = img_arr.shape[:2] - for x in range(h): - for y in range(w): - pix = img_arr[x][y] - r, g, b = pix[:3] - thumb += f"\x1b[48;2;{r};{g};{b}m " - thumb += "\x1b[0m\n" - except: - pass - out += thumb + # if vedo.colors._terminal_has_colors: + # thumb = "" + # try: # to generate a terminal thumbnail + # w = 75 + # width, height = self.shape + # h = int(height / width * (w - 1) * 0.5 + 0.5) + # img_arr = self.clone().resize([w, h]).tonumpy() + # h, w = img_arr.shape[:2] + # for x in range(h): + # for y in range(w): + # pix = img_arr[x][y] + # r, g, b = pix[:3] + # thumb += f"\x1b[48;2;{r};{g};{b}m " + # thumb += "\x1b[0m\n" + # except: + # pass + # out += thumb out += "\x1b[0m\x1b[33;1m" out += "dimensions".ljust(14) + f": {self.shape}\n" diff --git a/vedo/plotter.py b/vedo/plotter.py index 511ceeb4..c6d7ebb9 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -786,9 +786,9 @@ def __str__(self): name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), - c="c", bold=True, invert=True, return_string=True, + c="w", bold=True, invert=True, return_string=True, ) - out += "\x1b[0m\u001b[36m" + out += "\x1b[0m" if self.interactor: out+= "window title".ljust(14) + ": " + self.title + "\n" out+= "window size".ljust(14) + f": {self.window.GetSize()}" @@ -798,7 +798,6 @@ def __str__(self): bns, totpt = [], 0 for a in self.objects: - print([a.bounds()]) try: b = a.bounds() bns.append(b) @@ -817,7 +816,7 @@ def __str__(self): bx1, bx2 = utils.precision(min_bns[0], 3), utils.precision(max_bns[1], 3) by1, by2 = utils.precision(min_bns[2], 3), utils.precision(max_bns[3], 3) bz1, bz2 = utils.precision(min_bns[4], 3), utils.precision(max_bns[5], 3) - out+= "bounds".ljust(14) + ": " + out+= "bounds".ljust(14) + ":" out+= " x=(" + bx1 + ", " + bx2 + ")," out+= " y=(" + by1 + ", " + by2 + ")," out+= " z=(" + bz1 + ", " + bz2 + ")\n" diff --git a/vedo/volume.py b/vedo/volume.py index 72127bc9..c6801874 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -143,6 +143,7 @@ def __init__( if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) img = vedo.file_io.loadImageData(inputobj) + self.filename = inputobj else: vedo.logger.error(f"cannot understand input type {inputtype}") @@ -226,9 +227,12 @@ def __str__(self): name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), - c="b", bold=True, invert=True, return_string=True, + c="c", bold=True, invert=True, return_string=True, ) - out += "\x1b[34;1m" + out += "\x1b[0m\x1b[36;1m" + + out+= "name".ljust(14) + ": " + str(self.name) + "\n" + out+= "filename".ljust(14) + ": " + str(self.filename) + "\n" out+= "dimensions".ljust(14) + ": " + str(self.shape) + "\n" @@ -253,8 +257,9 @@ def __str__(self): out+= "memory size".ljust(14) + ": " out+= str(int(self.dataset.GetActualMemorySize()/1024+0.5))+" MB\n" + st = self.dataset.GetScalarTypeAsString() out+= "scalar size".ljust(14) + ": " - out+= str(self.dataset.GetScalarSize()) + " bytes\n" + out+= str(self.dataset.GetScalarSize()) + f" bytes ({st})\n" out+= "scalar range".ljust(14) + ": " out+= str(self.dataset.GetScalarRange()) + "\n" From 3048b3a0e3dd699def0fe5db56b0f69eafeea64b Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 5 Nov 2023 03:47:32 +0100 Subject: [PATCH 214/251] add hdf5 support --- vedo/addons.py | 5 +- vedo/assembly.py | 8 +- vedo/file_io.py | 231 +++++++++++++++++++++++++++++++++++++++++++++-- vedo/shapes.py | 10 +- vedo/volume.py | 2 + 5 files changed, 240 insertions(+), 16 deletions(-) diff --git a/vedo/addons.py b/vedo/addons.py index 1d0ff2a3..ca087fa6 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -2,10 +2,7 @@ # -*- coding: utf-8 -*- import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo.transformations import LinearTransform diff --git a/vedo/assembly.py b/vedo/assembly.py index f54475f1..e1dff888 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -1,11 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np +from weakref import ref as weak_ref_to -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo.transformations import LinearTransform @@ -228,12 +226,14 @@ def __init__(self, *meshs): meshs = vedo.utils.flatten(meshs) self.actor = self + self.actor.retrieve_object = weak_ref_to(self) self.name = "Assembly" self.filename = "" self.rendered_at = set() self.scalarbar = None self.info = {} + self.time = 0 self.transform = LinearTransform() diff --git a/vedo/file_io.py b/vedo/file_io.py index 29e92edc..6dc25e70 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -5,10 +5,7 @@ import numpy as np -try: - import vedo.vtkclasses as vtk -except ImportError: - import vtkmodules.all as vtk +import vedo.vtkclasses as vtk import vedo from vedo import settings @@ -812,7 +809,6 @@ def loadPCD(filename): poly = utils.buildPolyData(pts) return Points(poly).point_size(4) - def tonumpy(obj): """Dump a vedo object to numpy format.""" @@ -947,7 +943,7 @@ def _fillmesh(obj, adict): elif isinstance(obj, Volume): adict["type"] = "Volume" _fillcommon(obj, adict) - imgdata = obj.inputdata() + imgdata = obj.dataset arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) adict["array"] = arr.reshape(imgdata.GetDimensions()) adict["mode"] = obj.mode() @@ -1504,9 +1500,13 @@ def export_window(fileoutput, binary=False): else: np.save(fileoutput, [sdict]) + #################################################################### + elif fr.endswith(".v3d"): + _export_hdf5(fileoutput) + #################################################################### elif fr.endswith(".x3d"): - obj = vedo.plotter_instance.get_actors() + # obj = vedo.plotter_instance.get_actors() # if vedo.plotter_instance.axes_instances: # obj.append(vedo.plotter_instance.axes_instances[0]) @@ -1552,6 +1552,223 @@ def export_window(fileoutput, binary=False): return vedo.plotter_instance +def _export_hdf5(fileoutput="scene.v3d"): + try: + import h5py + except ImportError: + print("h5py not installed, try: 'pip install h5py'") + return + + plt = vedo.plotter_instance + hfile = h5py.File(fileoutput, "w") + + scene = hfile.create_group("scene") + + scene["shape"] = plt.shape + scene["sharecam"] = plt.sharecam + + camera = scene.create_group("camera") + cdict = dict( + pos=plt.camera.GetPosition(), + focal_point=plt.camera.GetFocalPoint(), + viewup=plt.camera.GetViewUp(), + distance=plt.camera.GetDistance(), + clipping_range=plt.camera.GetClippingRange(), + ) + camera.attrs.update(cdict) + + scene["position"] = plt.pos + scene["size"] = plt.size + scene["axes"] = plt.axes if plt.axes else "" + scene["title"] = plt.title + scene["background_color"] = colors.get_color(plt.renderer.GetBackground()) + if plt.renderer.GetGradientBackground(): + scene["background_color2"] = plt.renderer.GetBackground2() + else: + scene["background_color2"] = "" + scene["use_depth_peeling"] = settings.use_depth_peeling + scene["render_lines_as_tubes"] = settings.render_lines_as_tubes + scene["hidden_line_removal"] = settings.hidden_line_removal + scene["use_parallel_projection"] = plt.camera.GetParallelProjection() + scene["default_font"] = settings.default_font + + onscreen = [] + for a in plt.get_actors(): + onscreen.append(a.retrieve_object()) + + vobjs = [] + for i, vob in enumerate(set(plt.objects + onscreen)): + if isinstance(vob, str): + vobjs.append(vedo.Text2D(vob)) + elif not vob.actor.GetVisibility(): + continue + elif not hasattr(vob, "name"): + continue + elif isinstance(vob, Assembly): + vobjs += vob.recursive_unpack() + else: + vobjs.append(vob) + + objects = scene.create_group("objects") + for i, vob in enumerate(set(vobjs)): + + cname = vob.__class__.__name__ + hmesh = objects.create_group(f"{cname}_{vob.name}_{i}") + + hmesh["filename"] = vob.filename + hmesh["name"] = vob.name + hmesh["time"] = vob.time + hmesh["rendered_at"] = list(vob.rendered_at) + + info = hmesh.create_group("info") + info.attrs.update(vob.info) + + props = hmesh.create_group("properties") + + dataset = hmesh.create_group("dataset") + try: + cells = vob.cells + if len(cells)==0 or utils.is_ragged(cells): + dataset.create_dataset("cells", data=cells) + elif vob.nvertices < 256: #careful vertices not cells! + dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint8)) + elif vob.nvertices < 65535: #careful vertices not cells! + dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint16)) + else: + dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint32)) + + dataset.create_dataset("points", data=vob.vertices.astype(float)) + dataset.create_dataset("lines", data=vob.lines) + + except AttributeError as e: + # print("pts-cells fails for", e) + pass + + ######################################################## Points-Mesh + try: + dataset.create_dataset("transform", data=vob.transform.matrix) + except AttributeError: + dataset.create_dataset("transform", data=np.eye(4)) + + try: + dataset.create_group("pointdata") + for key in vob.pointdata.keys(): + if "Normals" in key: + continue + dataset["pointdata"].create_dataset(key, data=vob.pointdata[key]) + dataset.create_group("celldata") + for key in vob.celldata.keys(): + if "Normals" in key: + continue + dataset["celldata"].create_dataset(key, data=vob.celldata[key]) + dataset.create_group("metadata") + for key in vob.metadata.keys(): + dataset["metadata"].create_dataset(key, data=vob.metadata[key]) + + v = vob.dataset.GetPointData().GetScalars() + dataset["pointdata"]["active_scalars"] = v.GetName() if v else "" + v = vob.dataset.GetPointData().GetVectors() + dataset["pointdata"]["active_vectors"] = v.GetName() if v else "" + v = vob.dataset.GetPointData().GetTensors() + dataset["pointdata"]["active_tensors"] = v.GetName() if v else "" + + v = vob.dataset.GetCellData().GetScalars() + dataset["celldata"]["active_scalars"] = v.GetName() if v else "" + v = vob.dataset.GetCellData().GetVectors() + dataset["celldata"]["active_vectors"] = v.GetName() if v else "" + v = vob.dataset.GetCellData().GetTensors() + dataset["celldata"]["active_tensors"] = v.GetName() if v else "" + + except AttributeError as e: + # print("pointcelldata fails for", e) + pass + + try: + lut = vob.mapper.GetLookupTable() + if lut: + nlut = lut.GetNumberOfTableValues() + lutvals = [] + for i in range(nlut): + v4 = lut.GetTableValue(i) # r, g, b, alpha + lutvals.append(v4) + props["lut"] = lutvals + props["lut_range"] = lut.GetRange() + else: + props["lut"] = None + props["lut_range"] = None + + props["representation"] = vob.properties.GetRepresentation() + props["pointsize"] = vob.properties.GetPointSize() + + evis = vob.properties.GetEdgeVisibility() + props["linewidth"] = vob.linewidth() if evis else 0 + props["linecolor"] = vob.properties.GetEdgeColor() if evis else "" + + props["ambient"] = vob.properties.GetAmbient() + props["diffuse"] = vob.properties.GetDiffuse() + props["specular"] = vob.properties.GetSpecular() + props["specularpower"] = vob.properties.GetSpecularPower() + props["specularcolor"] = vob.properties.GetSpecularColor() + props["shading"] = vob.properties.GetInterpolation() # flat, phong + props["color"] = vob.properties.GetColor() + props["alpha"] = vob.properties.GetOpacity() + props["lighting_is_on"] = vob.properties.GetLighting() + bfp = vob.actor.GetBackfaceProperty() + props["backcolor"] = bfp.GetColor() if bfp else "" + props["scalar_visibility"] = vob.mapper.GetScalarVisibility() + hastxt = hasattr(vob, "_texture") and vob._texture + props["texture"] = vob._texture if hastxt else "" + except AttributeError: + pass + + ######################################################## Volume + if isinstance(vob, vedo.Volume): + try: + arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) + arr = arr.reshape(vob.dataset.GetDimensions()) + # dataset.create_dataset("array", data=arr) + + props["mode"] = vob.mode() + + ctf = vob.properties.GetRGBTransferFunction() + otf = vob.properties.GetScalarOpacity() + gotf = vob.properties.GetGradientOpacity() + smin, smax = ctf.GetRange() + xs = np.linspace(smin, smax, num=100, endpoint=True) + cols, als, algrs = [], [], [] + for x in xs: + cols.append(ctf.GetColor(x)) + als.append(otf.GetValue(x)) + if gotf: + algrs.append(gotf.GetValue(x)) + props["color"] = cols + props["alpha"] = als + props["alphagrad"] = algrs + except AttributeError as e: + # print("vol fails for", e) + pass + + ######################################################## Image + if isinstance(vob, vedo.Image): + try: + dataset["array"] = vob.tonumpy() + except AttributeError as e: + # print("img fails for", e) + pass + + ######################################################## Text2D + if isinstance(vob, vedo.Text2D): + props["text"] = vob.text() + props["position"] = vob.GetPosition() + props["color"] = vob.properties.GetColor() + props["font"] = vob.fontname + props["size"] = vob.properties.GetFontSize() / 22.5 + props["bgcol"] = vob.properties.GetBackgroundColor() + props["alpha"] = vob.properties.GetBackgroundOpacity() + props["frame"] = vob.properties.GetFrame() + + hfile.close() + def import_window(fileinput, mtl_file=None, texture_path=None): """Import a whole scene from a Numpy or OBJ wavefront file. diff --git a/vedo/shapes.py b/vedo/shapes.py index df070f5b..386e9bfa 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import os from functools import lru_cache +from weakref import ref as weak_ref_to import numpy as np import vedo.vtkclasses as vtk @@ -4432,13 +4433,17 @@ def __init__(self): self.rendered_at = set() self.properties = None + self.name = "Text" + self.filename = "" + self.time = 0 + self.info = {} + if isinstance(settings.default_font, int): lfonts = list(settings.font_parameters.keys()) font = settings.default_font % len(lfonts) self.fontname = lfonts[font] else: self.fontname = settings.default_font - self.name = "Text" def angle(self, a): """Orientation angle in degrees""" @@ -4630,11 +4635,14 @@ def __init__( ![](https://vedo.embl.es/images/basic/colorcubes.png) """ super().__init__() + self.name = "Text2D" self.mapper = vtk.new("TextMapper") self.SetMapper(self.mapper) self.properties = self.mapper.GetTextProperty() + self.actor = self + # self.actor.retrieve_object = weak_ref_to(self) self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() diff --git a/vedo/volume.py b/vedo/volume.py index c6801874..a7224c3f 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -73,6 +73,8 @@ def __init__( self.name = "Volume" self.filename = "" self.info = {} + self.time = 0 + self.rendered_at = set() self.actor = vtk.vtkVolume() self.actor.retrieve_object = weak_ref_to(self) From 195fc83134bdb607d1c973ffb03da432b1f13b80 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sun, 5 Nov 2023 03:52:13 +0100 Subject: [PATCH 215/251] remove Callable --- vedo/applications.py | 3 +-- vedo/plotter.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/vedo/applications.py b/vedo/applications.py index c229ad2a..7b8471e9 100644 --- a/vedo/applications.py +++ b/vedo/applications.py @@ -2,7 +2,6 @@ # -*- coding: utf-8 -*- import time import os -from typing import Callable import numpy as np @@ -1935,7 +1934,7 @@ class AnimationPlayer(vedo.Plotter): def __init__( self, - func: Callable[[int],None], + func, irange: tuple, dt: float = 1.0, loop: bool = True, diff --git a/vedo/plotter.py b/vedo/plotter.py index c6d7ebb9..8cf966c5 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3,7 +3,6 @@ import os.path import sys import time -from typing import Callable import numpy as np import vedo.vtkclasses as vtk @@ -1573,7 +1572,7 @@ def dolly(self, value): ################################################################## def add_slider( self, - sliderfunc: Callable, + sliderfunc, xmin, xmax, value=None, From b59e9ac89888dc416d78ea0d89f9f0e8d1b1e7ea Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Sun, 5 Nov 2023 21:22:39 +0100 Subject: [PATCH 216/251] improvements to npz format dump --- vedo/cli.py | 20 +- vedo/file_io.py | 1001 ++++++++++++++++++++--------------------------- vedo/tetmesh.py | 12 +- vedo/ugrid.py | 14 +- vedo/utils.py | 12 +- 5 files changed, 465 insertions(+), 594 deletions(-) diff --git a/vedo/cli.py b/vedo/cli.py index 1b47bf80..f0d45520 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -156,16 +156,6 @@ def system_info(): except ModuleNotFoundError: pass - try: - from screeninfo import get_monitors - for m in get_monitors(): - pr = " " - if m.is_primary: - pr = "(primary)" - printc(f"monitor {pr} : {m.name}, resolution=({m.width}, {m.height}), x={m.x}, y={m.y}") - except ModuleNotFoundError: - printc('monitor : info is unavailable. Try "pip install screeninfo".') - try: import k3d printc("k3d version :", k3d.__version__, bold=0, dim=1) @@ -824,13 +814,9 @@ def draw_scene(args): ########################################################## # loading a full scene - if ".npy" in args.files[0] or ".npz" in args.files[0] and nfiles == 1: - - objct = file_io.load(args.files[0], force=args.reload) - if isinstance(objct, Plotter): # loading a full scene - objct.show(mode=interactor_mode) - else: # loading a set of meshes - plt.show(objct, mode=interactor_mode) + if ".npy" in args.files[0] or ".npz" in args.files[0]: + plt = file_io.import_window(args.files[0]) + plt.show(mode=interactor_mode).close() return ######################################################### diff --git a/vedo/file_io.py b/vedo/file_io.py index 6dc25e70..2ce18779 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -31,7 +31,6 @@ "loadStructuredPoints", "loadStructuredGrid", "loadRectilinearGrid", - "loadUnStructuredGrid", # "load_transform", # LinearTransform("file.mat") substitutes this "write", "export_window", @@ -171,7 +170,7 @@ """ - +######################################################################## def load(inputobj, unpack=True, force=False): """ Load any vedo objects from file or from the web. @@ -228,25 +227,23 @@ def load(inputobj, unpack=True, force=False): reader.SetDirectoryName(fod) reader.Update() image = reader.GetOutput() - actor = Volume(image) - - actor.info["PixelSpacing"] = reader.GetPixelSpacing() - actor.info["Width"] = reader.GetWidth() - actor.info["Height"] = reader.GetHeight() - actor.info["PositionPatient"] = reader.GetImagePositionPatient() - actor.info["OrientationPatient"] = reader.GetImageOrientationPatient() - actor.info["BitsAllocated"] = reader.GetBitsAllocated() - actor.info["PixelRepresentation"] = reader.GetPixelRepresentation() - actor.info["NumberOfComponents"] = reader.GetNumberOfComponents() - actor.info["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() - actor.info["RescaleSlope"] = reader.GetRescaleSlope() - actor.info["RescaleOffset"] = reader.GetRescaleOffset() - actor.info["PatientName"] = reader.GetPatientName() - actor.info["StudyUID"] = reader.GetStudyUID() - actor.info["StudyID"] = reader.GetStudyID() - actor.info["GantryAngle"] = reader.GetGantryAngle() - - acts.append(actor) + vol = Volume(image) + vol.info["PixelSpacing"] = reader.GetPixelSpacing() + vol.info["Width"] = reader.GetWidth() + vol.info["Height"] = reader.GetHeight() + vol.info["PositionPatient"] = reader.GetImagePositionPatient() + vol.info["OrientationPatient"] = reader.GetImageOrientationPatient() + vol.info["BitsAllocated"] = reader.GetBitsAllocated() + vol.info["PixelRepresentation"] = reader.GetPixelRepresentation() + vol.info["NumberOfComponents"] = reader.GetNumberOfComponents() + vol.info["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() + vol.info["RescaleSlope"] = reader.GetRescaleSlope() + vol.info["RescaleOffset"] = reader.GetRescaleOffset() + vol.info["PatientName"] = reader.GetPatientName() + vol.info["StudyUID"] = reader.GetStudyUID() + vol.info["StudyID"] = reader.GetStudyID() + vol.info["GantryAngle"] = reader.GetGantryAngle() + acts.append(vol) else: ### it's a normal directory utils.humansort(flist) @@ -270,15 +267,15 @@ def load(inputobj, unpack=True, force=False): else: return acts - +######################################################################## def _load_file(filename, unpack): fl = filename.lower() - ################################################################# other formats: + ########################################################## other formats: if fl.endswith(".xml") or fl.endswith(".xml.gz") or fl.endswith(".xdmf"): # Fenics tetrahedral file actor = loadDolfin(filename) - elif fl.endswith(".neutral") or fl.endswith(".neu"): # neutral tetrahedral file + elif fl.endswith(".neutral") or fl.endswith(".neu"): # neutral tets actor = loadNeutral(filename) elif fl.endswith(".gmsh"): # gmesh file actor = loadGmesh(filename) @@ -302,7 +299,7 @@ def _load_file(filename, unpack): wacts.append(act) actor = Assembly(wacts) - ################################################################# volumetric: + ######################################################## volumetric: elif ( fl.endswith(".tif") or fl.endswith(".tiff") @@ -316,7 +313,7 @@ def _load_file(filename, unpack): img = loadImageData(filename) actor = Volume(img) - ################################################################# 2D images: + ######################################################### 2D images: elif ( fl.endswith(".png") or fl.endswith(".jpg") @@ -343,9 +340,9 @@ def _load_file(filename, unpack): picr.SetFileName(filename) picr.Update() - actor = Image(picr.GetOutput()) # object derived from vtk.vtkImageActor() + actor = Image(picr.GetOutput()) - ################################################################# multiblock: + ######################################################### multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): read = vtk.new("XMLMultiBlockDataReader") read.SetFileName(filename) @@ -359,7 +356,6 @@ def _load_file(filename, unpack): b, ( vtk.vtkPolyData, - vtk.vtkUnstructuredGrid, vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid, ), @@ -372,26 +368,16 @@ def _load_file(filename, unpack): return acts return mb - ################################################################# numpy: - elif fl.endswith(".npy") or fl.endswith(".npz"): - acts = loadnumpy(filename) - - if unpack is False: - return Assembly(acts) - return acts - + ########################################################### elif fl.endswith(".geojson"): return loadGeoJSON(filename) elif fl.endswith(".pvd"): return loadPVD(filename) - ################################################################# polygonal mesh: + ########################################################### polygonal mesh: else: if fl.endswith(".vtk"): # read all legacy vtk types - - # output can be: - # PolyData, StructuredGrid, StructuredPoints, UnstructuredGrid, RectilinearGrid reader = vtk.new("DataSetReader") reader.ReadAllScalarsOn() reader.ReadAllVectorsOn() @@ -399,7 +385,6 @@ def _load_file(filename, unpack): reader.ReadAllFieldsOn() reader.ReadAllNormalsOn() reader.ReadAllColorScalarsOn() - elif fl.endswith(".ply"): reader = vtk.new("PLYReader") elif fl.endswith(".obj"): @@ -436,7 +421,7 @@ def _load_file(filename, unpack): routput = reader.GetOutput() if not routput: - vedo.logger.error(f"unable to load {filename}") + vedo.logger.error(f"unable to load {filename}") return None if isinstance(routput, vtk.vtkUnstructuredGrid): @@ -451,11 +436,12 @@ def _load_file(filename, unpack): actor.file_size, actor.created = file_info(filename) return actor - +######################################################################## def download(url, force=False, verbose=True): - """Retrieve a file from a URL, save it locally and return its path. - Use `force` to force reload and discard cached copies.""" - + """ + Retrieve a file from a URL, save it locally and return its path. + Use `force` to force reload and discard cached copies. + """ if not url.startswith("https://"): vedo.logger.error(f"Invalid URL (must start with https):\n{url}") return url @@ -480,7 +466,6 @@ def download(url, force=False, verbose=True): try: from urllib.request import urlopen, Request - req = Request(url, headers={"User-Agent": "Mozilla/5.0"}) if verbose: colors.printc("reading", basename, "from", url.split("/")[2][:40], "...", end="") @@ -488,7 +473,6 @@ def download(url, force=False, verbose=True): except ImportError: import urllib2 import contextlib - urlopen = lambda url_: contextlib.closing(urllib2.urlopen(url_)) req = url if verbose: @@ -501,7 +485,7 @@ def download(url, force=False, verbose=True): colors.printc(" done.") return tmp_file.name - +######################################################################## def gunzip(filename): """Unzip a `.gz` file to a temporary file and returns its path.""" if not filename.endswith(".gz"): @@ -519,20 +503,20 @@ def gunzip(filename): inF.close() return tmp_file.name - +######################################################################## def file_info(file_path): """Return the file size and creation time of input file""" - sz, created = "", "" + siz, created = "", "" if os.path.isfile(file_path): - file_info = os.stat(file_path) - num = file_info.st_size + f_info = os.stat(file_path) + num = f_info.st_size for x in ["B", "KB", "MB", "GB", "TB"]: if num < 1024.0: break num /= 1024.0 - sz = "%3.1f%s" % (num, x) + siz = "%3.1f%s" % (num, x) created = time.ctime(os.path.getmtime(file_path)) - return sz, created + return siz, created ################################################################### @@ -553,7 +537,7 @@ def loadStructuredPoints(filename, as_points=True): return pts return reader.GetOutput() - +######################################################################## def loadStructuredGrid(filename): """Load and return a `vtkStructuredGrid` object from file.""" if filename.endswith(".vts"): @@ -564,18 +548,6 @@ def loadStructuredGrid(filename): reader.Update() return reader.GetOutput() - -def loadUnStructuredGrid(filename): - """Load and return a `vtkunStructuredGrid` object from file.""" - if filename.endswith(".vtu"): - reader = vtk.new("XMLUnstructuredGridReader") - else: - reader = vtk.new("UnstructuredGridReader") - reader.SetFileName(filename) - reader.Update() - return reader.GetOutput() - - def loadRectilinearGrid(filename): """Load and return a `vtkRectilinearGrid` object from file.""" if filename.endswith(".vtr"): @@ -586,7 +558,7 @@ def loadRectilinearGrid(filename): reader.Update() return reader.GetOutput() - +######################################################################## def loadXMLData(filename): """Read any type of vtk data object encoded in XML format.""" reader = vtk.new("XMLGenericDataObjectReader") @@ -625,10 +597,9 @@ def load3DS(filename): # newa.pos(a.GetPosition()) # newa.copy_properties_from(a) # wrapped_acts.append(newa) - return wrapped_acts - +######################################################################## def loadOFF(filename): """Read the OFF file format (polygonal mesh).""" with open(filename, "r", encoding="UTF-8") as f: @@ -667,7 +638,7 @@ def loadOFF(filename): return Mesh(utils.buildPolyData(vertices, faces)) - +######################################################################## def loadGeoJSON(filename): """Load GeoJSON files.""" jr = vtk.new("GeoJSONReader") @@ -675,7 +646,7 @@ def loadGeoJSON(filename): jr.Update() return Mesh(jr.GetOutput()) - +######################################################################## def loadDolfin(filename, exterior=False): """Reads a `Fenics/Dolfin` file format (.xml or .xdmf). Return an `Mesh` object.""" @@ -702,9 +673,9 @@ def loadDolfin(filename, exterior=False): poly = app.GetOutput() return Mesh(poly).lw(0.1) - +######################################################################## def loadPVD(filename): - """Reads a paraview set of files.""" + """Read paraview files.""" import xml.etree.ElementTree as et tree = et.parse(filename) @@ -728,9 +699,12 @@ def loadPVD(filename): return None return listofobjs - +######################################################################## def loadNeutral(filename): - """Reads a `Neutral` tetrahedral file format. Return an `Mesh` object.""" + """ + Reads a `Neutral` tetrahedral file format. + Returns an `Mesh` object. + """ with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() @@ -750,7 +724,7 @@ def loadNeutral(filename): poly = utils.buildPolyData(coords, idolf_tets) return Mesh(poly) - +######################################################################## def loadGmesh(filename): """Reads a `gmesh` file format. Return an `Mesh` object.""" with open(filename, "r", encoding="UTF-8") as f: @@ -783,10 +757,13 @@ def loadGmesh(filename): poly = utils.buildPolyData(node_coords, elements, indexOffset=1) return Mesh(poly) - +######################################################################## def loadPCD(filename): """Return a `Mesh` made of only vertex points - from `Point Cloud` file format. Return an `Points` object.""" + from the `PointCloud` library file format. + + Returns an `Points` object. + """ with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() @@ -809,250 +786,89 @@ def loadPCD(filename): poly = utils.buildPolyData(pts) return Points(poly).point_size(4) -def tonumpy(obj): - """Dump a vedo object to numpy format.""" - - adict = {} - adict["type"] = "unknown" - - ######################################################## - def _fillcommon(obj, adict): - adict["filename"] = obj.filename - adict["name"] = obj.name - adict["time"] = obj.time - adict["rendered_at"] = obj.rendered_at - adict["position"] = obj.pos() - adict["info"] = obj.info - - try: - # GetMatrix might not exist for non linear transforms - m = np.eye(4) - vm = obj.get_transform().GetMatrix() - for i in [0, 1, 2, 3]: - for j in [0, 1, 2, 3]: - m[i, j] = vm.GetElement(i, j) - adict["transform"] = m - minv = np.eye(4) - vm.Invert() - for i in [0, 1, 2, 3]: - for j in [0, 1, 2, 3]: - minv[i, j] = vm.GetElement(i, j) - adict["transform_inverse"] = minv - except AttributeError: - adict["transform"] = [] - adict["transform_inverse"] = [] - - ######################################################## - def _fillmesh(obj, adict): - - adict["points"] = obj.vertices.astype(float) - poly = obj.dataset - - adict["cells"] = None - if poly.GetNumberOfPolys(): - try: - adict["cells"] = np.array(obj.cells, dtype=np.uint32) - except ValueError: # in case of inhomogeneous shape - adict["cells"] = obj.cells - - adict["lines"] = None - if poly.GetNumberOfLines(): - adict["lines"] = obj.lines - - adict["pointdata"] = [] - for iname in obj.pointdata.keys(): - if not iname: - continue - if "Normals" in iname.lower(): - continue - arr = poly.GetPointData().GetArray(iname) - adict["pointdata"].append([utils.vtk2numpy(arr), iname]) - - adict["celldata"] = [] - for iname in obj.celldata.keys(): - if not iname: - continue - if "Normals" in iname.lower(): - continue - arr = poly.GetCellData().GetArray(iname) - adict["celldata"].append([utils.vtk2numpy(arr), iname]) - - adict["activedata"] = None - if poly.GetPointData().GetScalars(): - adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] - elif poly.GetCellData().GetScalars(): - adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] - - adict["LUT"] = None - adict["LUT_range"] = None - lut = obj.mapper.GetLookupTable() - if lut: - nlut = lut.GetNumberOfTableValues() - lutvals = [] - for i in range(nlut): - v4 = lut.GetTableValue(i) # r, g, b, alpha - lutvals.append(v4) - adict["LUT"] = lutvals - adict["LUT_range"] = lut.GetRange() - - prp = obj.properties - adict["alpha"] = prp.GetOpacity() - adict["representation"] = prp.GetRepresentation() - adict["pointsize"] = prp.GetPointSize() - - adict["linecolor"] = None - adict["linewidth"] = None - if prp.GetEdgeVisibility(): - adict["linewidth"] = obj.linewidth() - adict["linecolor"] = prp.GetEdgeColor() - - adict["ambient"] = prp.GetAmbient() - adict["diffuse"] = prp.GetDiffuse() - adict["specular"] = prp.GetSpecular() - adict["specularpower"] = prp.GetSpecularPower() - adict["specularcolor"] = prp.GetSpecularColor() - adict["shading"] = prp.GetInterpolation() # flat phong..: - adict["color"] = prp.GetColor() - adict["lighting_is_on"] = prp.GetLighting() - adict["backcolor"] = None - if obj.actor.GetBackfaceProperty(): - adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() - - adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() - adict["texture"] = obj._texture if hasattr(obj, "_texture") else None - - ######################################################## Assembly - if isinstance(obj, Assembly): - pass - # adict['type'] = 'Assembly' - # _fillcommon(obj, adict) - # adict['actors'] = [] - # for a in obj.unpack(): - # assdict = dict() - # if isinstance(a, Mesh): - # _fillmesh(a, assdict) - # adict['actors'].append(assdict) - - ######################################################## Points/Mesh - elif isinstance(obj, Points): - adict["type"] = "Mesh" - _fillcommon(obj, adict) - _fillmesh(obj, adict) - - ######################################################## Volume - elif isinstance(obj, Volume): - adict["type"] = "Volume" - _fillcommon(obj, adict) - imgdata = obj.dataset - arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) - adict["array"] = arr.reshape(imgdata.GetDimensions()) - adict["mode"] = obj.mode() - # adict['jittering'] = obj.mapper.GetUseJittering() - - prp = obj.properties - ctf = prp.GetRGBTransferFunction() - otf = prp.GetScalarOpacity() - gotf = prp.GetGradientOpacity() - smin, smax = ctf.GetRange() - xs = np.linspace(smin, smax, num=100, endpoint=True) - cols, als, algrs = [], [], [] - for x in xs: - cols.append(ctf.GetColor(x)) - als.append(otf.GetValue(x)) - if gotf: - algrs.append(gotf.GetValue(x)) - adict["color"] = cols - adict["alpha"] = als - adict["alphagrad"] = algrs - - ######################################################## Image - elif isinstance(obj, Image): - adict["type"] = "Image" - _fillcommon(obj, adict) - adict["array"] = obj.tonumpy() - - ######################################################## Text2D - elif isinstance(obj, vedo.Text2D): - adict["type"] = "Text2D" - adict["rendered_at"] = obj.rendered_at - adict["text"] = obj.text() - adict["position"] = obj.GetPosition() - adict["color"] = obj.properties.GetColor() - adict["font"] = obj.fontname - adict["size"] = obj.properties.GetFontSize() / 22.5 - adict["bgcol"] = obj.properties.GetBackgroundColor() - adict["alpha"] = obj.properties.GetBackgroundOpacity() - adict["frame"] = obj.properties.GetFrame() - # print('tonumpy(): vedo.Text2D', obj.text()[:10], obj.font(), obj.GetPosition()) - - else: - pass - # colors.printc('Unknown object type in tonumpy()', [obj], c='r') - - return adict - - -def loadnumpy(inobj): - """Load a vedo format file or scene.""" +######################################################################### +def _import_npy(fileinput): + """Import a vedo scene from numpy format.""" # make sure the numpy file is not containing a scene - if isinstance(inobj, str): # user passing a file - - if inobj.endswith(".npy"): - data = np.load(inobj, allow_pickle=True, encoding="latin1") # .flatten() - elif inobj.endswith(".npz"): - data = np.load(inobj, allow_pickle=True)["vedo_scenes"] - - isdict = hasattr(data[0], "keys") - - if isdict and "objects" in data[0].keys(): # loading a full scene!! - return import_window(data[0]) - - # it's a very normal numpy data object? just return it! - if not isdict: - return data - if "type" not in data[0].keys(): - return data + if fileinput.endswith(".npy"): + data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] + elif fileinput.endswith(".npz"): + data = np.load(fileinput, allow_pickle=True)["vedo_scenes"][0] - else: - data = inobj + if "render_lines_as_tubes" in data.keys(): + settings.render_lines_as_tubes = data["render_lines_as_tubes"] + if "hidden_line_removal" in data.keys(): + settings.hidden_line_removal = data["hidden_line_removal"] + if "visible_grid_edges" in data.keys(): + settings.visible_grid_edges = data["visible_grid_edges"] + if "use_parallel_projection" in data.keys(): + settings.use_parallel_projection = data["use_parallel_projection"] + if "use_polygon_offset" in data.keys(): + settings.use_polygon_offset = data["use_polygon_offset"] + if "polygon_offset_factor" in data.keys(): + settings.polygon_offset_factor = data["polygon_offset_factor"] + if "polygon_offset_units" in data.keys(): + settings.polygon_offset_units = data["polygon_offset_units"] + if "interpolate_scalars_before_mapping" in data.keys(): + settings.interpolate_scalars_before_mapping = data["interpolate_scalars_before_mapping"] + if "default_font" in data.keys(): + settings.default_font = data["default_font"] + if "use_depth_peeling" in data.keys(): + settings.use_depth_peeling = data["use_depth_peeling"] + + axes = data.pop("axes", 4) + title = data.pop("title", "") + backgrcol = data.pop("backgrcol", "white") + backgrcol2 = data.pop("backgrcol2", None) + cam = data.pop("camera", None) + + if data["shape"] != (1, 1): + data["size"] = "auto" # disable size + + plt = vedo.Plotter( + size=data["size"], # not necessarily a good idea to set it + # shape=data['shape'], # will need to create a Renderer class first + axes=axes, + title=title, + bg=backgrcol, + bg2=backgrcol2, + ) - ###################################################### + if cam: + if "pos" in cam.keys(): + plt.camera.SetPosition(cam["pos"]) + if "focalPoint" in cam.keys(): + plt.camera.SetFocalPoint(cam["focalPoint"]) + if "focal_point" in cam.keys(): + plt.camera.SetFocalPoint(cam["focal_point"]) + if "viewup" in cam.keys(): + plt.camera.SetViewUp(cam["viewup"]) + if "distance" in cam.keys(): + plt.camera.SetDistance(cam["distance"]) + if "clippingRange" in cam.keys(): + plt.camera.SetClippingRange(cam["clippingRange"]) + if "clipping_range" in cam.keys(): + plt.camera.SetClippingRange(cam["clipping_range"]) + plt.resetcam = False + + ########################## def _load_common(obj, d): keys = d.keys() - if "time" in keys: - obj.time = d["time"] - if "name" in keys: - obj.name = d["name"] - if "filename" in keys: - obj.filename = d["filename"] - if "info" in keys: - obj.info = d["info"] - - # if "transform" in keys and len(d["transform"]) == 4: - # vm = vtk.vtkMatrix4x4() - # for i in [0, 1, 2, 3]: - # for j in [0, 1, 2, 3]: - # vm.SetElement(i, j, d["transform"][i, j]) - # obj.apply_transform(vm) - - elif "position" in keys: - obj.pos(d["position"]) - - ###################################################### + if "time" in keys: obj.time = d["time"] + if "name" in keys: obj.name = d["name"] + if "info" in keys: obj.info = d["info"] + if "filename" in keys: obj.filename = d["filename"] + if "position" in keys: obj.pos(d["position"]) + + ########################### def _buildmesh(d): keys = d.keys() vertices = d["points"] if len(vertices) == 0: return None - - cells = None - if "cells" in keys: - cells = d["cells"] - - lines = None - if "lines" in keys: - lines = d["lines"] + cells = d["cells"] if "cells" in keys else None + lines = d["lines"] if "lines" in keys else None poly = utils.buildPolyData(vertices, cells, lines) msh = Mesh(poly) @@ -1064,16 +880,14 @@ def _buildmesh(d): if 'specular' in keys: prp.SetSpecular(d['specular']) if 'specularpower' in keys: prp.SetSpecularPower(d['specularpower']) if 'specularcolor' in keys: prp.SetSpecularColor(d['specularcolor']) - if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) + if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) if 'shading' in keys: prp.SetInterpolation(d['shading']) if 'alpha' in keys: prp.SetOpacity(d['alpha']) if 'opacity' in keys: prp.SetOpacity(d['opacity']) # synonym if 'representation' in keys: prp.SetRepresentation(d['representation']) if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) - if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) if 'linecolor' in keys and d['linecolor']: msh.linecolor(d['linecolor']) - if 'color' in keys and d['color'] is not None: msh.color(d['color']) if 'backcolor' in keys and d['backcolor'] is not None: @@ -1086,8 +900,6 @@ def _buildmesh(d): for psc, pscname in d["pointdata"]: msh.pointdata[pscname] = psc - msh.mapper.ScalarVisibilityOff() # deactivate scalars - if "LUT" in keys and "activedata" in keys and d["activedata"]: # print(d['activedata'],'', msh.filename) lut_list = d["LUT"] @@ -1110,6 +922,7 @@ def _buildmesh(d): if "shading" in keys and int(d["shading"]) > 0: msh.compute_normals(cells=0) # otherwise cannot renderer phong + msh.mapper.ScalarVisibilityOff() # deactivate scalars if "scalarvisibility" in keys: if d["scalarvisibility"]: msh.mapper.ScalarVisibilityOn() @@ -1118,15 +931,11 @@ def _buildmesh(d): if "texture" in keys and d["texture"]: msh.texture(**d["texture"]) - return msh - ###################################################### - + ############################################## objs = [] - for d in data: - # print('loadnumpy:', d['type'], d) - + for d in data["objects"]: ### Mesh if d['type'].lower() == 'mesh': a = _buildmesh(d) @@ -1146,9 +955,7 @@ def _buildmesh(d): elif d['type'].lower() == 'volume': vol = Volume(d["array"]) _load_common(vol, d) - if "jittering" in d.keys(): - vol.jittering(d["jittering"]) - # print(d['mode']) + if "jittering" in d.keys(): vol.jittering(d["jittering"]) vol.mode(d["mode"]) vol.color(d["color"]) vol.alpha(d["alpha"]) @@ -1170,24 +977,34 @@ def _buildmesh(d): t.frame(d["bgcol"]) objs.append(t) - ### Annotation ## backward compatibility - will disappear + ### Annotation ## backward compatibility - will disappear elif d['type'].lower() == 'annotation': - pos = d["position"] if isinstance(pos, int): pos = "top-left" d["size"] *= 2.7 t = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]).pos(pos) t.background(d["bgcol"], d["alpha"]).size(d["size"]).frame(d["bgcol"]) - objs.append(t) ## backward compatibility + objs.append(t) ## backward compatibility - will disappear - if len(objs) == 1: - return objs[0] - if len(objs) == 0: - return None - return objs + plt.add(objs) + return plt +########################################################### +def _import_hdf5(fileinput): + try: + import h5py + except ImportError as e: + vedo.logger.error(f"{e}. Try: 'pip install h5py'") + return + plt = vedo.Plotter() + hfile = h5py.File(fileinput, "r") + + hfile.close() + return plt + +########################################################### def loadImageData(filename): """Read and return a `vtkImageData` object from file.""" if ".tif" in filename.lower(): @@ -1220,22 +1037,16 @@ def loadImageData(filename): image = reader.GetOutput() return image - ########################################################### def write(objct, fileoutput, binary=True): """ - Write object to file. + Write object to file. Same as `save()`. - Possile extensions are: - - `vtk, vti, npy, npz, ply, obj, stl, byu, vtp, vti, mhd, xyz, tif, png, bmp` + Supported extensions are: + + - `vtk, vti, ply, obj, stl, byu, vtp, vti, mhd, xyz, xml, tif, png, bmp` """ obj = objct.dataset - # if isinstance(obj, Points): # picks transformation - # obj = objct - # elif isinstance(obj, (vtk.vtkActor, vtk.vtkVolume)): - # obj = objct - # elif isinstance(obj, (vtk.vtkPolyData, vtk.vtkImageData)): - # obj = objct fr = fileoutput.lower() if fr.endswith(".vtk"): @@ -1257,18 +1068,6 @@ def write(objct, fileoutput, binary=True): writer = vtk.new("XMLPolyDataWriter") elif fr.endswith(".vtu"): writer = vtk.new("XMLUnstructuredGridWriter") - elif fr.endswith(".vtm"): - g = vtk.new("MultiBlockDataGroupFilter") - for ob in objct: - if isinstance(ob, (Points, Volume)): # picks transformation - g.AddInputData(ob) - g.Update() - mb = g.GetOutputDataObject(0) - wri = vtk.new("XMLMultiBlockDataWriter") - wri.SetInputData(mb) - wri.SetFileName(fileoutput) - wri.Write() - return mb elif fr.endswith(".xyz"): writer = vtk.new("SimplePointsWriter") elif fr.endswith(".facet"): @@ -1288,17 +1087,6 @@ def write(objct, fileoutput, binary=True): elif fr.endswith(".tif") or fr.endswith(".tiff"): writer = vtk.new("TIFFWriter") writer.SetFileDimensionality(len(obj.GetDimensions())) - elif fr.endswith(".npy") or fr.endswith(".npz"): - if utils.is_sequence(objct): - objslist = objct - else: - objslist = [objct] - dicts2save = [] - for obj in objslist: - dicts2save.append(tonumpy(obj)) - np.save(fileoutput, dicts2save) - return dicts2save - elif fr.endswith(".obj"): with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write("# OBJ file format with ext .obj\n") @@ -1314,7 +1102,6 @@ def write(objct, fileoutput, binary=True): outF.write("vt " + str(vt[0]) + " " + str(vt[1]) + " 0.0\n") if isinstance(objct, Mesh): - for i, f in enumerate(objct.cells): fs = "" for fi in f: @@ -1329,7 +1116,6 @@ def write(objct, fileoutput, binary=True): for li in l: ls += str(li + 1) + " " outF.write(f"l {ls}\n") - return objct elif fr.endswith(".xml"): # write tetrahedral dolfin xml @@ -1392,44 +1178,15 @@ def write(objct, fileoutput, binary=True): vedo.logger.error(f"could not save {fileoutput}") return objct - -def write_transform(inobj, filename="transform.mat", comment=""): - """ - Save a transformation for a mesh or pointcloud to ASCII file. - - Arguments: - filename : (str) - output file name - comment : (str) - some optional comment - """ - if isinstance(inobj, Points): - M = inobj.get_transform().GetMatrix() - elif isinstance(inobj, vtk.vtkTransform): - M = inobj.GetMatrix() - elif isinstance(inobj, vtk.vtkMatrix4x4): - M = inobj - else: - vedo.logger.error(f"in write_transform(), cannot understand input type {type(inobj)}") - - with open(filename, "w", encoding="UTF-8") as f: - if comment: - f.write("# " + comment + "\n") - for i in range(4): - f.write( - str(M.GetElement(i,0))+' '+ - str(M.GetElement(i,1))+' '+ - str(M.GetElement(i,2))+' '+ - str(M.GetElement(i,3))+'\n', - ) - f.write('\n') - +def save(obj, fileoutput="out.png", binary=True): + """Save an object to file. Same as `write()`.""" + return write(obj, fileoutput, binary) ############################################################################### -def export_window(fileoutput, binary=False): +def export_window(fileoutput, binary=False, plt=None): """ Exporter which writes out the rendered scene into an HTML, X3D - or Numpy file. + HDF5 or Numpy file. Example: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) @@ -1440,95 +1197,45 @@ def export_window(fileoutput, binary=False): .. note:: the rendering window can also be exported to `numpy` file `scene.npz` - by pressing `E` keyboard at any moment during visualization. + by pressing `E` key at any moment during visualization. """ - fr = fileoutput.lower() + if plt is None: + plt = vedo.plotter_instance + fr = fileoutput.lower() #################################################################### if fr.endswith(".npy") or fr.endswith(".npz"): - sdict = {} - plt = vedo.plotter_instance - sdict["shape"] = plt.shape - sdict["sharecam"] = plt.sharecam - sdict["camera"] = dict( - pos=plt.camera.GetPosition(), - focal_point=plt.camera.GetFocalPoint(), - viewup=plt.camera.GetViewUp(), - distance=plt.camera.GetDistance(), - clipping_range=plt.camera.GetClippingRange(), - ) - sdict["position"] = plt.pos - sdict["size"] = plt.size - sdict["axes"] = plt.axes - sdict["title"] = plt.title - sdict["backgrcol"] = colors.get_color(plt.renderer.GetBackground()) - sdict["backgrcol2"] = None - if plt.renderer.GetGradientBackground(): - sdict["backgrcol2"] = plt.renderer.GetBackground2() - sdict["use_depth_peeling"] = settings.use_depth_peeling - sdict["render_lines_as_tubes"] = settings.render_lines_as_tubes - sdict["hidden_line_removal"] = settings.hidden_line_removal - sdict["visible_grid_edges"] = settings.visible_grid_edges - sdict["use_parallel_projection"] = settings.use_parallel_projection - sdict["default_font"] = settings.default_font - sdict["objects"] = [] - - allobjs = plt.get_meshes(include_non_pickables=True) + plt.get_volumes(include_non_pickables=True) - acts2d = plt.renderer.GetActors2D() - acts2d.InitTraversal() - for _ in range(acts2d.GetNumberOfItems()): - a = acts2d.GetNextItem() - if isinstance(a, vedo.Text2D): - allobjs.append(a) - allobjs += plt.actors - - allobjs = list(set(allobjs)) # make sure its unique - - for a in allobjs: - try: - if a.actor.GetVisibility(): - sdict["objects"].append(tonumpy(a)) - except AttributeError: - try: - if a.GetVisibility(): - sdict["objects"].append(tonumpy(a)) - except AttributeError: - pass - - if fr.endswith(".npz"): - np.savez_compressed(fileoutput, vedo_scenes=[sdict]) - else: - np.save(fileoutput, [sdict]) + _export_npy(plt, fileoutput) #################################################################### - elif fr.endswith(".v3d"): - _export_hdf5(fileoutput) + elif fr.endswith(".v3d") or fr.endswith(".h5") or fr.endswith(".hdf5"): + _export_hdf5(plt, fileoutput) #################################################################### elif fr.endswith(".x3d"): - # obj = vedo.plotter_instance.get_actors() - # if vedo.plotter_instance.axes_instances: - # obj.append(vedo.plotter_instance.axes_instances[0]) + # obj = plt.get_actors() + # if plt.axes_instances: + # obj.append(plt.axes_instances[0]) # for a in obj: # if isinstance(a, Assembly): - # vedo.plotter_instance.remove(a) - # vedo.plotter_instance.add(a.unpack()) + # plt.remove(a) + # plt.add(a.unpack()) - vedo.plotter_instance.render() + plt.render() exporter = vtk.new("X3DExporter") exporter.SetBinary(binary) exporter.FastestOff() - exporter.SetInput(vedo.plotter_instance.window) + exporter.SetInput(plt.window) exporter.SetFileName(fileoutput) - # exporter.WriteToOutputStringOn() # see below + # exporter.WriteToOutputStringOn() exporter.Update() exporter.Write() + wsize = plt.window.GetSize() x3d_html = _x3d_html_template.replace("~fileoutput", fileoutput) - wsize = vedo.plotter_instance.window.GetSize() - x3d_html = x3d_html.replace("~width", str(wsize[0])) + x3d_html = x3d_html.replace("~width", str(wsize[0])) x3d_html = x3d_html.replace("~height", str(wsize[1])) with open(fileoutput.replace(".x3d", ".html"), "w", encoding="UTF-8") as outF: outF.write(x3d_html) @@ -1538,8 +1245,8 @@ def export_window(fileoutput, binary=False): savebk = vedo.notebook_backend vedo.notebook_backend = "k3d" vedo.settings.default_backend = "k3d" - # acts = vedo.plotter_instance.get_actors() - plt = vedo.backends.get_notebook_backend(vedo.plotter_instance.objects) + # acts = plt.get_actors() + plt = vedo.backends.get_notebook_backend(plt.objects) with open(fileoutput, "w", encoding="UTF-8") as fp: fp.write(plt.get_snapshot()) @@ -1550,16 +1257,252 @@ def export_window(fileoutput, binary=False): else: vedo.logger.error(f"export extension {fr.split('.')[-1]} is not supported") - return vedo.plotter_instance + return plt -def _export_hdf5(fileoutput="scene.v3d"): +######################################################################### +def _export_npy(plt, fileoutput="scene.npz"): + + def _tonumpy(obj): + """Dump a vedo object to numpy format.""" + + adict = {} + adict["type"] = "unknown" + + ######################################################## + def _fillcommon(obj, adict): + adict["filename"] = obj.filename + adict["name"] = obj.name + adict["time"] = obj.time + adict["rendered_at"] = obj.rendered_at + adict["position"] = obj.pos() + adict["info"] = obj.info + + try: + # GetMatrix might not exist for non linear transforms + m = np.eye(4) + vm = obj.get_transform().GetMatrix() + for i in [0, 1, 2, 3]: + for j in [0, 1, 2, 3]: + m[i, j] = vm.GetElement(i, j) + adict["transform"] = m + minv = np.eye(4) + vm.Invert() + for i in [0, 1, 2, 3]: + for j in [0, 1, 2, 3]: + minv[i, j] = vm.GetElement(i, j) + adict["transform_inverse"] = minv + except AttributeError: + adict["transform"] = [] + adict["transform_inverse"] = [] + + ######################################################## + def _fillmesh(obj, adict): + + adict["points"] = obj.vertices.astype(float) + poly = obj.dataset + + adict["cells"] = None + if poly.GetNumberOfPolys(): + try: + adict["cells"] = np.array(obj.cells, dtype=np.uint32) + except ValueError: # in case of inhomogeneous shape + adict["cells"] = obj.cells + + adict["lines"] = None + if poly.GetNumberOfLines(): + adict["lines"] = obj.lines + + adict["pointdata"] = [] + for iname in obj.pointdata.keys(): + if not iname: + continue + if "Normals" in iname.lower(): + continue + arr = poly.GetPointData().GetArray(iname) + adict["pointdata"].append([utils.vtk2numpy(arr), iname]) + + adict["celldata"] = [] + for iname in obj.celldata.keys(): + if not iname: + continue + if "Normals" in iname.lower(): + continue + arr = poly.GetCellData().GetArray(iname) + adict["celldata"].append([utils.vtk2numpy(arr), iname]) + + adict["activedata"] = None + if poly.GetPointData().GetScalars(): + adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] + elif poly.GetCellData().GetScalars(): + adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] + + adict["LUT"] = None + adict["LUT_range"] = None + lut = obj.mapper.GetLookupTable() + if lut: + nlut = lut.GetNumberOfTableValues() + lutvals = [] + for i in range(nlut): + v4 = lut.GetTableValue(i) # r, g, b, alpha + lutvals.append(v4) + adict["LUT"] = np.array(lutvals, dtype=np.float32) + adict["LUT_range"] = np.array(lut.GetRange()) + + prp = obj.properties + adict["alpha"] = prp.GetOpacity() + adict["representation"] = prp.GetRepresentation() + adict["pointsize"] = prp.GetPointSize() + + adict["linecolor"] = None + adict["linewidth"] = None + if prp.GetEdgeVisibility(): + adict["linewidth"] = obj.linewidth() + adict["linecolor"] = prp.GetEdgeColor() + + adict["ambient"] = prp.GetAmbient() + adict["diffuse"] = prp.GetDiffuse() + adict["specular"] = prp.GetSpecular() + adict["specularpower"] = prp.GetSpecularPower() + adict["specularcolor"] = prp.GetSpecularColor() + adict["shading"] = prp.GetInterpolation() # flat phong..: + adict["color"] = prp.GetColor() + adict["lighting_is_on"] = prp.GetLighting() + adict["backcolor"] = None + if obj.actor.GetBackfaceProperty(): + adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() + + adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() + adict["texture"] = obj._texture if hasattr(obj, "_texture") else None + + ######################################################## Assembly + if isinstance(obj, Assembly): + pass + # adict['type'] = 'Assembly' + # _fillcommon(obj, adict) + # adict['actors'] = [] + # for a in obj.unpack(): + # assdict = dict() + # if isinstance(a, Mesh): + # _fillmesh(a, assdict) + # adict['actors'].append(assdict) + + ######################################################## Points/Mesh + elif isinstance(obj, Points): + adict["type"] = "Mesh" + _fillcommon(obj, adict) + _fillmesh(obj, adict) + + ######################################################## Volume + elif isinstance(obj, Volume): + adict["type"] = "Volume" + _fillcommon(obj, adict) + imgdata = obj.dataset + arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) + adict["array"] = arr.reshape(imgdata.GetDimensions()) + adict["mode"] = obj.mode() + # adict['jittering'] = obj.mapper.GetUseJittering() + + prp = obj.properties + ctf = prp.GetRGBTransferFunction() + otf = prp.GetScalarOpacity() + gotf = prp.GetGradientOpacity() + smin, smax = ctf.GetRange() + xs = np.linspace(smin, smax, num=100, endpoint=True) + cols, als, algrs = [], [], [] + for x in xs: + cols.append(ctf.GetColor(x)) + als.append(otf.GetValue(x)) + if gotf: + algrs.append(gotf.GetValue(x)) + adict["color"] = cols + adict["alpha"] = als + adict["alphagrad"] = algrs + + ######################################################## Image + elif isinstance(obj, Image): + adict["type"] = "Image" + _fillcommon(obj, adict) + adict["array"] = obj.tonumpy() + + ######################################################## Text2D + elif isinstance(obj, vedo.Text2D): + adict["type"] = "Text2D" + adict["rendered_at"] = obj.rendered_at + adict["text"] = obj.text() + adict["position"] = obj.GetPosition() + adict["color"] = obj.properties.GetColor() + adict["font"] = obj.fontname + adict["size"] = obj.properties.GetFontSize() / 22.5 + adict["bgcol"] = obj.properties.GetBackgroundColor() + adict["alpha"] = obj.properties.GetBackgroundOpacity() + adict["frame"] = obj.properties.GetFrame() + # print('tonumpy(): vedo.Text2D', obj.text()[:10], obj.font(), obj.GetPosition()) + + else: + pass + # colors.printc('Unknown object type in tonumpy()', [obj], c='r') + return adict + + sdict = {} + sdict["shape"] = plt.shape + sdict["sharecam"] = plt.sharecam + sdict["camera"] = dict( + pos=plt.camera.GetPosition(), + focal_point=plt.camera.GetFocalPoint(), + viewup=plt.camera.GetViewUp(), + distance=plt.camera.GetDistance(), + clipping_range=plt.camera.GetClippingRange(), + ) + sdict["position"] = plt.pos + sdict["size"] = plt.size + sdict["axes"] = plt.axes + sdict["title"] = plt.title + sdict["backgrcol"] = colors.get_color(plt.renderer.GetBackground()) + sdict["backgrcol2"] = None + if plt.renderer.GetGradientBackground(): + sdict["backgrcol2"] = plt.renderer.GetBackground2() + sdict["use_depth_peeling"] = plt.camera.GetParallelProjection() + sdict["render_lines_as_tubes"] = settings.render_lines_as_tubes + sdict["hidden_line_removal"] = settings.hidden_line_removal + sdict["visible_grid_edges"] = settings.visible_grid_edges + sdict["use_parallel_projection"] = settings.use_parallel_projection + sdict["default_font"] = settings.default_font + sdict["objects"] = [] + + allobjs = plt.get_actors() + acts2d = plt.renderer.GetActors2D() + acts2d.InitTraversal() + for _ in range(acts2d.GetNumberOfItems()): + a = acts2d.GetNextItem() + if isinstance(a, vedo.Text2D): + allobjs.append(a) + allobjs += plt.objects + allobjs = list(set(allobjs)) # make sure its unique + + for a in allobjs: + try: + if a.actor.GetVisibility(): + sdict["objects"].append(_tonumpy(a)) + except AttributeError: + try: + if a.GetVisibility(): + sdict["objects"].append(_tonumpy(a)) + except AttributeError: + pass + + if fileoutput.endswith(".npz"): + np.savez_compressed(fileoutput, vedo_scenes=[sdict]) + else: + np.save(fileoutput, [sdict]) + +######################################################################### +def _export_hdf5(plt, fileoutput="scene.h5"): try: import h5py - except ImportError: - print("h5py not installed, try: 'pip install h5py'") + except ImportError as e: + vedo.logger.error(f"{e}. Try: 'pip install h5py'") return - plt = vedo.plotter_instance hfile = h5py.File(fileoutput, "w") scene = hfile.create_group("scene") @@ -1628,11 +1571,11 @@ def _export_hdf5(fileoutput="scene.v3d"): dataset = hmesh.create_group("dataset") try: cells = vob.cells - if len(cells)==0 or utils.is_ragged(cells): - dataset.create_dataset("cells", data=cells) - elif vob.nvertices < 256: #careful vertices not cells! + if utils.is_ragged(cells): + dataset.create_dataset("cells", data=cells, dtype=h5py.vlen_dtype(np.uint32)) + elif vob.nvertices < 256: #careful, vertices not cells! dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint8)) - elif vob.nvertices < 65535: #careful vertices not cells! + elif vob.nvertices < 65535: #careful, vertices not cells! dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint16)) else: dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint32)) @@ -1724,12 +1667,9 @@ def _export_hdf5(fileoutput="scene.v3d"): ######################################################## Volume if isinstance(vob, vedo.Volume): try: - arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) - arr = arr.reshape(vob.dataset.GetDimensions()) + # arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) + # arr = arr.reshape(vob.dataset.GetDimensions()) # dataset.create_dataset("array", data=arr) - - props["mode"] = vob.mode() - ctf = vob.properties.GetRGBTransferFunction() otf = vob.properties.GetScalarOpacity() gotf = vob.properties.GetGradientOpacity() @@ -1744,6 +1684,7 @@ def _export_hdf5(fileoutput="scene.v3d"): props["color"] = cols props["alpha"] = als props["alphagrad"] = algrs + props["mode"] = vob.mode() except AttributeError as e: # print("vol fails for", e) pass @@ -1771,7 +1712,7 @@ def _export_hdf5(fileoutput="scene.v3d"): def import_window(fileinput, mtl_file=None, texture_path=None): - """Import a whole scene from a Numpy or OBJ wavefront file. + """Import a whole scene from a Numpy, HDF5 or OBJ wavefront file. Arguments: mtl_file : (str) @@ -1782,82 +1723,11 @@ def import_window(fileinput, mtl_file=None, texture_path=None): Returns: `Plotter` instance """ - data = None - if isinstance(fileinput, dict): - data = fileinput - elif fileinput.endswith(".npy"): - data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] - elif fileinput.endswith(".npz"): - data = np.load(fileinput, allow_pickle=True)["vedo_scenes"][0] - - if data is not None: - if "render_lines_as_tubes" in data.keys(): - settings.render_lines_as_tubes = data["render_lines_as_tubes"] - if "hidden_line_removal" in data.keys(): - settings.hidden_line_removal = data["hidden_line_removal"] - if "visible_grid_edges" in data.keys(): - settings.visible_grid_edges = data["visible_grid_edges"] - if "use_parallel_projection" in data.keys(): - settings.use_parallel_projection = data["use_parallel_projection"] - if "use_polygon_offset" in data.keys(): - settings.use_polygon_offset = data["use_polygon_offset"] - if "polygon_offset_factor" in data.keys(): - settings.polygon_offset_factor = data["polygon_offset_factor"] - if "polygon_offset_units" in data.keys(): - settings.polygon_offset_units = data["polygon_offset_units"] - if "interpolate_scalars_before_mapping" in data.keys(): - settings.interpolate_scalars_before_mapping = data["interpolate_scalars_before_mapping"] - if "default_font" in data.keys(): - settings.default_font = data["default_font"] - if "use_depth_peeling" in data.keys(): - settings.use_depth_peeling = data["use_depth_peeling"] - - axes = data.pop("axes", 4) - title = data.pop("title", "") - backgrcol = data.pop("backgrcol", "white") - backgrcol2 = data.pop("backgrcol2", None) - cam = data.pop("camera", None) - - if data["shape"] != (1, 1): - data["size"] = "auto" # disable size - - plt = vedo.Plotter( - size=data["size"], # not necessarily a good idea to set it - # shape=data['shape'], # will need to create a Renderer class first - axes=axes, - title=title, - bg=backgrcol, - bg2=backgrcol2, - ) - - if cam: - if "pos" in cam.keys(): - plt.camera.SetPosition(cam["pos"]) - if "focalPoint" in cam.keys(): - plt.camera.SetFocalPoint(cam["focalPoint"]) - if "focal_point" in cam.keys(): - plt.camera.SetFocalPoint(cam["focal_point"]) - if "viewup" in cam.keys(): - plt.camera.SetViewUp(cam["viewup"]) - if "distance" in cam.keys(): - plt.camera.SetDistance(cam["distance"]) - if "clippingRange" in cam.keys(): - plt.camera.SetClippingRange(cam["clippingRange"]) - if "clipping_range" in cam.keys(): - plt.camera.SetClippingRange(cam["clipping_range"]) - plt.resetcam = False - - if "objects" in data.keys(): - objs = loadnumpy(data["objects"]) - if not utils.is_sequence(objs): - objs = [objs] - else: - # colors.printc("Trying to import a single mesh.. use load() instead.", c='r') - # colors.printc(" -> try to load a single object with load().", c='r') - objs = [loadnumpy(fileinput)] - - plt.add(objs) - return plt + if fileinput.endswith(".npy") or fileinput.endswith(".npz"): + return _import_npy(fileinput) + + elif fileinput.endswith(".h5") or fileinput.endswith(".hdf5"): + return _import_hdf5(fileinput) elif ".obj" in fileinput.lower(): @@ -1880,7 +1750,6 @@ def import_window(fileinput, mtl_file=None, texture_path=None): importer.Update() plt = vedo.Plotter() - actors = renderer.GetActors() actors.InitTraversal() for _ in range(actors.GetNumberOfItems()): diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 08fab44b..01cdd15c 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -8,7 +8,7 @@ from vedo import utils from vedo.core import UGridAlgorithms from vedo.mesh import Mesh -from vedo.file_io import download, loadUnStructuredGrid +from vedo.file_io import download from vedo.visual import VolumeVisual from vedo.transformations import LinearTransform @@ -162,10 +162,16 @@ def __init__( self.dataset = r2t.GetOutput() elif isinstance(inputobj, str): - self.filename = inputobj if "https://" in inputobj: inputobj = download(inputobj, verbose=False) - ug = loadUnStructuredGrid(inputobj) + if inputobj.endswith(".vtu"): + reader = vtk.new("XMLUnstructuredGridReader") + else: + reader = vtk.new("UnstructuredGridReader") + self.filename = inputobj + reader.SetFileName(inputobj) + reader.Update() + ug = reader.GetOutput() tt = vtk.new("DataSetTriangleFilter") tt.SetInputData(ug) tt.SetTetrahedraOnly(True) diff --git a/vedo/ugrid.py b/vedo/ugrid.py index 5b7ff38d..f541627b 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -7,7 +7,7 @@ import vedo from vedo import utils from vedo.core import UGridAlgorithms -from vedo.file_io import download, loadUnStructuredGrid +from vedo.file_io import download from vedo.visual import VolumeVisual @@ -117,11 +117,17 @@ def __init__(self, inputobj=None): self.dataset = inputobj elif isinstance(inputobj, str): - self.filename = inputobj if "https://" in inputobj: - self.filename = inputobj inputobj = download(inputobj, verbose=False) - self.dataset = loadUnStructuredGrid(inputobj) + self.filename = inputobj + if inputobj.endswith(".vtu"): + reader = vtk.new("XMLUnstructuredGridReader") + else: + reader = vtk.new("UnstructuredGridReader") + self.filename = inputobj + reader.SetFileName(inputobj) + reader.Update() + self.dataset = reader.GetOutput() else: vedo.logger.error(f"cannot understand input type {inputtype}") diff --git a/vedo/utils.py b/vedo/utils.py index cb08480b..c524926c 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -735,9 +735,10 @@ def is_sequence(arg): def is_ragged(arr, deep=False): """ - A ragged array in Python is an array with arrays of different - lengths as its elements. To check if an array is ragged, - we iterate through the elements and check if their lengths are the same. + A ragged or inhomogeneous array in Python is an array + with arrays of different lengths as its elements. + To check if an array is ragged,we iterate through the elements + and check if their lengths are the same. Example: ```python @@ -745,9 +746,12 @@ def is_ragged(arr, deep=False): print(is_ragged(arr, deep=True)) # output: True ``` """ + n = len(arr) + if n == 0: + return False if is_sequence(arr[0]): length = len(arr[0]) - for i in range(1, len(arr)): + for i in range(1, n): if len(arr[i]) != length or (deep and is_ragged(arr[i])): return True return False From c1d800cb6cd724ca2b2960d7e10b8111d3bdebc6 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 6 Nov 2023 04:10:11 +0100 Subject: [PATCH 217/251] fixes to hd5 --- vedo/core.py | 21 +++++++-- vedo/file_io.py | 114 +++++++++++++++++++++++++++++++++++++++++------- vedo/mesh.py | 9 +++- vedo/utils.py | 26 +++++------ 4 files changed, 135 insertions(+), 35 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index 15651768..87b600e4 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -650,7 +650,7 @@ def lines(self): @property def lines_as_flat_array(self): """ - Get lines connectivity ids as a numpy array. + Get lines connectivity ids as a 1D numpy array. Format is e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] """ return utils.vtk2numpy(self.dataset.GetLines().GetData()) @@ -833,6 +833,21 @@ def coordinates(self, pts): """Set vertices (points) coordinates. Same as `vertices`.""" self.vertices = pts + @property + def cells_as_flat_array(self): + """ + Get cell connectivity ids as a 1D numpy array. + Format is e.g. [3, 10,20,30 4, 10,11,12,13 ...] + """ + try: + # valid for unstructured grid + arr1d = utils.vtk2numpy(self.dataset.GetCells().GetData()) + except AttributeError: + # valid for polydata + arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) + # if arr1d.size == 0: + # arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) + return arr1d @property def cells(self): @@ -847,8 +862,8 @@ def cells(self): except AttributeError: # valid for polydata arr1d = utils.vtk2numpy(self.dataset.GetPolys().GetData()) - if arr1d.size == 0: - arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) + # if arr1d.size == 0: + # arr1d = utils.vtk2numpy(self.dataset.GetStrips().GetData()) # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. diff --git a/vedo/file_io.py b/vedo/file_io.py index 2ce18779..cfd58d77 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -874,7 +874,7 @@ def _buildmesh(d): msh = Mesh(poly) _load_common(msh, d) - prp = msh.actor.GetProperty() + prp = msh.properties if 'ambient' in keys: prp.SetAmbient(d['ambient']) if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) if 'specular' in keys: prp.SetSpecular(d['specular']) @@ -997,9 +997,83 @@ def _import_hdf5(fileinput): except ImportError as e: vedo.logger.error(f"{e}. Try: 'pip install h5py'") return - plt = vedo.Plotter() hfile = h5py.File(fileinput, "r") + scene = hfile["scene"] + + settings.use_depth_peeling = scene["use_depth_peeling"][()] + settings.render_lines_as_tubes = scene["render_lines_as_tubes"][()] + settings.hidden_line_removal = scene["hidden_line_removal"][()] + settings.use_parallel_projection = scene["use_parallel_projection"][()] + settings.default_font = scene["default_font"][()].decode("utf-8") + + plt = vedo.Plotter( + pos=scene["position"][()], + size=scene["size"][()], + axes=scene["axes"][()], + title=scene["title"][()].decode("utf-8"), + bg=scene["background_color"][()], + bg2=scene["background_color2"][()], + ) + + objects = scene["objects"] + + for name, hob in objects.items(): + + if hob["type"][()].decode("utf-8") == 'Mesh': + # print(name, hob, hob["type"][()]) + + dataset = hob["dataset"] + props = hob["properties"] + + vertices = dataset["points"][()] + cells = dataset["cells"][()] + lines = dataset["lines"][()] + + msh = Mesh([vertices, cells, lines]) + msh.name = hob["name"][()].decode("utf-8") + # msh.info = hob["info"] + msh.filename = hob["filename"][()].decode("utf-8") + msh.transform = vedo.LinearTransform(dataset["transform"][()]) + + msh.properties.SetRepresentation(props["representation"][()]) + msh.properties.SetPointSize(props["pointsize"][()]) + + msh.properties.SetEdgeVisibility(props["linewidth"][()]>0) + if props["linewidth"][()]: + msh.linewidth(props["linewidth"][()]) + msh.properties.SetEdgeColor(props["linecolor"][()]) + + msh.properties.SetAmbient(props["ambient"][()]) + msh.properties.SetDiffuse(props["diffuse"][()]) + msh.properties.SetSpecular(props["specular"][()]) + msh.properties.SetSpecularPower(props["specularpower"][()]) + msh.properties.SetSpecularColor(props["specularcolor"][()]) + msh.properties.SetInterpolation(props["shading"][()]) # flat, phong + msh.properties.SetColor(props["color"][()]) + msh.properties.SetOpacity(props["alpha"][()]) + msh.properties.SetLighting(props["lighting_is_on"][()]) + if props["backcolor"][()]: + bfp = msh.actor.GetBackfaceProperty() + bfp.SetColor(props["backcolor"][()]) + msh.mapper.SetScalarVisibility(props["scalar_visibility"][()]) + + plt.add(msh) + + cam = scene["camera"] + if cam: + if "pos" in cam.keys(): + plt.camera.SetPosition(cam["pos"][()]) + if "focal_point" in cam.keys(): + plt.camera.SetFocalPoint(cam["focal_point"][()]) + if "viewup" in cam.keys(): + plt.camera.SetViewUp(cam["viewup"][()]) + if "distance" in cam.keys(): + plt.camera.SetDistance(cam["distance"][()]) + if "clipping_range" in cam.keys(): + plt.camera.SetClippingRange(cam["clipping_range"][()]) + plt.resetcam = False + hfile.close() return plt @@ -1523,7 +1597,7 @@ def _export_hdf5(plt, fileoutput="scene.h5"): scene["position"] = plt.pos scene["size"] = plt.size scene["axes"] = plt.axes if plt.axes else "" - scene["title"] = plt.title + scene["title"] = str(plt.title) scene["background_color"] = colors.get_color(plt.renderer.GetBackground()) if plt.renderer.GetGradientBackground(): scene["background_color2"] = plt.renderer.GetBackground2() @@ -1557,6 +1631,7 @@ def _export_hdf5(plt, fileoutput="scene.h5"): cname = vob.__class__.__name__ hmesh = objects.create_group(f"{cname}_{vob.name}_{i}") + hmesh["type"] = "Mesh" if vob.ncells else "Points" hmesh["filename"] = vob.filename hmesh["name"] = vob.name @@ -1569,24 +1644,33 @@ def _export_hdf5(plt, fileoutput="scene.h5"): props = hmesh.create_group("properties") dataset = hmesh.create_group("dataset") + + copt = dict(compression="gzip", compression_opts=9) + dataset.create_dataset("points", data=vob.vertices, dtype=np.float32, **copt) + + cells = np.array([]) try: - cells = vob.cells - if utils.is_ragged(cells): - dataset.create_dataset("cells", data=cells, dtype=h5py.vlen_dtype(np.uint32)) - elif vob.nvertices < 256: #careful, vertices not cells! - dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint8)) + cells = vob.cells_as_flat_array + if vob.nvertices < 256: #careful, vertices not cells! + dataset.create_dataset("cells", data=cells, dtype=np.uint8, **copt) elif vob.nvertices < 65535: #careful, vertices not cells! - dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint16)) + dataset.create_dataset("cells", data=cells, dtype=np.uint16, **copt) else: - dataset.create_dataset("cells", data=np.array(cells, dtype=np.uint32)) - - dataset.create_dataset("points", data=vob.vertices.astype(float)) - dataset.create_dataset("lines", data=vob.lines) + dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) + except AttributeError as e: + print("cells fails for", e) + pass + dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) + lns = np.array([]) + try: + if vob.dataset.GetNumberOfLines(): + lns = vob.lines_as_flat_array except AttributeError as e: - # print("pts-cells fails for", e) + print("lines fails for", e) pass - + dataset.create_dataset("lines", data=lns, dtype=np.uint32, **copt) + ######################################################## Points-Mesh try: dataset.create_dataset("transform", data=vob.transform.matrix) diff --git a/vedo/mesh.py b/vedo/mesh.py index d2102170..b1bf82f5 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -77,10 +77,15 @@ def __init__(self, inputobj=None, c="gold", alpha=1): elif is_sequence(inputobj): ninp = len(inputobj) - if ninp == 2: # assume input is [vertices, faces] + if ninp == 3: # assume input is [vertices, faces, lines] + self.dataset = buildPolyData(inputobj[0], inputobj[1], inputobj[2]) + elif ninp == 2: # assume input is [vertices, faces] self.dataset = buildPolyData(inputobj[0], inputobj[1]) - else: # assume input is [vertices] + elif ninp == 1: # assume input is [vertices] self.dataset = buildPolyData(inputobj, None) + else: + vedo.logger.error("input must be a list of max 3 elements.", c=1) + raise ValueError() elif isinstance(inputobj, str): self.dataset = vedo.file_io.load(inputobj).dataset diff --git a/vedo/utils.py b/vedo/utils.py index c524926c..7bcd4e38 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -561,14 +561,16 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False If `tetras=True`, interpret 4-point faces as tetrahedrons instead of surface quads. """ + if is_sequence(faces) and len(faces) == 0: + faces=None + if is_sequence(lines) and len(lines) == 0: + lines=None + poly = vtk.vtkPolyData() if len(vertices) == 0: return poly - if not is_sequence(vertices[0]): - return poly - vertices = make3d(vertices) source_points = vtk.vtkPoints() @@ -593,7 +595,6 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False vline.GetPointIds().SetId(0, lines[i]) vline.GetPointIds().SetId(1, lines[i + 1]) linesarr.InsertNextCell(vline) - # print('Wrong format for lines in utils.buildPolydata(), skip.') poly.SetLines(linesarr) if faces is None: @@ -616,18 +617,15 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False if faces.ndim > 1: nf, nc = faces.shape - hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)).astype(ast).ravel() - arr = numpy_to_vtkIdTypeArray(hs, deep=True) - source_polygons.SetCells(nf, arr) + hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)) + else: + nf = faces.shape[0] + hs = faces + arr = numpy_to_vtkIdTypeArray(hs.astype(ast).ravel(), deep=True) + source_polygons.SetCells(nf, arr) else: ############################# manually add faces, SLOW - - showbar = False - if len(faces) > 25000: - showbar = True - pb = ProgressBar(0, len(faces), eta=False) - for f in faces: n = len(f) @@ -680,8 +678,6 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False for i in range(n): pids.SetId(i, f[i] - index_offset) source_polygons.InsertNextCell(ele) - if showbar: - pb.print("converting mesh... ") poly.SetPolys(source_polygons) return poly From eb7e13cf039c42a8a443c662207ec745d982e5e3 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 7 Nov 2023 14:01:37 +0100 Subject: [PATCH 218/251] dry_run_mode --- vedo/__init__.py | 9 --------- vedo/plotter.py | 6 +++++- vedo/settings.py | 6 +++--- vedo/version.py | 2 +- vedo/vtkclasses.py | 18 +++++++++++------- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/vedo/__init__.py b/vedo/__init__.py index c6e55be2..98cc98bf 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -123,12 +123,3 @@ def format(self, record): logger.addHandler(_chsh) logger.setLevel(logging.INFO) -################################################# silence annoying messages -# import warnings -# warnings.simplefilter(action="ignore", category=FutureWarning) -# try: -# np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning) -# except AttributeError: -# pass - - diff --git a/vedo/plotter.py b/vedo/plotter.py index 8cf966c5..9d0b8aae 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -1461,6 +1461,8 @@ def record(self, filename=".vedo_recorded_events.log"): Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ + if settings.dry_run_mode >= 1: + return self if not self.interactor: vedo.logger.warning("Cannot record events, no interactor defined.") return self @@ -1491,6 +1493,8 @@ def play(self, events=".vedo_recorded_events.log", repeats=0): Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ + if settings.dry_run_mode >= 1: + return self if not self.interactor: vedo.logger.warning("Cannot play events, no interactor defined.") return self @@ -1506,7 +1510,7 @@ def play(self, events=".vedo_recorded_events.log", repeats=0): erec.SetInputString(events) erec.Play() - for _i in range(repeats): + for _ in range(repeats): erec.Rewind() erec.Play() erec.EnabledOff() diff --git a/vedo/settings.py b/vedo/settings.py index 67fbf198..aa72ee22 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -7,7 +7,7 @@ class Settings: """ - General settings to modify the global behavior + General settings to modify the global behavior and style. Usage Example: ```python @@ -319,8 +319,8 @@ def __init__(self): # k3d settings for jupyter notebooks self.k3d_menu_visibility = True self.k3d_plot_height = 512 - self.k3d_antialias = True - self.k3d_lighting = 1.5 + self.k3d_antialias = True + self.k3d_lighting = 1.5 self.k3d_camera_autofit = True self.k3d_grid_autofit= True self.k3d_axes_color = "k4" diff --git a/vedo/version.py b/vedo/version.py index d2445bc6..24267709 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev28a' +_version = '2023.5.0+dev29a' diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 3182c644..f083b406 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -4,6 +4,7 @@ Subset of vtk classes to be imported directly or lazily. """ from importlib import import_module +from vedo import settings ###################################################################### @@ -91,13 +92,16 @@ def dump_hierarchy_to_file(fname=""): w.write(f"{module.__name__}.{subitem}\n") ###################################################################### - -import vtkmodules.vtkRenderingOpenGL2 - -from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLGPUVolumeRayCastMapper, - vtkSmartVolumeMapper, -) +if settings.dry_run_mode < 2: + #https://vtk.org/doc/nightly/html + # /md__builds_gitlab_kitware_sciviz_ci_Documentation_Doxygen_PythonWrappers.html + import vtkmodules.vtkRenderingOpenGL2 + import vtkmodules.vtkInteractionStyle + import vtkmodules.vtkRenderingFreeType + from vtkmodules.vtkRenderingVolumeOpenGL2 import ( + vtkOpenGLGPUVolumeRayCastMapper, + vtkSmartVolumeMapper, + ) for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", From 65c8a6075df9a25cf710559e0b61075afe192c59 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 7 Nov 2023 15:38:59 +0100 Subject: [PATCH 219/251] restyle examples by moving c=... outside constructor --- docs/changes.md | 3 + examples/advanced/geological_model.py | 10 +- examples/advanced/interpolate_scalar2.py | 2 +- examples/advanced/voronoi2.py | 2 +- examples/advanced/warp1.py | 4 +- examples/advanced/warp4a.py | 4 +- examples/basic/align2.py | 6 +- examples/basic/align4.py | 3 +- examples/basic/align5.py | 2 +- examples/basic/boundaries.py | 2 +- examples/other/nevergrad_opt.py | 2 +- examples/other/tensor_grid1.py | 2 +- examples/pyplot/explore5d.py | 7 +- examples/pyplot/fit_polynomial1.py | 2 +- examples/pyplot/histo_pca.py | 2 +- examples/pyplot/plot_hexcells.py | 2 +- examples/pyplot/plot_stream.py | 2 +- examples/simulations/aspring2_player.py | 6 +- examples/simulations/fourier_epicycles.py | 6 +- examples/simulations/gas.py | 4 +- examples/simulations/self_org_maps2d.py | 2 +- examples/simulations/tunnelling1.py | 4 +- examples/volumetric/slice_plane1.py | 2 +- examples/volumetric/tet_cut1.py | 3 +- tests/test_pipeline.txt | 121 ++++++++++++++++++++++ vedo/pointcloud.py | 17 ++- 26 files changed, 174 insertions(+), 48 deletions(-) create mode 100644 tests/test_pipeline.txt diff --git a/docs/changes.md b/docs/changes.md index 90c7209c..900b1309 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -77,3 +77,6 @@ tet_cut2.py broken markpoint.py plot_spheric.py ``` + +test offline screenshot +- multiblock instead of npy \ No newline at end of file diff --git a/examples/advanced/geological_model.py b/examples/advanced/geological_model.py index 3dc5714e..5d9f6a98 100644 --- a/examples/advanced/geological_model.py +++ b/examples/advanced/geological_model.py @@ -98,7 +98,7 @@ plt += boundary # The path of well 58_32 -Well1 = Line(well_5832_path[["X", "Y", "Z"]].values, lw=2, c='k') +Well1 = Line(well_5832_path[["X", "Y", "Z"]].values).c("k").lw(2) Well1.name = "Well 58-32" plt += Well1 @@ -124,9 +124,11 @@ plt += Well4 # defining the start and end of the lines that will be representing the wellbores -Wells = Lines(wellsmin[["x", "y", "z"]].values, # start points - wellsmax[["x", "y", "z"]].values, # end points - c="gray", alpha=1, lw=3) +Wells = Lines( + wellsmin[["x", "y", "z"]].values, # start points + wellsmax[["x", "y", "z"]].values, # end points +) +Wells.color("gray").lw(3) Wells.name = "Pre-existing wellbores" plt += Wells diff --git a/examples/advanced/interpolate_scalar2.py b/examples/advanced/interpolate_scalar2.py index ce0dbf2e..4fa018fd 100644 --- a/examples/advanced/interpolate_scalar2.py +++ b/examples/advanced/interpolate_scalar2.py @@ -27,6 +27,6 @@ interpolated_desc = itr(xi, yi, zi) mesh.cmap('rainbow', interpolated_desc).add_scalarbar(title='3sin(4y)') -rpts = Points(ptsubset, r=8, c='white') +rpts = Points(ptsubset).point_size(8).c('white') show(mesh, rpts, __doc__, axes=1).close() diff --git a/examples/advanced/voronoi2.py b/examples/advanced/voronoi2.py index d550c137..cac31d42 100644 --- a/examples/advanced/voronoi2.py +++ b/examples/advanced/voronoi2.py @@ -10,7 +10,7 @@ msh = Points(allpts).generate_voronoi(method='scipy') msh.lw(0.1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') -centers = Points(msh.cell_centers, c='k') +centers = Points(msh.cell_centers).color("k") show(msh, pts0, __doc__, axes=dict(digits=3), zoom=1.3) diff --git a/examples/advanced/warp1.py b/examples/advanced/warp1.py index 2682a4c5..10b67c83 100644 --- a/examples/advanced/warp1.py +++ b/examples/advanced/warp1.py @@ -22,7 +22,7 @@ warped = surf.warp(ptsource, pttarget, mode='2d') warped.color("b4").lc('lightblue').lw(0.1).wireframe(False) -apts = Points(pttarget, r=15, c="red5") -arrs = Arrows(ptsource, pttarget, c='k') +apts = Points(pttarget).point_size(15).c("red5") +arrs = Arrows(ptsource, pttarget).c("black") show(warped, apts, arrs, __doc__, axes=1, viewup="z").close() diff --git a/examples/advanced/warp4a.py b/examples/advanced/warp4a.py index 6bdf670c..9823f4b8 100644 --- a/examples/advanced/warp4a.py +++ b/examples/advanced/warp4a.py @@ -55,13 +55,13 @@ def draw(self, toggle=None): #################################### update scene self.msg1.text("Choose start point or press:\nm to morph the shapes\ng to interpolate") self.plotter.at(0).remove("displacementArrows") if len(self.arrow_starts)==0: return - arrows = Arrows2D(self.arrow_starts, self.arrow_stops, c='red4') + arrows = Arrows2D(self.arrow_starts, self.arrow_stops).c('red4') arrows.name = "displacementArrows" self.plotter.add(arrows) else: self.msg1.text("Click to choose an end point") self.plotter.at(0).remove("displacementPoints") - points = Points(self.arrow_starts, r=15, c='green3', alpha=0.5) + points = Points(self.arrow_starts).ps(15).c('green3',0.5) points.name = "displacementPoints" self.plotter.add(points) diff --git a/examples/basic/align2.py b/examples/basic/align2.py index 0b20235f..52bb9136 100644 --- a/examples/basic/align2.py +++ b/examples/basic/align2.py @@ -12,8 +12,8 @@ # Create two sets of random points with different colors pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N1)] pts2 = [(u(0, x)+3, u(0, x)+i/3+2, u(0, x)+i+1) for i in range(N2)] -vpts1 = Points(pts1, r=10, c="blue5") -vpts2 = Points(pts2, r=10, c="red5") +vpts1 = Points(pts1).ps(10).c("blue5") +vpts2 = Points(pts2).ps(10).c("red5") # Find best alignment between the 2 sets of Points, # e.i. find how to move vpts1 to best match vpts2 @@ -21,7 +21,7 @@ txt = aligned_pts1.transform.__str__() # Create arrows to visualize how the points move during alignment -arrows = Arrows(pts1, aligned_pts1, s=0.7, c='black') +arrows = Arrows(pts1, aligned_pts1, s=0.7).c("black") # Create a plotter with two subplots plt = Plotter(N=2, axes=1) diff --git a/examples/basic/align4.py b/examples/basic/align4.py index 4846d73b..e68ba1fd 100644 --- a/examples/basic/align4.py +++ b/examples/basic/align4.py @@ -13,7 +13,8 @@ # Obtain the mean spline and create a Line object with thicker width and blue color mean = procus.info['mean'] -lmean = Line(mean, lw=4, c='b').z(0.001) # z-shift it to make it visible +lmean = Line(mean).z(0.001) # z-shift it to make it visible +lmean.linewidth(4).c('blue') # Color the aligned splines based on their distance from the mean spline for l in alignedsplines: diff --git a/examples/basic/align5.py b/examples/basic/align5.py index 724c9d9f..727a06f0 100644 --- a/examples/basic/align5.py +++ b/examples/basic/align5.py @@ -28,7 +28,7 @@ s2.align_with_landmarks(landmarks1, landmarks2) # Create arrows to visualize the movement of the landmark points -arrows = Arrows(landmarks1, landmarks2, s=0.5, c='black') +arrows = Arrows(landmarks1, landmarks2, s=0.5).c('black') # Show the original mesh, transformed mesh, arrows, and script description show(s1, s2, arrows, __doc__, axes=True).close() diff --git a/examples/basic/boundaries.py b/examples/basic/boundaries.py index 3152276e..2a63c5a8 100644 --- a/examples/basic/boundaries.py +++ b/examples/basic/boundaries.py @@ -10,7 +10,7 @@ pids = b.boundaries(return_point_ids=True) # Create a Points object to represent the boundary points -pts = Points(b.vertices[pids], r=10, c='red5') +pts = Points(b.vertices[pids]).c('red5').ps(10) # Create a Label object for all the vertices in the mesh labels = b.labels('id', scale=10).c('green2') diff --git a/examples/other/nevergrad_opt.py b/examples/other/nevergrad_opt.py index f793e3eb..7cc4c57d 100644 --- a/examples/other/nevergrad_opt.py +++ b/examples/other/nevergrad_opt.py @@ -31,7 +31,7 @@ def callbk(opti, v, value): res = optimizer.minimize(func) # best value printc('Minimum at:', res.value) -ln = Line(pts, lw=3, c='r') +ln = Line(pts).lw(3).c("red5") fu = plot(f, xlim=[-3,4], ylim=[-3,4]) show(fu, ln, __doc__) diff --git a/examples/other/tensor_grid1.py b/examples/other/tensor_grid1.py index e133f0a6..3ef2ba0c 100644 --- a/examples/other/tensor_grid1.py +++ b/examples/other/tensor_grid1.py @@ -1,6 +1,6 @@ from vedo import Grid, Tensors, show -domain = Grid(res=[5,5], c='gray') +domain = Grid(res=[5,5]) # Generate random attributes on this mesh domain.generate_random_data() diff --git a/examples/pyplot/explore5d.py b/examples/pyplot/explore5d.py index fa7e4aa2..d9186534 100644 --- a/examples/pyplot/explore5d.py +++ b/examples/pyplot/explore5d.py @@ -40,18 +40,19 @@ pts = np.c_[g4,g2,g3] # form an array of 3d points from the columns pts_1 = pts[g0>0] # select only points that have g0>0 -p1 = Points(pts_1, r=4, c='red5') # create the vedo object +p1 = Points(pts_1).ps(4).c('red5') # create the vedo object (ps=point size) print("after selection nr. of points is", len(pts_1)) pts_2 = pts[(g0<0) & (g1>.5)] # select excluded points that have g1>0.5 -p2 = Points(pts_2, r=8, c='green') # create the vedo object +p2 = Points(pts_2).ps(8).c('green') # create the vedo object axes = Axes(p1+p2, xtitle='gene4', ytitle='gene2', ztitle='gene3', c='k') # Show the two clouds superposed on a new plotter window: show([h0, h1, h2, h3, h4, (p1,p2, axes, __doc__)], shape="1/5", # 1 spaces above and 5 below - sharecam=0, axes=0, zoom=1.4, interactive=True).close() + sharecam=0, axes=0, zoom=1.4, interactive=True, +).close() diff --git a/examples/pyplot/fit_polynomial1.py b/examples/pyplot/fit_polynomial1.py index 2f41d46e..1112e8a9 100644 --- a/examples/pyplot/fit_polynomial1.py +++ b/examples/pyplot/fit_polynomial1.py @@ -13,7 +13,7 @@ # Plot the points and add the "true" line without noise fig = plot(x, y+noise, '*k', title=__doc__, label='data') -fig += DashedLine(x, y, c='red5') +fig += DashedLine(x, y).c('red5') # Fit points and evaluate, with a bootstrap and Monte-Carlo technique, # the correct error coeffs and error bands. Return a Line object: diff --git a/examples/pyplot/histo_pca.py b/examples/pyplot/histo_pca.py index 63c5e0c4..ccfee9b3 100644 --- a/examples/pyplot/histo_pca.py +++ b/examples/pyplot/histo_pca.py @@ -5,7 +5,7 @@ data = np.random.randn(1000, 3) -pts = Points(data, r=6, c='#1f77b4') +pts = Points(data).color('#1f77b4').ps(6) pts.scale([2,1,0.01]).rotate_z(45).shift(5,1) # rotate and shift! # Recover the rotation pretending we only know the points diff --git a/examples/pyplot/plot_hexcells.py b/examples/pyplot/plot_hexcells.py index 19706ca4..53ddc74c 100644 --- a/examples/pyplot/plot_hexcells.py +++ b/examples/pyplot/plot_hexcells.py @@ -16,7 +16,7 @@ x, y, z = [i+j%2/2, j/1.155, val+0.01] zbar= Polygon([x,y,0], nsides=6, r=0.55, c=col).extrude(val) line= Polygon([x,y,z], nsides=6, r=0.55, c='k').wireframe().lw(2) - txt = Text3D(f"{i}/{j}", [x,y,z], s=.15, c='k', justify='center') + txt = Text3D(f"{i}/{j}", [x,y,z],s=0.15, c='k', justify='center') items += [zbar, line, txt] k += 1 diff --git a/examples/pyplot/plot_stream.py b/examples/pyplot/plot_stream.py index 9a3fecfe..b7ce211b 100644 --- a/examples/pyplot/plot_stream.py +++ b/examples/pyplot/plot_stream.py @@ -22,6 +22,6 @@ probes=prob_pts, ) -pts = Points(prob_pts, r=5, c='white') +pts = Points(prob_pts).ps(5).c('white') show(sp, pts, __doc__, axes=1, bg='bb').close() diff --git a/examples/simulations/aspring2_player.py b/examples/simulations/aspring2_player.py index 3a2417c0..16ff6140 100644 --- a/examples/simulations/aspring2_player.py +++ b/examples/simulations/aspring2_player.py @@ -24,9 +24,9 @@ history_x.append(x) # Create the objects to be shown in the animation -floor = Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5), c='yellow2') -wall = Box(pos=(-0.82, 0.15, 0), size=(0.04, 0.50, 0.3), c='yellow2') -block = Cube(pos=x, side=0.2, c="tomato") +floor = Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5)).c('yellow2') +wall = Box(pos=(-0.82, 0.15, 0), size=(0.04, 0.50, 0.3)).c('yellow2') +block = Cube(pos=x, side=0.2).c("tomato") spring= Spring(x0, x, r1=0.05, thickness=0.005) text = Text2D(font="Calco", c='white', bg='k', alpha=1, pos='top-right') diff --git a/examples/simulations/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py index ff1d58ad..b1d11f69 100644 --- a/examples/simulations/fourier_epicycles.py +++ b/examples/simulations/fourier_epicycles.py @@ -38,9 +38,9 @@ def epicycles(time, rotation, fourier, order): path.append([x,y]) if len(points)>0: - hline = vedo.Line([x,y], points[-1], c='red5', lw=0.1) - pline = vedo.Line(path, c='green5', lw=2) - oline = vedo.Line(points, c='red4', lw=5) + hline = vedo.Line([x,y], points[-1]).c('red5').lw(1) + pline = vedo.Line(path).c('green5').lw(2) + oline = vedo.Line(points).c('red4').lw(5) objs += [hline, pline, oline] plt.add(objs).render() return [x, y] diff --git a/examples/simulations/gas.py b/examples/simulations/gas.py index e477c15a..c628c1ff 100644 --- a/examples/simulations/gas.py +++ b/examples/simulations/gas.py @@ -25,9 +25,9 @@ def reflection(p, pos): return np.dot(np.identity(3) - 2 * n * n[:, np.newaxis], p) -plt = Plotter(title="gas in toroid", interactive=0, axes=0) +plt = Plotter(title="gas in toroid", interactive=False) plt += __doc__ -plt += Torus(c="g", r1=RingRadius, r2=RingThickness, alpha=0.1).wireframe(1) +plt += Torus(r1=RingRadius, r2=RingThickness).c("green",0.1).wireframe(True) poslist = [] plist, mlist, rlist = [], [], [] diff --git a/examples/simulations/self_org_maps2d.py b/examples/simulations/self_org_maps2d.py index 4147540e..c05dc6e6 100644 --- a/examples/simulations/self_org_maps2d.py +++ b/examples/simulations/self_org_maps2d.py @@ -66,7 +66,7 @@ def learn(self, n_epoch=10000, sigma=(0.25,0.01), lrate=(0.5,0.01)): s = Sphere(res=90).cut_with_plane(origin=(0,-.3,0), normal='y').subsample(0.01) plt = Plotter(axes=6, interactive=False) - grd = Grid(res=[n-1,n-1], c='green2') + grd = Grid(res=[n-1, n-1]).c('green2') plt.show(__doc__, s.ps(1), grd) som = SOM((len(P), 3), D) diff --git a/examples/simulations/tunnelling1.py b/examples/simulations/tunnelling1.py index 8cb4f3cf..a1473b42 100644 --- a/examples/simulations/tunnelling1.py +++ b/examples/simulations/tunnelling1.py @@ -34,8 +34,8 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method plt = Plotter(interactive=False, size=(1000,500)) -barrier = Line(np.c_[x, V * 15], c="red3", lw=3) -wpacket = Line(np.c_[x, zeros], c='blue4', lw=2) +barrier = Line(np.c_[x, V * 15]).c("red3").lw(3) +wpacket = Line(np.c_[x, zeros]).c('blue4').lw(2) plt.show(barrier, wpacket, __doc__, zoom=2) for j in range(150): diff --git a/examples/volumetric/slice_plane1.py b/examples/volumetric/slice_plane1.py index fb52afb0..1853c571 100644 --- a/examples/volumetric/slice_plane1.py +++ b/examples/volumetric/slice_plane1.py @@ -9,7 +9,7 @@ def func(evt): txt = f"Probing:\n{precision(evt.object.picked3d, 3)}\nvalue = {arr[pid]}" pts = evt.object.vertices - sph = Sphere(pts[pid], c='orange7').pickable(False) + sph = Sphere(pts[pid]).c('orange7').pickable(False) fp = sph.flagpole(txt, s=7, offset=(-150,15), font=2).follow_camera() # remove old and add the two new objects plt.remove('Sphere', 'FlagPole').add(sph, fp).render() diff --git a/examples/volumetric/tet_cut1.py b/examples/volumetric/tet_cut1.py index 62322a5d..2f195c1c 100644 --- a/examples/volumetric/tet_cut1.py +++ b/examples/volumetric/tet_cut1.py @@ -3,7 +3,8 @@ tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') -sphere = Sphere(r=500, c='green5', alpha=0.2).x(400) +sphere = Sphere(r=500).x(400) +sphere.c('green5').alpha(0.2) ugrid = tetmesh.cut_with_mesh(sphere, invert=True) tetmesh_cut = TetMesh(ugrid) diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt new file mode 100644 index 00000000..7fd71858 --- /dev/null +++ b/tests/test_pipeline.txt @@ -0,0 +1,121 @@ +# Test Pipeline ################################ +For internal use only + +# SITES ######################################## +https://vedo.embl.es/ +https://github.com/marcomusy/vedo +https://forum.image.sc/search?q=vedo%20order%3Alatest + +## INSTALL ##################################### +cd ~/Projects/vedo +pip install -e . +pip install nevergrad -U + + +# DRY RUN ###################################### +cd ~/Projects/vedo/ +sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py +cd ~/Projects/vedo/examples/ && ./run_all.sh | tee logfile.txt +cd ~/Projects/vedo/ +sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py + +code examples/logfile.txt ##### inspect logfile +# try normal run too with viz to make sure all is ok. + +# TUTORIALS #################################### +cd ~/Projects/server/vedo-embo-course/scripts +cd ~/Projects/server/vedo-bias-course/scripts + +# EXAMPLES ##################################### +cd ~/Projects/vedo/tests/common && ./run_all.sh +cd ~/Projects/vedo/tests/issues && ./run_all.sh + +# DOLFIN/TRIMESH ############################### +cd ~/Projects/vedo/examples/other/dolfin +conda activate fenics +./run_all.sh +conda deactivate + +pip install trimesh -U +cd ~/Projects/vedo/examples/other/trimesh +./run_all.sh + +# Various other ############################### +python ~/Dropbox/documents/Medical/RESONANCIA.py +vedo https://vedo.embl.es/examples/data/panther.stl.gz +vedo https://vedo.embl.es/examples/geo_scene.npz +# check vedo convert cli: +cd ~/Projects/vedo +vedo --convert data/290.vtk --to ply && vedo data/290.ply + +# NOTEBOOKS ##################################### +cd ~/Projects/vedo/examples/notebooks/ +jupyter notebook > /dev/null 2>&1 + +# Check on OSX and windows + + +# VEDO PROJECTS ################################# +cd ~/Projects/server/trackviewer + ./main_test.py +################ +cd /g/sharpe/software/clone_viewer2 + ./clone_viewer3d.py +################ +cd ~/Projects/rio_organoid + python main4.py + python piv_read_fw2_C3.py +################ +cd ~/Projects/server/cell_density + analyse_density.py test_image.png test_image_gfp.png + edu_histogram.py test_image.png +################ +cd ~/Projects/new_yalla/limb_opti_here + python result_viz3.py +################ +cd ~/Projects/server/welsh_embryo_stager + python stager.py pics/E14.5_L3-03_HL2.5X.jpg +################ +cd ~/Projects/oocytes + python main4b.py +################ +cd ~/Projects/umap_viewer3d + python main6.py +################ +cd ~/Projects/napari-vedo-bridge + conda activate napari-env + napari + conda deactivate +################ +cd ~/Projects/clonal_analysis2d_splines + python -m analysis_plots + + +# RELEASE ################################# +cd ~/Projects/vedo + +# check version and status +code vedo/version.py +git status +git commit -am 'comment' +git push + +# upload to pypi +python setup.py sdist bdist_wheel +twine upload dist/vedo-?.?.?.tar.gz -r pypi + +# make github release +cd ~/Projects/vedo +code docs/changes.md +code vedo/version.py # to add .dev0 +https://repology.org/project/vedo/badges + + +# DOCUMETATION ############################# +mount_staging +cd ~/Projects/vedo/docs/pdoc +./build_html.py + +# check web page examples +code www/examples_db.js +code www/index.html diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 2695e41d..bf0c887c 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -3286,9 +3286,8 @@ def generate_delaunay2d( Otherwise, only triangles will be output. offset : (float) multiplier to control the size of the initial, bounding Delaunay triangulation. - transform: vtkTransform - a VTK transformation (eg. a thinplate spline) - which is applied to points to generate a 2D problem. + transform: (LinearTransform, NonLinearTransform) + a transformation which is applied to points to generate a 2D problem. This maps a 3D dataset into a 2D dataset where triangulation can be done on the XY plane. The points are transformed and triangulated. The topology of triangulated points is used as the output topology. @@ -3319,12 +3318,12 @@ def generate_delaunay2d( delny.SetTolerance(tol) delny.SetAlpha(alpha) delny.SetOffset(offset) - if transform: - if hasattr(transform, "transform"): - transform = transform.transform - delny.SetTransform(transform) - if mode == "xy" and boundaries: + if transform: + delny.SetTransform(transform.T) + elif mode == "fit": + delny.SetProjectionPlaneMode(vtk.get_class("VTK_BEST_FITTING_PLANE")) + elif mode == "xy" and boundaries: boundary = vtk.vtkPolyData() boundary.SetPoints(vpts) cell_array = vtk.vtkCellArray() @@ -3336,8 +3335,6 @@ def generate_delaunay2d( boundary.SetPolys(cell_array) delny.SetSourceData(boundary) - if mode == "fit": - delny.SetProjectionPlaneMode(vtk.get_class("VTK_BEST_FITTING_PLANE")) delny.Update() msh = vedo.mesh.Mesh(delny.GetOutput()) From 4828ea5a7d1cb9a06d0dbf404017baa79862cd87 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 7 Nov 2023 20:54:19 +0100 Subject: [PATCH 220/251] various fixes - still a problem with Mesh(Lines) creating extra Verts 0d cell --- examples/other/export_numpy.py | 2 +- examples/other/remesh_ACVD.py | 31 +++--- examples/other/remesh_tetgen.py | 7 +- examples/other/run_all.sh | 60 ++--------- examples/other/spherical_harmonics1.py | 30 +++--- tests/test_pipeline.txt | 21 +++- vedo/file_io.py | 142 ++++++++++++------------- vedo/mesh.py | 12 --- vedo/plotter.py | 5 +- vedo/pointcloud.py | 3 +- vedo/shapes.py | 2 +- vedo/utils.py | 2 + vedo/visual.py | 1 + vedo/vtkclasses.py | 7 +- 14 files changed, 143 insertions(+), 182 deletions(-) diff --git a/examples/other/export_numpy.py b/examples/other/export_numpy.py index da39b285..ca3df077 100644 --- a/examples/other/export_numpy.py +++ b/examples/other/export_numpy.py @@ -11,7 +11,7 @@ plt.close() ################################################ -plt = load('scene.npz') +plt = import_window('scene.npz') plt += Text2D("Imported scene", c='k', bg='b') diff --git a/examples/other/remesh_ACVD.py b/examples/other/remesh_ACVD.py index fa907b3e..e6647e40 100644 --- a/examples/other/remesh_ACVD.py +++ b/examples/other/remesh_ACVD.py @@ -1,22 +1,25 @@ -# Credits: -# https://github.com/akaszynski/pyacvd -# Needs PyACVD: -# pip install pyacvd -# -from vedo import * +"""Remesh a surface mesh using the ACVD algorithm.""" +# Needs PyACVD: pip install pyacvd +# See: https://github.com/akaszynski/pyacvd +from vedo import Sphere, Mesh, show +from vedo.pyplot import histogram from pyvista import wrap from pyacvd import Clustering -mesh = Sphere(res=50).subdivide().lw(0.2).cut_with_plane().clean() +msh1 = Sphere(res=50).cut_with_plane() +msh1.compute_quality().cmap('RdYlGn', on='cells', vmin=0, vmax=70).linewidth(1) -clus = Clustering(wrap(mesh.dataset)) +clus = Clustering(wrap(msh1.dataset)) clus.cluster(1000, maxiter=100, iso_try=10, debug=False) +pvremsh1 = clus.create_mesh() -pvremesh = clus.create_mesh() +msh2 = Mesh(pvremsh1).shift([1,0,0]) +msh2.compute_quality().cmap('RdYlGn', on='cells', vmin=0, vmax=70).linewidth(1) -remesh = Mesh(pvremesh).compute_normals() -remesh.color('o6').backcolor('v').lw(0.2).shift(1,0,0) +his1 = histogram(msh1.celldata["Quality"], xlim=(0,70), aspect=2, c='RdYlGn') +his2 = histogram(msh2.celldata["Quality"], xlim=(0,70), aspect=2, c='RdYlGn') +his1 = his1.clone2d('bottom-left', scale=0.75) +his2 = his2.clone2d('bottom-right',scale=0.75) -show(mesh, remesh) - -#remesh.write('sphere.vtk') +show(msh1, msh2, his1, his2, __doc__, viewup='z', bg='k5', bg2='wheat') +#remsh1.write('sphere.vtk') diff --git a/examples/other/remesh_tetgen.py b/examples/other/remesh_tetgen.py index b2dcba6a..e40ee932 100644 --- a/examples/other/remesh_tetgen.py +++ b/examples/other/remesh_tetgen.py @@ -1,9 +1,11 @@ """Segment a TetMesh with a custom scalar. Press q to make it explode""" -from vedo import Mesh, TetMesh, Plotter, Text2D, dataurl +from vedo import Mesh, TetMesh, Plotter, Text2D, dataurl, settings import tetgen import pymeshfix +settings.default_font = "Brachium" + n = 20000 f1 = 0.005 # control the tetras resolution f2 = 0.15 # control the nr of seeds @@ -18,7 +20,7 @@ tmesh = TetMesh(tet.grid) surf = tmesh.tomesh(fill=False) -txt = Text2D(__doc__, font="Brachium") +txt = Text2D(__doc__) # pick points on the surface and use subsample to make them uniform seeds = surf.clone().subsample(f2).ps(10).c("black") @@ -29,7 +31,6 @@ cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids -# tmesh.celldata.select("fragment")# bug, has no effect, needs name=... pieces = [] for i in range(seeds.npoints): diff --git a/examples/other/run_all.sh b/examples/other/run_all.sh index 97f1bd85..835a888b 100755 --- a/examples/other/run_all.sh +++ b/examples/other/run_all.sh @@ -1,53 +1,13 @@ #!/bin/bash # source run_all.sh # -echo ############################################# -echo Press Esc at anytime to skip example -echo ############################################# -echo -echo - -echo Running clone2d.py -python3 clone2d.py - -echo Running flag_labels1.py -python3 flag_labels1.py - -echo Running flag_labels2.py -python3 flag_labels2.py - -echo Running icon.py -python3 icon.py - -echo Running iminuit1.py -python3 iminuit1.py - -echo Running inset.py -python3 inset.py - -echo Running meshio_read.py -python3 meshio_read.py - -echo Running pygmsh_cut.py -python3 pygmsh_cut.py - -echo Running nevergrad_opt.py -python3 nevergrad_opt.py - -echo Running qt_window.py # needs qt5 -python3 qt_window1.py - -echo Running qt_window_split.py # needs qt5 -python qt_window2.py - -echo Running qt_tabs.py # needs qt5 -python3 qt_tabs.py - -echo Running remesh_meshfix.py -python3 remesh_meshfix.py - -echo Running spherical_harmonics1.py -python3 spherical_harmonics1.py - -echo Running export_numpy.py -python3 export_numpy.py +echo Press Esc at anytime to skip example, F1 to interrupt + +for f in *.py; do + case $f in qt*.py) continue;; esac + case $f in wx*.py) continue;; esac + case $f in trame*.py) continue;; esac + case $f in *video*.py) continue;; esac + echo "Processing: examples/other/$f" + python "$f" +done \ No newline at end of file diff --git a/examples/other/spherical_harmonics1.py b/examples/other/spherical_harmonics1.py index 2f5a3473..5b66564f 100644 --- a/examples/other/spherical_harmonics1.py +++ b/examples/other/spherical_harmonics1.py @@ -1,13 +1,13 @@ """Expand and reconstruct any surface (here a simple box) into spherical harmonics""" -# Expand an arbitrary closed shape in spherical harmonics -# using SHTOOLS (https://shtools.oca.eu/shtools/) +# Expand an arbitrary closed shape into spherical harmonics +# using SHTOOLS (https://shtools.github.io/SHTOOLS) # and then truncate the expansion to a specific lmax and -# reconstruct the projected points in red +# reconstruct the projected points on a finer grid. +import pyshtools import numpy as np from scipy.interpolate import griddata -import pyshtools -from vedo import spher2cart, mag, Box, Point, Points, show +from vedo import spher2cart, mag, Box, Point, Points, Plotter ########################################################################### lmax = 8 # maximum degree of the spherical harm. expansion @@ -17,7 +17,8 @@ ########################################################################### x0 = np.array(x0) -surface = Box(pos=x0+[10,20,30], size=(300,150,100)).color('grey').alpha(0.2) +surface = Box(pos=x0+[10,20,30], size=(300,150,100)) +surface.color('grey').alpha(0.2) ############################################################ # cast rays from the sphere center and find intersections @@ -38,8 +39,8 @@ agrid.append(longs) agrid = np.array(agrid) -hits = Points(pts).cmap('jet', agrid.ravel()).add_scalarbar3d('scalar distance to x_0') -show([surface, hits, Point(x0), __doc__], at=0, N=2, axes=1) +hits = Points(pts) +hits.cmap('jet', agrid.ravel()).add_scalarbar3d('scalar distance to x_0') ############################################################# grid = pyshtools.SHGrid.from_array(agrid) @@ -71,9 +72,12 @@ p = spher2cart(grid_reco_finer[j][i], th, ph) pts2.append(p+x0) -show(f'Spherical harmonics expansion of order {lmax}', - Points(pts2, c="r", alpha=0.5), - surface, - at=1, -).interactive().close() +plt = Plotter(N=2, axes=1) +plt.at(0).show(surface, hits, Point(x0), __doc__) +plt.at(1).show( + f'Spherical harmonics expansion of order {lmax}', + Points(pts2).c("red5").alpha(0.5), + surface, +) +plt.interactive().close() diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt index 7fd71858..92b81a2c 100644 --- a/tests/test_pipeline.txt +++ b/tests/test_pipeline.txt @@ -1,16 +1,27 @@ # Test Pipeline ################################ -For internal use only +Internal use only # SITES ######################################## https://vedo.embl.es/ +https://vedo.embl.es/docs https://github.com/marcomusy/vedo https://forum.image.sc/search?q=vedo%20order%3Alatest -## INSTALL ##################################### +# INSTALL ###################################### cd ~/Projects/vedo pip install -e . pip install nevergrad -U - +pip install pyefd -U +pip install iminuit -U +pip install meshio -U +pip install morphomatics -U +pip install pygeodesic -U +pip install pygmsh -U +pip install pyacvd -U +pip install pymeshfix -U +pip install tetgen -U +pip install pyshtools -U +pip install trimesh -U # DRY RUN ###################################### cd ~/Projects/vedo/ @@ -35,8 +46,7 @@ cd ~/Projects/vedo/examples/other/dolfin conda activate fenics ./run_all.sh conda deactivate - -pip install trimesh -U +################ cd ~/Projects/vedo/examples/other/trimesh ./run_all.sh @@ -117,5 +127,6 @@ cd ~/Projects/vedo/docs/pdoc ./build_html.py # check web page examples +cd ~/Projects/vedo/ code www/examples_db.js code www/index.html diff --git a/vedo/file_io.py b/vedo/file_io.py index cfd58d77..75352c1e 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -440,10 +440,11 @@ def _load_file(filename, unpack): def download(url, force=False, verbose=True): """ Retrieve a file from a URL, save it locally and return its path. - Use `force` to force reload and discard cached copies. + Use `force=True` to force a reload and discard cached copies. """ if not url.startswith("https://"): - vedo.logger.error(f"Invalid URL (must start with https):\n{url}") + # vedo.logger.error(f"Invalid URL (must start with https):\n{url}") + # assume it's a file so no need to download return url url = url.replace("www.dropbox", "dl.dropbox") @@ -524,7 +525,8 @@ def loadStructuredPoints(filename, as_points=True): """ Load and return a `vtkStructuredPoints` object from file. - If `as_points` is True, return a `Points` object instead of `vtkStructuredPoints`. + If `as_points` is True, return a `Points` object + instead of a `vtkStructuredPoints`. """ reader = vtk.new("StructuredPointsReader") reader.SetFileName(filename) @@ -569,10 +571,7 @@ def loadXMLData(filename): ################################################################### def load3DS(filename): - """Load `3DS` file format from file. - Returns: - `Assembly(vtkAssembly)` object. - """ + """Load `3DS` file format from file.""" renderer = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(renderer) @@ -590,13 +589,15 @@ def load3DS(filename): acts.append(a) del renWin - wrapped_acts = acts - # wrapped_acts = [] - # for a in acts: - # newa = Mesh(a.GetMapper().GetInput()) - # newa.pos(a.GetPosition()) - # newa.copy_properties_from(a) - # wrapped_acts.append(newa) + wrapped_acts = [] + for a in acts: + try: + newa = Mesh(a.GetMapper().GetInput()) + newa.apply_transform(a.GetMatrix()) + newa.copy_properties_from(a) + wrapped_acts.append(newa) + except: + print("ERROR: cannot load 3DS object", [a]) return wrapped_acts ######################################################################## @@ -671,7 +672,7 @@ def loadDolfin(filename, exterior=False): app.AddInputData(polyb) app.Update() poly = app.GetOutput() - return Mesh(poly).lw(0.1) + return Mesh(poly).lw(1) ######################################################################## def loadPVD(filename): @@ -790,6 +791,7 @@ def loadPCD(filename): def _import_npy(fileinput): """Import a vedo scene from numpy format.""" # make sure the numpy file is not containing a scene + fileinput = download(fileinput, verbose=False, force=True) if fileinput.endswith(".npy"): data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] elif fileinput.endswith(".npz"): @@ -799,8 +801,6 @@ def _import_npy(fileinput): settings.render_lines_as_tubes = data["render_lines_as_tubes"] if "hidden_line_removal" in data.keys(): settings.hidden_line_removal = data["hidden_line_removal"] - if "visible_grid_edges" in data.keys(): - settings.visible_grid_edges = data["visible_grid_edges"] if "use_parallel_projection" in data.keys(): settings.use_parallel_projection = data["use_parallel_projection"] if "use_polygon_offset" in data.keys(): @@ -827,7 +827,6 @@ def _import_npy(fileinput): plt = vedo.Plotter( size=data["size"], # not necessarily a good idea to set it - # shape=data['shape'], # will need to create a Renderer class first axes=axes, title=title, bg=backgrcol, @@ -849,6 +848,8 @@ def _import_npy(fileinput): plt.camera.SetClippingRange(cam["clippingRange"]) if "clipping_range" in cam.keys(): plt.camera.SetClippingRange(cam["clipping_range"]) + if "parallel_scale" in cam.keys(): + plt.camera.SetParallelScale(cam["parallel_scale"]) plt.resetcam = False ########################## @@ -858,7 +859,6 @@ def _load_common(obj, d): if "name" in keys: obj.name = d["name"] if "info" in keys: obj.info = d["info"] if "filename" in keys: obj.filename = d["filename"] - if "position" in keys: obj.pos(d["position"]) ########################### def _buildmesh(d): @@ -870,8 +870,7 @@ def _buildmesh(d): cells = d["cells"] if "cells" in keys else None lines = d["lines"] if "lines" in keys else None - poly = utils.buildPolyData(vertices, cells, lines) - msh = Mesh(poly) + msh = Mesh([vertices, cells, lines]) _load_common(msh, d) prp = msh.properties @@ -883,7 +882,6 @@ def _buildmesh(d): if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) if 'shading' in keys: prp.SetInterpolation(d['shading']) if 'alpha' in keys: prp.SetOpacity(d['alpha']) - if 'opacity' in keys: prp.SetOpacity(d['opacity']) # synonym if 'representation' in keys: prp.SetRepresentation(d['representation']) if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) @@ -893,15 +891,27 @@ def _buildmesh(d): if 'backcolor' in keys and d['backcolor'] is not None: msh.backcolor(d['backcolor']) - if "celldata" in keys: - for csc, cscname in d["celldata"]: - msh.celldata[cscname] = csc - if "pointdata" in keys: - for psc, pscname in d["pointdata"]: - msh.pointdata[pscname] = psc + # print("XXXXX n", + # msh.dataset.GetNumberOfPoints(), + # msh.dataset.GetNumberOfCells(), + # msh.dataset.GetNumberOfLines(), + # msh.dataset.GetNumberOfPolys(), + # msh.dataset.GetNumberOfStrips(), + # msh.dataset.GetNumberOfVerts(), + # ) + + if "celldata" in keys and isinstance(d["celldata"], dict): + for arrname, arr in d["celldata"].items(): + msh.celldata[arrname] = arr + if "pointdata" in keys and isinstance(d["pointdata"], dict): + for arrname, arr in d["pointdata"].items(): + msh.pointdata[arrname] = arr + # print(msh) + + + msh.mapper.ScalarVisibilityOff() if "LUT" in keys and "activedata" in keys and d["activedata"]: - # print(d['activedata'],'', msh.filename) lut_list = d["LUT"] ncols = len(lut_list) lut = vtk.vtkLookupTable() @@ -915,22 +925,22 @@ def _buildmesh(d): msh.mapper.ScalarVisibilityOn() # activate scalars msh.mapper.SetScalarRange(d["LUT_range"]) if d["activedata"][0] == "celldata": - poly.GetCellData().SetActiveScalars(d["activedata"][1]) + msh.dataset.GetCellData().SetActiveScalars(d["activedata"][1]) + # msh.celldata.select(d["activedata"][1]) if d["activedata"][0] == "pointdata": - poly.GetPointData().SetActiveScalars(d["activedata"][1]) + msh.dataset.GetPointData().SetActiveScalars(d["activedata"][1]) + # msh.pointdata.select(d["activedata"][1]) + # print("shading", int(d["shading"]),d["scalarvisibility"], d["activedata"][1]) if "shading" in keys and int(d["shading"]) > 0: msh.compute_normals(cells=0) # otherwise cannot renderer phong - - msh.mapper.ScalarVisibilityOff() # deactivate scalars + if "scalarvisibility" in keys: if d["scalarvisibility"]: msh.mapper.ScalarVisibilityOn() else: msh.mapper.ScalarVisibilityOff() - if "texture" in keys and d["texture"]: - msh.texture(**d["texture"]) return msh ############################################## @@ -1336,7 +1346,7 @@ def export_window(fileoutput, binary=False, plt=None): ######################################################################### def _export_npy(plt, fileoutput="scene.npz"): - def _tonumpy(obj): + def _tonumpy(act): """Dump a vedo object to numpy format.""" adict = {} @@ -1371,38 +1381,29 @@ def _fillcommon(obj, adict): ######################################################## def _fillmesh(obj, adict): - - adict["points"] = obj.vertices.astype(float) poly = obj.dataset + adict["points"] = obj.vertices.astype(float) adict["cells"] = None if poly.GetNumberOfPolys(): - try: - adict["cells"] = np.array(obj.cells, dtype=np.uint32) - except ValueError: # in case of inhomogeneous shape - adict["cells"] = obj.cells + adict["cells"] = obj.cells_as_flat_array adict["lines"] = None if poly.GetNumberOfLines(): - adict["lines"] = obj.lines + adict["lines"] = obj.lines#_as_flat_array + # print("adict[lines]", adict["lines"]) - adict["pointdata"] = [] + adict["pointdata"] = {} for iname in obj.pointdata.keys(): - if not iname: + if "normals" in iname.lower(): continue - if "Normals" in iname.lower(): - continue - arr = poly.GetPointData().GetArray(iname) - adict["pointdata"].append([utils.vtk2numpy(arr), iname]) + adict["pointdata"][iname] = obj.pointdata[iname] - adict["celldata"] = [] + adict["celldata"] = {} for iname in obj.celldata.keys(): - if not iname: - continue - if "Normals" in iname.lower(): + if "normals" in iname.lower(): continue - arr = poly.GetCellData().GetArray(iname) - adict["celldata"].append([utils.vtk2numpy(arr), iname]) + adict["celldata"][iname] = obj.celldata[iname] adict["activedata"] = None if poly.GetPointData().GetScalars(): @@ -1446,19 +1447,13 @@ def _fillmesh(obj, adict): adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() - adict["texture"] = obj._texture if hasattr(obj, "_texture") else None + + ##################################################################### + obj = act.retrieve_object() ######################################################## Assembly if isinstance(obj, Assembly): pass - # adict['type'] = 'Assembly' - # _fillcommon(obj, adict) - # adict['actors'] = [] - # for a in obj.unpack(): - # assdict = dict() - # if isinstance(a, Mesh): - # _fillmesh(a, assdict) - # adict['actors'].append(assdict) ######################################################## Points/Mesh elif isinstance(obj, Points): @@ -1474,7 +1469,6 @@ def _fillmesh(obj, adict): arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) adict["array"] = arr.reshape(imgdata.GetDimensions()) adict["mode"] = obj.mode() - # adict['jittering'] = obj.mapper.GetUseJittering() prp = obj.properties ctf = prp.GetRGBTransferFunction() @@ -1510,11 +1504,9 @@ def _fillmesh(obj, adict): adict["bgcol"] = obj.properties.GetBackgroundColor() adict["alpha"] = obj.properties.GetBackgroundOpacity() adict["frame"] = obj.properties.GetFrame() - # print('tonumpy(): vedo.Text2D', obj.text()[:10], obj.font(), obj.GetPosition()) else: pass - # colors.printc('Unknown object type in tonumpy()', [obj], c='r') return adict sdict = {} @@ -1526,6 +1518,7 @@ def _fillmesh(obj, adict): viewup=plt.camera.GetViewUp(), distance=plt.camera.GetDistance(), clipping_range=plt.camera.GetClippingRange(), + parallel_scale=plt.camera.GetParallelScale(), ) sdict["position"] = plt.pos sdict["size"] = plt.size @@ -1535,12 +1528,12 @@ def _fillmesh(obj, adict): sdict["backgrcol2"] = None if plt.renderer.GetGradientBackground(): sdict["backgrcol2"] = plt.renderer.GetBackground2() - sdict["use_depth_peeling"] = plt.camera.GetParallelProjection() + sdict["use_depth_peeling"] = plt.renderer.GetUseDepthPeeling() sdict["render_lines_as_tubes"] = settings.render_lines_as_tubes sdict["hidden_line_removal"] = settings.hidden_line_removal - sdict["visible_grid_edges"] = settings.visible_grid_edges - sdict["use_parallel_projection"] = settings.use_parallel_projection + sdict["use_parallel_projection"] = plt.camera.GetParallelProjection() sdict["default_font"] = settings.default_font + sdict["objects"] = [] allobjs = plt.get_actors() @@ -1548,10 +1541,8 @@ def _fillmesh(obj, adict): acts2d.InitTraversal() for _ in range(acts2d.GetNumberOfItems()): a = acts2d.GetNextItem() - if isinstance(a, vedo.Text2D): - allobjs.append(a) - allobjs += plt.objects - allobjs = list(set(allobjs)) # make sure its unique + # if isinstance(a, vedo.Text2D): + allobjs.append(a) for a in allobjs: try: @@ -1743,8 +1734,7 @@ def _export_hdf5(plt, fileoutput="scene.h5"): bfp = vob.actor.GetBackfaceProperty() props["backcolor"] = bfp.GetColor() if bfp else "" props["scalar_visibility"] = vob.mapper.GetScalarVisibility() - hastxt = hasattr(vob, "_texture") and vob._texture - props["texture"] = vob._texture if hastxt else "" + except AttributeError: pass diff --git a/vedo/mesh.py b/vedo/mesh.py index b1bf82f5..7c49f8fd 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -154,7 +154,6 @@ def __init__(self, inputobj=None, c="gold", alpha=1): n = self.dataset.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") - self._texture = None def _repr_html_(self): """ @@ -473,17 +472,6 @@ def texture( self.vertices = new_points self.dataset.Modified() - self._texture = { - "tname": tname, - "tcoords": tcoords, - "interpolate": interpolate, - "repeat": repeat, - "edge_clamp": edge_clamp, - "scale": scale, - "ushift": ushift, - "vshift": vshift, - "seam_threshold": seam_threshold, - } return self def compute_normals(self, points=True, cells=True, feature_angle=None, consistency=True): diff --git a/vedo/plotter.py b/vedo/plotter.py index 9d0b8aae..be8889c1 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -1251,10 +1251,7 @@ def get_actors(self, at=None, include_non_pickables=False): for _ in range(acs.GetNumberOfItems()): a = acs.GetNextProp() if include_non_pickables or a.GetPickable(): - # try: - # acts.append(a.retrieve_object()) - # except AttributeError: - acts.append(a) + acts.append(a) return acts def reset_camera(self, tight=None): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index bf0c887c..99999adb 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -552,7 +552,6 @@ def fibonacci_sphere(n): self.properties.RenderPointsAsSpheresOn() except AttributeError: pass - # self.properties.LightingOff() if inputobj is None: #################### return @@ -662,7 +661,7 @@ def __str__(self): npt = self.dataset.GetNumberOfPoints() npo, nln = self.dataset.GetNumberOfPolys(), self.dataset.GetNumberOfLines() - out+= "elements".ljust(14) + f": vertices={npt:,} polys={npo:,} lines={nln:,}\n" + out+= "elements".ljust(14) + f": vertices={npt:,}, polys={npo:,}, lines={nln:,}\n" out+= "position".ljust(14) + ": " + f"{utils.precision(self.pos(), 6)}\n" out+= "scaling".ljust(14) + ": " diff --git a/vedo/shapes.py b/vedo/shapes.py index 386e9bfa..a790bfd0 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4642,7 +4642,7 @@ def __init__( self.properties = self.mapper.GetTextProperty() self.actor = self - # self.actor.retrieve_object = weak_ref_to(self) + self.actor.retrieve_object = weak_ref_to(self) self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() diff --git a/vedo/utils.py b/vedo/utils.py index 7bcd4e38..122333aa 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -590,6 +590,8 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False vline.GetPointIds().SetId(1, i2) linesarr.InsertNextCell(vline) else: # assume format [id0,id1,...] + # print("buildPolyData: assuming lines format [id0,id1,...]", lines) + # TODO CORRECT THIS CASE [2id0,id1,...] for i in range(0, len(lines) - 1): vline = vtk.vtkLine() vline.GetPointIds().SetId(0, lines[i]) diff --git a/vedo/visual.py b/vedo/visual.py index ac7f0166..3a19de07 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -940,6 +940,7 @@ def cmap( elif "cell" in on.lower(): data = self.dataset.GetCellData() n = self.dataset.GetNumberOfCells() + # print("XXXX", n, self.dataset.GetNumberOfVerts()) else: vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") raise RuntimeError() diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index f083b406..6d8f74db 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -49,7 +49,12 @@ def new(cls_name="", module_name=""): a = vtk.new("Actor") ``` """ - return get_class(cls_name, module_name)() + try: + instance = get_class(cls_name, module_name)() + except NotImplementedError as e: + print(e, cls_name) + return None + return instance def dump_hierarchy_to_file(fname=""): From b48ab7c84a0e75a0a5e9ea862c40d3ba47e911c4 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Tue, 7 Nov 2023 22:28:45 +0100 Subject: [PATCH 221/251] add core.warnings --- vedo/core.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index 87b600e4..ad6d7498 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -24,7 +24,19 @@ "VolumeAlgorithms", "UGridAlgorithms", ] - + +warnings = dict( + points_getter=( + "WARNING: points() is deprecated, use vertices instead. Change:\n" + " mesh.points() -> mesh.vertices\n" + " (silence this with vedo.core.warnings['points_getter']=False)" + ), + points_setter=( + "WARNING: points() is deprecated, use vertices instead. Change:\n" + " mesh.points([[x,y,z], ...]) -> mesh.vertices = [[x,y,z], ...]\n" + " (silence this with vedo.core.warnings['points_getter']=False)" + ), +) ############################################################################### class DataArrayHelper: @@ -572,19 +584,17 @@ def points(self, pts=None): Set/Get the vertex coordinates of a mesh or point cloud. """ if pts is None: ### getter - msg = ( - "WARNING: points() is deprecated, use vertices instead. E.g.:\n" - " mesh.points() -> mesh.vertices" - ) - colors.printc(msg, c="y") + + if warnings["points_getter"]: + colors.printc(warnings["points_getter"], c="y") + warnings["points_getter"] = "" return self.vertices - else: - msg = ( - "WARNING: points() is deprecated, use vertices instead. E.g.:\n" - " mesh.points([[x,y,z]]) -> mesh.vertices = [[x,y,z]]" - ) - colors.printc(msg, c="y") + else: ### setter + + if warnings["points_setter"]: + colors.printc(warnings["points_setter"], c="y") + warnings["points_setter"] = "" pts = np.asarray(pts, dtype=np.float32) From 13367de5849ca7e94aeb7ef33e00b051cd61b89b Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Thu, 9 Nov 2023 02:07:01 +0100 Subject: [PATCH 222/251] improvements in actor transformations and add vtm files back --- vedo/assembly.py | 176 +---------------- vedo/file_io.py | 30 +-- vedo/image.py | 2 + vedo/pyplot.py | 16 +- vedo/version.py | 2 +- vedo/visual.py | 484 ++++++++++++++++++++++++--------------------- vedo/vtkclasses.py | 5 + 7 files changed, 293 insertions(+), 422 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index e1dff888..5e30b3cd 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -7,7 +7,7 @@ import vedo from vedo.transformations import LinearTransform -from vedo.visual import CommonVisual +from vedo.visual import CommonVisual, Actor3DHelper __docformat__ = "google" @@ -93,7 +93,7 @@ def __init__(self, objects=()): self.rendered_at = set() self.scalarbar = None - self.transform = LinearTransform() + # self.transform = LinearTransform() for a in vedo.utils.flatten(objects): if a: @@ -165,7 +165,7 @@ def draggable(self, value=None): return self def pos(self, x=None, y=None): - """Set/Get object position.""" + """Set/Get object 2D position on the screen.""" if x is None: # get functionality return np.array(self.GetPosition()) @@ -175,35 +175,21 @@ def pos(self, x=None, y=None): return self def shift(self, ds): - """Add a shift to the current object position.""" + """Add a shift to the current object position on the screen.""" p = np.array(self.GetPosition()) - self.SetPosition(p + ds) return self def bounds(self): """ - Get the object bounds. + Get the object 2D bounds. Returns a list in format [xmin,xmax, ymin,ymax]. """ return self.GetBounds() - def show(self, **options): - """ - Create on the fly an instance of class `Plotter` or use the last existing one to - show one single object. - - This method is meant as a shortcut. If more than one object needs to be visualised - please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - - Returns the `Plotter` class instance. - """ - return vedo.plotter.show(self, **options) - - ################################################# -class Assembly(CommonVisual, vtk.vtkAssembly): +class Assembly(CommonVisual, Actor3DHelper, vtk.vtkAssembly): """ Group many objects and treat them as a single new object. """ @@ -396,16 +382,6 @@ def __contains__(self, obj): """Allows to use `in` to check if an object is in the `Assembly`.""" return obj in self.objects - - def apply_transform(self, LT, concatenate=True): - """Apply a linear transformation to the object.""" - if concatenate: - self.transform.concatenate(LT) - self.SetPosition(self.transform.T.GetPosition()) - self.SetOrientation(self.transform.T.GetOrientation()) - self.SetScale(self.transform.T.GetScale()) - return self - # TODO #### # def propagate_transform(self): # """Propagate the transformation to all parts.""" @@ -420,132 +396,6 @@ def apply_transform(self, LT, concatenate=True): # obj.SetScale(1, 1, 1) # raise NotImplementedError() - - def pos(self, x=None, y=None, z=None): - """Set/Get object position.""" - if x is None: # get functionality - return self.transform.position - - if z is None and y is None: # assume x is of the form (x,y,z) - if len(x) == 3: - x, y, z = x - else: - x, y = x - z = 0 - elif z is None: # assume x,y is of the form x, y - z = 0 - - q = self.transform.position - LT = LinearTransform().translate([x,y,z]-q) - return self.apply_transform(LT) - - def shift(self, dx, dy=0, dz=0): - """Add a vector to the current object position.""" - if vedo.utils.is_sequence(dx): - vedo.utils.make3d(dx) - dx, dy, dz = dx - LT = LinearTransform().translate([dx, dy, dz]) - return self.apply_transform(LT) - - def scale(self, s): - """Multiply object size by `s` factor.""" - LT = LinearTransform().scale(s) - return self.apply_transform(LT) - - def x(self, val=None): - """Set/Get object position along x axis.""" - p = self.transform.position - if val is None: - return p[0] - self.pos(val, p[1], p[2]) - return self - - def y(self, val=None): - """Set/Get object position along y axis.""" - p = self.transform.position - if val is None: - return p[1] - self.pos(p[0], val, p[2]) - return self - - def z(self, val=None): - """Set/Get object position along z axis.""" - p = self.transform.position - if val is None: - return p[2] - self.pos(p[0], p[1], val) - return self - - def rotate_x(self, angle): - """Rotate object around x axis.""" - LT = LinearTransform().rotate_x(angle) - return self.apply_transform(LT) - - def rotate_y(self, angle): - """Rotate object around y axis.""" - LT = LinearTransform().rotate_y(angle) - return self.apply_transform(LT) - - def rotate_z(self, angle): - """Rotate object around z axis.""" - LT = LinearTransform().rotate_z(angle) - return self.apply_transform(LT) - - def reorient(self, old_axis, new_axis, rotation=0, rad=False): - """Rotate object to a new orientation.""" - if rad: - rotation *= 57.3 - axis = old_axis / np.linalg.norm(old_axis) - direction = new_axis / np.linalg.norm(new_axis) - angle = np.arccos(np.dot(axis, direction)) * 57.3 - self.RotateZ(rotation) - a,b,c = np.cross(axis, direction) - self.RotateWXYZ(angle, c,b,a) - return self - - def bounds(self): - """ - Get the object bounds. - Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. - """ - return self.GetBounds() - - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) - - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) - - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) - - def diagonal_size(self): - """Get the diagonal size of the bounding box.""" - b = self.bounds() - return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) - - def use_bounds(self, value): - """Consider object bounds in rendering.""" - self.SetUseBounds(value) - return self - - def copy(self): """Return a copy of the object. Alias of `clone()`.""" return self.clone() @@ -600,7 +450,6 @@ def _genflatten(lst): return list(_genflatten([self])) - def pickable(self, value=True): """Set/get the pickability property of an assembly and its elements""" self.SetPickable(value) @@ -608,16 +457,3 @@ def pickable(self, value=True): for elem in self.recursive_unpack(): elem.pickable(value) return self - - def show(self, **options): - """ - Create on the fly an instance of class `Plotter` or use the last existing one to - show one single object. - - This method is meant as a shortcut. If more than one object needs to be visualised - please use the syntax `show(mesh1, mesh2, volume, ..., options)`. - - Returns the `Plotter` class instance. - """ - return vedo.plotter.show(self, **options) - diff --git a/vedo/file_io.py b/vedo/file_io.py index 75352c1e..6b67d076 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1158,6 +1158,19 @@ def write(objct, fileoutput, binary=True): writer = vtk.new("FacetWriter") elif fr.endswith(".vti"): writer = vtk.new("XMLImageDataWriter") + elif fr.endswith(".vtm"): + g = vtk.new("MultiBlockDataGroupFilter") + for ob in objct: + if isinstance(ob, (Points, Volume)): # picks transformation + ob = ob.polydata(True) + g.AddInputData(ob) + g.Update() + mb = g.GetOutputDataObject(0) + wri = vtk.vtkXMLMultiBlockDataWriter() + wri.SetInputData(mb) + wri.SetFileName(fileoutput) + wri.Write() + return objct elif fr.endswith(".mhd"): writer = vtk.new("MetaImageWriter") elif fr.endswith(".nii"): @@ -1362,22 +1375,9 @@ def _fillcommon(obj, adict): adict["info"] = obj.info try: - # GetMatrix might not exist for non linear transforms - m = np.eye(4) - vm = obj.get_transform().GetMatrix() - for i in [0, 1, 2, 3]: - for j in [0, 1, 2, 3]: - m[i, j] = vm.GetElement(i, j) - adict["transform"] = m - minv = np.eye(4) - vm.Invert() - for i in [0, 1, 2, 3]: - for j in [0, 1, 2, 3]: - minv[i, j] = vm.GetElement(i, j) - adict["transform_inverse"] = minv + adict["transform"] = obj.transform.matrix except AttributeError: - adict["transform"] = [] - adict["transform_inverse"] = [] + adict["transform"] = np.eye(4) ######################################################## def _fillmesh(obj, adict): diff --git a/vedo/image.py b/vedo/image.py index 18abb179..8a001999 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -165,6 +165,8 @@ def __init__(self, obj=None, channels=3): self.actor.retrieve_object = weak_ref_to(self) self.properties = self.actor.GetProperty() + self.transform = vedo.LinearTransform() + if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, False) diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 7e65ae98..100995bd 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -11,11 +11,11 @@ from vedo import addons from vedo import colors from vedo import utils +from vedo import shapes +from vedo.visual import Actor2D from vedo.pointcloud import merge from vedo.mesh import Mesh from vedo.assembly import Assembly, Group -from vedo import shapes - __docformat__ = "google" @@ -58,7 +58,7 @@ def _to2d(obj, offset, scale): mapper2d = vtk.new("PolyDataMapper2D") mapper2d.SetInputData(poly) - act2d = vtk.vtkActor2D() + act2d = Actor2D() act2d.SetMapper(mapper2d) act2d.GetProperty().SetColor(obj.color()) @@ -651,8 +651,8 @@ def add_legend( px, py = pos[0], pos[1] shx, shy = x0, y1 - zpos = aleg.GetPosition()[2] - aleg.SetPosition(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) + zpos = aleg.pos()[2] + aleg.pos(px - shx, py * self.yscale - shy, zpos + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg @@ -745,7 +745,7 @@ def clone2d(self, pos="bottom-left", scale=1, padding=0.05): # wireframe is not rendered correctly in 2d continue a2d = _to2d(a, offset, scale * 550 / (x1 - x0)) - a2d.SetPosition(position) + a2d.pos(position) group += a2d return group @@ -3181,8 +3181,8 @@ def _histogram_hex_bin( h.color(col) asse = Assembly(hexs) - asse.SetScale(1.2 / n * dx, 1 / m * dy, norm / binmax * (dx + dy) / 4) - asse.SetPosition(xmin, ymin, 0) + asse.scale([1.2 / n * dx, 1 / m * dy, norm / binmax * (dx + dy) / 4]) + asse.pos([xmin, ymin, 0]) # asse.base = np.array([0, 0, 0], dtype=float) # asse.top = np.array([0, 0, 1], dtype=float) asse.name = "HistogramHexBin" diff --git a/vedo/version.py b/vedo/version.py index 24267709..22427c05 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev29a' +_version = '2023.5.0+dev30a' diff --git a/vedo/visual.py b/vedo/visual.py index 3a19de07..cf36d6c2 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -31,7 +31,7 @@ class CommonVisual: """Class to manage the visual aspects common to all objects.""" def __init__(self): - + # print("init CommonVisual") self.mapper = None self.properties = None self.actor = None @@ -455,6 +455,259 @@ def alpha(self, alpha, vmin=None, vmax=None): return self +######################################################################################## +class Actor2D(vtk.vtkActor2D): + """Wrapping of `vtkActor2D`.""" + + def __init__(self): + """Manage 2D objects.""" + super().__init__() + + self.mapper = self.GetMapper() + self.properties = self.GetProperty() + self.filename = "" + self.shape = [] + + def layer(self, value=None): + """Set/Get the layer number in the overlay planes into which to render.""" + if value is None: + return self.GetLayerNumber() + self.SetLayerNumber(value) + return self + + def pos(self, px=None, py=None): + """Set/Get the screen-coordinate position.""" + if isinstance(px, str): + vedo.logger.error("Use string descriptors only inside the constructor") + return self + if px is None: + return np.array(self.GetPosition(), dtype=int) + if py is not None: + p = [px, py] + else: + p = px + assert len(p) == 2, "Error: len(pos) must be 2 for Actor2D" + self.SetPosition(p) + return self + + def coordinate_system(self, value=None): + """ + Set/get the coordinate system which this coordinate is defined in. + + The options are: + 0. Display + 1. Normalized Display + 2. Viewport + 3. Normalized Viewport + 4. View + 5. Pose + 6. World + """ + coor = self.GetPositionCoordinate() + if value is None: + return coor.GetCoordinateSystem() + coor.SetCoordinateSystem(value) + return self + + def on(self): + """Set object visibility.""" + self.VisibilityOn() + return self + + def off(self): + """Set object visibility.""" + self.VisibilityOn() + return self + + def toggle(self): + """Toggle object visibility.""" + self.SetVisibility(not self.GetVisibility()) + return self + + def pickable(self, value=True): + """Set object pickability.""" + self.SetPickable(value) + return self + + def color(self, value=None): + """Set/Get the object color.""" + if value is None: + return self.properties.GetColor() + self.properties.SetColor(colors.get_color(value)) + return self + + def c(self, value=None): + """Set/Get the object color.""" + return self.color(value) + + def alpha(self, value=None): + """Set/Get the object opacity.""" + if value is None: + return self.properties.GetOpacity() + self.properties.SetOpacity(value) + return self + + def ps(self, point_size=None): + if point_size is None: + return self.properties.GetPointSize() + self.properties.SetPointSize(point_size) + return self + + def ontop(self, value=True): + """Keep the object always on top of everything else.""" + if value: + self.properties.SetDisplayLocationToForeground() + else: + self.properties.SetDisplayLocationToBackground() + return self + + def add_observer(self, event_name, func, priority=0): + """Add a callback function that will be called when an event occurs.""" + event_name = utils.get_vtk_name_event(event_name) + idd = self.AddObserver(event_name, func, priority) + return idd + +######################################################################################## +class Actor3DHelper: + + def apply_transform(self, LT, concatenate=True): + """Apply a linear transformation to the actor.""" + if concatenate: + self.transform.concatenate(LT) + self.actor.SetPosition(self.transform.T.GetPosition()) + self.actor.SetOrientation(self.transform.T.GetOrientation()) + self.actor.SetScale(self.transform.T.GetScale()) + return self + + def pos(self, x=None, y=None, z=None): + """Set/Get object position.""" + if x is None: # get functionality + return self.transform.position + + if z is None and y is None: # assume x is of the form (x,y,z) + if len(x) == 3: + x, y, z = x + else: + x, y = x + z = 0 + elif z is None: # assume x,y is of the form x, y + z = 0 + + q = self.transform.position + LT = vedo.LinearTransform().translate([x,y,z]-q) + return self.apply_transform(LT) + + def shift(self, dx, dy=0, dz=0): + """Add a vector to the current object position.""" + if vedo.utils.is_sequence(dx): + vedo.utils.make3d(dx) + dx, dy, dz = dx + LT = vedo.LinearTransform().translate([dx, dy, dz]) + return self.apply_transform(LT) + + def origin(self, point=None): + """ + Set/get origin of object. + Useful for defining pivoting point when rotating and/or scaling. + """ + if point is None: + return np.array(self.actor.GetOrigin()) + self.actor.SetOrigin(point) + return self + + def scale(self, s): + """Multiply object size by `s` factor.""" + LT = vedo.LinearTransform().scale(s) + return self.apply_transform(LT) + + def x(self, val=None): + """Set/Get object position along x axis.""" + p = self.transform.position + if val is None: + return p[0] + self.pos(val, p[1], p[2]) + return self + + def y(self, val=None): + """Set/Get object position along y axis.""" + p = self.transform.position + if val is None: + return p[1] + self.pos(p[0], val, p[2]) + return self + + def z(self, val=None): + """Set/Get object position along z axis.""" + p = self.transform.position + if val is None: + return p[2] + self.pos(p[0], p[1], val) + return self + + def rotate_x(self, angle): + """Rotate object around x axis.""" + LT = vedo.LinearTransform().rotate_x(angle) + return self.apply_transform(LT) + + def rotate_y(self, angle): + """Rotate object around y axis.""" + LT = vedo.LinearTransform().rotate_y(angle) + return self.apply_transform(LT) + + def rotate_z(self, angle): + """Rotate object around z axis.""" + LT = vedo.LinearTransform().rotate_z(angle) + return self.apply_transform(LT) + + def reorient(self, old_axis, new_axis, rotation=0, rad=False): + """Rotate object to a new orientation.""" + if rad: + rotation *= 180 / np.pi + axis = old_axis / np.linalg.norm(old_axis) + direction = new_axis / np.linalg.norm(new_axis) + angle = np.arccos(np.dot(axis, direction)) * 180 / np.pi + self.actor.RotateZ(rotation) + a,b,c = np.cross(axis, direction) + self.actor.RotateWXYZ(angle, c,b,a) + return self + + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + return self.actor.GetBounds() + + def xbounds(self, i=None): + """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i is not None: + return b[i] + return (b[0], b[1]) + + def ybounds(self, i=None): + """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[2] + if i == 1: + return b[3] + return (b[2], b[3]) + + def zbounds(self, i=None): + """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" + b = self.bounds() + if i == 0: + return b[4] + if i == 1: + return b[5] + return (b[4], b[5]) + + def diagonal_size(self): + """Get the diagonal size of the bounding box.""" + b = self.bounds() + return np.sqrt((b[1]-b[0])**2 + (b[3]-b[2])**2 + (b[5]-b[4])**2) + ################################################### class PointsVisual(CommonVisual): """Class to manage the visual aspects of a ``Points`` object.""" @@ -2238,7 +2491,7 @@ def mask(self, data): See also: `volume.hide_voxels()` """ - mask = Volume(data.astype(np.uint8)) + mask = vedo.Volume(data.astype(np.uint8)) try: self.mapper.SetMaskTypeToBinary() self.mapper.SetMaskInput(mask.dataset) @@ -2257,7 +2510,7 @@ def interpolation(self, itype): ######################################################################################## -class ImageVisual(CommonVisual): +class ImageVisual(CommonVisual, Actor3DHelper): def __init__(self) -> None: # print("init ImageVisual") @@ -2296,230 +2549,5 @@ def window(self, value=None): self.properties.SetColorWindow(value) return self - def bounds(self): - """Get the bounding box.""" - return self.actor.GetBounds() - - def xbounds(self, i=None): - """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i is not None: - return b[i] - return (b[0], b[1]) - - def ybounds(self, i=None): - """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[2] - if i == 1: - return b[3] - return (b[2], b[3]) - - def zbounds(self, i=None): - """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" - b = self.bounds() - if i == 0: - return b[4] - if i == 1: - return b[5] - return (b[4], b[5]) - - def diagonal_size(self): - """Get the length of the diagonal of mesh bounding box.""" - b = self.bounds() - return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) - - def pos(self, *p): - """Set/get position of object.""" - if len(p)==0: - return np.array(self.actor.GetPosition()) - if len(p)==2: - p = (p[0], p[1], 0) - self.actor.SetPosition(*p) - return self - - def origin(self, point=None): - """Set/get origin of object.""" - if point is None: - return np.array(self.actor.GetOrigin()) - self.actor.SetOrigin(point) - return self - - def x(self, x=None): - """Set/get x coordinate of object.""" - if x is None: - return self.actor.GetPosition()[0] - p = self.actor.GetPosition() - self.actor.SetPosition(x, p[1], p[2]) - return self - - def y(self, y=None): - """Set/get y coordinate of object.""" - if y is None: - return self.actor.GetPosition()[1] - p = self.actor.GetPosition() - self.actor.SetPosition(p[0], y, p[2]) - return self - - def z(self, z=None): - """Set/get z coordinate of object.""" - if z is None: - return self.actor.GetPosition()[2] - p = self.actor.GetPosition() - self.actor.SetPosition(p[0], p[1], z) - return self - - def rotate_x(self, angle): - """Rotate around x axis.""" - self.actor.RotateX(angle) - return self - - def rotate_y(self, angle): - """Rotate around y axis.""" - self.actor.RotateY(angle) - return self - - def rotate_z(self, angle): - """Rotate around z axis.""" - self.actor.RotateZ(angle) - return self - - def reorient(self, old_axis, new_axis): - """Rotate object to a new orientation.""" - axis = utils.versor(old_axis) - direction = utils.versor(new_axis) - angle = np.arccos(np.dot(axis, direction)) * 57.3 - self.actor.RotateWXYZ(angle, np.cross(axis, direction)) - return self - - def shift(self, dp): - """Add vector to current position.""" - p = self.actor.GetPosition() - if len(dp)==2: - dp = (dp[0], dp[1], 0) - self.actor.SetPosition(p[0] + dp[0], p[1] + dp[1], p[2] + dp[2]) - return self - - def scale(self, s=None, absolute=False): - """Set/get scaling factor.""" - if s is None: - return np.array(self.actor.GetScale()) - if absolute: - self.actor.SetScale(s, s, s) - else: - self.actor.SetScale(np.array(self.actor.GetScale()) * s) - return self - - -######################################################################################## -class Actor2D(vtk.vtkActor2D): - """Wrapping of `vtkActor2D`.""" - - def __init__(self): - """Manage 2D objects.""" - super().__init__() - - self.mapper = self.GetMapper() - self.properties = self.GetProperty() - self.filename = "" - self.shape = [] - - def layer(self, value=None): - """Set/Get the layer number in the overlay planes into which to render.""" - if value is None: - return self.GetLayerNumber() - self.SetLayerNumber(value) - return self - - def pos(self, px=None, py=None): - """Set/Get the screen-coordinate position.""" - if isinstance(px, str): - vedo.logger.error("Use string descriptors only inside the constructor") - return self - if px is None: - return np.array(self.GetPosition(), dtype=int) - if py is not None: - p = [px, py] - else: - p = px - assert len(p) == 2, "Error: len(pos) must be 2 for Actor2D" - self.SetPosition(p) - return self - - def coordinate_system(self, value=None): - """ - Set/get the coordinate system which this coordinate is defined in. - - The options are: - 0. Display - 1. Normalized Display - 2. Viewport - 3. Normalized Viewport - 4. View - 5. Pose - 6. World - """ - coor = self.GetPositionCoordinate() - if value is None: - return coor.GetCoordinateSystem() - coor.SetCoordinateSystem(value) - return self - - def on(self): - """Set object visibility.""" - self.VisibilityOn() - return self - def off(self): - """Set object visibility.""" - self.VisibilityOn() - return self - def toggle(self): - """Toggle object visibility.""" - self.SetVisibility(not self.GetVisibility()) - return self - - def pickable(self, value=True): - """Set object pickability.""" - self.SetPickable(value) - return self - - def color(self, value=None): - """Set/Get the object color.""" - if value is None: - return self.properties.GetColor() - self.properties.SetColor(colors.get_color(value)) - return self - - def c(self, value=None): - """Set/Get the object color.""" - return self.color(value) - - def alpha(self, value=None): - """Set/Get the object opacity.""" - if value is None: - return self.properties.GetOpacity() - self.properties.SetOpacity(value) - return self - - def ps(self, point_size=None): - if point_size is None: - return self.properties.GetPointSize() - self.properties.SetPointSize(point_size) - return self - - def ontop(self, value=True): - """Keep the object always on top of everything else.""" - if value: - self.properties.SetDisplayLocationToForeground() - else: - self.properties.SetDisplayLocationToBackground() - return self - - def add_observer(self, event_name, func, priority=0): - """Add a callback function that will be called when an event occurs.""" - event_name = utils.get_vtk_name_event(event_name) - idd = self.AddObserver(event_name, func, priority) - return idd diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 6d8f74db..f51bce91 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -100,9 +100,14 @@ def dump_hierarchy_to_file(fname=""): if settings.dry_run_mode < 2: #https://vtk.org/doc/nightly/html # /md__builds_gitlab_kitware_sciviz_ci_Documentation_Doxygen_PythonWrappers.html + + # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 + # noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle + # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType + # noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingVolumeOpenGL2 import ( vtkOpenGLGPUVolumeRayCastMapper, vtkSmartVolumeMapper, From e54764379f18e03dd9fd482c86e5951121d3f43c Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Thu, 9 Nov 2023 04:21:09 +0100 Subject: [PATCH 223/251] improvemtns to Assembly and numpy dump --- examples/advanced/line2mesh_tri.py | 6 +- examples/advanced/warp4a.py | 4 +- examples/basic/align4.py | 4 +- examples/basic/slider_browser.py | 4 +- examples/other/ellipt_fourier_desc.py | 2 +- examples/pyplot/custom_axes4.py | 2 +- examples/pyplot/graph_lineage.py | 4 +- examples/pyplot/graph_network.py | 5 +- examples/pyplot/histo_1d_b.py | 2 +- examples/pyplot/plot_fxy2.py | 4 +- examples/simulations/fourier_epicycles.py | 2 +- vedo/assembly.py | 53 ++- vedo/file_io.py | 552 +++++++++++----------- 13 files changed, 351 insertions(+), 293 deletions(-) diff --git a/examples/advanced/line2mesh_tri.py b/examples/advanced/line2mesh_tri.py index 3dba3cf2..faf2df49 100644 --- a/examples/advanced/line2mesh_tri.py +++ b/examples/advanced/line2mesh_tri.py @@ -1,8 +1,8 @@ """Generate a polygonal Mesh from a contour line""" -from vedo import dataurl, load, Line, show +from vedo import dataurl, Assembly, Line, show from vedo.pyplot import histogram -shapes = load(dataurl + "timecourse1d.npy") # list of lines +shapes = Assembly(dataurl + "timecourse1d.npy") # group of lines shape = shapes[56] # pick one cmap = "RdYlBu" @@ -22,4 +22,4 @@ c=cmap, ).clone2d("bottom-right") -show(contour, labels, msh, histo, __doc__, sharecam=0).close() +show(contour, labels, msh, histo, __doc__).close() diff --git a/examples/advanced/warp4a.py b/examples/advanced/warp4a.py index 9823f4b8..896b6ec2 100644 --- a/examples/advanced/warp4a.py +++ b/examples/advanced/warp4a.py @@ -1,7 +1,7 @@ # Morph one shape into another interactively # (can work in 3d too! see example warp4b.py) # -from vedo import Plotter, Axes, dataurl, load, printc, merge +from vedo import Plotter, Axes, dataurl, Assembly, printc, merge from vedo.shapes import Text2D, Points, Lines, Arrows2D, Grid class Morpher: @@ -141,7 +141,7 @@ def onkeypress(self, evt): ###################################### MORPH & GENER ######################################################################################## MAIN if __name__ == "__main__": - outlines = load(dataurl + "timecourse1d.npy") # load a set of 2d shapes + outlines = Assembly(dataurl + "timecourse1d.npy") # load a set of 2d shapes mesh1 = outlines[25] mesh2 = outlines[35].scale(1.3).shift(-2,0,0) morpher = Morpher(mesh1, mesh2, 10) # generate 10 intermediate outlines diff --git a/examples/basic/align4.py b/examples/basic/align4.py index e68ba1fd..6bcbe02a 100644 --- a/examples/basic/align4.py +++ b/examples/basic/align4.py @@ -2,8 +2,8 @@ with Procrustes method""" from vedo import * -# Load splines from a file (returns a list of vedo.Lines) -splines = load(dataurl+'splines.npy') +# Load splines from a file (returns a group of vedo.Lines, like a list) +splines = Assembly(dataurl+'splines.npy') # Perform Procrustes alignment on the splines, allowing for non-rigid transformations procus = procrustes_alignment(splines, rigid=False) diff --git a/examples/basic/slider_browser.py b/examples/basic/slider_browser.py index 622bab9d..bff9482b 100644 --- a/examples/basic/slider_browser.py +++ b/examples/basic/slider_browser.py @@ -1,5 +1,5 @@ """Mouse hind limb growth from day 10 9h to day 15 21h""" -from vedo import settings, dataurl, load +from vedo import settings, dataurl, Assembly from vedo import Text2D, Plotter, Image, Axes, Line @@ -12,7 +12,7 @@ def sliderfunc(widget, event): plt.pop().add(objs[i]) -objs = load(dataurl + "timecourse1d.npy") # load a list of shapes +objs = Assembly(dataurl+"timecourse1d.npy") # load a list of shapes settings.default_font = "Glasgo" diff --git a/examples/other/ellipt_fourier_desc.py b/examples/other/ellipt_fourier_desc.py index 9e980214..2e4fec0a 100644 --- a/examples/other/ellipt_fourier_desc.py +++ b/examples/other/ellipt_fourier_desc.py @@ -3,7 +3,7 @@ import vedo import pyefd -shapes = vedo.load(vedo.dataurl+'timecourse1d.npy') +shapes = vedo.Assembly(vedo.dataurl+'timecourse1d.npy') sh = shapes[55] sr = vedo.Line(sh).mirror('x') diff --git a/examples/pyplot/custom_axes4.py b/examples/pyplot/custom_axes4.py index 584b93ae..3aeb7731 100644 --- a/examples/pyplot/custom_axes4.py +++ b/examples/pyplot/custom_axes4.py @@ -19,7 +19,7 @@ # axes3 is an Assembly (group of Meshes). # Unpack it and scale the 7th label getting it by its name, # make it 5 times bigger big and fuchsia: -axes3.unpack('xNumericLabel7').scale(5).c('fuchsia') +axes3['xNumericLabel7'].scale(5).c('fuchsia') # Print all element names in axes3: #for m in axes3.get_meshes(): print(m.name) diff --git a/examples/pyplot/graph_lineage.py b/examples/pyplot/graph_lineage.py index df72c92f..754bb719 100644 --- a/examples/pyplot/graph_lineage.py +++ b/examples/pyplot/graph_lineage.py @@ -22,7 +22,7 @@ g.build() # optimize layout -g.unpack(0).color('dg').lw(3) #0=graph, 1=vertexLabels, 2=edge_labels, 3=arrows -g.unpack(2).color('dr') +g[0].color('dg').lw(3) #0=graph, 1=vertexLabels, 2=edge_labels, 3=arrows +g[2].color('dr') show(g, __doc__, axes=9, elevation=-40).close() diff --git a/examples/pyplot/graph_network.py b/examples/pyplot/graph_network.py index e6f32f7c..c4379676 100644 --- a/examples/pyplot/graph_network.py +++ b/examples/pyplot/graph_network.py @@ -21,8 +21,9 @@ g.add_edge(1,16) ##################### build and draw -graph = g.build().unpack(0).linewidth(4) # get the vedo 3d graph lines -nodes = graph.vertices # get the 3d points of the nodes +g.build() +graph = g[0].linewidth(4) # get the vedo 3d graph lines +nodes = graph.vertices # get the 3d points of the nodes pts = Points(nodes, r=10).lighting('off') diff --git a/examples/pyplot/histo_1d_b.py b/examples/pyplot/histo_1d_b.py index ef50ceec..269dde52 100644 --- a/examples/pyplot/histo_1d_b.py +++ b/examples/pyplot/histo_1d_b.py @@ -23,7 +23,7 @@ ) # Extract the 11th bin and color it purple -fig.unpack(10).c('purple4') +fig[10].c('purple4') fig.add_label("special bin", marker='s', mc='purple4') # Add a second histogram to be superimposed diff --git a/examples/pyplot/plot_fxy2.py b/examples/pyplot/plot_fxy2.py index c4412a55..ab461381 100644 --- a/examples/pyplot/plot_fxy2.py +++ b/examples/pyplot/plot_fxy2.py @@ -61,8 +61,8 @@ def f(x, y): axes=axes_opts, ) -# Unpack the surface from the plot to customize it -msh = p1.unpack(0).triangulate().lighting('glossy') +# Unpack the 0-element (the surface of the plot) to customize it +msh = p1[0].lighting('glossy') pts = msh.vertices # get the points zvals = pts[:,2] # get the z values diff --git a/examples/simulations/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py index b1d11f69..bf267397 100644 --- a/examples/simulations/fourier_epicycles.py +++ b/examples/simulations/fourier_epicycles.py @@ -47,7 +47,7 @@ def epicycles(time, rotation, fourier, order): # Load some 2D shape and make it symmetric -shape = vedo.load(vedo.dataurl+'timecourse1d.npy')[55] +shape = vedo.Assembly(vedo.dataurl+'timecourse1d.npy')[55] shaper = vedo.Line(shape).mirror('x') shape = vedo.merge(shape, shaper) x, y, _ = shape.vertices.T diff --git a/vedo/assembly.py b/vedo/assembly.py index 5e30b3cd..8043190c 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -206,6 +206,12 @@ def __init__(self, *meshs): """ super().__init__() + # Init by filename + if len(meshs) == 1 and isinstance(meshs[0], str): + filename = vedo.file_io.download(meshs[0], verbose=False) + data = np.load(filename, allow_pickle=True) + meshs = [vedo.file_io._from_numpy(dd) for dd in data] + if len(meshs) == 1: meshs = meshs[0] else: @@ -382,6 +388,20 @@ def __contains__(self, obj): """Allows to use `in` to check if an object is in the `Assembly`.""" return obj in self.objects + def __getitem__(self, i): + """Return i-th object.""" + if isinstance(i, int): + return self.objects[i] + elif isinstance(i, str): + for m in self.objects: + if i in m.name: + return m + return None + + def __len__(self): + """Return nr. of objects in the assembly.""" + return len(self.objects) + # TODO #### # def propagate_transform(self): # """Propagate the transformation to all parts.""" @@ -396,17 +416,6 @@ def __contains__(self, obj): # obj.SetScale(1, 1, 1) # raise NotImplementedError() - def copy(self): - """Return a copy of the object. Alias of `clone()`.""" - return self.clone() - - def clone(self): - """Make a clone copy of the object.""" - newlist = [] - for a in self.objects: - newlist.append(a.clone()) - return Assembly(newlist) - def unpack(self, i=None): """Unpack the list of objects from a `Assembly`. @@ -457,3 +466,25 @@ def pickable(self, value=True): for elem in self.recursive_unpack(): elem.pickable(value) return self + + def clone(self): + """Make a clone copy of the object. Same as `copy()`.""" + newlist = [] + for a in self.objects: + newlist.append(a.clone()) + return Assembly(newlist) + + def copy(self): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone() + + def write(self, filename="assembly.npy"): + """ + Write the object to file in `numpy` format. + """ + objs = [] + for ob in self.unpack(): + d = vedo.file_io._to_numpy(ob) + objs.append(d) + np.save(filename, objs) + return self diff --git a/vedo/file_io.py b/vedo/file_io.py index 6b67d076..cf0c68da 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -26,6 +26,7 @@ __all__ = [ "load", + "read", "download", "gunzip", "loadStructuredPoints", @@ -33,6 +34,7 @@ "loadRectilinearGrid", # "load_transform", # LinearTransform("file.mat") substitutes this "write", + "save", "export_window", "import_window", "screenshot", @@ -788,6 +790,92 @@ def loadPCD(filename): return Points(poly).point_size(4) ######################################################################### +def _from_numpy(d): + + keys = d.keys() + + vertices = d["points"] + if len(vertices) == 0: + return None + cells = d["cells"] if "cells" in keys else None + lines = d["lines"] if "lines" in keys else None + + msh = Mesh([vertices, cells, lines]) + + prp = msh.properties + if 'ambient' in keys: prp.SetAmbient(d['ambient']) + if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) + if 'specular' in keys: prp.SetSpecular(d['specular']) + if 'specularpower' in keys: prp.SetSpecularPower(d['specularpower']) + if 'specularcolor' in keys: prp.SetSpecularColor(d['specularcolor']) + if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) + if 'shading' in keys: prp.SetInterpolation(d['shading']) + if 'alpha' in keys: prp.SetOpacity(d['alpha']) + if 'representation' in keys: prp.SetRepresentation(d['representation']) + if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) + if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) + if 'linecolor' in keys and d['linecolor']: msh.linecolor(d['linecolor']) + if 'color' in keys and d['color'] is not None: + msh.color(d['color']) + if 'backcolor' in keys and d['backcolor'] is not None: + msh.backcolor(d['backcolor']) + + # print("XXXXX n", + # msh.dataset.GetNumberOfPoints(), + # msh.dataset.GetNumberOfCells(), + # msh.dataset.GetNumberOfLines(), + # msh.dataset.GetNumberOfPolys(), + # msh.dataset.GetNumberOfStrips(), + # msh.dataset.GetNumberOfVerts(), + # ) + + if "celldata" in keys and isinstance(d["celldata"], dict): + for arrname, arr in d["celldata"].items(): + msh.celldata[arrname] = arr + if "pointdata" in keys and isinstance(d["pointdata"], dict): + for arrname, arr in d["pointdata"].items(): + msh.pointdata[arrname] = arr + + # print(msh) + + msh.mapper.ScalarVisibilityOff() + if "LUT" in keys and "activedata" in keys and d["activedata"]: + lut_list = d["LUT"] + ncols = len(lut_list) + lut = vtk.vtkLookupTable() + lut.SetNumberOfTableValues(ncols) + lut.SetRange(d["LUT_range"]) + for i in range(ncols): + r, g, b, a = lut_list[i] + lut.SetTableValue(i, r, g, b, a) + lut.Build() + msh.mapper.SetLookupTable(lut) + msh.mapper.ScalarVisibilityOn() # activate scalars + msh.mapper.SetScalarRange(d["LUT_range"]) + if d["activedata"][0] == "celldata": + msh.dataset.GetCellData().SetActiveScalars(d["activedata"][1]) + # msh.celldata.select(d["activedata"][1]) + if d["activedata"][0] == "pointdata": + msh.dataset.GetPointData().SetActiveScalars(d["activedata"][1]) + # msh.pointdata.select(d["activedata"][1]) + + # print("shading", int(d["shading"]),d["scalarvisibility"], d["activedata"][1]) + if "shading" in keys and int(d["shading"]) > 0: + msh.compute_normals(cells=0) # otherwise cannot renderer phong + + if "scalarvisibility" in keys: + if d["scalarvisibility"]: + msh.mapper.ScalarVisibilityOn() + else: + msh.mapper.ScalarVisibilityOff() + + if "time" in keys: msh.time = d["time"] + if "name" in keys: msh.name = d["name"] + if "info" in keys: msh.info = d["info"] + if "filename" in keys: msh.filename = d["filename"] + return msh + +############################################################################# def _import_npy(fileinput): """Import a vedo scene from numpy format.""" # make sure the numpy file is not containing a scene @@ -853,149 +941,77 @@ def _import_npy(fileinput): plt.resetcam = False ########################## - def _load_common(obj, d): - keys = d.keys() - if "time" in keys: obj.time = d["time"] - if "name" in keys: obj.name = d["name"] - if "info" in keys: obj.info = d["info"] - if "filename" in keys: obj.filename = d["filename"] - - ########################### - def _buildmesh(d): - keys = d.keys() - - vertices = d["points"] - if len(vertices) == 0: - return None - cells = d["cells"] if "cells" in keys else None - lines = d["lines"] if "lines" in keys else None - - msh = Mesh([vertices, cells, lines]) - _load_common(msh, d) - - prp = msh.properties - if 'ambient' in keys: prp.SetAmbient(d['ambient']) - if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) - if 'specular' in keys: prp.SetSpecular(d['specular']) - if 'specularpower' in keys: prp.SetSpecularPower(d['specularpower']) - if 'specularcolor' in keys: prp.SetSpecularColor(d['specularcolor']) - if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) - if 'shading' in keys: prp.SetInterpolation(d['shading']) - if 'alpha' in keys: prp.SetOpacity(d['alpha']) - if 'representation' in keys: prp.SetRepresentation(d['representation']) - if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) - if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) - if 'linecolor' in keys and d['linecolor']: msh.linecolor(d['linecolor']) - if 'color' in keys and d['color'] is not None: - msh.color(d['color']) - if 'backcolor' in keys and d['backcolor'] is not None: - msh.backcolor(d['backcolor']) - - # print("XXXXX n", - # msh.dataset.GetNumberOfPoints(), - # msh.dataset.GetNumberOfCells(), - # msh.dataset.GetNumberOfLines(), - # msh.dataset.GetNumberOfPolys(), - # msh.dataset.GetNumberOfStrips(), - # msh.dataset.GetNumberOfVerts(), - # ) - - if "celldata" in keys and isinstance(d["celldata"], dict): - for arrname, arr in d["celldata"].items(): - msh.celldata[arrname] = arr - if "pointdata" in keys and isinstance(d["pointdata"], dict): - for arrname, arr in d["pointdata"].items(): - msh.pointdata[arrname] = arr - - # print(msh) - - - msh.mapper.ScalarVisibilityOff() - if "LUT" in keys and "activedata" in keys and d["activedata"]: - lut_list = d["LUT"] - ncols = len(lut_list) - lut = vtk.vtkLookupTable() - lut.SetNumberOfTableValues(ncols) - lut.SetRange(d["LUT_range"]) - for i in range(ncols): - r, g, b, a = lut_list[i] - lut.SetTableValue(i, r, g, b, a) - lut.Build() - msh.mapper.SetLookupTable(lut) - msh.mapper.ScalarVisibilityOn() # activate scalars - msh.mapper.SetScalarRange(d["LUT_range"]) - if d["activedata"][0] == "celldata": - msh.dataset.GetCellData().SetActiveScalars(d["activedata"][1]) - # msh.celldata.select(d["activedata"][1]) - if d["activedata"][0] == "pointdata": - msh.dataset.GetPointData().SetActiveScalars(d["activedata"][1]) - # msh.pointdata.select(d["activedata"][1]) - - # print("shading", int(d["shading"]),d["scalarvisibility"], d["activedata"][1]) - if "shading" in keys and int(d["shading"]) > 0: - msh.compute_normals(cells=0) # otherwise cannot renderer phong - - if "scalarvisibility" in keys: - if d["scalarvisibility"]: - msh.mapper.ScalarVisibilityOn() - else: - msh.mapper.ScalarVisibilityOff() - - return msh + # def _load_common(obj, d): + # keys = d.keys() + # if "time" in keys: obj.time = d["time"] + # if "name" in keys: obj.name = d["name"] + # if "info" in keys: obj.info = d["info"] + # if "filename" in keys: obj.filename = d["filename"] ############################################## objs = [] for d in data["objects"]: ### Mesh if d['type'].lower() == 'mesh': - a = _buildmesh(d) - if a: - objs.append(a) + obj = _from_numpy(d) + objs.append(obj) ### Assembly elif d['type'].lower() == 'assembly': assacts = [] for ad in d["actors"]: - assacts.append(_buildmesh(ad)) - asse = Assembly(assacts) - _load_common(asse, d) - objs.append(asse) + assacts.append(_from_numpy(ad)) + obj = Assembly(assacts) + # _load_common(asse, d) + objs.append(obj) ### Volume elif d['type'].lower() == 'volume': - vol = Volume(d["array"]) - _load_common(vol, d) - if "jittering" in d.keys(): vol.jittering(d["jittering"]) - vol.mode(d["mode"]) - vol.color(d["color"]) - vol.alpha(d["alpha"]) - vol.alpha_gradient(d["alphagrad"]) - objs.append(vol) + obj = Volume(d["array"]) + # _load_common(vol, d) + if "jittering" in d.keys(): obj.jittering(d["jittering"]) + obj.mode(d["mode"]) + obj.color(d["color"]) + obj.alpha(d["alpha"]) + obj.alpha_gradient(d["alphagrad"]) + objs.append(obj) + + ### TetMesh + elif d['type'].lower() == 'tetmesh': + raise NotImplementedError("TetMesh not supported yet") + # obj = vedo.TetMesh(d["array"]) + # objs.append(obj) ### Image elif d['type'].lower() == 'picture' or d['type'].lower() == 'image': - vimg = Image(d["array"]) - _load_common(vimg, d) - objs.append(vimg) + obj = Image(d["array"]) + # _load_common(vimg, d) + objs.append(obj) ### Text2D elif d['type'].lower() == 'text2d': - t = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]) - t.pos(d["position"]).size(d["size"]) - t.background(d["bgcol"], d["alpha"]) + obj = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]) + obj.pos(d["position"]).size(d["size"]) + obj.background(d["bgcol"], d["alpha"]) if d["frame"]: - t.frame(d["bgcol"]) - objs.append(t) + obj.frame(d["bgcol"]) + objs.append(obj) - ### Annotation ## backward compatibility - will disappear + ### Annotation ## backward compatibility - will disappear elif d['type'].lower() == 'annotation': pos = d["position"] if isinstance(pos, int): pos = "top-left" d["size"] *= 2.7 - t = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]).pos(pos) - t.background(d["bgcol"], d["alpha"]).size(d["size"]).frame(d["bgcol"]) - objs.append(t) ## backward compatibility - will disappear + obj = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]).pos(pos) + obj.background(d["bgcol"], d["alpha"]).size(d["size"]).frame(d["bgcol"]) + objs.append(obj) ## backward compatibility - will disappear + + keys = d.keys() + if "time" in keys: obj.time = d["time"] + if "name" in keys: obj.name = d["name"] + if "info" in keys: obj.info = d["info"] + if "filename" in keys: obj.filename = d["filename"] plt.add(objs) return plt @@ -1161,9 +1177,10 @@ def write(objct, fileoutput, binary=True): elif fr.endswith(".vtm"): g = vtk.new("MultiBlockDataGroupFilter") for ob in objct: - if isinstance(ob, (Points, Volume)): # picks transformation - ob = ob.polydata(True) + try: g.AddInputData(ob) + except TypeError: + vedo.logger.warning("Cannot save object of type", type(ob)) g.Update() mb = g.GetOutputDataObject(0) wri = vtk.vtkXMLMultiBlockDataWriter() @@ -1279,6 +1296,10 @@ def save(obj, fileoutput="out.png", binary=True): """Save an object to file. Same as `write()`.""" return write(obj, fileoutput, binary) +def read(inputobj, unpack=True, force=False): + """Read an object from file. Same as `load()`.""" + return load(inputobj, unpack, force) + ############################################################################### def export_window(fileoutput, binary=False, plt=None): """ @@ -1357,157 +1378,162 @@ def export_window(fileoutput, binary=False, plt=None): return plt ######################################################################### -def _export_npy(plt, fileoutput="scene.npz"): - - def _tonumpy(act): - """Dump a vedo object to numpy format.""" - - adict = {} - adict["type"] = "unknown" - - ######################################################## - def _fillcommon(obj, adict): - adict["filename"] = obj.filename - adict["name"] = obj.name - adict["time"] = obj.time - adict["rendered_at"] = obj.rendered_at - adict["position"] = obj.pos() - adict["info"] = obj.info - - try: - adict["transform"] = obj.transform.matrix - except AttributeError: - adict["transform"] = np.eye(4) +def _to_numpy(act): + """Encode a vedo object to numpy format.""" - ######################################################## - def _fillmesh(obj, adict): - poly = obj.dataset - adict["points"] = obj.vertices.astype(float) + adict = {} + adict["type"] = "unknown" - adict["cells"] = None - if poly.GetNumberOfPolys(): - adict["cells"] = obj.cells_as_flat_array + ######################################################## + def _fillcommon(obj, adict): + adict["filename"] = obj.filename + adict["name"] = obj.name + adict["time"] = obj.time + adict["rendered_at"] = obj.rendered_at + adict["position"] = obj.pos() + adict["info"] = obj.info - adict["lines"] = None - if poly.GetNumberOfLines(): - adict["lines"] = obj.lines#_as_flat_array - # print("adict[lines]", adict["lines"]) - - adict["pointdata"] = {} - for iname in obj.pointdata.keys(): - if "normals" in iname.lower(): - continue - adict["pointdata"][iname] = obj.pointdata[iname] - - adict["celldata"] = {} - for iname in obj.celldata.keys(): - if "normals" in iname.lower(): - continue - adict["celldata"][iname] = obj.celldata[iname] - - adict["activedata"] = None - if poly.GetPointData().GetScalars(): - adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] - elif poly.GetCellData().GetScalars(): - adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] - - adict["LUT"] = None - adict["LUT_range"] = None - lut = obj.mapper.GetLookupTable() - if lut: - nlut = lut.GetNumberOfTableValues() - lutvals = [] - for i in range(nlut): - v4 = lut.GetTableValue(i) # r, g, b, alpha - lutvals.append(v4) - adict["LUT"] = np.array(lutvals, dtype=np.float32) - adict["LUT_range"] = np.array(lut.GetRange()) - - prp = obj.properties - adict["alpha"] = prp.GetOpacity() - adict["representation"] = prp.GetRepresentation() - adict["pointsize"] = prp.GetPointSize() - - adict["linecolor"] = None - adict["linewidth"] = None - if prp.GetEdgeVisibility(): - adict["linewidth"] = obj.linewidth() - adict["linecolor"] = prp.GetEdgeColor() - - adict["ambient"] = prp.GetAmbient() - adict["diffuse"] = prp.GetDiffuse() - adict["specular"] = prp.GetSpecular() - adict["specularpower"] = prp.GetSpecularPower() - adict["specularcolor"] = prp.GetSpecularColor() - adict["shading"] = prp.GetInterpolation() # flat phong..: - adict["color"] = prp.GetColor() - adict["lighting_is_on"] = prp.GetLighting() - adict["backcolor"] = None - if obj.actor.GetBackfaceProperty(): - adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() - - adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() - - ##################################################################### + try: + adict["transform"] = obj.transform.matrix + except AttributeError: + adict["transform"] = np.eye(4) + + ######################################################## + def _fillmesh(obj, adict): + poly = obj.dataset + adict["points"] = obj.vertices.astype(float) + + adict["cells"] = None + if poly.GetNumberOfPolys(): + adict["cells"] = obj.cells_as_flat_array + + adict["lines"] = None + if poly.GetNumberOfLines(): + adict["lines"] = obj.lines#_as_flat_array + # print("adict[lines]", adict["lines"]) + + adict["pointdata"] = {} + for iname in obj.pointdata.keys(): + if "normals" in iname.lower(): + continue + adict["pointdata"][iname] = obj.pointdata[iname] + + adict["celldata"] = {} + for iname in obj.celldata.keys(): + if "normals" in iname.lower(): + continue + adict["celldata"][iname] = obj.celldata[iname] + + adict["activedata"] = None + if poly.GetPointData().GetScalars(): + adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] + elif poly.GetCellData().GetScalars(): + adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] + + adict["LUT"] = None + adict["LUT_range"] = None + lut = obj.mapper.GetLookupTable() + if lut: + nlut = lut.GetNumberOfTableValues() + lutvals = [] + for i in range(nlut): + v4 = lut.GetTableValue(i) # r, g, b, alpha + lutvals.append(v4) + adict["LUT"] = np.array(lutvals, dtype=np.float32) + adict["LUT_range"] = np.array(lut.GetRange()) + + prp = obj.properties + adict["alpha"] = prp.GetOpacity() + adict["representation"] = prp.GetRepresentation() + adict["pointsize"] = prp.GetPointSize() + + adict["linecolor"] = None + adict["linewidth"] = None + if prp.GetEdgeVisibility(): + adict["linewidth"] = obj.linewidth() + adict["linecolor"] = prp.GetEdgeColor() + + adict["ambient"] = prp.GetAmbient() + adict["diffuse"] = prp.GetDiffuse() + adict["specular"] = prp.GetSpecular() + adict["specularpower"] = prp.GetSpecularPower() + adict["specularcolor"] = prp.GetSpecularColor() + adict["shading"] = prp.GetInterpolation() # flat phong..: + adict["color"] = prp.GetColor() + adict["lighting_is_on"] = prp.GetLighting() + adict["backcolor"] = None + if obj.actor.GetBackfaceProperty(): + adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() + + adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() + + ##################################################################### + try: obj = act.retrieve_object() + except AttributeError: + obj = act - ######################################################## Assembly - if isinstance(obj, Assembly): - pass + ######################################################## Assembly + if isinstance(obj, Assembly): + pass - ######################################################## Points/Mesh - elif isinstance(obj, Points): - adict["type"] = "Mesh" - _fillcommon(obj, adict) - _fillmesh(obj, adict) + ######################################################## Points/Mesh + elif isinstance(obj, Points): + adict["type"] = "Mesh" + _fillcommon(obj, adict) + _fillmesh(obj, adict) + + ######################################################## Volume + elif isinstance(obj, Volume): + adict["type"] = "Volume" + _fillcommon(obj, adict) + imgdata = obj.dataset + arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) + adict["array"] = arr.reshape(imgdata.GetDimensions()) + adict["mode"] = obj.mode() + + prp = obj.properties + ctf = prp.GetRGBTransferFunction() + otf = prp.GetScalarOpacity() + gotf = prp.GetGradientOpacity() + smin, smax = ctf.GetRange() + xs = np.linspace(smin, smax, num=100, endpoint=True) + cols, als, algrs = [], [], [] + for x in xs: + cols.append(ctf.GetColor(x)) + als.append(otf.GetValue(x)) + if gotf: + algrs.append(gotf.GetValue(x)) + adict["color"] = cols + adict["alpha"] = als + adict["alphagrad"] = algrs + + ######################################################## Image + elif isinstance(obj, Image): + adict["type"] = "Image" + _fillcommon(obj, adict) + adict["array"] = obj.tonumpy() + + ######################################################## Text2D + elif isinstance(obj, vedo.Text2D): + adict["type"] = "Text2D" + adict["rendered_at"] = obj.rendered_at + adict["text"] = obj.text() + adict["position"] = obj.GetPosition() + adict["color"] = obj.properties.GetColor() + adict["font"] = obj.fontname + adict["size"] = obj.properties.GetFontSize() / 22.5 + adict["bgcol"] = obj.properties.GetBackgroundColor() + adict["alpha"] = obj.properties.GetBackgroundOpacity() + adict["frame"] = obj.properties.GetFrame() - ######################################################## Volume - elif isinstance(obj, Volume): - adict["type"] = "Volume" - _fillcommon(obj, adict) - imgdata = obj.dataset - arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) - adict["array"] = arr.reshape(imgdata.GetDimensions()) - adict["mode"] = obj.mode() - - prp = obj.properties - ctf = prp.GetRGBTransferFunction() - otf = prp.GetScalarOpacity() - gotf = prp.GetGradientOpacity() - smin, smax = ctf.GetRange() - xs = np.linspace(smin, smax, num=100, endpoint=True) - cols, als, algrs = [], [], [] - for x in xs: - cols.append(ctf.GetColor(x)) - als.append(otf.GetValue(x)) - if gotf: - algrs.append(gotf.GetValue(x)) - adict["color"] = cols - adict["alpha"] = als - adict["alphagrad"] = algrs + else: + pass + return adict - ######################################################## Image - elif isinstance(obj, Image): - adict["type"] = "Image" - _fillcommon(obj, adict) - adict["array"] = obj.tonumpy() - ######################################################## Text2D - elif isinstance(obj, vedo.Text2D): - adict["type"] = "Text2D" - adict["rendered_at"] = obj.rendered_at - adict["text"] = obj.text() - adict["position"] = obj.GetPosition() - adict["color"] = obj.properties.GetColor() - adict["font"] = obj.fontname - adict["size"] = obj.properties.GetFontSize() / 22.5 - adict["bgcol"] = obj.properties.GetBackgroundColor() - adict["alpha"] = obj.properties.GetBackgroundOpacity() - adict["frame"] = obj.properties.GetFrame() - - else: - pass - return adict +######################################################################### +def _export_npy(plt, fileoutput="scene.npz"): sdict = {} sdict["shape"] = plt.shape @@ -1547,11 +1573,11 @@ def _fillmesh(obj, adict): for a in allobjs: try: if a.actor.GetVisibility(): - sdict["objects"].append(_tonumpy(a)) + sdict["objects"].append(_to_numpy(a)) except AttributeError: try: if a.GetVisibility(): - sdict["objects"].append(_tonumpy(a)) + sdict["objects"].append(_to_numpy(a)) except AttributeError: pass @@ -1784,7 +1810,7 @@ def _export_hdf5(plt, fileoutput="scene.h5"): hfile.close() - +######################################################################## def import_window(fileinput, mtl_file=None, texture_path=None): """Import a whole scene from a Numpy, HDF5 or OBJ wavefront file. From 41a876fbecfd47ef04f7295b9890f0fc809580b5 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 15:22:16 +0100 Subject: [PATCH 224/251] snake_casing of interactor_modes.py --- vedo/interactor_modes.py | 416 ++++++++++++++++++--------------------- vedo/plotter.py | 35 +++- vedo/vtkclasses.py | 99 ++++------ 3 files changed, 267 insertions(+), 283 deletions(-) diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index b4c19df2..c60596b0 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -10,7 +10,7 @@ __doc__ = """Submodule to customize interaction modes.""" -class MousePan(vtk.get_class("InteractorStyleUser")): +class MousePan(vtk.vtkInteractorStyleUser): """ Interaction mode to pan the scene by dragging the mouse. @@ -44,6 +44,7 @@ def __init__(self): self.motionD = np.array([0, 0], dtype=float) self.motionW = np.array([0, 0, 0], dtype=float) + # print("MousePan: Left mouse button to pan the scene.") self.AddObserver("LeftButtonPressEvent", self._left_down) self.AddObserver("LeftButtonReleaseEvent", self._left_up) self.AddObserver("MiddleButtonPressEvent", self._middle_down) @@ -157,7 +158,7 @@ def __init__(self): ############################################### -class BlenderStyle(vtk.get_class("InteractorStyleUser")): +class BlenderStyle(vtk.vtkInteractorStyleUser): """ Create an interaction style using the Blender default key-bindings. @@ -325,52 +326,50 @@ def __init__(self): self._left_button_down = False self._middle_button_down = False - self.AddObserver("RightButtonPressEvent", self.RightButtonPress) - self.AddObserver("RightButtonReleaseEvent", self.RightButtonRelease) - self.AddObserver("MiddleButtonPressEvent", self.MiddleButtonPress) - self.AddObserver("MiddleButtonReleaseEvent", self.MiddleButtonRelease) - self.AddObserver("MouseWheelForwardEvent", self.MouseWheelForward) - self.AddObserver("MouseWheelBackwardEvent", self.MouseWheelBackward) - self.AddObserver("LeftButtonPressEvent", self.LeftButtonPress) - self.AddObserver("LeftButtonReleaseEvent", self.LeftButtonRelease) - self.AddObserver("MouseMoveEvent", self.MouseMove) - self.AddObserver("WindowResizeEvent", self.WindowResized) + self.AddObserver("RightButtonPressEvent", self.right_button_press) + self.AddObserver("RightButtonReleaseEvent", self.right_button_release) + self.AddObserver("MiddleButtonPressEvent", self.middle_button_press) + self.AddObserver("MiddleButtonReleaseEvent", self.middle_button_release) + self.AddObserver("MouseWheelForwardEvent", self.mouse_wheel_forward) + self.AddObserver("MouseWheelBackwardEvent", self.mouse_wheel_backward) + self.AddObserver("LeftButtonPressEvent", self.left_button_press) + self.AddObserver("LeftButtonReleaseEvent", self.left_button_release) + self.AddObserver("MouseMoveEvent", self.mouse_move) + self.AddObserver("WindowResizeEvent", self.window_resized) # ^does not seem to fire! - self.AddObserver("KeyPressEvent", self.KeyPress) - self.AddObserver("KeyReleaseEvent", self.KeyRelease) + self.AddObserver("KeyPressEvent", self.key_press) + self.AddObserver("KeyReleaseEvent", self.key_release) - def RightButtonPress(self, obj, event): + def right_button_press(self, obj, event): pass - def RightButtonRelease(self, obj, event): + def right_button_release(self, obj, event): pass - def MiddleButtonPress(self, obj, event): + def middle_button_press(self, obj, event): self._middle_button_down = True - def MiddleButtonRelease(self, obj, event): + def middle_button_release(self, obj, event): self._middle_button_down = False # perform middle button focus event if ALT is down if self.GetInteractor().GetAltKey(): # print("Middle button released while ALT is down") - # try to pick an object at the current mouse position rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() - props = self.PerformPickingOnSelection() + props = self.perform_picking_on_selection() if props: - self.FocusOn(props[0]) - - def MouseWheelBackward(self, obj, event): - self.MoveMouseWheel(-1) + self.focus_on(props[0]) - def MouseWheelForward(self, obj, event): - self.MoveMouseWheel(1) + def mouse_wheel_backward(self, obj, event): + self.move_mouse_wheel(-1) - def MouseMove(self, obj, event): + def mouse_wheel_forward(self, obj, event): + self.move_mouse_wheel(1) + def mouse_move(self, obj, event): interactor = self.GetInteractor() # Find the renderer that is active below the current mouse position @@ -387,23 +386,23 @@ def MouseMove(self, obj, event): # start with the special modes if self._is_box_zooming: - self.DrawDraggedSelection() + self.draw_dragged_selection() elif MiddleButton and not Shift and not Ctrl and not Alt: - self.Rotate() + self.rotate() elif MiddleButton and Shift and not Ctrl and not Alt: - self.Pan() + self.pan() elif MiddleButton and Ctrl and not Shift and not Alt: - self.Zoom() # Dolly + self.zoom() # Dolly elif self.draginfo is not None: - self.ExecuteDrag() + self.execute_drag() elif self._left_button_down and Ctrl and Shift: - self.DrawMeasurement() + self.draw_measurement() elif self._left_button_down: - self.DrawDraggedSelection() + self.draw_dragged_selection() self.InvokeEvent("InteractionEvent", None) - def MoveMouseWheel(self, direction): + def move_mouse_wheel(self, direction): rwi = self.GetInteractor() # Find the renderer that is active below the current mouse position @@ -413,26 +412,24 @@ def MoveMouseWheel(self, direction): # [this->SetCurrentRenderer(this->Interactor->FindPokedRenderer(x, y));] # The movement - - CurrentRenderer = self.GetCurrentRenderer() + ren = self.GetCurrentRenderer() # // Calculate the focal depth since we'll be using it a lot - camera = CurrentRenderer.GetActiveCamera() + camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( - CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out + ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() - self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) - - # // Has to recalc old mouse point since the viewport has moved, - # // so can't move it outside the loop + self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) + # Has to recalc old mouse point since the viewport has moved, + # so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] # xp, yp = rwi.GetLastEventPosition() @@ -441,10 +438,8 @@ def MoveMouseWheel(self, direction): xp = size[0] / 2 yp = size[1] / 2 - self.ComputeDisplayToWorld(CurrentRenderer, xp, yp, focalDepth, oldPickPoint) - # - # // Camera motion is reversed - # + self.ComputeDisplayToWorld(ren, xp, yp, focalDepth, oldPickPoint) + # Camera motion is reversed move_factor = -1 * self.zoom_motion_factor * direction motionVector = ( @@ -467,20 +462,17 @@ def MoveMouseWheel(self, direction): motionVector[2] + viewPoint[2], ) - # the Zooming + # the zooming factor = self.mouse_motion_factor * self.mouse_wheel_motion_factor - self.ZoomByStep(direction * factor) + self.zoom_by_step(direction * factor) - def ZoomByStep(self, step): - CurrentRenderer = self.GetCurrentRenderer() - - if CurrentRenderer: + def zoom_by_step(self, step): + if self.GetCurrentRenderer(): self.StartDolly() - self.Dolly(pow(1.1, step)) + self.dolly(pow(1.1, step)) self.EndDolly() - def LeftButtonPress(self, obj, event): - + def left_button_press(self, obj, event): if self._is_box_zooming: return if self.draginfo: @@ -494,24 +486,24 @@ def LeftButtonPress(self, obj, event): if Shift and Ctrl: if not self.GetCurrentRenderer().GetActiveCamera().GetParallelProjection(): - self.ToggleParallelProjection() + self.toggle_parallel_projection() rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y - self.InitializeScreenDrawing() + self.initialize_screen_drawing() - def LeftButtonRelease(self, obj, event): + def left_button_release(self, obj, event): # print("LeftButtonRelease") if self._is_box_zooming: self._is_box_zooming = False - self.ZoomBox(self.start_x, self.start_y, self.end_x, self.end_y) + self.zoom_box(self.start_x, self.start_y, self.end_x, self.end_y) return if self.draginfo: - self.FinishDrag() + self.finish_drag() return self._left_button_down = False @@ -527,8 +519,7 @@ def LeftButtonRelease(self, obj, event): else: if self.callback_select: - props = self.PerformPickingOnSelection() - + props = self.perform_picking_on_selection() if props: # only call back if anything was selected self.picked_props = tuple(props) self.callback_select(props) @@ -536,7 +527,7 @@ def LeftButtonRelease(self, obj, event): # remove the selection rubber band / line self.GetInteractor().Render() - def KeyPress(self, obj, event): + def key_press(self, obj, event): key = obj.GetKeySym() KEY = key.upper() @@ -548,30 +539,30 @@ def KeyPress(self, obj, event): if KEY == "M": self.middle_mouse_lock = not self.middle_mouse_lock - self.UpdateMiddleMouseButtonLockActor() + self._update_middle_mouse_button_lock_actor() elif KEY == "G": if self.draginfo is not None: - self.FinishDrag() + self.finish_drag() else: if self.callback_start_drag: self.callback_start_drag() else: - self.StartDrag() + self.start_drag() # internally calls end-drag if drag is already active elif KEY == "ESCAPE": if self.callback_escape_key: self.callback_escape_key() if self.draginfo is not None: - self.CancelDrag() + self.cancel_drag() elif KEY == "DELETE": if self.callback_delete_key: self.callback_delete_key() elif KEY == "RETURN": if self.draginfo: - self.FinishDrag() + self.finish_drag() elif KEY == "SPACE": self.middle_mouse_lock = True - # self.UpdateMiddleMouseButtonLockActor() + # self._update_middle_mouse_button_lock_actor() # self.GrabFocus("MouseMoveEvent", self) # # TODO: grab and release focus; possible from python? elif KEY == "B": @@ -580,58 +571,54 @@ def KeyPress(self, obj, event): self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y - self.InitializeScreenDrawing() + self.initialize_screen_drawing() elif KEY in ('2', '3'): - self.ToggleParallelProjection() - + self.toggle_parallel_projection() elif KEY == "A": - self.ZoomFit() + self.zoom_fit() elif KEY == "X": - self.SetViewX() + self.set_view_x() elif KEY == "Y": - self.SetViewY() + self.set_view_y() elif KEY == "Z": - self.SetViewZ() + self.set_view_z() elif KEY == "LEFT": - self.RotateDiscreteStep(1) + self.rotate_discrete_step(1) elif KEY == "RIGHT": - self.RotateDiscreteStep(-1) + self.rotate_discrete_step(-1) elif KEY == "UP": - self.RotateTurtableBy(0, 10) + self.rotate_turtable_by(0, 10) elif KEY == "DOWN": - self.RotateTurtableBy(0, -10) + self.rotate_turtable_by(0, -10) elif KEY == "PLUS": - self.ZoomByStep(2) + self.zoom_by_step(2) elif KEY == "MINUS": - self.ZoomByStep(-2) + self.zoom_by_step(-2) elif KEY == "F": if self.callback_focus_key: self.callback_focus_key() self.InvokeEvent("InteractionEvent", None) - def KeyRelease(self, obj, event): - + def key_release(self, obj, event): key = obj.GetKeySym() KEY = key.upper() - # print(f"Key release: {key}") - if KEY == "SPACE": if self.middle_mouse_lock: self.middle_mouse_lock = False - self.UpdateMiddleMouseButtonLockActor() + self._update_middle_mouse_button_lock_actor() - def WindowResized(self): + def window_resized(self): # print("window resized") - self.InitializeScreenDrawing() - - def RotateDiscreteStep(self, movement_direction, step=22.5): - """Rotates CW or CCW to the nearest 45 deg angle - - includes some fuzzyness to determine about which axis""" + self.initialize_screen_drawing() - CurrentRenderer = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + def rotate_discrete_step(self, movement_direction, step=22.5): + """ + Rotates CW or CCW to the nearest 45 deg angle + - includes some fuzzyness to determine about which axis + """ + camera = self.GetCurrentRenderer().GetActiveCamera() step = np.deg2rad(step) @@ -648,16 +635,14 @@ def RotateDiscreteStep(self, movement_direction, step=22.5): angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(direction[:2]) - direction[0] = np.cos(angle) * dist direction[1] = np.sin(angle) * dist - self.SetCameraDirection(direction) + self.set_camera_direction(direction) else: # Top or bottom like view - rotate camera "up" direction up = np.array(camera.GetViewUp()) - angle = np.arctan2(up[1], up[0]) # find the nearest angle that is an integer number of steps @@ -667,49 +652,44 @@ def RotateDiscreteStep(self, movement_direction, step=22.5): angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(up[:2]) - up[0] = np.cos(angle) * dist up[1] = np.sin(angle) * dist camera.SetViewUp(up) camera.OrthogonalizeViewUp() - self.GetInteractor().Render() - def ToggleParallelProjection(self): + def toggle_parallel_projection(self): renderer = self.GetCurrentRenderer() camera = renderer.GetActiveCamera() camera.SetParallelProjection(not bool(camera.GetParallelProjection())) self.GetInteractor().Render() - def SetViewX(self): - self.SetCameraPlaneDirection((1, 0, 0)) + def set_view_x(self): + self.set_camera_plane_direction((1, 0, 0)) - def SetViewY(self): - self.SetCameraPlaneDirection((0, 1, 0)) + def set_view_y(self): + self.set_camera_plane_direction((0, 1, 0)) - def SetViewZ(self): - self.SetCameraPlaneDirection((0, 0, 1)) + def set_view_z(self): + self.set_camera_plane_direction((0, 0, 1)) - def ZoomFit(self): + def zoom_fit(self): self.GetCurrentRenderer().ResetCamera() self.GetInteractor().Render() - def SetCameraPlaneDirection(self, direction): - """Sets the camera to display a plane of which direction is the normal - - includes logic to reverse the direction if benificial""" - - CurrentRenderer = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + def set_camera_plane_direction(self, direction): + """ + Sets the camera to display a plane of which direction is the normal + - includes logic to reverse the direction if benificial + """ + camera = self.GetCurrentRenderer().GetActiveCamera() direction = np.array(direction) - normal = camera.GetViewPlaneNormal() # can not set the normal, need to change the position to do that current_alignment = np.dot(normal, -direction) - # print(f"Current alignment = {current_alignment}") - if abs(current_alignment) > 0.9999: # print("toggling") direction = -np.array(normal) @@ -717,14 +697,14 @@ def SetCameraPlaneDirection(self, direction): # print("reversing to find nearest") direction = -direction - self.SetCameraDirection(-direction) + self.set_camera_direction(-direction) - def SetCameraDirection(self, direction): + def set_camera_direction(self, direction): """Sets the camera to this direction, sets view up if horizontal enough""" direction = np.array(direction) - CurrentRenderer = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + ren = self.GetCurrentRenderer() + camera = ren.GetActiveCamera() rwi = self.GetInteractor() pos = np.array(camera.GetPosition()) @@ -744,24 +724,25 @@ def SetCameraDirection(self, direction): camera.OrthogonalizeViewUp() if self.GetAutoAdjustCameraClippingRange(): - CurrentRenderer.ResetCameraClippingRange() + ren.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): - CurrentRenderer.UpdateLightsGeometryToFollowCamera() + ren.UpdateLightsGeometryToFollowCamera() if self.callback_camera_direction_changed: self.callback_camera_direction_changed() self.GetInteractor().Render() - def PerformPickingOnSelection(self): - """Preforms prop3d picking on the current dragged selection + def perform_picking_on_selection(self): + """ + Performs 3d picking on the current dragged selection If the distance between the start and endpoints is less than the threshold - then a SINGLE prop3d is picked along the line + then a SINGLE 3d prop is picked along the line. - the selection area is drawn by the rubber band and is defined by - self.start_x, self.start_y, self.end_x, self.end_y + The selection area is drawn by the rubber band and is defined by + `self.start_x, self.start_y, self.end_x, self.end_y` """ renderer = self.GetCurrentRenderer() if not renderer: @@ -790,103 +771,93 @@ def PerformPickingOnSelection(self): props.remove(nearest_prop) props.insert(0, nearest_prop) - return props else: return [] # ----------- actor dragging ------------ - - def StartDrag(self): + def start_drag(self): if self.callback_start_drag: # print("Calling callback_start_drag") self.callback_start_drag() return else: # grab the current selection if self.picked_props: - self.StartDragOnProps(self.picked_props) + self.start_drag_on_props(self.picked_props) else: pass - # print('Can not start drag, nothing selected and callback_start_drag not assigned') + # print('Can not start drag, + # nothing selected and callback_start_drag not assigned') - def FinishDrag(self): + def finish_drag(self): # print('Finished drag') if self.callback_end_drag: - # reset actor positions as actors positions will be controlled by called functions + # reset actor positions as actors positions will be controlled + # by called functions for pos0, actor in zip( - self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging + self.draginfo.dragged_actors_original_positions, + self.draginfo.actors_dragging ): actor.SetPosition(pos0) self.callback_end_drag(self.draginfo) self.draginfo = None - def StartDragOnProps(self, props): - """Starts drag on the provided props (actors) by filling self.draginfo""" + def start_drag_on_props(self, props): + """ + Starts drag on the provided props (actors) by filling self.draginfo""" if self.draginfo is not None: - self.FinishDrag() + self.finish_drag() return - # print('Starting drag') - # create and fill drag-info draginfo = _BlenderStyleDragInfo() - - # - # draginfo.dragged_node = node - # - # # find all actors and outlines corresponding to this node - # actors = [*self.actor_from_node(node).actors.values()] - # outlines = [ol.outline_actor for ol in self.node_outlines if ol.parent_vp_actor in actors] - draginfo.actors_dragging = props # [*actors, *outlines] for a in draginfo.actors_dragging: draginfo.dragged_actors_original_positions.append(a.GetPosition()) # numpy ndarray # Get the start position of the drag in 3d - rwi = self.GetInteractor() - CurrentRenderer = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + ren = self.GetCurrentRenderer() + camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( - CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out + ren, viewFocus[0], viewFocus[1], viewFocus[2], + temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() - self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) + self.ComputeDisplayToWorld( + ren, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) - draginfo.start_position_3d = mouse_pos_3d - self.draginfo = draginfo - def ExecuteDrag(self): + def execute_drag(self): rwi = self.GetInteractor() - CurrentRenderer = self.GetCurrentRenderer() + ren = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() # Get the picked point in 3d - temp_out = [0, 0, 0] self.ComputeWorldToDisplay( - CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out + ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() - self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) + self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) @@ -894,7 +865,7 @@ def ExecuteDrag(self): delta = np.array(mouse_pos_3d) - self.draginfo.start_position_3d # print(f'Delta = {delta}') - view_normal = np.array(self.GetCurrentRenderer().GetActiveCamera().GetViewPlaneNormal()) + view_normal = np.array(ren.GetActiveCamera().GetViewPlaneNormal()) delta_inplane = delta - view_normal * np.dot(delta, view_normal) # print(f'delta_inplane = {delta_inplane}') @@ -916,7 +887,7 @@ def ExecuteDrag(self): self.GetInteractor().Render() - def CancelDrag(self): + def cancel_drag(self): """Cancels the drag and restored the original positions of all dragged actors""" for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, @@ -928,42 +899,41 @@ def CancelDrag(self): # ----------- end dragging -------------- - def Zoom(self): + def zoom(self): rwi = self.GetInteractor() x, y = rwi.GetEventPosition() xp, yp = rwi.GetLastEventPosition() direction = y - yp - self.MoveMouseWheel(direction / 10) - - def Pan(self): + self.move_mouse_wheel(direction / 10) - CurrentRenderer = self.GetCurrentRenderer() + def pan(self): - if CurrentRenderer: + ren = self.GetCurrentRenderer() + if ren: rwi = self.GetInteractor() # // Calculate the focal depth since we'll be using it a lot - camera = CurrentRenderer.GetActiveCamera() + camera = ren.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( - CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out + ren, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() - self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) + self.ComputeDisplayToWorld(ren, x, y, focalDepth, newPickPoint) # // Has to recalc old mouse point since the viewport has moved, # // so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] xp, yp = rwi.GetLastEventPosition() - self.ComputeDisplayToWorld(CurrentRenderer, xp, yp, focalDepth, oldPickPoint) + self.ComputeDisplayToWorld(ren, xp, yp, focalDepth, oldPickPoint) # # // Camera motion is reversed # @@ -988,38 +958,38 @@ def Pan(self): ) if rwi.GetLightFollowCamera(): - CurrentRenderer.UpdateLightsGeometryToFollowCamera() + ren.UpdateLightsGeometryToFollowCamera() self.GetInteractor().Render() - def Rotate(self): + def rotate(self): - CurrentRenderer = self.GetCurrentRenderer() + ren = self.GetCurrentRenderer() - if CurrentRenderer: + if ren: rwi = self.GetInteractor() dx = rwi.GetEventPosition()[0] - rwi.GetLastEventPosition()[0] dy = rwi.GetEventPosition()[1] - rwi.GetLastEventPosition()[1] - size = CurrentRenderer.GetRenderWindow().GetSize() + size = ren.GetRenderWindow().GetSize() delta_elevation = -20.0 / size[1] delta_azimuth = -20.0 / size[0] rxf = dx * delta_azimuth * self.mouse_motion_factor ryf = dy * delta_elevation * self.mouse_motion_factor - self.RotateTurtableBy(rxf, ryf) + self.rotate_turtable_by(rxf, ryf) - def RotateTurtableBy(self, rxf, ryf): + def rotate_turtable_by(self, rxf, ryf): - CurrentRenderer = self.GetCurrentRenderer() + ren = self.GetCurrentRenderer() rwi = self.GetInteractor() # rfx is rotation about the global Z vector (turn-table mode) # rfy is rotation about the side vector - camera = CurrentRenderer.GetActiveCamera() + camera = ren.GetActiveCamera() campos = np.array(camera.GetPosition()) focal = np.array(camera.GetFocalPoint()) up = camera.GetViewUp() @@ -1076,17 +1046,17 @@ def RotateTurtableBy(self, rxf, ryf): # Update if self.GetAutoAdjustCameraClippingRange(): - CurrentRenderer.ResetCameraClippingRange() + ren.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): - CurrentRenderer.UpdateLightsGeometryToFollowCamera() + ren.UpdateLightsGeometryToFollowCamera() if self.callback_camera_direction_changed: self.callback_camera_direction_changed() self.GetInteractor().Render() - def ZoomBox(self, x1, y1, x2, y2): + def zoom_box(self, x1, y1, x2, y2): """Zooms to a box""" # int width, height; # width = abs(this->EndPosition[0] - this->StartPosition[0]); @@ -1104,30 +1074,30 @@ def ZoomBox(self, x1, y1, x2, y2): width = x2 - x1 height = y2 - y1 - # int *size = this->CurrentRenderer->GetSize(); - CurrentRenderer = self.GetCurrentRenderer() - size = CurrentRenderer.GetSize() - origin = CurrentRenderer.GetOrigin() - camera = CurrentRenderer.GetActiveCamera() + # int *size = this->ren->GetSize(); + ren = self.GetCurrentRenderer() + size = ren.GetSize() + origin = ren.GetOrigin() + camera = ren.GetActiveCamera() # Assuming we're drawing the band on the view-plane rbcenter = (x1 + width / 2, y1 + height / 2, 0) - CurrentRenderer.SetDisplayPoint(rbcenter) - CurrentRenderer.DisplayToView() - CurrentRenderer.ViewToWorld() + ren.SetDisplayPoint(rbcenter) + ren.DisplayToView() + ren.ViewToWorld() - worldRBCenter = CurrentRenderer.GetWorldPoint() + worldRBCenter = ren.GetWorldPoint() invw = 1.0 / worldRBCenter[3] worldRBCenter = [c * invw for c in worldRBCenter] winCenter = [origin[0] + 0.5 * size[0], origin[1] + 0.5 * size[1], 0] - CurrentRenderer.SetDisplayPoint(winCenter) - CurrentRenderer.DisplayToView() - CurrentRenderer.ViewToWorld() + ren.SetDisplayPoint(winCenter) + ren.DisplayToView() + ren.ViewToWorld() - worldWinCenter = CurrentRenderer.GetWorldPoint() + worldWinCenter = ren.GetWorldPoint() invw = 1.0 / worldWinCenter[3] worldWinCenter = [c * invw for c in worldWinCenter] @@ -1156,15 +1126,15 @@ def ZoomBox(self, x1, y1, x2, y2): self.GetInteractor().Render() - def FocusOn(self, prop3D): + def focus_on(self, prop3D): """Move the camera to focus on this particular prop3D""" position = prop3D.GetPosition() # print(f"Focus on {position}") - CurrentRenderer = self.GetCurrentRenderer() - camera = CurrentRenderer.GetActiveCamera() + ren = self.GetCurrentRenderer() + camera = ren.GetActiveCamera() fp = camera.GetFocalPoint() pos = camera.GetPosition() @@ -1177,44 +1147,44 @@ def FocusOn(self, prop3D): ) if self.GetAutoAdjustCameraClippingRange(): - CurrentRenderer.ResetCameraClippingRange() + ren.ResetCameraClippingRange() rwi = self.GetInteractor() if rwi.GetLightFollowCamera(): - CurrentRenderer.UpdateLightsGeometryToFollowCamera() + ren.UpdateLightsGeometryToFollowCamera() self.GetInteractor().Render() - def Dolly(self, factor): - CurrentRenderer = self.GetCurrentRenderer() + def dolly(self, factor): + ren = self.GetCurrentRenderer() - if CurrentRenderer: - camera = CurrentRenderer.GetActiveCamera() + if ren: + camera = ren.GetActiveCamera() if camera.GetParallelProjection(): camera.SetParallelScale(camera.GetParallelScale() / factor) else: camera.Dolly(factor) if self.GetAutoAdjustCameraClippingRange(): - CurrentRenderer.ResetCameraClippingRange() + ren.ResetCameraClippingRange() # if not do_not_update: # rwi = self.GetInteractor() # if rwi.GetLightFollowCamera(): - # CurrentRenderer.UpdateLightsGeometryToFollowCamera() + # ren.UpdateLightsGeometryToFollowCamera() # # rwi.Render() - def DrawMeasurement(self): + def draw_measurement(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() - self.DrawLine(self.start_x, self.end_x, self.start_y, self.end_y) + self.draw_line(self.start_x, self.end_x, self.start_y, self.end_y) - def DrawDraggedSelection(self): + def draw_dragged_selection(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() - self.DrawRubberBand(self.start_x, self.end_x, self.start_y, self.end_y) + self.draw_rubber_band(self.start_x, self.end_x, self.start_y, self.end_y) - def InitializeScreenDrawing(self): + def initialize_screen_drawing(self): # make an image of the currently rendered image rwi = self.GetInteractor() @@ -1229,7 +1199,7 @@ def InitializeScreenDrawing(self): front = 1 # what does this do? rwin.GetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, front, self._pixel_array) - def DrawRubberBand(self, x1, x2, y1, y2): + def draw_rubber_band(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() @@ -1243,8 +1213,8 @@ def DrawRubberBand(self, x1, x2, y1, y2): # print( # "Starting new screen-image - viewport has resized without us knowing" # ) - self.InitializeScreenDrawing() - self.DrawRubberBand(x1, x2, y1, y2) + self.initialize_screen_drawing() + self.draw_rubber_band(x1, x2, y1, y2) return x2 = min(x2, size[0] - 1) @@ -1286,7 +1256,7 @@ def DrawRubberBand(self, x1, x2, y1, y2): rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, tempPA, 0) rwin.Frame() - def LineToPixels(self, x1, x2, y1, y2): + def line2pixels(self, x1, x2, y1, y2): """Returns the x and y values of the pixels on a line between x1,y1 and x2,y2. If start and end are identical then a single point is returned""" @@ -1309,7 +1279,7 @@ def LineToPixels(self, x1, x2, y1, y2): return x, y - def DrawLine(self, x1, x2, y1, y2): + def draw_line(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() @@ -1323,7 +1293,7 @@ def DrawLine(self, x1, x2, y1, y2): tempPA = vtk.vtkUnsignedCharArray() tempPA.DeepCopy(self._pixel_array) - xs, ys = self.LineToPixels(x1, x2, y1, y2) + xs, ys = self.line2pixels(x1, x2, y1, y2) for x, y in zip(xs, ys): idx = (y * size[0]) + x tempPA.SetTuple(idx, (0, 0, 0, 1)) @@ -1375,7 +1345,7 @@ def DrawLine(self, x1, x2, y1, y2): rwin.Frame() - def UpdateMiddleMouseButtonLockActor(self): + def _update_middle_mouse_button_lock_actor(self): if self.middle_mouse_lock_actor is None: # create the actor diff --git a/vedo/plotter.py b/vedo/plotter.py index be8889c1..7aa2ca3e 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2652,6 +2652,39 @@ def remove_callback(self, cid): self.interactor.RemoveObserver(cid) return self + def remove_all_observers(self): + """ + Remove all observers. + + Example: + ```python + from vedo import * + + def kfunc(event): + print("Key pressed:", event.keypress) + if event.keypress == 'q': + plt.close() + + def rfunc(event): + if event.isImage: + printc("Right-clicked!\n", event) + plt.render() + + img = Image(dataurl+"images/embryo.jpg") + + plt = Plotter(size=(1050, 600)) + plt.parallel_projection(True) + plt.remove_all_observers() + plt.add_callback("key press", kfunc) + plt.add_callback("mouse right click", rfunc) + plt.show("Right-Click Me!\nPrees q to exit.", img) + plt.close() + ``` + """ + if self.interactor: + self.interactor.RemoveAllObservers() + return self + def timer_callback(self, action, timer_id=None, dt=1, one_shot=False): """ Start or stop an existing timer. @@ -3473,7 +3506,7 @@ def user_mode(self, mode): else: vedo.logger.warning(f"Unknown interaction mode: {mode}") - elif isinstance(mode, vtk.get_class("InteractorStyleUser")): + elif isinstance(mode, vtk.vtkInteractorStyleUser): # set a custom interactor style mode.interactor = self.interactor mode.renderer = self.renderer diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index f51bce91..e27f46c2 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -7,7 +7,6 @@ from vedo import settings ###################################################################### - location = {} module_cache = {} @@ -106,17 +105,19 @@ def dump_hierarchy_to_file(fname=""): # noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences + from vtkmodules.vtkInteractionStyle import vtkInteractorStyleUser + # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType # noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingVolumeOpenGL2 import ( vtkOpenGLGPUVolumeRayCastMapper, vtkSmartVolumeMapper, ) + for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", -]: - location[name] = "vtkRenderingVolumeOpenGL2" +]: location[name] = "vtkRenderingVolumeOpenGL2" ###################################################################### @@ -146,13 +147,12 @@ def dump_hierarchy_to_file(fname=""): "vtkParametricKuen", "vtkParametricPluckerConoid", "vtkParametricPseudosphere", -]: - location[name] = "vtkCommonComputationalGeometry" +]: location[name] = "vtkCommonComputationalGeometry" location["vtkNamedColors"] = "vtkCommonColor" - +# noinspection PyUnresolvedReferences from vtkmodules.vtkCommonCore import ( mutable, VTK_UNSIGNED_SHORT, @@ -224,9 +224,9 @@ def dump_hierarchy_to_file(fname=""): "vtkVariant", "vtkVariantArray", "vtkVersion", -]: - location[name] = "vtkCommonCore" +]: location[name] = "vtkCommonCore" +# noinspection PyUnresolvedReferences from vtkmodules.vtkCommonDataModel import ( vtkPolyData, vtkImageData, @@ -235,6 +235,7 @@ def dump_hierarchy_to_file(fname=""): vtkStructuredGrid, ) +# noinspection PyUnresolvedReferences from vtkmodules.vtkCommonDataModel import ( VTK_HEXAHEDRON, VTK_TETRA, @@ -313,13 +314,14 @@ def dump_hierarchy_to_file(fname=""): "vtkUnstructuredGrid", "vtkVoxel", "vtkWedge", -]: - location[name] = "vtkCommonDataModel" +]: location[name] = "vtkCommonDataModel" +# noinspection PyUnresolvedReferences from vtkmodules.vtkCommonMath import vtkMatrix4x4 location["vtkMatrix4x4"] = "vtkCommonMath" location["vtkQuaternion"] = "vtkCommonMath" +# noinspection PyUnresolvedReferences from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, @@ -333,8 +335,7 @@ def dump_hierarchy_to_file(fname=""): "vtkLinearTransform", "vtkThinPlateSplineTransform", "vtkTransform", -]: - location[name] = "vtkCommonTransforms" +]: location[name] = "vtkCommonTransforms" for name in [ @@ -380,9 +381,9 @@ def dump_hierarchy_to_file(fname=""): "vtkWindowedSincPolyDataFilter", "vtkStaticCleanUnstructuredGrid", "vtkPolyDataPlaneCutter" -]: - location[name] = "vtkFiltersCore" +]: location[name] = "vtkFiltersCore" +# noinspection PyUnresolvedReferences from vtkmodules.vtkFiltersCore import vtkGlyph3D @@ -391,8 +392,7 @@ def dump_hierarchy_to_file(fname=""): "vtkExtractGeometry", "vtkExtractPolyDataGeometry", "vtkExtractSelection", -]: - location[name] = "vtkFiltersExtraction" +]: location[name] = "vtkFiltersExtraction" location["vtkExtractEdges"] = "vtkFiltersCore" @@ -423,8 +423,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShrinkPolyData", "vtkRectilinearGridToTetrahedra", "vtkVertexGlyphFilter", -]: - location[name] = "vtkFiltersGeneral" +]: location[name] = "vtkFiltersGeneral" try: from vtkmodules.vtkCommonDataModel import vtkCellTreeLocator @@ -445,8 +444,7 @@ def dump_hierarchy_to_file(fname=""): "vtkPolyDataSilhouette", "vtkProcrustesAlignmentFilter", "vtkRenderLargeImage", -]: - location[name] = "vtkFiltersHybrid" +]: location[name] = "vtkFiltersHybrid" for name in [ @@ -468,8 +466,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSelectEnclosedPoints", "vtkSelectPolyData", "vtkSubdivideTetra", -]: - location[name] = "vtkFiltersModeling" +]: location[name] = "vtkFiltersModeling" for name in [ @@ -487,8 +484,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShepardKernel", "vtkSignedDistance", "vtkVoronoiKernel", -]: - location[name] = "vtkFiltersPoints" +]: location[name] = "vtkFiltersPoints" for name in [ @@ -510,8 +506,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSphereSource", "vtkTexturedSphereSource", "vtkTessellatedBoxSource", -]: - location[name] = "vtkFiltersSources" +]: location[name] = "vtkFiltersSources" location["vtkTextureMapToPlane"] = "vtkFiltersTexture" @@ -532,8 +527,7 @@ def dump_hierarchy_to_file(fname=""): "vtkParticleReader", "vtkSTLReader", "vtkSTLWriter", -]: - location[name] = "vtkIOGeometry" +]: location[name] = "vtkIOGeometry" for name in [ "vtkBMPReader", @@ -553,8 +547,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSLCReader", "vtkTIFFReader", "vtkTIFFWriter", -]: - location[name] = "vtkIOImage" +]: location[name] = "vtkIOImage" location["vtk3DSImporter"] = "vtkIOImport" location["vtkOBJImporter"] = "vtkIOImport" @@ -569,8 +562,7 @@ def dump_hierarchy_to_file(fname=""): "vtkPolyDataWriter", "vtkRectilinearGridReader", "vtkUnstructuredGridReader", -]: - location[name] = "vtkIOLegacy" +]: location[name] = "vtkIOLegacy" location["vtkPLYReader"] = "vtkIOPLY" @@ -590,8 +582,7 @@ def dump_hierarchy_to_file(fname=""): "vtkXMLStructuredGridReader", "vtkXMLUnstructuredGridReader", "vtkXMLUnstructuredGridWriter", -]: - location[name] = "vtkIOXML" +]: location[name] = "vtkIOXML" location["vtkImageLuminance"] = "vtkImagingColor" @@ -613,8 +604,7 @@ def dump_hierarchy_to_file(fname=""): "vtkImageThreshold", "vtkImageTranslateExtent", "vtkExtractVOI", -]: - location[name] = "vtkImagingCore" +]: location[name] = "vtkImagingCore" for name in [ @@ -623,8 +613,7 @@ def dump_hierarchy_to_file(fname=""): "vtkImageFFT", "vtkImageFourierCenter", "vtkImageRFFT", -]: - location[name] = "vtkImagingFourier" +]: location[name] = "vtkImagingFourier" for name in [ @@ -636,8 +625,7 @@ def dump_hierarchy_to_file(fname=""): "vtkImageLaplacian", "vtkImageMedian3D", "vtkImageNormalize", -]: - location[name] = "vtkImagingGeneral" +]: location[name] = "vtkImagingGeneral" for name in ["vtkImageToPoints", "vtkSampleFunction"]: location[name] = "vtkImagingHybrid" @@ -649,14 +637,12 @@ def dump_hierarchy_to_file(fname=""): "vtkImageLogarithmicScale", "vtkImageMagnitude", "vtkImageMathematics", -]: - location[name] = "vtkImagingMath" +]: location[name] = "vtkImagingMath" for name in [ "vtkImageContinuousDilate3D", "vtkImageContinuousErode3D", -]: - location[name] = "vtkImagingMorphological" +]: location[name] = "vtkImagingMorphological" location["vtkImageCanvasSource2D"] = "vtkImagingSources" @@ -672,8 +658,7 @@ def dump_hierarchy_to_file(fname=""): "vtkSimple2DLayoutStrategy", "vtkSimple3DCirclesStrategy", "vtkSpanTreeLayoutStrategy", -]: - location[name] = "vtkInfovisLayout" +]: location[name] = "vtkInfovisLayout" for name in [ "vtkInteractorStyleFlight", @@ -688,9 +673,9 @@ def dump_hierarchy_to_file(fname=""): "vtkInteractorStyleTrackballCamera", "vtkInteractorStyleUnicam", "vtkInteractorStyleUser", -]: - location[name] = "vtkInteractionStyle" +]: location[name] = "vtkInteractionStyle" +# noinspection PyUnresolvedReferences from vtkmodules.vtkInteractionWidgets import ( vtkBalloonWidget, vtkBoxWidget, @@ -719,12 +704,11 @@ def dump_hierarchy_to_file(fname=""): "vtkSliderRepresentation3D", "vtkSliderWidget", "vtkSphereWidget", -]: - location[name] = "vtkInteractionWidgets" +]: location[name] = "vtkInteractionWidgets" location["vtkCameraOrientationWidget"] = "vtkInteractionWidgets" - +# noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingAnnotation import ( vtkAxesActor, vtkAxisActor2D, @@ -746,10 +730,10 @@ def dump_hierarchy_to_file(fname=""): "vtkPolarAxesActor", "vtkScalarBarActor", "vtkXYPlotActor", -]: - location[name] = "vtkRenderingAnnotation" +]: location[name] = "vtkRenderingAnnotation" +# noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingCore import ( vtkActor, vtkActor2D, @@ -829,8 +813,7 @@ def dump_hierarchy_to_file(fname=""): "vtkVolume", "vtkVolumeProperty", "vtkWindowToImageFilter", -]: - location[name] = "vtkRenderingCore" +]: location[name] = "vtkRenderingCore" location["vtkVectorText"] = "vtkRenderingFreeType" @@ -853,8 +836,7 @@ def dump_hierarchy_to_file(fname=""): "vtkShadowMapPass", "vtkTranslucentPass", "vtkVolumetricPass", -]: - location[name] = "vtkRenderingOpenGL2" +]: location[name] = "vtkRenderingOpenGL2" for name in [ @@ -863,8 +845,7 @@ def dump_hierarchy_to_file(fname=""): "vtkProjectedTetrahedraMapper", "vtkUnstructuredGridVolumeRayCastMapper", "vtkUnstructuredGridVolumeZSweepMapper", -]: - location[name] = "vtkRenderingVolume" +]: location[name] = "vtkRenderingVolume" ######################################################### # print("successfully finished importing vtkmodules") From 2513a7617e0e07aa4c7a343acebac438391dd2b9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 16:57:05 +0100 Subject: [PATCH 225/251] restyle examples containing c=... in constructor --- examples/advanced/fitline.py | 21 +++++--------- examples/advanced/fitspheres2.py | 2 +- examples/advanced/interpolate_field.py | 10 ++++--- examples/advanced/interpolate_scalar5.py | 4 +-- examples/advanced/warp3.py | 4 +-- examples/advanced/warp4b.py | 8 +++--- examples/advanced/warp5.py | 35 ++++++++++------------- examples/advanced/warp6.py | 2 +- examples/basic/align3.py | 6 ++-- examples/basic/boolean.py | 4 +-- examples/basic/connected_vtx.py | 6 ++-- examples/basic/keypress.py | 16 +++++------ examples/basic/ribbon.py | 6 ++-- examples/basic/silhouette2.py | 12 ++++---- examples/basic/slider_browser.py | 4 +-- examples/other/tensor_grid2.py | 14 ++++----- examples/pyplot/histo_2d_b.py | 2 +- examples/pyplot/plot_bars.py | 2 +- examples/pyplot/quiver.py | 2 +- examples/pyplot/scatter3.py | 14 ++++----- examples/simulations/aspring1.py | 2 +- examples/simulations/brownian2d.py | 9 ++---- examples/simulations/doubleslit.py | 17 +++++------ examples/simulations/gyroscope1.py | 14 ++++----- examples/simulations/lorenz.py | 2 +- examples/simulations/multiple_pendulum.py | 8 +++--- examples/simulations/optics_main2.py | 2 +- examples/simulations/pendulum_3d.py | 4 +-- examples/simulations/springs_fem.py | 12 ++++---- examples/simulations/trail.py | 2 +- examples/simulations/tunnelling2.py | 7 +++-- examples/simulations/wave_equation1d.py | 6 ++-- examples/volumetric/office.py | 3 +- examples/volumetric/streamribbons.py | 2 +- vedo/file_io.py | 2 +- 35 files changed, 125 insertions(+), 141 deletions(-) diff --git a/examples/advanced/fitline.py b/examples/advanced/fitline.py index 6617a9de..c448fadf 100644 --- a/examples/advanced/fitline.py +++ b/examples/advanced/fitline.py @@ -1,34 +1,27 @@ -"""Usage example of fitLine() and fitPlane() - -Draw a line in 3D that fits a cloud of 20 Points, -Show the first set of 20 points and fit a plane to them""" -import numpy as np +"""Draw a line in 3D that fits a cloud of 20 Points, +Show the first set of 20 points and fit a plane to them.""" from vedo import * -settings.use_depth_peeling = True - # declare the class instance -plt = Plotter() +plt = Plotter(axes=1) # draw 500 fit lines superimposed and very transparent for i in range(500): - x = np.linspace(-2, 5, 20) # generate every time 20 points y = np.linspace(1, 9, 20) z = np.linspace(-5, 3, 20) data = np.stack((x,y,z), axis=1) - data += np.random.normal(size=data.shape) * 0.8 # add gauss noise - + data+= np.random.normal(size=data.shape) * 0.8 # add gauss noise plt += fit_line(data).lw(4).alpha(0.04).c("violet") # fit a line # 'data' still contains the last iteration points -plt += Points(data, r=10, c="yellow") +plt += Points(data).color("yellow").ps(10) print("Line 0 Fit slope = ", plt.objects[0].slope) plane = fit_plane(data).c("green4") # fit a plane print("Plane Fit normal =", plane.normal) -plt += [plane, __doc__] +plt += plane, __doc__ -plt.show(axes=1).close() +plt.show().close() diff --git a/examples/advanced/fitspheres2.py b/examples/advanced/fitspheres2.py index 8f6d2a01..80404e83 100644 --- a/examples/advanced/fitspheres2.py +++ b/examples/advanced/fitspheres2.py @@ -23,7 +23,7 @@ pts1.append(p) pts2.append(p + n / 8) -plt += msh, Points(pts1), Lines(pts1, pts2, c="black") +plt += msh, Points(pts1), Lines(pts1, pts2).c("black") plt += histogram(vals, xtitle='radius', xlim=[0,2]).clone2d(pos="bottom-left") plt += __doc__ plt.show().close() diff --git a/examples/advanced/interpolate_field.py b/examples/advanced/interpolate_field.py index 2458152b..023d9741 100644 --- a/examples/advanced/interpolate_field.py +++ b/examples/advanced/interpolate_field.py @@ -22,8 +22,8 @@ sources = np.array(sources) deltas = np.array(deltas) -src = Points(sources, c="r", r=12) -trs = Points(sources + deltas, c="v", r=12) +src = Points(sources).color("r").ps(12) +trs = Points(sources + deltas).color("v").ps(12) arr = Arrows(sources, sources + deltas).color("k8") ################################################# warp using Thin Plate Splines @@ -32,7 +32,9 @@ allarr = Arrows(apos.vertices, warped.vertices).color("k8") set1 = [apos, warped, src, trs, arr, __doc__] -plt1 = show([set1, allarr], N=2, bg='bb', interactive=0) # returns the Plotter class +plt1 = Plotter(N=2, bg='bb') +plt1.at(0).show(apos, warped, src, trs, arr, __doc__) +plt1.at(1).show(allarr) ################################################# RBF @@ -48,7 +50,7 @@ positions_z = itrz(xr, yr, zr) + zr positions_rbf = np.vstack([positions_x, positions_y, positions_z]).T -warped_rbf = Points(positions_rbf, r=2).alpha(0.4).color("lg").point_size(10) +warped_rbf = Points(positions_rbf).color("lg",0.4).point_size(10) allarr_rbf = Arrows(apos.vertices, warped_rbf.vertices).color("k8") arr = Arrows(sources, sources + deltas).color("k8") diff --git a/examples/advanced/interpolate_scalar5.py b/examples/advanced/interpolate_scalar5.py index 2f79d1a6..2401f010 100644 --- a/examples/advanced/interpolate_scalar5.py +++ b/examples/advanced/interpolate_scalar5.py @@ -22,13 +22,13 @@ def harmonic_shepard(pts, vals, radius): ptss1 = pts.copy() ptss1[:,2] = scals1 # assign scalars as z-coords -pts1 = Points(ptss1, r=15, c="red5") +pts1 = Points(ptss1).color("red5").point_size(15) # Compute an interpolated (smoothed) set of scalars scals2 = harmonic_shepard(pts, scals1, radius=0.1) ptss2 = pts.copy() ptss2[:,2] = scals2 -pts2 = Points(ptss2, r=15, c="purple5") +pts2 = Points(ptss2).color("purple5").point_size(15) # Warp the surface to match the interpolated points ptsource, pttarget = [], [] diff --git a/examples/advanced/warp3.py b/examples/advanced/warp3.py index fac4e358..322b2c4f 100644 --- a/examples/advanced/warp3.py +++ b/examples/advanced/warp3.py @@ -87,8 +87,8 @@ def draw_shapes(self): pts_t = pts_s + np.sin(2 * pts_s) / 5 # and distort it mr = Morpher(N=2) - mr.source = Points(pts_s, r=20, c="g", alpha=0.5) - mr.target = Points(pts_t, r=10, c="r", alpha=1.0) + mr.source = Points(pts_s).color("g",0.5).ps(20) + mr.target = Points(pts_t).color("r",1.0).ps(10) mr.bound = 2 # limits the x and y shift # allow move only a subset of points (implicitly sets the NDF of the fit) diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py index 50ce991c..f177aed7 100644 --- a/examples/advanced/warp4b.py +++ b/examples/advanced/warp4b.py @@ -13,8 +13,8 @@ ################################################ def update(): - source_pts = Points(sources, r=12, c="purple5") - target_pts = Points(targets, r=12, c="purple5") + source_pts = Points(sources).color("purple5").ps(12) + target_pts = Points(targets).color("purple5").ps(12) source_pts.name = "source_pts" target_pts.name = "target_pts" slabels = source_pts.labels2d("id", c="purple3") @@ -85,8 +85,8 @@ def keypress(evt): sources = [] targets = [] -msg0 = Text2D("Pick a point on the surface", c='white', alpha=1, bg="blue4", pos="bottom-center") -msg1 = Text2D("", c='white', bg="blue4", alpha=1, pos="bottom-center") +msg0 = Text2D("Pick a point on the surface", pos="bottom-center", c='white', alpha=1, bg="blue4") +msg1 = Text2D("", pos="bottom-center", c='white', bg="blue4", alpha=1) plt = Plotter(N=3, axes=0, sharecam=0, size=(2490, 810)) plt.add_callback("click", click) diff --git a/examples/advanced/warp5.py b/examples/advanced/warp5.py index 0fd4f516..4367fd42 100644 --- a/examples/advanced/warp5.py +++ b/examples/advanced/warp5.py @@ -11,8 +11,6 @@ print(__doc__) -plt = Plotter(shape=[1, 3], interactive=0, axes=1) - class Morpher: def __init__(self): @@ -24,11 +22,11 @@ def __init__(self): self.subsample = 200 # pick only subsample pts self.allow_scaling = False self.params = [] - self.msource = None self.s_size = ([0, 0, 0], 1) # ave position and ave size self.fitResult = None self.chi2 = 1.0e10 + self.plt = None # -------------------------------------------------------- fit function def transform(self, p): @@ -45,7 +43,6 @@ def transform(self, p): def _func(self, pars): self.params = pars - #calculate chi2 d2sum, n = 0.0, self.source.npoints srcpts = self.source.vertices @@ -56,7 +53,6 @@ def _func(self, pars): tp = self.target.closest_point(p2) d2sum += mag2(p2 - tp) d2sum /= len(rng) - if d2sum < self.chi2: if d2sum < self.chi2 * 0.99: print("Emin ->", d2sum) @@ -96,10 +92,6 @@ def avesize(pts): # helper fnc # ------------------------------------------------------- Visualization def draw_shapes(self): - pos, sz = self.s_size[0], self.s_size[1] - - sphere0 = Sphere(pos, c="gray", r=sz, res=10, quads=True).wireframe() - newpts = [] for p in self.msource.vertices: newp = self.transform(p) @@ -107,30 +99,33 @@ def draw_shapes(self): self.msource.vertices = newpts arrs = [] + pos, sz = self.s_size[0], self.s_size[1] + sphere0 = Sphere(pos, r=sz, res=10, quads=True).wireframe().c("gray") for p in sphere0.vertices: newp = self.transform(p) arrs.append([p, newp]) - hair = Arrows(arrs, s=0.3, c='jet') + hair = Arrows(arrs, s=0.3, c='jet').add_scalarbar() - zero = Point(pos, c="black") + zero = Point(pos).c("black") x1, x2, y1, y2, z1, z2 = self.target.bounds() tpos = [x1, y2, z1] - text1 = Text3D("source vs target", tpos, s=sz / 10, c="dg") - text2 = Text3D("morphed vs target", tpos, s=sz / 10, c="dg") - text3 = Text3D("deformation", tpos, s=sz / 10, c="dr") + text1 = Text3D("source vs target", tpos, s=sz/10).color("dg") + text2 = Text3D("morphed vs target", tpos, s=sz/10).color("db") + text3 = Text3D("deformation", tpos, s=sz/10).color("dr") - plt.at(2).show(sphere0, zero, text3, hair) - plt.at(1).show(self.msource, self.target, text2) - plt.at(0).show(self.source, self.target, text1, zoom=1.2, interactive=True) - plt.close() + self.plt = Plotter(shape=[1, 3], axes=1) + self.plt.at(2).show(sphere0, zero, text3, hair) + self.plt.at(1).show(self.msource, self.target, text2) + self.plt.at(0).show(self.source, self.target, text1, zoom=1.2) + self.plt.interactive().close() ################################# if __name__ == "__main__": mr = Morpher() - mr.source = Mesh(dataurl+"270.vtk").color("g").alpha(0.4) - mr.target = Mesh(dataurl+"290.vtk").color("b").alpha(0.3) + mr.source = Mesh(dataurl+"270.vtk").color("g",0.4) + mr.target = Mesh(dataurl+"290.vtk").color("b",0.3) mr.target.wireframe() mr.allow_scaling = True mr.bound = 0.4 # limits the parameter value diff --git a/examples/advanced/warp6.py b/examples/advanced/warp6.py index e19e86c0..95e3aada 100644 --- a/examples/advanced/warp6.py +++ b/examples/advanced/warp6.py @@ -9,7 +9,7 @@ def on_keypress(event): n = normals[idx] p = verts[idx] + n / 5 - txt = Text3D("Text3D\nABCDEF", s=0.1, justify="centered", c="red5") + txt = Text3D("Text3D\nABCDEF", s=0.1, justify="centered").c("red5") txt.reorient([0,0,1], n).pos(p) tpts = txt.clone().subsample(0.05).vertices diff --git a/examples/basic/align3.py b/examples/basic/align3.py index cd7e9869..86998d15 100644 --- a/examples/basic/align3.py +++ b/examples/basic/align3.py @@ -13,9 +13,9 @@ pts3 = [(u(0, x) + 4, u(0, x) + i / 4 - 3, u(0, x) + i - 2) for i in range(N)] # Convert the sets of points into Points objects with different colors and sizes -vpts1 = Points(pts1, c="r", r=8) -vpts2 = Points(pts2, c="g", r=8) -vpts3 = Points(pts3, c="b", r=8) +vpts1 = Points(pts1).c("r").ps(8) +vpts2 = Points(pts2).c("g").ps(8) +vpts3 = Points(pts3).c("b").ps(8) # Perform Procrustes alignment on the sets of points # and obtain the aligned sets diff --git a/examples/basic/boolean.py b/examples/basic/boolean.py index df3c0fa0..7fccc588 100644 --- a/examples/basic/boolean.py +++ b/examples/basic/boolean.py @@ -8,8 +8,8 @@ plt = Plotter(shape=(2, 2), interactive=False, axes=3) # Create two sphere meshes -s1 = Sphere(pos=[-0.7, 0, 0], c="red5", alpha=0.5) -s2 = Sphere(pos=[0.7, 0, 0], c="green5", alpha=0.5) +s1 = Sphere(pos=[-0.7, 0, 0]).c("red5",0.5) +s2 = Sphere(pos=[0.7, 0, 0]).c("green5",0.5) # Show the spheres on the first renderer, and display the docstring as the title plt.at(0).show(s1, s2, __doc__) diff --git a/examples/basic/connected_vtx.py b/examples/basic/connected_vtx.py index 377cf488..2864a9f5 100644 --- a/examples/basic/connected_vtx.py +++ b/examples/basic/connected_vtx.py @@ -3,7 +3,7 @@ from vedo import * # create a wireframe sphere and color it yellow -s = Sphere(c="y", res=12).wireframe() +s = Sphere(res=12).wireframe().c("yellow") # select one point on the sphere using its index index = 12 @@ -14,11 +14,11 @@ vtxs = s.vertices[ids] # create a red point at the selected point's location -apt = Point(pt, c="r", r=15) +apt = Point(pt).c("red5").ps(15) # create blue points at the locations of the vertices # connected to the selected point -cpts = Points(vtxs, c="blue", r=20) +cpts = Points(vtxs).c("blue5").ps(20) # show the sphere, the selected point, and the connected vertices show(s, apt, cpts, __doc__, bg='bb').close() diff --git a/examples/basic/keypress.py b/examples/basic/keypress.py index 1c2fbb08..b0a97a55 100644 --- a/examples/basic/keypress.py +++ b/examples/basic/keypress.py @@ -1,8 +1,7 @@ """Implement a custom function that is triggered by pressing a keyboard button when the rendering window -is in interactive mode - -Place pointer anywhere on the mesh and press c""" +is in interactive mode. +Place the pointer anywhere on the mesh and press c""" from vedo import dataurl, printc, Plotter, Point, Mesh ############################################################# @@ -10,15 +9,16 @@ def myfnc(evt): mesh = evt.object # printc('dump event info', evt) if not mesh or evt.keypress != "c": - printc("click mesh and press c", c="r") + printc("click mesh and press c", c="r", invert=True) return printc("point:", mesh.picked3d, c="v") - cpt = Point(pos=mesh.picked3d, r=20, c="v").pickable(False) + cpt = Point(mesh.picked3d) + cpt.color("violet").ps(20).pickable(False) plt.add(cpt).render() ############################################################## plt = Plotter(axes=1) -plt += Mesh(dataurl+"bunny.obj").color("gold") -plt += __doc__ -plt.add_callback('KeyPress', myfnc) +plt+= Mesh(dataurl+"bunny.obj").color("gold") +plt+= __doc__ +plt.add_callback('on key press', myfnc) plt.show().close() diff --git a/examples/basic/ribbon.py b/examples/basic/ribbon.py index 3c9af310..fc5fbe08 100644 --- a/examples/basic/ribbon.py +++ b/examples/basic/ribbon.py @@ -5,11 +5,11 @@ l1 = [[sin(x), cos(x), x/3] for x in np.arange(0,9, 0.1)] l2 = [[sin(x)+0.2, cos(x) + x/15, x/3] for x in np.arange(0,9, 0.1)] -t1 = Tube(l1, c="green5", r=0.02) -t2 = Tube(l2, c="blue3", r=0.02) +t1 = Tube(l1, r=0.02).color("green5") +t2 = Tube(l2, r=0.02).color("blue3") r12 = Ribbon(l1, l2, res=(200,5)).alpha(0.5) -r1 = Ribbon(l1, width=0.1).alpha(0.5).color('orange') +r1 = Ribbon(l1, width=0.1).color('orange',0.5) plt = Plotter(N=2, axes=1) plt.at(0).show(__doc__, r12, t1, t2) diff --git a/examples/basic/silhouette2.py b/examples/basic/silhouette2.py index 0d264860..9f830f7d 100644 --- a/examples/basic/silhouette2.py +++ b/examples/basic/silhouette2.py @@ -2,18 +2,16 @@ as seen along a specified direction Axes font: """ -# Source: Zhi-Qiang Zhou (https://github.com/zhouzq-thu) +# Author: Zhi-Qiang Zhou (https://github.com/zhouzq-thu) from vedo import * settings.default_font = "Kanopus" -settings.use_depth_peeling = False - -plt = Plotter(title="Example of project_on_plane()") s = Hyperboloid().rotate_x(20) pts = s.vertices n = len(pts) +plt = Plotter(title="Example of project_on_plane()") plt += [s, __doc__ + settings.default_font] # orthogonal projection ############################### @@ -36,9 +34,9 @@ # draw the lines for i in range(0, n, int(n / 20)): - plt += Line(pts1[i], pts[i], c="k", alpha=0.2) - plt += Line(point, pts[i], c="k", alpha=0.2) - plt += Line(pts2[i], pts[i], c="k", alpha=0.2) + plt += Line(pts1[i], pts[i]).color("black",0.2) + plt += Line(point, pts[i]).color("black",0.2) + plt += Line(pts2[i], pts[i]).color("black",0.2) plt.show( axes=dict( diff --git a/examples/basic/slider_browser.py b/examples/basic/slider_browser.py index bff9482b..2611470d 100644 --- a/examples/basic/slider_browser.py +++ b/examples/basic/slider_browser.py @@ -17,9 +17,9 @@ def sliderfunc(widget, event): settings.default_font = "Glasgo" plt = Plotter(bg="blackboard") -plt += Text2D(__doc__, pos="top-center", s=1.2, c="w") +plt += Text2D(__doc__, pos="top-center", s=1.2).color("w") plt += Image(dataurl + "images/limbs_tc.jpg").scale(0.0154).y(10) -plt += Line([(0, 8), (0, 10), (28.6, 10), (4.5, 8)], c="gray") +plt += Line([(0, 8), (0, 10), (28.6, 10), (4.5, 8)]).color("gray") plt += Axes(objs[-1]) plt += objs[0] plt.add_slider( diff --git a/examples/other/tensor_grid2.py b/examples/other/tensor_grid2.py index 3d3d1bf5..aee01ff3 100644 --- a/examples/other/tensor_grid2.py +++ b/examples/other/tensor_grid2.py @@ -84,8 +84,8 @@ def principal_stretches_directions(T): axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), - c="blue5", - ).lighting("off") + ) + ellipsoid_C.lighting("off").color("blue5") E = green_lagrange(C) # E = almansi(F) @@ -96,8 +96,8 @@ def principal_stretches_directions(T): axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), - c="purple5", - ).z(0.01).lighting("off") + ).z(0.01) + ellipsoid_E.lighting("off").color("purple5") if stretches[0] < 0 or stretches[1] < 0: ellipsoid_E.c("red4") @@ -105,12 +105,12 @@ def principal_stretches_directions(T): # principal stretches and directions of the deformation gradient # tensor because it is not a symmetric tensor. # F = deformation_gradient(*pt) - # circle = vedo.Circle(r=0.05, c="black").pos(*pt) + # circle = vedo.Circle(r=0.05).pos(*pt).color("black") # cpts = circle.vertices # cpts_defo = F @ cpts.T[:2] # circle.vertices = cpts_defo.T # Same as: - circle = vedo.Circle(r=0.06, c="black").pos(*pt) + circle = vedo.Circle(r=0.06).pos(*pt).color("black") cpts = circle.vertices cpts_defo = deform(cpts[:,0], cpts[:,1]) circle.vertices = cpts_defo.T @@ -120,7 +120,7 @@ def principal_stretches_directions(T): pts = np.array([x, y]).T.reshape(-1, 2) defo_pts = deform(x, y).T.reshape(-1, 2) -plotter += vedo.Arrows2D(pts, defo_pts, s=0.2, c="blue5") +plotter += vedo.Arrows2D(pts, defo_pts, s=0.2).color("blue5") plotter += grid_defo plotter += __doc__ plotter.show(axes=8, zoom=1.2) diff --git a/examples/pyplot/histo_2d_b.py b/examples/pyplot/histo_2d_b.py index cf2ba375..f7aaeb45 100644 --- a/examples/pyplot/histo_2d_b.py +++ b/examples/pyplot/histo_2d_b.py @@ -21,6 +21,6 @@ print(histo.frequencies) # Add also the original points on top -histo += Points(np.c_[x, y], r=4, c="red5").z(3) +histo += Points(np.c_[x, y]).z(3).c("red5").point_size(4) show(histo, __doc__, elevation=-80).close() diff --git a/examples/pyplot/plot_bars.py b/examples/pyplot/plot_bars.py index 438fd950..28801e80 100644 --- a/examples/pyplot/plot_bars.py +++ b/examples/pyplot/plot_bars.py @@ -24,7 +24,7 @@ for i in range(len(percent)): val = precision(percent[i], 3)+'%' - txt = Text3D(val, pos=(fig.centers[i], counts[i]), justify="bottom-center", c="blue2") + txt = Text3D(val, pos=(fig.centers[i], counts[i]), justify="bottom-center").c("blue2") fig += txt.scale(200).shift(0,170,0) fig.show(size=(1000,750), zoom='tight').close() diff --git a/examples/pyplot/quiver.py b/examples/pyplot/quiver.py index c36abc1b..0f928b73 100644 --- a/examples/pyplot/quiver.py +++ b/examples/pyplot/quiver.py @@ -6,6 +6,6 @@ pts1 = Grid(s=[1.0,1.0]).vertices pts2 = Grid(s=[1.2,1.2]).rotate_z(4).vertices -quiv = Arrows2D(pts1, pts2, c="red5") +quiv = Arrows2D(pts1, pts2).c("red5") show(quiv, __doc__, axes=1, zoom=1.2).close() diff --git a/examples/pyplot/scatter3.py b/examples/pyplot/scatter3.py index 4d896637..62784917 100644 --- a/examples/pyplot/scatter3.py +++ b/examples/pyplot/scatter3.py @@ -7,33 +7,33 @@ x = randn(2000) * 3 y = randn(2000) * 2 xy = np.c_[x, y] -pts1 = Points(xy, c="blue", alpha=0.5).z(0.0) -bra1 = Brace([-7, -8], [7, -8], comment="whole population", s=0.4, c="b") +pts1 = Points(xy).z(0.0).color("blue5",0.5) +bra1 = Brace([-7, -8], [7, -8], comment="whole population", s=0.4).c("blue5") ### second cloud in red x = randn(1200) + 4 y = randn(1200) + 2 xy = np.c_[x, y] -pts2 = Points(xy, c="red", alpha=0.5).z(0.1) +pts2 = Points(xy).z(0.1).color("red",0.5) bra2 = Brace( [8, 2, 0.3], [6, 5, 0.3], comment="red zone", angle=180, justify="bottom-center", - c="r", + c="red5", ) ### third cloud with a black marker x = randn(20) + 4 y = randn(20) - 4 mark = Marker("*", s=0.25) -pts3 = Glyph(xy, mark, c="red5", alpha=0.2).z(0.2) +pts3 = Glyph(xy, mark).z(0.2).color("red5",0.5) bra3 = Brace([8, -6], [8, -2], comment="my stars").z(0.3) # some text message -msg = Text3D("preliminary\nresults!", font="Quikhand", s=1.5) -msg.c("black").rotate_z(20).pos(-10, 3, 0.2) +msg = Text3D("preliminary\nresults!", font="Quikhand", s=1.5).c("black") +msg.rotate_z(20).pos(-10, 3, 0.2) show( pts1, pts2, pts3, msg, bra1, bra2, bra3, __doc__, diff --git a/examples/simulations/aspring1.py b/examples/simulations/aspring1.py index aa3db931..f3bea1d0 100644 --- a/examples/simulations/aspring1.py +++ b/examples/simulations/aspring1.py @@ -24,7 +24,7 @@ def loop_func(event): spr = Spring(x0, x, r1=0.06, thickness=0.01) plt.remove("Spring").add(spr).render() -block = Cube(pos=x, side=0.2, c="tomato") +block = Cube(pos=x, side=0.2).color("tomato") spring = Spring(x0, x, r1=0.06, thickness=0.01) plt = Plotter(size=(1050, 600)) diff --git a/examples/simulations/brownian2d.py b/examples/simulations/brownian2d.py index 5ad36725..59fec501 100644 --- a/examples/simulations/brownian2d.py +++ b/examples/simulations/brownian2d.py @@ -116,14 +116,11 @@ Vel[s1] += x2 * DV0 Vel[s2] -= x1 * DV0 - # spheres = Spheres(Pos, r=30, c="blue4", res=6).phong() - spheres = Points(Pos, r=20, c="blue4") - # print(Pos, Radius[0]) - # spheres.show().interactive() - # exit() + spheres = Points(Pos).c("blue4").point_size(20) if not int(i) % 20: # every 20 steps: rsp = [Pos[0][0], Pos[0][1], 0] - plt.add(Point(rsp, c="r", r=4)) # leave a point trace + trace = Points(rsp).c("red").point_size(4) + plt.add(trace) # leave a point trace spheres.name = "particles" plt.remove("particles").add(spheres).render() diff --git a/examples/simulations/doubleslit.py b/examples/simulations/doubleslit.py index e5258df0..f885eb7f 100644 --- a/examples/simulations/doubleslit.py +++ b/examples/simulations/doubleslit.py @@ -3,7 +3,6 @@ Slit sources are placed on the plane shown as a thin grid""" # Can simulate the 'Arago spot', the bright point at the center of # a circular object shadow (https://en.wikipedia.org/wiki/Arago_spot). -import numpy as np from vedo import * ######################################### @@ -21,8 +20,6 @@ # slits = [(cos(x)*4e-5, sin(x)*4e-5, 0) for x in arange(0,2*np.pi, .1)] # Arago spot # slits = Grid(s=[1e-4,1e-4], res=[9,9]).vertices # a square lattice -plt = Plotter(title="The Double Slit Experiment", axes=9, bg="black") - screen = Grid(pos=[0, 0, -D], s=[0.1,0.1], lw=0, res=[200,50]).wireframe(False) # Compute the image on the far screen @@ -40,11 +37,11 @@ verts[i] = x + [0, 0, psi2 / norm] screen.cmap("hot", amplitudes) +plt = Plotter(title="The Double Slit Experiment", axes=9, bg="black") plt += [screen, __doc__] -plt += Points(np.array(slits) * 200, c="w") # slits scale magnified by factor 200 -plt += Grid(s=[0.1,0.1], res=[6,6], c="w", alpha=0.1) -plt += Line([0, 0, 0], [0, 0, -D], c="w", alpha=0.1) -plt += Text3D("source plane", pos=[-0.04, -0.05, 0], s=0.002, c="gray") -plt += Text3D("detector plane D = "+str(D)+" m", pos=[-.04,-.05,-D+.001], s=.002, c="gray") - -plt.show(zoom=1.1).close() +plt += Points(np.array(slits) * 200).color("w") # slits scale magnified by factor 200 +plt += Grid(s=[0.1,0.1], res=[6,6],).color("w",0.1) +plt += Line([0, 0, 0], [0, 0, -D],).color("w",0.1) +plt += Text3D("source plane", pos=[-0.04, -0.05, 0], s=0.002).c("gray") +plt += Text3D("detector plane D = "+str(D)+" m", pos=[-.04,-.05,-D+.001], s=.002).c("gray") +plt.show(zoom=1.15).close() diff --git a/examples/simulations/gyroscope1.py b/examples/simulations/gyroscope1.py index cd3c9c57..0e2e3cd4 100644 --- a/examples/simulations/gyroscope1.py +++ b/examples/simulations/gyroscope1.py @@ -26,15 +26,15 @@ plt = Plotter() plt += __doc__ -shaft = Cylinder([[0, 0, 0], Ls * gaxis], r=0.03, c="dg") -rotor = Cylinder([(Ls - 0.55) * gaxis, (Ls - 0.45) * gaxis], r=R, c="t") -bar = Cylinder([Ls*gaxis/2-R*vector(0,1,0), Ls*gaxis/2+R*vector(0,1,0)], r=R/6, c="r") +shaft = Cylinder([[0, 0, 0], Ls * gaxis], r=0.03).c("dark green") +rotor = Cylinder([(Ls - 0.55) * gaxis, (Ls - 0.45) * gaxis], r=R).c("tomato") +bar = Cylinder([Ls*gaxis/2-R*vector(0,1,0), Ls*gaxis/2+R*vector(0,1,0)], r=R/6).c("red5") gyro = shaft + rotor + bar # group meshes into a single one of type Assembly -spring = Spring(top, gpos, r1=0.06, thickness=0.01, c="gray") +spring = Spring(top, gpos, r1=0.06, thickness=0.01).c("gray") plt += [gyro, spring] # add it to Plotter. -plt += Box(top, length=0.2, width=0.02, height=0.2, c="gray") -plt += Box(pos=(0, 0.5, 0), length=2.6, width=3, height=2.6, c="gray", alpha=0.2).wireframe() +plt += Box(top, length=0.2, width=0.02, height=0.2).c("gray") +plt += Box(pos=(0, 0.5, 0), length=2.6, width=3, height=2.6).wireframe().c("gray",0.2) # ############################################################ the physics def loop_func(event): @@ -49,7 +49,7 @@ def loop_func(event): # set orientation along gaxis and rotate it around its axis by omega*t degrees gyro.reorient([0,0,1], Lrot, rotation=omega*t, rad=True).pos(gpos) - spring = Spring(top, gpos, r1=0.06, thickness=0.01, c="gray") + spring = Spring(top, gpos, r1=0.06, thickness=0.01).c("gray") plt.remove("Spring").add(spring) plt.render() diff --git a/examples/simulations/lorenz.py b/examples/simulations/lorenz.py index 22361061..6bac0d95 100644 --- a/examples/simulations/lorenz.py +++ b/examples/simulations/lorenz.py @@ -20,7 +20,7 @@ line.add_shadow("x", 3, alpha=0.2) line.add_shadow("z", -25, alpha=0.2) -pt = Point(pts[0], c="red4", r=12) +pt = Point(pts[0]).color("red4").ps(12) pt.add_trail(lw=4).add_shadow("x", 3, alpha=0.5) pt.trail.add_shadow("x", 3, alpha=0.5) diff --git a/examples/simulations/multiple_pendulum.py b/examples/simulations/multiple_pendulum.py index 15852d32..fffeb388 100644 --- a/examples/simulations/multiple_pendulum.py +++ b/examples/simulations/multiple_pendulum.py @@ -23,12 +23,12 @@ bob_y.append(bob_y[k - 1] + np.sin(alpha) + np.random.normal(0, 0.1)) plt = Plotter(title="Multiple Pendulum", bg2='ly') -plt += Box(pos=(0, -5, 0), length=12, width=12, height=0.7, c="k").wireframe(1) -sph = Sphere(pos=(bob_x[0], bob_y[0], 0), r=R / 2, c="gray") +plt += Box(pos=(0, -5, 0), length=12, width=12, height=0.7).color("k").wireframe(1) +sph = Sphere(pos=(bob_x[0], bob_y[0], 0), r=R / 2).color("gray") plt += sph bob = [sph] for k in range(1, N + 1): - c = Cylinder(pos=(bob_x[k], bob_y[k], 0), r=R, height=0.3, c=k) + c = Cylinder(pos=(bob_x[k], bob_y[k], 0), r=R, height=0.3).color(k) plt += c bob.append(c) @@ -101,7 +101,7 @@ def loop_func(evt): plt.remove("Line") for k in range(1, N + 1): bob[k].pos([bob_x[k], bob_y[k], 0]) - sp = Line(bob[k - 1].pos(), bob[k].pos(), lw=8, c="gray") + sp = Line(bob[k - 1].pos(), bob[k].pos()).color("gray").lw(8) plt.add(sp) plt.render() diff --git a/examples/simulations/optics_main2.py b/examples/simulations/optics_main2.py index a95a2b9a..d9d7ad7b 100644 --- a/examples/simulations/optics_main2.py +++ b/examples/simulations/optics_main2.py @@ -36,7 +36,7 @@ lines[0].add_scalarbar("Ampl.") # Grab the coords of photons exiting the conic lens3 (hits_type==-1) -cone_hits = Points(lens3.hits[lens3.hits_type==-1], r=8, c="green1") +cone_hits = Points(lens3.hits[lens3.hits_type==-1]).color("green1").point_size(8) # Show everything show(__doc__, elements, lines, lens5.boundaries().lw(2), cone_hits, diff --git a/examples/simulations/pendulum_3d.py b/examples/simulations/pendulum_3d.py index 58598ebd..1f5f6bc0 100644 --- a/examples/simulations/pendulum_3d.py +++ b/examples/simulations/pendulum_3d.py @@ -8,8 +8,8 @@ x1, y1, z1, x2, y2, z2 = np.load(download(dataurl+'3Dpen.npy')) p1, p2 = np.c_[x1,y1,z1], np.c_[x2,y2,z2] -ball1 = Sphere(c="green5", r=0.1, pos=p1[0]) -ball2 = Sphere(c="blue5", r=0.1, pos=p2[0]) +ball1 = Sphere(p1[0], r=0.1).color("green5") +ball2 = Sphere(p2[0], r=0.1).color("blue5") ball1.add_shadow('z', -3) ball2.add_shadow('z', -3) diff --git a/examples/simulations/springs_fem.py b/examples/simulations/springs_fem.py index 2baa2b9f..49568905 100644 --- a/examples/simulations/springs_fem.py +++ b/examples/simulations/springs_fem.py @@ -43,16 +43,16 @@ nodes_displaced = nodes + u # Visualize the solution -vnodes1 = Points(nodes, r=20, c="k", alpha=0.25) -vline1 = Line(nodes, c="k", alpha=0.25) +vnodes1 = Points(nodes).color("k", 0.25).ps(20) +vline1 = Line(nodes).color("k", 0.25) arr_disp = Arrows2D(nodes, nodes_displaced).y(0.4) arr_force= Arrows2D(nodes, nodes + F).y(-0.25) -arr_disp.c("red4").alpha(0.8).legend('Displacements') -arr_force.c("blue4").alpha(0.8).legend('Forces') +arr_disp.c("red4",0.8).legend('Displacements') +arr_force.c("blue4",0.8).legend('Forces') -vnodes2 = Points(nodes_displaced, r=20, c="k").y(0.1) -vline2 = Lines(vnodes1, vnodes2, c="k", alpha=0.25) +vnodes2 = Points(nodes_displaced).color("k").ps(20).y(0.1) +vline2 = Lines(vnodes1, vnodes2).color("k", 0.25) springs = [] for i in range(num_springs): diff --git a/examples/simulations/trail.py b/examples/simulations/trail.py index b483f4fa..eb8a96da 100644 --- a/examples/simulations/trail.py +++ b/examples/simulations/trail.py @@ -5,7 +5,7 @@ s = Sphere().c("green").bc("tomato") s.cut_with_plane([-0.8, 0, 0]) # cut left part of sphere -p = Point([-2,0,0], r=12, c="black") +p = Point([-2,0,0]).ps(12).color("black") # add a trail to point p with 50 segments p.add_trail(lw=3, n=50) diff --git a/examples/simulations/tunnelling2.py b/examples/simulations/tunnelling2.py index e527b8c2..b5e0e1eb 100644 --- a/examples/simulations/tunnelling2.py +++ b/examples/simulations/tunnelling2.py @@ -50,7 +50,7 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method Psi += d_dt(Psi) * dt # integrate for a while before showing things A = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) coords = np.stack((x, A), axis=1) - Aline = Line(coords, c="db", lw=3) + Aline = Line(coords).color("db").linewidth(3) lines.append([Aline, A]) # store objects plt.remove("Line").add(Aline).render() @@ -58,9 +58,10 @@ def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method plt.objects= [] # clean up internal list of objects to show plt.elevation(20).azimuth(20) -barrier.alpha(0.3).c('k') +barrier.color('black', 0.3) barrier_end = barrier.clone().pos([0,0,20]) -plt.add(Ribbon(barrier, barrier_end, c="k", alpha=0.1)) +rib = Ribbon(barrier, barrier_end).c("black",0.1) +plt.add(rib) plt.reset_camera() for i in range(nsteps): diff --git a/examples/simulations/wave_equation1d.py b/examples/simulations/wave_equation1d.py index c295d9ed..9925c9b0 100644 --- a/examples/simulations/wave_equation1d.py +++ b/examples/simulations/wave_equation1d.py @@ -85,10 +85,10 @@ def euler(y, v, t, dt): # simple euler integrator #################################################### plt = Plotter(interactive=False, axes=2, size=(1400,1000)) -line_eu = Line([0,0,0], [len(x)-1,0,0], res=len(x), c="red5", lw=5) +line_eu = Line([0,0,0], [len(x)-1,0,0], res=len(x)).c("red5").lw(5) plt += line_eu -line_rk = Line([0,0,0], [len(x)-1,0,0], res=len(x), c="green5", lw=5) +line_rk = Line([0,0,0], [len(x)-1,0,0], res=len(x)).c("green5").lw(5) plt += line_rk # let's also add a fancy background image from wikipedia @@ -97,7 +97,7 @@ def euler(y, v, t, dt): # simple euler integrator plt += __doc__ plt.show(zoom=1.5) -for i in progressbar(nsteps, c='y', title="visualize the result"): +for i in progressbar(nsteps, title="visualize the result", c='y'): if i%10 != 0: continue y_eu = positions_eu[i] # retrieve the list of y positions at step i diff --git a/examples/volumetric/office.py b/examples/volumetric/office.py index b963cbb3..0d632136 100644 --- a/examples/volumetric/office.py +++ b/examples/volumetric/office.py @@ -8,7 +8,8 @@ sgrid = loadStructuredGrid(fpath) # Create a grid of points and use those as integration seeds -seeds = Grid(res=[2,3], c="gray").rotate_y(90).pos(2,2,1) +seeds = Grid(res=[2,3]).rotate_y(90).pos(2,2,1) +seeds.color("gray") # Now we will generate multiple streamlines in the data slines = StreamLines( diff --git a/examples/volumetric/streamribbons.py b/examples/volumetric/streamribbons.py index d0e947c1..3e347768 100644 --- a/examples/volumetric/streamribbons.py +++ b/examples/volumetric/streamribbons.py @@ -15,7 +15,7 @@ domain = pl3d.GetOutput().GetBlock(0) ######################## vedo -box = Mesh(domain, c="white", alpha=0.1) +box = Mesh(domain).c("white", 0.1) probe = Line([9,0,28], [11,0,33], res=11).color('k').lw(4) diff --git a/vedo/file_io.py b/vedo/file_io.py index cf0c68da..ad52d6ae 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -906,7 +906,7 @@ def _import_npy(fileinput): axes = data.pop("axes", 4) title = data.pop("title", "") - backgrcol = data.pop("backgrcol", "white") + backgrcol = data.pop("backgrcol", "white") backgrcol2 = data.pop("backgrcol2", None) cam = data.pop("camera", None) From 043662fd7d5d95a6e82bc036379102354e4c3ca9 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 17:10:18 +0100 Subject: [PATCH 226/251] fix cli wireframe --- examples/pyplot/histo_hexagonal.py | 3 +- vedo/cli.py | 54 ++++++++++++++++-------------- vedo/version.py | 2 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/examples/pyplot/histo_hexagonal.py b/examples/pyplot/histo_hexagonal.py index 5202efdb..a0de5826 100644 --- a/examples/pyplot/histo_hexagonal.py +++ b/examples/pyplot/histo_hexagonal.py @@ -14,7 +14,6 @@ f += r"{2 \sigma_{y}^{2}}\right)\right)" formula = Latex(f, c="k", s=1.5) -# formula.rotate_x(90).rotate_z(90).pos([-4, -5, 2]) -formula.rotate_z(90).rotate_x(90).pos([-4, -5, 2]) +formula.rotate_x(90).rotate_z(90).pos([-4, -5, 2]) show(histo, formula, axes=1, viewup="z").close() diff --git a/vedo/cli.py b/vedo/cli.py index f0d45520..bba698ed 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -494,6 +494,9 @@ def get_examples(d, vtk_class, lang): ################################################################################################################# def exe_eog(args): # print("EOG emulator") + if settings.dry_run_mode >= 2: + print(f"EOG emulator in dry run mode {settings.dry_run_mode}. Skip.") + return settings.immediate_rendering = False settings.use_parallel_projection = True settings.enable_default_mouse_callbacks = False @@ -627,6 +630,9 @@ def vfunc(event): ################################################################################################################# def draw_scene(args): + if settings.dry_run_mode >= 2: + print(f"draw_scene called in dry run mode {settings.dry_run_mode}. Skip.") + return nfiles = len(args.files) if nfiles == 0: @@ -685,10 +691,6 @@ def draw_scene(args): plt.axes = args.axes_type plt.add_hover_legend() - wire = False - if args.wireframe: - wire = True - ########################################################## # special case of SLC/TIFF volumes with -g option if args.ray_cast_mode: @@ -821,7 +823,7 @@ def draw_scene(args): ######################################################### ds = 0 - actors = [] + objs = [] for i in range(N): f = args.files[i] @@ -830,55 +832,55 @@ def draw_scene(args): if args.color is None and N > 1: colb = i - actor = load(f, force=args.reload) + obj = load(f, force=args.reload) - if isinstance(actor, (TetMesh, UGrid)): - actor = actor.tomesh().shrink(0.975).c(colb).alpha(args.alpha) + if isinstance(obj, (TetMesh, UGrid)): + obj = obj.tomesh().shrink(0.975).c(colb).alpha(args.alpha) - elif isinstance(actor, vedo.Points): - actor.c(colb).alpha(args.alpha) + elif isinstance(obj, vedo.Points): + obj.c(colb).alpha(args.alpha) try: - actor.wireframe(wire) + obj.wireframe(args.wireframe) if args.flat: - actor.flat() + obj.flat() else: - actor.phong() + obj.phong() except AttributeError: pass - actor.lighting(args.lighting) + obj.lighting(args.lighting) if i == 0 and args.texture_file: - actor.texture(args.texture_file) + obj.texture(args.texture_file) if args.point_size > 0: - actor.ps(args.point_size) + obj.ps(args.point_size) if args.cmap != "jet": - actor.cmap(args.cmap) + obj.cmap(args.cmap) if args.showedges: try: - actor.GetProperty().SetEdgeVisibility(1) - actor.GetProperty().SetLineWidth(0.1) - actor.GetProperty().SetRepresentationToSurface() + obj.GetProperty().SetEdgeVisibility(1) + obj.GetProperty().SetLineWidth(0.1) + obj.GetProperty().SetRepresentationToSurface() except AttributeError: pass - actors.append(actor) + objs.append(obj) if args.multirenderer_mode: try: - ds = actor.diagonal_size() * 3 + ds = obj.diagonal_size() * 3 plt.camera.SetClippingRange(0, ds) plt.reset_camera() # plt.render() - plt.show(actor, at=i, interactive=False, + plt.show(obj, at=i, interactive=False, zoom=args.zoom, mode=interactor_mode) except AttributeError: - # wildcards in quotes make glob return actor as a list :( + # wildcards in quotes make glob return obj as a list :( vedo.logger.error("Please do not use wildcards within single or double quotes") if args.multirenderer_mode: @@ -889,10 +891,10 @@ def draw_scene(args): else: # scene is empty - if all(a is None for a in actors): + if all(a is None for a in objs): vedo.logger.error("Could not load file(s). Quit.") return - plt.show(actors, interactive=True, zoom=args.zoom, mode=interactor_mode) + plt.show(objs, interactive=True, zoom=args.zoom, mode=interactor_mode) return ######################################################################## diff --git a/vedo/version.py b/vedo/version.py index 22427c05..a55f5b77 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev30a' +_version = '2023.5.0+dev31a' From 6e1a946314f7b1f0d9568c9fd94ed9a92e4b7d40 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 17:39:37 +0100 Subject: [PATCH 227/251] small fix to Text3D --- vedo/image.py | 6 ++++-- vedo/plotter.py | 3 ++- vedo/shapes.py | 44 ++++++++++++++++++++++++-------------------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/vedo/image.py b/vedo/image.py index 8a001999..84df3d4c 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -1465,7 +1465,8 @@ def add_text( return self def modified(self): - """Use in conjunction with `tonumpy()` to update any modifications to the image array""" + """Use this method in conjunction with `tonumpy()` + to update any modifications to the image array.""" self.dataset.GetPointData().GetScalars().Modified() return self @@ -1485,6 +1486,7 @@ def write(self, filename): class Picture(Image): def __init__(self, obj=None, channels=3): """Deprecated. Use `Image` instead.""" - colors.printc("Picture() is deprecated, use Image() instead.", c='y') + vedo.logger.warning( + "Picture() is deprecated, use Image() instead.") super().__init__(obj=obj, channels=channels) diff --git a/vedo/plotter.py b/vedo/plotter.py index 7aa2ca3e..4f84d189 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2404,7 +2404,8 @@ def add_scale_indicator( cs.SetCoordinateSystem(1) mapper.SetTransformCoordinate(cs) - fractor = vtk.vtkActor2D() + # fractor = vtk.vtkActor2D() + fractor = vedo.core.Actor2D() csys = fractor.GetPositionCoordinate() csys.SetCoordinateSystem(3) fractor.SetPosition(pos) diff --git a/vedo/shapes.py b/vedo/shapes.py index a790bfd0..e1ad0306 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -4358,6 +4358,9 @@ def _get_text3d_poly( notfounds.add(t) xmax += hspacing * scale * fscale continue + + if poly.GetNumberOfPoints() == 0: + continue tr = vtk.vtkTransform() tr.Translate(xmax, ymax + yshift, 0) @@ -4390,8 +4393,8 @@ def _get_text3d_poly( tpoly = polyapp.GetOutput() if notfounds: - wmsg = f"These characters are not available in font name {font}: {notfounds}. " - wmsg += 'Type "vedo -r fonts" for a demo.' + wmsg = f"unavailable characters in font name '{font}': {notfounds}." + wmsg += '\nType "vedo -r fonts" for a demo.' vedo.logger.warning(wmsg) bb = tpoly.GetBounds() @@ -4402,24 +4405,25 @@ def _get_text3d_poly( if "left" in justify: shift += np.array([ dx, 0, 0.]) if "right" in justify: shift += np.array([-dx, 0, 0.]) - t = vtk.vtkTransform() - t.PostMultiply() - t.Scale(s, s, s) - t.Translate(shift) - tf = vtk.new("TransformPolyDataFilter") - tf.SetInputData(tpoly) - tf.SetTransform(t) - tf.Update() - tpoly = tf.GetOutput() - - if depth: - extrude = vtk.new("LinearExtrusionFilter") - extrude.SetInputData(tpoly) - extrude.SetExtrusionTypeToVectorExtrusion() - extrude.SetVector(0, 0, 1) - extrude.SetScaleFactor(depth * dy) - extrude.Update() - tpoly = extrude.GetOutput() + if tpoly.GetNumberOfPoints(): + t = vtk.vtkTransform() + t.PostMultiply() + t.Scale(s, s, s) + t.Translate(shift) + tf = vtk.new("TransformPolyDataFilter") + tf.SetInputData(tpoly) + tf.SetTransform(t) + tf.Update() + tpoly = tf.GetOutput() + + if depth: + extrude = vtk.new("LinearExtrusionFilter") + extrude.SetInputData(tpoly) + extrude.SetExtrusionTypeToVectorExtrusion() + extrude.SetVector(0, 0, 1) + extrude.SetScaleFactor(depth * dy) + extrude.Update() + tpoly = extrude.GetOutput() return tpoly From fc22b34b9ab9d1fb6336567eb30c88bf7997ea75 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 18:22:15 +0100 Subject: [PATCH 228/251] passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input --- docs/changes.md | 2 ++ examples/advanced/warp4b.py | 5 +++-- vedo/plotter.py | 20 +++++++++----------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 900b1309..cd0b0236 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -44,6 +44,8 @@ see `examples/pyplot/embed_matplotlib.py`. - `Slicer2DPlotter` moved to application module - `mesh.is_inside(pt)` moved to `mesh.contains(pt)` - added `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz +- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is +therefore not muted by any subsequent interaction (thanks @baba-yaga ) ------------------------- diff --git a/examples/advanced/warp4b.py b/examples/advanced/warp4b.py index f177aed7..fc63737f 100644 --- a/examples/advanced/warp4b.py +++ b/examples/advanced/warp4b.py @@ -93,8 +93,9 @@ def keypress(evt): plt.add_callback("keypress", keypress) plt.at(0).show(source, msg0, __doc__) plt.at(1).show(f"Reference {target.filename}", msg1, target) -cam1 = plt.camera # will share the same camera btw renderers 1 and 2 -plt.at(2).show("Morphing Output", ref, Axes(ref), camera=cam1, bg="k9") +cam1 = plt.camera # save camera at 1 +plt.at(2).show("Morphing Output", ref, Axes(ref), bg="k9") +plt.camera = cam1 # use the same camera of renderer1 plt.interactive() plt.close() diff --git a/vedo/plotter.py b/vedo/plotter.py index 4f84d189..70fa64fe 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3089,24 +3089,20 @@ def show( - viewup `(list)`, the view up direction for the camera - distance `(float)`, set the focal point to the specified distance from the camera position. - clipping_range `(float)`, distance of the near and far clipping planes along the direction of projection. - - parallel_scale `(float)`, - scaling used for a parallel projection, i.e. the height of the viewport - in world-coordinate distances. The default is 1. Note that the "scale" parameter works as - an "inverse scale", larger numbers produce smaller images. + - parallel_scale `(float)`, scaling used for a parallel projection, i.e. the height of the viewport + in world-coordinate distances. The default is 1. + Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - - thickness `(float)`, - set the distance between clipping planes. This method adjusts the far clipping + - thickness `(float)`, set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - - view_angle `(float)`, - the camera view angle, which is the angular height of the camera view + - view_angle `(float)`, the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow - (measured by holding a ruler up to your screen) and d is the distance - from your eyes to the screen. + (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. interactive : (bool) pause and interact with window (True) or continue execution (False) @@ -3206,7 +3202,9 @@ def show( if camera is not None: self.resetcam = False if isinstance(camera, vtk.vtkCamera): - self.camera = camera + cameracopy = vtk.vtkCamera() + cameracopy.DeepCopy(camera) + self.camera = cameracopy else: self.camera = utils.camera_from_dict(camera) if self.renderer: From 15ddbd6e38502101b967e18e4e78f92311eac406 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 20:05:33 +0100 Subject: [PATCH 229/251] improve of event.__str__ --- docs/changes.md | 7 +++++++ examples/basic/mouseclick.py | 2 +- vedo/plotter.py | 31 +++++++++++++++++++------------ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index cd0b0236..fd9edfae 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -80,5 +80,12 @@ markpoint.py plot_spheric.py ``` +broken in npz dump: +boundaries.py +examples/basic/cartoony.py + + + + test offline screenshot - multiblock instead of npy \ No newline at end of file diff --git a/examples/basic/mouseclick.py b/examples/basic/mouseclick.py index 238e909e..a519758d 100644 --- a/examples/basic/mouseclick.py +++ b/examples/basic/mouseclick.py @@ -9,7 +9,7 @@ def on_left_click(event): if not event.object: return printc("Left button pressed on", [event.object], c=event.object.color()) - # printc('Full dump of Event:', event) + printc(event) # dump the full event info def on_drag(event): printc(event.name, 'happened at mouse position', event.picked2d) diff --git a/vedo/plotter.py b/vedo/plotter.py index 70fa64fe..b44b8c90 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -68,18 +68,25 @@ def __setitem__(self, key, value): """Make the class work like a dictionary too""" setattr(self, key, value) - def __repr__(self): - f = "---------- ----------\n" + def __str__(self): + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(id(self))})".ljust(75), + bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m" for n in self.__slots__: - if n == "object" and self.object: - if self.object.name: - f += f"event.{n} = {self.object.name}\n" - else: - f += f"event.{n} = {self.object.__class__.__name__} \n" - else: - f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" - - return f + if n == "actor": + continue + out += f"{n}".ljust(11) + ": " + val = str(self[n]).replace("\n", "")[:65].rstrip() + if val == "True": + out += "\x1b[32;1m" + elif val == "False": + out += "\x1b[31;1m" + out += val + "\x1b[0m\n" + return out.rstrip() def keys(self): return self.__slots__ @@ -785,7 +792,7 @@ def __str__(self): name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(id(self))})".ljust(75), - c="w", bold=True, invert=True, return_string=True, + bold=True, invert=True, return_string=True, ) out += "\x1b[0m" if self.interactor: From 5bf762ce03a73e9deba7cd8ab6a3b3a72001d61d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Thu, 9 Nov 2023 22:40:49 +0100 Subject: [PATCH 230/251] add Roll, fix Lines in numpy dump --- docs/changes.md | 3 +- vedo/file_io.py | 761 ++++++++++++++++++++++++------------------------ vedo/plotter.py | 9 +- vedo/utils.py | 206 +++++++------ 4 files changed, 501 insertions(+), 478 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index fd9edfae..2612785b 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -27,6 +27,7 @@ see `examples/pyplot/embed_matplotlib.py`. add `move()` to move single points or objects - add `copy()` as alias to `clone()` - remove `file_io.load_transform()` LinearTransform("file.mat") substitutes this +- add "Roll" to camera settings (thanks @baba-yaga ) ### Breaking changes @@ -83,7 +84,7 @@ plot_spheric.py broken in npz dump: boundaries.py examples/basic/cartoony.py - +color_mesh_cells2.py diff --git a/vedo/file_io.py b/vedo/file_io.py index ad52d6ae..79c0f3f1 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -791,7 +791,7 @@ def loadPCD(filename): ######################################################################### def _from_numpy(d): - + # recreate a mesh from numpy arrays keys = d.keys() vertices = d["points"] @@ -802,72 +802,57 @@ def _from_numpy(d): msh = Mesh([vertices, cells, lines]) - prp = msh.properties - if 'ambient' in keys: prp.SetAmbient(d['ambient']) - if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) - if 'specular' in keys: prp.SetSpecular(d['specular']) - if 'specularpower' in keys: prp.SetSpecularPower(d['specularpower']) - if 'specularcolor' in keys: prp.SetSpecularColor(d['specularcolor']) - if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) - if 'shading' in keys: prp.SetInterpolation(d['shading']) - if 'alpha' in keys: prp.SetOpacity(d['alpha']) - if 'representation' in keys: prp.SetRepresentation(d['representation']) - if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) - if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) - if 'linecolor' in keys and d['linecolor']: msh.linecolor(d['linecolor']) - if 'color' in keys and d['color'] is not None: - msh.color(d['color']) - if 'backcolor' in keys and d['backcolor'] is not None: - msh.backcolor(d['backcolor']) - - # print("XXXXX n", - # msh.dataset.GetNumberOfPoints(), - # msh.dataset.GetNumberOfCells(), - # msh.dataset.GetNumberOfLines(), - # msh.dataset.GetNumberOfPolys(), - # msh.dataset.GetNumberOfStrips(), - # msh.dataset.GetNumberOfVerts(), - # ) - if "celldata" in keys and isinstance(d["celldata"], dict): for arrname, arr in d["celldata"].items(): msh.celldata[arrname] = arr if "pointdata" in keys and isinstance(d["pointdata"], dict): for arrname, arr in d["pointdata"].items(): msh.pointdata[arrname] = arr + if "metadata" in keys and isinstance(d["metadata"], dict): + for arrname, arr in d["metadata"].items(): + msh.metadata[arrname] = arr - # print(msh) - - msh.mapper.ScalarVisibilityOff() - if "LUT" in keys and "activedata" in keys and d["activedata"]: - lut_list = d["LUT"] - ncols = len(lut_list) - lut = vtk.vtkLookupTable() - lut.SetNumberOfTableValues(ncols) - lut.SetRange(d["LUT_range"]) - for i in range(ncols): - r, g, b, a = lut_list[i] - lut.SetTableValue(i, r, g, b, a) - lut.Build() - msh.mapper.SetLookupTable(lut) - msh.mapper.ScalarVisibilityOn() # activate scalars - msh.mapper.SetScalarRange(d["LUT_range"]) - if d["activedata"][0] == "celldata": - msh.dataset.GetCellData().SetActiveScalars(d["activedata"][1]) - # msh.celldata.select(d["activedata"][1]) - if d["activedata"][0] == "pointdata": - msh.dataset.GetPointData().SetActiveScalars(d["activedata"][1]) - # msh.pointdata.select(d["activedata"][1]) - - # print("shading", int(d["shading"]),d["scalarvisibility"], d["activedata"][1]) - if "shading" in keys and int(d["shading"]) > 0: - msh.compute_normals(cells=0) # otherwise cannot renderer phong - - if "scalarvisibility" in keys: - if d["scalarvisibility"]: - msh.mapper.ScalarVisibilityOn() - else: - msh.mapper.ScalarVisibilityOff() + prp = msh.properties + prp.SetAmbient(d['ambient']) + prp.SetDiffuse(d['diffuse']) + prp.SetSpecular(d['specular']) + prp.SetSpecularPower(d['specularpower']) + prp.SetSpecularColor(d['specularcolor']) + prp.SetLighting(d['lighting_is_on']) + prp.SetInterpolation(0) + # prp.SetInterpolation(d['shading']) + prp.SetOpacity(d['alpha']) + prp.SetRepresentation(d['representation']) + prp.SetPointSize(d['pointsize']) + if d['linewidth'] is not None: msh.linewidth(d['linewidth']) + if d['linecolor'] is not None: msh.linecolor(d['linecolor']) + if d['color'] is not None: msh.color(d['color']) + if d['backcolor'] is not None: msh.backcolor(d['backcolor']) + + lut_list = d["LUT"] + lut_range = d["LUT_range"] + ncols = len(lut_list) + lut = vtk.vtkLookupTable() + lut.SetNumberOfTableValues(ncols) + lut.SetRange(lut_range) + for i in range(ncols): + r, g, b, a = lut_list[i] + lut.SetTableValue(i, r, g, b, a) + lut.Build() + msh.mapper.SetLookupTable(lut) + msh.mapper.SetScalarRange(lut_range) + + try: # NEW in vedo 5.0 + msh.mapper.SetScalarMode(d["scalar_mode"]) + msh.mapper.SetArrayName(d["array_name_to_color_by"]) + msh.mapper.SetColorMode(d["color_mode"]) + msh.mapper.SetInterpolateScalarsBeforeMapping( + d["interpolate_scalars_before_mapping"]) + msh.mapper.SetUseLookupTableScalarRange(d["use_lookup_table_scalar_range"]) + msh.mapper.SetScalarRange(d["scalar_range"]) + msh.mapper.SetScalarVisibility(d["scalar_visibility"]) + except KeyError: + pass if "time" in keys: msh.time = d["time"] if "name" in keys: msh.name = d["name"] @@ -878,7 +863,7 @@ def _from_numpy(d): ############################################################################# def _import_npy(fileinput): """Import a vedo scene from numpy format.""" - # make sure the numpy file is not containing a scene + fileinput = download(fileinput, verbose=False, force=True) if fileinput.endswith(".npy"): data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] @@ -924,7 +909,7 @@ def _import_npy(fileinput): if cam: if "pos" in cam.keys(): plt.camera.SetPosition(cam["pos"]) - if "focalPoint" in cam.keys(): + if "focalPoint" in cam.keys(): # obsolete plt.camera.SetFocalPoint(cam["focalPoint"]) if "focal_point" in cam.keys(): plt.camera.SetFocalPoint(cam["focal_point"]) @@ -932,7 +917,7 @@ def _import_npy(fileinput): plt.camera.SetViewUp(cam["viewup"]) if "distance" in cam.keys(): plt.camera.SetDistance(cam["distance"]) - if "clippingRange" in cam.keys(): + if "clippingRange" in cam.keys(): # obsolete plt.camera.SetClippingRange(cam["clippingRange"]) if "clipping_range" in cam.keys(): plt.camera.SetClippingRange(cam["clipping_range"]) @@ -940,14 +925,6 @@ def _import_npy(fileinput): plt.camera.SetParallelScale(cam["parallel_scale"]) plt.resetcam = False - ########################## - # def _load_common(obj, d): - # keys = d.keys() - # if "time" in keys: obj.time = d["time"] - # if "name" in keys: obj.name = d["name"] - # if "info" in keys: obj.info = d["info"] - # if "filename" in keys: obj.filename = d["filename"] - ############################################## objs = [] for d in data["objects"]: @@ -1017,91 +994,91 @@ def _import_npy(fileinput): return plt ########################################################### -def _import_hdf5(fileinput): - try: - import h5py - except ImportError as e: - vedo.logger.error(f"{e}. Try: 'pip install h5py'") - return - hfile = h5py.File(fileinput, "r") - - scene = hfile["scene"] - - settings.use_depth_peeling = scene["use_depth_peeling"][()] - settings.render_lines_as_tubes = scene["render_lines_as_tubes"][()] - settings.hidden_line_removal = scene["hidden_line_removal"][()] - settings.use_parallel_projection = scene["use_parallel_projection"][()] - settings.default_font = scene["default_font"][()].decode("utf-8") - - plt = vedo.Plotter( - pos=scene["position"][()], - size=scene["size"][()], - axes=scene["axes"][()], - title=scene["title"][()].decode("utf-8"), - bg=scene["background_color"][()], - bg2=scene["background_color2"][()], - ) +# def _import_hdf5(fileinput): +# try: +# import h5py +# except ImportError as e: +# vedo.logger.error(f"{e}. Try: 'pip install h5py'") +# return +# hfile = h5py.File(fileinput, "r") + +# scene = hfile["scene"] + +# settings.use_depth_peeling = scene["use_depth_peeling"][()] +# settings.render_lines_as_tubes = scene["render_lines_as_tubes"][()] +# settings.hidden_line_removal = scene["hidden_line_removal"][()] +# settings.use_parallel_projection = scene["use_parallel_projection"][()] +# settings.default_font = scene["default_font"][()].decode("utf-8") + +# plt = vedo.Plotter( +# pos=scene["position"][()], +# size=scene["size"][()], +# axes=scene["axes"][()], +# title=scene["title"][()].decode("utf-8"), +# bg=scene["background_color"][()], +# bg2=scene["background_color2"][()], +# ) - objects = scene["objects"] - - for name, hob in objects.items(): - - if hob["type"][()].decode("utf-8") == 'Mesh': - # print(name, hob, hob["type"][()]) - - dataset = hob["dataset"] - props = hob["properties"] - - vertices = dataset["points"][()] - cells = dataset["cells"][()] - lines = dataset["lines"][()] - - msh = Mesh([vertices, cells, lines]) - msh.name = hob["name"][()].decode("utf-8") - # msh.info = hob["info"] - msh.filename = hob["filename"][()].decode("utf-8") - msh.transform = vedo.LinearTransform(dataset["transform"][()]) - - msh.properties.SetRepresentation(props["representation"][()]) - msh.properties.SetPointSize(props["pointsize"][()]) - - msh.properties.SetEdgeVisibility(props["linewidth"][()]>0) - if props["linewidth"][()]: - msh.linewidth(props["linewidth"][()]) - msh.properties.SetEdgeColor(props["linecolor"][()]) - - msh.properties.SetAmbient(props["ambient"][()]) - msh.properties.SetDiffuse(props["diffuse"][()]) - msh.properties.SetSpecular(props["specular"][()]) - msh.properties.SetSpecularPower(props["specularpower"][()]) - msh.properties.SetSpecularColor(props["specularcolor"][()]) - msh.properties.SetInterpolation(props["shading"][()]) # flat, phong - msh.properties.SetColor(props["color"][()]) - msh.properties.SetOpacity(props["alpha"][()]) - msh.properties.SetLighting(props["lighting_is_on"][()]) - if props["backcolor"][()]: - bfp = msh.actor.GetBackfaceProperty() - bfp.SetColor(props["backcolor"][()]) - msh.mapper.SetScalarVisibility(props["scalar_visibility"][()]) - - plt.add(msh) - - cam = scene["camera"] - if cam: - if "pos" in cam.keys(): - plt.camera.SetPosition(cam["pos"][()]) - if "focal_point" in cam.keys(): - plt.camera.SetFocalPoint(cam["focal_point"][()]) - if "viewup" in cam.keys(): - plt.camera.SetViewUp(cam["viewup"][()]) - if "distance" in cam.keys(): - plt.camera.SetDistance(cam["distance"][()]) - if "clipping_range" in cam.keys(): - plt.camera.SetClippingRange(cam["clipping_range"][()]) - plt.resetcam = False - - hfile.close() - return plt +# objects = scene["objects"] + +# for name, hob in objects.items(): + +# if hob["type"][()].decode("utf-8") == 'Mesh': +# # print(name, hob, hob["type"][()]) + +# dataset = hob["dataset"] +# props = hob["properties"] + +# vertices = dataset["points"][()] +# cells = dataset["cells"][()] +# lines = dataset["lines"][()] + +# msh = Mesh([vertices, cells, lines]) +# msh.name = hob["name"][()].decode("utf-8") +# # msh.info = hob["info"] +# msh.filename = hob["filename"][()].decode("utf-8") +# msh.transform = vedo.LinearTransform(dataset["transform"][()]) + +# msh.properties.SetRepresentation(props["representation"][()]) +# msh.properties.SetPointSize(props["pointsize"][()]) + +# msh.properties.SetEdgeVisibility(props["linewidth"][()]>0) +# if props["linewidth"][()]: +# msh.linewidth(props["linewidth"][()]) +# msh.properties.SetEdgeColor(props["linecolor"][()]) + +# msh.properties.SetAmbient(props["ambient"][()]) +# msh.properties.SetDiffuse(props["diffuse"][()]) +# msh.properties.SetSpecular(props["specular"][()]) +# msh.properties.SetSpecularPower(props["specularpower"][()]) +# msh.properties.SetSpecularColor(props["specularcolor"][()]) +# msh.properties.SetInterpolation(props["shading"][()]) # flat, phong +# msh.properties.SetColor(props["color"][()]) +# msh.properties.SetOpacity(props["alpha"][()]) +# msh.properties.SetLighting(props["lighting_is_on"][()]) +# if props["backcolor"][()]: +# bfp = msh.actor.GetBackfaceProperty() +# bfp.SetColor(props["backcolor"][()]) +# msh.mapper.SetScalarVisibility(props["scalar_visibility"][()]) + +# plt.add(msh) + +# cam = scene["camera"] +# if cam: +# if "pos" in cam.keys(): +# plt.camera.SetPosition(cam["pos"][()]) +# if "focal_point" in cam.keys(): +# plt.camera.SetFocalPoint(cam["focal_point"][()]) +# if "viewup" in cam.keys(): +# plt.camera.SetViewUp(cam["viewup"][()]) +# if "distance" in cam.keys(): +# plt.camera.SetDistance(cam["distance"][()]) +# if "clipping_range" in cam.keys(): +# plt.camera.SetClippingRange(cam["clipping_range"][()]) +# plt.resetcam = False + +# hfile.close() +# return plt ########################################################### @@ -1392,7 +1369,6 @@ def _fillcommon(obj, adict): adict["rendered_at"] = obj.rendered_at adict["position"] = obj.pos() adict["info"] = obj.info - try: adict["transform"] = obj.transform.matrix except AttributeError: @@ -1401,6 +1377,8 @@ def _fillcommon(obj, adict): ######################################################## def _fillmesh(obj, adict): poly = obj.dataset + mapper = obj.mapper + adict["points"] = obj.vertices.astype(float) adict["cells"] = None @@ -1410,7 +1388,6 @@ def _fillmesh(obj, adict): adict["lines"] = None if poly.GetNumberOfLines(): adict["lines"] = obj.lines#_as_flat_array - # print("adict[lines]", adict["lines"]) adict["pointdata"] = {} for iname in obj.pointdata.keys(): @@ -1423,16 +1400,26 @@ def _fillmesh(obj, adict): if "normals" in iname.lower(): continue adict["celldata"][iname] = obj.celldata[iname] - - adict["activedata"] = None - if poly.GetPointData().GetScalars(): - adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] - elif poly.GetCellData().GetScalars(): - adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] + + adict["metadata"] = {} + for iname in obj.metadata.keys(): + adict["metadata"][iname] = obj.metadata[iname] + + # NEW in vedo 5.0 + adict["scalar_mode"] = mapper.GetScalarMode() + adict["array_name_to_color_by"] = mapper.GetArrayName() + adict["color_mode"] = mapper.GetColorMode() + adict["interpolate_scalars_before_mapping"] = mapper.GetInterpolateScalarsBeforeMapping() + adict["use_lookup_table_scalar_range"] = mapper.GetUseLookupTableScalarRange() + adict["scalar_range"] = mapper.GetScalarRange() + adict["scalar_visibility"] = mapper.GetScalarVisibility() + # adict["color_map_colors"] = mapper.GetColorMapColors() #vtkUnsignedCharArray + # adict["color_coordinates"] = mapper.GetColorCoordinates() #vtkFloatArray + # adict["color_texture_map"] = mapper.GetColorTextureMap() #vtkImageData adict["LUT"] = None adict["LUT_range"] = None - lut = obj.mapper.GetLookupTable() + lut = mapper.GetLookupTable() if lut: nlut = lut.GetNumberOfTableValues() lutvals = [] @@ -1465,9 +1452,7 @@ def _fillmesh(obj, adict): if obj.actor.GetBackfaceProperty(): adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() - adict["scalarvisibility"] = obj.mapper.GetScalarVisibility() - - ##################################################################### + ####################################################################### try: obj = act.retrieve_object() except AttributeError: @@ -1587,228 +1572,228 @@ def _export_npy(plt, fileoutput="scene.npz"): np.save(fileoutput, [sdict]) ######################################################################### -def _export_hdf5(plt, fileoutput="scene.h5"): - try: - import h5py - except ImportError as e: - vedo.logger.error(f"{e}. Try: 'pip install h5py'") - return +# def _export_hdf5(plt, fileoutput="scene.h5"): +# try: +# import h5py +# except ImportError as e: +# vedo.logger.error(f"{e}. Try: 'pip install h5py'") +# return - hfile = h5py.File(fileoutput, "w") - - scene = hfile.create_group("scene") - - scene["shape"] = plt.shape - scene["sharecam"] = plt.sharecam - - camera = scene.create_group("camera") - cdict = dict( - pos=plt.camera.GetPosition(), - focal_point=plt.camera.GetFocalPoint(), - viewup=plt.camera.GetViewUp(), - distance=plt.camera.GetDistance(), - clipping_range=plt.camera.GetClippingRange(), - ) - camera.attrs.update(cdict) - - scene["position"] = plt.pos - scene["size"] = plt.size - scene["axes"] = plt.axes if plt.axes else "" - scene["title"] = str(plt.title) - scene["background_color"] = colors.get_color(plt.renderer.GetBackground()) - if plt.renderer.GetGradientBackground(): - scene["background_color2"] = plt.renderer.GetBackground2() - else: - scene["background_color2"] = "" - scene["use_depth_peeling"] = settings.use_depth_peeling - scene["render_lines_as_tubes"] = settings.render_lines_as_tubes - scene["hidden_line_removal"] = settings.hidden_line_removal - scene["use_parallel_projection"] = plt.camera.GetParallelProjection() - scene["default_font"] = settings.default_font - - onscreen = [] - for a in plt.get_actors(): - onscreen.append(a.retrieve_object()) - - vobjs = [] - for i, vob in enumerate(set(plt.objects + onscreen)): - if isinstance(vob, str): - vobjs.append(vedo.Text2D(vob)) - elif not vob.actor.GetVisibility(): - continue - elif not hasattr(vob, "name"): - continue - elif isinstance(vob, Assembly): - vobjs += vob.recursive_unpack() - else: - vobjs.append(vob) - - objects = scene.create_group("objects") - for i, vob in enumerate(set(vobjs)): - - cname = vob.__class__.__name__ - hmesh = objects.create_group(f"{cname}_{vob.name}_{i}") - hmesh["type"] = "Mesh" if vob.ncells else "Points" - - hmesh["filename"] = vob.filename - hmesh["name"] = vob.name - hmesh["time"] = vob.time - hmesh["rendered_at"] = list(vob.rendered_at) - - info = hmesh.create_group("info") - info.attrs.update(vob.info) - - props = hmesh.create_group("properties") - - dataset = hmesh.create_group("dataset") - - copt = dict(compression="gzip", compression_opts=9) - dataset.create_dataset("points", data=vob.vertices, dtype=np.float32, **copt) - - cells = np.array([]) - try: - cells = vob.cells_as_flat_array - if vob.nvertices < 256: #careful, vertices not cells! - dataset.create_dataset("cells", data=cells, dtype=np.uint8, **copt) - elif vob.nvertices < 65535: #careful, vertices not cells! - dataset.create_dataset("cells", data=cells, dtype=np.uint16, **copt) - else: - dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) - except AttributeError as e: - print("cells fails for", e) - pass - dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) - - lns = np.array([]) - try: - if vob.dataset.GetNumberOfLines(): - lns = vob.lines_as_flat_array - except AttributeError as e: - print("lines fails for", e) - pass - dataset.create_dataset("lines", data=lns, dtype=np.uint32, **copt) - - ######################################################## Points-Mesh - try: - dataset.create_dataset("transform", data=vob.transform.matrix) - except AttributeError: - dataset.create_dataset("transform", data=np.eye(4)) - - try: - dataset.create_group("pointdata") - for key in vob.pointdata.keys(): - if "Normals" in key: - continue - dataset["pointdata"].create_dataset(key, data=vob.pointdata[key]) - dataset.create_group("celldata") - for key in vob.celldata.keys(): - if "Normals" in key: - continue - dataset["celldata"].create_dataset(key, data=vob.celldata[key]) - dataset.create_group("metadata") - for key in vob.metadata.keys(): - dataset["metadata"].create_dataset(key, data=vob.metadata[key]) - - v = vob.dataset.GetPointData().GetScalars() - dataset["pointdata"]["active_scalars"] = v.GetName() if v else "" - v = vob.dataset.GetPointData().GetVectors() - dataset["pointdata"]["active_vectors"] = v.GetName() if v else "" - v = vob.dataset.GetPointData().GetTensors() - dataset["pointdata"]["active_tensors"] = v.GetName() if v else "" - - v = vob.dataset.GetCellData().GetScalars() - dataset["celldata"]["active_scalars"] = v.GetName() if v else "" - v = vob.dataset.GetCellData().GetVectors() - dataset["celldata"]["active_vectors"] = v.GetName() if v else "" - v = vob.dataset.GetCellData().GetTensors() - dataset["celldata"]["active_tensors"] = v.GetName() if v else "" - - except AttributeError as e: - # print("pointcelldata fails for", e) - pass - - try: - lut = vob.mapper.GetLookupTable() - if lut: - nlut = lut.GetNumberOfTableValues() - lutvals = [] - for i in range(nlut): - v4 = lut.GetTableValue(i) # r, g, b, alpha - lutvals.append(v4) - props["lut"] = lutvals - props["lut_range"] = lut.GetRange() - else: - props["lut"] = None - props["lut_range"] = None - - props["representation"] = vob.properties.GetRepresentation() - props["pointsize"] = vob.properties.GetPointSize() - - evis = vob.properties.GetEdgeVisibility() - props["linewidth"] = vob.linewidth() if evis else 0 - props["linecolor"] = vob.properties.GetEdgeColor() if evis else "" - - props["ambient"] = vob.properties.GetAmbient() - props["diffuse"] = vob.properties.GetDiffuse() - props["specular"] = vob.properties.GetSpecular() - props["specularpower"] = vob.properties.GetSpecularPower() - props["specularcolor"] = vob.properties.GetSpecularColor() - props["shading"] = vob.properties.GetInterpolation() # flat, phong - props["color"] = vob.properties.GetColor() - props["alpha"] = vob.properties.GetOpacity() - props["lighting_is_on"] = vob.properties.GetLighting() - bfp = vob.actor.GetBackfaceProperty() - props["backcolor"] = bfp.GetColor() if bfp else "" - props["scalar_visibility"] = vob.mapper.GetScalarVisibility() - - except AttributeError: - pass - - ######################################################## Volume - if isinstance(vob, vedo.Volume): - try: - # arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) - # arr = arr.reshape(vob.dataset.GetDimensions()) - # dataset.create_dataset("array", data=arr) - ctf = vob.properties.GetRGBTransferFunction() - otf = vob.properties.GetScalarOpacity() - gotf = vob.properties.GetGradientOpacity() - smin, smax = ctf.GetRange() - xs = np.linspace(smin, smax, num=100, endpoint=True) - cols, als, algrs = [], [], [] - for x in xs: - cols.append(ctf.GetColor(x)) - als.append(otf.GetValue(x)) - if gotf: - algrs.append(gotf.GetValue(x)) - props["color"] = cols - props["alpha"] = als - props["alphagrad"] = algrs - props["mode"] = vob.mode() - except AttributeError as e: - # print("vol fails for", e) - pass - - ######################################################## Image - if isinstance(vob, vedo.Image): - try: - dataset["array"] = vob.tonumpy() - except AttributeError as e: - # print("img fails for", e) - pass - - ######################################################## Text2D - if isinstance(vob, vedo.Text2D): - props["text"] = vob.text() - props["position"] = vob.GetPosition() - props["color"] = vob.properties.GetColor() - props["font"] = vob.fontname - props["size"] = vob.properties.GetFontSize() / 22.5 - props["bgcol"] = vob.properties.GetBackgroundColor() - props["alpha"] = vob.properties.GetBackgroundOpacity() - props["frame"] = vob.properties.GetFrame() - - hfile.close() +# hfile = h5py.File(fileoutput, "w") + +# scene = hfile.create_group("scene") + +# scene["shape"] = plt.shape +# scene["sharecam"] = plt.sharecam + +# camera = scene.create_group("camera") +# cdict = dict( +# pos=plt.camera.GetPosition(), +# focal_point=plt.camera.GetFocalPoint(), +# viewup=plt.camera.GetViewUp(), +# distance=plt.camera.GetDistance(), +# clipping_range=plt.camera.GetClippingRange(), +# ) +# camera.attrs.update(cdict) + +# scene["position"] = plt.pos +# scene["size"] = plt.size +# scene["axes"] = plt.axes if plt.axes else "" +# scene["title"] = str(plt.title) +# scene["background_color"] = colors.get_color(plt.renderer.GetBackground()) +# if plt.renderer.GetGradientBackground(): +# scene["background_color2"] = plt.renderer.GetBackground2() +# else: +# scene["background_color2"] = "" +# scene["use_depth_peeling"] = settings.use_depth_peeling +# scene["render_lines_as_tubes"] = settings.render_lines_as_tubes +# scene["hidden_line_removal"] = settings.hidden_line_removal +# scene["use_parallel_projection"] = plt.camera.GetParallelProjection() +# scene["default_font"] = settings.default_font + +# onscreen = [] +# for a in plt.get_actors(): +# onscreen.append(a.retrieve_object()) + +# vobjs = [] +# for i, vob in enumerate(set(plt.objects + onscreen)): +# if isinstance(vob, str): +# vobjs.append(vedo.Text2D(vob)) +# elif not vob.actor.GetVisibility(): +# continue +# elif not hasattr(vob, "name"): +# continue +# elif isinstance(vob, Assembly): +# vobjs += vob.recursive_unpack() +# else: +# vobjs.append(vob) + +# objects = scene.create_group("objects") +# for i, vob in enumerate(set(vobjs)): + +# cname = vob.__class__.__name__ +# hmesh = objects.create_group(f"{cname}_{vob.name}_{i}") +# hmesh["type"] = "Mesh" if vob.ncells else "Points" + +# hmesh["filename"] = vob.filename +# hmesh["name"] = vob.name +# hmesh["time"] = vob.time +# hmesh["rendered_at"] = list(vob.rendered_at) + +# info = hmesh.create_group("info") +# info.attrs.update(vob.info) + +# props = hmesh.create_group("properties") + +# dataset = hmesh.create_group("dataset") + +# copt = dict(compression="gzip", compression_opts=9) +# dataset.create_dataset("points", data=vob.vertices, dtype=np.float32, **copt) + +# cells = np.array([]) +# try: +# cells = vob.cells_as_flat_array +# if vob.nvertices < 256: #careful, vertices not cells! +# dataset.create_dataset("cells", data=cells, dtype=np.uint8, **copt) +# elif vob.nvertices < 65535: #careful, vertices not cells! +# dataset.create_dataset("cells", data=cells, dtype=np.uint16, **copt) +# else: +# dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) +# except AttributeError as e: +# print("cells fails for", e) +# pass +# dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) + +# lns = np.array([]) +# try: +# if vob.dataset.GetNumberOfLines(): +# lns = vob.lines_as_flat_array +# except AttributeError as e: +# print("lines fails for", e) +# pass +# dataset.create_dataset("lines", data=lns, dtype=np.uint32, **copt) + +# ######################################################## Points-Mesh +# try: +# dataset.create_dataset("transform", data=vob.transform.matrix) +# except AttributeError: +# dataset.create_dataset("transform", data=np.eye(4)) + +# try: +# dataset.create_group("pointdata") +# for key in vob.pointdata.keys(): +# if "Normals" in key: +# continue +# dataset["pointdata"].create_dataset(key, data=vob.pointdata[key]) +# dataset.create_group("celldata") +# for key in vob.celldata.keys(): +# if "Normals" in key: +# continue +# dataset["celldata"].create_dataset(key, data=vob.celldata[key]) +# dataset.create_group("metadata") +# for key in vob.metadata.keys(): +# dataset["metadata"].create_dataset(key, data=vob.metadata[key]) + +# v = vob.dataset.GetPointData().GetScalars() +# dataset["pointdata"]["active_scalars"] = v.GetName() if v else "" +# v = vob.dataset.GetPointData().GetVectors() +# dataset["pointdata"]["active_vectors"] = v.GetName() if v else "" +# v = vob.dataset.GetPointData().GetTensors() +# dataset["pointdata"]["active_tensors"] = v.GetName() if v else "" + +# v = vob.dataset.GetCellData().GetScalars() +# dataset["celldata"]["active_scalars"] = v.GetName() if v else "" +# v = vob.dataset.GetCellData().GetVectors() +# dataset["celldata"]["active_vectors"] = v.GetName() if v else "" +# v = vob.dataset.GetCellData().GetTensors() +# dataset["celldata"]["active_tensors"] = v.GetName() if v else "" + +# except AttributeError as e: +# # print("pointcelldata fails for", e) +# pass + +# try: +# lut = vob.mapper.GetLookupTable() +# if lut: +# nlut = lut.GetNumberOfTableValues() +# lutvals = [] +# for i in range(nlut): +# v4 = lut.GetTableValue(i) # r, g, b, alpha +# lutvals.append(v4) +# props["lut"] = lutvals +# props["lut_range"] = lut.GetRange() +# else: +# props["lut"] = None +# props["lut_range"] = None + +# props["representation"] = vob.properties.GetRepresentation() +# props["pointsize"] = vob.properties.GetPointSize() + +# evis = vob.properties.GetEdgeVisibility() +# props["linewidth"] = vob.linewidth() if evis else 0 +# props["linecolor"] = vob.properties.GetEdgeColor() if evis else "" + +# props["ambient"] = vob.properties.GetAmbient() +# props["diffuse"] = vob.properties.GetDiffuse() +# props["specular"] = vob.properties.GetSpecular() +# props["specularpower"] = vob.properties.GetSpecularPower() +# props["specularcolor"] = vob.properties.GetSpecularColor() +# props["shading"] = vob.properties.GetInterpolation() # flat, phong +# props["color"] = vob.properties.GetColor() +# props["alpha"] = vob.properties.GetOpacity() +# props["lighting_is_on"] = vob.properties.GetLighting() +# bfp = vob.actor.GetBackfaceProperty() +# props["backcolor"] = bfp.GetColor() if bfp else "" +# props["scalar_visibility"] = vob.mapper.GetScalarVisibility() + +# except AttributeError: +# pass + +# ######################################################## Volume +# if isinstance(vob, vedo.Volume): +# try: +# # arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) +# # arr = arr.reshape(vob.dataset.GetDimensions()) +# # dataset.create_dataset("array", data=arr) +# ctf = vob.properties.GetRGBTransferFunction() +# otf = vob.properties.GetScalarOpacity() +# gotf = vob.properties.GetGradientOpacity() +# smin, smax = ctf.GetRange() +# xs = np.linspace(smin, smax, num=100, endpoint=True) +# cols, als, algrs = [], [], [] +# for x in xs: +# cols.append(ctf.GetColor(x)) +# als.append(otf.GetValue(x)) +# if gotf: +# algrs.append(gotf.GetValue(x)) +# props["color"] = cols +# props["alpha"] = als +# props["alphagrad"] = algrs +# props["mode"] = vob.mode() +# except AttributeError as e: +# # print("vol fails for", e) +# pass + +# ######################################################## Image +# if isinstance(vob, vedo.Image): +# try: +# dataset["array"] = vob.tonumpy() +# except AttributeError as e: +# # print("img fails for", e) +# pass + +# ######################################################## Text2D +# if isinstance(vob, vedo.Text2D): +# props["text"] = vob.text() +# props["position"] = vob.GetPosition() +# props["color"] = vob.properties.GetColor() +# props["font"] = vob.fontname +# props["size"] = vob.properties.GetFontSize() / 22.5 +# props["bgcol"] = vob.properties.GetBackgroundColor() +# props["alpha"] = vob.properties.GetBackgroundOpacity() +# props["frame"] = vob.properties.GetFrame() + +# hfile.close() ######################################################################## def import_window(fileinput, mtl_file=None, texture_path=None): diff --git a/vedo/plotter.py b/vedo/plotter.py index b44b8c90..b816029f 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2389,7 +2389,7 @@ def add_scale_indicator( pd.SetLines(lines) wsx, wsy = self.window.GetSize() - if not settings.use_parallel_projection: + if not self.camera.GetParallelProjection(): vedo.logger.warning("add_scale_indicator called with use_parallel_projection OFF. Skip.") return None @@ -4003,7 +4003,8 @@ def _keypress(self, iren, event): vedo.printc(" position=" + utils.precision(cam.GetPosition(), 6) + ",", c="y") vedo.printc(" focal_point=" + utils.precision(cam.GetFocalPoint(), 6) + ",", c="y") vedo.printc(" viewup=" + utils.precision(cam.GetViewUp(), 6) + ",", c="y") - if settings.use_parallel_projection: + vedo.printc(" roll=" + utils.precision(cam.GetRoll(), 6) + ",", c="y") + if cam.GetParallelProjection(): vedo.printc(' parallel_scale='+utils.precision(cam.GetParallelScale(),6)+',', c='y') else: vedo.printc(' distance=' +utils.precision(cam.GetDistance(),6)+',', c='y') @@ -4151,12 +4152,12 @@ def _keypress(self, iren, event): if isinstance(self.axes, dict): self.axes = 1 if key in ["minus", "KP_Subtract"]: - if not settings.use_parallel_projection and self.axes == 0: + if not self.camera.GetParallelProjection() and self.axes == 0: self.axes -= 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes - 1) % 15, c=None, bounds=bns) else: - if not settings.use_parallel_projection and self.axes == 12: + if not self.camera.GetParallelProjection() and self.axes == 12: self.axes += 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes + 1) % 15, c=None, bounds=bns) diff --git a/vedo/utils.py b/vedo/utils.py index 122333aa..395677f2 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -556,6 +556,9 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False - `vertices=[[x1,y1,z1],[x2,y2,z2], ...]` - `faces=[[0,1,2], [1,2,3], ...]` - `lines=[[0,1], [1,2,3,4], ...]` + + A flat list of faces can be passed as `faces=[3, 0,1,2, 4, 1,2,3,4, ...]`. + For lines use `lines=[2, 0,1, 4, 1,2,3,4, ...]`. Use `index_offset=1` if face numbering starts from 1 instead of 0. @@ -572,7 +575,6 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False return poly vertices = make3d(vertices) - source_points = vtk.vtkPoints() source_points.SetData(numpy2vtk(vertices, dtype=np.float32)) poly.SetPoints(source_points) @@ -591,7 +593,7 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False linesarr.InsertNextCell(vline) else: # assume format [id0,id1,...] # print("buildPolyData: assuming lines format [id0,id1,...]", lines) - # TODO CORRECT THIS CASE [2id0,id1,...] + # TODO CORRECT THIS CASE, MUST BE [2, id0,id1,...] for i in range(0, len(lines) - 1): vline = vtk.vtkLine() vline.GetPointIds().SetId(0, lines[i]) @@ -599,89 +601,96 @@ def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False linesarr.InsertNextCell(vline) poly.SetLines(linesarr) - if faces is None: + if faces is not None: + source_polygons = vtk.vtkCellArray() + if isinstance(faces, np.ndarray) or not is_ragged(faces): + ##### all faces are composed of equal nr of vtxs, FAST + faces = np.asarray(faces) + ast = np.int32 + if vtk.vtkIdTypeArray().GetDataTypeSize() != 4: + ast = np.int64 + + if faces.ndim > 1: + nf, nc = faces.shape + hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)) + else: + nf = faces.shape[0] + hs = faces + arr = numpy_to_vtkIdTypeArray(hs.astype(ast).ravel(), deep=True) + source_polygons.SetCells(nf, arr) + + else: + ############################# manually add faces, SLOW + for f in faces: + n = len(f) + + if n == 3: + ele = vtk.vtkTriangle() + pids = ele.GetPointIds() + for i in range(3): + pids.SetId(i, f[i] - index_offset) + source_polygons.InsertNextCell(ele) + + elif n == 4 and tetras: + ele0 = vtk.vtkTriangle() + ele1 = vtk.vtkTriangle() + ele2 = vtk.vtkTriangle() + ele3 = vtk.vtkTriangle() + if index_offset: + for i in [0, 1, 2, 3]: + f[i] -= index_offset + f0, f1, f2, f3 = f + pid0 = ele0.GetPointIds() + pid1 = ele1.GetPointIds() + pid2 = ele2.GetPointIds() + pid3 = ele3.GetPointIds() + + pid0.SetId(0, f0) + pid0.SetId(1, f1) + pid0.SetId(2, f2) + + pid1.SetId(0, f0) + pid1.SetId(1, f1) + pid1.SetId(2, f3) + + pid2.SetId(0, f1) + pid2.SetId(1, f2) + pid2.SetId(2, f3) + + pid3.SetId(0, f2) + pid3.SetId(1, f3) + pid3.SetId(2, f0) + + source_polygons.InsertNextCell(ele0) + source_polygons.InsertNextCell(ele1) + source_polygons.InsertNextCell(ele2) + source_polygons.InsertNextCell(ele3) + + else: + ele = vtk.vtkPolygon() + pids = ele.GetPointIds() + pids.SetNumberOfIds(n) + for i in range(n): + pids.SetId(i, f[i] - index_offset) + source_polygons.InsertNextCell(ele) + + poly.SetPolys(source_polygons) + + if faces is None and lines is None: source_vertices = vtk.vtkCellArray() for i in range(len(vertices)): source_vertices.InsertNextCell(1) source_vertices.InsertCellPoint(i) poly.SetVerts(source_vertices) - return poly ################### - - # faces exist - source_polygons = vtk.vtkCellArray() - - if isinstance(faces, np.ndarray) or not is_ragged(faces): - ##### all faces are composed of equal nr of vtxs, FAST - faces = np.asarray(faces) - ast = np.int32 - if vtk.vtkIdTypeArray().GetDataTypeSize() != 4: - ast = np.int64 - - if faces.ndim > 1: - nf, nc = faces.shape - hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)) - else: - nf = faces.shape[0] - hs = faces - arr = numpy_to_vtkIdTypeArray(hs.astype(ast).ravel(), deep=True) - source_polygons.SetCells(nf, arr) - else: - ############################# manually add faces, SLOW - for f in faces: - n = len(f) - - if n == 3: - ele = vtk.vtkTriangle() - pids = ele.GetPointIds() - for i in range(3): - pids.SetId(i, f[i] - index_offset) - source_polygons.InsertNextCell(ele) - - elif n == 4 and tetras: - ele0 = vtk.vtkTriangle() - ele1 = vtk.vtkTriangle() - ele2 = vtk.vtkTriangle() - ele3 = vtk.vtkTriangle() - if index_offset: - for i in [0, 1, 2, 3]: - f[i] -= index_offset - f0, f1, f2, f3 = f - pid0 = ele0.GetPointIds() - pid1 = ele1.GetPointIds() - pid2 = ele2.GetPointIds() - pid3 = ele3.GetPointIds() - - pid0.SetId(0, f0) - pid0.SetId(1, f1) - pid0.SetId(2, f2) - - pid1.SetId(0, f0) - pid1.SetId(1, f1) - pid1.SetId(2, f3) - - pid2.SetId(0, f1) - pid2.SetId(1, f2) - pid2.SetId(2, f3) - - pid3.SetId(0, f2) - pid3.SetId(1, f3) - pid3.SetId(2, f0) - - source_polygons.InsertNextCell(ele0) - source_polygons.InsertNextCell(ele1) - source_polygons.InsertNextCell(ele2) - source_polygons.InsertNextCell(ele3) - - else: - ele = vtk.vtkPolygon() - pids = ele.GetPointIds() - pids.SetNumberOfIds(n) - for i in range(n): - pids.SetId(i, f[i] - index_offset) - source_polygons.InsertNextCell(ele) - - poly.SetPolys(source_polygons) + # print("buildPolyData \n", + # poly.GetNumberOfPoints(), + # poly.GetNumberOfCells(), # grand total + # poly.GetNumberOfLines(), + # poly.GetNumberOfPolys(), + # poly.GetNumberOfStrips(), + # poly.GetNumberOfVerts(), + # ) return poly @@ -1727,7 +1736,30 @@ def oriented_camera(center=(0, 0, 0), up_vector=(0, 1, 0), backoff_vector=(0, 0, def camera_from_dict(camera, modify_inplace=None): """ - Generate a `vtkCamera` from a dictionary. + Generate a `vtkCamera` object from a python dictionary. + + Parameters of the camera are: + - `position` or `pos` (3-tuple) + - `focal_point` (3-tuple) + - `viewup` (3-tuple) + - `distance` (float) + - `clipping_range` (2-tuple) + - `parallel_scale` (float) + - `thickness` (float) + - `view_angle` (float) + - `roll` (float) + + Exaplanation of the parameters can be found in the + [vtkCamera documentation](https://vtk.org/doc/nightly/html/classvtkCamera.html). + + Arguments: + camera: (dict) + a python dictionary containing camera parameters. + modify_inplace: (vtkCamera) + an existing `vtkCamera` object to modify in place. + + Returns: + `vtk.vtkCamera`, a vtk camera setup that matches this state. """ if modify_inplace: vcam = modify_inplace @@ -1735,14 +1767,17 @@ def camera_from_dict(camera, modify_inplace=None): vcam = vtk.vtkCamera() camera = dict(camera) # make a copy so input is not emptied by pop() - cm_pos = camera.pop("position", camera.pop("pos", None)) + + cm_pos = camera.pop("position", camera.pop("pos", None)) cm_focal_point = camera.pop("focal_point", camera.pop("focalPoint", None)) - cm_viewup = camera.pop("viewup", None) - cm_distance = camera.pop("distance", None) + cm_viewup = camera.pop("viewup", None) + cm_distance = camera.pop("distance", None) cm_clipping_range = camera.pop("clipping_range", camera.pop("clippingRange", None)) cm_parallel_scale = camera.pop("parallel_scale", camera.pop("parallelScale", None)) - cm_thickness = camera.pop("thickness", None) - cm_view_angle = camera.pop("view_angle", camera.pop("viewAngle", None)) + cm_thickness = camera.pop("thickness", None) + cm_view_angle = camera.pop("view_angle", camera.pop("viewAngle", None)) + cm_roll = camera.pop("roll", None) + if len(camera.keys()) > 0: vedo.logger.warning(f"in camera_from_dict, key(s) not recognized: {camera.keys()}") if cm_pos is not None: vcam.SetPosition(cm_pos) @@ -1753,6 +1788,7 @@ def camera_from_dict(camera, modify_inplace=None): if cm_parallel_scale is not None: vcam.SetParallelScale(cm_parallel_scale) if cm_thickness is not None: vcam.SetThickness(cm_thickness) if cm_view_angle is not None: vcam.SetViewAngle(cm_view_angle) + if cm_roll is not None: vcam.SetRoll(cm_roll) return vcam From c630cedae80f99ae9e1725e179ff96ba1fa2e42d Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 10 Nov 2023 17:49:42 +0100 Subject: [PATCH 231/251] fix numpy dump, add images, fix metadata GetAbstractArray() --- docs/changes.md | 10 +-- vedo/core.py | 12 +++- vedo/file_io.py | 186 +++++++++++++++++++++++++++++------------------- vedo/image.py | 3 + vedo/mesh.py | 21 ++++-- vedo/plotter.py | 4 +- vedo/visual.py | 1 + 7 files changed, 151 insertions(+), 86 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 2612785b..746c4131 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -82,11 +82,13 @@ plot_spheric.py ``` broken in npz dump: -boundaries.py -examples/basic/cartoony.py -color_mesh_cells2.py +boolean.py +cartoony.py +flatarrow.py +mesh_lut.py +mesh_map2cell.py +rotate_image.py (miss transform) test offline screenshot -- multiblock instead of npy \ No newline at end of file diff --git a/vedo/core.py b/vedo/core.py index ad6d7498..804b5729 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -157,7 +157,10 @@ def keys(self): data = self.obj.dataset.GetFieldData() arrnames = [] for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() + if self.association == 2: + name = data.GetAbstractArray(i).GetName() + else: + name = data.GetArray(i).GetName() if name: arrnames.append(name) return arrnames @@ -169,7 +172,7 @@ def rename(self, oldname, newname): elif self.association == 1: varr = self.obj.dataset.GetCellData().GetArray(oldname) elif self.association == 2: - varr = self.obj.dataset.GetFieldData().GetArray(oldname) + varr = self.obj.dataset.GetFieldData().GetAbstractArray(oldname) if varr: varr.SetName(newname) else: @@ -195,7 +198,10 @@ def clear(self): elif self.association == 2: data = self.obj.dataset.GetFieldData() for i in range(data.GetNumberOfArrays()): - name = data.GetArray(i).GetName() + if self.association == 2: + name = data.GetAbstractArray(i).GetName() + else: + name = data.GetArray(i).GetName() data.RemoveArray(name) def select(self, key): diff --git a/vedo/file_io.py b/vedo/file_io.py index 79c0f3f1..87c03727 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -794,20 +794,18 @@ def _from_numpy(d): # recreate a mesh from numpy arrays keys = d.keys() - vertices = d["points"] - if len(vertices) == 0: - return None + points = d["points"] cells = d["cells"] if "cells" in keys else None lines = d["lines"] if "lines" in keys else None - msh = Mesh([vertices, cells, lines]) + msh = Mesh([points, cells, lines]) - if "celldata" in keys and isinstance(d["celldata"], dict): - for arrname, arr in d["celldata"].items(): - msh.celldata[arrname] = arr if "pointdata" in keys and isinstance(d["pointdata"], dict): for arrname, arr in d["pointdata"].items(): msh.pointdata[arrname] = arr + if "celldata" in keys and isinstance(d["celldata"], dict): + for arrname, arr in d["celldata"].items(): + msh.celldata[arrname] = arr if "metadata" in keys and isinstance(d["metadata"], dict): for arrname, arr in d["metadata"].items(): msh.metadata[arrname] = arr @@ -818,16 +816,27 @@ def _from_numpy(d): prp.SetSpecular(d['specular']) prp.SetSpecularPower(d['specularpower']) prp.SetSpecularColor(d['specularcolor']) - prp.SetLighting(d['lighting_is_on']) + prp.SetInterpolation(0) # prp.SetInterpolation(d['shading']) + prp.SetOpacity(d['alpha']) prp.SetRepresentation(d['representation']) prp.SetPointSize(d['pointsize']) - if d['linewidth'] is not None: msh.linewidth(d['linewidth']) - if d['linecolor'] is not None: msh.linecolor(d['linecolor']) - if d['color'] is not None: msh.color(d['color']) - if d['backcolor'] is not None: msh.backcolor(d['backcolor']) + if d['color'] is not None: + msh.color(d['color']) + if "lighting_is_on" in d.keys(): + prp.SetLighting(d['lighting_is_on']) + # Must check keys for backwards compatibility: + if "linecolor" in d.keys() and d['linecolor'] is not None: + msh.linecolor(d['linecolor']) + if "backcolor" in d.keys() and d['backcolor'] is not None: + msh.backcolor(d['backcolor']) + + if d['linewidth'] is not None: + msh.linewidth(d['linewidth']) + if "edge_visibility" in d.keys(): + prp.SetEdgeVisibility(d['edge_visibility']) # new lut_list = d["LUT"] lut_range = d["LUT_range"] @@ -843,14 +852,26 @@ def _from_numpy(d): msh.mapper.SetScalarRange(lut_range) try: # NEW in vedo 5.0 - msh.mapper.SetScalarMode(d["scalar_mode"]) - msh.mapper.SetArrayName(d["array_name_to_color_by"]) - msh.mapper.SetColorMode(d["color_mode"]) + arname = d["array_name_to_color_by"] + msh.mapper.SetArrayName(arname) msh.mapper.SetInterpolateScalarsBeforeMapping( d["interpolate_scalars_before_mapping"]) - msh.mapper.SetUseLookupTableScalarRange(d["use_lookup_table_scalar_range"]) + msh.mapper.SetUseLookupTableScalarRange( + d["use_lookup_table_scalar_range"]) msh.mapper.SetScalarRange(d["scalar_range"]) msh.mapper.SetScalarVisibility(d["scalar_visibility"]) + msh.mapper.SetScalarMode(d["scalar_mode"]) + msh.mapper.SetColorMode(d["color_mode"]) + if d["scalar_visibility"]: + if d["scalar_mode"] == 1: + msh.dataset.GetPointData().SetActiveScalars(arname) + if d["scalar_mode"] == 2: + msh.dataset.GetCellData().SetActiveScalars(arname) + # print("color_mode", d["color_mode"]) + # print("scalar_mode", d["scalar_mode"]) + # print("scalar_range", d["scalar_range"]) + # print("scalar_visibility", d["scalar_visibility"]) + # print("array_name_to_color_by", arname) except KeyError: pass @@ -858,6 +879,8 @@ def _from_numpy(d): if "name" in keys: msh.name = d["name"] if "info" in keys: msh.info = d["info"] if "filename" in keys: msh.filename = d["filename"] + if "pickable" in keys: msh.pickable(d["pickable"]) + if "dragable" in keys: msh.draggable(d["dragable"]) return msh ############################################################################# @@ -889,7 +912,7 @@ def _import_npy(fileinput): if "use_depth_peeling" in data.keys(): settings.use_depth_peeling = data["use_depth_peeling"] - axes = data.pop("axes", 4) + axes = data.pop("axes", 4) # UNUSED title = data.pop("title", "") backgrcol = data.pop("backgrcol", "white") backgrcol2 = data.pop("backgrcol2", None) @@ -900,7 +923,7 @@ def _import_npy(fileinput): plt = vedo.Plotter( size=data["size"], # not necessarily a good idea to set it - axes=axes, + axes=axes, # must be zero to avoid recreating the axes title=title, bg=backgrcol, bg2=backgrcol2, @@ -923,7 +946,6 @@ def _import_npy(fileinput): plt.camera.SetClippingRange(cam["clipping_range"]) if "parallel_scale" in cam.keys(): plt.camera.SetParallelScale(cam["parallel_scale"]) - plt.resetcam = False ############################################## objs = [] @@ -931,7 +953,6 @@ def _import_npy(fileinput): ### Mesh if d['type'].lower() == 'mesh': obj = _from_numpy(d) - objs.append(obj) ### Assembly elif d['type'].lower() == 'assembly': @@ -939,31 +960,27 @@ def _import_npy(fileinput): for ad in d["actors"]: assacts.append(_from_numpy(ad)) obj = Assembly(assacts) - # _load_common(asse, d) - objs.append(obj) ### Volume elif d['type'].lower() == 'volume': obj = Volume(d["array"]) - # _load_common(vol, d) if "jittering" in d.keys(): obj.jittering(d["jittering"]) obj.mode(d["mode"]) obj.color(d["color"]) obj.alpha(d["alpha"]) obj.alpha_gradient(d["alphagrad"]) - objs.append(obj) ### TetMesh elif d['type'].lower() == 'tetmesh': raise NotImplementedError("TetMesh not supported yet") - # obj = vedo.TetMesh(d["array"]) - # objs.append(obj) + + ### ScalarBar2D + elif d['type'].lower() == 'scalarbar2d': + raise NotImplementedError("ScalarBar2D not supported yet") ### Image elif d['type'].lower() == 'picture' or d['type'].lower() == 'image': obj = Image(d["array"]) - # _load_common(vimg, d) - objs.append(obj) ### Text2D elif d['type'].lower() == 'text2d': @@ -972,25 +989,21 @@ def _import_npy(fileinput): obj.background(d["bgcol"], d["alpha"]) if d["frame"]: obj.frame(d["bgcol"]) + + else: + obj = None + vedo.logger.warning(f"Cannot import object {d}") + + if obj: + keys = d.keys() + if "time" in keys: obj.time = d["time"] + if "name" in keys: obj.name = d["name"] + if "info" in keys: obj.info = d["info"] + if "filename" in keys: obj.filename = d["filename"] objs.append(obj) - ### Annotation ## backward compatibility - will disappear - elif d['type'].lower() == 'annotation': - pos = d["position"] - if isinstance(pos, int): - pos = "top-left" - d["size"] *= 2.7 - obj = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]).pos(pos) - obj.background(d["bgcol"], d["alpha"]).size(d["size"]).frame(d["bgcol"]) - objs.append(obj) ## backward compatibility - will disappear - - keys = d.keys() - if "time" in keys: obj.time = d["time"] - if "name" in keys: obj.name = d["name"] - if "info" in keys: obj.info = d["info"] - if "filename" in keys: obj.filename = d["filename"] - plt.add(objs) + plt.resetcam = False return plt ########################################################### @@ -1280,8 +1293,7 @@ def read(inputobj, unpack=True, force=False): ############################################################################### def export_window(fileoutput, binary=False, plt=None): """ - Exporter which writes out the rendered scene into an HTML, X3D - HDF5 or Numpy file. + Exporter which writes out the rendered scene into an HTML, X3D or Numpy file. Example: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) @@ -1303,8 +1315,8 @@ def export_window(fileoutput, binary=False, plt=None): _export_npy(plt, fileoutput) #################################################################### - elif fr.endswith(".v3d") or fr.endswith(".h5") or fr.endswith(".hdf5"): - _export_hdf5(plt, fileoutput) + # elif fr.endswith(".h5") or fr.endswith(".hdf5"): + # _export_hdf5(plt, fileoutput) #################################################################### elif fr.endswith(".x3d"): @@ -1413,9 +1425,23 @@ def _fillmesh(obj, adict): adict["use_lookup_table_scalar_range"] = mapper.GetUseLookupTableScalarRange() adict["scalar_range"] = mapper.GetScalarRange() adict["scalar_visibility"] = mapper.GetScalarVisibility() - # adict["color_map_colors"] = mapper.GetColorMapColors() #vtkUnsignedCharArray + adict["pickable"] = obj.actor.GetPickable() + adict["dragable"] = obj.actor.GetDragable() + + # adict["color_map_colors"] = mapper.GetColorMapColors() #vtkUnsignedCharArray # adict["color_coordinates"] = mapper.GetColorCoordinates() #vtkFloatArray - # adict["color_texture_map"] = mapper.GetColorTextureMap() #vtkImageData + texmap = mapper.GetColorTextureMap() #vtkImageData + if texmap: + adict["color_texture_map"] = vedo.Image(texmap).tonumpy() + # print("color_texture_map", adict["color_texture_map"].shape) + texture = obj.actor.GetTexture() + if texture: + adict["texture_array"] = vedo.Image(texture.GetInput()).tonumpy() + adict["texture_interpolate"] = texture.GetInterpolate() + adict["texture_repeat"] = texture.GetRepeat() + adict["texture_quality"] = texture.GetQuality() + adict["texture_color_mode"] = texture.GetColorMode() + # print("texture", adict["texture_array"].shape) adict["LUT"] = None adict["LUT_range"] = None @@ -1424,7 +1450,7 @@ def _fillmesh(obj, adict): nlut = lut.GetNumberOfTableValues() lutvals = [] for i in range(nlut): - v4 = lut.GetTableValue(i) # r, g, b, alpha + v4 = lut.GetTableValue(i) # (r, g, b, alpha) lutvals.append(v4) adict["LUT"] = np.array(lutvals, dtype=np.float32) adict["LUT_range"] = np.array(lut.GetRange()) @@ -1436,8 +1462,9 @@ def _fillmesh(obj, adict): adict["linecolor"] = None adict["linewidth"] = None + adict["edge_visibility"] = prp.GetEdgeVisibility() # new in vedo 5.0 if prp.GetEdgeVisibility(): - adict["linewidth"] = obj.linewidth() + adict["linewidth"] = prp.GetLineWidth() adict["linecolor"] = prp.GetEdgeColor() adict["ambient"] = prp.GetAmbient() @@ -1458,12 +1485,8 @@ def _fillmesh(obj, adict): except AttributeError: obj = act - ######################################################## Assembly - if isinstance(obj, Assembly): - pass - ######################################################## Points/Mesh - elif isinstance(obj, Points): + if isinstance(obj, Points): adict["type"] = "Mesh" _fillcommon(obj, adict) _fillmesh(obj, adict) @@ -1513,7 +1536,9 @@ def _fillmesh(obj, adict): adict["frame"] = obj.properties.GetFrame() else: + vedo.logger.warning(f"Cannot export object of type {type(obj)}") pass + return adict @@ -1533,7 +1558,7 @@ def _export_npy(plt, fileoutput="scene.npz"): ) sdict["position"] = plt.pos sdict["size"] = plt.size - sdict["axes"] = plt.axes + sdict["axes"] = 0 sdict["title"] = plt.title sdict["backgrcol"] = colors.get_color(plt.renderer.GetBackground()) sdict["backgrcol2"] = None @@ -1547,24 +1572,41 @@ def _export_npy(plt, fileoutput="scene.npz"): sdict["objects"] = [] - allobjs = plt.get_actors() - acts2d = plt.renderer.GetActors2D() - acts2d.InitTraversal() - for _ in range(acts2d.GetNumberOfItems()): - a = acts2d.GetNextItem() - # if isinstance(a, vedo.Text2D): - allobjs.append(a) + actors = plt.get_actors(include_non_pickables=True) + # this ^ also retrieves Actors2D + allobjs = [] + for i, a in enumerate(actors): + + if not a.GetVisibility(): + continue + + try: + ob = a.retrieve_object() + # print("get_actors",[ob], ob.name) + if isinstance(ob, Assembly): + # T = ob.transform + # pp = ob.GetPosition() + for elem in ob.recursive_unpack(): + # elem = e.clone() + # elem.apply_transform(T) + # elem.SetPosition(pp) + # elem.pos(pp) + elem.name = f"ASSEMBLY{i}_{ob.name}_{elem.name}" + allobjs.append(elem) + else: + allobjs.append(ob) + + except AttributeError: + print() + vedo.logger.warning(f"Cannot retrieve object of type {type(a)}") for a in allobjs: + print("to_numpy: dumping", [a], a.name) try: - if a.actor.GetVisibility(): - sdict["objects"].append(_to_numpy(a)) + npobj = _to_numpy(a) + sdict["objects"].append(npobj) except AttributeError: - try: - if a.GetVisibility(): - sdict["objects"].append(_to_numpy(a)) - except AttributeError: - pass + vedo.logger.warning(f"Cannot export object of type {type(a)}") if fileoutput.endswith(".npz"): np.savez_compressed(fileoutput, vedo_scenes=[sdict]) diff --git a/vedo/image.py b/vedo/image.py index 84df3d4c..a52f8ace 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -160,6 +160,9 @@ def __init__(self, obj=None, channels=3): self.filename = "" self.file_size = 0 self.pipeline = None + self.time = 0 + self.rendered_at = set() + self.info = {} self.actor = vtk.vtkImageActor() self.actor.retrieve_object = weak_ref_to(self) diff --git a/vedo/mesh.py b/vedo/mesh.py index 7c49f8fd..af5da131 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -153,6 +153,7 @@ def __init__(self, inputobj=None, c="gold", alpha=1): self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) n = self.dataset.GetNumberOfPoints() + self.name = "Mesh" self.pipeline = OperationNode(self, comment=f"#pts {n}") def _repr_html_(self): @@ -733,6 +734,7 @@ def cap(self, return_cap=False): m.pipeline = OperationNode( "cap", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) + m.name = "MeshCap" return m polyapp = vtk.new("AppendPolyData") @@ -1504,6 +1506,7 @@ def boundaries( fe.SetInputData(self.dataset) fe.Update() msh = Mesh(fe.GetOutput(), c="p").lw(5).lighting("off") + msh.name = "MeshBoundaries" msh.pipeline = OperationNode( "boundaries", @@ -1647,7 +1650,8 @@ def connected_cells(self, index, return_ids=False): gf = vtk.new("GeometryFilter") gf.SetInputData(extractSelection.GetOutput()) gf.Update() - return Mesh(gf.GetOutput()).lw(1) + m = Mesh(gf.GetOutput()).lw(1) + return m def silhouette(self, direction=None, border_edges=True, feature_angle=False): """ @@ -1709,6 +1713,7 @@ def silhouette(self, direction=None, border_edges=True, feature_angle=False): m.lw(2).c((0, 0, 0)).lighting("off") m.mapper.SetResolveCoincidentTopologyToPolygonOffset() m.pipeline = OperationNode("silhouette", parents=[self]) + m.name = "Silhouette" return m def isobands(self, n=10, vmin=None, vmax=None): @@ -1770,6 +1775,7 @@ def isobands(self, n=10, vmin=None, vmax=None): m1.mapper.SetLookupTable(lut) m1.mapper.SetScalarRange(lut.GetRange()) m1.pipeline = OperationNode("isobands", parents=[self]) + m1.name = "IsoBands" return m1 # self._update(bcf.GetOutput()) @@ -1814,6 +1820,7 @@ def isolines(self, n=10, vmin=None, vmax=None): msh = Mesh(cl.GetOutput(), c="k").lighting("off") msh.mapper.SetResolveCoincidentTopologyToPolygonOffset() msh.pipeline = OperationNode("isolines", parents=[self]) + msh.name = "IsoLines" return msh def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): @@ -1875,6 +1882,7 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): m.pipeline = OperationNode( "extrude", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) + m.name = "ExtrudedMesh" return m def split( @@ -1940,6 +1948,7 @@ def split( area = suba.area() else: area = 0 # dummy + suba.name = "MeshRegion" + str(t) alist.append([suba, area]) if sort_by_area: @@ -1979,6 +1988,7 @@ def extract_largest_region(self): parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}", ) + m.name = "MeshLargestRegion" return m def boolean(self, operation, mesh2, method=0, tol=None): @@ -2019,7 +2029,6 @@ def boolean(self, operation, mesh2, method=0, tol=None): msh = Mesh(bf.GetOutput(), c=None) msh.flat() - msh.name = self.name + operation + mesh2.name msh.pipeline = OperationNode( "boolean " + operation, @@ -2027,6 +2036,7 @@ def boolean(self, operation, mesh2, method=0, tol=None): shape="cylinder", comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) + msh.name = self.name + operation + mesh2.name return msh def intersect_with(self, mesh2, tol=1e-06): @@ -2046,10 +2056,10 @@ def intersect_with(self, mesh2, tol=1e-06): bf.Update() msh = Mesh(bf.GetOutput(), c="k", alpha=1).lighting("off") msh.properties.SetLineWidth(3) - msh.name = "SurfaceIntersection" msh.pipeline = OperationNode( "intersect_with", parents=[self, mesh2], comment=f"#pts {msh.npoints}" ) + msh.name = "SurfaceIntersection" return msh def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): @@ -2127,12 +2137,12 @@ def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): msh = Mesh(cutter.GetOutput()) msh.c('k').lw(3).lighting("off") - msh.name = "PlaneIntersection" msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) + msh.name = "PlaneIntersection" return msh def collide_with(self, mesh2, tol=0, return_bool=False): @@ -2169,13 +2179,13 @@ def collide_with(self, mesh2, tol=0, return_bool=False): ipdf.GetOutput(1).GetFieldData().GetArray("ContactCells") ) msh.properties.SetLineWidth(3) - msh.name = "SurfaceCollision" msh.pipeline = OperationNode( "collide_with", parents=[self, mesh2], comment=f"#pts {msh.dataset.GetNumberOfPoints()}", ) + msh.name = "SurfaceCollision" return msh def geodesic(self, start, end): @@ -2314,6 +2324,7 @@ def binarize( imgstenc.SetBackgroundValue(outval) imgstenc.Update() vol = vedo.Volume(imgstenc.GetOutput()) + vol.name = "BinarizedVolume" vol.pipeline = OperationNode( "binarize", diff --git a/vedo/plotter.py b/vedo/plotter.py index b816029f..e94e2447 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -4322,9 +4322,9 @@ def _keypress(self, iren, event): vedo.printc("Click object and press X to open the cutter box widget.", c='g') elif key == "E": - vedo.printc(r":camera: Exporting 3D window to file", c="b", end="") + vedo.printc(r":camera: Exporting 3D window to file scene.npz, ", c="b", end="") vedo.file_io.export_window("scene.npz") - vedo.printc(". Try:\n> vedo scene.npz", c="b") + vedo.printc("try:\n> vedo scene.npz", c="b") return elif key == "F": diff --git a/vedo/visual.py b/vedo/visual.py index cf36d6c2..8fbfd23a 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1662,6 +1662,7 @@ def labels( ids.properties.LightingOff() ids.actor.PickableOff() ids.actor.SetUseBounds(False) + ids.name = "Labels" return ids def labels2d( From 46d273aeda46980b4b42b3a7d0ddc8a96117cb43 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 10 Nov 2023 20:21:47 +0100 Subject: [PATCH 232/251] dump volume to npz --- docs/changes.md | 5 +- examples/advanced/geological_model.py | 29 +- vedo/core.py | 14 + vedo/file_io.py | 438 +++++--------------------- vedo/mesh.py | 201 ------------ vedo/plotter.py | 2 +- vedo/version.py | 2 +- vedo/visual.py | 208 +++++++++++- vedo/vtkclasses.py | 2 +- 9 files changed, 326 insertions(+), 575 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 746c4131..aea0e057 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -81,14 +81,15 @@ markpoint.py plot_spheric.py ``` -broken in npz dump: +### broken in npz dump: boolean.py cartoony.py flatarrow.py mesh_lut.py mesh_map2cell.py rotate_image.py (miss transform) - +texturecubes.py +meshquality.py test offline screenshot diff --git a/examples/advanced/geological_model.py b/examples/advanced/geological_model.py index 5d9f6a98..6c7185bd 100644 --- a/examples/advanced/geological_model.py +++ b/examples/advanced/geological_model.py @@ -1,6 +1,7 @@ -"""Recreate a model of a geothermal reservoir, Utah +"""Recreate a model of a geothermal reservoir in Utah. +Click on an object and press "i" to get info about it. (Credits: A. Pollack, SCRF)""" -from vedo import printc, dataurl, settings, generate_delaunay2d +from vedo import printc, dataurl, settings from vedo import Line, Lines, Points, Plotter import pandas as pd @@ -37,7 +38,7 @@ printc("analyzing...", invert=1, end='') # create a mesh object from the 2D Delaunay triangulation of the point cloud -landSurface = generate_delaunay2d(landSurfacePD.values) +landSurface = Points(landSurfacePD.values).generate_delaunay2d() # in order to color it by the elevation, we use the z values of the mesh zvals = landSurface.vertices[:, 2] @@ -53,28 +54,28 @@ ############################################# ## Different meshes with constant colors # Mesh of 175 C isotherm -vertices_175C = generate_delaunay2d(vertices_175CPD.values) +vertices_175C = Points(vertices_175CPD.values).generate_delaunay2d() vertices_175C.name = "175C temperature isosurface" plt += vertices_175C.c("orange").opacity(0.3) # Mesh of 225 C isotherm -vertices_225CT = generate_delaunay2d(vertices_225CPD.values) +vertices_225CT = Points(vertices_225CPD.values).generate_delaunay2d() vertices_225CT.name = "225C temperature isosurface" plt += vertices_225CT.c("red").opacity(0.4) # Negro fault, mode=fit is used because point cloud is not in xy plane -Negro_Mag_Fault_vertices = generate_delaunay2d(Negro_Mag_Fault_verticesPD.values, mode='fit') +Negro_Mag_Fault_vertices = Points(Negro_Mag_Fault_verticesPD.values).generate_delaunay2d(mode='fit') Negro_Mag_Fault_vertices.name = "Negro Fault" plt += Negro_Mag_Fault_vertices.c("f").opacity(0.6) # Opal fault -Opal_Mound_Fault_vertices = generate_delaunay2d(Opal_Mound_Fault_verticesPD.values, mode='fit') +Opal_Mound_Fault_vertices = Points(Opal_Mound_Fault_verticesPD.values).generate_delaunay2d(mode='fit') Opal_Mound_Fault_vertices.name = "Opal Mound Fault" plt += Opal_Mound_Fault_vertices.c("g").opacity(0.6) # Top Granite, (shift it a bit to avoid overlapping) xyz = top_granitoid_verticesPD.values - [0,0,20] -top_granitoid_vertices = generate_delaunay2d(xyz).texture(dataurl+'textures/paper2.jpg') +top_granitoid_vertices = Points(xyz).generate_delaunay2d().texture(dataurl+'textures/paper2.jpg') top_granitoid_vertices.name = "Top of granite surface" plt += top_granitoid_vertices @@ -84,7 +85,7 @@ # Microseismic microseismicxyz = microseismic[["xloc", "yloc", "zloc"]].values scals = microseismic[["mw"]] -microseismic_pts = Points(microseismicxyz, r=5).cmap("jet", scals) +microseismic_pts = Points(microseismicxyz).cmap("jet", scals).ps(5) microseismic_pts.name = "Microseismic events" plt += microseismic_pts @@ -98,28 +99,28 @@ plt += boundary # The path of well 58_32 -Well1 = Line(well_5832_path[["X", "Y", "Z"]].values).c("k").lw(2) +Well1 = Line(well_5832_path[["X", "Y", "Z"]].values).color("k").lw(2) Well1.name = "Well 58-32" plt += Well1 # A porosity log in the well xyz = nphi_well[["X", "Y", "Z"]].values porosity = nphi_well["Nphi"].values -Well2 = Line(xyz, lw=3).cmap("hot", porosity) +Well2 = Line(xyz).cmap("hot", porosity).lw(3) Well2.name = "Porosity log well 58-32" plt += Well2 # This well data is actually represented by points since as of right now, xyz = pressure_well[["X", "Y", "Z"]].values pressure = pressure_well["Pressure"].values -Well3 = Line(xyz, lw=3).cmap("cool", pressure) +Well3 = Line(xyz).cmap("cool", pressure).lw(3) Well3.name = "Pressure log well 58-32" plt += Well3 # Temperature log xyz = temp_well[["X", "Y", "Z"]].values temp = temp_well["Temperature"].values -Well4 = Line(xyz, lw=3).cmap("seismic", temp) +Well4 = Line(xyz).cmap("seismic", temp).lw(3) Well4.name = "Temperature log well 58-32" plt += Well4 @@ -136,7 +137,7 @@ # change scale to kilometers in x and y, but expand z scale by 1.5! a.scale([0.001, 0.001, 0.001*1.5]) -######################### +########################################################################### ## show the plot plt += __doc__ plt.show(viewup="z", zoom=1.2) diff --git a/vedo/core.py b/vedo/core.py index 804b5729..961a2e36 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -315,6 +315,20 @@ def select_vectors(self, key): self.obj.mapper.ScalarVisibilityOn() except AttributeError: pass + + def select_texture_coords(self, key): + """Select one specific array to be used as texture coordinates.""" + if self.association == 0: + data = self.obj.dataset.GetPointData() + else: + vedo.logger.warning("texture coordinates are only available for point data") + return + + if isinstance(key, int): + key = data.GetArrayName(key) + + data.SetTCoords(data.GetArray(key)) + def print(self, **kwargs): """Print the array names available to terminal""" diff --git a/vedo/file_io.py b/vedo/file_io.py index 87c03727..a90ea587 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -867,6 +867,28 @@ def _from_numpy(d): msh.dataset.GetPointData().SetActiveScalars(arname) if d["scalar_mode"] == 2: msh.dataset.GetCellData().SetActiveScalars(arname) + + if "texture_array" in keys and d["texture_array"] is not None: + # recreate a vtkTexture object from numpy arrays: + t = vtk.vtkTexture() + t.SetInterpolate(d["texture_interpolate"]) + t.SetRepeat(d["texture_repeat"]) + t.SetQuality(d["texture_quality"]) + t.SetColorMode(d["texture_color_mode"]) + t.SetMipmap(d["texture_mipmap"]) + t.SetBlendingMode(d["texture_blending_mode"]) + t.SetEdgeClamp(d["texture_edge_clamp"]) + t.SetBorderColor(d["texture_border_color"]) + msh.actor.SetTexture(t) + tcarray = None + for arrname in msh.pointdata.keys(): + if "Texture" in arrname or "TCoord" in arrname: + tcarray = arrname + break + if tcarray is not None: + t.SetInputData(vedo.Image(d["texture_array"]).dataset) + msh.pointdata.select_texture_coords(tcarray) + # print("color_mode", d["color_mode"]) # print("scalar_mode", d["scalar_mode"]) # print("scalar_range", d["scalar_range"]) @@ -960,6 +982,10 @@ def _import_npy(fileinput): for ad in d["actors"]: assacts.append(_from_numpy(ad)) obj = Assembly(assacts) + obj.SetScale(d["scale"]) + obj.SetPosition(d["position"]) + obj.SetOrientation(d["orientation"]) + obj.SetOrigin(d["origin"]) ### Volume elif d['type'].lower() == 'volume': @@ -979,8 +1005,13 @@ def _import_npy(fileinput): raise NotImplementedError("ScalarBar2D not supported yet") ### Image - elif d['type'].lower() == 'picture' or d['type'].lower() == 'image': + elif d['type'].lower() == 'image': obj = Image(d["array"]) + obj.alpha(d["alpha"]) + obj.actor.SetScale(d["scale"]) + obj.actor.SetPosition(d["position"]) + obj.actor.SetOrientation(d["orientation"]) + obj.actor.SetOrigin(d["origin"]) ### Text2D elif d['type'].lower() == 'text2d': @@ -992,7 +1023,8 @@ def _import_npy(fileinput): else: obj = None - vedo.logger.warning(f"Cannot import object {d}") + # vedo.logger.warning(f"Cannot import object {d}") + pass if obj: keys = d.keys() @@ -1006,94 +1038,6 @@ def _import_npy(fileinput): plt.resetcam = False return plt -########################################################### -# def _import_hdf5(fileinput): -# try: -# import h5py -# except ImportError as e: -# vedo.logger.error(f"{e}. Try: 'pip install h5py'") -# return -# hfile = h5py.File(fileinput, "r") - -# scene = hfile["scene"] - -# settings.use_depth_peeling = scene["use_depth_peeling"][()] -# settings.render_lines_as_tubes = scene["render_lines_as_tubes"][()] -# settings.hidden_line_removal = scene["hidden_line_removal"][()] -# settings.use_parallel_projection = scene["use_parallel_projection"][()] -# settings.default_font = scene["default_font"][()].decode("utf-8") - -# plt = vedo.Plotter( -# pos=scene["position"][()], -# size=scene["size"][()], -# axes=scene["axes"][()], -# title=scene["title"][()].decode("utf-8"), -# bg=scene["background_color"][()], -# bg2=scene["background_color2"][()], -# ) - -# objects = scene["objects"] - -# for name, hob in objects.items(): - -# if hob["type"][()].decode("utf-8") == 'Mesh': -# # print(name, hob, hob["type"][()]) - -# dataset = hob["dataset"] -# props = hob["properties"] - -# vertices = dataset["points"][()] -# cells = dataset["cells"][()] -# lines = dataset["lines"][()] - -# msh = Mesh([vertices, cells, lines]) -# msh.name = hob["name"][()].decode("utf-8") -# # msh.info = hob["info"] -# msh.filename = hob["filename"][()].decode("utf-8") -# msh.transform = vedo.LinearTransform(dataset["transform"][()]) - -# msh.properties.SetRepresentation(props["representation"][()]) -# msh.properties.SetPointSize(props["pointsize"][()]) - -# msh.properties.SetEdgeVisibility(props["linewidth"][()]>0) -# if props["linewidth"][()]: -# msh.linewidth(props["linewidth"][()]) -# msh.properties.SetEdgeColor(props["linecolor"][()]) - -# msh.properties.SetAmbient(props["ambient"][()]) -# msh.properties.SetDiffuse(props["diffuse"][()]) -# msh.properties.SetSpecular(props["specular"][()]) -# msh.properties.SetSpecularPower(props["specularpower"][()]) -# msh.properties.SetSpecularColor(props["specularcolor"][()]) -# msh.properties.SetInterpolation(props["shading"][()]) # flat, phong -# msh.properties.SetColor(props["color"][()]) -# msh.properties.SetOpacity(props["alpha"][()]) -# msh.properties.SetLighting(props["lighting_is_on"][()]) -# if props["backcolor"][()]: -# bfp = msh.actor.GetBackfaceProperty() -# bfp.SetColor(props["backcolor"][()]) -# msh.mapper.SetScalarVisibility(props["scalar_visibility"][()]) - -# plt.add(msh) - -# cam = scene["camera"] -# if cam: -# if "pos" in cam.keys(): -# plt.camera.SetPosition(cam["pos"][()]) -# if "focal_point" in cam.keys(): -# plt.camera.SetFocalPoint(cam["focal_point"][()]) -# if "viewup" in cam.keys(): -# plt.camera.SetViewUp(cam["viewup"][()]) -# if "distance" in cam.keys(): -# plt.camera.SetDistance(cam["distance"][()]) -# if "clipping_range" in cam.keys(): -# plt.camera.SetClippingRange(cam["clipping_range"][()]) -# plt.resetcam = False - -# hfile.close() -# return plt - - ########################################################### def loadImageData(filename): """Read and return a `vtkImageData` object from file.""" @@ -1120,7 +1064,7 @@ def loadImageData(filename): vedo.logger.error(f"sorry, bad NRRD file {filename}") return None else: - vedo.logger.error(f"sorry, cannot read file {filename}") + vedo.logger.error(f"cannot read file {filename}") return None reader.SetFileName(filename) reader.Update() @@ -1170,7 +1114,7 @@ def write(objct, fileoutput, binary=True): try: g.AddInputData(ob) except TypeError: - vedo.logger.warning("Cannot save object of type", type(ob)) + vedo.logger.warning("cannot save object of type", type(ob)) g.Update() mb = g.GetOutputDataObject(0) wri = vtk.vtkXMLMultiBlockDataWriter() @@ -1370,24 +1314,32 @@ def export_window(fileoutput, binary=False, plt=None): def _to_numpy(act): """Encode a vedo object to numpy format.""" - adict = {} - adict["type"] = "unknown" - ######################################################## def _fillcommon(obj, adict): adict["filename"] = obj.filename adict["name"] = obj.name adict["time"] = obj.time adict["rendered_at"] = obj.rendered_at - adict["position"] = obj.pos() adict["info"] = obj.info try: adict["transform"] = obj.transform.matrix except AttributeError: adict["transform"] = np.eye(4) - ######################################################## - def _fillmesh(obj, adict): + #################################################################### + try: + obj = act.retrieve_object() + except AttributeError: + obj = act + + adict = {} + adict["type"] = "unknown" + + ######################################################## Points/Mesh + if isinstance(obj, Points): + adict["type"] = "Mesh" + _fillcommon(obj, adict) + poly = obj.dataset mapper = obj.mapper @@ -1434,6 +1386,8 @@ def _fillmesh(obj, adict): if texmap: adict["color_texture_map"] = vedo.Image(texmap).tonumpy() # print("color_texture_map", adict["color_texture_map"].shape) + + adict["texture_array"] = None texture = obj.actor.GetTexture() if texture: adict["texture_array"] = vedo.Image(texture.GetInput()).tonumpy() @@ -1441,7 +1395,11 @@ def _fillmesh(obj, adict): adict["texture_repeat"] = texture.GetRepeat() adict["texture_quality"] = texture.GetQuality() adict["texture_color_mode"] = texture.GetColorMode() - # print("texture", adict["texture_array"].shape) + adict["texture_mipmap"] = texture.GetMipmap() + adict["texture_blending_mode"] = texture.GetBlendingMode() + adict["texture_edge_clamp"] = texture.GetEdgeClamp() + adict["texture_border_color"] = texture.GetBorderColor() + # print("tonumpy: texture", obj.name, adict["texture_array"].shape) adict["LUT"] = None adict["LUT_range"] = None @@ -1479,25 +1437,11 @@ def _fillmesh(obj, adict): if obj.actor.GetBackfaceProperty(): adict["backcolor"] = obj.actor.GetBackfaceProperty().GetColor() - ####################################################################### - try: - obj = act.retrieve_object() - except AttributeError: - obj = act - - ######################################################## Points/Mesh - if isinstance(obj, Points): - adict["type"] = "Mesh" - _fillcommon(obj, adict) - _fillmesh(obj, adict) - ######################################################## Volume elif isinstance(obj, Volume): adict["type"] = "Volume" _fillcommon(obj, adict) - imgdata = obj.dataset - arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) - adict["array"] = arr.reshape(imgdata.GetDimensions()) + adict["array"] = obj.tonumpy() adict["mode"] = obj.mode() prp = obj.properties @@ -1505,7 +1449,7 @@ def _fillmesh(obj, adict): otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() smin, smax = ctf.GetRange() - xs = np.linspace(smin, smax, num=100, endpoint=True) + xs = np.linspace(smin, smax, num=256, endpoint=True) cols, als, algrs = [], [], [] for x in xs: cols.append(ctf.GetColor(x)) @@ -1521,6 +1465,11 @@ def _fillmesh(obj, adict): adict["type"] = "Image" _fillcommon(obj, adict) adict["array"] = obj.tonumpy() + adict["scale"] = obj.actor.GetScale() + adict["position"] = obj.actor.GetPosition() + adict["orientation"] = obj.actor.GetOrientation() + adict['origin'] = obj.actor.GetOrigin() + adict["alpha"] = obj.alpha() ######################################################## Text2D elif isinstance(obj, vedo.Text2D): @@ -1536,7 +1485,7 @@ def _fillmesh(obj, adict): adict["frame"] = obj.properties.GetFrame() else: - vedo.logger.warning(f"Cannot export object of type {type(obj)}") + # vedo.logger.warning(f"to_numpy: cannot export object of type {type(obj)}") pass return adict @@ -1584,258 +1533,39 @@ def _export_npy(plt, fileoutput="scene.npz"): ob = a.retrieve_object() # print("get_actors",[ob], ob.name) if isinstance(ob, Assembly): - # T = ob.transform - # pp = ob.GetPosition() - for elem in ob.recursive_unpack(): - # elem = e.clone() - # elem.apply_transform(T) - # elem.SetPosition(pp) - # elem.pos(pp) + asse_scale = ob.GetScale() + asse_pos = ob.GetPosition() + asse_ori = ob.GetOrientation() + asse_org = ob.GetOrigin() + for elem in ob.unpack(): elem.name = f"ASSEMBLY{i}_{ob.name}_{elem.name}" + elem.info.update({"assembly": ob.name}) # TODO + elem.info.update({"assembly_scale": asse_scale}) + elem.info.update({"assembly_position": asse_pos}) + elem.info.update({"assembly_orientation": asse_ori}) + elem.info.update({"assembly_origin": asse_org}) allobjs.append(elem) else: allobjs.append(ob) except AttributeError: - print() - vedo.logger.warning(f"Cannot retrieve object of type {type(a)}") + # print() + # vedo.logger.warning(f"Cannot retrieve object of type {type(a)}") + pass for a in allobjs: - print("to_numpy: dumping", [a], a.name) - try: - npobj = _to_numpy(a) - sdict["objects"].append(npobj) - except AttributeError: - vedo.logger.warning(f"Cannot export object of type {type(a)}") + # print("to_numpy(): dumping", [a], a.name) + # try: + npobj = _to_numpy(a) + sdict["objects"].append(npobj) + # except AttributeError: + # vedo.logger.warning(f"Cannot export object of type {type(a)}") if fileoutput.endswith(".npz"): np.savez_compressed(fileoutput, vedo_scenes=[sdict]) else: np.save(fileoutput, [sdict]) -######################################################################### -# def _export_hdf5(plt, fileoutput="scene.h5"): -# try: -# import h5py -# except ImportError as e: -# vedo.logger.error(f"{e}. Try: 'pip install h5py'") -# return - -# hfile = h5py.File(fileoutput, "w") - -# scene = hfile.create_group("scene") - -# scene["shape"] = plt.shape -# scene["sharecam"] = plt.sharecam - -# camera = scene.create_group("camera") -# cdict = dict( -# pos=plt.camera.GetPosition(), -# focal_point=plt.camera.GetFocalPoint(), -# viewup=plt.camera.GetViewUp(), -# distance=plt.camera.GetDistance(), -# clipping_range=plt.camera.GetClippingRange(), -# ) -# camera.attrs.update(cdict) - -# scene["position"] = plt.pos -# scene["size"] = plt.size -# scene["axes"] = plt.axes if plt.axes else "" -# scene["title"] = str(plt.title) -# scene["background_color"] = colors.get_color(plt.renderer.GetBackground()) -# if plt.renderer.GetGradientBackground(): -# scene["background_color2"] = plt.renderer.GetBackground2() -# else: -# scene["background_color2"] = "" -# scene["use_depth_peeling"] = settings.use_depth_peeling -# scene["render_lines_as_tubes"] = settings.render_lines_as_tubes -# scene["hidden_line_removal"] = settings.hidden_line_removal -# scene["use_parallel_projection"] = plt.camera.GetParallelProjection() -# scene["default_font"] = settings.default_font - -# onscreen = [] -# for a in plt.get_actors(): -# onscreen.append(a.retrieve_object()) - -# vobjs = [] -# for i, vob in enumerate(set(plt.objects + onscreen)): -# if isinstance(vob, str): -# vobjs.append(vedo.Text2D(vob)) -# elif not vob.actor.GetVisibility(): -# continue -# elif not hasattr(vob, "name"): -# continue -# elif isinstance(vob, Assembly): -# vobjs += vob.recursive_unpack() -# else: -# vobjs.append(vob) - -# objects = scene.create_group("objects") -# for i, vob in enumerate(set(vobjs)): - -# cname = vob.__class__.__name__ -# hmesh = objects.create_group(f"{cname}_{vob.name}_{i}") -# hmesh["type"] = "Mesh" if vob.ncells else "Points" - -# hmesh["filename"] = vob.filename -# hmesh["name"] = vob.name -# hmesh["time"] = vob.time -# hmesh["rendered_at"] = list(vob.rendered_at) - -# info = hmesh.create_group("info") -# info.attrs.update(vob.info) - -# props = hmesh.create_group("properties") - -# dataset = hmesh.create_group("dataset") - -# copt = dict(compression="gzip", compression_opts=9) -# dataset.create_dataset("points", data=vob.vertices, dtype=np.float32, **copt) - -# cells = np.array([]) -# try: -# cells = vob.cells_as_flat_array -# if vob.nvertices < 256: #careful, vertices not cells! -# dataset.create_dataset("cells", data=cells, dtype=np.uint8, **copt) -# elif vob.nvertices < 65535: #careful, vertices not cells! -# dataset.create_dataset("cells", data=cells, dtype=np.uint16, **copt) -# else: -# dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) -# except AttributeError as e: -# print("cells fails for", e) -# pass -# dataset.create_dataset("cells", data=cells, dtype=np.uint32, **copt) - -# lns = np.array([]) -# try: -# if vob.dataset.GetNumberOfLines(): -# lns = vob.lines_as_flat_array -# except AttributeError as e: -# print("lines fails for", e) -# pass -# dataset.create_dataset("lines", data=lns, dtype=np.uint32, **copt) - -# ######################################################## Points-Mesh -# try: -# dataset.create_dataset("transform", data=vob.transform.matrix) -# except AttributeError: -# dataset.create_dataset("transform", data=np.eye(4)) - -# try: -# dataset.create_group("pointdata") -# for key in vob.pointdata.keys(): -# if "Normals" in key: -# continue -# dataset["pointdata"].create_dataset(key, data=vob.pointdata[key]) -# dataset.create_group("celldata") -# for key in vob.celldata.keys(): -# if "Normals" in key: -# continue -# dataset["celldata"].create_dataset(key, data=vob.celldata[key]) -# dataset.create_group("metadata") -# for key in vob.metadata.keys(): -# dataset["metadata"].create_dataset(key, data=vob.metadata[key]) - -# v = vob.dataset.GetPointData().GetScalars() -# dataset["pointdata"]["active_scalars"] = v.GetName() if v else "" -# v = vob.dataset.GetPointData().GetVectors() -# dataset["pointdata"]["active_vectors"] = v.GetName() if v else "" -# v = vob.dataset.GetPointData().GetTensors() -# dataset["pointdata"]["active_tensors"] = v.GetName() if v else "" - -# v = vob.dataset.GetCellData().GetScalars() -# dataset["celldata"]["active_scalars"] = v.GetName() if v else "" -# v = vob.dataset.GetCellData().GetVectors() -# dataset["celldata"]["active_vectors"] = v.GetName() if v else "" -# v = vob.dataset.GetCellData().GetTensors() -# dataset["celldata"]["active_tensors"] = v.GetName() if v else "" - -# except AttributeError as e: -# # print("pointcelldata fails for", e) -# pass - -# try: -# lut = vob.mapper.GetLookupTable() -# if lut: -# nlut = lut.GetNumberOfTableValues() -# lutvals = [] -# for i in range(nlut): -# v4 = lut.GetTableValue(i) # r, g, b, alpha -# lutvals.append(v4) -# props["lut"] = lutvals -# props["lut_range"] = lut.GetRange() -# else: -# props["lut"] = None -# props["lut_range"] = None - -# props["representation"] = vob.properties.GetRepresentation() -# props["pointsize"] = vob.properties.GetPointSize() - -# evis = vob.properties.GetEdgeVisibility() -# props["linewidth"] = vob.linewidth() if evis else 0 -# props["linecolor"] = vob.properties.GetEdgeColor() if evis else "" - -# props["ambient"] = vob.properties.GetAmbient() -# props["diffuse"] = vob.properties.GetDiffuse() -# props["specular"] = vob.properties.GetSpecular() -# props["specularpower"] = vob.properties.GetSpecularPower() -# props["specularcolor"] = vob.properties.GetSpecularColor() -# props["shading"] = vob.properties.GetInterpolation() # flat, phong -# props["color"] = vob.properties.GetColor() -# props["alpha"] = vob.properties.GetOpacity() -# props["lighting_is_on"] = vob.properties.GetLighting() -# bfp = vob.actor.GetBackfaceProperty() -# props["backcolor"] = bfp.GetColor() if bfp else "" -# props["scalar_visibility"] = vob.mapper.GetScalarVisibility() - -# except AttributeError: -# pass - -# ######################################################## Volume -# if isinstance(vob, vedo.Volume): -# try: -# # arr = utils.vtk2numpy(vob.dataset.GetPointData().GetScalars()) -# # arr = arr.reshape(vob.dataset.GetDimensions()) -# # dataset.create_dataset("array", data=arr) -# ctf = vob.properties.GetRGBTransferFunction() -# otf = vob.properties.GetScalarOpacity() -# gotf = vob.properties.GetGradientOpacity() -# smin, smax = ctf.GetRange() -# xs = np.linspace(smin, smax, num=100, endpoint=True) -# cols, als, algrs = [], [], [] -# for x in xs: -# cols.append(ctf.GetColor(x)) -# als.append(otf.GetValue(x)) -# if gotf: -# algrs.append(gotf.GetValue(x)) -# props["color"] = cols -# props["alpha"] = als -# props["alphagrad"] = algrs -# props["mode"] = vob.mode() -# except AttributeError as e: -# # print("vol fails for", e) -# pass - -# ######################################################## Image -# if isinstance(vob, vedo.Image): -# try: -# dataset["array"] = vob.tonumpy() -# except AttributeError as e: -# # print("img fails for", e) -# pass - -# ######################################################## Text2D -# if isinstance(vob, vedo.Text2D): -# props["text"] = vob.text() -# props["position"] = vob.GetPosition() -# props["color"] = vob.properties.GetColor() -# props["font"] = vob.fontname -# props["size"] = vob.properties.GetFontSize() / 22.5 -# props["bgcol"] = vob.properties.GetBackgroundColor() -# props["alpha"] = vob.properties.GetBackgroundOpacity() -# props["frame"] = vob.properties.GetFrame() - -# hfile.close() ######################################################################## def import_window(fileinput, mtl_file=None, texture_path=None): diff --git a/vedo/mesh.py b/vedo/mesh.py index af5da131..1f527b63 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import os import numpy as np import vedo.vtkclasses as vtk @@ -275,206 +274,6 @@ def cell_normals(self): vtknormals = self.dataset.GetCellData().GetNormals() return vtk2numpy(vtknormals) - def texture( - self, - tname, - tcoords=None, - interpolate=True, - repeat=True, - edge_clamp=False, - scale=None, - ushift=None, - vshift=None, - seam_threshold=None, - ): - """ - Assign a texture to mesh from image file or predefined texture `tname`. - If tname is set to `None` texture is disabled. - Input tname can also be an array or a `vtkTexture`. - - Arguments: - tname : (numpy.array, str, Image, vtkTexture, None) - the input texture to be applied. Can be a numpy array, a path to an image file, - a vedo Image. The None value disables texture. - tcoords : (numpy.array, str) - this is the (u,v) texture coordinate array. Can also be a string of an existing array - in the mesh. - interpolate : (bool) - turn on/off linear interpolation of the texture map when rendering. - repeat : (bool) - repeat of the texture when tcoords extend beyond the [0,1] range. - edge_clamp : (bool) - turn on/off the clamping of the texture map when - the texture coords extend beyond the [0,1] range. - Only used when repeat is False, and edge clamping is supported by the graphics card. - scale : (bool) - scale the texture image by this factor - ushift : (bool) - shift u-coordinates of texture by this amount - vshift : (bool) - shift v-coordinates of texture by this amount - seam_threshold : (float) - try to seal seams in texture by collapsing triangles - (test values around 1.0, lower values = stronger collapse) - - Examples: - - [texturecubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/texturecubes.py) - - ![](https://vedo.embl.es/images/basic/texturecubes.png) - """ - pd = self.dataset - out_img = None - - if tname is None: # disable texture - pd.GetPointData().SetTCoords(None) - pd.GetPointData().Modified() - return self ###################################### - - if isinstance(tname, vtk.vtkTexture): - tu = tname - - elif isinstance(tname, vedo.Image): - tu = vtk.vtkTexture() - out_img = tname - - elif is_sequence(tname): - tu = vtk.vtkTexture() - out_img = vedo.image._get_img(tname) - - elif isinstance(tname, str): - tu = vtk.vtkTexture() - - if "https://" in tname: - try: - tname = vedo.file_io.download(tname, verbose=False) - except: - vedo.logger.error(f"texture {tname} could not be downloaded") - return self - - fn = tname + ".jpg" - if os.path.exists(tname): - fn = tname - else: - vedo.logger.error(f"texture file {tname} does not exist") - return self - - fnl = fn.lower() - if ".jpg" in fnl or ".jpeg" in fnl: - reader = vtk.new("JPEGReader") - elif ".png" in fnl: - reader = vtk.new("PNGReader") - elif ".bmp" in fnl: - reader = vtk.new("BMPReader") - else: - vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") - return self - reader.SetFileName(fn) - reader.Update() - out_img = reader.GetOutput() - - else: - vedo.logger.error(f"in texture() cannot understand input {type(tname)}") - return self - - if tcoords is not None: - - if isinstance(tcoords, str): - vtarr = pd.GetPointData().GetArray(tcoords) - - else: - tcoords = np.asarray(tcoords) - if tcoords.ndim != 2: - vedo.logger.error("tcoords must be a 2-dimensional array") - return self - if tcoords.shape[0] != pd.GetNumberOfPoints(): - vedo.logger.error("nr of texture coords must match nr of points") - return self - if tcoords.shape[1] != 2: - vedo.logger.error("tcoords texture vector must have 2 components") - vtarr = numpy2vtk(tcoords) - vtarr.SetName("TCoordinates") - - pd.GetPointData().SetTCoords(vtarr) - pd.GetPointData().Modified() - - elif not pd.GetPointData().GetTCoords(): - - # TCoords still void.. - # check that there are no texture-like arrays: - names = self.pointdata.keys() - candidate_arr = "" - for name in names: - vtarr = pd.GetPointData().GetArray(name) - if vtarr.GetNumberOfComponents() != 2: - continue - t0, t1 = vtarr.GetRange() - if t0 >= 0 and t1 <= 1: - candidate_arr = name - - if candidate_arr: - - vtarr = pd.GetPointData().GetArray(candidate_arr) - pd.GetPointData().SetTCoords(vtarr) - pd.GetPointData().Modified() - - else: - # last resource is automatic mapping - tmapper = vtk.new("TextureMapToPlane") - tmapper.AutomaticPlaneGenerationOn() - tmapper.SetInputData(pd) - tmapper.Update() - tc = tmapper.GetOutput().GetPointData().GetTCoords() - if scale or ushift or vshift: - ntc = vtk2numpy(tc) - if scale: - ntc *= scale - if ushift: - ntc[:, 0] += ushift - if vshift: - ntc[:, 1] += vshift - tc = numpy2vtk(tc) - pd.GetPointData().SetTCoords(tc) - pd.GetPointData().Modified() - - if out_img: - tu.SetInputData(out_img) - tu.SetInterpolate(interpolate) - tu.SetRepeat(repeat) - tu.SetEdgeClamp(edge_clamp) - - self.properties.SetColor(1, 1, 1) - self.mapper.ScalarVisibilityOff() - self.actor.SetTexture(tu) - - if seam_threshold is not None: - tname = self.dataset.GetPointData().GetTCoords().GetName() - grad = self.gradient(tname) - ugrad, vgrad = np.split(grad, 2, axis=1) - ugradm, vgradm = mag2(ugrad), mag2(vgrad) - gradm = np.log(ugradm + vgradm) - largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] - uvmap = self.pointdata[tname] - # collapse triangles that have large gradient - new_points = self.vertices.copy() - for f in self.cells: - if np.isin(f, largegrad_ids).all(): - id1, id2, id3 = f - uv1, uv2, uv3 = uvmap[f] - d12 = mag2(uv1 - uv2) - d23 = mag2(uv2 - uv3) - d31 = mag2(uv3 - uv1) - idm = np.argmin([d12, d23, d31]) - if idm == 0: - new_points[id1] = new_points[id3] - new_points[id2] = new_points[id3] - elif idm == 1: - new_points[id2] = new_points[id1] - new_points[id3] = new_points[id1] - self.vertices = new_points - - self.dataset.Modified() - return self - def compute_normals(self, points=True, cells=True, feature_angle=None, consistency=True): """ Compute cell and vertex normals for the mesh. diff --git a/vedo/plotter.py b/vedo/plotter.py index e94e2447..ab2bbdd9 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -4324,7 +4324,7 @@ def _keypress(self, iren, event): elif key == "E": vedo.printc(r":camera: Exporting 3D window to file scene.npz, ", c="b", end="") vedo.file_io.export_window("scene.npz") - vedo.printc("try:\n> vedo scene.npz", c="b") + vedo.printc("try:\n> vedo scene.npz # (this is experimental!)", c="b") return elif key == "F": diff --git a/vedo/version.py b/vedo/version.py index a55f5b77..d7b09312 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev31a' +_version = '2023.5.0+dev32a' diff --git a/vedo/visual.py b/vedo/visual.py index 8fbfd23a..91931770 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import os import numpy as np from weakref import ref as weak_ref_to @@ -1377,9 +1378,15 @@ def update_trail(self): def _compute_shadow(self, plane, point, direction): shad = self.clone() - shad.dataset.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" + tarr = shad.dataset.GetPointData().GetTCoords() + if tarr: # remove any texture coords + tname = tarr.GetName() + shad.pointdata.remove(tname) + shad.dataset.GetPointData().SetTCoords(None) + shad.actor.SetTexture(None) + pts = shad.vertices if plane == "x": # shad = shad.project_on_plane('x') @@ -2278,6 +2285,205 @@ def lc(self, linecolor=None): """Set/get color of mesh edges. Same as `linecolor()`.""" return self.linecolor(linecolor) + def texture( + self, + tname, + tcoords=None, + interpolate=True, + repeat=True, + edge_clamp=False, + scale=None, + ushift=None, + vshift=None, + seam_threshold=None, + ): + """ + Assign a texture to mesh from image file or predefined texture `tname`. + If tname is set to `None` texture is disabled. + Input tname can also be an array or a `vtkTexture`. + + Arguments: + tname : (numpy.array, str, Image, vtkTexture, None) + the input texture to be applied. Can be a numpy array, a path to an image file, + a vedo Image. The None value disables texture. + tcoords : (numpy.array, str) + this is the (u,v) texture coordinate array. Can also be a string of an existing array + in the mesh. + interpolate : (bool) + turn on/off linear interpolation of the texture map when rendering. + repeat : (bool) + repeat of the texture when tcoords extend beyond the [0,1] range. + edge_clamp : (bool) + turn on/off the clamping of the texture map when + the texture coords extend beyond the [0,1] range. + Only used when repeat is False, and edge clamping is supported by the graphics card. + scale : (bool) + scale the texture image by this factor + ushift : (bool) + shift u-coordinates of texture by this amount + vshift : (bool) + shift v-coordinates of texture by this amount + seam_threshold : (float) + try to seal seams in texture by collapsing triangles + (test values around 1.0, lower values = stronger collapse) + + Examples: + - [texturecubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/texturecubes.py) + + ![](https://vedo.embl.es/images/basic/texturecubes.png) + """ + pd = self.dataset + out_img = None + + if tname is None: # disable texture + pd.GetPointData().SetTCoords(None) + pd.GetPointData().Modified() + return self ###################################### + + if isinstance(tname, vtk.vtkTexture): + tu = tname + + elif isinstance(tname, vedo.Image): + tu = vtk.vtkTexture() + out_img = tname + + elif utils.is_sequence(tname): + tu = vtk.vtkTexture() + out_img = vedo.image._get_img(tname) + + elif isinstance(tname, str): + tu = vtk.vtkTexture() + + if "https://" in tname: + try: + tname = vedo.file_io.download(tname, verbose=False) + except: + vedo.logger.error(f"texture {tname} could not be downloaded") + return self + + fn = tname + ".jpg" + if os.path.exists(tname): + fn = tname + else: + vedo.logger.error(f"texture file {tname} does not exist") + return self + + fnl = fn.lower() + if ".jpg" in fnl or ".jpeg" in fnl: + reader = vtk.new("JPEGReader") + elif ".png" in fnl: + reader = vtk.new("PNGReader") + elif ".bmp" in fnl: + reader = vtk.new("BMPReader") + else: + vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") + return self + reader.SetFileName(fn) + reader.Update() + out_img = reader.GetOutput() + + else: + vedo.logger.error(f"in texture() cannot understand input {type(tname)}") + return self + + if tcoords is not None: + + if isinstance(tcoords, str): + vtarr = pd.GetPointData().GetArray(tcoords) + + else: + tcoords = np.asarray(tcoords) + if tcoords.ndim != 2: + vedo.logger.error("tcoords must be a 2-dimensional array") + return self + if tcoords.shape[0] != pd.GetNumberOfPoints(): + vedo.logger.error("nr of texture coords must match nr of points") + return self + if tcoords.shape[1] != 2: + vedo.logger.error("tcoords texture vector must have 2 components") + vtarr = utils.numpy2vtk(tcoords) + vtarr.SetName("TCoordinates") + + pd.GetPointData().SetTCoords(vtarr) + pd.GetPointData().Modified() + + elif not pd.GetPointData().GetTCoords(): + + # TCoords still void.. + # check that there are no texture-like arrays: + names = self.pointdata.keys() + candidate_arr = "" + for name in names: + vtarr = pd.GetPointData().GetArray(name) + if vtarr.GetNumberOfComponents() != 2: + continue + t0, t1 = vtarr.GetRange() + if t0 >= 0 and t1 <= 1: + candidate_arr = name + + if candidate_arr: + + vtarr = pd.GetPointData().GetArray(candidate_arr) + pd.GetPointData().SetTCoords(vtarr) + pd.GetPointData().Modified() + + else: + # last resource is automatic mapping + tmapper = vtk.new("TextureMapToPlane") + tmapper.AutomaticPlaneGenerationOn() + tmapper.SetInputData(pd) + tmapper.Update() + tc = tmapper.GetOutput().GetPointData().GetTCoords() + if scale or ushift or vshift: + ntc = utils.vtk2numpy(tc) + if scale: + ntc *= scale + if ushift: + ntc[:, 0] += ushift + if vshift: + ntc[:, 1] += vshift + tc = utils.numpy2vtk(tc) + pd.GetPointData().SetTCoords(tc) + pd.GetPointData().Modified() + + if out_img: + tu.SetInputData(out_img) + tu.SetInterpolate(interpolate) + tu.SetRepeat(repeat) + tu.SetEdgeClamp(edge_clamp) + + self.properties.SetColor(1, 1, 1) + self.mapper.ScalarVisibilityOff() + self.actor.SetTexture(tu) + + if seam_threshold is not None: + tname = self.dataset.GetPointData().GetTCoords().GetName() + grad = self.gradient(tname) + ugrad, vgrad = np.split(grad, 2, axis=1) + ugradm, vgradm = mag2(ugrad), mag2(vgrad) + gradm = np.log(ugradm + vgradm) + largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] + uvmap = self.pointdata[tname] + # collapse triangles that have large gradient + new_points = self.vertices.copy() + for f in self.cells: + if np.isin(f, largegrad_ids).all(): + id1, id2, id3 = f + uv1, uv2, uv3 = uvmap[f] + d12 = mag2(uv1 - uv2) + d23 = mag2(uv2 - uv3) + d31 = mag2(uv3 - uv1) + idm = np.argmin([d12, d23, d31]) + if idm == 0: + new_points[id1] = new_points[id3] + new_points[id2] = new_points[id3] + elif idm == 1: + new_points[id2] = new_points[id1] + new_points[id3] = new_points[id1] + self.vertices = new_points + + self.dataset.Modified() + return self ######################################################################################## class VolumeVisual(CommonVisual): diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index e27f46c2..16eec8b4 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -24,7 +24,7 @@ def get_class(cls_name="", module_name=""): print(vtk.get_class("vtkActor", "vtkRenderingCore")) ``` """ - if cls_name and not cls_name.startswith("vtk"): + if cls_name and not cls_name.lower().startswith("vtk"): cls_name = "vtk" + cls_name if not module_name: module_name = location[cls_name] From ff90bcd48eafc5d81335e225a4eb4b5131855ec2 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 10 Nov 2023 20:37:01 +0100 Subject: [PATCH 233/251] volume fixes --- .gitignore | 2 +- docs/changes.md | 2 +- vedo/file_io.py | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 05aa3dc6..1b0dfad7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ examples/notebooks/.ipynb_checkpoints *jpg *tiff *tif -*npz +# *npz untitled*.py bug_*.py diff --git a/docs/changes.md b/docs/changes.md index aea0e057..6a6d5988 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -90,6 +90,6 @@ mesh_map2cell.py rotate_image.py (miss transform) texturecubes.py meshquality.py - +volumetric/streamlines1.py test offline screenshot diff --git a/vedo/file_io.py b/vedo/file_io.py index a90ea587..3bea9c41 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -990,6 +990,8 @@ def _import_npy(fileinput): ### Volume elif d['type'].lower() == 'volume': obj = Volume(d["array"]) + obj.spacing(d["spacing"]) + obj.origin(d["origin"]) if "jittering" in d.keys(): obj.jittering(d["jittering"]) obj.mode(d["mode"]) obj.color(d["color"]) @@ -1443,6 +1445,8 @@ def _fillcommon(obj, adict): _fillcommon(obj, adict) adict["array"] = obj.tonumpy() adict["mode"] = obj.mode() + adict["spacing"] = obj.spacing() + adict["origin"] = obj.origin() prp = obj.properties ctf = prp.GetRGBTransferFunction() From dfcedf3c827e533ac95f46bf063fbd7d31627eee Mon Sep 17 00:00:00 2001 From: marcomusy Date: Fri, 10 Nov 2023 22:21:29 +0100 Subject: [PATCH 234/251] fixes to docs mainly --- docs/changes.md | 84 ++++++++++++++++------------- examples/advanced/spline_draw.py | 4 +- examples/other/run_all.sh | 1 + examples/volumetric/streamlines3.py | 5 +- tests/issues/discussion_784.py | 2 +- tests/test_pipeline.txt | 30 ++++++----- vedo/pointcloud.py | 2 + vedo/shapes.py | 7 ++- vedo/utils.py | 2 + vedo/volume.py | 4 ++ vedo/vtkclasses.py | 18 ++++--- 11 files changed, 93 insertions(+), 66 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 6a6d5988..fc231e29 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,53 +1,58 @@ ## Main changes +Major internal refactoring. -- added `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. -- bug fix in `closest_point()` thanks to @goncalo-pt -- bug fix in tformat thanks to @JohnsWor in #913 -- add texture to npz files thanks to @zhouzq-thu in #918 +### Breaking changes +- requires vtk=>9.0 +- plt.actors must become plt.objects +- change `.points()` to `.vertices` +- change `.cell_centers()` to `.cell_centers` +- change `.faces()` to `.cells` +- change `.lines()` to `.lines` +- change `.edges()` to `.edges` +- change `.normals()` to `.vertex_normals` and `.cell_normals` +- removed `Volume.probe_points()` which becomes `points.probe(volume)` +- removed `Volume.probe_line()` which becomes `line.probe(volume)` +- removed `Volume.probe_plane()` which becomes `plane.probe(volume)` +- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is + therefore not muted by any subsequent interaction (thanks @baba-yaga ) -- Fix meshlab interface thanks to @JeffreyWardman in #924 -- Update `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 -- Improvemnets on `applications.Slicer3DPlotter` -- Improvements on `applications.Browser` + +- add `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. +- add texture to npz files thanks to @zhouzq-thu in #918 - add background radial gradients - add `utils.line_line_distance()` - add `utils.segment_segment_distance()` -- addressed bug on windows OS in timers callbacks thanks to @jonaslindemann - add `plotter.initialize_interactor()` -- add object hinting (flag_labels1.py) by hovering mouse +- add object hinting by hovering mouse (see `flag_labels1.py`) - add `colors.lut_color_at(value)` the color of the lookup table at value. -- remove `picture.Picture2D(...)` which becomes `Image(...).clone2d()` -see `examples/pyplot/embed_matplotlib.py`. -- improvements to method `mesh.clone2d()` -- name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` -- reformat how vtk classes are imported (allow some laziness) - add `.show(..., screenshot="myfile.png")` keyword - add `object.coordinates` same as `object.vertices` -- fixing to non linear tranforms mode. Now it can be instantiated with a dictionary - add `move()` to move single points or objects +- add `move()` to move single points or objects - add `copy()` as alias to `clone()` -- remove `file_io.load_transform()` LinearTransform("file.mat") substitutes this - add "Roll" to camera settings (thanks @baba-yaga ) +- add `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz +- remove `file_io.load_transform()`. LinearTransform("file.mat") substitutes this +- remove `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). -### Breaking changes -- requires vtk=>9.0 -- plt.actors must become plt.objects -- change .points() to .vertices -- change .cell_centers() to .cell_centers -- change .faces() to .cells -- change .lines() to .lines -- change .edges() to .edges -- change .normals() to .vertex_normals and .cell_normals -- removed `Volume.probe_points()` -- removed `Volume.probe_line()` -- removed `Volume.probe_plane()` -- `Slicer2DPlotter` moved to application module -- `mesh.is_inside(pt)` moved to `mesh.contains(pt)` -- added `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz -- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is -therefore not muted by any subsequent interaction (thanks @baba-yaga ) +- bug fix in `closest_point()` thanks to @goncalo-pt +- bug fix in tformat thanks to @JohnsWor in #913 +- bug fix in windows OS in timers callbacks thanks to @jonaslindemann +- bug fix to non linear tranforms mode. Now it can be instantiated with a dictionary +- bug fix in meshlab interface thanks to @JeffreyWardman in #924 + +- improvements in how vtk classes are imported (allow some laziness) +- improvements to method `mesh.clone2d()` +- improvements in `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 +- improvements in `applications.Browser` +- name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` +- name change `transform_with_landmarks()` to `align_with_landmarks()` +- name change `find_cells_in()` to `find_cells_in_bounds()` +- name change `mesh.is_inside(pt)` moved to `mesh.contains(pt)` +- name change `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` +- name change method `voronoi()` moved to `points.generate_voronoi()` +- name change class `Ruler` becomes `Ruler3D` ------------------------- ## New/Revised Examples @@ -74,14 +79,17 @@ examples/simulations/springs_fem.py ``` tests/issues/discussion_800.py tests/issues/issue_905.py - gyroscope1.py broken tet_cut2.py broken markpoint.py plot_spheric.py ``` -### broken in npz dump: +#### Broken Projects +umap_viewer3d +trackviewer (some problems with removing a track) + +#### Broken in .npz dump: boolean.py cartoony.py flatarrow.py @@ -92,4 +100,4 @@ texturecubes.py meshquality.py volumetric/streamlines1.py -test offline screenshot + diff --git a/examples/advanced/spline_draw.py b/examples/advanced/spline_draw.py index c2d4b5e8..d0e6be69 100644 --- a/examples/advanced/spline_draw.py +++ b/examples/advanced/spline_draw.py @@ -5,7 +5,9 @@ plt = SplinePlotter(pic) plt.show(mode="image", zoom='tightest') -print("Npts =", len(plt.cpoints), "NSpline =", plt.line.npoints) + +if plt.line: + print("Npts =", len(plt.cpoints), "NSpline =", plt.line.npoints) ##################################################################### diff --git a/examples/other/run_all.sh b/examples/other/run_all.sh index 835a888b..8c0c4fda 100755 --- a/examples/other/run_all.sh +++ b/examples/other/run_all.sh @@ -8,6 +8,7 @@ for f in *.py; do case $f in wx*.py) continue;; esac case $f in trame*.py) continue;; esac case $f in *video*.py) continue;; esac + case $f in *napari*.py) continue;; esac echo "Processing: examples/other/$f" python "$f" done \ No newline at end of file diff --git a/examples/volumetric/streamlines3.py b/examples/volumetric/streamlines3.py index 6855f75a..c206f9e6 100644 --- a/examples/volumetric/streamlines3.py +++ b/examples/volumetric/streamlines3.py @@ -1,9 +1,8 @@ """Draw streamlines for the cavity case from OpenFOAM tutorial""" from vedo import * -# Load file as type vtkUnStructuredGrid -fpath = download(dataurl+"cavity.vtk") -ugrid = loadUnStructuredGrid(fpath) +# Load an UnStructuredGrid +ugrid = UGrid(dataurl+"cavity.vtk") # Make a grid of points to probe as type Mesh probe = Grid(s=[0.1,0.01], res=[20,4], c='k') diff --git a/tests/issues/discussion_784.py b/tests/issues/discussion_784.py index c8aefdf4..b16d1e89 100644 --- a/tests/issues/discussion_784.py +++ b/tests/issues/discussion_784.py @@ -2,7 +2,7 @@ from vedo import * s = Sphere(quads=True, res=10) # some test points in space -pts = s.points() +pts = s.vertices vpts = Points(pts) vpts.compute_normals_with_pca(invert=True) diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt index 92b81a2c..714900d5 100644 --- a/tests/test_pipeline.txt +++ b/tests/test_pipeline.txt @@ -25,25 +25,27 @@ pip install trimesh -U # DRY RUN ###################################### cd ~/Projects/vedo/ -sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py -cd ~/Projects/vedo/examples/ && ./run_all.sh | tee logfile.txt -cd ~/Projects/vedo/ -sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py +sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py ### DISABLE VIZ +sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py ### ENABLE VIZ -code examples/logfile.txt ##### inspect logfile -# try normal run too with viz to make sure all is ok. +cd ~/Projects/vedo/tests/common && ./run_all.sh +cd ~/Projects/vedo/examples/ && time ./run_all.sh 2>&1 | tee ~/Dropbox/vedo_test.txt -# TUTORIALS #################################### -cd ~/Projects/server/vedo-embo-course/scripts -cd ~/Projects/server/vedo-bias-course/scripts +code ~/Dropbox/vedo_test.txt #### inspect logfile (search "Traceback", "Error") #### +# (Try normal run too with visualization to make sure all is ok.) # EXAMPLES ##################################### -cd ~/Projects/vedo/tests/common && ./run_all.sh cd ~/Projects/vedo/tests/issues && ./run_all.sh +# TUTORIALS #################################### +cd ~/Projects/server/vedo-embo-course/scripts && ./run_all.sh +cd ~/Projects/server/vedo-bias-course/scripts && ./run_all.sh + # DOLFIN/TRIMESH ############################### -cd ~/Projects/vedo/examples/other/dolfin +cd ~/Projects/vedo/ conda activate fenics +pip install . +cd examples/other/dolfin ./run_all.sh conda deactivate ################ @@ -51,20 +53,19 @@ cd ~/Projects/vedo/examples/other/trimesh ./run_all.sh # Various other ############################### +cd ~/Projects/vedo/ python ~/Dropbox/documents/Medical/RESONANCIA.py vedo https://vedo.embl.es/examples/data/panther.stl.gz vedo https://vedo.embl.es/examples/geo_scene.npz -# check vedo convert cli: -cd ~/Projects/vedo vedo --convert data/290.vtk --to ply && vedo data/290.ply # NOTEBOOKS ##################################### cd ~/Projects/vedo/examples/notebooks/ jupyter notebook > /dev/null 2>&1 +################################################# # Check on OSX and windows - # VEDO PROJECTS ################################# cd ~/Projects/server/trackviewer ./main_test.py @@ -94,6 +95,7 @@ cd ~/Projects/umap_viewer3d ################ cd ~/Projects/napari-vedo-bridge conda activate napari-env + python ~/Projects/vedo/examples/other/napari1.py napari conda deactivate ################ diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 99999adb..9bfc0580 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -591,6 +591,8 @@ def fibonacci_sphere(n): else: # try to extract the points from a generic VTK input data object + if hasattr(inputobj, "dataset"): + inputobj = inputobj.dataset try: vvpts = inputobj.GetPoints() self.dataset.SetPoints(vvpts) diff --git a/vedo/shapes.py b/vedo/shapes.py index e1ad0306..ef791376 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -1522,6 +1522,11 @@ def StreamLines( ![](https://vedo.embl.es/images/volumetric/56964003-9145a500-6b5a-11e9-9d9e-9736d90e1900.png) """ + try: + domain = domain.dataset + except AttributeError: + pass + if isinstance(domain, vedo.Points): if extrapolate_to_box: grid = _interpolate2vol(domain, **extrapolate_to_box) @@ -4577,7 +4582,7 @@ def __init__( bold=False, italic=False, c=None, - alpha=0.2, + alpha=0.5, ): """ Create a 2D text object. diff --git a/vedo/utils.py b/vedo/utils.py index 395677f2..8cda0756 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -470,6 +470,8 @@ def make3d(pts): Array can also be in the form `[allx, ally, allz]`. """ + if pts is None: + return np.array([]) pts = np.asarray(pts) if pts.dtype == "object": diff --git a/vedo/volume.py b/vedo/volume.py index a7224c3f..01f681a6 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -214,6 +214,10 @@ def mapper(self, mapper): raise RuntimeError() self.actor.SetMapper(mapper) + def c(self, *args, **kwargs): + """Deprecated. Use `Volume.cmap()` instead.""" + vedo.logger.warning("Volume.c() is deprecated, use Volume.cmap() instead") + return self.cmap(*args, **kwargs) def _update(self, data): self.dataset = data diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 16eec8b4..be182179 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -99,26 +99,28 @@ def dump_hierarchy_to_file(fname=""): if settings.dry_run_mode < 2: #https://vtk.org/doc/nightly/html # /md__builds_gitlab_kitware_sciviz_ci_Documentation_Doxygen_PythonWrappers.html - # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 # noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences - from vtkmodules.vtkInteractionStyle import vtkInteractorStyleUser - # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType - # noinspection PyUnresolvedReferences - from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLGPUVolumeRayCastMapper, - vtkSmartVolumeMapper, - ) + +# noinspection PyUnresolvedReferences +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleUser + +# noinspection PyUnresolvedReferences +from vtkmodules.vtkRenderingVolumeOpenGL2 import ( + vtkOpenGLGPUVolumeRayCastMapper, + vtkSmartVolumeMapper, +) for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", ]: location[name] = "vtkRenderingVolumeOpenGL2" + ###################################################################### for name in [ From 832a460ee498bac083d75541ed313d3402a26d1a Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 16:01:57 +0100 Subject: [PATCH 235/251] check and fix code snippets --- docs/changes.md | 3 +- examples/volumetric/numpy2volume0.py | 11 ++++ vedo/core.py | 63 ++++++++++--------- vedo/file_io.py | 16 ++--- vedo/image.py | 26 ++++---- vedo/interactor_modes.py | 15 +---- vedo/mesh.py | 12 ++-- vedo/plotter.py | 42 +++++++------ vedo/pointcloud.py | 23 +++---- vedo/pyplot.py | 8 ++- vedo/settings.py | 62 +++++++++++++------ vedo/shapes.py | 19 +++--- vedo/transformations.py | 91 ++++++++++++---------------- vedo/utils.py | 7 ++- vedo/visual.py | 2 +- vedo/volume.py | 9 +-- 16 files changed, 213 insertions(+), 196 deletions(-) create mode 100644 examples/volumetric/numpy2volume0.py diff --git a/docs/changes.md b/docs/changes.md index fc231e29..3c642798 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -16,7 +16,7 @@ Major internal refactoring. - passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga ) - +- add brand new `transformations` module. - add `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - add texture to npz files thanks to @zhouzq-thu in #918 - add background radial gradients @@ -67,6 +67,7 @@ examples/advanced/timer_callback2.py examples/advanced/warp4a.py examples/advanced/warp4b.py examples/simulations/lorenz.py +examples/volumetric/numpy2volume0.py examples/volumetric/slicer1.py examples/other/flag_labels1.py examples/pyplot/embed_matplotlib.py diff --git a/examples/volumetric/numpy2volume0.py b/examples/volumetric/numpy2volume0.py new file mode 100644 index 00000000..4cf388db --- /dev/null +++ b/examples/volumetric/numpy2volume0.py @@ -0,0 +1,11 @@ +"""Modify a Volume in-place from a numpy array""" +from vedo import Volume, dataurl, show + +vol = Volume(dataurl+"embryo.tif") + +arr = vol.tonumpy() +arr[:] = arr/5 + 15 # modify the array in-place with [:] + +vol.modified() + +show(vol, __doc__, axes=1).close() diff --git a/vedo/core.py b/vedo/core.py index 961a2e36..0fe53cc2 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1358,16 +1358,19 @@ def __init__(self): def apply_transform(self, LT, concatenate=True, deep_copy=True): """ Apply a linear or non-linear transformation to the mesh polygonal data. - ```python - from vedo import Cube, show, settings - settings.use_parallel_projection = True - c1 = Cube().rotate_z(25).pos(2,1).mirror() - T = c1.transform # rotate by 5 degrees, place at (2,1) - c2 = Cube().c('red4').wireframe().lw(10).lighting('off') - c2.apply_transform(T) - show(c1, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/apply_transform.png) + + Example: + ```python + from vedo import Cube, show, settings + settings.use_parallel_projection = True + c1 = Cube().rotate_z(25).pos(2,1).mirror().alpha(0.5) + T = c1.transform # rotate by 5 degrees, place at (2,1) + c2 = Cube().c('red4').wireframe().lw(10).lighting('off') + c2.apply_transform(T) + show(c1, c2, "The 2 cubes should overlap!", axes=1).close() + ``` + + ![](https://vedo.embl.es/images/feats/apply_transform.png) """ if self.dataset.GetNumberOfPoints() == 0: return self @@ -1484,17 +1487,18 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): Rotate around an arbitrary `axis` passing through `point`. Example: - ```python - from vedo import * - c1 = Cube() - c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - v = vector(0.2,1,0) - p = vector(1,0,0) # axis passes through this point - c2.rotate(90, axis=v, point=p) - l = Line(-v+p, v+p).lw(3).c('red') - show(c1, l, c2, axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/rotate_axis.png) + ```python + from vedo import * + c1 = Cube() + c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 + v = vector(0.2,1,0) + p = vector(1,0,0) # axis passes through this point + c2.rotate(90, axis=v, point=p) + l = Line(-v+p, v+p).lw(3).c('red') + show(c1, l, c2, axes=1).close() + ``` + + ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ LT = LinearTransform() LT.rotate(angle, axis, point, rad) @@ -2062,14 +2066,15 @@ def cut_with_box(self, box): This method always returns a TetMesh object. Example: - ```python - from vedo import * - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') - tetmesh.color('rainbow') - cu = Cube(side=500).x(500) # any Mesh works - tetmesh.cut_with_box(cu).show(axes=1) - ``` - ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + ```python + from vedo import * + tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') + tetmesh.color('rainbow') + cu = Cube(side=500).x(500) # any Mesh works + tetmesh.cut_with_box(cu).show(axes=1) + ``` + + ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ bc = vtk.new("BoxClipDataSet") bc.SetInputData(self.dataset) diff --git a/vedo/file_io.py b/vedo/file_io.py index 3bea9c41..2c6f8086 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1573,7 +1573,7 @@ def _export_npy(plt, fileoutput="scene.npz"): ######################################################################## def import_window(fileinput, mtl_file=None, texture_path=None): - """Import a whole scene from a Numpy, HDF5 or OBJ wavefront file. + """Import a whole scene from a Numpy, OBJ wavefront file. Arguments: mtl_file : (str) @@ -1587,8 +1587,8 @@ def import_window(fileinput, mtl_file=None, texture_path=None): if fileinput.endswith(".npy") or fileinput.endswith(".npz"): return _import_npy(fileinput) - elif fileinput.endswith(".h5") or fileinput.endswith(".hdf5"): - return _import_hdf5(fileinput) + # elif fileinput.endswith(".h5") or fileinput.endswith(".hdf5"): + # return _import_hdf5(fileinput) # in store/file_io_HDF5.py elif ".obj" in fileinput.lower(): @@ -1738,11 +1738,11 @@ def ask(*question, **kwarg): the default answer when just hitting return. Example: - ```python - import vedo - res = vedo.file_io.ask("Continue?", options=['Y','n'], default='Y', c='g') - print(res) - ``` + ```python + import vedo + res = vedo.ask("Continue?", options=['Y','n'], default='Y', c='g') + print(res) + ``` """ kwarg.update({"end": " "}) if "invert" not in kwarg: diff --git a/vedo/image.py b/vedo/image.py index a52f8ace..3a81eeb0 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -504,7 +504,7 @@ def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): def pad(self, pixels=10, value=255): """ Add the specified number of pixels at the image borders. - Pixels can be a list formatted as [left,right,bottom,top]. + Pixels can be a list formatted as `[left, right, bottom, top]`. Arguments: pixels : (int, list) @@ -752,7 +752,7 @@ def enhance(self): Example: ```python from vedo import * - pic = Image(vedo.dataurl+'images/dog.jpg').bw() + pic = Image(dataurl+'images/dog.jpg').bw() show(pic, pic.clone().enhance(), N=2, mode='image', zoom='tight') ``` ![](https://vedo.embl.es/images/feats/pict_enhance.png) @@ -1056,14 +1056,14 @@ def binarize(self, threshold=None, invert=False): invert threshold direction Example: - ```python - from vedo import Image, show - pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") - pic2 = pic1.clone().invert() - pic3 = pic1.clone().binarize() - show(pic1, pic2, pic3, N=3, bg="blue9").close() - ``` - ![](https://vedo.embl.es/images/feats/pict_binarize.png) + ```python + from vedo import Image, show + pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") + pic2 = pic1.clone().invert() + pic3 = pic1.clone().binarize() + show(pic1, pic2, pic3, N=3, bg="blue9").close() + ``` + ![](https://vedo.embl.es/images/feats/pict_binarize.png) """ rgb = self.tonumpy() if rgb.ndim == 3: @@ -1263,9 +1263,9 @@ def add_rectangle(self, xspan, yspan, c="green5", alpha=1): ```python import vedo pic = vedo.Image(vedo.dataurl+"images/dog.jpg") - pic.rectangle([100,300], [100,200], c='green4', alpha=0.7) - pic.line([100,100],[400,500], lw=2, alpha=1) - pic.triangle([250,300], [100,300], [200,400], c='blue5') + pic.add_rectangle([100,300], [100,200], c='green4', alpha=0.7) + pic.add_line([100,100],[400,500], lw=2, alpha=1) + pic.add_triangle([250,300], [100,300], [200,400], c='blue5') vedo.show(pic, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/pict_drawon.png) diff --git a/vedo/interactor_modes.py b/vedo/interactor_modes.py index c60596b0..ef59afc0 100644 --- a/vedo/interactor_modes.py +++ b/vedo/interactor_modes.py @@ -257,21 +257,10 @@ class BlenderStyle(vtk.vtkInteractorStyleUser): .. note:: This class is based on R. de Bruin's [DAVE](https://github.com/RubendeBruin/DAVE/blob/master/src/DAVE/visual_helpers/vtkBlenderLikeInteractionStyle.py) - implementation as discussed in this - [issue](https://github.com/marcomusy/vedo/discussions/788). + implementation as discussed [in this issue](https://github.com/marcomusy/vedo/discussions/788). Example: - ```python - from vedo import * - settings.enable_default_keyboard_callbacks = False - settings.enable_default_mouse_callbacks = False - mesh = Mesh(dataurl+"cow.vtk") - mode = interactor_modes.BlenderStyle() - plt = Plotter().user_mode(mode) - plt.show(mesh, axes=1) - ``` - - - [interaction_modes2.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/interaction_modes2.py) + [interaction_modes2.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/interaction_modes2.py) """ def __init__(self): diff --git a/vedo/mesh.py b/vedo/mesh.py index 1f527b63..b5ea6fc7 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -894,12 +894,12 @@ def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): set the range of the scalar Example: - ```python - from vedo import Sphere - s = Sphere().compute_elevation(low=(0,0,0), high=(1,1,1)) - s.add_scalarbar().show(axes=1).close() - ``` - ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) + ```python + from vedo import Sphere + s = Sphere().compute_elevation(low=(0,0,0), high=(1,1,1)) + s.add_scalarbar().show(axes=1).close() + ``` + ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ ef = vtk.new("ElevationFilter") ef.SetInputData(self.dataset) diff --git a/vedo/plotter.py b/vedo/plotter.py index ab2bbdd9..104bd2ff 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2411,8 +2411,7 @@ def add_scale_indicator( cs.SetCoordinateSystem(1) mapper.SetTransformCoordinate(cs) - # fractor = vtk.vtkActor2D() - fractor = vedo.core.Actor2D() + fractor = vedo.visual.Actor2D() csys = fractor.GetPositionCoordinate() csys.SetCoordinateSystem(3) fractor.SetPosition(pos) @@ -2600,7 +2599,7 @@ def func(evt): if not evt.object: return # no hit, return print("point coords =", evt.picked3d) - # print("full event dump:", evt) + # print(evt) # full event dump elli = Ellipsoid() plt = Plotter(axes=1) @@ -2675,7 +2674,7 @@ def kfunc(event): def rfunc(event): if event.isImage: - printc("Right-clicked!\n", event) + printc("Right-clicked!", event) plt.render() img = Image(dataurl+"images/embryo.jpg") @@ -2685,7 +2684,7 @@ def rfunc(event): plt.remove_all_observers() plt.add_callback("key press", kfunc) plt.add_callback("mouse right click", rfunc) - plt.show("Right-Click Me!\nPrees q to exit.", img) + plt.show("Right-Click Me! Press q to exit.", img) plt.close() ``` """ @@ -2820,10 +2819,10 @@ def compute_screen_coordinates(self, obj, full_window=False): ```python from vedo import * - elli = Ellipsoid().rotate_y(30) + elli = Ellipsoid().point_size(5) plt = Plotter() - plt.show(elli) + plt.show(elli, "Press q to continue and print the info") xyscreen = plt.compute_screen_coordinates(elli) print('xyscreen coords:', xyscreen) @@ -2871,12 +2870,13 @@ def mode_select(objs): d1 = mode.end_x, mode.end_y frustum = plt.pick_area(d0, d1) - infru = frustum.inside_points(mesh) col = np.random.randint(0, 10) - infru.ps(10).c(col) + infru = frustum.inside_points(mesh) + infru.point_size(10).color(col) plt.add(frustum, infru).render() - mesh = Mesh(dataurl+"cow.vtk").c("k5").lw(1) + mesh = Mesh(dataurl+"cow.vtk") + mesh.color("k5").linewidth(1) mode = interactor_modes.BlenderStyle() mode.callback_select = mode_select @@ -3594,8 +3594,10 @@ def screenshot(self, filename="screenshot.png", scale=1, asarray=False): Warning: If you get black screenshots try to set `interactive=False` in `show()` - then call `screenshot()` and `plt.interactive()`: - ```python + then call `screenshot()` and `plt.interactive()` afterwards. + + Example: + ```py from vedo import * sphere = Sphere().linewidth(1) plt = show(sphere, interactive=False) @@ -3605,14 +3607,14 @@ def screenshot(self, filename="screenshot.png", scale=1, asarray=False): ``` Example: - ```py - from vedo import * - sphere = Sphere().linewidth(1) - plt = show(sphere, interactive=False) - plt.screenhot('anotherimage.png') - plt.interactive() - plt.close() - ``` + ```py + from vedo import * + sphere = Sphere().linewidth(1) + plt = show(sphere, interactive=False) + plt.screenhot('anotherimage.png') + plt.interactive() + plt.close() + ``` """ return vedo.file_io.screenshot(filename, scale, asarray) diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 9bfc0580..ad44c27e 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -501,7 +501,7 @@ def fibonacci_sphere(n): r = np.sqrt(1 - y * y) x = np.cos(theta) * r z = np.sin(theta) * r - return [x,y,z] + return np._c[x,y,z] Points(fibonacci_sphere(1000)).show(axes=1).close() ``` @@ -1567,8 +1567,8 @@ def chamfer_distance(self, pcloud): cloud2 = np.random.randn(1000, 3) + [1, 2, 3] c1 = Points(cloud1, r=5, c="red") c2 = Points(cloud2, r=5, c="green") - print(c1.chamfer_distance(c2)) - show(c1, c2, axes=1, viewup="z").close() + d = c1.chamfer_distance(c2) + show(f"Chamfer distance = {d}", c1, c2, axes=1).close() ``` """ # Definition of Chamfer distance may vary, here we use the average @@ -1972,7 +1972,7 @@ def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): ```python from vedo import Cube cube = Cube().cut_with_plane(normal=(1,1,1)) - cube.back_color('pink').show() + cube.back_color('pink').show().close() ``` ![](https://vedo.embl.es/images/feats/cut_with_plane_cube.png) @@ -2068,7 +2068,7 @@ def cut_with_box(self, bounds, invert=False): mesh = Sphere(r=1, res=50) box = Cube(side=1.5).wireframe() mesh.cut_with_box(box) - show(mesh, box, axes=1) + show(mesh, box, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_box_cube.png) @@ -2162,8 +2162,9 @@ def cut_with_cookiecutter(self, lines): Polygon(nsides=10, r=0.2).pos(0.3, 0.7), ) lines = pols.boundaries() - grid.cut_with_cookiecutter(lines) - show(grid, lines, axes=8, bg='blackboard').close() + cgrid = grid.clone().cut_with_cookiecutter(lines) + grid.alpha(0.1).wireframe() + show(grid, cgrid, lines, axes=8, bg='blackboard').close() ``` ![](https://vedo.embl.es/images/feats/cookiecutter.png) @@ -2237,7 +2238,7 @@ def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False) disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_cylinder([0,0,2], r=0.4, axis='y', invert=True) - show(mesh, axes=1) + show(mesh, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_cylinder.png) @@ -2289,7 +2290,7 @@ def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_sphere([1,-0.7,2], r=1.5, invert=True) - show(mesh, axes=1) + show(mesh, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_sphere.png) @@ -3482,8 +3483,8 @@ def visible_points(self, area=(), tol=None, invert=False): show(s, camera=camopts, offscreen=True) m = s.visible_points() - #print('visible pts:', m.vertices) # numpy array - show(m, new=True, axes=1) # optionally draw result on a new window + # print('visible pts:', m.vertices) # numpy array + show(m, new=True, axes=1).close() # optionally draw result in a new window ``` ![](https://vedo.embl.es/images/feats/visible_points.png) """ diff --git a/vedo/pyplot.py b/vedo/pyplot.py index 100995bd..034616a7 100644 --- a/vedo/pyplot.py +++ b/vedo/pyplot.py @@ -1949,10 +1949,14 @@ def plot(*args, **kwargs): Example: ```python - from vedo.pyplot import plot import numpy as np + from vedo.pyplot import plot + from vedo import settings + settings.remember_last_figure_format = True ############# x = np.linspace(0, 6.28, num=50) - plot(np.sin(x), 'r').plot(np.cos(x), 'bo-').show().close() + fig = plot(np.sin(x), 'r-') + fig+= plot(np.cos(x), 'bo-') # no need to specify like=... + fig.show().close() ``` diff --git a/vedo/settings.py b/vedo/settings.py index aa72ee22..62cbf6e3 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -13,6 +13,7 @@ class Settings: ```python from vedo import settings, Cube settings.use_parallel_projection = True + # settings["use_parallel_projection"] = True # this is equivalent Cube().color('g').show().close() ``` @@ -675,35 +676,56 @@ def __init__(self): ) #################################################################################### - def reset(self): - """Reset all settings to their default status.""" - self.__init__() + def __getitem__(self, key): + """Make the class work like a dictionary too""" + return getattr(self, key) - def print(self): - """Print function.""" - print(" " + "-" * 80) + def __setitem__(self, key, value): + """Make the class work like a dictionary too""" + setattr(self, key, value) + + def __str__(self) -> str: + """Return a string representation of the object""" s = Settings.__doc__.replace(" ", "") s = s.replace(".. code-block:: python\n", "") + s = s.replace("```python\n", "") + s = s.replace("```\n", "") + s = s.replace("\n\n", "\n #------------------------------------------------------\n") + s = s.replace("\n ", "\n") + s = s.replace("\n ", "\n") + s = s.replace(" from", "from") try: from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter - s = highlight(s, Python3Lexer(), Terminal256Formatter(style="zenburn")) - print(s, end="") - - except ModuleNotFoundError: - print("\x1b[33;1m" + s + "\x1b[0m") - - def __getitem__(self, key): - """Make the class work like a dictionary too""" - return getattr(self, key) - - def __setitem__(self, key, value): - """Make the class work like a dictionary too""" - setattr(self, key, value) + except (ModuleNotFoundError, ImportError): + pass + + module = self.__class__.__module__ + name = self.__class__.__name__ + header = f"{module}.{name} at ({hex(id(self))})".ljust(75) + s = f"\x1b[1m\x1b[7m{header}\x1b[0m\n" + s + return s.strip() + + ############################################################ + def keys(self): + """Return all keys""" + return self.__slots__ + + def values(self): + """Return all values""" + return [getattr(self, key) for key in self.__slots__] + + def items(self): + """Return all items""" + return [(key, getattr(self, key)) for key in self.__slots__] + def reset(self): + """Reset all settings to their default status.""" + self.__init__() + ############################################################ def init_colab(self, enable_k3d=True): """ Initialize colab environment @@ -739,7 +761,7 @@ def init_colab(self, enable_k3d=True): print(" setup completed.") - + ############################################################ def start_xvfb(self): """ Start xvfb. diff --git a/vedo/shapes.py b/vedo/shapes.py index ef791376..733db3ce 100644 --- a/vedo/shapes.py +++ b/vedo/shapes.py @@ -613,7 +613,7 @@ def tangents(self): Example: ```python from vedo import * - shape = load(dataurl+"timecourse1d.npy")[58] + shape = Assembly(dataurl+"timecourse1d.npy")[58] pts = shape.rotate_x(30).vertices tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') @@ -635,7 +635,7 @@ def curvature(self): ```python from vedo import * from vedo.pyplot import plot - shape = load(dataurl+"timecourse1d.npy")[55] + shape = Assembly(dataurl+"timecourse1d.npy")[55] curvs = Line(shape.vertices).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) @@ -683,7 +683,7 @@ def sweep(self, direction=(1, 0, 0), res=1): from vedo import Line, show aline = Line([(0,0,0),(1,3,0),(2,4,0)]) surf1 = aline.sweep((1,0.2,0), res=3) - surf2 = aline.sweep((0.2,0,1)) + surf2 = aline.sweep((0.2,0,1)).alpha(0.5) aline.color('r').linewidth(4) show(surf1, surf2, aline, axes=1).close() ``` @@ -863,7 +863,8 @@ def __init__(self, pts, lw, res=10, c="gray4", alpha=1.0): ```python from vedo import * pts = [(-4,-3),(1,1),(2,4),(4,1),(3,-1),(2,-5),(9,-3)] - ln = Line(pts, c='r', lw=2).z(0.01) + ln = Line(pts).z(0.01) + ln.color("red5").linewidth(2) rl = RoundedLine(pts, 0.6) show(Points(pts), ln, rl, axes=1).close() ``` @@ -3004,6 +3005,7 @@ class Grid(Mesh): def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1.0): """ Create an even or uneven 2D grid. + Can also be created from a `np.mgrid` object (see example). Arguments: pos : (list, Points, Mesh) @@ -3020,17 +3022,16 @@ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1. Example: ```python from vedo import * - import numpy as np xcoords = np.arange(0, 2, 0.2) ycoords = np.arange(0, 1, 0.2) sqrtx = sqrt(xcoords) grid = Grid(s=(sqrtx, ycoords)).lw(2) - grid.show(axes=8) + grid.show(axes=8).close() - # can also create a grid from np.mgrid: - X, Y = np.mgrid[-12:12:1000*1j, 0:15:1000*1j] + # Can also create a grid from a np.mgrid: + X, Y = np.mgrid[-12:12:10*1j, 200:215:10*1j] vgrid = Grid(s=(X[:,0], Y[0])) - vgrid.show(axes=1).close() + vgrid.show(axes=8).close() ``` ![](https://vedo.embl.es/images/feats/uneven_grid.png) """ diff --git a/vedo/transformations.py b/vedo/transformations.py index 05064e8a..5953ed8e 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -46,8 +46,8 @@ def __init__(self, T=None): Can be saved to file and reloaded. Arguments: - T : (vtk.vtkTransform, numpy array) - vtk transformation. Defaults to None. + T : (vtkTransform, numpy array) + input transformation. Defaults to unit. Example: ```python @@ -56,20 +56,16 @@ def __init__(self, T=None): LT = LinearTransform() LT.translate([3,0,1]).rotate_z(45) + LT.comment = "shifting by (3,0,1) and rotating by 45 deg" print(LT) sph = Sphere(r=0.2) - print("Sphere before", s1.transform) - s1.apply_transform(LT) - # same as: - # LT.move(s1) - print("Sphere after ", s1.transform) + sph.apply_transform(LT) # same as: LT.move(s1) + print(sph.transform) - zero = Point([0,0,0]) - show(s1, zero, axes=1).close() + show(Point([0,0,0]), sph, str(LT.matrix), axes=1).close() ``` - """ - + """ self.name = "LinearTransform" self.filename = "" self.comment = "" @@ -150,18 +146,18 @@ def __init__(self, T=None): self.inverse_flag = False def __str__(self): - s = f"\x1b[7m\x1b[1mLinear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m" - if self.name: - s += "\nName: " + self.name + module = self.__class__.__module__ + name = self.__class__.__name__ + s = f"\x1b[7m\x1b[1m{module}.{name} at ({hex(id(self))})".ljust(75) + "\x1b[0m" + s += "\nname".ljust(15) + ": " + self.name if self.filename: - s += "\nFilename: " + self.filename + s += "\nfilename".ljust(15) + ": " + self.filename if self.comment: - s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' - if self.n_concatenated_transforms > 1: - s += f"\Concatenations: {self.n_concatenated_transforms}" - if self.inverse_flag: - s += "\nInverse transformation flag is True" - s += "\n" + str(self.matrix) + s += "\ncomment".ljust(15) + f': \x1b[3m"{self.comment}"\x1b[0m' + s += f"\nconcatenations".ljust(15) + f": {self.n_concatenated_transforms}" + s += "\ninverse flag".ljust(15) + f": {bool(self.inverse_flag)}" + arr = np.array2string(self.matrix, separator=', ') + s += "\nmatrix 4x4".ljust(15) + f":\n{arr}" return s def __repr__(self): @@ -247,22 +243,25 @@ def concatenate(self, T, pre_multiply=False): Example: ```python - from vedo import * + from vedo import LinearTransform A = LinearTransform() A.rotate_x(45) A.translate([7,8,9]) A.translate([10,10,10]) - print("A", A) + A.name = "My transformation A" + print(A) B = A.compute_inverse() B.shift([1,2,3]) + B.name = "My transformation B (shifted inverse of A)" + print(B) # A is applied first, then B - print("A.concatenate(B)", A.concatenate(B)) + # print("A.concatenate(B)", A.concatenate(B)) # B is applied first, then A - # print("B*A", B*A) + print(B*A) ``` """ if pre_multiply: @@ -329,10 +328,10 @@ def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): from vedo import * c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 - v = vector(0.2,1,0) - p = vector(1,0,0) # axis passes through this point + v = vector(0.2, 1, 0) + p = vector(1.0, 0, 0) # axis passes through this point c2.rotate(90, axis=v, point=p) - l = Line(-v+p, v+p).lw(3).c('red') + l = Line(p-v, p+v).c('red5').lw(3) show(c1, l, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) @@ -495,21 +494,6 @@ def reorient( set to True if angle is expressed in radians. xyplane : (bool) make an extra rotation to keep the object aligned to the xy-plane - - Example: - ```python - from vedo import * - center = np.array([581/2,723/2,0]) - objs = [] - for a in np.linspace(0, 6.28, 7): - v = vector(cos(a), sin(a), 0)*1000 - pic = Image(dataurl+"images/dog.jpg").rotate_z(10) - pic.reorient([0,0,1], v) - pic.pos(v - center) - objs += [pic, Arrow(v, v+v)] - show(objs, Point(), axes=1).close() - ``` - ![](https://vedo.embl.es/images/feats/orientation.png) """ newaxis = np.asarray(newaxis) / np.linalg.norm(newaxis) initaxis = np.asarray(initaxis) / np.linalg.norm(initaxis) @@ -675,21 +659,22 @@ def __init__(self, T=None, **kwargs): self.inverse_flag = False def __str__(self): - s = f"\x1b[7m\x1b[1mNon-Linear Transformation\x1b[0m \x1b[3m({self.__module__})\x1b[0m\n" + module = self.__class__.__module__ + name = self.__class__.__name__ + s = f"\x1b[7m\x1b[1m{module}.{name} at ({hex(id(self))})".ljust(75) + "\x1b[0m\n" + s += "name".ljust(9) + ": " + self.name + "\n" if self.filename: - s += "Filename: " + self.filename + "\n" - if self.name: - s += "Name : " + self.name + "\n" + s += "filename".ljust(9) + ": " + self.filename + "\n" if self.comment: - s += f'\nComment: \x1b[3m"{self.comment}"\x1b[0m' - s += f"Mode : {self.mode}\n" - s += f"Sigma : {self.sigma}\n" + s += "comment".ljust(9) + f': \x1b[3m"{self.comment}"\x1b[0m\n' + s += f"mode".ljust(9) + f": {self.mode}\n" + s += f"sigma".ljust(9) + f": {self.sigma}\n" p = self.source_points q = self.target_points - s += f"Sources : {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" - s += f"Targets : {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" + s += f"sources".ljust(9) + f": {p.size}, bounds {np.min(p, axis=0)}, {np.max(p, axis=0)}\n" + s += f"targets".ljust(9) + f": {q.size}, bounds {np.min(q, axis=0)}, {np.max(q, axis=0)}" return s - + def __repr__(self): return self.__str__() diff --git a/vedo/utils.py b/vedo/utils.py index 8cda0756..43a75561 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -255,10 +255,11 @@ def __init__( Example: ```python import time - pb = ProgressBar(0,400, c='red') + from vedo import ProgressBar + pb = ProgressBar(0,40, c='r') for i in pb.range(): time.sleep(0.1) - pb.print('some message') + pb.print() ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) """ @@ -393,7 +394,7 @@ def progressbar(iterable, c=None, bold=True, italic=False, title="", eta=True, w Example: ```python import time - for i in progressbar(range(100), c='red'): + for i in progressbar(range(100), c='r'): time.sleep(0.1) ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) diff --git a/vedo/visual.py b/vedo/visual.py index 91931770..fd041655 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2345,7 +2345,7 @@ def texture( elif isinstance(tname, vedo.Image): tu = vtk.vtkTexture() - out_img = tname + out_img = tname.dataset elif utils.is_sequence(tname): tu = vtk.vtkTexture() diff --git a/vedo/volume.py b/vedo/volume.py index 01f681a6..db665514 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -570,13 +570,8 @@ def modified(self): Mark the object as modified. Example: - ```python - from vedo import Volume - vol = Volume("path/to/mydata/data.tif") - arr = vol.tonumpy() - arr[:] = arr*2 + 15 - vol.modified() - ``` + + - [numpy2volume0.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume0.py) """ self.dataset.GetPointData().GetScalars().Modified() return self From b1e923c4243aefbaf8b6c85fdf6572cd243aaf1c Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 16:17:45 +0100 Subject: [PATCH 236/251] move .print() to common visual --- vedo/assembly.py | 5 ----- vedo/image.py | 5 ----- vedo/pointcloud.py | 5 ----- vedo/tetmesh.py | 4 ---- vedo/ugrid.py | 4 ---- vedo/visual.py | 6 +++++- vedo/volume.py | 5 ----- 7 files changed, 5 insertions(+), 29 deletions(-) diff --git a/vedo/assembly.py b/vedo/assembly.py index 8043190c..c6a7b1fc 100644 --- a/vedo/assembly.py +++ b/vedo/assembly.py @@ -288,11 +288,6 @@ def __str__(self): out+= " z=(" + bz1 + ", " + bz2 + ")\n" return out.rstrip() + "\x1b[0m" - def print(self): - """Print info about Assembly object.""" - print(self.__str__()) - return self - def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. diff --git a/vedo/image.py b/vedo/image.py index 3a81eeb0..399e17fe 100644 --- a/vedo/image.py +++ b/vedo/image.py @@ -277,11 +277,6 @@ def __str__(self): out += str(self.level()) + " / " + str(self.window()) + "\n" return out.rstrip() + "\x1b[0m" - def print(self): - """Print a description of the Image class.""" - print(self.__str__()) - return self - def _repr_html_(self): """ HTML representation of the Image object for Jupyter Notebooks. diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index ad44c27e..3f4b154d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -726,11 +726,6 @@ def __str__(self): out+= f", pointID={idp}, cellID={idc}\n" return out.rstrip() + "\x1b[0m" - - def print(self): - """Print a description of the Points/Mesh.""" - print(self.__str__()) - return self def _repr_html_(self): """ diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 01cdd15c..5f05141d 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -279,10 +279,6 @@ def __str__(self): return out.rstrip() + "\x1b[0m" - def print(self): - """Print a description of the TetMesh.""" - print(self.__str__()) - return self def _repr_html_(self): """ diff --git a/vedo/ugrid.py b/vedo/ugrid.py index f541627b..6165b296 100644 --- a/vedo/ugrid.py +++ b/vedo/ugrid.py @@ -210,10 +210,6 @@ def __str__(self): return out.rstrip() + "\x1b[0m" - def print(self): - """Print a description of the UGrid.""" - print(self.__str__()) - return self def _repr_html_(self): diff --git a/vedo/visual.py b/vedo/visual.py index fd041655..06eb26ef 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -37,7 +37,11 @@ def __init__(self): self.properties = None self.actor = None self.scalarbar = None - + + def print(self): + """Print object info.""" + print(self.__str__()) + return self @property def LUT(self): diff --git a/vedo/volume.py b/vedo/volume.py index db665514..e3fee166 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -272,11 +272,6 @@ def __str__(self): #utils.print_histogram(self, logscale=True, bins=8, height=15, c="b", bold=True) return out.rstrip() + "\x1b[0m" - def print(self): - """Print a description of the Volume.""" - print(self.__str__()) - return self - def _repr_html_(self): """ HTML representation of the Volume object for Jupyter Notebooks. From 3a25c2f7826d2431b77c628437f582ae0f219448 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 17:16:08 +0100 Subject: [PATCH 237/251] move ugrid into tetmesh module --- examples/volumetric/delaunay3d.py | 2 +- examples/volumetric/tet_cut2.py | 4 +- vedo/__init__.py | 1 - vedo/addons.py | 4 +- vedo/cli.py | 4 +- vedo/core.py | 44 +++- vedo/file_io.py | 2 +- vedo/plotter.py | 2 +- vedo/pointcloud.py | 33 +++ vedo/tetmesh.py | 343 +++++++++++++++++++++++++----- vedo/ugrid.py | 333 ----------------------------- vedo/utils.py | 2 +- vedo/visual.py | 2 +- 13 files changed, 371 insertions(+), 405 deletions(-) delete mode 100644 vedo/ugrid.py diff --git a/examples/volumetric/delaunay3d.py b/examples/volumetric/delaunay3d.py index af42b784..75345257 100644 --- a/examples/volumetric/delaunay3d.py +++ b/examples/volumetric/delaunay3d.py @@ -11,7 +11,7 @@ pin.subsample(0.05) # impose min separation (5% of bounding box) printc("# of points inside the sphere:", pin.npoints) -tmesh = delaunay3d(pin).shrink(0.95) +tmesh = pin.generate_delaunay3d().shrink(0.95) cmesh = tmesh.cut_with_plane(normal=(1,2,-1)) # cmesh.pipeline.show() # to show the graph of operations diff --git a/examples/volumetric/tet_cut2.py b/examples/volumetric/tet_cut2.py index 46bc1221..e5223887 100644 --- a/examples/volumetric/tet_cut2.py +++ b/examples/volumetric/tet_cut2.py @@ -15,11 +15,11 @@ msh1 = tetm1.tomesh().linewidth(0.1).cmap('Blues') # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): -tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True).cmap("jet") +tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) # Cut tetm, but the output will keep only the tets on the boundary: tetm3 = tetm.clone().cut_with_mesh(sphere, only_boundary=True) -tetm3.cmap("bone").add_scalarbar3d() +# tetm3.cmap("bone").add_scalarbar3d() show([ (msh1, sphere, __doc__), diff --git a/vedo/__init__.py b/vedo/__init__.py index 98cc98bf..7d753698 100644 --- a/vedo/__init__.py +++ b/vedo/__init__.py @@ -30,7 +30,6 @@ from vedo.core import * from vedo.shapes import * from vedo.file_io import * -from vedo.ugrid import * from vedo.assembly import * from vedo.pointcloud import * from vedo.mesh import * diff --git a/vedo/addons.py b/vedo/addons.py index ca087fa6..19566589 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -862,7 +862,7 @@ def ScalarBar( if not lut: return None - elif isinstance(obj, (Volume, TetMesh, vedo.UGrid)): + elif isinstance(obj, (Volume, TetMesh, vedo.UnstructuredGrid)): lut = utils.ctf2lut(obj) elif utils.is_sequence(obj) and len(obj) == 2: @@ -1032,7 +1032,7 @@ def ScalarBar3D( lut = obj.mapper.GetLookupTable() vmin, vmax = lut.GetRange() - elif isinstance(obj, (Volume, TetMesh, vedo.UGrid)): + elif isinstance(obj, (Volume, TetMesh, vedo.UnstructuredGrid)): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() diff --git a/vedo/cli.py b/vedo/cli.py index bba698ed..0f09d8eb 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -31,7 +31,7 @@ from vedo.image import Image from vedo.plotter import Plotter from vedo.tetmesh import TetMesh -from vedo.ugrid import UGrid +from vedo.tetmesh import UnstructuredGrid from vedo.volume import Volume import vedo @@ -834,7 +834,7 @@ def draw_scene(args): obj = load(f, force=args.reload) - if isinstance(obj, (TetMesh, UGrid)): + if isinstance(obj, (TetMesh, UnstructuredGrid)): obj = obj.tomesh().shrink(0.975).c(colb).alpha(args.alpha) elif isinstance(obj, vedo.Points): diff --git a/vedo/core.py b/vedo/core.py index 0fe53cc2..58a82ed3 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1826,7 +1826,7 @@ def isosurface(self, value=None, flying_edges=True): def tomesh(self, fill=True, shrink=1.0): """ - Build a polygonal Mesh from the current object. + Build a polygonal `Mesh` from the current object. If `fill=True`, the interior faces of all the cells are created. (setting a `shrink` value slightly smaller than the default 1.0 @@ -1858,9 +1858,9 @@ def tomesh(self, fill=True, shrink=1.0): poly = gf.GetOutput() msh = vedo.mesh.Mesh(poly).flat() - lut = utils.ctf2lut(self) - if lut: - msh.mapper.SetLookupTable(lut) + # lut = utils.ctf2lut(self) + # if lut: + # msh.mapper.SetLookupTable(lut) msh.pipeline = utils.OperationNode( "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" @@ -1868,8 +1868,32 @@ def tomesh(self, fill=True, shrink=1.0): return msh + def extract_cell_type(self, ctype): + """Extract a specific cell type and return a new `UnstructuredGrid`.""" + uarr = self.dataset.GetCellTypesArray() + ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] + uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") + selection_node = vtk.new("SelectionNode") + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) + selection_node.SetSelectionList(uarrtyp) + selection = vtk.new("Selection") + selection.AddNode(selection_node) + es = vtk.new("ExtractSelection") + es.SetInputData(0, self.dataset) + es.SetInputData(1, selection) + es.Update() + + ug = UnstructuredGrid(es.GetOutput()) + + ug.pipeline = utils.OperationNode( + "extract_cell_type", comment=f"type {ctype}", + c="#edabab", parents=[self], + ) + return ug + def extract_cells_by_id(self, idlist, use_point_ids=False): - """Return a new UGrid composed of the specified subset of indices.""" + """Return a new `UnstructuredGrid` composed of the specified subset of indices.""" selection_node = vtk.new("SelectionNode") if use_point_ids: selection_node.SetFieldType(vtk.get_class("SelectionNode").POINT) @@ -1887,7 +1911,7 @@ def extract_cells_by_id(self, idlist, use_point_ids=False): es.SetInputData(1, selection) es.Update() - ug = vedo.ugrid.UGrid(es.GetOutput()) + ug = vedo.tetmesh.UnstructuredGrid(es.GetOutput()) pr = vtk.vtkProperty() pr.DeepCopy(self.properties) ug.SetProperty(pr) @@ -2043,8 +2067,8 @@ def cut_with_plane(self, origin=(0, 0, 0), normal="x"): cout = clipper.GetOutput() if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UGrid(cout) - if isinstance(self, vedo.UGrid): + ug = vedo.UnstructuredGrid(cout) + if isinstance(self, vedo.UnstructuredGrid): self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self @@ -2097,7 +2121,7 @@ def cut_with_mesh( self, mesh, invert=False, whole_cells=False, only_boundary=False ): """ - Cut a UGrid or TetMesh with a Mesh. + Cut a UnstructuredGrid or TetMesh with a Mesh. Use `invert` to return cut off part of the input object. """ @@ -2132,6 +2156,6 @@ def cut_with_mesh( clipper.Update() - out = vedo.UGrid(clipper.GetOutput()) + out = vedo.UnstructuredGrid(clipper.GetOutput()) out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") return out diff --git a/vedo/file_io.py b/vedo/file_io.py index 2c6f8086..31699b76 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -366,7 +366,7 @@ def _load_file(filename, unpack): elif isinstance(b, vtk.vtkImageData): acts.append(Volume(b)) elif isinstance(b, vtk.vtkUnstructuredGrid): - acts.append(vedo.UGrid(b)) + acts.append(vedo.UnstructuredGrid(b)) return acts return mb diff --git a/vedo/plotter.py b/vedo/plotter.py index 104bd2ff..19bd74a5 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2946,7 +2946,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(a, (vtk.vtkActor, vtk.vtkActor2D)): scanned_acts.append(a) - elif isinstance(a, (vedo.TetMesh, vedo.UGrid)): + elif isinstance(a, (vedo.TetMesh, vedo.UnstructuredGrid)): # check ugrid is all made of tets # ugrid = a # uarr = ugrid.GetCellTypesArray() diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3f4b154d..078c4919 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -3447,6 +3447,39 @@ def generate_voronoi(self, padding=0.0, fit=False, method="vtk"): m.name = "Voronoi" return m + ########################################################################## + def generate_delaunay3d(self, radius=0, tol=None): + """ + Create 3D Delaunay triangulation of input points. + + Arguments: + radius : (float) + specify distance (or "alpha") value to control output. + For a non-zero values, only tetra contained within the circumsphere + will be output. + tol : (float) + Specify a tolerance to control discarding of closely spaced points. + This tolerance is specified as a fraction of the diagonal length of + the bounding box of the points. + """ + deln = vtk.new("Delaunay3D") + deln.SetInputData(self.dataset) + deln.SetAlpha(radius) + deln.AlphaTetsOn() + deln.AlphaTrisOff() + deln.AlphaLinesOff() + deln.AlphaVertsOff() + deln.BoundingTriangulationOff() + if tol: + deln.SetTolerance(tol) + deln.Update() + m = vedo.TetMesh(deln.GetOutput()) + m.pipeline = utils.OperationNode( + "generate_delaunay3d", c="#e9c46a:#edabab", parents=[self], + ) + m.name = "Delaunay3D" + return m + #################################################### def visible_points(self, area=(), tol=None, invert=False): """ diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 5f05141d..dc3f5d2d 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -20,50 +20,9 @@ ![](https://vedo.embl.es/images/volumetric/82767107-2631d500-9e25-11ea-967c-42558f98f721.jpg) """ -__all__ = ["TetMesh", "delaunay3d"] +__all__ = ["UnstructuredGrid", "TetMesh"] -########################################################################## -def delaunay3d(mesh, radius=0, tol=None): - """ - Create 3D Delaunay triangulation of input points. - - Arguments: - - radius : (float) - specify distance (or "alpha") value to control output. - For a non-zero values, only tetra contained within the circumsphere - will be output. - - tol : (float) - Specify a tolerance to control discarding of closely spaced points. - This tolerance is specified as a fraction of the diagonal length of - the bounding box of the points. - """ - deln = vtk.new("Delaunay3D") - if utils.is_sequence(mesh): - pd = vtk.vtkPolyData() - vpts = vtk.vtkPoints() - vpts.SetData(utils.numpy2vtk(mesh, dtype=np.float32)) - pd.SetPoints(vpts) - deln.SetInputData(pd) - else: - deln.SetInputData(mesh.dataset) - deln.SetAlpha(radius) - deln.AlphaTetsOn() - deln.AlphaTrisOff() - deln.AlphaLinesOff() - deln.AlphaVertsOff() - deln.BoundingTriangulationOff() - if tol: - deln.SetTolerance(tol) - deln.Update() - m = TetMesh(deln.GetOutput()) - m.pipeline = utils.OperationNode( - "delaunay3d", c="#e9c46a:#edabab", parents=[mesh], - ) - return m - def _buildtetugrid(points, cells): ug = vtk.vtkUnstructuredGrid() @@ -103,6 +62,290 @@ def _buildtetugrid(points, cells): return ug +######################################################################### +class UnstructuredGrid(UGridAlgorithms): + """Support for UnstructuredGrid objects.""" + + def __init__(self, inputobj=None): + """ + Support for UnstructuredGrid objects. + + Arguments: + inputobj : (list, vtkUnstructuredGrid, str) + A list in the form `[points, cells, celltypes]`, + or a vtkUnstructuredGrid object, or a filename + + Celltypes are identified by the following convention: + + https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html + """ + super().__init__() + + self.dataset = None + self.actor = vtk.vtkVolume() + self.properties = self.actor.GetProperty() + + self.name = "UnstructuredGrid" + self.filename = "" + + ################### + inputtype = str(type(inputobj)) + + if inputobj is None: + self.dataset = vtk.vtkUnstructuredGrid() + + elif utils.is_sequence(inputobj): + + pts, cells, celltypes = inputobj + assert len(cells) == len(celltypes) + + self.dataset = vtk.vtkUnstructuredGrid() + + if not utils.is_sequence(cells[0]): + tets = [] + nf = cells[0] + 1 + for i, cl in enumerate(cells): + if i in (nf, 0): + k = i + 1 + nf = cl + k + cell = [cells[j + k] for j in range(cl)] + tets.append(cell) + cells = tets + + # This would fill the points and use those to define orientation + vpts = utils.numpy2vtk(pts, dtype=np.float32) + points = vtk.vtkPoints() + points.SetData(vpts) + self.dataset.SetPoints(points) + + # This fill the points and use cells to define orientation + # points = vtk.vtkPoints() + # for c in cells: + # for pid in c: + # points.InsertNextPoint(pts[pid]) + # self.dataset.SetPoints(points) + + # Fill cells + # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html + for i, ct in enumerate(celltypes): + cell_conn = cells[i] + if ct == vtk.VTK_HEXAHEDRON: + cell = vtk.vtkHexahedron() + elif ct == vtk.VTK_TETRA: + cell = vtk.vtkTetra() + elif ct == vtk.VTK_VOXEL: + cell = vtk.vtkVoxel() + elif ct == vtk.VTK_WEDGE: + cell = vtk.vtkWedge() + elif ct == vtk.VTK_PYRAMID: + cell = vtk.vtkPyramid() + elif ct == vtk.VTK_HEXAGONAL_PRISM: + cell = vtk.vtkHexagonalPrism() + elif ct == vtk.VTK_PENTAGONAL_PRISM: + cell = vtk.vtkPentagonalPrism() + else: + print("UnstructuredGrid: cell type", ct, "not supported. Skip.") + continue + cpids = cell.GetPointIds() + for j, pid in enumerate(cell_conn): + cpids.SetId(j, pid) + self.dataset.InsertNextCell(ct, cpids) + + elif "UnstructuredGrid" in inputtype: + self.dataset = inputobj + + elif isinstance(inputobj, str): + if "https://" in inputobj: + inputobj = download(inputobj, verbose=False) + self.filename = inputobj + if inputobj.endswith(".vtu"): + reader = vtk.new("XMLUnstructuredGridReader") + else: + reader = vtk.new("UnstructuredGridReader") + self.filename = inputobj + reader.SetFileName(inputobj) + reader.Update() + self.dataset = reader.GetOutput() + + else: + vedo.logger.error(f"cannot understand input type {inputtype}") + return + + self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") + self.actor.SetMapper(self.mapper) + + self.mapper.SetInputData(self.dataset) ###NOT HERE? + + self.pipeline = utils.OperationNode( + self, comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#4cc9f0", + ) + + # ------------------------------------------------------------------ + + def __str__(self): + """Print a string summary of the `UnstructuredGrid` object.""" + module = self.__class__.__module__ + name = self.__class__.__name__ + out = vedo.printc( + f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), + c="m", bold=True, invert=True, return_string=True, + ) + out += "\x1b[0m\u001b[35m" + + out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" + out += "nr. of cells".ljust(14)+ ": " + str(self.ncells) + "\n" + + if self.npoints: + out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) + out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" + out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" + + bnds = self.bounds() + bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) + by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) + bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) + out += "bounds".ljust(14) + ":" + out += " x=(" + bx1 + ", " + bx2 + ")," + out += " y=(" + by1 + ", " + by2 + ")," + out += " z=(" + bz1 + ", " + bz2 + ")\n" + + for key in self.pointdata.keys(): + arr = self.pointdata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "pointdata" + a_scalars = self.dataset.GetPointData().GetScalars() + a_vectors = self.dataset.GetPointData().GetVectors() + a_tensors = self.dataset.GetPointData().GetTensors() + if a_scalars and a_scalars.GetName() == key: + mark_active += " *" + elif a_vectors and a_vectors.GetName() == key: + mark_active += " **" + elif a_tensors and a_tensors.GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.celldata.keys(): + arr = self.celldata[key] + rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) + mark_active = "celldata" + a_scalars = self.dataset.GetCellData().GetScalars() + a_vectors = self.dataset.GetCellData().GetVectors() + a_tensors = self.dataset.GetCellData().GetTensors() + if a_scalars and a_scalars.GetName() == key: + mark_active += " *" + elif a_vectors and a_vectors.GetName() == key: + mark_active += " **" + elif a_tensors and a_tensors.GetName() == key: + mark_active += " ***" + out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' + out += f", range=({rng})\n" + + for key in self.metadata.keys(): + arr = self.metadata[key] + out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' + + return out.rstrip() + "\x1b[0m" + + + def _repr_html_(self): + """ + HTML representation of the UnstructuredGrid object for Jupyter Notebooks. + + Returns: + HTML text with the image and some properties. + """ + import io + import base64 + from PIL import Image + + library_name = "vedo.tetmesh.UnstructuredGrid" + help_url = "https://vedo.embl.es/docs/vedo/tetmesh.html" + + # self.mapper.SetInputData(self.dataset) + arr = self.thumbnail() + im = Image.fromarray(arr) + buffered = io.BytesIO() + im.save(buffered, format="PNG", quality=100) + encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") + url = "data:image/png;base64," + encoded + image = f"" + + bounds = "
".join( + [ + utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) + for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) + ] + ) + + help_text = "" + if self.name: + help_text += f" {self.name}:   " + help_text += '' + library_name + "" + if self.filename: + dots = "" + if len(self.filename) > 30: + dots = "..." + help_text += f"
({dots}{self.filename[-30:]})" + + pdata = "" + if self.dataset.GetPointData().GetScalars(): + if self.dataset.GetPointData().GetScalars().GetName(): + name = self.dataset.GetPointData().GetScalars().GetName() + pdata = "
" + + cdata = "" + if self.dataset.GetCellData().GetScalars(): + if self.dataset.GetCellData().GetScalars().GetName(): + name = self.dataset.GetCellData().GetScalars().GetName() + cdata = "" + + pts = self.vertices + cm = np.mean(pts, axis=0) + + all = [ + "
point data array " + name + "
cell data array " + name + "
", + "", + "", + "
", image, "
", help_text, + "", + "", + "", + # "", + "", + pdata, + cdata, + "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
average size " + str(average_size) + "
nr. points / cells " + + str(self.npoints) + " / " + str(self.ncells) + "
", + "
", + ] + return "\n".join(all) + + def copy(self, deep=True): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone(deep=deep) + + def clone(self, deep=True): + """Clone the UnstructuredGrid object to yield an exact copy.""" + ug = vtk.vtkUnstructuredGrid() + if deep: + ug.DeepCopy(self.dataset) + else: + ug.ShallowCopy(self.dataset) + + cloned = UnstructuredGrid(ug) + pr = vtk.vtkVolumeProperty() + pr.DeepCopy(self.properties) + cloned.actor.SetProperty(pr) + cloned.properties = pr + + cloned.pipeline = utils.OperationNode( + "clone", parents=[self], shape='diamond', c='#bbe1ed', + ) + return cloned + + ########################################################################## class TetMesh(VolumeVisual, UGridAlgorithms): """The class describing tetrahedral meshes.""" @@ -143,16 +386,16 @@ def __init__( elif isinstance(inputobj, vtk.vtkUnstructuredGrid): self.dataset = inputobj - elif isinstance(inputobj, vedo.UGrid): + elif isinstance(inputobj, UnstructuredGrid): self.dataset = inputobj.dataset - elif isinstance(inputobj, vtk.vtkRectilinearGrid): - r2t = vtk.new("RectilinearGridToTetrahedra") - r2t.SetInputData(inputobj) - r2t.RememberVoxelIdOn() - r2t.SetTetraPerCellTo6() - r2t.Update() - self.dataset = r2t.GetOutput() + # elif isinstance(inputobj, vtk.vtkRectilinearGrid): + # r2t = vtk.new("RectilinearGridToTetrahedra") + # r2t.SetInputData(inputobj) + # r2t.RememberVoxelIdOn() + # r2t.SetTetraPerCellTo6() + # r2t.Update() + # self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): r2t = vtk.new("DataSetTriangleFilter") diff --git a/vedo/ugrid.py b/vedo/ugrid.py deleted file mode 100644 index 6165b296..00000000 --- a/vedo/ugrid.py +++ /dev/null @@ -1,333 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import numpy as np - -import vedo.vtkclasses as vtk - -import vedo -from vedo import utils -from vedo.core import UGridAlgorithms -from vedo.file_io import download -from vedo.visual import VolumeVisual - - -__docformat__ = "google" - -__doc__ = """ -Work with unstructured grid datasets -""" - -__all__ = ["UGrid"] - -######################################################################### -class UGrid(VolumeVisual, UGridAlgorithms): - """Support for UnstructuredGrid objects.""" - - def __init__(self, inputobj=None): - """ - Support for UnstructuredGrid objects. - - Arguments: - inputobj : (list, vtkUnstructuredGrid, str) - A list in the form `[points, cells, celltypes]`, - or a vtkUnstructuredGrid object, or a filename - - Celltypes are identified by the following convention: - - VTK_TETRA = 10 - - VTK_VOXEL = 11 - - VTK_HEXAHEDRON = 12 - - VTK_WEDGE = 13 - - VTK_PYRAMID = 14 - - VTK_HEXAGONAL_PRISM = 15 - - VTK_PENTAGONAL_PRISM = 16 - """ - super().__init__() - - self.dataset = None - self.actor = vtk.vtkVolume() - self.properties = self.actor.GetProperty() - - self.name = "UGrid" - self.filename = "" - - ################### - inputtype = str(type(inputobj)) - - if inputobj is None: - self.dataset = vtk.vtkUnstructuredGrid() - - elif utils.is_sequence(inputobj): - - pts, cells, celltypes = inputobj - assert len(cells) == len(celltypes) - - self.dataset = vtk.vtkUnstructuredGrid() - - if not utils.is_sequence(cells[0]): - tets = [] - nf = cells[0] + 1 - for i, cl in enumerate(cells): - if i in (nf, 0): - k = i + 1 - nf = cl + k - cell = [cells[j + k] for j in range(cl)] - tets.append(cell) - cells = tets - - # This would fill the points and use those to define orientation - vpts = utils.numpy2vtk(pts, dtype=np.float32) - points = vtk.vtkPoints() - points.SetData(vpts) - self.dataset.SetPoints(points) - - # This fill the points and use cells to define orientation - # points = vtk.vtkPoints() - # for c in cells: - # for pid in c: - # points.InsertNextPoint(pts[pid]) - # self.dataset.SetPoints(points) - - # Fill cells - # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html - for i, ct in enumerate(celltypes): - cell_conn = cells[i] - if ct == vtk.VTK_HEXAHEDRON: - cell = vtk.vtkHexahedron() - elif ct == vtk.VTK_TETRA: - cell = vtk.vtkTetra() - elif ct == vtk.VTK_VOXEL: - cell = vtk.vtkVoxel() - elif ct == vtk.VTK_WEDGE: - cell = vtk.vtkWedge() - elif ct == vtk.VTK_PYRAMID: - cell = vtk.vtkPyramid() - elif ct == vtk.VTK_HEXAGONAL_PRISM: - cell = vtk.vtkHexagonalPrism() - elif ct == vtk.VTK_PENTAGONAL_PRISM: - cell = vtk.vtkPentagonalPrism() - else: - print("UGrid: cell type", ct, "not supported. Skip.") - continue - cpids = cell.GetPointIds() - for j, pid in enumerate(cell_conn): - cpids.SetId(j, pid) - self.dataset.InsertNextCell(ct, cpids) - - elif "UnstructuredGrid" in inputtype: - self.dataset = inputobj - - elif isinstance(inputobj, str): - if "https://" in inputobj: - inputobj = download(inputobj, verbose=False) - self.filename = inputobj - if inputobj.endswith(".vtu"): - reader = vtk.new("XMLUnstructuredGridReader") - else: - reader = vtk.new("UnstructuredGridReader") - self.filename = inputobj - reader.SetFileName(inputobj) - reader.Update() - self.dataset = reader.GetOutput() - - else: - vedo.logger.error(f"cannot understand input type {inputtype}") - return - - self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") - self.actor.SetMapper(self.mapper) - - self.mapper.SetInputData(self.dataset) ###NOT HERE? - - self.pipeline = utils.OperationNode( - self, comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#4cc9f0", - ) - - # ------------------------------------------------------------------ - - def __str__(self): - """Print a string summary of the `UGrid` object.""" - module = self.__class__.__module__ - name = self.__class__.__name__ - out = vedo.printc( - f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), - c="m", bold=True, invert=True, return_string=True, - ) - out += "\x1b[0m\u001b[35m" - - out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" - out += "nr. of cells".ljust(14)+ ": " + str(self.ncells) + "\n" - - if self.npoints: - out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) - out+=", diagonal="+ utils.precision(self.diagonal_size(), 6)+ "\n" - out+="center of mass".ljust(14) + ": " + utils.precision(self.center_of_mass(),6)+"\n" - - bnds = self.bounds() - bx1, bx2 = utils.precision(bnds[0], 3), utils.precision(bnds[1], 3) - by1, by2 = utils.precision(bnds[2], 3), utils.precision(bnds[3], 3) - bz1, bz2 = utils.precision(bnds[4], 3), utils.precision(bnds[5], 3) - out += "bounds".ljust(14) + ":" - out += " x=(" + bx1 + ", " + bx2 + ")," - out += " y=(" + by1 + ", " + by2 + ")," - out += " z=(" + bz1 + ", " + bz2 + ")\n" - - for key in self.pointdata.keys(): - arr = self.pointdata[key] - rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) - mark_active = "pointdata" - a_scalars = self.dataset.GetPointData().GetScalars() - a_vectors = self.dataset.GetPointData().GetVectors() - a_tensors = self.dataset.GetPointData().GetTensors() - if a_scalars and a_scalars.GetName() == key: - mark_active += " *" - elif a_vectors and a_vectors.GetName() == key: - mark_active += " **" - elif a_tensors and a_tensors.GetName() == key: - mark_active += " ***" - out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' - out += f", range=({rng})\n" - - for key in self.celldata.keys(): - arr = self.celldata[key] - rng = utils.precision(arr.min(), 3) + ", " + utils.precision(arr.max(), 3) - mark_active = "celldata" - a_scalars = self.dataset.GetCellData().GetScalars() - a_vectors = self.dataset.GetCellData().GetVectors() - a_tensors = self.dataset.GetCellData().GetTensors() - if a_scalars and a_scalars.GetName() == key: - mark_active += " *" - elif a_vectors and a_vectors.GetName() == key: - mark_active += " **" - elif a_tensors and a_tensors.GetName() == key: - mark_active += " ***" - out += mark_active.ljust(14) + f': "{key}" ({arr.dtype}), ndim={arr.ndim}' - out += f", range=({rng})\n" - - for key in self.metadata.keys(): - arr = self.metadata[key] - out+= "metadata".ljust(14) + ": " + f'"{key}" ({len(arr)} values)\n' - - return out.rstrip() + "\x1b[0m" - - - - def _repr_html_(self): - """ - HTML representation of the UGrid object for Jupyter Notebooks. - - Returns: - HTML text with the image and some properties. - """ - import io - import base64 - from PIL import Image - - library_name = "vedo.ugrid.UGrid" - help_url = "https://vedo.embl.es/docs/vedo/ugrid.html" - - # self.mapper.SetInputData(self.dataset) - arr = self.thumbnail() - im = Image.fromarray(arr) - buffered = io.BytesIO() - im.save(buffered, format="PNG", quality=100) - encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") - url = "data:image/png;base64," + encoded - image = f"" - - bounds = "
".join( - [ - utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) - for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) - ] - ) - - help_text = "" - if self.name: - help_text += f" {self.name}:   " - help_text += '' + library_name + "" - if self.filename: - dots = "" - if len(self.filename) > 30: - dots = "..." - help_text += f"
({dots}{self.filename[-30:]})" - - pdata = "" - if self.dataset.GetPointData().GetScalars(): - if self.dataset.GetPointData().GetScalars().GetName(): - name = self.dataset.GetPointData().GetScalars().GetName() - pdata = " point data array " + name + "" - - cdata = "" - if self.dataset.GetCellData().GetScalars(): - if self.dataset.GetCellData().GetScalars().GetName(): - name = self.dataset.GetCellData().GetScalars().GetName() - cdata = " cell data array " + name + "" - - pts = self.vertices - cm = np.mean(pts, axis=0) - - all = [ - "", - "", - "", - "
", image, "
", help_text, - "", - "", - "", - # "", - "", - pdata, - cdata, - "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
average size " + str(average_size) + "
nr. points / cells " - + str(self.npoints) + " / " + str(self.ncells) + "
", - "
", - ] - return "\n".join(all) - - def copy(self, deep=True): - """Return a copy of the object. Alias of `clone()`.""" - return self.clone(deep=deep) - - def clone(self, deep=True): - """Clone the UGrid object to yield an exact copy.""" - ug = vtk.vtkUnstructuredGrid() - if deep: - ug.DeepCopy(self.dataset) - else: - ug.ShallowCopy(self.dataset) - - cloned = UGrid(ug) - pr = vtk.vtkVolumeProperty() - pr.DeepCopy(self.properties) - cloned.actor.SetProperty(pr) - cloned.properties = pr - - cloned.pipeline = utils.OperationNode( - "clone", parents=[self], shape='diamond', c='#bbe1ed', - ) - return cloned - - def extract_cell_type(self, ctype): - """Extract a specific cell type and return a new `UGrid`.""" - uarr = self.dataset.GetCellTypesArray() - ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] - uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") - selection_node = vtk.new("SelectionNode") - selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) - selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) - selection_node.SetSelectionList(uarrtyp) - selection = vtk.new("Selection") - selection.AddNode(selection_node) - es = vtk.new("ExtractSelection") - es.SetInputData(0, self.dataset) - es.SetInputData(1, selection) - es.Update() - - ug = UGrid(es.GetOutput()) - - ug.pipeline = utils.OperationNode( - "extract_cell_type", comment=f"type {ctype}", - c="#edabab", parents=[self], - ) - return ug \ No newline at end of file diff --git a/vedo/utils.py b/vedo/utils.py index 43a75561..cb69566d 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -79,7 +79,7 @@ class OperationNode: # https://www.graphviz.org/doc/info/shapes.html#html # Mesh #e9c46a # Follower #d9ed92 - # Volume, UGrid #4cc9f0 + # Volume, UnstructuredGrid #4cc9f0 # TetMesh #9e2a2b # File #8a817c # Image #f28482 diff --git a/vedo/visual.py b/vedo/visual.py index 06eb26ef..b423456a 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -95,7 +95,7 @@ def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation ren = vtk.vtkRenderer() actor = self.actor - if isinstance(self, vedo.UGrid): + if isinstance(self, vedo.UnstructuredGrid): geo = vtk.new("GeometryFilter") geo.SetInputData(self.dataset) geo.Update() From 4559629f713f179b72ee588aa85fe764af015274 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 18:51:26 +0100 Subject: [PATCH 238/251] fix ugrid actor lazy updating --- examples/volumetric/ugrid1.py | 11 ++++---- examples/volumetric/ugrid2.py | 17 +++++------- vedo/addons.py | 8 +++--- vedo/core.py | 5 ++-- vedo/plotter.py | 18 +------------ vedo/tetmesh.py | 49 +++++++++++++++++++++++------------ vedo/visual.py | 4 ++- vedo/vtkclasses.py | 2 -- 8 files changed, 56 insertions(+), 58 deletions(-) diff --git a/examples/volumetric/ugrid1.py b/examples/volumetric/ugrid1.py index 967c1c40..d7b995dd 100644 --- a/examples/volumetric/ugrid1.py +++ b/examples/volumetric/ugrid1.py @@ -1,10 +1,11 @@ -"""Cut an UnstructuredGrid with a mesh""" +"""Cut an UnstructuredGrid with a Mesh""" from vedo import * -ug1 = UGrid(dataurl+'ugrid.vtk') -ms1 = ug1.clone().tomesh().wireframe() +ug1 = UnstructuredGrid(dataurl+'ugrid.vtk') +print(ug1) cyl = Cylinder(r=3, height=7).x(3).wireframe() -ms2 = ug1.cut_with_mesh(cyl).tomesh().cmap('jet') +ug2 = ug1.clone().cut_with_mesh(cyl) -show(ms1, ms2, cyl, __doc__, axes=1).close() +ug1.wireframe() +show(ug1, ug2, cyl, __doc__, axes=1).close() diff --git a/examples/volumetric/ugrid2.py b/examples/volumetric/ugrid2.py index bc610a93..94885e54 100644 --- a/examples/volumetric/ugrid2.py +++ b/examples/volumetric/ugrid2.py @@ -1,15 +1,10 @@ """Cut an UnstructuredGrid with a plane""" -from vedo import * - -ug = UGrid(dataurl+'ugrid.vtk') -ug.cmap('blue8') +from vedo import UnstructuredGrid, dataurl, show +ug = UnstructuredGrid(dataurl+'ugrid.vtk').cmap("jet") ug = ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) +show(repr(ug), ug, axes=1, viewup='z').close() -# Create a polygonal Mesh for visualization -msh = ug.shrink(0.9).tomesh() - -# note the difference with the following: -# msh = ug.tomesh().shrink(0.9) - -show(msh, axes=1, viewup='z').close() +# Create a polygonal Mesh from the UGrid and shrink it +msh = ug.shrink(0.9).tomesh().c('gold',0.2) +show(repr(msh), msh, axes=1, viewup='z').close() diff --git a/vedo/addons.py b/vedo/addons.py index 19566589..784f36a2 100644 --- a/vedo/addons.py +++ b/vedo/addons.py @@ -850,7 +850,7 @@ def ScalarBar( ![](https://user-images.githubusercontent.com/32848391/62940174-4bdc7900-bdd3-11e9-9713-e4f3e2fdab63.png) """ - if isinstance(obj, Points): + if isinstance(obj, (Points, TetMesh, vedo.UnstructuredGrid)): vtkscalars = obj.dataset.GetPointData().GetScalars() if vtkscalars is None: vtkscalars = obj.dataset.GetCellData().GetScalars() @@ -862,7 +862,7 @@ def ScalarBar( if not lut: return None - elif isinstance(obj, (Volume, TetMesh, vedo.UnstructuredGrid)): + elif isinstance(obj, Volume): lut = utils.ctf2lut(obj) elif utils.is_sequence(obj) and len(obj) == 2: @@ -1024,7 +1024,7 @@ def ScalarBar3D( - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ - if isinstance(obj, Points): + if isinstance(obj, (Points, TetMesh, vedo.UnstructuredGrid)): lut = obj.mapper.GetLookupTable() if not lut or lut.GetTable().GetNumberOfTuples() == 0: # create the most similar to the default @@ -1032,7 +1032,7 @@ def ScalarBar3D( lut = obj.mapper.GetLookupTable() vmin, vmax = lut.GetRange() - elif isinstance(obj, (Volume, TetMesh, vedo.UnstructuredGrid)): + elif isinstance(obj, Volume): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() diff --git a/vedo/core.py b/vedo/core.py index 58a82ed3..f8fd5fed 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1764,8 +1764,9 @@ def __init__(self): def _update(self, data, reset_locators=False): self.dataset = data - self.mapper.SetInputData(data) - self.mapper.Modified() + # self.mapper.SetInputData(data) + # self.mapper.Modified() + ## self.actor.Modified() return self def bounds(self): diff --git a/vedo/plotter.py b/vedo/plotter.py index 19bd74a5..4e36c9a8 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -2946,22 +2946,6 @@ def _scan_input_return_acts(self, objs): elif isinstance(a, (vtk.vtkActor, vtk.vtkActor2D)): scanned_acts.append(a) - elif isinstance(a, (vedo.TetMesh, vedo.UnstructuredGrid)): - # check ugrid is all made of tets - # ugrid = a - # uarr = ugrid.GetCellTypesArray() - # celltypes = np.unique(utils.vtk2numpy(uarr)) - # ncelltypes = len(celltypes) - # if ncelltypes > 1 or (ncelltypes == 1 and celltypes[0] != 10): - # scanned_acts.append(a.tomesh()) - # else: - # if not ugrid.GetPointData().GetScalars(): - # if not ugrid.GetCellData().GetScalars(): - # # add dummy array for vtkProjectedTetrahedraMapper to work: - # a.celldata["DummyOneArray"] = np.ones(a.ncells) - # scanned_acts.append(a) - scanned_acts.append(a.actor) - elif isinstance(a, str): # assume a 2D comment was given changed = False # check if one already exists so to just update text @@ -2983,7 +2967,7 @@ def _scan_input_return_acts(self, objs): elif isinstance(a, ( vtk.vtkAssembly, - vtk.vtkVolume, # order matters! dont move above TetMesh + vtk.vtkVolume, vtk.vtkImageActor, vtk.vtkLegendBoxActor, vtk.vtkBillboardTextActor3D, diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index dc3f5d2d..e05109ea 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from weakref import ref as weak_ref_to import vedo.vtkclasses as vtk @@ -9,7 +10,7 @@ from vedo.core import UGridAlgorithms from vedo.mesh import Mesh from vedo.file_io import download -from vedo.visual import VolumeVisual +from vedo.visual import MeshVisual, VolumeVisual from vedo.transformations import LinearTransform __docformat__ = "google" @@ -22,8 +23,7 @@ __all__ = ["UnstructuredGrid", "TetMesh"] - - +######################################################################### def _buildtetugrid(points, cells): ug = vtk.vtkUnstructuredGrid() @@ -63,7 +63,7 @@ def _buildtetugrid(points, cells): ######################################################################### -class UnstructuredGrid(UGridAlgorithms): +class UnstructuredGrid(MeshVisual, UGridAlgorithms): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): @@ -75,18 +75,22 @@ def __init__(self, inputobj=None): A list in the form `[points, cells, celltypes]`, or a vtkUnstructuredGrid object, or a filename - Celltypes are identified by the following convention: - - https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html + Celltypes are identified by the following + [convention](https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html). """ super().__init__() self.dataset = None - self.actor = vtk.vtkVolume() - self.properties = self.actor.GetProperty() + + self.mapper = vtk.new("PolyDataMapper") + self._actor = vtk.vtkActor() + self._actor.retrieve_object = weak_ref_to(self) + self._actor.SetMapper(self.mapper) + self.properties = self._actor.GetProperty() self.name = "UnstructuredGrid" self.filename = "" + self.info = {} ################### inputtype = str(type(inputobj)) @@ -171,18 +175,29 @@ def __init__(self, inputobj=None): vedo.logger.error(f"cannot understand input type {inputtype}") return - self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") - self.actor.SetMapper(self.mapper) - - self.mapper.SetInputData(self.dataset) ###NOT HERE? - self.pipeline = utils.OperationNode( self, comment=f"#cells {self.dataset.GetNumberOfCells()}", c="#4cc9f0", ) # ------------------------------------------------------------------ + @property + def actor(self): + """Return the `vtkActor` of the object.""" + # print("building actor") + gf = vtk.new("GeometryFilter") + gf.SetInputData(self.dataset) + gf.Update() + out = gf.GetOutput() + self.mapper.SetInputData(out) + self.mapper.Modified() + return self._actor + + @actor.setter + def actor(self, _): + pass + # ------------------------------------------------------------------ def __str__(self): """Print a string summary of the `UnstructuredGrid` object.""" module = self.__class__.__module__ @@ -335,10 +350,12 @@ def clone(self, deep=True): ug.ShallowCopy(self.dataset) cloned = UnstructuredGrid(ug) - pr = vtk.vtkVolumeProperty() + pr = vtk.vtkProperty() pr.DeepCopy(self.properties) - cloned.actor.SetProperty(pr) + cloned._actor.SetProperty(pr) cloned.properties = pr + # there is no deep copy for mapper + cloned.mapper.ShallowCopy(self.mapper) cloned.pipeline = utils.OperationNode( "clone", parents=[self], shape='diamond', c='#bbe1ed', diff --git a/vedo/visual.py b/vedo/visual.py index b423456a..147119e1 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -36,7 +36,9 @@ def __init__(self): self.mapper = None self.properties = None self.actor = None - self.scalarbar = None + self.scalarbar = None + self.trail = None + self.shadows = [] def print(self): """Print object info.""" diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index be182179..677d0ea7 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -845,8 +845,6 @@ def dump_hierarchy_to_file(fname=""): "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", "vtkProjectedTetrahedraMapper", - "vtkUnstructuredGridVolumeRayCastMapper", - "vtkUnstructuredGridVolumeZSweepMapper", ]: location[name] = "vtkRenderingVolume" ######################################################### From b4e9f67c2f4cfb693fe5f1f2e7cb5240fd3f4623 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 20:26:02 +0100 Subject: [PATCH 239/251] fix all tet_* examples --- docs/changes.md | 9 +- examples/volumetric/tet_astyle.py | 24 +-- examples/volumetric/tet_build.py | 14 +- examples/volumetric/tet_cut1.py | 21 +-- examples/volumetric/tet_cut2.py | 37 ++-- examples/volumetric/tet_explode.py | 1 - examples/volumetric/tetralize_surface.py | 6 +- vedo/core.py | 51 ++++- vedo/mesh.py | 3 +- vedo/tetmesh.py | 225 ++++++----------------- vedo/version.py | 2 +- 11 files changed, 157 insertions(+), 236 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 3c642798..95e0bbdf 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -66,13 +66,16 @@ examples/advanced/timer_callback1.py examples/advanced/timer_callback2.py examples/advanced/warp4a.py examples/advanced/warp4b.py +examples/pyplot/embed_matplotlib.py +examples/pyplot/plot_fxy2.py +examples/simulations/springs_fem.py examples/simulations/lorenz.py examples/volumetric/numpy2volume0.py examples/volumetric/slicer1.py +examples/volumetric/tet_astyle.py +examples/volumetric/tet_cut1.py +examples/volumetric/tet_cut2.py examples/other/flag_labels1.py -examples/pyplot/embed_matplotlib.py -examples/pyplot/plot_fxy2.py -examples/simulations/springs_fem.py ``` diff --git a/examples/volumetric/tet_astyle.py b/examples/volumetric/tet_astyle.py index 1f356b5d..6631e6ec 100644 --- a/examples/volumetric/tet_astyle.py +++ b/examples/volumetric/tet_astyle.py @@ -1,25 +1,13 @@ -"""Visualize a TetMesh with -default ray casting.""" +"""Load a tetrahedral mesh and show it in different styles.""" from vedo import * -# settings.use_depth_peeling = False - tetm = TetMesh(dataurl+'limb_ugrid.vtk') -tetm.color('jet').alpha_unit(100) # make the tets more transparent -tetm.add_scalarbar3d() - -# Build a Mesh object made of all the boundary triangles -wmesh = tetm.tomesh(fill=False).wireframe() +tetm.compute_cell_size() +print(tetm) +tetm.cmap("Blues_r", "chem_0", on="cells").add_scalarbar() # Make a copy of tetm and shrink the tets -shrunk = tetm.clone().shrink(0.5) - -# Build a Mesh object and cut it -cmesh = shrunk.tomesh(fill=True) +msh = tetm.clone().shrink(0.5).tomesh().add_scalarbar() -show([(tetm, __doc__), - (wmesh, "..wireframe surface"), - (cmesh, "..shrunk tetrahedra"), - ], N=3, axes=1, -).close() +show([(tetm, __doc__), (msh, "..shrunk tetrahedra")], N=2).close() diff --git a/examples/volumetric/tet_build.py b/examples/volumetric/tet_build.py index 5270e05e..fc6547f6 100644 --- a/examples/volumetric/tet_build.py +++ b/examples/volumetric/tet_build.py @@ -19,21 +19,17 @@ tets = [[0,1,2,3], [4,5,6,7], [8,9,10,11]] -scal = [10.0, 20.0, 30.0] # some cell scalar values +vals = [10.0, 20.0, 30.0] # some cell scalar values # Create the TeTMesh object tm = TetMesh([points, tets]) -tm.celldata["myscalar"] = scal +tm.celldata["myscalar"] = vals -tm.cmap('jet') +tm.cmap('jet', 'myscalar', on='cells').add_scalarbar() # tm.color('green') # or set a single color -printc("tetmesh.dataset:", type(tm.dataset)) # vtkUnstructuredGrid +printc("tetmesh.dataset:", type(tm)) # vedo.tetmesh.TetMesh printc("#vertices :", tm.vertices.size) printc("#cells :", len(tm.cells)) -# Optionally convert tm to a Mesh (for visualization) -show([(tm, __doc__), - (tm.tomesh(),"TetMesh.tomesh()"), - ], N=2, axes=1, -).close() +show(tm, axes=1).close() diff --git a/examples/volumetric/tet_cut1.py b/examples/volumetric/tet_cut1.py index 2f195c1c..11433859 100644 --- a/examples/volumetric/tet_cut1.py +++ b/examples/volumetric/tet_cut1.py @@ -1,19 +1,16 @@ """Cut a TetMesh with an arbitrary polygonal Mesh""" from vedo import * -tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') +sphere = Sphere(r=500).x(400).color('green5',0.2).wireframe() -sphere = Sphere(r=500).x(400) -sphere.c('green5').alpha(0.2) +tmesh = TetMesh(dataurl + 'limb_ugrid.vtk') +print(tmesh) -ugrid = tetmesh.cut_with_mesh(sphere, invert=True) -tetmesh_cut = TetMesh(ugrid) -print(tetmesh_cut) +ugrid = tmesh.cut_with_mesh(sphere, invert=True).cmap("Reds_r") +print(ugrid) -show( - tetmesh_cut.tomesh(), - sphere, - __doc__, - axes=dict(xtitle='x [:mum]'), -).close() +# We may cast the output to a new TetMesh: +# tmesh_cut = TetMesh(ugrid) +# print(tmesh_cut) +show(ugrid, sphere, __doc__, axes=1).close() diff --git a/examples/volumetric/tet_cut2.py b/examples/volumetric/tet_cut2.py index e5223887..0be8a1b4 100644 --- a/examples/volumetric/tet_cut2.py +++ b/examples/volumetric/tet_cut2.py @@ -1,31 +1,36 @@ -"""Cut a TetMesh with a Mesh -(note the presence of polygonal boundary)""" +"""Cut a TetMesh with a Mesh +to generate an UnstructuredGrid""" from vedo import * -settings.use_depth_peeling = True - -tetm = TetMesh(dataurl+'limb_ugrid.vtk') +settings.default_font = 'Calco' sphere = Sphere(r=500).x(400).c('green', 0.1) -# Clone and cut tetm, keep the outside: -tetm1 = tetm.clone().cut_with_mesh(sphere, invert=True) +tetm1 = TetMesh(dataurl+'limb_ugrid.vtk') +tetm1.cmap('jet', tetm1.vertices[:, 2], name="ProximoDistal") -# Make it a polygonal Mesh for visualization -msh1 = tetm1.tomesh().linewidth(0.1).cmap('Blues') +# Clone and cut the TetMesh, this returns a UnstructuredGrid: +ugrid1 = tetm1.clone().cut_with_mesh(sphere, invert=True) +print(ugrid1) +ugrid1.cmap("Greens_r", "SignedDistance") +show(ugrid1, sphere, axes=1, viewup='z').close() # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): -tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) +ugrid2 = tetm1.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) +tetm2 = TetMesh(ugrid2).cmap("Greens_r", "ProximoDistal") +print(tetm2) +# show(tetm2, sphere, axes=1, viewup='z').close() # Cut tetm, but the output will keep only the tets on the boundary: -tetm3 = tetm.clone().cut_with_mesh(sphere, only_boundary=True) -# tetm3.cmap("bone").add_scalarbar3d() +ugrid3 = tetm1.clone().cut_with_mesh(sphere, on_boundary=True) +tetm3 = TetMesh(ugrid3).cmap("Reds", "chem_0", on="cells") +print(tetm3) +# show(tetm3, sphere, axes=1, viewup='z').close() show([ - (msh1, sphere, __doc__), - (tetm2.tomesh(), "Keep only tets that lie\ncompletely outside the Sphere"), + (tetm1, __doc__), + (tetm2, sphere, "Keep only tets that lie\ncompletely outside the Sphere"), (tetm3, sphere, "Keep only tets that lie\nexactly on the Sphere"), ], - N=3, - axes=dict(xtitle='x in :mum'), + N=3, axes=dict(xtitle='x in :mum'), ).close() diff --git a/examples/volumetric/tet_explode.py b/examples/volumetric/tet_explode.py index 74c90526..cbd1174a 100644 --- a/examples/volumetric/tet_explode.py +++ b/examples/volumetric/tet_explode.py @@ -19,7 +19,6 @@ cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids -# tmesh.celldata.select("fragment")# bug, has no effect, needs name=... pieces = [] for i in range(seeds.npoints): diff --git a/examples/volumetric/tetralize_surface.py b/examples/volumetric/tetralize_surface.py index bae3fb78..cf507367 100644 --- a/examples/volumetric/tetralize_surface.py +++ b/examples/volumetric/tetralize_surface.py @@ -1,8 +1,6 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """Tetralize a closed surface mesh Click on the mesh and press ↓ or x to toggle a piece""" -from vedo import dataurl, Sphere, settings, Mesh, TessellatedBox, show +from vedo import dataurl, Sphere, TessellatedBox, settings, Mesh, show settings.use_depth_peeling = True @@ -25,7 +23,7 @@ pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold("fragments", above=i-0.1, below=i+0.1) - mc = tc.tomesh(fill=True, shrink=0.95).color(i) + mc = tc.shrink(0.95).tomesh().color(i) pieces.append(mc) show(__doc__, pieces, axes=1) diff --git a/vedo/core.py b/vedo/core.py index f8fd5fed..64a66dc5 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -1762,6 +1762,22 @@ def __init__(self): super().__init__() pass + @property + def actor(self): + """Return the `vtkActor` of the object.""" + # print("building actor") + gf = vtk.new("GeometryFilter") + gf.SetInputData(self.dataset) + gf.Update() + out = gf.GetOutput() + self.mapper.SetInputData(out) + self.mapper.Modified() + return self._actor + + @actor.setter + def actor(self, _): + pass + def _update(self, data, reset_locators=False): self.dataset = data # self.mapper.SetInputData(data) @@ -1769,6 +1785,33 @@ def _update(self, data, reset_locators=False): ## self.actor.Modified() return self + def copy(self, deep=True): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone(deep=deep) + + def clone(self, deep=True): + """Clone the UnstructuredGrid object to yield an exact copy.""" + ug = vtk.vtkUnstructuredGrid() + if deep: + ug.DeepCopy(self.dataset) + else: + ug.ShallowCopy(self.dataset) + if isinstance(self, vedo.UnstructuredGrid): + cloned = vedo.UnstructuredGrid(ug) + else: + cloned = vedo.TetMesh(ug) + pr = vtk.vtkProperty() + pr.DeepCopy(self.properties) + cloned._actor.SetProperty(pr) + cloned.properties = pr + # there is no deep copy for mapper + cloned.mapper.ShallowCopy(self.mapper) + + cloned.pipeline = utils.OperationNode( + "clone", parents=[self], shape='diamond', c='#bbe1ed', + ) + return cloned + def bounds(self): """ Get the object bounds. @@ -2119,7 +2162,7 @@ def cut_with_box(self, box): def cut_with_mesh( - self, mesh, invert=False, whole_cells=False, only_boundary=False + self, mesh, invert=False, whole_cells=False, on_boundary=False ): """ Cut a UnstructuredGrid or TetMesh with a Mesh. @@ -2131,13 +2174,13 @@ def cut_with_mesh( ippd = vtk.new("ImplicitPolyDataDistance") ippd.SetInput(mesh.dataset) - if whole_cells or only_boundary: + if whole_cells or on_boundary: clipper = vtk.new("ExtractGeometry") clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(False) - if only_boundary: + if on_boundary: clipper.SetExtractBoundaryCells(True) clipper.SetExtractOnlyBoundaryCells(True) else: @@ -2149,7 +2192,7 @@ def cut_with_mesh( signed_dist = ippd.EvaluateFunction(p) signed_dists.InsertNextValue(signed_dist) ug.GetPointData().AddArray(signed_dists) - ug.GetPointData().SetActiveScalars("SignedDistance") + ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED clipper = vtk.new("ClipDataSet") clipper.SetInputData(ug) clipper.SetInsideOut(not invert) diff --git a/vedo/mesh.py b/vedo/mesh.py index b5ea6fc7..8bd2b57c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -2264,7 +2264,8 @@ def tetralize( if subsample: surf.subsample(side) - tmesh = vedo.tetmesh.delaunay3d(vedo.merge(fillpts, surf)) + merged_fs = vedo.merge(fillpts, surf) + tmesh = merged_fs.generate_delaunay3d() tcenters = tmesh.cell_centers ids = surf.inside_points(tcenters, return_ids=True) diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index e05109ea..7c049bb8 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -10,7 +10,7 @@ from vedo.core import UGridAlgorithms from vedo.mesh import Mesh from vedo.file_io import download -from vedo.visual import MeshVisual, VolumeVisual +from vedo.visual import MeshVisual from vedo.transformations import LinearTransform __docformat__ = "google" @@ -23,45 +23,6 @@ __all__ = ["UnstructuredGrid", "TetMesh"] -######################################################################### -def _buildtetugrid(points, cells): - ug = vtk.vtkUnstructuredGrid() - - if len(points) == 0: - return ug - if not utils.is_sequence(points[0]): - return ug - - if len(cells) == 0: - return ug - - if not utils.is_sequence(cells[0]): - tets = [] - nf = cells[0] + 1 - for i, cl in enumerate(cells): - if i in (nf, 0): - k = i + 1 - nf = cl + k - cell = [cells[j + k] for j in range(cl)] - tets.append(cell) - cells = tets - - source_points = vtk.vtkPoints() - varr = utils.numpy2vtk(points, dtype=np.float32) - source_points.SetData(varr) - ug.SetPoints(source_points) - - source_tets = vtk.vtkCellArray() - for f in cells: - ele = vtk.vtkTetra() - pid = ele.GetPointIds() - for i, fi in enumerate(f): - pid.SetId(i, fi) - source_tets.InsertNextCell(ele) - ug.SetCells(vtk.VTK_TETRA, source_tets) - return ug - - ######################################################################### class UnstructuredGrid(MeshVisual, UGridAlgorithms): """Support for UnstructuredGrid objects.""" @@ -88,6 +49,8 @@ def __init__(self, inputobj=None): self._actor.SetMapper(self.mapper) self.properties = self._actor.GetProperty() + self.transform = LinearTransform() + self.name = "UnstructuredGrid" self.filename = "" self.info = {} @@ -180,23 +143,6 @@ def __init__(self, inputobj=None): c="#4cc9f0", ) - # ------------------------------------------------------------------ - @property - def actor(self): - """Return the `vtkActor` of the object.""" - # print("building actor") - gf = vtk.new("GeometryFilter") - gf.SetInputData(self.dataset) - gf.Update() - out = gf.GetOutput() - self.mapper.SetInputData(out) - self.mapper.Modified() - return self._actor - - @actor.setter - def actor(self, _): - pass - # ------------------------------------------------------------------ def __str__(self): """Print a string summary of the `UnstructuredGrid` object.""" @@ -337,56 +283,25 @@ def _repr_html_(self): ] return "\n".join(all) - def copy(self, deep=True): - """Return a copy of the object. Alias of `clone()`.""" - return self.clone(deep=deep) - - def clone(self, deep=True): - """Clone the UnstructuredGrid object to yield an exact copy.""" - ug = vtk.vtkUnstructuredGrid() - if deep: - ug.DeepCopy(self.dataset) - else: - ug.ShallowCopy(self.dataset) - - cloned = UnstructuredGrid(ug) - pr = vtk.vtkProperty() - pr.DeepCopy(self.properties) - cloned._actor.SetProperty(pr) - cloned.properties = pr - # there is no deep copy for mapper - cloned.mapper.ShallowCopy(self.mapper) - - cloned.pipeline = utils.OperationNode( - "clone", parents=[self], shape='diamond', c='#bbe1ed', - ) - return cloned - - ########################################################################## -class TetMesh(VolumeVisual, UGridAlgorithms): +class TetMesh(MeshVisual, UGridAlgorithms): """The class describing tetrahedral meshes.""" - def __init__( - self, - inputobj=None, - c=("r", "y", "lg", "lb", "b"), # ('b','lb','lg','y','r') - alpha=(0.5, 1), - alpha_unit=1, - mapper="tetra", - ): + def __init__(self, inputobj=None): """ Arguments: inputobj : (vtkDataSet, list, str) list of points and tet indices, or filename - alpha_unit : (float) - opacity scale - mapper : (str) - choose a visualization style in `['tetra', 'raycast', 'zsweep']` """ super().__init__() - self.actor = vtk.vtkVolume() + self.dataset = None + + self.mapper = vtk.new("PolyDataMapper") + self._actor = vtk.vtkActor() + self._actor.retrieve_object = weak_ref_to(self) + self._actor.SetMapper(self.mapper) + self.properties = self._actor.GetProperty() self.transform = LinearTransform() @@ -406,13 +321,13 @@ def __init__( elif isinstance(inputobj, UnstructuredGrid): self.dataset = inputobj.dataset - # elif isinstance(inputobj, vtk.vtkRectilinearGrid): - # r2t = vtk.new("RectilinearGridToTetrahedra") - # r2t.SetInputData(inputobj) - # r2t.RememberVoxelIdOn() - # r2t.SetTetraPerCellTo6() - # r2t.Update() - # self.dataset = r2t.GetOutput() + elif isinstance(inputobj, vtk.vtkRectilinearGrid): + r2t = vtk.new("RectilinearGridToTetrahedra") + r2t.SetInputData(inputobj) + r2t.RememberVoxelIdOn() + r2t.SetTetraPerCellTo6() + r2t.Update() + self.dataset = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): r2t = vtk.new("DataSetTriangleFilter") @@ -438,42 +353,52 @@ def __init__( tt.Update() self.dataset = tt.GetOutput() - elif utils.is_sequence(inputobj): - self.dataset = _buildtetugrid(inputobj[0], inputobj[1]) + elif utils.is_sequence(inputobj): + self.dataset = vtk.vtkUnstructuredGrid() - ################### - if "tetra" in mapper: - self.mapper = vtk.new("ProjectedTetrahedraMapper") - elif "ray" in mapper: - self.mapper = vtk.new("UnstructuredGridVolumeRayCastMapper") - elif "zs" in mapper: - self.mapper = vtk.new("UnstructuredGridVolumeZSweepMapper") - elif isinstance(mapper, vtk.get_class("Mapper")): - self.mapper = mapper - else: - vedo.logger.error(f"Unknown mapper type {type(mapper)}") - raise RuntimeError() + points, cells = inputobj + if len(points) == 0: + return + if not utils.is_sequence(points[0]): + return + if len(cells) == 0: + return - self.properties = self.actor.GetProperty() + if not utils.is_sequence(cells[0]): + tets = [] + nf = cells[0] + 1 + for i, cl in enumerate(cells): + if i in (nf, 0): + k = i + 1 + nf = cl + k + cell = [cells[j + k] for j in range(cl)] + tets.append(cell) + cells = tets - self.mapper.SetInputData(self.dataset) - self.actor.SetMapper(self.mapper) - self.cmap(c).alpha(alpha) - if alpha_unit: - self.properties.SetScalarOpacityUnitDistance(alpha_unit) + source_points = vtk.vtkPoints() + varr = utils.numpy2vtk(points, dtype=np.float32) + source_points.SetData(varr) + self.dataset.SetPoints(source_points) - # remember stuff: - self._color = c - self._alpha = alpha - self._alpha_unit = alpha_unit + source_tets = vtk.vtkCellArray() + for f in cells: + ele = vtk.vtkTetra() + pid = ele.GetPointIds() + for i, fi in enumerate(f): + pid.SetId(i, fi) + source_tets.InsertNextCell(ele) + self.dataset.SetCells(vtk.VTK_TETRA, source_tets) + + else: + vedo.logger.error(f"cannot understand input type {inputtype}") + return self.pipeline = utils.OperationNode( self, comment=f"#tets {self.dataset.GetNumberOfCells()}", c="#9e2a2b", ) - - ################################################################## + ################################################################## def __str__(self): """Print a string summary of the `TetMesh` object.""" module = self.__class__.__module__ @@ -611,27 +536,6 @@ def _repr_html_(self): ] return "\n".join(allt) - def copy(self, mapper="tetra"): - """Return a copy of the mesh. Alias of `clone()`.""" - return self.clone(mapper=mapper) - - def clone(self, mapper="tetra"): - """Clone the `TetMesh` object to yield an exact copy.""" - ug = vtk.vtkUnstructuredGrid() - ug.DeepCopy(self.dataset) - - cloned = TetMesh(ug, mapper=mapper) - pr = vtk.vtkVolumeProperty() - pr.DeepCopy(self.properties) - cloned.actor.SetProperty(pr) - - cloned.mapper.SetScalarMode(self.mapper.GetScalarMode()) - - cloned.pipeline = utils.OperationNode( - "clone", c="#edabab", shape="diamond", parents=[self], - ) - return cloned - def compute_quality(self, metric=7): """ Calculate functions of quality for the elements of a triangular mesh. @@ -661,19 +565,6 @@ def compute_quality(self, metric=7): self._update(qf.GetOutput()) return utils.vtk2numpy(qf.GetOutput().GetCellData().GetArray("Quality")) - def compute_tets_volume(self): - """Add to this mesh a cell data array containing the tetrahedron volume.""" - csf = vtk.new("CellSizeFilter") - csf.SetInputData(self.dataset) - csf.SetComputeArea(False) - csf.SetComputeVolume(True) - csf.SetComputeLength(False) - csf.SetComputeVertexCount(False) - csf.SetVolumeArrayName("TetVolume") - csf.Update() - self._update(csf.GetOutput()) - return utils.vtk2numpy(csf.GetOutput().GetCellData().GetArray("TetVolume")) - def check_validity(self, tol=0): """ Return an array of possible problematic tets following this convention: @@ -808,7 +699,7 @@ def isosurface(self, value=True): clp.SetInputData(cf.GetOutput()) clp.Update() msh = Mesh(clp.GetOutput(), c=None).phong() - msh.mapper.SetLookupTable(utils.ctf2lut(self)) + msh.copy_properties_from(self) msh.pipeline = utils.OperationNode("isosurface", c="#edabab", parents=[self]) return msh @@ -817,7 +708,7 @@ def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): Return a 2D slice of the mesh by a plane passing through origin and assigned normal. """ strn = str(normal) - if strn == "x": normal = (1, 0, 0) + if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) @@ -832,6 +723,6 @@ def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): cc.SetCutFunction(plane) cc.Update() msh = Mesh(cc.GetOutput()).flat().lighting("ambient") - msh.mapper.SetLookupTable(utils.ctf2lut(self)) + msh.copy_properties_from(self) msh.pipeline = utils.OperationNode("slice", c="#edabab", parents=[self]) return msh diff --git a/vedo/version.py b/vedo/version.py index d7b09312..b630fe8e 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev32a' +_version = '2023.5.0+dev33a' From c7f9c01aacae23a18740e03b3157c49298dcccd1 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Sat, 11 Nov 2023 20:42:03 +0100 Subject: [PATCH 240/251] fix small issue with tet examples --- examples/volumetric/streamlines3.py | 2 +- examples/volumetric/streamlines4.py | 2 +- examples/volumetric/tet_threshold.py | 12 +++--------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/examples/volumetric/streamlines3.py b/examples/volumetric/streamlines3.py index c206f9e6..065e279a 100644 --- a/examples/volumetric/streamlines3.py +++ b/examples/volumetric/streamlines3.py @@ -2,7 +2,7 @@ from vedo import * # Load an UnStructuredGrid -ugrid = UGrid(dataurl+"cavity.vtk") +ugrid = UnstructuredGrid(dataurl+"cavity.vtk") # Make a grid of points to probe as type Mesh probe = Grid(s=[0.1,0.01], res=[20,4], c='k') diff --git a/examples/volumetric/streamlines4.py b/examples/volumetric/streamlines4.py index 42e9e269..4e632e1c 100644 --- a/examples/volumetric/streamlines4.py +++ b/examples/volumetric/streamlines4.py @@ -1,7 +1,7 @@ from vedo import * f = download('https://github.com/marcomusy/vedo/files/4602353/domain_unstruct.vtk.gz') -ug = UGrid(gunzip(f)) +ug = UnstructuredGrid(gunzip(f)) # make up some custom vector field pts = ug.vertices diff --git a/examples/volumetric/tet_threshold.py b/examples/volumetric/tet_threshold.py index afd6e34c..f6a89372 100644 --- a/examples/volumetric/tet_threshold.py +++ b/examples/volumetric/tet_threshold.py @@ -1,17 +1,11 @@ -"""Threshold the original TetMesh -with a scalar array""" +"""Threshold a TetMesh with a scalar array""" from vedo import * -settings.use_depth_peeling = True - tetm = TetMesh(dataurl+'limb_ugrid.vtk') -tetm.cmap('prism').alpha([0,1]) # Threshold the tetrahedral mesh for values in the range: tetm.threshold(above=0.9, below=1) +tetm.cmap('Accent', 'chem_0', on='cells') tetm.add_scalarbar3d('chem_0 expression levels', c='k', italic=1) -show([(tetm,__doc__), - tetm.tomesh(shrink=0.9), - ], N=2, axes=1, -).close() +show(tetm, __doc__, axes=1).close() From c15fa8343a2c8a60ab46c92cb3d60125b726c857 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Mon, 13 Nov 2023 01:40:54 +0100 Subject: [PATCH 241/251] vtk trasnform tetmesh and other small fixes, removal of UGridAlgos --- docs/changes.md | 51 ++- examples/other/pygmsh_cut.py | 4 +- examples/other/remesh_meshfix.py | 4 +- examples/other/remesh_tetgen.py | 11 +- examples/volumetric/tet_cut2.py | 7 +- examples/volumetric/tet_isos_slice.py | 16 +- tests/test_pipeline.txt | 2 + vedo/cli.py | 3 +- vedo/core.py | 469 +---------------------- vedo/file_io.py | 12 +- vedo/plotter.py | 15 +- vedo/tetmesh.py | 523 +++++++++++++++++++++++--- vedo/utils.py | 56 +++ vedo/version.py | 2 +- vedo/vtkclasses.py | 20 +- 15 files changed, 618 insertions(+), 577 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 95e0bbdf..1a2129bd 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -4,57 +4,55 @@ Major internal refactoring. ### Breaking changes - requires vtk=>9.0 - plt.actors must become plt.objects -- change `.points()` to `.vertices` -- change `.cell_centers()` to `.cell_centers` -- change `.faces()` to `.cells` -- change `.lines()` to `.lines` -- change `.edges()` to `.edges` -- change `.normals()` to `.vertex_normals` and `.cell_normals` +- rename `.points()` to `.vertices` +- rename `.cell_centers()` to `.cell_centers` +- rename `.faces()` to `.cells` +- rename `.lines()` to `.lines` +- rename `.edges()` to `.edges` +- rename `.normals()` and split it into `.vertex_normals` and `.cell_normals` - removed `Volume.probe_points()` which becomes `points.probe(volume)` - removed `Volume.probe_line()` which becomes `line.probe(volume)` - removed `Volume.probe_plane()` which becomes `plane.probe(volume)` -- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is - therefore not muted by any subsequent interaction (thanks @baba-yaga ) +- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga ) +- removed `file_io.load_transform()`. `LinearTransform("file.mat")` substitutes it. +- removed `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). -- add brand new `transformations` module. +### Other changes +- add new `transformations` module. - add `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - add texture to npz files thanks to @zhouzq-thu in #918 - add background radial gradients -- add `utils.line_line_distance()` -- add `utils.segment_segment_distance()` -- add `plotter.initialize_interactor()` +- add `utils.line_line_distance()` function +- add `utils.segment_segment_distance()` function +- add `plotter.initialize_interactor()` method - add object hinting by hovering mouse (see `flag_labels1.py`) - add `colors.lut_color_at(value)` the color of the lookup table at value. - add `.show(..., screenshot="myfile.png")` keyword - add `object.coordinates` same as `object.vertices` - add `move()` to move single points or objects - add `copy()` as alias to `clone()` -- add "Roll" to camera settings (thanks @baba-yaga ) +- add "Roll" to camera dictionary (thanks @baba-yaga ) - add `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz -- remove `file_io.load_transform()`. LinearTransform("file.mat") substitutes this -- remove `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). - - bug fix in `closest_point()` thanks to @goncalo-pt - bug fix in tformat thanks to @JohnsWor in #913 - bug fix in windows OS in timers callbacks thanks to @jonaslindemann - bug fix to non linear tranforms mode. Now it can be instantiated with a dictionary - bug fix in meshlab interface thanks to @JeffreyWardman in #924 -- improvements in how vtk classes are imported (allow some laziness) +- improvements in how vtk classes are imported (allow lazy import) - improvements to method `mesh.clone2d()` - improvements in `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 - improvements in `applications.Browser` -- name change from `Picture` to `Image`, renamed `vedo.picture` to `vedo.image` -- name change `transform_with_landmarks()` to `align_with_landmarks()` -- name change `find_cells_in()` to `find_cells_in_bounds()` -- name change `mesh.is_inside(pt)` moved to `mesh.contains(pt)` -- name change `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` -- name change method `voronoi()` moved to `points.generate_voronoi()` -- name change class `Ruler` becomes `Ruler3D` +- rename `Picture` to `Image`, and `vedo.picture` to `vedo.image` +- rename `transform_with_landmarks()` to `align_with_landmarks()` +- rename `find_cells_in()` to `find_cells_in_bounds()` +- rename `mesh.is_inside(pt)` moved to `mesh.contains(pt)` +- rename `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` +- rename method `voronoi()` moved to `points.generate_voronoi()` +- rename class `Ruler` becomes `Ruler3D` -------------------------- ## New/Revised Examples ``` examples/basic/buttons.py @@ -78,7 +76,6 @@ examples/volumetric/tet_cut2.py examples/other/flag_labels1.py ``` - ### Broken Examples ``` tests/issues/discussion_800.py @@ -87,6 +84,7 @@ gyroscope1.py broken tet_cut2.py broken markpoint.py plot_spheric.py +examples/other/pygmsh_cut.py ust cut tetmesh to gen ugrid ``` #### Broken Projects @@ -99,7 +97,6 @@ cartoony.py flatarrow.py mesh_lut.py mesh_map2cell.py -rotate_image.py (miss transform) texturecubes.py meshquality.py volumetric/streamlines1.py diff --git a/examples/other/pygmsh_cut.py b/examples/other/pygmsh_cut.py index 9e419495..42b743eb 100644 --- a/examples/other/pygmsh_cut.py +++ b/examples/other/pygmsh_cut.py @@ -21,11 +21,11 @@ lines, triangles, tetras, vertices = msh.cells -msh = TetMesh([msh.points, tetras.data]).tomesh() +vmsh = TetMesh([msh.points, tetras.data]).tomesh() plt = Plotter(axes=1, interactive=False) plt.show( - msh, + vmsh, "Drag the sphere,\nright-click&drag to zoom", ) cutter = SphereCutter(msh) diff --git a/examples/other/remesh_meshfix.py b/examples/other/remesh_meshfix.py index 43734849..e5f148e9 100644 --- a/examples/other/remesh_meshfix.py +++ b/examples/other/remesh_meshfix.py @@ -12,8 +12,6 @@ import tetgen import vedo -vedo.settings.use_depth_peeling = True - amesh = vedo.Mesh(vedo.dataurl+'290.vtk') # repairing also closes the mesh in a nice way @@ -27,7 +25,7 @@ tmesh = vedo.TetMesh(tet.grid) # save it to disk -#tmesh.write("my_tetmesh.vtk") +# tmesh.write("my_tetmesh.vtu") plt = vedo.Plotter(N=3, axes=1) plt.at(0).show("Original mesh", amesh) diff --git a/examples/other/remesh_tetgen.py b/examples/other/remesh_tetgen.py index e40ee932..6e1c62f5 100644 --- a/examples/other/remesh_tetgen.py +++ b/examples/other/remesh_tetgen.py @@ -1,8 +1,8 @@ -"""Segment a TetMesh with a custom scalar. -Press q to make it explode""" -from vedo import Mesh, TetMesh, Plotter, Text2D, dataurl, settings -import tetgen +"""Create a TetMesh from a closed surface and explode it into pieces. +Press q to make it explode.""" +from vedo import Points, Mesh, TetMesh, Plotter, Text2D, dataurl, settings import pymeshfix +import tetgen settings.default_font = "Brachium" @@ -19,11 +19,10 @@ tet.tetrahedralize(order=1, mindihedral=50, minratio=1.5) tmesh = TetMesh(tet.grid) -surf = tmesh.tomesh(fill=False) txt = Text2D(__doc__) # pick points on the surface and use subsample to make them uniform -seeds = surf.clone().subsample(f2).ps(10).c("black") +seeds = Points(tmesh.cell_centers).subsample(f2) # assign to each tetrahedron the id of the closest seed point cids = [] diff --git a/examples/volumetric/tet_cut2.py b/examples/volumetric/tet_cut2.py index 0be8a1b4..547be90a 100644 --- a/examples/volumetric/tet_cut2.py +++ b/examples/volumetric/tet_cut2.py @@ -11,24 +11,21 @@ # Clone and cut the TetMesh, this returns a UnstructuredGrid: ugrid1 = tetm1.clone().cut_with_mesh(sphere, invert=True) +ugrid1.cmap("Purples_r", "SignedDistance") print(ugrid1) -ugrid1.cmap("Greens_r", "SignedDistance") -show(ugrid1, sphere, axes=1, viewup='z').close() # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): ugrid2 = tetm1.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) tetm2 = TetMesh(ugrid2).cmap("Greens_r", "ProximoDistal") print(tetm2) -# show(tetm2, sphere, axes=1, viewup='z').close() # Cut tetm, but the output will keep only the tets on the boundary: ugrid3 = tetm1.clone().cut_with_mesh(sphere, on_boundary=True) tetm3 = TetMesh(ugrid3).cmap("Reds", "chem_0", on="cells") print(tetm3) -# show(tetm3, sphere, axes=1, viewup='z').close() show([ - (tetm1, __doc__), + (ugrid1,sphere, __doc__), (tetm2, sphere, "Keep only tets that lie\ncompletely outside the Sphere"), (tetm3, sphere, "Keep only tets that lie\nexactly on the Sphere"), ], diff --git a/examples/volumetric/tet_isos_slice.py b/examples/volumetric/tet_isos_slice.py index d67fb1ab..9b0ef1c2 100644 --- a/examples/volumetric/tet_isos_slice.py +++ b/examples/volumetric/tet_isos_slice.py @@ -1,16 +1,16 @@ # Thresholding and slicing a TetMesh from vedo import TetMesh, dataurl, show -tetmesh = TetMesh(dataurl+'limb_ugrid.vtk').color('Spectral') -tetmesh.add_scalarbar3d('chem_0 expression', c='k') +tmsh = TetMesh(dataurl+'limb_ugrid.vtk').color('Spectral') +tmsh.cmap('hot').add_scalarbar3d('chem_0 expression', c='k') -thrslist = [0.2, 0.3, 0.8] -isos = tetmesh.isosurface(thrslist) +vals = [0.2, 0.3, 0.8] +isos = tmsh.isosurface(vals) -slce = tetmesh.slice(normal=(1,1,1)).lw(0.1) +slce = tmsh.slice(normal=(1,1,1)).lighting("off").lw(1) show([ - (tetmesh, "A TetMesh"), - (isos, "Isosurfaces for thresholds:\n"+str(thrslist)), + (tmsh, "A TetMesh"), + (isos, "Isosurfaces for values:\n"+str(vals)), (slce, "Slice TetMesh with plane"), - ], N=3, axes=1, viewup='z').close() + ], N=3, axes=1).close() diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt index 714900d5..3b58d380 100644 --- a/tests/test_pipeline.txt +++ b/tests/test_pipeline.txt @@ -31,6 +31,8 @@ sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py ### ENABLE VIZ cd ~/Projects/vedo/tests/common && ./run_all.sh cd ~/Projects/vedo/examples/ && time ./run_all.sh 2>&1 | tee ~/Dropbox/vedo_test.txt +grep -A 1 "Error" ~/Dropbox/vedo_test.txt +grep -A 3 "Trace" ~/Dropbox/vedo_test.txt code ~/Dropbox/vedo_test.txt #### inspect logfile (search "Traceback", "Error") #### # (Try normal run too with visualization to make sure all is ok.) diff --git a/vedo/cli.py b/vedo/cli.py index 0f09d8eb..33b55315 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -835,7 +835,8 @@ def draw_scene(args): obj = load(f, force=args.reload) if isinstance(obj, (TetMesh, UnstructuredGrid)): - obj = obj.tomesh().shrink(0.975).c(colb).alpha(args.alpha) + #obj = obj#.shrink(0.95) + obj.c(colb).alpha(args.alpha) elif isinstance(obj, vedo.Points): obj.c(colb).alpha(args.alpha) diff --git a/vedo/core.py b/vedo/core.py index 64a66dc5..17bf8961 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -22,7 +22,6 @@ "CommonAlgorithms", "PointAlgorithms", "VolumeAlgorithms", - "UGridAlgorithms", ] warnings = dict( @@ -387,11 +386,12 @@ class CommonAlgorithms: """Common algorithms.""" def __init__(self): - + # print("init CommonAlgorithms") self.dataset = None self.pipeline = None self.name = "" self.filename = "" + self.time = 0 @property def pointdata(self): @@ -1347,7 +1347,7 @@ class PointAlgorithms(CommonAlgorithms): """Methods for point clouds.""" def __init__(self): - + # print('init PointAlgorithms') super().__init__() self.transform = None @@ -1413,7 +1413,19 @@ def apply_transform(self, LT, concatenate=True, deep_copy=True): self.transform = LinearTransform() ################ - tp = vtk.new("TransformPolyDataFilter") + if isinstance(self.dataset, vtk.vtkPolyData): + tp = vtk.new("TransformPolyDataFilter") + elif isinstance(self.dataset, vtk.vtkUnstructuredGrid): + tp = vtk.new("TransformFilter") + tp.TransformAllInputVectorsOn() + # elif isinstance(self.dataset, vtk.vtkImageData): + # tp = vtk.new("ImageReslice") + # tp.SetInterpolationModeToCubic() + # tp.SetResliceTransform(tr) + else: + vedo.logger.error( + f"apply_transform(), unknown input type: {[self.dataset]}") + return self tp.SetTransform(tr) tp.SetInputData(self.dataset) tp.Update() @@ -1754,452 +1766,3 @@ def tomesh(self, fill=True, shrink=1.0): "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" ) return msh - - -class UGridAlgorithms(CommonAlgorithms): - - def __init__(self): - super().__init__() - pass - - @property - def actor(self): - """Return the `vtkActor` of the object.""" - # print("building actor") - gf = vtk.new("GeometryFilter") - gf.SetInputData(self.dataset) - gf.Update() - out = gf.GetOutput() - self.mapper.SetInputData(out) - self.mapper.Modified() - return self._actor - - @actor.setter - def actor(self, _): - pass - - def _update(self, data, reset_locators=False): - self.dataset = data - # self.mapper.SetInputData(data) - # self.mapper.Modified() - ## self.actor.Modified() - return self - - def copy(self, deep=True): - """Return a copy of the object. Alias of `clone()`.""" - return self.clone(deep=deep) - - def clone(self, deep=True): - """Clone the UnstructuredGrid object to yield an exact copy.""" - ug = vtk.vtkUnstructuredGrid() - if deep: - ug.DeepCopy(self.dataset) - else: - ug.ShallowCopy(self.dataset) - if isinstance(self, vedo.UnstructuredGrid): - cloned = vedo.UnstructuredGrid(ug) - else: - cloned = vedo.TetMesh(ug) - pr = vtk.vtkProperty() - pr.DeepCopy(self.properties) - cloned._actor.SetProperty(pr) - cloned.properties = pr - # there is no deep copy for mapper - cloned.mapper.ShallowCopy(self.mapper) - - cloned.pipeline = utils.OperationNode( - "clone", parents=[self], shape='diamond', c='#bbe1ed', - ) - return cloned - - def bounds(self): - """ - Get the object bounds. - Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. - """ - # OVERRIDE CommonAlgorithms.bounds() which is too slow - return self.dataset.GetBounds() - - def isosurface(self, value=None, flying_edges=True): - """ - Return an `Mesh` isosurface extracted from the `Volume` object. - - Set `value` as single float or list of values to draw the isosurface(s). - Use flying_edges for faster results (but sometimes can interfere with `smooth()`). - - Examples: - - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) - - ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) - """ - scrange = self.dataset.GetScalarRange() - - if flying_edges: - cf = vtk.new("FlyingEdges3D") - cf.InterpolateAttributesOn() - else: - cf = vtk.new("ContourFilter") - cf.UseScalarTreeOn() - - cf.SetInputData(self.dataset) - cf.ComputeNormalsOn() - - if utils.is_sequence(value): - cf.SetNumberOfContours(len(value)) - for i, t in enumerate(value): - cf.SetValue(i, t) - else: - if value is None: - value = (2 * scrange[0] + scrange[1]) / 3.0 - # print("automatic isosurface value =", value) - cf.SetValue(0, value) - - cf.Update() - poly = cf.GetOutput() - - out = vedo.mesh.Mesh(poly, c=None).phong() - out.mapper.SetScalarRange(scrange[0], scrange[1]) - - out.pipeline = utils.OperationNode( - "isosurface", - parents=[self], - comment=f"#pts {out.dataset.GetNumberOfPoints()}", - c="#4cc9f0:#e9c46a", - ) - return out - - def tomesh(self, fill=True, shrink=1.0): - """ - Build a polygonal `Mesh` from the current object. - - If `fill=True`, the interior faces of all the cells are created. - (setting a `shrink` value slightly smaller than the default 1.0 - can avoid flickering due to internal adjacent faces). - - If `fill=False`, only the boundary faces will be generated. - """ - gf = vtk.new("GeometryFilter") - if fill: - sf = vtk.new("ShrinkFilter") - sf.SetInputData(self.dataset) - sf.SetShrinkFactor(shrink) - sf.Update() - gf.SetInputData(sf.GetOutput()) - gf.Update() - poly = gf.GetOutput() - if shrink == 1.0: - clean_poly = vtk.new("CleanPolyData") - clean_poly.PointMergingOn() - clean_poly.ConvertLinesToPointsOn() - clean_poly.ConvertPolysToLinesOn() - clean_poly.ConvertStripsToPolysOn() - clean_poly.SetInputData(poly) - clean_poly.Update() - poly = clean_poly.GetOutput() - else: - gf.SetInputData(self.dataset) - gf.Update() - poly = gf.GetOutput() - - msh = vedo.mesh.Mesh(poly).flat() - # lut = utils.ctf2lut(self) - # if lut: - # msh.mapper.SetLookupTable(lut) - - msh.pipeline = utils.OperationNode( - "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" - ) - return msh - - - def extract_cell_type(self, ctype): - """Extract a specific cell type and return a new `UnstructuredGrid`.""" - uarr = self.dataset.GetCellTypesArray() - ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] - uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") - selection_node = vtk.new("SelectionNode") - selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) - selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) - selection_node.SetSelectionList(uarrtyp) - selection = vtk.new("Selection") - selection.AddNode(selection_node) - es = vtk.new("ExtractSelection") - es.SetInputData(0, self.dataset) - es.SetInputData(1, selection) - es.Update() - - ug = UnstructuredGrid(es.GetOutput()) - - ug.pipeline = utils.OperationNode( - "extract_cell_type", comment=f"type {ctype}", - c="#edabab", parents=[self], - ) - return ug - - def extract_cells_by_id(self, idlist, use_point_ids=False): - """Return a new `UnstructuredGrid` composed of the specified subset of indices.""" - selection_node = vtk.new("SelectionNode") - if use_point_ids: - selection_node.SetFieldType(vtk.get_class("SelectionNode").POINT) - contcells = vtk.get_class("SelectionNode").CONTAINING_CELLS() - selection_node.GetProperties().Set(contcells, 1) - else: - selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) - selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) - vidlist = utils.numpy2vtk(idlist, dtype="id") - selection_node.SetSelectionList(vidlist) - selection = vtk.new("Selection") - selection.AddNode(selection_node) - es = vtk.new("ExtractSelection") - es.SetInputData(0, self) - es.SetInputData(1, selection) - es.Update() - - ug = vedo.tetmesh.UnstructuredGrid(es.GetOutput()) - pr = vtk.vtkProperty() - pr.DeepCopy(self.properties) - ug.SetProperty(pr) - ug.properties = pr - - ug.mapper.SetLookupTable(utils.ctf2lut(self)) - ug.pipeline = utils.OperationNode( - "extract_cells_by_id", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return ug - - def find_cell(self, p): - """Locate the cell that contains a point and return the cell ID.""" - cell = vtk.vtkTetra() - cell_id = vtk.mutable(0) - tol2 = vtk.mutable(0) - sub_id = vtk.mutable(0) - pcoords = [0, 0, 0] - weights = [0, 0, 0] - cid = self.dataset.FindCell( - p, cell, cell_id, tol2, sub_id, pcoords, weights) - return cid - - def clean(self): - """ - Cleanup unused points and empty cells - """ - cl = vtk.new("StaticCleanUnstructuredGrid") - cl.SetInputData(self.dataset) - cl.RemoveUnusedPointsOn() - cl.ProduceMergeMapOff() - cl.AveragePointDataOff() - cl.Update() - - self._update(cl.GetOutput()) - self.pipeline = utils.OperationNode( - "clean", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self - - def extract_cells_on_plane(self, origin, normal): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.new("3DLinearGridCrinkleExtractor") - bf.SetInputData(self.dataset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - plane = vtk.new("Plane") - plane.SetOrigin(origin) - plane.SetNormal(normal) - bf.SetImplicitFunction(plane) - bf.Update() - - self._update(bf.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode( - "extract_cells_on_plane", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self - - def extract_cells_on_sphere(self, center, radius): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.new("3DLinearGridCrinkleExtractor") - bf.SetInputData(self.dataset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - sph = vtk.new("Sphere") - sph.SetRadius(radius) - sph.SetCenter(center) - bf.SetImplicitFunction(sph) - bf.Update() - - self._update(bf.GetOutput()) - self.pipeline = utils.OperationNode( - "extract_cells_on_sphere", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - return self - - def extract_cells_on_cylinder(self, center, axis, radius): - """ - Extract cells that are lying of the specified surface. - """ - bf = vtk.new("3DLinearGridCrinkleExtractor") - bf.SetInputData(self.dataset) - bf.CopyPointDataOn() - bf.CopyCellDataOn() - bf.RemoveUnusedPointsOff() - - cyl = vtk.new("Cylinder") - cyl.SetRadius(radius) - cyl.SetCenter(center) - cyl.SetAxis(axis) - bf.SetImplicitFunction(cyl) - bf.Update() - - self.pipeline = utils.OperationNode( - "extract_cells_on_cylinder", - parents=[self], - comment=f"#cells {self.dataset.GetNumberOfCells()}", - c="#9e2a2b", - ) - self._update(bf.GetOutput()) - return self - - def cut_with_plane(self, origin=(0, 0, 0), normal="x"): - """ - Cut the object with the plane defined by a point and a normal. - - Arguments: - origin : (list) - the cutting plane goes through this point - normal : (list, str) - normal vector to the cutting plane - """ - # if isinstance(self, vedo.Volume): - # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") - - strn = str(normal) - if strn == "x": normal = (1, 0, 0) - elif strn == "y": normal = (0, 1, 0) - elif strn == "z": normal = (0, 0, 1) - elif strn == "-x": normal = (-1, 0, 0) - elif strn == "-y": normal = (0, -1, 0) - elif strn == "-z": normal = (0, 0, -1) - plane = vtk.new("Plane") - plane.SetOrigin(origin) - plane.SetNormal(normal) - clipper = vtk.new("ClipDataSet") - clipper.SetInputData(self.dataset) - clipper.SetClipFunction(plane) - clipper.GenerateClipScalarsOff() - clipper.GenerateClippedOutputOff() - clipper.SetValue(0) - clipper.Update() - cout = clipper.GetOutput() - - if isinstance(cout, vtk.vtkUnstructuredGrid): - ug = vedo.UnstructuredGrid(cout) - if isinstance(self, vedo.UnstructuredGrid): - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return ug - - else: - self._update(cout) - self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") - return self - - def cut_with_box(self, box): - """ - Cut the grid with the specified bounding box. - - Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. - If an object is passed, its bounding box are used. - - This method always returns a TetMesh object. - - Example: - ```python - from vedo import * - tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') - tetmesh.color('rainbow') - cu = Cube(side=500).x(500) # any Mesh works - tetmesh.cut_with_box(cu).show(axes=1) - ``` - - ![](https://vedo.embl.es/images/feats/tet_cut_box.png) - """ - bc = vtk.new("BoxClipDataSet") - bc.SetInputData(self.dataset) - try: - boxb = box.bounds() - except AttributeError: - boxb = box - - bc.SetBoxClip(*boxb) - bc.Update() - cout = bc.GetOutput() - - # output of vtkBoxClipDataSet is always tetrahedrons - tm = vedo.TetMesh(cout) - tm.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") - return tm - - - def cut_with_mesh( - self, mesh, invert=False, whole_cells=False, on_boundary=False - ): - """ - Cut a UnstructuredGrid or TetMesh with a Mesh. - - Use `invert` to return cut off part of the input object. - """ - ug = self.dataset - - ippd = vtk.new("ImplicitPolyDataDistance") - ippd.SetInput(mesh.dataset) - - if whole_cells or on_boundary: - clipper = vtk.new("ExtractGeometry") - clipper.SetInputData(ug) - clipper.SetImplicitFunction(ippd) - clipper.SetExtractInside(not invert) - clipper.SetExtractBoundaryCells(False) - if on_boundary: - clipper.SetExtractBoundaryCells(True) - clipper.SetExtractOnlyBoundaryCells(True) - else: - signed_dists = vtk.vtkFloatArray() - signed_dists.SetNumberOfComponents(1) - signed_dists.SetName("SignedDistance") - for pointId in range(ug.GetNumberOfPoints()): - p = ug.GetPoint(pointId) - signed_dist = ippd.EvaluateFunction(p) - signed_dists.InsertNextValue(signed_dist) - ug.GetPointData().AddArray(signed_dists) - ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED - clipper = vtk.new("ClipDataSet") - clipper.SetInputData(ug) - clipper.SetInsideOut(not invert) - clipper.SetValue(0.0) - - clipper.Update() - - out = vedo.UnstructuredGrid(clipper.GetOutput()) - out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") - return out diff --git a/vedo/file_io.py b/vedo/file_io.py index 31699b76..278662d5 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -1338,12 +1338,18 @@ def _fillcommon(obj, adict): adict["type"] = "unknown" ######################################################## Points/Mesh - if isinstance(obj, Points): + if isinstance(obj, (Points, vedo.UnstructuredGrid)): adict["type"] = "Mesh" _fillcommon(obj, adict) - poly = obj.dataset - mapper = obj.mapper + if isinstance(obj, vedo.UnstructuredGrid): + # adict["type"] = "UnstructuredGrid" + # adict["cells"] = obj.cells_as_flat_array + poly = obj._actor.GetMapper().GetInput() + mapper = obj._actor.GetMapper() + else: + poly = obj.dataset + mapper = obj.mapper adict["points"] = obj.vertices.astype(float) diff --git a/vedo/plotter.py b/vedo/plotter.py index 4e36c9a8..0111310a 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -932,12 +932,14 @@ def add(self, *objs, at=None): def remove(self, *objs, at=None): """ Remove input object to the internal list of objects to be shown. - Objects to be removed can be referenced by their assigned name. + + Objects to be removed can be referenced by their assigned name, Arguments: at : (int) remove the object at the specified renderer """ + #TODO and you can also use wildcards like `*` and `?`. if at is not None: ren = self.renderers[at] else: @@ -963,9 +965,13 @@ def remove(self, *objs, at=None): # print("PARSING", [a]) try: if (a.name and a.name in objs) or a in objs: - # if (a.name and any(x in a.name for x in objs)) or a in objs: - # print('a.name',a.name) - objs.append(a) + objs.append(a) + pass + # if a.name: + # bools = [utils.parse_pattern(ob, a.name)[0] for ob in objs] + # if any(bools) or a in objs: + # objs.append(a) + # print('a.name',a.name, objs,any(bools)) except AttributeError: # no .name # passing the actor so get back the object with .retrieve_object() try: @@ -1023,7 +1029,6 @@ def remove(self, *objs, at=None): # del self.objects[i] # instead we do: self.objects = [ele for i, ele in enumerate(self.objects) if i not in ids] - return self @property diff --git a/vedo/tetmesh.py b/vedo/tetmesh.py index 7c049bb8..37b0ca33 100644 --- a/vedo/tetmesh.py +++ b/vedo/tetmesh.py @@ -7,7 +7,7 @@ import numpy as np import vedo from vedo import utils -from vedo.core import UGridAlgorithms +from vedo.core import PointAlgorithms from vedo.mesh import Mesh from vedo.file_io import download from vedo.visual import MeshVisual @@ -24,7 +24,7 @@ __all__ = ["UnstructuredGrid", "TetMesh"] ######################################################################### -class UnstructuredGrid(MeshVisual, UGridAlgorithms): +class UnstructuredGrid(MeshVisual, PointAlgorithms): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): @@ -54,6 +54,8 @@ def __init__(self, inputobj=None): self.name = "UnstructuredGrid" self.filename = "" self.info = {} + self.time = 0 + self.rendered_at = set() ################### inputtype = str(type(inputobj)) @@ -85,13 +87,6 @@ def __init__(self, inputobj=None): points.SetData(vpts) self.dataset.SetPoints(points) - # This fill the points and use cells to define orientation - # points = vtk.vtkPoints() - # for c in cells: - # for pid in c: - # points.InsertNextPoint(pts[pid]) - # self.dataset.SetPoints(points) - # Fill cells # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html for i, ct in enumerate(celltypes): @@ -155,7 +150,7 @@ def __str__(self): out += "\x1b[0m\u001b[35m" out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" - out += "nr. of cells".ljust(14)+ ": " + str(self.ncells) + "\n" + out += "nr. of cells".ljust(14) + ": " + str(self.ncells) + "\n" if self.npoints: out+="size".ljust(14)+ ": average=" + utils.precision(self.average_size(),6) @@ -283,8 +278,472 @@ def _repr_html_(self): ] return "\n".join(all) + @property + def actor(self): + """Return the `vtkActor` of the object.""" + # print("building actor") + gf = vtk.new("GeometryFilter") + gf.SetInputData(self.dataset) + gf.Update() + out = gf.GetOutput() + self.mapper.SetInputData(out) + self.mapper.Modified() + return self._actor + + @actor.setter + def actor(self, _): + pass + + def _update(self, data, reset_locators=False): + self.dataset = data + # self.mapper.SetInputData(data) + # self.mapper.Modified() + ## self.actor.Modified() + return self + + def copy(self, deep=True): + """Return a copy of the object. Alias of `clone()`.""" + return self.clone(deep=deep) + + def clone(self, deep=True): + """Clone the UnstructuredGrid object to yield an exact copy.""" + ug = vtk.vtkUnstructuredGrid() + if deep: + ug.DeepCopy(self.dataset) + else: + ug.ShallowCopy(self.dataset) + if isinstance(self, vedo.UnstructuredGrid): + cloned = vedo.UnstructuredGrid(ug) + else: + cloned = vedo.TetMesh(ug) + + cloned.copy_properties_from(self) + + cloned.pipeline = utils.OperationNode( + "clone", parents=[self], shape='diamond', c='#bbe1ed', + ) + return cloned + + def bounds(self): + """ + Get the object bounds. + Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. + """ + # OVERRIDE CommonAlgorithms.bounds() which is too slow + return self.dataset.GetBounds() + + def threshold(self, name=None, above=None, below=None, on="cells"): + """ + Threshold the tetrahedral mesh by a cell scalar value. + Reduce to only tets which satisfy the threshold limits. + + - if `above = below` will only select tets with that specific value. + - if `above > below` selection range is flipped. + + Set keyword "on" to either "cells" or "points". + """ + th = vtk.new("Threshold") + th.SetInputData(self.dataset) + + if name is None: + if self.celldata.keys(): + name = self.celldata.keys()[0] + th.SetInputArrayToProcess(0, 0, 0, 1, name) + elif self.pointdata.keys(): + name = self.pointdata.keys()[0] + th.SetInputArrayToProcess(0, 0, 0, 0, name) + if name is None: + vedo.logger.warning("cannot find active array. Skip.") + return self + else: + if on.startswith("c"): + th.SetInputArrayToProcess(0, 0, 0, 1, name) + else: + th.SetInputArrayToProcess(0, 0, 0, 0, name) + + if above is not None: + th.SetLowerThreshold(above) + + if below is not None: + th.SetUpperThreshold(below) + + th.Update() + return self._update(th.GetOutput()) + + def isosurface(self, value=None, flying_edges=True): + """ + Return an `Mesh` isosurface extracted from the `Volume` object. + + Set `value` as single float or list of values to draw the isosurface(s). + Use flying_edges for faster results (but sometimes can interfere with `smooth()`). + + Examples: + - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) + + ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) + """ + scrange = self.dataset.GetScalarRange() + + if flying_edges: + cf = vtk.new("FlyingEdges3D") + cf.InterpolateAttributesOn() + else: + cf = vtk.new("ContourFilter") + cf.UseScalarTreeOn() + + cf.SetInputData(self.dataset) + cf.ComputeNormalsOn() + + if utils.is_sequence(value): + cf.SetNumberOfContours(len(value)) + for i, t in enumerate(value): + cf.SetValue(i, t) + else: + if value is None: + value = (2 * scrange[0] + scrange[1]) / 3.0 + # print("automatic isosurface value =", value) + cf.SetValue(0, value) + + cf.Update() + poly = cf.GetOutput() + + out = vedo.mesh.Mesh(poly, c=None).phong() + out.mapper.SetScalarRange(scrange[0], scrange[1]) + + out.pipeline = utils.OperationNode( + "isosurface", + parents=[self], + comment=f"#pts {out.dataset.GetNumberOfPoints()}", + c="#4cc9f0:#e9c46a", + ) + return out + + def tomesh(self, fill=True, shrink=1.0): + """ + Build a polygonal `Mesh` from the current object. + + If `fill=True`, the interior faces of all the cells are created. + (setting a `shrink` value slightly smaller than the default 1.0 + can avoid flickering due to internal adjacent faces). + + If `fill=False`, only the boundary faces will be generated. + """ + gf = vtk.new("GeometryFilter") + if fill: + sf = vtk.new("ShrinkFilter") + sf.SetInputData(self.dataset) + sf.SetShrinkFactor(shrink) + sf.Update() + gf.SetInputData(sf.GetOutput()) + gf.Update() + poly = gf.GetOutput() + else: + gf.SetInputData(self.dataset) + gf.Update() + poly = gf.GetOutput() + + msh = vedo.mesh.Mesh(poly) + msh.copy_properties_from(self) + + msh.pipeline = utils.OperationNode( + "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" + ) + return msh + + def extract_cell_by_type(self, ctype): + """Extract a specific cell type and return a new `UnstructuredGrid`.""" + uarr = self.dataset.GetCellTypesArray() + ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] + uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") + selection_node = vtk.new("SelectionNode") + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) + selection_node.SetSelectionList(uarrtyp) + selection = vtk.new("Selection") + selection.AddNode(selection_node) + es = vtk.new("ExtractSelection") + es.SetInputData(0, self.dataset) + es.SetInputData(1, selection) + es.Update() + + ug = UnstructuredGrid(es.GetOutput()) + + ug.pipeline = utils.OperationNode( + "extract_cell_type", comment=f"type {ctype}", + c="#edabab", parents=[self], + ) + return ug + + def extract_cells_by_id(self, idlist, use_point_ids=False): + """Return a new `UnstructuredGrid` composed of the specified subset of indices.""" + selection_node = vtk.new("SelectionNode") + if use_point_ids: + selection_node.SetFieldType(vtk.get_class("SelectionNode").POINT) + contcells = vtk.get_class("SelectionNode").CONTAINING_CELLS() + selection_node.GetProperties().Set(contcells, 1) + else: + selection_node.SetFieldType(vtk.get_class("SelectionNode").CELL) + selection_node.SetContentType(vtk.get_class("SelectionNode").INDICES) + vidlist = utils.numpy2vtk(idlist, dtype="id") + selection_node.SetSelectionList(vidlist) + selection = vtk.new("Selection") + selection.AddNode(selection_node) + es = vtk.new("ExtractSelection") + es.SetInputData(0, self) + es.SetInputData(1, selection) + es.Update() + + ug = vedo.tetmesh.UnstructuredGrid(es.GetOutput()) + pr = vtk.vtkProperty() + pr.DeepCopy(self.properties) + ug.SetProperty(pr) + ug.properties = pr + + ug.mapper.SetLookupTable(utils.ctf2lut(self)) + ug.pipeline = utils.OperationNode( + "extract_cells_by_id", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return ug + + def find_cell(self, p): + """Locate the cell that contains a point and return the cell ID.""" + cell = vtk.vtkTetra() + cell_id = vtk.mutable(0) + tol2 = vtk.mutable(0) + sub_id = vtk.mutable(0) + pcoords = [0, 0, 0] + weights = [0, 0, 0] + cid = self.dataset.FindCell( + p, cell, cell_id, tol2, sub_id, pcoords, weights) + return cid + + def clean(self): + """ + Cleanup unused points and empty cells + """ + cl = vtk.new("StaticCleanUnstructuredGrid") + cl.SetInputData(self.dataset) + cl.RemoveUnusedPointsOn() + cl.ProduceMergeMapOff() + cl.AveragePointDataOff() + cl.Update() + + self._update(cl.GetOutput()) + self.pipeline = utils.OperationNode( + "clean", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def extract_cells_on_plane(self, origin, normal): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.new("3DLinearGridCrinkleExtractor") + bf.SetInputData(self.dataset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + plane = vtk.new("Plane") + plane.SetOrigin(origin) + plane.SetNormal(normal) + bf.SetImplicitFunction(plane) + bf.Update() + + self._update(bf.GetOutput(), reset_locators=False) + self.pipeline = utils.OperationNode( + "extract_cells_on_plane", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def extract_cells_on_sphere(self, center, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.new("3DLinearGridCrinkleExtractor") + bf.SetInputData(self.dataset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + sph = vtk.new("Sphere") + sph.SetRadius(radius) + sph.SetCenter(center) + bf.SetImplicitFunction(sph) + bf.Update() + + self._update(bf.GetOutput()) + self.pipeline = utils.OperationNode( + "extract_cells_on_sphere", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + return self + + def extract_cells_on_cylinder(self, center, axis, radius): + """ + Extract cells that are lying of the specified surface. + """ + bf = vtk.new("3DLinearGridCrinkleExtractor") + bf.SetInputData(self.dataset) + bf.CopyPointDataOn() + bf.CopyCellDataOn() + bf.RemoveUnusedPointsOff() + + cyl = vtk.new("Cylinder") + cyl.SetRadius(radius) + cyl.SetCenter(center) + cyl.SetAxis(axis) + bf.SetImplicitFunction(cyl) + bf.Update() + + self.pipeline = utils.OperationNode( + "extract_cells_on_cylinder", + parents=[self], + comment=f"#cells {self.dataset.GetNumberOfCells()}", + c="#9e2a2b", + ) + self._update(bf.GetOutput()) + return self + + def cut_with_plane(self, origin=(0, 0, 0), normal="x"): + """ + Cut the object with the plane defined by a point and a normal. + + Arguments: + origin : (list) + the cutting plane goes through this point + normal : (list, str) + normal vector to the cutting plane + """ + # if isinstance(self, vedo.Volume): + # raise RuntimeError("cut_with_plane() is not applicable to Volume objects.") + + strn = str(normal) + if strn == "x": normal = (1, 0, 0) + elif strn == "y": normal = (0, 1, 0) + elif strn == "z": normal = (0, 0, 1) + elif strn == "-x": normal = (-1, 0, 0) + elif strn == "-y": normal = (0, -1, 0) + elif strn == "-z": normal = (0, 0, -1) + plane = vtk.new("Plane") + plane.SetOrigin(origin) + plane.SetNormal(normal) + clipper = vtk.new("ClipDataSet") + clipper.SetInputData(self.dataset) + clipper.SetClipFunction(plane) + clipper.GenerateClipScalarsOff() + clipper.GenerateClippedOutputOff() + clipper.SetValue(0) + clipper.Update() + cout = clipper.GetOutput() + + if isinstance(cout, vtk.vtkUnstructuredGrid): + ug = vedo.UnstructuredGrid(cout) + if isinstance(self, vedo.UnstructuredGrid): + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + ug.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return ug + + else: + self._update(cout) + self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") + return self + + def cut_with_box(self, box): + """ + Cut the grid with the specified bounding box. + + Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. + If an object is passed, its bounding box are used. + + This method always returns a TetMesh object. + + Example: + ```python + from vedo import * + tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') + tetmesh.color('rainbow') + cu = Cube(side=500).x(500) # any Mesh works + tetmesh.cut_with_box(cu).show(axes=1) + ``` + + ![](https://vedo.embl.es/images/feats/tet_cut_box.png) + """ + bc = vtk.new("BoxClipDataSet") + bc.SetInputData(self.dataset) + try: + boxb = box.bounds() + except AttributeError: + boxb = box + + bc.SetBoxClip(*boxb) + bc.Update() + cout = bc.GetOutput() + + # output of vtkBoxClipDataSet is always tetrahedrons + tm = vedo.TetMesh(cout) + tm.pipeline = utils.OperationNode("cut_with_box", parents=[self], c="#9e2a2b") + return tm + + + def cut_with_mesh( + self, mesh, invert=False, whole_cells=False, on_boundary=False + ): + """ + Cut a UnstructuredGrid or TetMesh with a Mesh. + + Use `invert` to return cut off part of the input object. + """ + ug = self.dataset + + ippd = vtk.new("ImplicitPolyDataDistance") + ippd.SetInput(mesh.dataset) + + if whole_cells or on_boundary: + clipper = vtk.new("ExtractGeometry") + clipper.SetInputData(ug) + clipper.SetImplicitFunction(ippd) + clipper.SetExtractInside(not invert) + clipper.SetExtractBoundaryCells(False) + if on_boundary: + clipper.SetExtractBoundaryCells(True) + clipper.SetExtractOnlyBoundaryCells(True) + else: + signed_dists = vtk.vtkFloatArray() + signed_dists.SetNumberOfComponents(1) + signed_dists.SetName("SignedDistance") + for pointId in range(ug.GetNumberOfPoints()): + p = ug.GetPoint(pointId) + signed_dist = ippd.EvaluateFunction(p) + signed_dists.InsertNextValue(signed_dist) + ug.GetPointData().AddArray(signed_dists) + ug.GetPointData().SetActiveScalars("SignedDistance") # NEEDED + clipper = vtk.new("ClipDataSet") + clipper.SetInputData(ug) + clipper.SetInsideOut(not invert) + clipper.SetValue(0.0) + + clipper.Update() + + out = vedo.UnstructuredGrid(clipper.GetOutput()) + out.pipeline = utils.OperationNode("cut_with_mesh", parents=[self], c="#9e2a2b") + return out + ########################################################################## -class TetMesh(MeshVisual, UGridAlgorithms): +class TetMesh(UnstructuredGrid): """The class describing tetrahedral meshes.""" def __init__(self, inputobj=None): @@ -405,9 +864,9 @@ def __str__(self): name = self.__class__.__name__ out = vedo.printc( f"{module}.{name} at ({hex(self.memory_address())})".ljust(75), - c="m", bold=True, invert=True, return_string=True, + c="c", bold=True, invert=True, return_string=True, ) - out += "\x1b[0m\u001b[35m" + out += "\x1b[0m\u001b[36m" out += "nr. of verts".ljust(14) + ": " + str(self.npoints) + "\n" out += "nr. of tetras".ljust(14)+ ": " + str(self.ncells) + "\n" @@ -591,44 +1050,6 @@ def check_validity(self, tol=0): varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return utils.vtk2numpy(varr) - def threshold(self, name=None, above=None, below=None, on="cells"): - """ - Threshold the tetrahedral mesh by a cell scalar value. - Reduce to only tets which satisfy the threshold limits. - - - if `above = below` will only select tets with that specific value. - - if `above > below` selection range is flipped. - - Set keyword "on" to either "cells" or "points". - """ - th = vtk.new("Threshold") - th.SetInputData(self.dataset) - - if name is None: - if self.celldata.keys(): - name = self.celldata.keys()[0] - th.SetInputArrayToProcess(0, 0, 0, 1, name) - elif self.pointdata.keys(): - name = self.pointdata.keys()[0] - th.SetInputArrayToProcess(0, 0, 0, 0, name) - if name is None: - vedo.logger.warning("cannot find active array. Skip.") - return self - else: - if on.startswith("c"): - th.SetInputArrayToProcess(0, 0, 0, 1, name) - else: - th.SetInputArrayToProcess(0, 0, 0, 0, name) - - if above is not None: - th.SetLowerThreshold(above) - - if below is not None: - th.SetUpperThreshold(below) - - th.Update() - return self._update(th.GetOutput()) - def decimate(self, scalars_name, fraction=0.5, n=0): """ Downsample the number of tets in a TetMesh to a specified fraction. diff --git a/vedo/utils.py b/vedo/utils.py index cb69566d..33d29815 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -1399,6 +1399,62 @@ def grep(filename, tag, column=None, first_occurrence_only=False): break return content +def parse_pattern(query, strings_to_parse) -> list: + """ + Parse a pattern query to a list of strings. + The query string can contain wildcards like * and ?. + + Arguments: + query : (str) + the query to parse + strings_to_parse : (str/list) + the string or list of strings to parse + + Returns: + a list of booleans, one for each string in strings_to_parse + + Example: + >>> query = r'*Sphere 1?3*' + >>> strings = ["Sphere 143 red", "Sphere 13 red", "Sphere 123", "ASphere 173"] + >>> parse_pattern(query, strings) + [True, True, False, False] + """ + from re import findall as re_findall + if not isinstance(query, str): + return [False] + + if not is_sequence(strings_to_parse): + strings_to_parse = [strings_to_parse] + + outs = [] + for sp in strings_to_parse: + if not isinstance(sp, str): + outs.append(False) + continue + + s = query + if s.startswith("*"): + s = s[1:] + else: + s = "^" + s + + t = "" + if not s.endswith("*"): + t = "$" + else: + s = s[:-1] + + pattern = s.replace('?', r'\w').replace(' ', r'\s').replace("*", r"\w+") + t + + # Search for the pattern in the input string + match = re_findall(pattern, sp) + out = bool(match) + outs.append(out) + # Print the matches for debugging + print("pattern", pattern, "in:", strings_to_parse) + print("matches", match, "result:", out) + return outs + def print_histogram( data, bins=10, diff --git a/vedo/version.py b/vedo/version.py index b630fe8e..f2e34da8 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev33a' +_version = '2023.5.0+dev34' diff --git a/vedo/vtkclasses.py b/vedo/vtkclasses.py index 677d0ea7..2ca440e3 100644 --- a/vedo/vtkclasses.py +++ b/vedo/vtkclasses.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Subset of vtk classes to be imported directly or lazily. +Subset of the vtk classes to be imported eagerly or lazily. """ from importlib import import_module from vedo import settings +__all__ = [] + ###################################################################### location = {} module_cache = {} @@ -40,7 +42,7 @@ def get_class(cls_name="", module_name=""): def new(cls_name="", module_name=""): """ - Create a new vtk object from its name. + Create a new vtk object instance from its name. Example: ```python @@ -97,7 +99,7 @@ def dump_hierarchy_to_file(fname=""): ###################################################################### if settings.dry_run_mode < 2: - #https://vtk.org/doc/nightly/html + # https://vtk.org/doc/nightly/html # /md__builds_gitlab_kitware_sciviz_ci_Documentation_Doxygen_PythonWrappers.html # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 @@ -105,24 +107,18 @@ def dump_hierarchy_to_file(fname=""): import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType + # noinspection PyUnresolvedReferences + import vtkmodules.vtkRenderingVolumeOpenGL2 # noinspection PyUnresolvedReferences from vtkmodules.vtkInteractionStyle import vtkInteractorStyleUser -# noinspection PyUnresolvedReferences -from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLGPUVolumeRayCastMapper, - vtkSmartVolumeMapper, -) - for name in [ "vtkOpenGLGPUVolumeRayCastMapper", "vtkSmartVolumeMapper", ]: location[name] = "vtkRenderingVolumeOpenGL2" - ###################################################################### - for name in [ "vtkKochanekSpline", "vtkCardinalSpline", @@ -418,6 +414,7 @@ def dump_hierarchy_to_file(fname=""): "vtkLoopBooleanPolyDataFilter", "vtkMultiBlockDataGroupFilter", "vtkTransformPolyDataFilter", + "vtkTransformFilter", "vtkOBBTree", "vtkQuantizePolyDataPoints", "vtkRandomAttributeGenerator", @@ -844,7 +841,6 @@ def dump_hierarchy_to_file(fname=""): for name in [ "vtkFixedPointVolumeRayCastMapper", "vtkGPUVolumeRayCastMapper", - "vtkProjectedTetrahedraMapper", ]: location[name] = "vtkRenderingVolume" ######################################################### From 8d3b033ea0779f4f3c3d61c90263916236c8e90d Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 18:53:47 +0100 Subject: [PATCH 242/251] fix key456 and h in plotter keypress --- tests/test_pipeline.txt | 73 ++++++---- vedo/plotter.py | 286 ++++++++++++++++++++++++++++------------ vedo/settings.py | 44 ++++--- vedo/utils.py | 64 ++++++++- 4 files changed, 334 insertions(+), 133 deletions(-) diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt index 3b58d380..d7f07048 100644 --- a/tests/test_pipeline.txt +++ b/tests/test_pipeline.txt @@ -1,11 +1,6 @@ -# Test Pipeline ################################ +# TEST PIPELINE ################################ Internal use only -# SITES ######################################## -https://vedo.embl.es/ -https://vedo.embl.es/docs -https://github.com/marcomusy/vedo -https://forum.image.sc/search?q=vedo%20order%3Alatest # INSTALL ###################################### cd ~/Projects/vedo @@ -23,39 +18,45 @@ pip install tetgen -U pip install pyshtools -U pip install trimesh -U -# DRY RUN ###################################### -cd ~/Projects/vedo/ -sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py ### DISABLE VIZ -sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py ### ENABLE VIZ + +# ENABLE/DISABLE DRY RUN ###################################### +cd ~/Projects/vedo +sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py ### DISABLE +sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py ### ENABLE +############################################################### cd ~/Projects/vedo/tests/common && ./run_all.sh cd ~/Projects/vedo/examples/ && time ./run_all.sh 2>&1 | tee ~/Dropbox/vedo_test.txt grep -A 1 "Error" ~/Dropbox/vedo_test.txt grep -A 3 "Trace" ~/Dropbox/vedo_test.txt -code ~/Dropbox/vedo_test.txt #### inspect logfile (search "Traceback", "Error") #### -# (Try normal run too with visualization to make sure all is ok.) +code ~/Dropbox/vedo_test.txt #### inspect logfile +# (Try normal run too with visualization to make sure all is ok) + # EXAMPLES ##################################### cd ~/Projects/vedo/tests/issues && ./run_all.sh + # TUTORIALS #################################### cd ~/Projects/server/vedo-embo-course/scripts && ./run_all.sh cd ~/Projects/server/vedo-bias-course/scripts && ./run_all.sh -# DOLFIN/TRIMESH ############################### -cd ~/Projects/vedo/ + +# TRIMESH ####################################### +cd ~/Projects/vedo/examples/other/trimesh +./run_all.sh + +# DOLFIN ####################################### +cd ~/Projects/vedo conda activate fenics -pip install . +pip install -e . cd examples/other/dolfin ./run_all.sh conda deactivate -################ -cd ~/Projects/vedo/examples/other/trimesh -./run_all.sh -# Various other ############################### -cd ~/Projects/vedo/ +# OTHERS ####################################### +cd ~/Projects/vedo python ~/Dropbox/documents/Medical/RESONANCIA.py vedo https://vedo.embl.es/examples/data/panther.stl.gz vedo https://vedo.embl.es/examples/geo_scene.npz @@ -65,9 +66,10 @@ vedo --convert data/290.vtk --to ply && vedo data/290.ply cd ~/Projects/vedo/examples/notebooks/ jupyter notebook > /dev/null 2>&1 -################################################# +########################## # Check on OSX and windows + # VEDO PROJECTS ################################# cd ~/Projects/server/trackviewer ./main_test.py @@ -95,23 +97,29 @@ cd ~/Projects/oocytes cd ~/Projects/umap_viewer3d python main6.py ################ -cd ~/Projects/napari-vedo-bridge +cd ~/Projects/napari-vedo-bridge + # conda create -y -n napari-env -c conda-forge python=3.9 + # conda activate napari-env + # python -m pip install "napari[all]" conda activate napari-env python ~/Projects/vedo/examples/other/napari1.py napari conda deactivate ################ +cd ~/Projects/welleng/examples + python +################ cd ~/Projects/clonal_analysis2d_splines python -m analysis_plots - -# RELEASE ################################# +################################################################ +# RELEASE cd ~/Projects/vedo # check version and status code vedo/version.py git status -git commit -am 'comment' +git commit -am '...' git push # upload to pypi @@ -121,16 +129,25 @@ twine upload dist/vedo-?.?.?.tar.gz -r pypi # make github release cd ~/Projects/vedo code docs/changes.md -code vedo/version.py # to add .dev0 +code vedo/version.py # edit to add .dev0 https://repology.org/project/vedo/badges -# DOCUMETATION ############################# +# DOCUMETATION ################################# mount_staging cd ~/Projects/vedo/docs/pdoc ./build_html.py # check web page examples -cd ~/Projects/vedo/ +cd ~/Projects/vedo code www/examples_db.js code www/index.html + + +# SITES ######################################## +https://vedo.embl.es/ +https://vedo.embl.es/docs +https://github.com/marcomusy/vedo +https://forum.image.sc/search?q=vedo%20order%3Alatest + + diff --git a/vedo/plotter.py b/vedo/plotter.py index 0111310a..794e45d3 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3879,55 +3879,48 @@ def _keypress(self, iren, event): renderer.ResetCamera() elif key == "h": + msg = f" vedo {vedo.__version__}" + msg += f" | vtk {vtk.vtkVersion().GetVTKVersion()}" + msg += f" | numpy {np.__version__}" + msg += f" | python {sys.version_info[0]}.{sys.version_info[1]} " + vedo.printc(msg.ljust(62), invert=True) msg = ( - " ============================================================\n" - " | Press: i print info about selected object |\n" - " | I print the RGB color under the mouse |\n" - " | Y show the pipeline for this object as a graph |\n" - " | <--> use arrows to reduce/increase opacity |\n" - " | x toggle mesh visibility |\n" - " | w toggle wireframe/surface style |\n" - " | l toggle edges visibility |\n" - " | p/P change size of vertices |\n" - " | X invoke a cutter widget tool |\n" - " | 1-3 change mesh color |\n" - " | 4 use data array as colors, if present |\n" - " | 5-6 change background color(s) |\n" - " | 09+- (on keypad) or +/- to cycle axes style |\n" - " | k cycle available lighting styles |\n" - " | K cycle available shading styles |\n" - " | A toggle anti-aliasing |\n" - " | D toggle depth-peeling (for transparencies) |\n" - " | o/O add/remove light to scene and rotate it |\n" - " | n show surface mesh normals |\n" - " | a toggle interaction to Actor Mode |\n" - " | U toggle perspective/parallel projection |\n" - " | r reset camera position |\n" - " | R reset camera orientation to orthogonal view |\n" - " | . fly camera towards last clicked point |\n" - " | C print current camera settings |\n" - " | S save a screenshot |\n" - " | E/F export 3D scene to numpy file or X3D |\n" - " | q return control to python script |\n" - " | Esc abort execution and exit python kernel |\n" - " |------------------------------------------------------------|\n" - " | Mouse: Left-click rotate scene / pick objects |\n" - " | Middle-click pan scene |\n" - " | Right-click zoom scene in or out |\n" - " | Cntrl-click rotate scene |\n" - " |------------------------------------------------------------|\n" - " | Check out the documentation at: https://vedo.embl.es |\n" - " ============================================================" + " Press: i print info about the last clicked object \n" + " I print color of the pixel under the mouse \n" + " Y show the pipeline for this object as a graph \n" + " <- -> use arrows to reduce/increase opacity \n" + " x toggle mesh visibility \n" + " w toggle wireframe/surface style \n" + " l toggle surface edges visibility \n" + " p/P hide surface faces and show it as points \n" + " 1-3 cycle surface color (2=light, 3=dark) \n" + " 4 cycle color map (shift-4 to go back) \n" + " 5-6 cycle point-cell arrays (shift to go back) \n" + " 7-8 change background and gradient color \n" + " 09+- cycle axes style (on keypad) or press +/- \n" + " k cycle available lighting styles \n" + " K toggle shading as flat or phong \n" + " A toggle anti-aliasing \n" + " D toggle depth-peeling (for transparencies) \n" + " U toggle perspective/parallel projection \n" + " o/O toggle extra light to scene and rotate it \n" + " n toggle surface normals \n" + " r reset camera position \n" + " R reset camera to the closest orthogonal view \n" + " . fly camera to the last clicked point \n" + " C print current camera settings \n" + " a toggle interaction to Actor Mode \n" + " X invoke a cutter widget tool \n" + " S save a screenshot of the current scene \n" + " E/F export 3D scene to numpy file or X3D \n" + " q return control to python script \n" + " Esc abort execution and exit python kernel " + ) + vedo.printc(msg, dim=True, italic=True, bold=True) + vedo.printc( + " Check out the documentation at: https://vedo.embl.es ".ljust(62), + invert=True, bold=True, ) - vedo.printc(msg, dim=True) - - msg = " vedo " + vedo.__version__ + " " - vedo.printc(msg, invert=True, dim=True, end="") - vtkVers = vtk.vtkVersion().GetVTKVersion() - msg = "| vtk " + str(vtkVers) - msg += " | numpy " + str(np.__version__) - msg += " | python " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) - vedo.printc(msg, invert=False, dim=True) return elif key == "a": @@ -4028,8 +4021,9 @@ def _keypress(self, iren, event): self.clicked_object.mapper.ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] self.clicked_object.c(pal[(self._icol) % 10]) + self.remove(self.clicked_object.scalarbar) - elif key == "2": + elif key == "2": # dark colors bsc = ["k1", "k2", "k3", "k4", "b1", "b2", "b3", "b4", "p1", "p2", "p3", "p4", @@ -4042,8 +4036,9 @@ def _keypress(self, iren, event): self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) self.clicked_object.c(newcol) + self.remove(self.clicked_object.scalarbar) - elif key == "3": + elif key == "3": # light colors bsc = ["k6", "k7", "k8", "k9", "b6", "b7", "b8", "b9", "p6", "p7", "p8", "p9", @@ -4056,42 +4051,165 @@ def _keypress(self, iren, event): self.clicked_object.mapper.ScalarVisibilityOff() newcol = vedo.get_color(bsc[(self._icol) % len(bsc)]) self.clicked_object.c(newcol) + self.remove(self.clicked_object.scalarbar) - elif key == "4": - if self.clicked_object: - objs = [self.clicked_object] + elif key == "4": # cmap name cycle + ob = self.clicked_object + if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): + return + if not ob.mapper.GetScalarVisibility(): + return + onwhat = ob.mapper.GetScalarModeAsString() # UsePointData/UseCellData + + cmap_names = [ + "Accent", "Paired", + "rainbow", "rainbow_r", + "Spectral", "Spectral_r", + "gist_ncar", "gist_ncar_r", + "viridis", "viridis_r", + "hot", "hot_r", + "terrain","ocean", + "coolwarm", "seismic", "PuOr", "RdYlGn", + ] + try: + i = cmap_names.index(ob._cmap_name) + if iren.GetShiftKey(): + i -= 1 + else: + i += 1 + if i >= len(cmap_names): + i = 0 + if i < 0: + i = len(cmap_names) - 1 + except ValueError: + i = 0 + + ob._cmap_name = cmap_names[i] + ob.cmap(ob._cmap_name, on=onwhat) + if ob.scalarbar: + if isinstance(ob.scalarbar, vtk.vtkActor2D): + self.remove(ob.scalarbar) + title = ob.scalarbar.GetTitle() + ob.add_scalarbar(title=title) + self.add(ob.scalarbar).render() + elif isinstance(ob.scalarbar, vedo.Assembly): + self.remove(ob.scalarbar) + ob.add_scalarbar3d(title=ob._cmap_name) + self.add(ob.scalarbar) + + vedo.printc( + f"Name:'{ob.name}'," if ob.name else '', + f"range:{utils.precision(ob.mapper.GetScalarRange(),3)},", + f"colormap:'{ob._cmap_name}'", c="g", bold=False, + ) + + elif key == "5": # cycle pointdata array + ob = self.clicked_object + if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): + return + + arrnames = ob.pointdata.keys() + arrnames = [a for a in arrnames if "normal" not in a.lower()] + arrnames = [a for a in arrnames if "tcoord" not in a.lower()] + arrnames = [a for a in arrnames if "textur" not in a.lower()] + if len(arrnames) == 0: + return + ob.mapper.SetScalarVisibility(1) + + if not ob._cmap_name: + ob._cmap_name = "rainbow" + + try: + curr_name = ob.dataset.GetPointData().GetScalars().GetName() + i = arrnames.index(curr_name) + if "normals" in curr_name.lower(): + return + if iren.GetShiftKey(): + i -= 1 + else: + i += 1 + if i >= len(arrnames): + i = 0 + if i < 0: + i = len(arrnames) - 1 + except ValueError: + i = 0 + + ob.cmap(ob._cmap_name, arrnames[i], on="points") + if ob.scalarbar: + if isinstance(ob.scalarbar, vtk.vtkActor2D): + self.remove(ob.scalarbar) + title = ob.scalarbar.GetTitle() + ob.scalarbar = None + ob.add_scalarbar(title=arrnames[i]) + self.add(ob.scalarbar) + elif isinstance(ob.scalarbar, vedo.Assembly): + self.remove(ob.scalarbar) + ob.scalarbar = None + ob.add_scalarbar3d(title=arrnames[i]) + self.add(ob.scalarbar) else: - objs = self.get_meshes() - # TODO: this is not working - # print("objs", objs._cmap_name) - # for ia in objs: - # if not hasattr(ia, "_cmap_name"): - # continue - # cmap_name = ia._cmap_name - # if not cmap_name: - # cmap_name = "rainbow" - # if isinstance(ia, vedo.pointcloud.Points): - # arnames = ia.pointdata.keys() - # if len(arnames) > 0: - # arnam = arnames[ia._scals_idx] - # if arnam and ("normals" not in arnam.lower()): # exclude normals - # ia.cmap(cmap_name, arnam, on="points") - # vedo.printc("..active point data set to:", arnam, c="g", bold=0) - # ia._scals_idx += 1 - # if ia._scals_idx >= len(arnames): - # ia._scals_idx = 0 - # else: - # arnames = ia.celldata.keys() - # if len(arnames) > 0: - # arnam = arnames[ia._scals_idx] - # if arnam and ("normals" not in arnam.lower()): # exclude normals - # ia.cmap(cmap_name, arnam, on="cells") - # vedo.printc("..active cell array set to:", arnam, c="g", bold=0) - # ia._scals_idx += 1 - # if ia._scals_idx >= len(arnames): - # ia._scals_idx = 0 - - elif key == "5": + vedo.printc(f"Active pointdata array: '{arrnames[i]}'", c="g", bold=0) + vedo.printc( + f"Name:'{ob.name}'," if ob.name else '', + f"active pointdata array: '{arrnames[i]}'", + c="g", bold=False, + ) + + elif key == "6": # cycle celldata array + ob = self.clicked_object + if not isinstance(ob, (vedo.Points, vedo.UnstructuredGrid)): + return + + arrnames = ob.celldata.keys() + arrnames = [a for a in arrnames if "normal" not in a.lower()] + arrnames = [a for a in arrnames if "tcoord" not in a.lower()] + arrnames = [a for a in arrnames if "textur" not in a.lower()] + if len(arrnames) == 0: + return + ob.mapper.SetScalarVisibility(1) + + if not ob._cmap_name: + ob._cmap_name = "rainbow" + + try: + curr_name = ob.dataset.GetCellData().GetScalars().GetName() + i = arrnames.index(curr_name) + if "normals" in curr_name.lower(): + return + if iren.GetShiftKey(): + i -= 1 + else: + i += 1 + if i >= len(arrnames): + i = 0 + if i < 0: + i = len(arrnames) - 1 + except ValueError: + i = 0 + + ob.cmap(ob._cmap_name, arrnames[i], on="cells") + if ob.scalarbar: + if isinstance(ob.scalarbar, vtk.vtkActor2D): + self.remove(ob.scalarbar) + title = ob.scalarbar.GetTitle() + ob.scalarbar = None + ob.add_scalarbar(title=arrnames[i]) + self.add(ob.scalarbar) + elif isinstance(ob.scalarbar, vedo.Assembly): + self.remove(ob.scalarbar) + ob.scalarbar = None + ob.add_scalarbar3d(title=arrnames[i]) + self.add(ob.scalarbar) + else: + vedo.printc(f"Active celldata array: '{arrnames[i]}'", c="g", bold=0) + vedo.printc( + f"Name:'{ob.name}'," if ob.name else '', + f"active celldata array: '{arrnames[i]}'", + c="g", bold=False, + ) + + elif key == "7": bgc = np.array(renderer.GetBackground()).sum() / 3 if bgc <= 0: bgc = 0.223 @@ -4101,7 +4219,7 @@ def _keypress(self, iren, event): bgc = 0 renderer.SetBackground(bgc, bgc, bgc) - elif key == "6": + elif key == "8": bg2cols = [ "lightyellow", "darkseagreen", diff --git a/vedo/settings.py b/vedo/settings.py index 62cbf6e3..ceedbfdc 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -21,7 +21,7 @@ class Settings: ```python # Set a default for the font to be used for axes, comments etc. - default_font = 'Normografo' # check font options in shapes.Text + default_font = 'Normografo' # check font options in vedo.shapes.Text3D # Palette number when using an integer to choose a color palette = 0 @@ -38,6 +38,9 @@ class Settings: enable_default_mouse_callbacks = True enable_default_keyboard_callbacks = True + # Progress bar delay before showing up [sec] + self.progressbar_delay = 0.5 + # If False, when multiple renderers are present do not render each one for separate # but do it just once at the end (when interactive() is called) immediate_rendering = True @@ -79,7 +82,7 @@ class Settings: # Turn on/off rendering of translucent material with depth peeling technique. use_depth_peeling = False alpha_bit_planes = True # options only active if useDepthPeeling=True - multi_samples = 8 # force to not pick a framebuffer with a multisample buffer + multi_samples = 16 # antialiasing multisample buffer max_number_of_peels= 4 # maximum number of rendering passes occlusion_ratio = 0.0 # occlusion ratio, 0 = exact image. @@ -118,17 +121,17 @@ class Settings: # setting it to False will keep the current Plotter instance active backend_autoclose = True - # k3d settings for jupyter notebooks + # settings for the K3D backend in jupyter notebooks k3d_menu_visibility = True - k3d_plot_height = 512 - k3d_antialias = True - k3d_lighting = 1.5 - k3d_camera_autofit = True - k3d_grid_autofit= True - k3d_axes_color = "gray4" - k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right - k3d_point_shader= "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' - k3d_line_shader = "thick" # others are 'flat', 'mesh' + k3d_plot_height = 512 + k3d_antialias = True + k3d_lighting = 1.5 + k3d_camera_autofit= True + k3d_grid_autofit = True + k3d_axes_color = "gray4" + k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right + k3d_point_shader = "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' + k3d_line_shader = "thick" # others are 'flat', 'mesh' ``` """ @@ -144,6 +147,7 @@ class Settings: "enable_default_mouse_callbacks", "enable_default_keyboard_callbacks", "enable_pipeline", + "progressbar_delay", "immediate_rendering", "renderer_frame_color", "renderer_frame_alpha", @@ -197,7 +201,7 @@ def __init__(self): # Dry run mode (for test purposes only) # 0 = normal # 1 = do not hold execution - # 2 = do not show any window + # 2 = do not hold execution and do not show any window self.dry_run_mode = 0 # Default font @@ -206,9 +210,12 @@ def __init__(self): # Default backend engine in jupyter notebooks self.default_backend = "vtk" - # enable tracking pipeline functionality + # Enable tracking pipeline functionality self.enable_pipeline = True + # Progress bar delay before showing up [sec] + self.progressbar_delay = 0.5 + if any(["SPYDER" in name for name in os.environ]): self.default_backend = "vtk" else: @@ -271,7 +278,8 @@ def __init__(self): # Turn on/off rendering of translucent material with depth peeling technique. self.use_depth_peeling = False - self.multi_samples = 8 + # antialiasing + self.multi_samples = 16 self.alpha_bit_planes = 1 self.max_number_of_peels = 4 self.occlusion_ratio = 0.1 @@ -329,7 +337,7 @@ def __init__(self): self.k3d_point_shader= "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' self.k3d_line_shader = "thick" # others are 'flat', 'mesh' - #################################################################################### + #################################################################################### # mono # means that all letters occupy the same space slot horizontally # hspacing # an horizontal stretching factor (affects both letters and words) @@ -617,7 +625,7 @@ def __init__(self): dotsep="~×", islocal=False, ), - Housekeeper=dict( # support chinese glyphs + Housekeeper=dict( # supports chinese glyphs mono=False, fscale=0.75, hspacing=1, @@ -625,7 +633,7 @@ def __init__(self): dotsep="~×", islocal=False, ), - Wananti=dict( # support chinese glyphs + Wananti=dict( # supports chinese glyphs mono=False, fscale=0.75, hspacing=1, diff --git a/vedo/utils.py b/vedo/utils.py index 33d29815..209f53aa 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -242,7 +242,7 @@ def __init__( italic=False, title="", eta=True, - delay=0.0, + delay=-1, width=25, char="\U00002501", char_back="\U00002500", @@ -252,6 +252,30 @@ def __init__( Check out also function `progressbar()`. + Arguments: + start : (int) + starting value + stop : (int) + stopping value + step : (int) + step value + c : (str) + color in hex format + title : (str) + title text + eta : (bool) + estimate time of arrival + delay : (float) + minimum time before printing anything, + if negative use the default value + as set in `vedo.settings.progressbar_delay` + width : (int) + width of the progress bar + char : (str) + character to use for the progress bar + char_back : (str) + character to use for the background of the progress bar + Example: ```python import time @@ -270,6 +294,9 @@ def __init__( if title: self.title = " " + self.title + if delay < 0: + delay = vedo.settings.progressbar_delay + self.start = start self.stop = stop self.step = step @@ -385,11 +412,41 @@ def _update(self, counts): ##################################### -def progressbar(iterable, c=None, bold=True, italic=False, title="", eta=True, width=25, delay=0.5): +def progressbar( + iterable, + c=None, bold=True, italic=False, title="", + eta=True, width=25, delay=-1, + ): """ Function to print a progress bar with optional text message. Use delay to set a minimum time before printing anything. + If delay is negative, then use the default value + as set in `vedo.settings.progressbar_delay`. + + Arguments: + start : (int) + starting value + stop : (int) + stopping value + step : (int) + step value + c : (str) + color in hex format + title : (str) + title text + eta : (bool) + estimate time of arrival + delay : (float) + minimum time before printing anything, + if negative use the default value + set in `vedo.settings.progressbar_delay` + width : (int) + width of the progress bar + char : (str) + character to use for the progress bar + char_back : (str) + character to use for the background of the progress bar Example: ```python @@ -410,7 +467,8 @@ def progressbar(iterable, c=None, bold=True, italic=False, title="", eta=True, w total = len(iterable) pb = ProgressBar( - 0, total, c=c, bold=bold, italic=italic, title=title, eta=eta, delay=delay, width=width + 0, total, c=c, bold=bold, italic=italic, title=title, + eta=eta, delay=delay, width=width, ) for item in iterable: pb.print() From dacfdd48413f4be6660e85f8a19f707147a85346 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 19:31:31 +0100 Subject: [PATCH 243/251] update examples/advanced/cut_with_points1.py --- examples/advanced/cut_with_points1.py | 23 ++++++++++++++--------- vedo/pointcloud.py | 1 - 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/examples/advanced/cut_with_points1.py b/examples/advanced/cut_with_points1.py index 7456eae1..e43e1b17 100644 --- a/examples/advanced/cut_with_points1.py +++ b/examples/advanced/cut_with_points1.py @@ -2,16 +2,21 @@ to cut a region of the mesh""" from vedo import * -settings.use_depth_peeling = True +# This affects how colors are interpolated between points +settings.interpolate_scalars_before_mapping = True -s = Sphere().alpha(0.2).lw(0.1) +s = Sphere() +s.color("white").alpha(0.25).backface_culling(True) +s.pointdata['scalars1'] = np.sqrt(range(s.npoints)) +print(s) -# pick a few points on the sphere -sc = s.vertices -pts = Points([sc[10], sc[15], sc[129], sc[165]], r=12) +# Pick a few points on the sphere +sv = s.vertices[[10, 15, 129, 165]] +pts = Points(sv).ps(12) -#cut loop region identified by the points -scut = s.clone().cut_with_point_loop(pts, invert=False) -scut.c('blue',0.7).lw(0).scale(1.03) +# Cut the loop region identified by the points +scut = s.clone().cut_with_point_loop(sv, invert=False).scale(1.01) +scut.cmap("Paired", "scalars1").alpha(1).add_scalarbar() +print(scut) -show(s, pts, scut, __doc__, axes=1) +show(s, pts, scut, __doc__, axes=1, viewup="z") diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 078c4919..aac7d8e0 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -2446,7 +2446,6 @@ def cut_with_point_loop( clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() - cpoly = clipper.GetOutput() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_pointloop", parents=parents) From 59807e037fa3526a17df7b624d879e10b274f56d Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 19:51:21 +0100 Subject: [PATCH 244/251] remove lw(0.1) --- examples/advanced/capping_mesh.py | 2 +- examples/advanced/cut_with_points2.py | 4 ++-- examples/advanced/interpolate_scalar3.py | 2 +- examples/advanced/mesh_smoother2.py | 2 +- examples/advanced/voronoi2.py | 2 +- examples/advanced/warp1.py | 2 +- examples/basic/delete_mesh_pts.py | 2 +- examples/basic/fillholes.py | 2 +- examples/basic/mousehover3.py | 2 +- examples/basic/silhouette3.py | 2 +- examples/basic/sliders1.py | 2 +- examples/simulations/fourier_epicycles.py | 2 +- examples/volumetric/multiscalars.py | 2 +- vedo/cli.py | 8 +++----- 14 files changed, 17 insertions(+), 19 deletions(-) diff --git a/examples/advanced/capping_mesh.py b/examples/advanced/capping_mesh.py index 9d2a4954..340ed46e 100644 --- a/examples/advanced/capping_mesh.py +++ b/examples/advanced/capping_mesh.py @@ -36,7 +36,7 @@ def capping(amsh, bias=0, invert=False, res=50): return msh3 -msh = Mesh(dataurl+"260_flank.vtp").c('orange5').bc('purple7').lw(0.1) +msh = Mesh(dataurl+"260_flank.vtp").c('orange5').bc('purple7').lw(1) # mcap = msh.cap() # automatic mcap = capping(msh, invert=True) diff --git a/examples/advanced/cut_with_points2.py b/examples/advanced/cut_with_points2.py index f3db19d0..310685e7 100644 --- a/examples/advanced/cut_with_points2.py +++ b/examples/advanced/cut_with_points2.py @@ -1,7 +1,7 @@ """Select cells inside a point loop""" from vedo import * -mesh = Mesh(dataurl + "dolfin_fine.vtk").lw(0.1) +mesh = Mesh(dataurl + "dolfin_fine.vtk").lw(1) pts = [ [0.85382618, 0.1909104], @@ -14,7 +14,7 @@ cmesh = mesh.clone().cut_with_point_loop( pts, on="cells", include_boundary=False, invert=False, ) -cmesh.lw(0.1).c("tomato") +cmesh.lw(1).c("tomato") line = Line(pts, closed=True).lw(5).c("green3") diff --git a/examples/advanced/interpolate_scalar3.py b/examples/advanced/interpolate_scalar3.py index afcc4d25..4243a82b 100644 --- a/examples/advanced/interpolate_scalar3.py +++ b/examples/advanced/interpolate_scalar3.py @@ -9,7 +9,7 @@ # interpolate such values on a completely different Mesh. # pick n=4 closest points and assign an ave value based on shepard kernel. -s = Sphere().scale([1,1,0.5]).pos(-.1,1.5,0.3).alpha(1).lw(0.1) +s = Sphere().scale([1,1,0.5]).pos(-.1,1.5,0.3).alpha(1).lw(1) s.interpolate_data_from(h, n=4, kernel='gaussian') s.cmap('hsv', vmin=0, vmax=6) diff --git a/examples/advanced/mesh_smoother2.py b/examples/advanced/mesh_smoother2.py index 18ed5224..0b1f0d92 100644 --- a/examples/advanced/mesh_smoother2.py +++ b/examples/advanced/mesh_smoother2.py @@ -1,7 +1,7 @@ """Smoothing a mesh""" from vedo import dataurl, Mesh, show -s1 = Mesh(dataurl+'panther.stl').lw(0.1) +s1 = Mesh(dataurl+'panther.stl').lw(1) s2 = s1.clone().x(50) # place at x=50 s2.subdivide(3).smooth().compute_normals() diff --git a/examples/advanced/voronoi2.py b/examples/advanced/voronoi2.py index cac31d42..7b678dd7 100644 --- a/examples/advanced/voronoi2.py +++ b/examples/advanced/voronoi2.py @@ -9,7 +9,7 @@ msh = Points(allpts).generate_voronoi(method='scipy') -msh.lw(0.1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') +msh.lw(1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') centers = Points(msh.cell_centers).color("k") show(msh, pts0, __doc__, axes=dict(digits=3), zoom=1.3) diff --git a/examples/advanced/warp1.py b/examples/advanced/warp1.py index 10b67c83..13854704 100644 --- a/examples/advanced/warp1.py +++ b/examples/advanced/warp1.py @@ -20,7 +20,7 @@ pttarget.append(pt1) warped = surf.warp(ptsource, pttarget, mode='2d') -warped.color("b4").lc('lightblue').lw(0.1).wireframe(False) +warped.color("b4").lc('lightblue').lw(1).wireframe(False) apts = Points(pttarget).point_size(15).c("red5") arrs = Arrows(ptsource, pttarget).c("black") diff --git a/examples/basic/delete_mesh_pts.py b/examples/basic/delete_mesh_pts.py index e95691a8..37c12fda 100644 --- a/examples/basic/delete_mesh_pts.py +++ b/examples/basic/delete_mesh_pts.py @@ -7,7 +7,7 @@ # Load the apple mesh from a url, set the colors and line width msh = Mesh(dataurl+'apple.ply') -msh.c('lightgreen').bc('tomato').lw(0.1) +msh.c('lightgreen').bc('tomato').lw(1) # Set a point and a radius to find the closest points in the mesh to it pt = [1, 0.5, 1] diff --git a/examples/basic/fillholes.py b/examples/basic/fillholes.py index b620f467..3d679430 100644 --- a/examples/basic/fillholes.py +++ b/examples/basic/fillholes.py @@ -2,7 +2,7 @@ Holes are identified by locating boundary edges, linking them together into loops, and then triangulating the resulting loops.""" from vedo import Mesh, show, dataurl -a = Mesh(dataurl+"bunny.obj").lw(0.1).bc('red') +a = Mesh(dataurl+"bunny.obj").lw(1).bc('red') b = a.clone() # make a copy b.fill_holes(size=0.1).color("lb").bc('red5') diff --git a/examples/basic/mousehover3.py b/examples/basic/mousehover3.py index d5d69a1a..590cb607 100644 --- a/examples/basic/mousehover3.py +++ b/examples/basic/mousehover3.py @@ -25,7 +25,7 @@ def func(evt): # this is the callback function # create two polygonal meshes mesh1 = TessellatedBox() mesh2 = ParametricShape('ConicSpiral') -mesh2.c('indigo1').lc('grey9').lw(0.1) +mesh2.c('indigo1').lc('grey9').lw(1) objs = [mesh1, mesh2] plt = Plotter(N=2, bg='blackboard', axes=1, sharecam=False) diff --git a/examples/basic/silhouette3.py b/examples/basic/silhouette3.py index 287fb27d..559bc407 100644 --- a/examples/basic/silhouette3.py +++ b/examples/basic/silhouette3.py @@ -2,7 +2,7 @@ move along with camera position""" from vedo import * -s = Mesh(dataurl+'shark.ply').c('gray',0.1).lw(0.1).lc('k') +s = Mesh(dataurl+'shark.ply').c('gray',0.1).lw(1).lc('k') # this call creates the camera object needed by silhouette() show(s, bg='db', bg2='lb', interactive=False) diff --git a/examples/basic/sliders1.py b/examples/basic/sliders1.py index e971e5e1..0d91d362 100644 --- a/examples/basic/sliders1.py +++ b/examples/basic/sliders1.py @@ -10,7 +10,7 @@ def slider2(widget, event): mesh.alpha(widget.value) -mesh = Mesh(dataurl+"magnolia.vtk").flat().lw(0.1) +mesh = Mesh(dataurl+"magnolia.vtk").flat().lw(1) plt = Plotter() plt += [mesh, __doc__] diff --git a/examples/simulations/fourier_epicycles.py b/examples/simulations/fourier_epicycles.py index bf267397..9dd6da60 100644 --- a/examples/simulations/fourier_epicycles.py +++ b/examples/simulations/fourier_epicycles.py @@ -31,7 +31,7 @@ def epicycles(time, rotation, fourier, order): for i in range(len(fourier[:order])): re, im, freq, amp, phase = fourier[i] if amp > 0.2: - c = vedo.Circle([x,y], amp).wireframe().lw(0.1) + c = vedo.Circle([x,y], amp).wireframe().lw(1) objs.append(c) x += amp * np.cos(freq * time + phase + rotation) y += amp * np.sin(freq * time + phase + rotation) diff --git a/examples/volumetric/multiscalars.py b/examples/volumetric/multiscalars.py index 782f2a20..62f4b7bb 100644 --- a/examples/volumetric/multiscalars.py +++ b/examples/volumetric/multiscalars.py @@ -20,7 +20,7 @@ # Build the isosurface of the active scalars, # but use testscals1 to colorize this isosurface, and then smooth it -iso1 = vol.isosurface().cmap('jet', 'myscalars1').smooth().lw(0.1) +iso1 = vol.isosurface().cmap('jet', 'myscalars1').smooth().lw(1) iso1.add_scalarbar3d('myscalars1') iso2 = vol.isosurface().cmap('viridis', 'myscalars2') diff --git a/vedo/cli.py b/vedo/cli.py index 33b55315..ddb1ade7 100644 --- a/vedo/cli.py +++ b/vedo/cli.py @@ -77,7 +77,7 @@ def execute_cli(): elif len(args.files) == 0: system_info() printc( - ":idea: No input files. Try:\n> vedo https://vedo.embl.es/examples/data/panther.stl.gz", + ":idea: No input files? Try:\n vedo https://vedo.embl.es/examples/data/panther.stl.gz", c="y", ) @@ -136,14 +136,12 @@ def get_parser(): def system_info(): from vtkmodules.all import vtkVersion - printc("_" * 65, bold=False) - printc("vedo version :", __version__, invert=1, end=" ") - printc("https://vedo.embl.es", underline=1, italic=1) + printc(f"vedo version : {__version__} (https://vedo.embl.es) ".ljust(65), invert=1) printc("vtk version :", vtkVersion().GetVTKVersion()) printc("numpy version :", np.__version__) printc("python version :", sys.version.replace("\n", "")) printc("python interpreter:", sys.executable) - printc("vedo installation :", vedo.installdir) + printc("installation point:", vedo.installdir[:70]) try: import platform printc( From b480bf529e43b591f7ab3a4f75bee4cbeec132a4 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 21:15:51 +0100 Subject: [PATCH 245/251] improve docs, remove duplicate comments in settings.py --- docs/documentation.md | 88 +++++++++++---------- vedo/core.py | 2 +- vedo/plotter.py | 66 ++++++++-------- vedo/settings.py | 178 ++++++++++++++++++------------------------ vedo/utils.py | 6 +- vedo/version.py | 2 +- 6 files changed, 163 insertions(+), 179 deletions(-) diff --git a/docs/documentation.md b/docs/documentation.md index f1c4c372..05ea74ff 100644 --- a/docs/documentation.md +++ b/docs/documentation.md @@ -37,47 +37,39 @@ vedo https://vedo.embl.es/examples/data/panther.stl.gz ![](https://vedo.embl.es/images/feats/vedo_cli_panther.png) Pressing `h` will then show a number of options to interact with your 3D scene: +``` + i print info about the last clicked object + I print color of the pixel under the mouse + Y show the pipeline for this object as a graph + <- -> use arrows to reduce/increase opacity + x toggle mesh visibility + w toggle wireframe/surface style + l toggle surface edges visibility + p/P hide surface faces and show only points + 1-3 cycle surface color (2=light, 3=dark) + 4 cycle color map (press shift-4 to go back) + 5-6 cycle point-cell arrays (shift to go back) + 7-8 cycle background and gradient color + 09+- cycle axes styles (on keypad, or press +/-) + k cycle available lighting styles + K toggle shading as flat or phong + A toggle anti-aliasing + D toggle depth-peeling (for transparencies) + U toggle perspective/parallel projection + o/O toggle extra light to scene and rotate it + a toggle interaction to Actor Mode + n toggle surface normals + r reset camera position + R reset camera to the closest orthogonal view + . fly camera to the last clicked point + C print current camera settings + X invoke a cutter widget tool + S save a screenshot of the current scene + E/F export 3D scene to numpy file or X3D + q return control to python script + Esc abort execution and exit python kernel +``` - ============================================================ - | Press: i print info about selected object | - | I print the RGB color under the mouse | - | y show the pipeline for this object as a graph | - | <--> use arrows to reduce/increase opacity | - | w/s toggle wireframe/surface style | - | p/P change point size of vertices | - | l toggle edges visibility | - | x toggle mesh visibility | - | X invoke a cutter widget tool | - | 1-3 change mesh color | - | 4 use data array as colors, if present | - | 5-6 change background color(s) | - | 09+- (on keypad) or +/- to cycle axes style | - | k cycle available lighting styles | - | K cycle available shading styles | - | A toggle anti-aliasing | - | D toggle depth-peeling (for transparencies) | - | o/O add/remove light to scene and rotate it | - | n show surface mesh normals | - | a toggle interaction to Actor Mode | - | j toggle interaction to Joystick Mode | - | U toggle perspective/parallel projection | - | r reset camera position | - | R reset camera orientation to orthogonal view | - | . fly camera towards last clicked point | - | C print current camera settings | - | S save a screenshot | - | E/F export 3D scene to numpy file or X3D | - | q return control to python script | - | Esc abort execution and exit python kernel | - |------------------------------------------------------------| - | Mouse: Left-click rotate scene / pick actors | - | Middle-click pan scene | - | Right-click zoom scene in or out | - | Cntrl-click rotate scene | - |------------------------------------------------------------| - | Check out the documentation at: https://vedo.embl.es | - ============================================================ - ## Export your 3D scene to file You can export it to a vedo file, which is actually a normal `numpy` file by pressing `E` @@ -292,3 +284,19 @@ for more information, where you can ask questions and report issues. You are also welcome to post specific questions on the [**image.sc**](https://forum.image.sc/) forum, or simply browse the [**examples gallery**](https://vedo.embl.es/#gallery). +You can also find online tutorials at: + +- [Summer School on Computational Modelling of Multicellular Systems](https://github.com/LauAvinyo/vedo-embo-course) with [slides](https://github.com/LauAvinyo/vedo-embo-course/blob/main/vedo-embo-presentation.pdf) by Laura Avinyo (EMBL). + +- Youtube video tutorials: +[Visualizing Multiple 3D Objects in Medical Imaging](https://www.youtube.com/watch?v=LVoj3poN2WI), +[Capture 3D Mesh Screenshots in Medical Imaging](https://www.youtube.com/watch?v=8Qn14WMUamA), +[Slice 'n Dice: Precision 3D Mesh Cutting](https://www.youtube.com/watch?v=dmXC078ZOR4&t=195s), +[3D Visualization of STL Files](https://www.youtube.com/watch?v=llq9-oJXepQ) +by [M. El Amine](https://github.com/amine0110/pycad). + +- [Creating an interactive 3D geological model](https://www.youtube.com/watch?v=raiIft8VeRU&t=1s) by A. Pollack. + +- ["vedo", a python module for scientific analysis and visualization of 3D data](https://www.youtube.com/watch?v=MhIoetdxwc0&t=39s), I2K Conference, by M. Musy (EMBL). + + diff --git a/vedo/core.py b/vedo/core.py index 17bf8961..bda0769e 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -937,7 +937,7 @@ def map_points_to_cells(self, arrays=(), move=False): p2c.Update() self._update(p2c.GetOutput(), reset_locators=False) self.mapper.SetScalarModeToUseCellData() - self.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) + self.pipeline = utils.OperationNode("map_points_to_cells", parents=[self]) return self def resample_data_from(self, source, tol=None, categorical=False): diff --git a/vedo/plotter.py b/vedo/plotter.py index 794e45d3..ec871b36 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3882,43 +3882,43 @@ def _keypress(self, iren, event): msg = f" vedo {vedo.__version__}" msg += f" | vtk {vtk.vtkVersion().GetVTKVersion()}" msg += f" | numpy {np.__version__}" - msg += f" | python {sys.version_info[0]}.{sys.version_info[1]} " - vedo.printc(msg.ljust(62), invert=True) + msg += f" | python {sys.version_info[0]}.{sys.version_info[1]}, press: " + vedo.printc(msg.ljust(75), invert=True) msg = ( - " Press: i print info about the last clicked object \n" - " I print color of the pixel under the mouse \n" - " Y show the pipeline for this object as a graph \n" - " <- -> use arrows to reduce/increase opacity \n" - " x toggle mesh visibility \n" - " w toggle wireframe/surface style \n" - " l toggle surface edges visibility \n" - " p/P hide surface faces and show it as points \n" - " 1-3 cycle surface color (2=light, 3=dark) \n" - " 4 cycle color map (shift-4 to go back) \n" - " 5-6 cycle point-cell arrays (shift to go back) \n" - " 7-8 change background and gradient color \n" - " 09+- cycle axes style (on keypad) or press +/- \n" - " k cycle available lighting styles \n" - " K toggle shading as flat or phong \n" - " A toggle anti-aliasing \n" - " D toggle depth-peeling (for transparencies) \n" - " U toggle perspective/parallel projection \n" - " o/O toggle extra light to scene and rotate it \n" - " n toggle surface normals \n" - " r reset camera position \n" - " R reset camera to the closest orthogonal view \n" - " . fly camera to the last clicked point \n" - " C print current camera settings \n" - " a toggle interaction to Actor Mode \n" - " X invoke a cutter widget tool \n" - " S save a screenshot of the current scene \n" - " E/F export 3D scene to numpy file or X3D \n" - " q return control to python script \n" - " Esc abort execution and exit python kernel " + " i print info about the last clicked object \n" + " I print color of the pixel under the mouse \n" + " Y show the pipeline for this object as a graph \n" + " <- -> use arrows to reduce/increase opacity \n" + " x toggle mesh visibility \n" + " w toggle wireframe/surface style \n" + " l toggle surface edges visibility \n" + " p/P hide surface faces and show only points \n" + " 1-3 cycle surface color (2=light, 3=dark) \n" + " 4 cycle color map (press shift-4 to go back) \n" + " 5-6 cycle point-cell arrays (shift to go back) \n" + " 7-8 cycle background and gradient color \n" + " 09+- cycle axes styles (on keypad, or press +/-) \n" + " k cycle available lighting styles \n" + " K toggle shading as flat or phong \n" + " A toggle anti-aliasing \n" + " D toggle depth-peeling (for transparencies) \n" + " U toggle perspective/parallel projection \n" + " o/O toggle extra light to scene and rotate it \n" + " a toggle interaction to Actor Mode \n" + " n toggle surface normals \n" + " r reset camera position \n" + " R reset camera to the closest orthogonal view \n" + " . fly camera to the last clicked point \n" + " C print current camera settings \n" + " X invoke a cutter widget tool \n" + " S save a screenshot of the current scene \n" + " E/F export 3D scene to numpy file or X3D \n" + " q return control to python script \n" + " Esc abort execution and exit python kernel " ) vedo.printc(msg, dim=True, italic=True, bold=True) vedo.printc( - " Check out the documentation at: https://vedo.embl.es ".ljust(62), + " Check out the documentation at: https://vedo.embl.es ".ljust(75), invert=True, bold=True, ) return diff --git a/vedo/settings.py b/vedo/settings.py index ceedbfdc..09c72a1d 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -9,65 +9,90 @@ class Settings: """ General settings to modify the global behavior and style. - Usage Example: + Example: ```python from vedo import settings, Cube settings.use_parallel_projection = True - # settings["use_parallel_projection"] = True # this is equivalent + # settings["use_parallel_projection"] = True # this is equivalent! Cube().color('g').show().close() ``` List of available properties: ```python - # Set a default for the font to be used for axes, comments etc. - default_font = 'Normografo' # check font options in vedo.shapes.Text3D + # Set the default font to be used for axes, comments etc. + # For example: + default_font = 'Normografo' + # To customize the font parameters use: + settings.font_parameters["Normografo"] = dict( + mono=False, + fscale=0.75, + hspacing=1, + lspacing=0.2, + dotsep="~×", + islocal=True, + ) + # Where + # mono : if True all letters occupy the same space slot horizontally + # fscale : sets the general scaling factor for the size of the font + # hspacing: horizontal stretching factor (affects both letters and words) + # lspacing: horizontal spacing inbetween letters (not words) + # dotsep : a string of characters to be interpreted as dot separator + # islocal : if locally stored in /fonts, otherwise it's on vedo.embl.es/fonts + # To run a demo try: + # vedo --run fonts + # Check out the available fonts at http://vedo.embl.es/fonts # Palette number when using an integer to choose a color palette = 0 + # Options for saving window screenshots: screenshot_transparent_background = False - screeshot_large_image = False # Sometimes setting this to True gives better results + screeshot_large_image = False # sometimes setting this to True gives better results # Enable tracking pipeline functionality: - # allows to show a graph with the pipeline of action which let to a final object - # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) + # allows to show a graph with the pipeline of action which let to a final object + # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) self.enable_pipeline = True - # Set up default mouse and keyboard functionalities + # Remember the last format used when creating new figures in vedo.pyplot + # this is useful when creating multiple figures of the same kind + # and avoid to specify the format each time in plot(..., like=...) + remember_last_figure_format = False + + # Set up default mouse and keyboard callbacks enable_default_mouse_callbacks = True enable_default_keyboard_callbacks = True # Progress bar delay before showing up [sec] self.progressbar_delay = 0.5 - # If False, when multiple renderers are present do not render each one for separate - # but do it just once at the end (when interactive() is called) + # If False, when multiple renderers are present, render only once at the end immediate_rendering = True - # Show a gray frame margin in multirendering windows + # In multirendering mode, show a grey frame margin (set width=0 to disable) renderer_frame_color = None renderer_frame_alpha = 0.5 renderer_frame_width = 0.5 renderer_frame_padding = 0.0001 - # In multirendering mode set the position of the horizontal of vertical splitting [0,1] + # In multirendering mode, set the position of the horizontal of vertical splitting [0,1] window_splitting_position = None - # Gradient orientation mode for background color - # 0 = VERTICAL - # 1 = HORIZONTAL - # 2 = RADIAL_VIEWPORT_FARTHEST_SIDE - # 3 = RADIAL_VIEWPORT_FARTHEST_CORNER + # Gradient orientation mode for background window color + # 0 = Vertical + # 1 = Horizontal + # 2 = Radial viewport farthest side + # 3 = Radial viewport farthest corner background_gradient_orientation = 0 # Enable / disable color printing by printc() enable_print_color = True - # Wrap lines in tubes + # Wrap lines in tubes by default render_lines_as_tubes = False - # Smoothing options + # Smoothing options for points, lines and polygons point_smoothing = False line_smoothing = False polygon_smoothing = False @@ -75,21 +100,21 @@ class Settings: # Remove hidden lines when in wireframe mode hidden_line_removal = False - # Turn on/off the automatic repositioning of lights as the camera moves. + # Turn on/off the automatic repositioning of lights as the camera moves light_follows_camera = False two_sided_lighting = True - # Turn on/off rendering of translucent material with depth peeling technique. + # Turn on/off rendering of translucent material with depth peeling technique use_depth_peeling = False alpha_bit_planes = True # options only active if useDepthPeeling=True multi_samples = 16 # antialiasing multisample buffer max_number_of_peels= 4 # maximum number of rendering passes occlusion_ratio = 0.0 # occlusion ratio, 0 = exact image. - # Turn on/off nvidia FXAA post-process anti-aliasing, if supported. + # Turn on/off nvidia FXAA post-process anti-aliasing, if supported use_fxaa = False # either True or False - # By default, the depth buffer is reset for each renderer. + # By default, the depth buffer is reset for each renderer # If True, use the existing depth buffer preserve_depth_buffer = False @@ -104,11 +129,11 @@ class Settings: # Set parallel projection On or Off (place camera to infinity, no perspective effects) use_parallel_projection = False - # Set orientation type when reading TIFF files (volumes): - # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) - # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) - # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) - # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) + # Set orientation type when reading TIFF files: + # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) + # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) + # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) + # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) tiff_orientation_type = 1 # Annotated cube axis type nr. 5 options: @@ -117,11 +142,15 @@ class Settings: annotated_cube_text_scale = 0.2 annotated_cube_texts = ["right","left ", "front","back ", " top ", "bttom"] + # Set the default backend for plotting in jupyter notebooks. + # If a jupyter environment is detected, the default is automatically switched to "2d" + default_backend = "vtk" + # Automatically close the Plotter instance after show() in jupyter sessions # setting it to False will keep the current Plotter instance active backend_autoclose = True - # settings for the K3D backend in jupyter notebooks + # Settings specific to the K3D backend in jupyter notebooks k3d_menu_visibility = True k3d_plot_height = 512 k3d_antialias = True @@ -135,7 +164,8 @@ class Settings: ``` """ - # Restrict the attributes so accidental typos will generate an AttributeError exception + # Restrict the attributes so accidental typos will generate + # an AttributeError exception __slots__ = [ "default_font", "default_backend", @@ -158,7 +188,6 @@ class Settings: "point_smoothing", "line_smoothing", "polygon_smoothing", - "visible_grid_edges", "light_follows_camera", "two_sided_lighting", "use_depth_peeling", @@ -204,128 +233,78 @@ def __init__(self): # 2 = do not hold execution and do not show any window self.dry_run_mode = 0 - # Default font - self.default_font = "Normografo" + # BUG in vtk9.0 (if true close works but sometimes vtk crashes, if false doesnt crash but cannot close) + # see plotter.py line 555 + self.hack_call_screen_size = True - # Default backend engine in jupyter notebooks self.default_backend = "vtk" + try: + get_ipython() + self.default_backend = "2d" + except NameError: + pass - # Enable tracking pipeline functionality - self.enable_pipeline = True + self.default_font = "Normografo" - # Progress bar delay before showing up [sec] + self.enable_pipeline = True self.progressbar_delay = 0.5 - - if any(["SPYDER" in name for name in os.environ]): - self.default_backend = "vtk" - else: - try: - get_ipython() - self.default_backend = "2d" - except NameError: - pass - - # Palette number when using an integer to choose a color self.palette = 0 - self.remember_last_figure_format = False self.screenshot_transparent_background = False self.screeshot_large_image = False - # BUG in vtk9.0 (if true close works but sometimes vtk crashes, if false doesnt crash but cannot close) - # see plotter.py line 555 - self.hack_call_screen_size = True - - # Set up default mouse and keyboard functionalities self.enable_default_mouse_callbacks = True self.enable_default_keyboard_callbacks = True - - # When multiple renderers are present do not render each one for separate. - # but do it just once at the end (when interactive() is called) self.immediate_rendering = True - # Show a gray frame margin in multirendering windows self.renderer_frame_color = None self.renderer_frame_alpha = 0.5 self.renderer_frame_width = 0.5 self.renderer_frame_padding = 0.0001 - - # Gradient orientation mode for background color - # 0 = VERTICAL - # 1 = HORIZONTAL - # 2 = RADIAL_VIEWPORT_FARTHEST_SIDE - # 3 = RADIAL_VIEWPORT_FARTHEST_CORNER self.background_gradient_orientation = 0 - # Wrap lines in tubes self.render_lines_as_tubes = False - - # Remove hidden lines when in wireframe mode self.hidden_line_removal = False - # Smoothing options self.point_smoothing = False self.line_smoothing = False self.polygon_smoothing = False - # For Structured and RectilinearGrid: show internal edges not only outline - self.visible_grid_edges = False - - # Turn on/off the automatic repositioning of lights as the camera moves. self.light_follows_camera = False self.two_sided_lighting = True - # Turn on/off rendering of translucent material with depth peeling technique. self.use_depth_peeling = False - # antialiasing self.multi_samples = 16 self.alpha_bit_planes = 1 self.max_number_of_peels = 4 self.occlusion_ratio = 0.1 - # Turn on/off nvidia FXAA anti-aliasing, if supported. - self.use_fxaa = False # either True or False + self.use_fxaa = False - # By default, the depth buffer is reset for each renderer. If true, use the existing depth buffer self.preserve_depth_buffer = False - # Use a polygon/edges offset to possibly resolve conflicts in rendering self.use_polygon_offset = True self.polygon_offset_factor = 0.1 self.polygon_offset_units = 0.1 - # Interpolate scalars to render them smoothly self.interpolate_scalars_before_mapping = True - # Set parallel projection On or Off (place camera to infinity, no perspective effects) self.use_parallel_projection = False - # In multirendering mode set the position of the horizontal of vertical splitting [0,1] self.window_splitting_position = None - # Set orientation type when reading TIFF files (volumes): - # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) - # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) - # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) - # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) self.tiff_orientation_type = 1 - # AnnotatedCube axis (type 5) customization: self.annotated_cube_color = (0.75, 0.75, 0.75) - self.annotated_cube_text_color = None # use default, otherwise specify a single color + self.annotated_cube_text_color = None self.annotated_cube_text_scale = 0.2 self.annotated_cube_texts = ["right", "left ", "front", "back ", " top ", "bttom"] - # enable / disable color printing self.enable_print_color = True - #################################################################################### - # Automatically close the Plotter instance after show() in jupyter sessions, - # setting it to False will keep the current Plotter instance active self.backend_autoclose = True - # k3d settings for jupyter notebooks self.k3d_menu_visibility = True self.k3d_plot_height = 512 self.k3d_antialias = True @@ -333,17 +312,10 @@ def __init__(self): self.k3d_camera_autofit = True self.k3d_grid_autofit= True self.k3d_axes_color = "k4" - self.k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right - self.k3d_point_shader= "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' - self.k3d_line_shader = "thick" # others are 'flat', 'mesh' - + self.k3d_axes_helper = 1.0 + self.k3d_point_shader= "mesh" + self.k3d_line_shader = "thick" - #################################################################################### - # mono # means that all letters occupy the same space slot horizontally - # hspacing # an horizontal stretching factor (affects both letters and words) - # lspacing # horizontal spacing inbetween letters (not words) - # islocal # is locally stored in /fonts, otherwise it's on vedo.embl.es/fonts - # self.font_parameters = dict( Normografo=dict( mono=False, diff --git a/vedo/utils.py b/vedo/utils.py index 209f53aa..ac137893 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -178,7 +178,7 @@ def _build_tree(self, dot): dot.edge(str(id(parent)), str(id(self)), label=t) parent._build_tree(dot) - def __repr__(self): + def __str__(self): try: from treelib import Tree except ImportError: @@ -202,6 +202,10 @@ def _build_tree(parent): _build_tree(self) return tree.show(reverse=True, stdout=False) + def print(self): + """Print the tree of operations.""" + print(self.__str__()) + def show(self, orientation="LR", popup=True): """Show the graphviz output for the pipeline of this object""" if not vedo.settings.enable_pipeline: diff --git a/vedo/version.py b/vedo/version.py index f2e34da8..662d2f5a 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev34' +_version = '2023.5.0+dev35' From 99060e90f51ba8329364bf4ff48a30644f4a143c Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 22:32:42 +0100 Subject: [PATCH 246/251] fix cycle axes --- vedo/plotter.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/vedo/plotter.py b/vedo/plotter.py index ec871b36..740b7548 100644 --- a/vedo/plotter.py +++ b/vedo/plotter.py @@ -3909,7 +3909,7 @@ def _keypress(self, iren, event): " r reset camera position \n" " R reset camera to the closest orthogonal view \n" " . fly camera to the last clicked point \n" - " C print current camera settings \n" + " C print the current camera parameters state \n" " X invoke a cutter widget tool \n" " S save a screenshot of the current scene \n" " E/F export 3D scene to numpy file or X3D \n" @@ -4246,20 +4246,24 @@ def _keypress(self, iren, event): renderer.SetBackground2(vedo.get_color(bg2name_next)) elif key in ["plus", "equal", "KP_Add", "minus", "KP_Subtract"]: # cycle axes style - clickedr = self.renderers.index(renderer) - if self.axes_instances[clickedr]: - if hasattr(self.axes_instances[clickedr], "EnabledOff"): # widget - self.axes_instances[clickedr].EnabledOff() - else: - try: - renderer.RemoveActor(self.axes_instances[clickedr]) - except: - pass - self.axes_instances[clickedr] = None + i = self.renderers.index(renderer) + try: + self.axes_instances[i].EnabledOff() + self.axes_instances[i].SetInteractor(None) + except AttributeError: + # print("Cannot remove widget", [self.axes_instances[i]]) + try: + self.remove(self.axes_instances[i]) + except: + print("Cannot remove axes", [self.axes_instances[i]]) + return + self.axes_instances[i] = None + if not self.axes: self.axes = 0 if isinstance(self.axes, dict): self.axes = 1 + if key in ["minus", "KP_Subtract"]: if not self.camera.GetParallelProjection() and self.axes == 0: self.axes -= 1 # jump ruler doesnt make sense in perspective mode From d950e365360476294d312434e5ccc1ec2a5a2054 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Mon, 13 Nov 2023 22:47:43 +0100 Subject: [PATCH 247/251] utils.OperationNode remove newlines --- vedo/core.py | 12 ++++++++---- vedo/pointcloud.py | 5 +++-- vedo/volume.py | 10 +++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/vedo/core.py b/vedo/core.py index bda0769e..25c52e43 100644 --- a/vedo/core.py +++ b/vedo/core.py @@ -570,8 +570,9 @@ def copy_data_from(self, obj): self.dataset.GetPointData().PassData(obj.dataset.GetPointData()) self.dataset.GetCellData().PassData(obj.dataset.GetCellData()) self.pipeline = utils.OperationNode( - f"copy_data_from\n{obj.__class__.__name__}", + "copy_data_from", parents=[self, obj], + comment=f"{obj.__class__.__name__}", shape="note", c="#ccc5b9", ) @@ -781,7 +782,8 @@ def delete_cells_by_point_index(self, indices): self.dataset.RemoveDeletedCells() self.dataset.Modified() - self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) + self.pipeline = utils.OperationNode( + "delete_cells_by_point_index", parents=[self]) return self def map_cells_to_points(self, arrays=(), move=False): @@ -809,7 +811,7 @@ def map_cells_to_points(self, arrays=(), move=False): c2p.Update() self._update(c2p.GetOutput(), reset_locators=False) self.mapper.SetScalarModeToUsePointData() - self.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) + self.pipeline = utils.OperationNode("map_cells_to_points", parents=[self]) return self @property @@ -982,7 +984,9 @@ def resample_data_from(self, source, tol=None, categorical=False): rs.Update() self._update(rs.GetOutput(), reset_locators=False) self.pipeline = utils.OperationNode( - f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] + "resample_data_from", + comment=f"{source.__class__.__name__}", + parents=[self, source] ) return self diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index aac7d8e0..3567251d 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -1376,7 +1376,8 @@ def mirror(self, axis="x", origin=True): self.scale([sx, sy, sz], origin=origin) - self.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) + self.pipeline = utils.OperationNode( + "mirror", comment=f"axis = {axis}", parents=[self]) if sx * sy * sz < 0: self.reverse() @@ -3253,7 +3254,7 @@ def generate_random_data(self): self._update(gen.GetOutput(), reset_locators=False) - self.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) + self.pipeline = utils.OperationNode("generate_random_data", parents=[self]) return self def generate_delaunay2d( diff --git a/vedo/volume.py b/vedo/volume.py index e3fee166..01598610 100644 --- a/vedo/volume.py +++ b/vedo/volume.py @@ -674,7 +674,7 @@ def permute_axes(self, x, y, z): imp.Update() self._update(imp.GetOutput()) self.pipeline = utils.OperationNode( - f"permute_axes\n{(x,y,z)}", parents=[self], c="#4cc9f0" + f"permute_axes({(x,y,z)})", parents=[self], c="#4cc9f0" ) return self @@ -702,7 +702,7 @@ def resample(self, new_spacing, interpolation=1): rsp.Update() self._update(rsp.GetOutput()) self.pipeline = utils.OperationNode( - f"resample\n{tuple(new_spacing)}", parents=[self], c="#4cc9f0" + "resample", comment=f"spacing: {tuple(new_spacing)}", parents=[self], c="#4cc9f0" ) return self @@ -990,7 +990,7 @@ def operation(self, operation, volume2=None): mf.Update() vol = Volume(mf.GetOutput()) vol.pipeline = utils.OperationNode( - f"operation\n{op}", parents=[self], c="#4cc9f0", shape="cylinder" + "operation", comment=f"{op}", parents=[self], c="#4cc9f0", shape="cylinder" ) return vol ########################### @@ -1066,7 +1066,7 @@ def operation(self, operation, volume2=None): self._update(mat.GetOutput()) self.pipeline = utils.OperationNode( - f"operation\n{op}", parents=[self, volume2], shape="cylinder", c="#4cc9f0" + "operation", comment=f"{op}", parents=[self, volume2], shape="cylinder", c="#4cc9f0" ) return self @@ -1287,7 +1287,7 @@ def scale_voxels(self, scale=1): rsl.Update() self._update(rsl.GetOutput()) self.pipeline = utils.OperationNode( - f"scale_voxels\nscale={scale}", parents=[self], c="#4cc9f0" + "scale_voxels", comment=f"scale={scale}", parents=[self], c="#4cc9f0" ) return self From a3374a35cc3a7810b2b37e1d56d8f4ff2b157cc0 Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Tue, 14 Nov 2023 01:35:16 +0100 Subject: [PATCH 248/251] trying remove .info in favor of .metadata --- examples/notebooks/distance2mesh.ipynb | 34 ++++++-------- examples/notebooks/legosurface.ipynb | 35 ++++++++------- examples/notebooks/numpy2volume.ipynb | 19 ++++---- examples/notebooks/test_types.ipynb | 62 +++++++++++++------------- vedo/file_io.py | 53 ++++++++++++---------- vedo/utils.py | 2 +- vedo/visual.py | 20 +++++++-- 7 files changed, 121 insertions(+), 104 deletions(-) diff --git a/examples/notebooks/distance2mesh.ipynb b/examples/notebooks/distance2mesh.ipynb index 170deef9..b7e6a524 100644 --- a/examples/notebooks/distance2mesh.ipynb +++ b/examples/notebooks/distance2mesh.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -14,24 +14,20 @@ }, { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c4481d3517314c468fa1808b8ea1829b", - "version_major": 2, - "version_minor": 0 - }, "text/plain": [ - "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" + "" ] }, + "execution_count": 3, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ "\"\"\"Compute the (signed) distance from one mesh to another.\"\"\"\n", "from vedo import *\n", "\n", - "settings.default_backend = 'k3d' # or 2d, ipyvtk, or vtk\n", + "settings.default_backend = 'vtk' # or 2d, ipyvtk, or vtk\n", "\n", "s1 = Sphere().flat() # flat shading\n", "s2 = Cube(pos=(3,0,0), c='white', alpha=0.2)\n", @@ -46,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -55,7 +51,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Sphere:   vedo.mesh.Mesh\n", @@ -70,10 +66,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 2, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -84,18 +80,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "distance_to\n", - "├── Sphere\n", - "└── Cube" + "" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -128,9 +122,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.4" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/notebooks/legosurface.ipynb b/examples/notebooks/legosurface.ipynb index 7cc5d315..9c60ba6f 100644 --- a/examples/notebooks/legosurface.ipynb +++ b/examples/notebooks/legosurface.ipynb @@ -9,20 +9,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[7m\u001b[1m\u001b[34mVolume \u001b[0m\n", - "\u001b[1m\u001b[34morigin : \u001b[0m\u001b[34m(0, 0, 0)\u001b[0m\n", - "\u001b[1m\u001b[34mcenter : \u001b[0m\u001b[34m(6450.40, 4109.53, 5514.05)\u001b[0m\n", - "\u001b[1m\u001b[34mdimensions : \u001b[0m\u001b[34m(125, 80, 107)\u001b[0m\n", - "\u001b[1m\u001b[34mspacing : \u001b[0m\u001b[34m(104.039, 104.039, 104.039)\u001b[0m\n", - "\u001b[1m\u001b[34mmemory size : \u001b[0m\u001b[34m1 MB\u001b[0m\n", - "\u001b[1m\u001b[34mscalar #bytes : \u001b[0m\u001b[34m1\u001b[0m\n", - "\u001b[1m\u001b[34mbounds : \u001b[0m\u001b[34mx=(0, 1.290e+4)\u001b[0m\u001b[34m y=(0, 8219)\u001b[0m\u001b[34m z=(0, 1.103e+4)\u001b[0m\n", - "\u001b[1m\u001b[34mscalar range : \u001b[0m\u001b[34m(0.0, 150.0)\u001b[0m\n" + "\u001b[7m\u001b[1m\u001b[36mvedo.volume.Volume at (0x163b1c0) \u001b[0m\n", + "\u001b[0m\u001b[36;1mname : Volume\n", + "filename : /tmp/embryo.tif\n", + "dimensions : [125 80 107]\n", + "origin : (0, 0, 0)\n", + "center : (6450.40, 4109.53, 5514.05)\n", + "spacing : (104.039, 104.039, 104.039)\n", + "bounds : x=(0, 1.29e+4), y=(0, 8.22e+3), z=(0, 1.10e+4)\n", + "memory size : 1 MB\n", + "scalar size : 1 bytes (unsigned char)\n", + "scalar range : (0.0, 150.0)\u001b[0m\n" ] }, { "data": { - "image/png": "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", + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJYA4QDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD02iiiuw8sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooopDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAWiiikMKKKKACiism98SadY6tbaZJI7XU7qm2NciPdnaXP8OSMDufSi40mzWorMudfsLW9ksybia4jAMiW9tJN5YPTcUUgcc4PNWrK/tdQiMlrMsgU7WHIZT6MDyD7Gi4WZZoqiNb0lro2q6nZG4B2mIXCbwfTGc1eouFgooooEFFFct4+8TN4Y8OPNbkC9uG8q3yM7T1LfgP1xQ3bUaTbsjqaK5XwN4wTxdpkjvF5V7bbVuEX7pznDL7HB47YrqqE7g007MKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABijFLRSGJijFUP7e0fz5IP7WsfOjYq8f2hNykdQRng1cinhnXdDKkg9UYH+VFwsx+KwPFdip8OX89tAPtMRS7BjX5neIhgeOpwuK6CihjTs7nMW1zDoet6hLeP5NjqTpcw3DjCK+xVZGbop+UEZ65PpUNzc2974tgTSLuKSS5sZku3t3DBANvlsxHQglgPqa6wgEEEZB6g02KGKEERRJGCckKoGaVh3Of8MWthP4WtbCSzgD28Qgurd4wdsijDbhjucnPfOaxbmSUafd6W0832Cy1iGCV1cg/ZnCNsLDnALhSc52iuuvNF07UJRLc2kbygbfMHyvj03DBx7VJb6XYWlg1jBaQpauCGiCDa2euR3z3zRYfMtzKvdAt7CwnuNHU2V3DGXjMbMEcrztdc4YHGOeeeKpxX1x4h1iziS8uLOxl0uO9VICFeR3YggsRnCjHAxy1aEvhiGSBrZdR1OK0ddpt0uPl2+gJBYDtgGrN1olvLHafZWazms12W0sIH7tcAbcHgqQBwfQdDzQF0U5JrrQr6xjmu5buxu5vs+6fb5kMhBKYIAypxjkZyRzT/FNpoN1pQ/4SFIzaI4wzlhtY+hXkUSaLqF7c2ranqcM1vbTLOsUFqYizr93cxdsgHnAA6VuUCvY4rwHfeHLfT49N0ySBbtnk3qituk2kgMSR/dAP412mKydH/dalrNp2S6Eyj/ZdFJ/8eD1r0LYJasTFGKWimSJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYopaKACiiikM5rxXLoOlae95qGlWl5cSsI4YWgV5J5D0UZBP41W8EeE/7Din1G8ihj1O++aSOBAscC9RGoHHHc/zxk6us+F9N1y7t7u7+0Lc2wIhlgnaNkz1xg9feorbww1pdRTR6/rbKjhjFLciRGHodyk4/Gl1uXdctrm9RRRTICiiigAooooAKKKKACiiigDIH7jxew7XdiD+MTn+ko/KtesjVsQ6to112897dj6B42I/8eRB+Na9A2FFFFAgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKo6zq1toWkXOp3m/wCz267n2DLHnAAHrkivH4vjZqK6+08+nR/2QRtFup/eKP727ufbp/M606U6ibir2Gotnt1Fcb4R+I+leKMW8imwvycC3lbIf02tgZPtwfauxJCgkkADkk1EouLsxNNbi0UyKWOeJJYpFkjcbldDkMPUGn1IBRRRQAUUUUAFcn468aL4QsrfZbia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", + "image/png": "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", "text/plain": [ "" ] @@ -50,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -62,7 +65,7 @@ "\n", "\n", "
\n", - " Volume:   vedo.volume.Volume\n", + " Volume:   vedo.volume.Volume
(/tmp/embryo.tif)\n", "\n", "\n", "\n", @@ -75,10 +78,10 @@ "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -111,9 +114,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.4" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/notebooks/numpy2volume.ipynb b/examples/notebooks/numpy2volume.ipynb index d6bab0f4..f5741311 100644 --- a/examples/notebooks/numpy2volume.ipynb +++ b/examples/notebooks/numpy2volume.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -14,12 +14,13 @@ }, { "data": { - "image/png": "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", + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJYAyADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKiubmCztpLi6njggjG55ZXCqo9STwKAJaKbHLHNEssTrJGwyrKcgj1BrP13X9M8NaXJqWrXaW1snG5uSx7KoHJPsKANKisTw/4v8P8AiiHzNG1S3uSBlog22Rfqhww/KqnjPx1o3gjTftGozb7hwfItIzmSY+w7L6seB9cAg7O9jpqK828NfG7wproSK9mfSLonGy7/ANWT7SDjH1xT/Hvxd0bwnZ+Tp0kOp6rKgaKKJ90aAjIZ2HbHOByfYHNK6HySvax6NRXgvhv9ohgEh8S6R7G5sT/ONj/Jvwr1nw/458M+KABpGsW88p/5Ysdkn/fDYP44oTTCUJR3R0NFQ3V1b2NpLdXc0cFvCpeSWRgqoo6kk9BXn9h8cPBV7qctm95PaqsmyO4uISIpR6gjOB/vAUxJNno1FQWl5a39slzZ3MNxA4yksLh1YexHFT0CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii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un+eaz40gud7TOks7D5kYY2D0APNaI860lklvbd3kfrPF86gegHUD8Kq301pcRrsVLiRjhAvUH69q7aemiXzX9f5HoUpdZPbo/6/RmZcx/ZiBBIwZvuxn5gf8BVbDxMzTRksf415AHpjtVw2c0B3rMHkIwwcZH0B6iq890YxtkiKv25yD+PpXZB30WprVikued49luv6+4qTtFIBtAdj0x1/+tVZoSOc5PfNXDCjLvLbmPO8H+VVpdyHAbdnoD1rog+iPKxEG/emvu/r/MrnDSEyHA7j1Ffcfh3VrfXfDun6nap5cNzAkix7gxQEA7TjuK+HMAMS+c4/Wur8AeNrjwP4gTUjBJc2xjZHtlnMatnueCCRzjIrdOx5VSDlr1Psuisrw1r0Hifw7Za1bQTQQ3aF0jmADgZI5wSO2foa1as5gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDzz4jfFfTfAymwgj+2a06bkt+QkYPRnb09hyfbrXy9r2t6n4m1mXVdVumnu5cZYjAUDoqjoAPSvTP2h7AReOrG8xhbiwUE/7Su4P6Fa8jIcYIyR0GetRJ62OmlBcvM0DMVxuXOO4p8YD8nBoypQL0ORwaNoZvlOP9oVmdSTTvuTKCrBYSd3dTyBViFhE26dSG/v9R/8AWqCLdCPuhl9R1qxHKbg7Im2r3bv+ArKR6NCya79F/X5ll3SUeUiLKx59l9yas21nNA4ljlWSTGCJen0B6j9arpaogzEzREdwev1B61JHdXLrgKfKzgzxLk49h/XmuaV2rR2PSlZe9VXvdLf1+L0NEasIz5Ji2XGQMOw2LnuW/wAmtSDSoJR5lyTNO3PmglSv+7joKp2H2Q25WAo0f8WeST757/WkhheaUjSZXt4eQ0nWMn0VT/MY/GuGfVR93+v60OSrzaOfvX/r0froaP2i+s7n7LZyi/fGfLlGGjHYs44x7Hk1e0ie1jut167pqTjBNyu3j+6nbH0P1qpYznSohFc2hRM5aeHMisfVv4gfrn61be4GuI1rZiN7XpLcuoZfogPU+/Qe9clRXurad/6/Lc8+ovPXt/X5lrUorWa78qygLaqRxJA/lmMersO3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5wFf734Eda6acEtIHaqdl7SutF26f15NizXU0I/fIHB4DR9SfoarxsspMjsrOeNv90emKRZgZS8+Vk6KG6AexpJ/LILuBx/F3roUbaWMp1XL3r3S6P8AX/gkcqpECyMY/YdD+FVi77g8i59MdvwpT5hIcncB0VuopjTDocqfet4xPLq1U9dv6+4R5FYHkEVWA3N0wvWnN+8cHHGaeiB2J/hH61qtEcEm6shOWhP93PHvT1UPIMj5QMj3pUUukYx8pPPv3qTaJHds/u1GD71LZrCne39ef3EO0sm48KW49+adw7M54VRxmnqN4iUj5AM898CmuN6SSE/IW49+1Fx8ml/62/IiwRsLcADpXYfCbT/7S+KOgxlQVScznI4Hlqzg/mork2OWZ2GAo4FW9E13U/DOpx6lpV21teIpVXUBuD1BBBBFXFnPVhpofc1FZHhW8vdR8JaRfaiUN5c2cU02xNoDMobGO3WtetDiCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArntXm1K2u447TUd95cP/o1msC7NgI3NITltoB5YEckAAkgHoazbnQdMvL5724tRJcOgjZmdsFRnAxnGOT+ZoA5+/ku7C41G71CaW4treVplCan5BWLAIXYuMnqMMee55q143e9fwjNeWKQ4tlS+fzwwZREyyjAA65TocV0BsLNpY5WtIDJEAI3MYygHQA44p13bJeWU9rJ9yaNo24zwRg/zoALT7R9lj+1PE82PmaFSEP0BJPT3qasjwrcvd+E9Jml/wBcbWNZRnOHCgMP++ga16ACiiigCtqGoWmlafPf39xHb2sCF5ZZDgKBXzP8TfjBc+L4ZtH0aNrbRSR5jyKPMucMCCf7q5AIHXjn0r2v4u2LX/ws12JScpCs3GeiOrn9FNfIAyiHuMfjUyZtSim7skVgI2VhtJHU96k2An5OH9R2+tNX96v+zSRb0UEAMuM46GsWejHpfYI5MbfM4x0PahkUlmPr1oEikYXqSeo6VDIpWTC8jrimlqRKVorqSqH6/eHp3p3ytIgHXkEHrUaS44wc+lSSKWhZmPzcYx25oe44tON1rYRlUthDj1I6U7BX7y8eq1ArMnUZHtUqOZOAcL3x1NDTCE4t+Y6OMNEOhHSmiNllO09B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qIEUKP8A9dOoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKz9Sv7e0AjvbaRrSUbZJigaJc8YcZyB7kbfU1ekUvGyB2QsCAy4yvuM8Vyl3o9xYaRcPdyzanJGU8uWWSV8gsAXeAHYdg+bCjnB4HcAq6p4Z1a2ukg8NTPbaeyb54Hn2x5DDEcRwWiLDOSPlA6AHkadhrNvcz/YpopLG/UZNpcAK+PVccOvupI+lMsZYX1exXR9TudQj+Zr6U3HnRbNhxz91XLlSFTHG7jGK29R0qx1a3EN9bpMqnchPDI395WHKn3BBoAiorHa21rQyoTzNY08cEnAuoh69hKPyb/eNXdP1Oz1W38+ynWVAdrDBDI3dWU8qfYgGgC3RRRQAUUUUAFMdj9xD85HX+770rttAwMknAHvQi7QcnJJyT70AKqhRgDiloooARlDDDAEehFM2tH90lh/dY8/gf8AGpKKAGq4bPUEdQRyKdTWRXxuHI6EcEfjTcvH1y6+oHI/xoAk57DJ9BV2GLy15xuPUio7aIYErDkj5Qe1WKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsTVvDFnql3HepJLZ30f3bm2wrN6B8ghwPQ5H481t0UAcm+qXuifL4ghQQZwNRtlPkn08xeTGfrlf9rtWyjrIgdGDKwyGU5BFafWudm8MtYyPceH51snZt72jgm2kJ6/KOYyfVfxBoA0aRmCjJPFYyeI7e3aSDWYzpVzGpYrcMPLdQMlo36MMc9iO4FadtMl5DFdR7vKkQPHuUqSCM5IPIOOx5FAEiKfvuPnI6f3fan0UUAFFFFABRRRQAVLBF5jbj90H8zTI4zK+0HA7n0FXgAoAAwBQAtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVh6hrlq2+Gw1WL7XE5DpDAbogjgqyJ8w5+h4rcql/ZVsl9JfQKYLmQYdo2IWQ4wCy9GI9SM8daAOdv7jRvElvY6d4gDxOGjlntGVhCZSpKxu+MBuQwQkHpkVYl07V9FJfT3bU7ED/j0mcCeMf7Eh++PZ+f8Aa7U+x0vUBqe66traOCSN1vfLkLRXbHGH8sjCsecn8MtwR0YAUAAAAcACgDB07V7PUxItvIRNEds0EilJYj6Mh5H9e1Xqbqmg2Wqss0ivDdoMRXcDbJY/YN3H+ycg9xWPNeanoAJ1eP7XYKMnUbdMFB/01jHI/wB5cjuQtAG1RUFnd29/ZxXdrKssEqh0dTwQanoAKUAsQFGSaToKtwQ+WNzD5z+ntQA+OMRrgfUn1p9FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUhUMMMAR6GiigDCu/DKLcyX2jznTrx8l1Vd0Ex9ZI+Mn/aUhvc9Kx9Q8Xw+HYR/wk1u+nyFgiSIDLDMScZRwO3UhgCAD1HNFFAHV2iLIqzAhkYZQjoferdFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf//Z", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 7, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -47,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -56,7 +57,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Volume:   vedo.volume.Volume\n", @@ -72,10 +73,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -115,9 +116,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.4" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/notebooks/test_types.ipynb b/examples/notebooks/test_types.ipynb index 08d86ed0..41f419ef 100644 --- a/examples/notebooks/test_types.ipynb +++ b/examples/notebooks/test_types.ipynb @@ -12,7 +12,7 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Mr. Rabbit:   vedo.mesh.Mesh
(...mbl.es/examples/data/bunny.obj)\n", @@ -27,7 +27,7 @@ "
" ], "text/plain": [ - "" + "" ] }, "execution_count": 1, @@ -58,7 +58,7 @@ "\n", "\n", "
\n", - " Wild-type Embryo:   vedo.volume.Volume\n", + " Wild-type Embryo:   vedo.volume.Volume
(/tmp/embryo.tif)\n", "\n", "\n", "\n", @@ -71,7 +71,7 @@ "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "b22e6d01", "metadata": {}, "outputs": [ @@ -113,10 +113,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "ddd6fbb6", "metadata": {}, "outputs": [ @@ -140,10 +140,10 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - " MouseLimb:   vedo.tetmesh.TetMesh
(...s/examples/data/limb_ugrid.vtk)\n", + " MouseLimb:   vedo.tetmesh.TetMesh
(/tmp/limb_ugrid.vtk)\n", "\n", "\n", "\n", @@ -154,10 +154,10 @@ "
bounds
(x/y/z)
0 ... 1416
-711.3 ... 700.2
-851.6 ... 463.9
center of mass (582, 18.1, -252)
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -171,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "221660dc", "metadata": {}, "outputs": [ @@ -181,10 +181,10 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", - " UGrid:   vedo.ugrid.UGrid\n", + " UnstructuredGrid:   vedo.tetmesh.UnstructuredGrid\n", "\n", "\n", "\n", @@ -195,24 +195,24 @@ "
bounds
(x/y/z)
0 ... 13.00
0 ... 2.000
0 ... 3.000
center of mass (4.44, 1.15, 1.66)
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from vedo import dataurl, UGrid, Cylinder\n", - "ug1 = UGrid(dataurl+'ugrid.vtk')\n", + "from vedo import dataurl, UnstructuredGrid, Cylinder\n", + "ug1 = UnstructuredGrid(dataurl+'ugrid.vtk')\n", "cyl = Cylinder(r=3, height=7).x(3)\n", "ug1.cut_with_mesh(cyl)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "24f64426", "metadata": {}, "outputs": [ @@ -235,10 +235,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -251,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "5ab995ad", "metadata": {}, "outputs": [ @@ -261,24 +261,24 @@ "\n", "\n", "\n", "
\n", - "\n", + "\n", "
\n", " Histogram1D:   vedo.pyplot.Figure\n", "\n", - "\n", + "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "
nr. of parts 43
nr. of parts 44
position (0.0, 0.0, 0.0)
x-limits (-3.516, 3.068)
y-limits (0, 145.0)
world bounds
(x/y/z)
-3.876 ... 3.068
-0.2051 ... 5.105
0 ... 1.317e-3
x-limits (-3.405, 3.319)
y-limits (0, 134.0)
world bounds
(x/y/z)
-3.773 ... 3.319
-0.2094 ... 5.213
0 ... 1.345e-3
\n", "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -323,7 +323,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/vedo/file_io.py b/vedo/file_io.py index 278662d5..533815f4 100644 --- a/vedo/file_io.py +++ b/vedo/file_io.py @@ -230,21 +230,24 @@ def load(inputobj, unpack=True, force=False): reader.Update() image = reader.GetOutput() vol = Volume(image) - vol.info["PixelSpacing"] = reader.GetPixelSpacing() - vol.info["Width"] = reader.GetWidth() - vol.info["Height"] = reader.GetHeight() - vol.info["PositionPatient"] = reader.GetImagePositionPatient() - vol.info["OrientationPatient"] = reader.GetImageOrientationPatient() - vol.info["BitsAllocated"] = reader.GetBitsAllocated() - vol.info["PixelRepresentation"] = reader.GetPixelRepresentation() - vol.info["NumberOfComponents"] = reader.GetNumberOfComponents() - vol.info["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() - vol.info["RescaleSlope"] = reader.GetRescaleSlope() - vol.info["RescaleOffset"] = reader.GetRescaleOffset() - vol.info["PatientName"] = reader.GetPatientName() - vol.info["StudyUID"] = reader.GetStudyUID() - vol.info["StudyID"] = reader.GetStudyID() - vol.info["GantryAngle"] = reader.GetGantryAngle() + try: + vol.metadata["PixelSpacing"] = reader.GetPixelSpacing() + vol.metadata["Width"] = reader.GetWidth() + vol.metadata["Height"] = reader.GetHeight() + vol.metadata["PositionPatient"] = reader.GetImagePositionPatient() + vol.metadata["OrientationPatient"] = reader.GetImageOrientationPatient() + vol.metadata["BitsAllocated"] = reader.GetBitsAllocated() + vol.metadata["PixelRepresentation"] = reader.GetPixelRepresentation() + vol.metadata["NumberOfComponents"] = reader.GetNumberOfComponents() + vol.metadata["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() + vol.metadata["RescaleSlope"] = reader.GetRescaleSlope() + vol.metadata["RescaleOffset"] = reader.GetRescaleOffset() + vol.metadata["PatientName"] = reader.GetPatientName() + vol.metadata["StudyUID"] = reader.GetStudyUID() + vol.metadata["StudyID"] = reader.GetStudyID() + vol.metadata["GantryAngle"] = reader.GetGantryAngle() + except Exception as e: + vedo.logger.warning(f"Cannot read DICOM metadata: {e}") acts.append(vol) else: ### it's a normal directory @@ -899,7 +902,7 @@ def _from_numpy(d): if "time" in keys: msh.time = d["time"] if "name" in keys: msh.name = d["name"] - if "info" in keys: msh.info = d["info"] + # if "info" in keys: msh.info = d["info"] if "filename" in keys: msh.filename = d["filename"] if "pickable" in keys: msh.pickable(d["pickable"]) if "dragable" in keys: msh.draggable(d["dragable"]) @@ -1032,7 +1035,7 @@ def _import_npy(fileinput): keys = d.keys() if "time" in keys: obj.time = d["time"] if "name" in keys: obj.name = d["name"] - if "info" in keys: obj.info = d["info"] + # if "info" in keys: obj.info = d["info"] if "filename" in keys: obj.filename = d["filename"] objs.append(obj) @@ -1322,7 +1325,6 @@ def _fillcommon(obj, adict): adict["name"] = obj.name adict["time"] = obj.time adict["rendered_at"] = obj.rendered_at - adict["info"] = obj.info try: adict["transform"] = obj.transform.matrix except AttributeError: @@ -1549,11 +1551,16 @@ def _export_npy(plt, fileoutput="scene.npz"): asse_org = ob.GetOrigin() for elem in ob.unpack(): elem.name = f"ASSEMBLY{i}_{ob.name}_{elem.name}" - elem.info.update({"assembly": ob.name}) # TODO - elem.info.update({"assembly_scale": asse_scale}) - elem.info.update({"assembly_position": asse_pos}) - elem.info.update({"assembly_orientation": asse_ori}) - elem.info.update({"assembly_origin": asse_org}) + # elem.info.update({"assembly": ob.name}) # TODO + # elem.info.update({"assembly_scale": asse_scale}) + # elem.info.update({"assembly_position": asse_pos}) + # elem.info.update({"assembly_orientation": asse_ori}) + # elem.info.update({"assembly_origin": asse_org}) + elem.metadata["assembly"] = ob.name + elem.metadata["assembly_scale"] = asse_scale + elem.metadata["assembly_position"] = asse_pos + elem.metadata["assembly_orientation"] = asse_ori + elem.metadata["assembly_origin"] = asse_org allobjs.append(elem) else: allobjs.append(ob) diff --git a/vedo/utils.py b/vedo/utils.py index ac137893..7070e379 100644 --- a/vedo/utils.py +++ b/vedo/utils.py @@ -178,7 +178,7 @@ def _build_tree(self, dot): dot.edge(str(id(parent)), str(id(self)), label=t) parent._build_tree(dot) - def __str__(self): + def __repr__(self): try: from treelib import Tree except ImportError: diff --git a/vedo/visual.py b/vedo/visual.py index 147119e1..cc8bf416 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -1466,18 +1466,29 @@ def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, c if shad not in self.shadows: self.shadows.append(shad) shad.info = dict(plane=plane, point=point, direction=direction) + # shad.metadata["plane"] = plane + # shad.metadata["point"] = point + # print("AAAA", direction, plane, point) + # if direction is None: + # direction = [0,0,0] + # shad.metadata["direction"] = direction return self def update_shadows(self): - """ - Update the shadows of a moving object. - """ + """Update the shadows of a moving object.""" for sha in self.shadows: plane = sha.info["plane"] point = sha.info["point"] direction = sha.info["direction"] + # print("update_shadows direction", direction,plane,point ) + # plane = sha.metadata["plane"] + # point = sha.metadata["point"] + # direction = sha.metadata["direction"] + # if direction[0]==0 and direction[1]==0 and direction[2]==0: + # direction = None + # print("BBBB", sha.metadata["direction"], + # sha.metadata["plane"], sha.metadata["point"]) new_sha = self._compute_shadow(plane, point, direction) - # sha.DeepCopy(new_sha) sha._update(new_sha.dataset) return self @@ -1799,6 +1810,7 @@ def labels2d( def legend(self, txt): """Book a legend text.""" self.info["legend"] = txt + # self.metadata["legend"] = txt return self def flagpole( From 956006f2dba937b043471d72f75b417bc48f44af Mon Sep 17 00:00:00 2001 From: Marco Musy Date: Tue, 14 Nov 2023 01:56:40 +0100 Subject: [PATCH 249/251] fix mag2() call in texture() --- vedo/visual.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vedo/visual.py b/vedo/visual.py index cc8bf416..38b87b21 100644 --- a/vedo/visual.py +++ b/vedo/visual.py @@ -2478,7 +2478,7 @@ def texture( tname = self.dataset.GetPointData().GetTCoords().GetName() grad = self.gradient(tname) ugrad, vgrad = np.split(grad, 2, axis=1) - ugradm, vgradm = mag2(ugrad), mag2(vgrad) + ugradm, vgradm = utils.mag2(ugrad), utils.mag2(vgrad) gradm = np.log(ugradm + vgradm) largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] uvmap = self.pointdata[tname] @@ -2488,9 +2488,9 @@ def texture( if np.isin(f, largegrad_ids).all(): id1, id2, id3 = f uv1, uv2, uv3 = uvmap[f] - d12 = mag2(uv1 - uv2) - d23 = mag2(uv2 - uv3) - d31 = mag2(uv3 - uv1) + d12 = utils.mag2(uv1 - uv2) + d23 = utils.mag2(uv2 - uv3) + d31 = utils.mag2(uv3 - uv1) idm = np.argmin([d12, d23, d31]) if idm == 0: new_points[id1] = new_points[id3] From 23443b291bfd88369a6981631feaaf7018a2649f Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 15 Nov 2023 03:35:03 +0100 Subject: [PATCH 250/251] extrusion direction --- vedo/mesh.py | 52 ++++++++++++++++++++++++++--------------- vedo/transformations.py | 11 +++++++++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/vedo/mesh.py b/vedo/mesh.py index 8bd2b57c..2007292c 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -1622,7 +1622,7 @@ def isolines(self, n=10, vmin=None, vmax=None): msh.name = "IsoLines" return msh - def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): + def extrude(self, zshift=1, direction=(), rotation=0, dr=0, cap=True, res=1): """ Sweep a polygonal data creating a "skirt" from free edges and lines, and lines from vertices. The input dataset is swept around the z-axis to create new polygonal primitives. @@ -1641,6 +1641,22 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): This filter can be used to model axisymmetric objects like cylinders, bottles, and wine glasses; or translational/rotational symmetric objects like springs or corkscrews. + Arguments: + zshift : (float) + shift along z axis. + direction : (list) + extrusion direction in the xy plane. + note that zshift is forced to be the 3rd component of direction, + which is therefore ignored. + rotation : (float) + set the angle of rotation. + dr : (float) + set the radius variation in absolute units. + cap : (bool) + enable or disable capping. + res : (int) + set the resolution of the generating geometry. + Warning: Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on, or no surface if capping is off. @@ -1650,21 +1666,6 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): ![](https://vedo.embl.es/images/basic/extrude.png) """ - if is_sequence(zshift): - # ms = [] # todo - # poly0 = self.clone().dataset - # for i in range(len(zshift)-1): - # rf = vtk.new("RotationalExtrusionFilter") - # rf.SetInputData(poly0) - # rf.SetResolution(res) - # rf.SetCapping(0) - # rf.SetAngle(rotation) - # rf.SetTranslation(zshift) - # rf.SetDeltaRadius(dR) - # rf.Update() - # poly1 = rf.GetOutput() - raise NotImplementedError("todo") - rf = vtk.new("RotationalExtrusionFilter") # rf = vtk.new("LinearExtrusionFilter") rf.SetInputData(self.dataset) # must not be transformed @@ -1676,10 +1677,23 @@ def extrude(self, zshift=1, rotation=0, dr=0, cap=True, res=1): rf.Update() m = Mesh(rf.GetOutput()) - m.copy_properties_from(self) - m.compute_normals(cells=False).flat().lighting("default") + if len(direction) > 1: + p = self.pos() + LT = vedo.LinearTransform() + LT.translate(-p) + LT.concatenate([ + [1, 0, direction[0]], + [0, 1, direction[1]], + [0, 0, 1] + ]) + LT.translate(p) + m.apply_transform(LT) + + m.copy_properties_from(self).flat().lighting("default") + # m.compute_normals(cells=False) m.pipeline = OperationNode( - "extrude", parents=[self], comment=f"#pts {m.dataset.GetNumberOfPoints()}" + "extrude", parents=[self], + comment=f"#pts {m.dataset.GetNumberOfPoints()}" ) m.name = "ExtrudedMesh" return m diff --git a/vedo/transformations.py b/vedo/transformations.py index 5953ed8e..5284c5be 100644 --- a/vedo/transformations.py +++ b/vedo/transformations.py @@ -240,6 +240,7 @@ def clone(self): def concatenate(self, T, pre_multiply=False): """ Post-multiply (by default) 2 transfomations. + T can also be a 4x4 matrix or 3x3 matrix. Example: ```python @@ -264,6 +265,16 @@ def concatenate(self, T, pre_multiply=False): print(B*A) ``` """ + if _is_sequence(T): + S = vtk.vtkTransform() + M = vtk.vtkMatrix4x4() + n = len(T) + for i in range(n): + for j in range(n): + M.SetElement(i, j, T[i][j]) + S.SetMatrix(M) + T = S + if pre_multiply: self.T.PreMultiply() try: From f6ce190c1e14be7837f095a27ab3c61b91ded452 Mon Sep 17 00:00:00 2001 From: marcomusy Date: Wed, 15 Nov 2023 17:00:17 +0100 Subject: [PATCH 251/251] improve smooth_mls_2d and bump version --- docs/changes.md | 66 +++++++++++---------- examples/advanced/moving_least_squares2D.py | 6 +- examples/advanced/recosurface.py | 3 +- examples/other/dolfin/run_all.sh | 23 ------- examples/other/pygmsh_cut.py | 2 +- examples/pyplot/plot_density2d.py | 2 +- examples/pyplot/plot_density3d.py | 2 +- requirements.txt | 2 +- tests/snippets/test_closewindow.py | 24 ++++---- tests/snippets/test_docs_sniplets.py | 55 ++++++++--------- tests/test_pipeline.txt | 51 ++++++++-------- vedo/colors.py | 4 +- vedo/mesh.py | 26 ++++---- vedo/pointcloud.py | 59 +++++++++++------- vedo/settings.py | 6 +- vedo/version.py | 2 +- 16 files changed, 168 insertions(+), 165 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 1a2129bd..c048e85f 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,24 +1,37 @@ ## Main changes Major internal refactoring. -### Breaking changes -- requires vtk=>9.0 -- plt.actors must become plt.objects -- rename `.points()` to `.vertices` -- rename `.cell_centers()` to `.cell_centers` -- rename `.faces()` to `.cells` -- rename `.lines()` to `.lines` -- rename `.edges()` to `.edges` -- rename `.normals()` and split it into `.vertex_normals` and `.cell_normals` -- removed `Volume.probe_points()` which becomes `points.probe(volume)` -- removed `Volume.probe_line()` which becomes `line.probe(volume)` -- removed `Volume.probe_plane()` which becomes `plane.probe(volume)` -- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga ) -- removed `file_io.load_transform()`. `LinearTransform("file.mat")` substitutes it. -- removed `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). +## Breaking changes + +### Renaming +- rename internal list `plt.actors` which now become `plt.objects` +- rename `.points()` to property `.vertices`. Hence: + `mesh.points() -> mesh.vertices` + `mesh.points(newpoints) -> mesh.vertices = newpoints` +- rename `.cell_centers()` to property `.cell_centers` +- rename `.faces()` to property `.cells` +- rename `.lines()` to property `.lines` +- rename `.edges()` to property `.edges` +- rename `.normals()` and split it into property `.vertex_normals` and property `.cell_normals` +- rename `picture.Picture2D(...)` which becomes `Image(...).clone2d()` (see `examples/pyplot/embed_matplotlib.py`). +- rename `Volume.probe_points()` which becomes `points.probe(volume)` +- rename `Volume.probe_line()` which becomes `line.probe(volume)` +- rename `Volume.probe_plane()` which becomes `plane.probe(volume)` +- rename `file_io.load_transform()`. `LinearTransform("file.mat")` substitutes it. +- rename `transform_with_landmarks()` to `align_with_landmarks()` +- rename `find_cells_in()` to `find_cells_in_bounds()` +- rename `mesh.is_inside(pt)` moved to `mesh.contains(pt)` +- rename `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` +- rename and moved method `voronoi()` to `points.generate_voronoi()` +- rename class `Ruler` to `Ruler3D` ### Other changes -- add new `transformations` module. +- improvements in how vtk classes are imported (allow lazy import) +- improvements to method `mesh.clone2d()` +- improvements in `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 +- improvements in `applications.Browser` + +- add new `vedo.transformations.py` module. - add `plotter.pick_area()` thanks to @ZiguoAtGitHub and @RubendeBruin feedback. - add texture to npz files thanks to @zhouzq-thu in #918 - add background radial gradients @@ -33,25 +46,17 @@ Major internal refactoring. - add `copy()` as alias to `clone()` - add "Roll" to camera dictionary (thanks @baba-yaga ) - add `applications.Slicer3DTwinPlotter` thanks to @daniel-a-diaz +- add radii feature to `smooth_mls_2d()` by @jo-mueller (now store results in arrays `mesh.pointdata['MLSVariance']` and `mesh.pointdata['MLSValidPoint']`) +- passing a `vtkCamera` to `show(camera=...)` triggers a copy of the input which is therefore not muted by any subsequent interaction (thanks @baba-yaga ) +### Bug Fixes - bug fix in `closest_point()` thanks to @goncalo-pt - bug fix in tformat thanks to @JohnsWor in #913 - bug fix in windows OS in timers callbacks thanks to @jonaslindemann - bug fix to non linear tranforms mode. Now it can be instantiated with a dictionary - bug fix in meshlab interface thanks to @JeffreyWardman in #924 +- bug fix changed `mp = matplotlib.colormaps[name]` in colors.py -- improvements in how vtk classes are imported (allow lazy import) -- improvements to method `mesh.clone2d()` -- improvements in `Slicer3DPlotter` thanks to @daniel-a-diaz in #925 -- improvements in `applications.Browser` - -- rename `Picture` to `Image`, and `vedo.picture` to `vedo.image` -- rename `transform_with_landmarks()` to `align_with_landmarks()` -- rename `find_cells_in()` to `find_cells_in_bounds()` -- rename `mesh.is_inside(pt)` moved to `mesh.contains(pt)` -- rename `Slicer2DPlotter` moved to `application module.Slicer2DPlotter` -- rename method `voronoi()` moved to `points.generate_voronoi()` -- rename class `Ruler` becomes `Ruler3D` ## New/Revised Examples ``` @@ -81,9 +86,7 @@ examples/other/flag_labels1.py tests/issues/discussion_800.py tests/issues/issue_905.py gyroscope1.py broken -tet_cut2.py broken markpoint.py -plot_spheric.py examples/other/pygmsh_cut.py ust cut tetmesh to gen ugrid ``` @@ -91,7 +94,8 @@ examples/other/pygmsh_cut.py ust cut tetmesh to gen ugrid umap_viewer3d trackviewer (some problems with removing a track) -#### Broken in .npz dump: + +#### Broken Exports to .npz: boolean.py cartoony.py flatarrow.py diff --git a/examples/advanced/moving_least_squares2D.py b/examples/advanced/moving_least_squares2D.py index 24fb55b3..a0142590 100644 --- a/examples/advanced/moving_least_squares2D.py +++ b/examples/advanced/moving_least_squares2D.py @@ -31,13 +31,13 @@ #################################### draw errors plt2 = Plotter(pos=(300, 400), N=2, axes=1) -variances = mls2.info["variances"] +variances = mls2.pointdata["MLSVariance"] vmin, vmax = np.min(variances), np.max(variances) print("min and max of variances:", vmin, vmax) vcols = [color_map(v, "jet", vmin, vmax) for v in variances] # scalars->colors -sp0 = Spheres(mls2.vertices, c=vcols, r=0.02) # error as color -sp1 = Spheres(mls2.vertices, c="red", r=variances/4) # error as point size +sp0 = Spheres(mls2.vertices, c=vcols, r=0.02) # error as color +sp1 = Spheres(mls2.vertices, c="red5", r=variances/4) # error as point size mesh.color("k").alpha(0.05).wireframe() diff --git a/examples/advanced/recosurface.py b/examples/advanced/recosurface.py index d23b2416..2515a0a4 100644 --- a/examples/advanced/recosurface.py +++ b/examples/advanced/recosurface.py @@ -1,5 +1,4 @@ -""" -Reconstruct a polygonal surface +"""Reconstruct a polygonal surface from a point cloud: 1. An object is loaded and diff --git a/examples/other/dolfin/run_all.sh b/examples/other/dolfin/run_all.sh index 077dafef..a13441bf 100755 --- a/examples/other/dolfin/run_all.sh +++ b/examples/other/dolfin/run_all.sh @@ -14,15 +14,6 @@ python3 calc_surface_area.py echo Running markmesh.py python3 markmesh.py -# echo Running scalemesh.py -# python3 scalemesh.py - -# echo Running pi_estimate.py -# python3 pi_estimate.py - -# echo Running submesh_boundary.py -# python3 submesh_boundary.py - echo Running demo_submesh.py python3 demo_submesh.py @@ -50,9 +41,6 @@ python3 ex03_poisson.py echo Running ex04_mixed-poisson.py python3 ex04_mixed-poisson.py -echo Running ex05_non-matching-meshes.py -python3 ex05_non-matching-meshes.py - echo Running ex06_elasticity1.py python3 ex06_elasticity1.py @@ -64,8 +52,6 @@ python3 ex07_stokes-iterative.py ###################################### -# echo Running ft02_poisson_membrane.py -# python3 ft02_poisson_membrane.py echo Running ft04_heat_gaussian.py python3 ft04_heat_gaussian.py @@ -76,18 +62,9 @@ python3 navier-stokes_lshape.py echo Running ft09_reaction_system.py python3 ft09_reaction_system.py -echo Running stokes.py -python3 stokes.py - -echo Running stokes2.py -python3 stokes2.py - echo Running demo_cahn-hilliard.py python3 demo_cahn-hilliard.py -echo Running turing_pattern.py -python3 turing_pattern.py - echo Running heatconv.py python3 heatconv.py diff --git a/examples/other/pygmsh_cut.py b/examples/other/pygmsh_cut.py index 42b743eb..32fc7bd8 100644 --- a/examples/other/pygmsh_cut.py +++ b/examples/other/pygmsh_cut.py @@ -28,7 +28,7 @@ vmsh, "Drag the sphere,\nright-click&drag to zoom", ) -cutter = SphereCutter(msh) +cutter = SphereCutter(vmsh) plt.add(cutter) plt.interactive() plt.close() diff --git a/examples/pyplot/plot_density2d.py b/examples/pyplot/plot_density2d.py index eb0b1d06..9ff21893 100644 --- a/examples/pyplot/plot_density2d.py +++ b/examples/pyplot/plot_density2d.py @@ -18,7 +18,7 @@ # Other cool color mapping: Set1_r, Dark2. Or you can build your own, e.g.: # vol.c(['w','w','y','y','r','r','g','g','b','k']).alpha([0,1]) -r = precision(vol.info['radius'], 2) # retrieve automatic radius value +r = precision(vol.metadata['radius'], 2) # retrieve automatic radius value vol.add_scalarbar3d(title='Density (counts in r_search ='+r+')', c='k', italic=1) show([(pts,__doc__), vol], N=2, axes=True).close() diff --git a/examples/pyplot/plot_density3d.py b/examples/pyplot/plot_density3d.py index 232a5374..36ac496e 100644 --- a/examples/pyplot/plot_density3d.py +++ b/examples/pyplot/plot_density3d.py @@ -14,7 +14,7 @@ vol = pts.density() # density() returns a Volume vol.cmap('Dark2').alpha([0.1,1]) -r = precision(vol.info['radius'], 2) # retrieve automatic radius value +r = precision(vol.metadata['radius'], 2) # retrieve automatic radius value vol.add_scalarbar3d(title='Density (counts in r_s ='+r+')', italic=1) show(pts, vol, __doc__, axes=True).close() diff --git a/requirements.txt b/requirements.txt index ec672579..44dbeaeb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -vtk>=9.0 +vtk Pygments diff --git a/tests/snippets/test_closewindow.py b/tests/snippets/test_closewindow.py index 3e2f7200..4b1fc4ef 100644 --- a/tests/snippets/test_closewindow.py +++ b/tests/snippets/test_closewindow.py @@ -15,7 +15,7 @@ #plt1.interactive() printc('\nControl returned to terminal shell:', c='tomato', invert=1) -ask('window is now unresponsive (press Enter here)', c='tomato', invert=1) +# ask('window is now unresponsive (press Enter here)', c='tomato', invert=1) plt1.close_window() @@ -24,18 +24,18 @@ printc("Objects in first Plotter:", len(plt1.objects), '\nPress q again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. -################################################################## -# Can now create a brand new Plotter and show the old object in it -plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) -plt2.show(plt1.objects[0].color('red')) +# ################################################################## +# # Can now create a brand new Plotter and show the old object in it +# plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) +# plt2.show(plt1.objects[0].color('red')) -################################################################## -# Create a third new Plotter and then close the second -plt3 = Plotter(title='Third Plotter instance') +# ################################################################## +# # Create a third new Plotter and then close the second +# plt3 = Plotter(title='Third Plotter instance') -plt2.close_window() -printc('plt2.close_window() called') +# plt2.close_window() +# printc('plt2.close_window() called') -plt3.show(Hyperboloid()).close() +# plt3.show(Hyperboloid()).close() -printc('done.') +# printc('done.') diff --git a/tests/snippets/test_docs_sniplets.py b/tests/snippets/test_docs_sniplets.py index 0bc2cd4c..e03e0ae1 100644 --- a/tests/snippets/test_docs_sniplets.py +++ b/tests/snippets/test_docs_sniplets.py @@ -45,7 +45,7 @@ for i in range(-5, 5): p = [i/3, i/2, i] v = vector(i/10, i/20, 1) - c = Circle(r=i/5+1.2).pos(p).orientation(v).lw(3) + c = Circle(r=i/5+1.2).pos(p).lw(3) objs += [c, Arrow(p,p+v)] if doshow: show(objs, axes=1).close() @@ -59,7 +59,7 @@ p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) # get the inverse of the current transformation -T = c2.get_transform(invert=True) +T = c2.transform.compute_inverse() c2.apply_transform(T) # put back c2 in place l = Line(p-v, p+v).lw(3).c('red') if doshow: @@ -102,10 +102,10 @@ show(grid, line, axes=1).close() -##################################################################### picture.py +##################################################################### Image.py print("Test 9") if doshow: - pic = Picture(dataurl+'dog.jpg').pad() + pic = Image(dataurl+'dog.jpg').pad() pic.append([pic,pic,pic], axis='y') pic.append([pic,pic,pic,pic], axis='x') pic.show(axes=1).close() @@ -114,7 +114,7 @@ ###################################################### print("Test 10") if doshow: - p = vedo.Picture(vedo.dataurl+'images/dog.jpg').bw() + p = vedo.Image(vedo.dataurl+'images/dog.jpg').bw() pe = p.clone().enhance() show(p, pe, N=2, mode='image', zoom='tight').close() @@ -123,7 +123,7 @@ ###################################################### print("Test 11") if doshow: - pic1 = Picture("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") + pic1 = Image("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() @@ -133,10 +133,10 @@ ###################################################### print("Test 12") if doshow: - pic = vedo.Picture(vedo.dataurl+"images/dog.jpg") - pic.rectangle([100,300], [100,200], c='green4', alpha=0.7) - pic.line([100,100],[400,500], lw=2, alpha=1) - pic.triangle([250,300], [100,300], [200,400]) + pic = vedo.Image(vedo.dataurl+"images/dog.jpg") + pic.add_rectangle([100,300], [100,200], c='green4', alpha=0.7) + pic.add_line([100,100],[400,500], lw=2, alpha=1) + pic.add_triangle([250,300], [100,300], [200,400]) show(pic, axes=1).close() @@ -173,16 +173,16 @@ def func(evt): # called every time the mouse moves ##################################################################### pointcloud.py -print("Test 16") -s = Ellipsoid().rotate_y(30) -#Camera options: pos, focal_point, viewup, distance, -# clippingRange, parallelScale, thickness, viewAngle -camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) -if doshow: - show(s, camera=camopts, offscreen=True).close() - m = visible_points(s) - #print('visible pts:', m.points()) # numpy array - show(m, new=True, axes=1).close() # optionally draw result on a new window +# print("Test 16") +# s = Ellipsoid().rotate_y(30) +# #Camera options: pos, focal_point, viewup, distance, +# # clippingRange, parallelScale, thickness, viewAngle +# camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) +# if doshow: +# show(s, camera=camopts, offscreen=True).close() +# m = s.visible_points() +# #print('visible pts:', m.points()) # numpy array +# show(m, new=True, axes=1).close() # optionally draw result on a new window ###################################################### @@ -195,7 +195,8 @@ def fibonacci_sphere(n): x = np.cos(theta) * r z = np.sin(theta) * r return [x,y,z] -fpoints = Points(fibonacci_sphere(1000)) +# print(np.c_[fibonacci_sphere(10)].T) +fpoints = Points(np.c_[fibonacci_sphere(1000)].T) if doshow: fpoints.show(axes=1).close() @@ -213,7 +214,7 @@ def fibonacci_sphere(n): ###################################################### print("Test 19") sph = Sphere(quads=True, res=4).compute_normals().wireframe() -sph.celldata["zvals"] = sph.cell_centers()[:,2] +sph.celldata["zvals"] = sph.cell_centers[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') if doshow: show(sph, l2d, axes=1).close() @@ -224,7 +225,7 @@ def fibonacci_sphere(n): print("Test 20") c1 = Cube().rotate_z(5).x(2).y(1) print("cube1 position", c1.pos()) -T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y +T = c1.transform # rotate by 5 degrees, sum 2 to x and 1 to y c2 = Cube().c('r4') c2.apply_transform(T) # ignore previous movements c2.apply_transform(T, concatenate=True) @@ -275,8 +276,8 @@ def fibonacci_sphere(n): ###################################################### print("Test 25") if doshow: - shape = load(dataurl+"timecourse1d.npy")[58] - pts = shape.rotate_x(30).points() + shape = Assembly(dataurl+"timecourse1d.npy")[58] + pts = shape.rotate_x(30).coordinates tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() @@ -285,8 +286,8 @@ def fibonacci_sphere(n): ###################################################### print("Test 26") if doshow: - shape = load(dataurl+"timecourse1d.npy")[55] - curvs = Line(shape.points()).curvature() + shape = Assembly(dataurl+"timecourse1d.npy")[55] + curvs = Line(shape.coordinates).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') diff --git a/tests/test_pipeline.txt b/tests/test_pipeline.txt index d7f07048..6d75cf66 100644 --- a/tests/test_pipeline.txt +++ b/tests/test_pipeline.txt @@ -3,7 +3,10 @@ Internal use only # INSTALL ###################################### -cd ~/Projects/vedo +export VDIR=$HOME/Projects/vedo +export VLOGFILE=$HOME/Dropbox/vedo_test.txt + +cd $VDIR pip install -e . pip install nevergrad -U pip install pyefd -U @@ -19,23 +22,24 @@ pip install pyshtools -U pip install trimesh -U -# ENABLE/DISABLE DRY RUN ###################################### -cd ~/Projects/vedo -sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" vedo/settings.py ### DISABLE -sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" vedo/settings.py ### ENABLE -############################################################### +# ENABLE/DISABLE DRY RUN ######################################################## +sed -i "s/dry_run_mode = 0/dry_run_mode = 2/g" $VDIR/vedo/settings.py #->DISABLE +sed -i "s/dry_run_mode = 2/dry_run_mode = 0/g" $VDIR/vedo/settings.py #->ENABLE +################################################################################# + +pytest tests -cd ~/Projects/vedo/tests/common && ./run_all.sh -cd ~/Projects/vedo/examples/ && time ./run_all.sh 2>&1 | tee ~/Dropbox/vedo_test.txt +cd $VDIR/tests/common && ./run_all.sh +cd $VDIR/examples && time ./run_all.sh 2>&1 | tee $VLOGFILE -grep -A 1 "Error" ~/Dropbox/vedo_test.txt -grep -A 3 "Trace" ~/Dropbox/vedo_test.txt -code ~/Dropbox/vedo_test.txt #### inspect logfile +grep -aA 1 "Error" $VLOGFILE +grep -aA 3 "Trace" $VLOGFILE +code $VLOGFILE #### inspect logfile # (Try normal run too with visualization to make sure all is ok) # EXAMPLES ##################################### -cd ~/Projects/vedo/tests/issues && ./run_all.sh +cd $VDIR/tests/issues && ./run_all.sh # TUTORIALS #################################### @@ -44,26 +48,24 @@ cd ~/Projects/server/vedo-bias-course/scripts && ./run_all.sh # TRIMESH ####################################### -cd ~/Projects/vedo/examples/other/trimesh -./run_all.sh +cd $VDIR/examples/other/trimesh && ./run_all.sh # DOLFIN ####################################### -cd ~/Projects/vedo +cd $VDIR conda activate fenics pip install -e . -cd examples/other/dolfin -./run_all.sh +cd $VDIR/examples/other/dolfin && ./run_all.sh conda deactivate # OTHERS ####################################### -cd ~/Projects/vedo +cd $VDIR python ~/Dropbox/documents/Medical/RESONANCIA.py vedo https://vedo.embl.es/examples/data/panther.stl.gz vedo https://vedo.embl.es/examples/geo_scene.npz vedo --convert data/290.vtk --to ply && vedo data/290.ply # NOTEBOOKS ##################################### -cd ~/Projects/vedo/examples/notebooks/ +cd $VDIR/examples/notebooks/ jupyter notebook > /dev/null 2>&1 ########################## @@ -102,7 +104,7 @@ cd ~/Projects/napari-vedo-bridge # conda activate napari-env # python -m pip install "napari[all]" conda activate napari-env - python ~/Projects/vedo/examples/other/napari1.py + python $VDIR/examples/other/napari1.py napari conda deactivate ################ @@ -114,7 +116,7 @@ cd ~/Projects/clonal_analysis2d_splines ################################################################ # RELEASE -cd ~/Projects/vedo +cd $VDIR # check version and status code vedo/version.py @@ -127,19 +129,20 @@ python setup.py sdist bdist_wheel twine upload dist/vedo-?.?.?.tar.gz -r pypi # make github release -cd ~/Projects/vedo +cd $VDIR code docs/changes.md code vedo/version.py # edit to add .dev0 https://repology.org/project/vedo/badges +rm $VLOGFILE # DOCUMETATION ################################# mount_staging -cd ~/Projects/vedo/docs/pdoc +cd $VDIR/docs/pdoc ./build_html.py # check web page examples -cd ~/Projects/vedo +cd $VDIR code www/examples_db.js code www/index.html diff --git a/vedo/colors.py b/vedo/colors.py index 8cc0a33d..6498c456 100644 --- a/vedo/colors.py +++ b/vedo/colors.py @@ -28,7 +28,7 @@ try: - import matplotlib.cm as _cm_mpl + import matplotlib _has_matplotlib = True cmaps = {} except ModuleNotFoundError: @@ -908,7 +908,7 @@ def color_map(value, name="jet", vmin=None, vmax=None): if _has_matplotlib: # matplotlib is available, use it! ########################### if isinstance(name, str): - mp = _cm_mpl.get_cmap(name=name) + mp = matplotlib.colormaps[name] else: mp = name # assume matplotlib.colors.LinearSegmentedColormap result = mp(values)[:, [0, 1, 2]] diff --git a/vedo/mesh.py b/vedo/mesh.py index 2007292c..ae54a9b7 100644 --- a/vedo/mesh.py +++ b/vedo/mesh.py @@ -53,17 +53,9 @@ def __init__(self, inputobj=None, c="gold", alpha=1): super().__init__() if inputobj is None: + # self.dataset = vtk.vtkPolyData() pass - elif isinstance(inputobj, vtk.vtkActor): - self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) - v = inputobj.GetMapper().GetScalarVisibility() - self.mapper.SetScalarVisibility(v) - pr = vtk.vtkProperty() - pr.DeepCopy(inputobj.GetProperty()) - self.actor.SetProperty(pr) - self.properties = pr - elif isinstance(inputobj, vtk.vtkPolyData): # self.dataset.DeepCopy(inputobj) # NO self.dataset = inputobj @@ -74,6 +66,10 @@ def __init__(self, inputobj=None, c="gold", alpha=1): carr.InsertCellPoint(i) self.dataset.SetVerts(carr) + elif isinstance(inputobj, str): + self.dataset = vedo.file_io.load(inputobj).dataset + self.filename = inputobj + elif is_sequence(inputobj): ninp = len(inputobj) if ninp == 3: # assume input is [vertices, faces, lines] @@ -86,9 +82,14 @@ def __init__(self, inputobj=None, c="gold", alpha=1): vedo.logger.error("input must be a list of max 3 elements.", c=1) raise ValueError() - elif isinstance(inputobj, str): - self.dataset = vedo.file_io.load(inputobj).dataset - self.filename = inputobj + elif isinstance(inputobj, vtk.vtkActor): + self.dataset.DeepCopy(inputobj.GetMapper().GetInput()) + v = inputobj.GetMapper().GetScalarVisibility() + self.mapper.SetScalarVisibility(v) + pr = vtk.vtkProperty() + pr.DeepCopy(inputobj.GetProperty()) + self.actor.SetProperty(pr) + self.properties = pr elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): gf = vtk.new("GeometryFilter") @@ -152,7 +153,6 @@ def __init__(self, inputobj=None, c="gold", alpha=1): self.mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) n = self.dataset.GetNumberOfPoints() - self.name = "Mesh" self.pipeline = OperationNode(self, comment=f"#pts {n}") def _repr_html_(self): diff --git a/vedo/pointcloud.py b/vedo/pointcloud.py index 3567251d..d6c9f84c 100644 --- a/vedo/pointcloud.py +++ b/vedo/pointcloud.py @@ -577,7 +577,7 @@ def fibonacci_sphere(n): carr.InsertCellPoint(i) self.dataset.SetVerts(carr) - elif isinstance(inputobj, PointAlgorithms): + elif isinstance(inputobj, Points): self.dataset = inputobj.dataset self.copy_properties_from(inputobj) @@ -595,6 +595,7 @@ def fibonacci_sphere(n): inputobj = inputobj.dataset try: vvpts = inputobj.GetPoints() + self.dataset = vtk.vtkPolyData() self.dataset.SetPoints(vvpts) for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) @@ -1681,15 +1682,17 @@ def smooth_mls_1d(self, f=0.2, radius=None): def smooth_mls_2d(self, f=0.2, radius=None): """ Smooth mesh or points with a `Moving Least Squares` algorithm variant. - The list `mesh.info['variances']` contains the residue calculated for each point. - When a radius is specified points that are isolated will not be moved and will get - a False entry in array `mesh.info['is_valid']`. + + The `mesh.pointdata['MLSVariance']` array will contain the residue calculated for each point. + When a radius is specified, points that are isolated will not be moved and will get + a 0 entry in array `mesh.pointdata['MLSValidPoint']`. Arguments: f : (float) - smoothing factor - typical range is [0,2]. - radius : (float) - radius search in absolute units. If set then `f` is ignored. + smoothing factor - typical range is [0, 2]. + radius : (float | array) + radius search in absolute units. Can be single value (float) or sequence + for adaptive smoothing. If set then `f` is ignored. Examples: - [moving_least_squares2D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares2D.py) @@ -1700,41 +1703,52 @@ def smooth_mls_2d(self, f=0.2, radius=None): coords = self.vertices ncoords = len(coords) - if radius: + if radius is not None: Ncp = 1 else: Ncp = int(ncoords * f / 100) if Ncp < 4: - vedo.logger.error(f"MLS2D: Please choose a fraction higher than {f}") + vedo.logger.error(f"please choose a f-value higher than {f}") Ncp = 4 variances, newpts, valid = [], [], [] + radius_is_sequence = utils.is_sequence(radius) + pb = None if ncoords > 10000: - pb = utils.ProgressBar(0, ncoords) - for p in coords: + pb = utils.ProgressBar(0, ncoords, delay=3) + + for i, p in enumerate(coords): if pb: pb.print("smooth_mls_2d working ...") - pts = self.closest_point(p, n=Ncp, radius=radius) + + # if a radius was provided for each point + if radius_is_sequence: + pts = self.closest_point(p, n=Ncp, radius=radius[i]) + else: + pts = self.closest_point(p, n=Ncp, radius=radius) + if len(pts) > 3: ptsmean = pts.mean(axis=0) # plane center _, dd, vv = np.linalg.svd(pts - ptsmean) cv = np.cross(vv[0], vv[1]) t = (np.dot(cv, ptsmean) - np.dot(cv, p)) / np.dot(cv, cv) - newp = p + cv * t - newpts.append(newp) + newpts.append(p + cv * t) variances.append(dd[2]) - if radius: - valid.append(True) + if radius is not None: + valid.append(1) else: newpts.append(p) variances.append(0) - if radius: - valid.append(False) + if radius is not None: + valid.append(0) + + if radius is not None: + self.pointdata["MLSValidPoint"] = np.array(valid).astype(np.uint8) + self.pointdata["MLSVariance"] = np.array(variances).astype(np.float32) - self.info["variances"] = np.array(variances) - self.info["is_valid"] = np.array(valid) self.vertices = newpts + self.pipeline = utils.OperationNode("smooth_mls_2d", parents=[self]) return self @@ -1798,6 +1812,7 @@ def _relax(voron): # m = vedo.Mesh([pts, self.cells]) # not yet working properly # m.vertices = pts # not yet working properly out = Points(pts) + out.name = "MeshSmoothLloyd2D" out.pipeline = utils.OperationNode("smooth_lloyd", parents=[self]) return out @@ -2953,6 +2968,8 @@ def density( Output is a `Volume`. The local neighborhood is specified as the `radius` around each sample position (each voxel). + If left to None, the radius is automatically computed as the diagonal of the bounding box + and can be accessed via `vol.metadata["radius"]`. The density is expressed as the number of counts in the radius search. Arguments: @@ -3005,7 +3022,7 @@ def density( img = pdf.GetOutput() vol = vedo.volume.Volume(img).mode(1) vol.name = "PointDensity" - vol.info["radius"] = radius + vol.metadata["radius"] = radius vol.locator = pdf.GetLocator() vol.pipeline = utils.OperationNode( "density", parents=[self], comment=f"dims = {tuple(vol.dimensions())}" diff --git a/vedo/settings.py b/vedo/settings.py index 09c72a1d..3b1d25a0 100644 --- a/vedo/settings.py +++ b/vedo/settings.py @@ -21,6 +21,7 @@ class Settings: ```python # Set the default font to be used for axes, comments etc. + # Check out the available fonts at http://vedo.embl.es/fonts # For example: default_font = 'Normografo' # To customize the font parameters use: @@ -39,9 +40,9 @@ class Settings: # lspacing: horizontal spacing inbetween letters (not words) # dotsep : a string of characters to be interpreted as dot separator # islocal : if locally stored in /fonts, otherwise it's on vedo.embl.es/fonts + # # To run a demo try: # vedo --run fonts - # Check out the available fonts at http://vedo.embl.es/fonts # Palette number when using an integer to choose a color palette = 0 @@ -233,7 +234,8 @@ def __init__(self): # 2 = do not hold execution and do not show any window self.dry_run_mode = 0 - # BUG in vtk9.0 (if true close works but sometimes vtk crashes, if false doesnt crash but cannot close) + # BUG in vtk9.0 + # if true close works but sometimes vtk crashes, if false doesnt crash but cannot close # see plotter.py line 555 self.hack_call_screen_size = True diff --git a/vedo/version.py b/vedo/version.py index 662d2f5a..136f894c 100644 --- a/vedo/version.py +++ b/vedo/version.py @@ -1 +1 @@ -_version = '2023.5.0+dev35' +_version = '2023.5.0'