Source code for tecplot.data.nodemap

import itertools as it
import logging

from ctypes import addressof, cast, c_int32, c_int64, c_void_p, POINTER

from ..tecutil import _tecutil
from ..constant import *
from ..exception import *
from ..tecutil import lock, log_setattr

log = logging.getLogger(__name__)


@log_setattr
[docs]class Nodemap(c_void_p): """Connectivity list definition and control. Nodemap 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): _dispatch = { True: _tecutil.DataNodeGetWritableRef, False: _tecutil.DataNodeGetReadableRef} with self.zone.dataset.frame.activated(): return _dispatch[writable](self.zone.index + 1) @lock() def _raw_pointer(self, writable=False): _dispatch = { True: { c_int32: _tecutil.DataNodeGetWritableRawPtrByRef, c_int64: _tecutil.DataNodeGetWritableRawPtrByRef64}, False: { c_int32: _tecutil.DataNodeGetReadableRawPtrByRef, c_int64: _tecutil.DataNodeGetReadableRawPtrByRef64} } return _dispatch[writable][self.c_type](self) 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.zone.num_elements def __iter__(self): self.current_index = -1 self.current_length = self.size return self def __next__(self): self.current_index += 1 if self.current_index < self.current_length: return self.__getitem__(self.current_index) else: del self.current_index del self.current_length raise StopIteration def next(self): # if sys.version_info < (3,) return self.__next__() @property def shape(self): return (len(self), self.points_per_element) @property def c_type(self): _ctypes = { OffsetDataType.OffsetDataType_32Bit: c_int32, OffsetDataType.OffsetDataType_64Bit: c_int64} data_type = _tecutil.DataNodeGetRawItemType(self) return _ctypes[data_type] @property def num_points_per_element(self): """Points per element for classic finite-element zones. :type: `integer <int>` The number of points (also known as nodes) per finite-element is determined from the ``zone_type`` parameter. The following table shows the number of points per element for the available zone types along with the resulting shape of the nodemap based on the number of points specified (:math:`N`): ============== ============== ======================== Zone Type Points/Element Nodemap Shape ============== ============== ======================== ``FELineSeg`` 2 (:math:`N`, :math:`2 N`) ``FETriangle`` 3 (:math:`N`, :math:`3 N`) ``FEQuad`` 4 (:math:`N`, :math:`4 N`) ``FETetra`` 4 (:math:`N`, :math:`4 N`) ``FEBrick`` 8 (:math:`N`, :math:`8 N`) ============== ============== ======================== Example usage:: >>> zone = dataset.zone('My Zone') >>> print(zone.zone_type) ZoneType.FETriangle >>> print(zone.nodemap.num_points_per_element) 3 """ return _tecutil.DataNodeGetNodesPerElem(self)
[docs] def copy(self): #npts, nelems, _ = self.shape #size = (npts - 1) * nelems #arr = (self.c_type * size)() #ref = self._native_reference() #_tecutil.DataNodeArrayGetByRef(ref, 1, size, arr) #for i in range(len(arr)): # arr[i] -= 1 #nodemap_list = list(list(x) for x in zip(*([iter(arr)] * nelems))) #return nodemap_list raise TecplotNotImplementedError
@lock() def __setitem__(self, nodemap): #_dispatch = { # c_int32: DataNodeArraySetByRef, # c_int64: DataNodeArraySetByRef64} #with self.dataset.frame.activated(): # npts, nelems, _ = self.shape # ppe = self.num_points_per_element # assert len(nodemap) == nelems # assert len(nodemap[0]) == ppe # size = self.num_points_per_element * nelems # arr = (c_int32 * size)() # for i, v in enumerate(it.chain(*nodemap)): # arr[i] = v + 1 # ref = _tecutil.DataNodeGetWritableRef(self.index + 1) # _tecutil.DataNodeArraySetByRef(ref, 1, size, arr) # session.state_changed(StateChange.NodeMapsAltered) raise TecplotNotImplementedError