Source code for scdatatools.forge.utils

import ctypes
import os
import typing
from pathlib import Path

from scdatatools.p4k import P4KFile


[docs]def read_and_seek(dcb, data_type, buffer=None): """ Reads a ctypes Structure from a `buffer`, then seeks the buffer to after the read data. :param dcb: The :class:`DataCoreBinary` related to this object. This will be assigned to the `dcb` attribute on the newly read :class:`ctypes.Structure` :param data_type: A :class:`ctypes` object. :param buffer: The """ buffer = buffer or dcb.raw_data r = data_type.from_buffer(buffer, buffer.tell()) setattr(r, "_dcb", dcb) buffer.seek(ctypes.sizeof(r), os.SEEK_CUR) return r
[docs]def geometry_for_record(record, data_root: typing.Union[P4KFile, Path] = None, base=False): """Return the primary Geometry associated with the given record. :param record: Record to resolve the geometry :param base: `bool` whether or not to return the base geometry, or a dict of all tagged version of the geometry :param data_root: If provided, resolve to the actual file or P4KInfo of the geometry within the `data_root` which can be a `P4K` or `Path` """ if record is None: return None def _geom_from_geometry_node(geom_node): geom_path = geom_node.properties["Geometry"].properties["Geometry"].properties["path"] if geom_path: geom_path = Path(geom_path).as_posix() if isinstance(data_root, Path): geom_path = data_root / Path(geom_path) elif isinstance(data_root, P4KFile): try: geom_path = data_root.getinfo( geom_path if geom_path.casefold().startswith("data") else f"data/{geom_path}" ) except KeyError: pass geom = {geom_node.properties["Tags"]: geom_path} else: geom = {} if base: return geom_path for sub_geom in geom_node.properties["SubGeometry"]: geom.update(_geom_from_geometry_node(sub_geom)) return geom geom = None try: geom_component = next( iter( _ for _ in record.properties.get("Components", []) if _.name == "SGeometryResourceParams" ) ) geom = _geom_from_geometry_node(geom_component.properties["Geometry"]) except (StopIteration, KeyError): pass return geom