Source code for tecplot.plot.vector

from builtins import super

from collections import namedtuple

from ..tecutil import _tecutil
from ..constant import *
from ..exception import *
from .. import session
from ..tecutil import Index, lock, color_spec, sv
from ..text import LabelFormat, Font


[docs]class ReferenceVectorLabel(session.Style): """Label for the reference vector. See the example under `ReferenceVector`. """ def __init__(self, ref_vector): self.ref_vector = ref_vector super().__init__(ref_vector._sv, sv.MAGNITUDELABEL, **ref_vector._kw) @property def show(self): """`bool`: Print a label next to the reference vector. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True """ return self._get_style(bool, sv.SHOW) @show.setter def show(self, value): self._set_style(bool(value), sv.SHOW) @property def color(self): """`Color`: `Color` of the reference vector label. Example usage:: >>> from tecplot.constant import Color >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True >>> ref_vector.label.color = Color.Red """ return self._get_style(Color, sv.TEXTCOLOR) @color.setter def color(self, value): self._set_style(Color(value), sv.TEXTCOLOR) @property def offset(self): """`float` (percent of frame height): Distance from the reference vector to the associated label. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True >>> ref_vector.label.offset = 10 """ return self._get_style(float, sv.OFFSET) @offset.setter def offset(self, value): self._set_style(float(value), sv.OFFSET) @property def font(self): """`text.Font`: Typeface of the reference vector label. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True >>> ref_vector.label.font.size = 6 """ return Font(self) @property def format(self): """`LabelFormat`: Number formatting control for the reference vector label. Example usage:: >>> from tecplot.constant import NumberFormat >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True >>> ref_vector.label.format.format_type = NumberFormat.Exponential """ return LabelFormat(self)
[docs]class ReferenceVector(session.Style): """Vector field reference vector. The reference vector is a single arrow with an optional label indicating the value of the shown reference length: .. code-block:: python :emphasize-lines: 34-41 from os import path import tecplot as tp from tecplot.constant import * examples_dir = tp.session.tecplot_examples_directory() infile = path.join(examples_dir, 'SimpleData', 'VortexShedding.plt') tp.data.load_tecplot(infile) frame = tp.active_frame() dataset = frame.dataset plot = frame.plot(PlotType.Cartesian2D) for txt in frame.texts(): frame.delete_text(txt) vector_contour = plot.contour(0) vector_contour.variable = dataset.variable('T(K)') vector_contour.colormap_name = 'Magma' vector_contour.colormap_filter.reversed = True vector_contour.legend.show = False base_contour = plot.contour(1) base_contour.variable = dataset.variable('P(N/M2)') base_contour.colormap_name = 'GrayScale' base_contour.colormap_filter.reversed = True base_contour.legend.show = False vector = plot.vector vector.u_variable = dataset.variable('U(M/S)') vector.v_variable = dataset.variable('V(M/S)') vector.relative_length = 1E-5 vector.arrowhead_size = 0.2 vector.arrowhead_angle = 16 ref_vector = vector.reference_vector ref_vector.show = True ref_vector.position = 50, 95 ref_vector.line_thickness = 0.4 ref_vector.label.show = True ref_vector.label.format.format_type = NumberFormat.FixedFloat ref_vector.label.format.precision = 1 ref_vector.magnitude = 100 fmap = plot.fieldmap(0) fmap.contour.flood_contour_group = base_contour fmap.vector.color = vector_contour fmap.vector.line_thickness = 0.4 plot.show_contour = True plot.show_streamtraces = False plot.show_vector = True plot.axes.y_axis.min = -0.005 plot.axes.y_axis.max = 0.005 plot.axes.x_axis.min = -0.002 plot.axes.x_axis.max = 0.008 tp.export.save_png('vector2d_reference.png', 600, supersample=3) .. figure:: /_static/images/vector2d_reference.png :width: 300px :figwidth: 300px """ def __init__(self, vector): self.vector = vector super().__init__(vector._sv, sv.REFVECTOR, **vector._kw) @property def show(self): """`bool`: Draw the reference vector. Example usage:: >>> plot.vector.reference_vector.show = True """ return self._get_style(bool, sv.SHOW) @show.setter def show(self, value): self._set_style(bool(value), sv.SHOW) @property def color(self): """`Color`: `Color` of the reference vector. Example usage:: >>> from tecplot.constant import Color >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.color = Color.Red """ return self._get_style(Color, sv.COLOR) @color.setter def color(self, value): self._set_style(Color(value), sv.COLOR) @property def position(self): """`tuple`: :math:`(x,y)` of the reference vector in percent of frame height. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.position = (50, 5) # bottom, center """ return session.XY(self, sv.XYPOS) @position.setter def position(self, pos): session.XY(self, sv.XYPOS)[:] = pos @property def magnitude(self): """`float` (data units): Length of the reference vector. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.magnitude = 2 """ return self._get_style(float, sv.MAGNITUDE) @magnitude.setter def magnitude(self, value): self._set_style(float(value), sv.MAGNITUDE) @property def angle(self): """`float` (degrees): Degrees counter-clockwise to rotate the reference vector. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.angle = 90 # vertical, up """ return self._get_style(float, sv.ANGLE) @angle.setter def angle(self, value): self._set_style(float(value), sv.ANGLE) @property def line_thickness(self): """`float` (percentage of frame height): reference vector line thickness. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.line_thickness = 0.3 """ return self._get_style(float, sv.LINETHICKNESS) @line_thickness.setter def line_thickness(self, value): self._set_style(float(value), sv.LINETHICKNESS) @property def label(self): """`ReferenceVectorLabel`: reference vector label style control. Example usage:: >>> ref_vector = plot.vector.reference_vector >>> ref_vector.show = True >>> ref_vector.label.show = True """ return ReferenceVectorLabel(self)
class Vector(session.Style): def __init__(self, plot, *svargs): self.plot = plot super().__init__(*svargs, uniqueid=self.plot.frame.uid) @property def arrowhead_angle(self): """`float` (degrees): Angle between the vector body and the head line. Example usage:: >>> plot.vector.arrowhead_angle = 10 """ return self._get_style(float, sv.ARROWHEADANGLE) @arrowhead_angle.setter def arrowhead_angle(self, value): self._set_style(float(value), sv.ARROWHEADANGLE) @property def arrowhead_fraction(self): """`float` (ratio): Size of the arrowhead when sizing by fraction. The ``size_arrowhead_by_fraction`` property must be set to `True` for this to take effect:: >>> plot.vector.size_arrowhead_by_fraction = True >>> plot.vector.arrowhead_fraction = 0.4 """ return self._get_style(float, sv.HEADSIZEASFRACTION) @arrowhead_fraction.setter def arrowhead_fraction(self, value): self._set_style(float(value), sv.HEADSIZEASFRACTION) @property def arrowhead_size(self): """`float` (percent of frame height): Size of arrowhead when sizing by frame height. The ``size_arrowhead_by_fraction`` property must be set to `False` for this to take effect:: >>> plot.vector.size_arrowhead_by_fraction = False >>> plot.vector.arrowhead_size = 4 """ return self._get_style(float, sv.HEADSIZEINFRAMEUNITS) @arrowhead_size.setter def arrowhead_size(self, value): self._set_style(float(value), sv.HEADSIZEINFRAMEUNITS) @property def relative_length(self): """`float` (grid units or cm per magnitude): Magnitude-varying length of the vector line. When ``use_relative`` is `True`, the length of the vectors will be relative to the magnitude of the velocity vector values in the data field, scaled by this parameter which is either grid-units or centimeters per unit magnitude depending on the value of ``use_grid_units``:: >>> plot.vector.use_relative = True >>> plot.vector.use_grid_units = True >>> plot.vector.relative_length = 0.003 """ with self.plot.activated(): return self._get_style(float, sv.RELATIVELENGTH) @relative_length.setter def relative_length(self, value): self._set_style(float(value), sv.RELATIVELENGTH) @property def use_even_spacing(self): """`bool`: Use even spacing for vectors. When `True` this will selectively remove vectors from the plot to approximately enforce the display intervals specified by ``even_spacing``. Turn on even spacing:: >>> plot.vector.use_even_spacing = True """ return self._get_style(bool, sv.USEEVENSPACING) @use_even_spacing.setter def use_even_spacing(self, value): self._set_style(bool(value), sv.USEEVENSPACING) @property def use_grid_units(self): """`bool`: Use grid-units when determining the relative length. This takes effect only if ``use_relative`` is `True`. If `False`, ``relative_length`` will be in cm per magnitude:: >>> plot.vector.use_relative = True >>> plot.vector.use_grid_units = False >>> plot.vector.relative_length = 0.010 """ return self._get_style(bool, sv.RELATIVELENGTHINGRIDUNITS) @use_grid_units.setter def use_grid_units(self, value): self._set_style(bool(value), sv.RELATIVELENGTHINGRIDUNITS) @property def size_arrowhead_by_fraction(self): """`bool`: Base arrowhead size on length of vector line. Example usage:: >>> plot.vector.size_arrowhead_by_fraction = True >>> plot.vector.relative_length = 0.1 """ return self._get_style(bool, sv.SIZEHEADBYFRACTION) @size_arrowhead_by_fraction.setter def size_arrowhead_by_fraction(self, value): self._set_style(bool(value), sv.SIZEHEADBYFRACTION) @property def length(self): """`float` (percent of plot height): Length of all vectors when not using relative sizing. Example usage:: >>> plot.vector.use_relative = False >>> plot.vector.length = 5 """ return self._get_style(float, sv.UNIFORMLENGTH) @length.setter def length(self, value): self._set_style(float(value), sv.UNIFORMLENGTH) @property def use_relative(self): """`bool`: Use relative sizing for vector lines. This determines whether ``length`` or ``relative_length`` are used to size the arrow lines. Example usage:: >>> plot.vector.use_relative = False >>> plot.vector.relative_length = 0.5 """ return self._get_style(bool, sv.USERELATIVE) @use_relative.setter def use_relative(self, value): self._set_style(bool(value), sv.USERELATIVE) @property def reference_vector(self): """`ReferenceVector`: Vector field reference vector. Example usage:: >>> plot.vector.reference_vector.show = True """ return ReferenceVector(self) @property def u_variable_index(self): """`int` (Zero-based index): :math:`U`-component `Variable` index of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.u_variable_index = 3 """ return self._get_style(Index, sv.UVAR) @u_variable_index.setter def u_variable_index(self, index): self._set_style(Index(index), sv.UVAR) @property def u_variable(self): """`Variable`: :math:`U`-component `Variable` of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.u_variable = dataset.variable('Pressure X') """ return self.plot.frame.dataset.variable(self.u_variable_index) @u_variable.setter def u_variable(self, variable): self.u_variable_index = variable.index @property def v_variable_index(self): """`int` (Zero-based index): :math:`V`-component `Variable` index of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.v_variable_index = 4 """ return self._get_style(Index, sv.VVAR) @v_variable_index.setter def v_variable_index(self, index): self._set_style(Index(index), sv.VVAR) @property def v_variable(self): """`Variable`: :math:`V`-component `Variable` of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.v_variable = dataset.variable('Pressure Y') """ return self.plot.frame.dataset.variable(self.v_variable_index) @v_variable.setter def v_variable(self, variable): self.v_variable_index = variable.index @lock() def reset_even_spacing(self): """Reset the even vector spacing. Example usage:: >>> plot.vector.reset_even_spacing() """ with self.plot.frame.activated(): if not _tecutil.ResetVectorSpacing(): raise TecplotSystemError() @lock() def reset_length(self): """Reset the vector length. Example usage:: >>> plot.vector.reset_length() """ with self.plot.frame.activated(): if not _tecutil.ResetVectorLength(): raise TecplotSystemError()
[docs]class Vector2D(Vector): """Vector field style control for Cartesian 2D plots. This object controls the style of the vectors that are plotted according to the vector properties under fieldmaps. The :math:`(u,v)` components are set using this class as well as attributes such as length, arrow-head size and the reference vector. This example shows how to show the vector field, adjusting the arrows color and thickness: .. code-block:: python :emphasize-lines: 22-28 from os import path import tecplot as tp from tecplot.constant import * examples_dir = tp.session.tecplot_examples_directory() infile = path.join(examples_dir, 'SimpleData', '3ElementWing.lpk') tp.load_layout(infile) frame = tp.active_frame() dataset = frame.dataset plot = frame.plot(PlotType.Cartesian2D) frame.background_color = Color.Black for axis in plot.axes: axis.show = False plot.axes.x_axis.min = -0.2 plot.axes.x_axis.max = 0.3 plot.axes.y_axis.min = -0.2 plot.axes.y_axis.max = 0.15 vect = plot.vector vect.u_variable = dataset.variable('U(M/S)') vect.v_variable = dataset.variable('V(M/S)') vect.relative_length = 0.00025 vect.size_arrowhead_by_fraction = False vect.arrowhead_size = 4 vect.arrowhead_angle = 10 plot.show_contour = False plot.show_streamtraces = False plot.show_edge = True plot.show_vector = True cont = plot.contour(0) cont.variable = dataset.variable('P(N/M2)') cont.colormap_name = 'Diverging - Blue/Yellow/Red' cont.levels.reset_levels(80000, 90000, 100000, 110000, 120000) plot.fieldmaps().show = False fmap = plot.fieldmap(3) fmap.show = True fmap.edge.color = Color.White fmap.edge.line_thickness = 1 fmap.points.step = 5 fmap.vector.color = cont fmap.vector.line_thickness = 0.5 tp.export.save_png('vector2d.png', 600, supersample=3) .. figure:: /_static/images/vector2d.png :width: 300px :figwidth: 300px """ def __init__(self, plot): super().__init__(plot, sv.GLOBALTWODVECTOR) @property def even_spacing(self): """`tuple`: Spacing for even vectors. Set the spacing values in axial directions for even spaced vectors. When ``use_even_spacing`` is turned on this will selectively remove vectors so that only one vector occupies each grid region defined by the spacing. Spacing is aligned with the X and Y axes. Example of setting spacing in X to 0.1 and Y to 0.2:: >>> plot.vector.use_even_spacing = True >>> plot.vector.even_spacing = (0.1, 0.2) """ style = session.Style(sv.GLOBALTWODVECTOR, uniqueid=self.plot.frame.uid) return session.XY(style, sv.EVENSPACING) @even_spacing.setter def even_spacing(self, values): style = session.Style(sv.GLOBALTWODVECTOR, uniqueid=self.plot.frame.uid) session.XY(style, sv.EVENSPACING)[:] = values
[docs]class Vector3D(Vector): """Vector field style control for Cartesian 3D plots. This object controls the style of the vectors that are plotted according to the vector properties under fieldmaps. The :math:`(u,v,w)` components are set using this class as well as attributes such as length, arrow-head size and the reference vector. See the `example for 2D vector plots <Vector2D>`. """ def __init__(self, plot): super().__init__(plot, sv.GLOBALTHREEDVECTOR) @property def w_variable_index(self): """`int` (Zero-based index): :math:`W`-component `Variable` index of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.w_variable_index = 5 """ return self._get_style(Index, sv.WVAR) @w_variable_index.setter def w_variable_index(self, index): self._set_style(Index(index), sv.WVAR) @property def w_variable(self): """`Variable`: :math:`W`-component `Variable` of the plotted vectors. Vectors are plotted as :math:`(u,v,w)`. Example usage:: >>> plot.vector.w_variable = dataset.variable('Pressure Z') """ return self.plot.frame.dataset.variable(self.w_variable_index) @w_variable.setter def w_variable(self, variable): self.w_variable_index = variable.index @property def even_spacing(self): """`tuple`: Spacing for even vectors. Set the spacing values in axial directions for even spaced vectors. When ``use_even_spacing`` is turned on this will selectively remove vectors so that only one vector occupies each grid region defined by the spacing. Spacing is aligned with the X, Y, and Z axes. Example of setting spacing in X to 0.1, Y to 0.2 and Z to 0.3:: >>> plot.vector.use_even_spacing = True >>> plot.vector.even_spacing = (0.1, 0.2, 0.3) """ style = session.Style(sv.GLOBALTHREEDVECTOR, uniqueid=self.plot.frame.uid) return session.XYZ(style, sv.EVENSPACING) @even_spacing.setter def even_spacing(self, values): style = session.Style(sv.GLOBALTHREEDVECTOR, uniqueid=self.plot.frame.uid) session.XYZ(style, sv.EVENSPACING)[:] = values