Source code for honeybee_openstudio.cli.translate

"""honeybee-openstudio translation commands."""
import sys
import logging
import click

from ladybug.commandutil import process_content_to_output
from honeybee.model import Model

import openstudio
from honeybee_openstudio.writer import model_to_openstudio

_logger = logging.getLogger(__name__)


@click.group(help='Commands for translating between Honeybee and OpenStudio.')
def translate():
    pass


@translate.command('model-to-osm')
@click.argument('model-file', type=click.Path(
    exists=True, file_okay=True, dir_okay=False, resolve_path=True))
@click.option(
    '--output-file', '-o', help='Optional OSM file path to output the OSM string '
    'of the translation. By default this will be printed to stdout.',
    type=click.File('w'), default='-', show_default=True)
def model_to_osm_cli(model_file, output_file):
    """Translate a Honeybee Model to an OSM file.

    \b
    Args:
        model_file: Full path to a Honeybee Model file (HBJSON or HBpkl).
    """
    try:
        model_to_osm(model_file, output_file)
    except Exception as e:
        _logger.exception(f'Model translation failed:\n{e}')
        sys.exit(1)
    else:
        sys.exit(0)


[docs] def model_to_osm(model_file, output_file=None): """Translate a Honeybee Model to an OSM file. Args: model_file: Full path to a Honeybee Model file (HBJSON or HBpkl). output_file: Optional OSM file path to output the OSM string of the translation. If None, the string will be returned from this function. """ model = Model.from_file(model_file) os_model = model_to_openstudio(model, print_progress=True) if output_file is not None and 'stdout' not in str(output_file): output_file = output_file.name \ if not isinstance(output_file, str) else output_file os_model.save(output_file, overwrite=True) else: output = process_content_to_output(str(os_model), output_file) return output
@translate.command('osm-to-idf') @click.argument('osm-file', type=click.Path( exists=True, file_okay=True, dir_okay=False, resolve_path=True)) @click.option( '--output-file', '-o', help='Optional IDF file path to output the IDF string ' 'of the translation. By default this will be printed to stdout.', type=click.File('w'), default='-', show_default=True) def osm_to_idf_cli(osm_file, output_file): """Translate a OSM file to an IDF file. \b Args: osm_file: Full path to a OpenStudio Model file (OSM). """ try: osm_to_idf(osm_file, output_file) except Exception as e: _logger.exception(f'Model translation failed:\n{e}') sys.exit(1) else: sys.exit(0)
[docs] def osm_to_idf(osm_file, output_file=None): """Translate a Honeybee Model to an OSM file. Args: osm_file: Full path to an OpenStudio Model file (OSM). output_file: Optional IDF file path to output the IDF string of the translation. If None, the string will be returned from this function. """ # load the model object from the OSM file exist_os_model = openstudio.model.Model.load(osm_file) if exist_os_model.is_initialized(): os_model = exist_os_model.get() else: raise ValueError( 'The file at "{}" does not appear to be an OpenStudio model.'.format( osm_file )) # translate the OpenStudio model to an IDF file idf_translator = openstudio.energyplus.ForwardTranslator() workspace = idf_translator.translateModel(os_model) # write the IDF file if output_file is not None and 'stdout' not in str(output_file): output_file = output_file.name \ if not isinstance(output_file, str) else output_file workspace.save(output_file, overwrite=True) else: output = process_content_to_output(str(workspace), output_file) return output
@translate.command('append-to-osm') @click.argument('osm-file', type=click.Path( exists=True, file_okay=True, dir_okay=False, resolve_path=True)) @click.argument('model-file', type=click.Path( exists=True, file_okay=True, dir_okay=False, resolve_path=True)) @click.option( '--output-file', '-o', help='Optional OSM file path to output the OSM string ' 'of the translation. By default this will be printed to stdout.', type=click.File('w'), default='-', show_default=True) def append_to_osm_cli(osm_file, model_file, output_file): """Append a Honeybee Model to a OSM file. \b Args: osm_file: Full path to a OpenStudio Model file (OSM). model_file: Full path to a Honeybee Model file (HBJSON or HBpkl). """ try: append_to_osm(osm_file, model_file, output_file) except Exception as e: _logger.exception(f'Model appending failed:\n{e}') sys.exit(1) else: sys.exit(0)
[docs] def append_to_osm(osm_file, model_file, output_file=None): """Append a Honeybee Model to a OSM file. Args: osm_file: Full path to an OpenStudio Model file (OSM). model_file: Full path to a Honeybee Model file (HBJSON or HBpkl). output_file: Optional IDF file path to output the IDF string of the translation. If None, the string will be returned from this function. """ # load the model object from the OSM file exist_os_model = openstudio.model.Model.load(osm_file) if exist_os_model.is_initialized(): os_model = exist_os_model.get() else: raise ValueError( 'The file at "{}" does not appear to be an OpenStudio model.'.format( osm_file )) # load the honeybee Model object model = Model.from_file(model_file) # append the honeybee model to the OSM os_model = model_to_openstudio(model, os_model) # write the OSM file if output_file is not None and 'stdout' not in str(output_file): output_file = output_file.name \ if not isinstance(output_file, str) else output_file os_model.save(output_file, overwrite=True) else: output = process_content_to_output(str(os_model), output_file) return output