Ejemplo n.º 1
0
def test_export_images():
    """Test exporting images for the whole model."""
    runner = CliRunner()
    file_path = r'tests/assets/gridbased.hbjson'
    target_folder = r'tests/assets/target'
    view_file = r'tests/assets/view.vf'
    view_file_1 = r'tests/assets/view1.vf'
    config_path = r'tests/assets/config/valid.json'

    nukedir(target_folder, True)

    result = runner.invoke(
        export, [
            file_path, '--folder', target_folder, '--image-type', 'PNG',
            '--image-width', 500, '--image-height', 500,
            '--background-color', 255, 255, 255, '--grid-options', 'Meshes',
            '--model-display-mode', 'Shaded', '--grid-display-mode', 'SurfaceWithEdges',
            '--view', view_file, '--view', view_file_1, '--config', config_path])

    assert result.exit_code == 0
    exported_file_names = os.listdir(target_folder)
    file_names = ['Back.png', 'Bottom.png', 'Front.png',
                  'Left.png', 'Right.png', 'Top.png', 'view.png', 'view1.png']
    assert all([name in file_names for name in exported_file_names])

    nukedir(target_folder, True)
Ejemplo n.º 2
0
def ladybug_tools_folder(folder_path):
    """Set the ladybug-tools-folder configuration variable.

    \b
    Args:
        folder_path: Path to a folder to be set as the ladybug-tools-folder.
            If unspecified, the ladybug-tools-folder will be set back to the default.
    """
    try:
        # load up the config file and reset the variable
        config_file, original_lbt = folders.config_file, folders.ladybug_tools_folder
        with open(config_file) as inf:
            data = json.load(inf)
        data[
            'ladybug_tools_folder'] = folder_path if folder_path is not None else ''
        with open(config_file, 'w') as fp:
            json.dump(data, fp, indent=4)
        msg_end = 'reset to default' if folder_path is None \
            else 'set to: {}'.format(folder_path)
        # clean up the case where loading the config created the default epw folder
        if os.listdir(original_lbt) == ['resources']:
            if os.listdir(os.path.join(original_lbt,
                                       'resources')) == ['weather']:
                # this was just a weather folder created by running ladybug-core
                nukedir(original_lbt, True)
        print('ladybug-tools-folder successfully {}.'.format(msg_end))
    except Exception as e:
        _logger.exception('Failed to set ladybug-tools-folder.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)
Ejemplo n.º 3
0
def setup_resource_folders(overwrite=False):
    """Set up user resource folders in their respective locations.

    Args:
        overwrite: Boolean to note whether the user resources should only be set
            up if they do not exist, in which case existing resources will be
            preserved, or should they be overwritten.
    """
    # first check if there's an environment variable available for APPDATA
    app_folder = os.getenv('APPDATA')
    if app_folder is not None:
        resource_folder = os.path.join(app_folder, 'ladybug_tools')
        # set up user standards
        lib_folder = os.path.join(resource_folder, 'standards')
        for sub_f in STANDARDS_SUBFOLDERS:
            sub_lib_folder = os.path.join(lib_folder, sub_f)
            if not os.path.isdir(sub_lib_folder) or overwrite:
                preparedir(sub_lib_folder)
        # set up the user weather
        epw_folder = os.path.join(resource_folder, 'weather')
        if not os.path.isdir(epw_folder) or overwrite:
            if os.path.isdir(epw_folder):
                nukedir(epw_folder, rmdir=True)  # delete all sub-folders
            preparedir(epw_folder)
        # set up the user measures folder
        measure_folder = os.path.join(resource_folder, 'measures')
        if not os.path.isdir(measure_folder) or overwrite:
            if os.path.isdir(measure_folder):
                nukedir(measure_folder, rmdir=True)  # delete all sub-folders
            preparedir(measure_folder)
        return resource_folder
Ejemplo n.º 4
0
def run_comfort_map_recipe(recipe_name):
    project_folder = './tests/assets/project folder'
    recipe_folder = './lbt_recipes/{}'.format(recipe_name.replace('-', '_'))
    inputs = './tests/assets/comfort_map_inputs.json'
    name = f'{recipe_name}-test'
    sim_folder = os.path.join(project_folder, name)
    if os.path.exists(sim_folder):
        shutil.rmtree(sim_folder)
    runner = CliRunner()
    result = runner.invoke(run_recipe, [
        recipe_folder,
        project_folder,
        '-i',
        inputs,
        '--workers',
        '2',
        '--name',
        name,
    ] + env_args)
    assert result.exit_code == 0
    results_folder = os.path.join(sim_folder, 'results')
    temperature_folder = os.path.join(results_folder, 'temperature')
    assert os.path.isdir(temperature_folder)
    assert os.path.isfile(os.path.join(temperature_folder, 'TestRoom_1.csv'))
    assert os.path.isfile(os.path.join(temperature_folder, 'TestRoom_2.csv'))
    nukedir(sim_folder, True)
Ejemplo n.º 5
0
def test_to_urbanopt_electric_network():
    """Test the Model.to.urbanopt method with an ElectricNetwork."""
    model_json = './tests/json/buffalo_test_district.dfjson'
    with open(model_json) as json_file:
        data = json.load(json_file)
    model = Model.from_dict(data)

    network_json = './tests/json/buffalo_electric_grid.json'
    with open(network_json) as json_file:
        data = json.load(json_file)
    network = ElectricalNetwork.from_dict(data)

    # create the urbanopt folder
    location = Location('Buffalo', 'NY', 'USA', 42.813153, -78.852466)
    sim_folder = './tests/urbanopt_model_buffalo'
    geojson, hb_model_jsons, hb_models = \
        model.to.urbanopt(model, location, electrical_network=network, folder=sim_folder)

    # check that the appropriate files were generated
    assert os.path.isfile(geojson)
    for model_json in hb_model_jsons:
        assert os.path.isfile(model_json)
    for h_model in hb_models:
        assert isinstance(h_model, hb_model.Model)
    assert os.path.isfile(os.path.join(sim_folder, 'electrical_database.json'))

    # clean up the files
    nukedir(sim_folder, True)
Ejemplo n.º 6
0
def test_translate_recipe():
    """Test cli command."""
    runner = CliRunner()
    file_path = r'tests/assets/unnamed.hbjson'
    target_folder = r'tests/target'

    # Optional arguments are deliberately capitalized or uppercased for testing
    result = runner.invoke(translate, [
        file_path, '--name', 'Model', '--folder', target_folder, '--file-type',
        'HTML', '--display-mode', 'Shaded', '--grid-options', 'MESHES'
    ])

    assert result.exit_code == 0
    html_path = os.path.join(target_folder, 'Model.html')
    assert os.path.isfile(html_path)
    nukedir(target_folder, True)

    # Optional arguments are deliberately capitalized or uppercased for testing
    result = runner.invoke(translate, [
        file_path, '--name', 'Model', '--folder', target_folder, '--file-type',
        'VTKJS', '--display-mode', 'Shaded', '--grid-options', 'Points'
    ])

    assert result.exit_code == 0
    vtkjs_path = os.path.join(target_folder, 'Model.vtkjs')
    assert os.path.isfile(vtkjs_path)
    nukedir(target_folder, True)
Ejemplo n.º 7
0
def run_daylight_recipe(recipe_name, extension):
    project_folder = './tests/assets/project folder'
    recipe_folder = './lbt_recipes/{}'.format(recipe_name.replace('-', '_'))
    inputs = './tests/assets/radiance_grid_inputs.json'
    name = f'{recipe_name}-test'
    sim_folder = os.path.join(project_folder, name)
    if os.path.exists(sim_folder):
        shutil.rmtree(sim_folder)
    runner = CliRunner()
    result = runner.invoke(run_recipe, [
        recipe_folder,
        project_folder,
        '-i',
        inputs,
        '--workers',
        '2',
        '--name',
        name,
    ] + env_args)
    assert result.exit_code == 0
    results_folder = os.path.join(sim_folder, 'results')
    assert os.path.isfile(
        os.path.join(results_folder, f'TestRoom_1.{extension}'))
    assert os.path.isfile(
        os.path.join(results_folder, f'TestRoom_2.{extension}'))
    nukedir(sim_folder, True)
Ejemplo n.º 8
0
def test_export_grid_images():
    """Test exporting images for the grids."""
    runner = CliRunner()
    file_path = r'tests/assets/gridbased.hbjson'
    target_folder = r'tests/assets/target'
    config_path = r'tests/assets/config/valid.json'

    nukedir(target_folder, True)

    result = runner.invoke(
        export, [
            file_path, '--folder', target_folder, '--image-type', 'PNG',
            '--image-width', 500, '--image-height', 500,
            '--background-color', 255, 255, 255, '--grid-options', 'Meshes',
            '--model-display-mode', 'Shaded', '--grid-display-mode', 'SurfaceWithEdges',
            '--config', config_path, '--grid', '--grid-filter', 'TestRoom_1', '--text',
            'Test Room', '--text-height', 25, '--text-color', 51, 0, 0, '--text-position',
            0.5, 0.5, '--text-bold'])

    assert result.exit_code == 0
    exported_file_names = os.listdir(target_folder)
    file_names = ['Daylight-Factor_TestRoom_1.png', 'UDI_TestRoom_1.png']
    assert all([name in file_names for name in exported_file_names])

    nukedir(target_folder, True)
Ejemplo n.º 9
0
def test_model_to_rad_folder_no_grids():
    runner = CliRunner()
    input_hb_model = "./tests/assets/model/two_rooms_no_grids.hbjson"
    output_hb_model = "./tests/assets/model/model"

    result = runner.invoke(model_to_rad_folder, [input_hb_model, "--grid-check"])
    assert result.exit_code == 1
    nukedir(output_hb_model, True)
Ejemplo n.º 10
0
def test_generation():
    """Test if a config file is successfully generated."""
    result = runner.invoke(config, [input_file, '--folder-path', target_folder])

    assert result.exit_code == 0
    json_path = os.path.join(target_folder, 'config.json')
    assert os.path.isfile(json_path)
    nukedir(target_folder, True)
 def process_inputs(inputs, folder):
     model_fold = os.path.join(folder, 'model')
     if os.path.isdir(model_fold):
         nukedir(model_fold,
                 rmdir=True)  # delete the folder if it already exists
     model = inputs['model']
     model.to.rad_folder(model, folder)
     inputs['model'] = 'model'
Ejemplo n.º 12
0
def test_model_radiant_enclosure_info():
    runner = CliRunner()
    input_hb_model = "./tests/assets/model/two_rooms.hbjson"
    output_enclosure_folder = "./tests/assets/model/enclosure"

    result = runner.invoke(model_radiant_enclosure_info, [input_hb_model])
    assert result.exit_code == 0
    assert os.path.isdir(output_enclosure_folder)
    nukedir(output_enclosure_folder, True)
Ejemplo n.º 13
0
def test_config_name():
    """Test if file name is being applied."""
    result = runner.invoke(
        config, [input_file, '--folder-path', target_folder, '--name', 'test'])

    assert result.exit_code == 0
    json_path = os.path.join(target_folder, 'test.json')
    assert os.path.isfile(json_path)
    nukedir(target_folder, True)
Ejemplo n.º 14
0
def clean_userobjects():
    """Remove installed Ladybug Tools packages from the user's userobjects folder."""
    uo_folders = find_grasshopper_userobjects()
    for uo_folder in uo_folders:
        for pkg in PACKAGES:
            lib_folder = os.path.join(uo_folder, pkg)
            if os.path.isdir(lib_folder):
                nukedir(lib_folder, True)
                print('UserObjects removed from: {}'.format(lib_folder))
Ejemplo n.º 15
0
def clean_libraries():
    """Remove installed Ladybug Tools packages from the user's Libraries folder."""
    lib_folders = find_grasshopper_libraries()
    for lib_folder in lib_folders:
        for pkg in DOTNET_PACKAGES:
            lib_folder = os.path.join(lib_folder, pkg)
            if os.path.isdir(lib_folder):
                nukedir(lib_folder, True)
                print('Components removed from: {}'.format(lib_folder))
Ejemplo n.º 16
0
def test_model_to_rad_folder():
    runner = CliRunner()
    input_hb_model = './tests/assets/model/model_radiance_dynamic_states.json'
    output_hb_model = './tests/assets/model/model'

    result = runner.invoke(model_to_rad_folder, [input_hb_model])
    assert result.exit_code == 0
    assert os.path.isdir(output_hb_model)
    nukedir(output_hb_model, True)
Ejemplo n.º 17
0
def test_unzip_file():
    """Test the unzip file capability"""
    folder = "./tests/zip/extracted"
    wf_path = "./tests/zip/test.zip"
    futil.unzip_file(wf_path, folder)
    extracted_epw = os.path.join(folder, "AUS_NSW.Sydney.947670_IWEC.epw")
    assert os.path.isfile(extracted_epw)
    assert 1500000 < os.stat(extracted_epw).st_size < 1600000
    futil.nukedir(folder)
Ejemplo n.º 18
0
def remove_dist_info_files(directory):
    """Remove all of the PyPI .dist-info folders from a given directory.
    
    Args:
        directory: A directory containing .dist-info folders to delete.
    """
    for fold in os.listdir(directory):
        if fold.endswith('.dist-info'):
            nukedir(os.path.join(directory, fold), rmdir=True)
Ejemplo n.º 19
0
def test_leed_illuminance():
    wea_file = './tests/assets/wea/denver.wea'
    folder = './tests/assets/temp/leed'
    runner = CliRunner()
    result = runner.invoke(leed_illuminance, [wea_file, '--folder', folder])
    assert result.exit_code == 0
    out_files = json.loads(result.output)
    # check the files are created
    for sky in out_files:
        assert os.path.isfile(sky['full_path'])
    nukedir(folder)
Ejemplo n.º 20
0
def test_simulate_model():
    runner = CliRunner()
    input_model = './tests/json/ShoeBox.json'
    input_epw = './tests/epw/chicago.epw'

    result = runner.invoke(simulate_model, [input_model, input_epw])
    assert result.exit_code == 0

    folder = os.path.join(folders.default_simulation_folder, 'ShoeBox')
    output_sql = os.path.join(folder, 'OpenStudio', 'run', 'eplusout.sql')
    assert os.path.isfile(output_sql)
    nukedir(folder)
 def process_inputs(inputs, folder):
     model_fold = os.path.join(folder, 'model')
     if os.path.isdir(model_fold):
         nukedir(model_fold,
                 rmdir=True)  # delete the folder if it already exists
     model = inputs['model']
     model.to.rad_folder(model, folder)
     inputs['model'] = 'model'
     wea = inputs['wea']
     f_name = '{}.wea'.format(clean_rad_string(wea.location.city))
     wea.write(os.path.join(folder, f_name))
     inputs['wea'] = f_name
def test_annual_irradiance():
    runner = CliRunner()
    input_folder = './tests/assets/irrad_result'
    wea_file = './tests/assets/wea/denver.wea'
    sub_folder = 'metrics'
    result_dir = os.path.join(input_folder, sub_folder)
    cmd_args = [input_folder, wea_file, '--sub-folder', sub_folder]

    result = runner.invoke(annual_irradiance, cmd_args)
    assert result.exit_code == 0
    assert os.path.isdir(result_dir)
    nukedir(result_dir, rmdir=True)
Ejemplo n.º 23
0
def test_simulate_idf():
    runner = CliRunner()
    input_idf = './tests/idf/test_shoe_box.idf'
    input_epw = './tests/epw/chicago.epw'

    result = runner.invoke(simulate_idf, [input_idf, input_epw])
    assert result.exit_code == 0

    folder = os.path.join(folders.default_simulation_folder, 'test_shoe_box')
    output_sql = os.path.join(folder, 'eplusout.sql')
    assert os.path.isfile(output_sql)
    nukedir(folder)
Ejemplo n.º 24
0
def test_merge_view():
    runner = CliRunner()
    input_folder = './tests/assets/hdr/'
    out_folder = './tests/assets/hdr/hdr_result/'
    cmd_args = [
        input_folder, 'unnamed', '--folder', out_folder, '--name', 'unnamed'
    ]

    result = runner.invoke(merge_view, cmd_args)
    assert result.exit_code == 0
    out_image = os.path.join(out_folder, 'unnamed.HDR')
    assert os.path.isfile(os.path.join(out_folder, 'unnamed.HDR'))
    nukedir(out_folder, rmdir=True)
Ejemplo n.º 25
0
def test_split_view():
    runner = CliRunner()
    input_oct = './tests/assets/octree/scene.oct'
    input_view = './tests/assets/view/indoorview.vf'
    output_folder = './tests/assets/view/split_view/'
    cmd_args = [input_view, '4', '--skip-overture', '--folder', output_folder]

    result = runner.invoke(split_view, cmd_args)
    assert result.exit_code == 0
    cmd_output = result.output
    vf_list = json.loads(cmd_output)
    assert len(vf_list) == 4
    nukedir(output_folder, rmdir=True)
Ejemplo n.º 26
0
def test_leed_illuminance():
    runner = CliRunner()
    input_folder = './tests/assets/leed'
    sub_folder = 'pass_fail'
    result_dir = os.path.join(input_folder, sub_folder)
    cmd_args = [input_folder, '--sub-folder', sub_folder]

    result = runner.invoke(leed_illuminance, cmd_args)
    assert result.exit_code == 0
    assert os.path.isdir(result_dir)
    result_dict = json.loads(result.output)
    assert round(result_dict['percentage_passing']) == 24
    nukedir(result_dir, rmdir=True)
Ejemplo n.º 27
0
def test_to_geojson():
    """Test the Model to_geojson method."""
    pts_1 = (Point3D(50, 50, 3), Point3D(60, 50, 3), Point3D(60, 60, 3), Point3D(50, 60, 3))
    pts_2 = (Point3D(60, 50, 3), Point3D(70, 50, 3), Point3D(70, 60, 3), Point3D(60, 60, 3))
    pts_3 = (Point3D(50, 70, 3), Point3D(70, 70, 3), Point3D(70, 80, 3), Point3D(50, 80, 3))
    room2d_1 = Room2D('Residence1', Face3D(pts_1), 3)
    room2d_2 = Room2D('Residence2', Face3D(pts_2), 3)
    room2d_3 = Room2D('Retail', Face3D(pts_3), 3)
    story_big = Story('RetailFloor', [room2d_3])
    story = Story('ResidenceFloor', [room2d_1, room2d_2])
    story.solve_room_2d_adjacency(0.01)
    story.set_outdoor_window_parameters(SimpleWindowRatio(0.4))
    story.multiplier = 3
    building = Building('ResidenceBuilding', [story])
    story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4))
    story_big.multiplier = 1
    building_big = Building('RetailBuildingBig', [story_big])

    pts_1 = (Point3D(0, 0, 3), Point3D(0, 5, 3), Point3D(15, 5, 3), Point3D(15, 0, 3))
    pts_2 = (Point3D(15, 0, 3), Point3D(15, 15, 3), Point3D(20, 15, 3), Point3D(20, 0, 3))
    pts_3 = (Point3D(0, 5, 3), Point3D(0, 20, 3), Point3D(5, 20, 3), Point3D(5, 5, 3))
    pts_4 = (Point3D(5, 15, 3), Point3D(5, 20, 3), Point3D(20, 20, 3), Point3D(20, 15, 3))
    pts_5 = (Point3D(-5, -5, 3), Point3D(-10, -5, 3), Point3D(-10, -10, 3), Point3D(-5, -10, 3))
    room2d_1 = Room2D('Office1', Face3D(pts_1), 3)
    room2d_2 = Room2D('Office2', Face3D(pts_2), 3)
    room2d_3 = Room2D('Office3', Face3D(pts_3), 3)
    room2d_4 = Room2D('Office4', Face3D(pts_4), 3)
    room2d_5 = Room2D('Office5', Face3D(pts_5), 3)
    int_rms = Room2D.intersect_adjacency(
        [room2d_1, room2d_2, room2d_3, room2d_4, room2d_5], 0.01)
    story = Story('OfficeFloor', int_rms)
    story.rotate_xy(5, Point3D(0, 0, 0))
    story.solve_room_2d_adjacency(0.01)
    story.set_outdoor_window_parameters(SimpleWindowRatio(0.4))
    story.multiplier = 5
    building_mult = Building('OfficeBuilding', [story])

    tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6)))
    tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3)))
    tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2])

    model = Model('TestGeoJSON', [building, building_big, building_mult], [tree_canopy])

    location = Location('Boston', 'MA', 'USA', 42.366151, -71.019357)
    geojson_folder = './tests/geojson/'
    model.to_geojson(location, folder=geojson_folder)

    geo_fp = os.path.join(
        geojson_folder, model.identifier, '{}.geojson'.format(model.identifier))
    assert os.path.isfile(geo_fp)
    nukedir(os.path.join(geojson_folder, model.identifier), True)
