Source code for tecplot.data.extract
from ..tecutil import _tecutil
from .. import layout, tecutil
from ..constant import *
from ..exception import TecplotSystemError, TecplotLogicError
from ..tecutil import IndexSet, lock, sv
[docs]@lock()
def extract_slice(origin=(0, 0, 0), normal=(0, 0, 1), source=None,
multiple_zones=None, copy_cell_centers=None,
assign_strand_ids=None, frame=None, dataset=None):
"""Create new zone slices from the zones in a dataset.
Parameters:
origin (array of three `floats <float>`): Point in space,
:math:`(x, y, z)`, that lies on the slice plane.
normal (array of three `floats <float>`): Vector direction,
:math:`(x, y, z)`, indicating the normal of the slice plane.
source (`SliceSource`): Source zone types to consider when extracting
the slice. Possible values: `SliceSource.LinearZones`,
`SliceSource.SurfaceZones`, `SliceSource.SurfacesOfVolumeZones`,
`SliceSource.VolumeZones` (default).
multiple_zones (`boolean <bool>`): If `True`, this allows the
extracted slice to consist of one zone per contiguous region. By
default, only a single zone is created. (default: `False`)
copy_cell_centers (`boolean <bool>`): If `True`, cell-center
values will be copied when possible to the extracted slice plane.
Cell-centers are copied when a variable is cell-centered for all
the source zones through which the slice passes. Otherwise,
extracted planes use node-centered data, which is calculated by
interpolation. (default: `False`)
assign_strand_ids (`boolean <bool>`): automatically assign strand IDs
to the data extracted from transient sources. This is only
available if *multiple_zones* is `False`. (default: `True`)
Returns:
One or a `list` of `Zones <data_access>` representing a planar slice.
.. warning::
Slicing is only available when the plot type is set to 3D::
>>> from tecplot.constant import PlotType
>>> frame.plot_type = PlotType.Cartesian3D
.. note::
This function returns a list of zones if *multiple_zones* is set to
`True`. Otherwise, a single zone is returned.
This example shows extracting a slice zone from the surface a wing:
.. code-block:: python
:emphasize-lines: 16-20
import os
import tecplot as tp
from tecplot.constant import PlotType, SliceSource
examples_dir = tp.session.tecplot_examples_directory()
datafile = os.path.join(examples_dir, 'OneraM6wing',
'OneraM6_SU2_RANS.plt')
dataset = tp.data.load_tecplot(datafile)
frame = tp.active_frame()
frame.plot_type = PlotType.Cartesian3D
# set active plot to 3D and extract
# an arbitrary slice from the surface
# data on the wing
extracted_slice = tp.data.extract.extract_slice(
origin=(0, 0.25, 0),
normal=(0, 1, 0),
source=SliceSource.SurfaceZones,
dataset=dataset)
# switch plot type in current frame, clear plot
plot = frame.plot(PlotType.XYLine)
plot.activate()
plot.delete_linemaps()
# create line plot from extracted zone data
cp_linemap = plot.add_linemap(
name='Quarter-chord C_p',
zone=extracted_slice,
x=dataset.variable('x'),
y=dataset.variable('Pressure_Coefficient'))
# set style of linemap plot and
# update axes limits to show data
cp_linemap.line.color = tp.constant.Color.Blue
cp_linemap.line.line_thickness = 0.8
cp_linemap.y_axis.reverse = True
plot.view.fit()
# export image of pressure coefficient as a function of x
tp.export.save_png('wing_slice_pressure_coeff.png', 600, supersample=3)
.. figure:: /_static/images/wing_slice_pressure_coeff.png
:width: 300px
:figwidth: 300px
"""
if dataset is None:
if frame is None:
frame = layout.active_frame()
dataset = frame.dataset
elif frame is None:
frame = dataset.frame
if __debug__:
if frame.dataset != dataset:
raise TecplotLogicError('Dataset is not attached to frame.')
if frame.plot_type is not PlotType.Cartesian3D:
msg = 'Plot Type must be Cartesian3D to create a slice.'
raise TecplotLogicError(msg)
with frame.activated():
new_zone_index = dataset.num_zones
with tecutil.ArgList() as arglist:
arglist[sv.ORIGINX] = float(origin[0])
arglist[sv.ORIGINY] = float(origin[1])
arglist[sv.ORIGINZ] = float(origin[2])
arglist[sv.NORMALX] = float(normal[0])
arglist[sv.NORMALY] = float(normal[1])
arglist[sv.NORMALZ] = float(normal[2])
if source is not None:
arglist[sv.SLICESOURCE] = SliceSource(source)
if multiple_zones is not None:
sigle_zone = not bool(multiple_zones)
arglist[sv.FORCEEXTRACTIONTOSINGLEZONE] = sigle_zone
arglist[sv.COPYCELLCENTEREDVALUES] = copy_cell_centers
if assign_strand_ids is not None:
arglist[sv.AUTOSTRANDTRANSIENTDATA] = bool(assign_strand_ids)
if not _tecutil.CreateSliceZoneFromPlneX(arglist):
raise TecplotSystemError()
if dataset.num_zones == new_zone_index:
raise TecplotLogicError('No zones found when extracting slice')
if multiple_zones:
zone_indices = range(new_zone_index, dataset.num_zones)
return [dataset.zone(i) for i in zone_indices]
else:
return dataset.zone(new_zone_index)
@lock()
def extract_zones_from_connected_regions(zones):
with IndexSet(zones) as zone_set:
if not _tecutil.ExtractZonesFromConnectedRegions(zone_set):
raise TecplotSystemError()