Source code for ladybug_geometry_polyskel.cli

"""ladybug-geometry-polyskel commands."""
import click
import sys
import logging
import json

from ladybug_geometry.geometry3d import Face3D
from ladybug_geometry_polyskel.polysplit import perimeter_core_subfaces as \
    lgp_perimeter_core_subfaces

_logger = logging.getLogger(__name__)


# command group for all geometry extension commands.
@click.group(help='ladybug geometry polyskel commands.')
@click.version_option()
def main():
    pass


@main.command('perimeter-core-subfaces')
@click.argument('face3d-file', type=click.Path(
    exists=True, file_okay=True, dir_okay=False, resolve_path=True))
@click.argument('perimeter-offset', type=float)
@click.option(
    '--tolerance', '-t', help='The maximum difference between x, y, and z '
    'values at which vertices are considered equivalent.',
    type=float, default=1e-5)
@click.option(
    '--output-file', help='Optional file to output the he string of the visualization '
    'file contents. By default, it will be printed out to stdout',
    type=click.File('w'), default='-', show_default=True)
def perimeter_core_subfaces_cli(face3d_file, perimeter_offset, tolerance, output_file):
    """Compute perimeter and core Face3Ds using the straight skeleton of input Face3Ds.

    \b
    Args:
        face3d_file: Full path to a JSON file containing an array of Face3D
            objects for which core/perimeter Face3Ds will be computed.
        perimeter_offset: Distance to offset perimeter sub-faces.
    """
    try:
        perimeter_core_subfaces(face3d_file, perimeter_offset, tolerance, output_file)
    except Exception as e:
        _logger.exception('Failed to compute core/perimeter Face3Ds.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)


[docs]def perimeter_core_subfaces( face3d_file, perimeter_offset, tolerance=1e-5, output_file=None ): """Compute perimeter and core Face3Ds using the straight skeleton of input Face3Ds. Args: face3d_file: Full path to a JSON file containing an array of Face3D objects for which core/perimeter Face3Ds will be computed. perimeter_offset: Distance to offset perimeter sub-faces. tolerance: The maximum difference between x, y, and z values at which vertices are considered equivalent. output_file: Optional file to output the string of the visualization file contents. If None, the string will simply be returned from this method. """ # load the Face3D objects with open(face3d_file) as inf: data = json.load(inf) face_3ds = [Face3D.from_dict(geo) for geo in data] # compute core/perimeter Face3Ds core_per_geos = [] for geo_obj in face_3ds: perimeter_sub_faces, core_sub_faces = \ lgp_perimeter_core_subfaces(geo_obj, perimeter_offset, tolerance) core_per_geos.extend([f.to_dict() for f in perimeter_sub_faces]) core_per_geos.extend([f.to_dict() for f in core_sub_faces]) # write the resulting geometries into the output if output_file is None: return json.dumps(core_per_geos) else: output_file.write(json.dumps(core_per_geos))