Ejemplo n.º 28
0
def test_two_phase_command_dgp():
    runner = CliRunner()
    dc_direct = './tests/assets/glare/dc1.mtx'
    dc_total = './tests/assets/glare/dc8.mtx'
    sky_mtx = './tests/assets/glare/sky.smx'
    view_rays = './tests/assets/glare/screenviews.ray'
    output = './tests/assets/temp/screenviews.dgp'
    output_folder = './tests/assets/temp'
    cmd_args = [dc_direct, dc_total, sky_mtx, view_rays, '--output', output]

    result = runner.invoke(two_phase_command, cmd_args)
    assert result.exit_code == 0
    assert os.path.isfile(output)
    nukedir(output_folder)
Ejemplo n.º 29
0
def test_measure_to_from_dict():
    """Test the serialization of Measure to and from a dictionary."""
    measure_path = './tests/measure/edit_fraction_radiant_of_lighting_and_equipment'
    measure = Measure(measure_path)
    measure_dict = measure.to_dict()

    new_measure_path = './tests/simulation/measure_test'
    new_measure = Measure.from_dict(measure_dict, new_measure_path)
    assert os.path.isdir(measure.folder)
    assert os.path.isfile(measure.metadata_file)
    assert os.path.isfile(measure.program_file)
    assert measure_dict == new_measure.to_dict()

    nukedir(new_measure_path, True)
Ejemplo n.º 30
0
def test_merge_view_org_view():
    """Test merge view with additional input that doesn't exist"""
    runner = CliRunner()
    input_folder = './tests/assets/hdr/'
    out_folder = './tests/assets/hdr/hdr_result/'
    cmd_args = [
        input_folder, 'unnamed', '--folder', out_folder, '--name', 'unnamed',
        '--view', 'not-a-view.vf'
    ]

    result = runner.invoke(merge_view, cmd_args)
    assert result.exit_code == 0
    out_image = os.path.join(out_folder, 'unnamed.HDR')
    assert os.path.isfile(os.path.join(out_folder, 'unnamed.HDR'))
    nukedir(out_folder, rmdir=True)