Source code for tecplot.data.facemap
import itertools as it
import logging
from ctypes import c_int32, c_int64, c_void_p, POINTER
from textwrap import dedent
from ..tecutil import _tecutil
from ..constant import *
from ..exception import *
from ..tecutil import lock, log_setattr
log = logging.getLogger(__name__)
@log_setattr
[docs]class Facemap(c_void_p):
"""Connectivity list definition and control.
Facemap access in PyTecplot is a work in progress. While we provide
some functionality, it sould be considered "beta" quality at best.
"""
def __init__(self, zone):
self.zone = zone
super().__init__(self._native_reference())
@lock()
def _native_reference(self, writable=False):
try:
_dispatch = {
True: _tecutil.DataFaceMapGetWritableRef,
False: _tecutil.DataFaceMapGetReadableRef}
with self.zone.dataset.frame.activated():
return _dispatch[writable](self.zone.index + 1)
except TecplotLogicError:
raise TecplotLogicError(dedent('''\
A facemap must first be created with
PolyFEZone.create_facemap()'''))
def __eq__(self, other):
self_addr = addressof(cast(self, POINTER(c_int64)).contents)
other_addr = addressof(cast(other, POINTER(c_int64)).contents)
return self_addr == other_addr
def __ne__(self, other):
return not (self == other)
def __len__(self):
return self.num_faces
@property
def num_faces(self):
return _tecutil.DataFaceMapGetNFaces(self)
@property
def node_c_type(self):
_ctypes = {
OffsetDataType.OffsetDataType_32Bit: c_int32,
OffsetDataType.OffsetDataType_64Bit: c_int64}
data_type = _tecutil.DataFaceMapGetNodeRawItemType(self)
return _ctypes[data_type]
@property
def element_c_type(self):
_ctypes = {
OffsetDataType.OffsetDataType_32Bit: c_int32,
OffsetDataType.OffsetDataType_64Bit: c_int64}
data_type = _tecutil.DataFaceMapGetElementRawItemType(self)
return _ctypes[data_type]
@lock()
[docs] def assign_mapping(self, facemap, elements):
nfaces = len(facemap)
nfacenodes = [len(n) for n in facemap]
faces = (c_int32*nfaces)(*nfacenodes)
nodes = (c_int32*sum(nfacenodes))(*[n+1 for n in it.chain(*facemap)])
left_elems = (c_int32*len(elements))(*[e[0] for e in elements])
right_elems = (c_int32*len(elements))(*[e[1] for e in elements])
if self.zone.zone_type is ZoneType.FEPolygon:
faces = None
if __debug__:
if not all(n==2 for n in nfacenodes):
msg = dedent('''Polygon zone facemaps must have only two
nodes per element.''')
raise TecplotLogicError(msg)
_tecutil.DataFaceMapAssignNodes(self, nfaces, faces, nodes)
_tecutil.DataFaceMapAssignElems(self, len(elements), left_elems, right_elems)