Package: honeybee-vtk
honeybee-vtk🐝 VTK - Honeybee extension for viewing HBJSON in a web browser.Installationpip install honeybee-vtkQuickStartimporthoneybee_vtkTranslate a HBJSON file to an HTML or vtkjs fileUsage: honeybee-vtk translate [OPTIONS] HBJSON_FILETranslate a HBJSON file to an HTML or a vtkjs file.Args:hbjson-file: Path to an HBJSON file.Options:-n, --name TEXT                 Name of the output file.  [default: model]-f, --folder DIRECTORY          Path to target folder.  [default: .]-ft, --file-type [html|vtkjs|vtp|vtk]Switch between html and vtkjs formats[default: html]-mdm, --model-display-mode [shaded|surface|surfacewithedges|wireframe|points]Set display mode for the model.  [default:shaded]-gdm, --grid-display-mode [shaded|surface|surfacewithedges|wireframe|points]Set display mode for the grid.  [default:shaded]-go, --grid-options [ignore|points|meshes]Export sensor grids as either points ormeshes.  [default: ignore]-sh, --show-html, --show        Open the generated HTML file in a browser.[default: False]-cf, --config PATH              File Path to the config json file which canbe used to mount simulation data on HBJSON.-vd, --validate-data            Validate simulation data before loading onthe model. This is recommended when usingthis command locally.  [default: False]--help                          Show this message and exit.Export images from an HBJSON fileUsage: honeybee-vtk export-images [OPTIONS] HBJSON_FILEExport images from radiance views in a HBJSON file.Args:hbjson-file: Path to an HBJSON file.Options:-f, --folder DIRECTORY          Path to target folder.  [default: .]-it, --image-type [png|jpg|ps|tiff|bmp|pnm]choose the type of image file.  [default:jpg]-iw, --image-width INTEGER      Width of images in pixels. If not set,Radiance default x dimension of view will beused.  [default: 0]-ih, --image-height INTEGER     Height of images in pixels.If not set,Radiance default y dimension of view will beused.  [default: 0]-bc, --background-color <INTEGER INTEGER INTEGER>...Set background color for images  [default:255, 255, 255]-mdm, --model-display-mode [shaded|surface|surfacewithedges|wireframe|points]Set display mode for the model.  [default:shaded]-go, --grid-options [ignore|points|meshes]Export sensor grids as either points ormeshes.  [default: ignore]-gdm, --grid-display-mode [shaded|surface|surfacewithedges|wireframe|points]Set display mode for the Sensorgrids.[default: surfacewithedges]-vf, --view PATH                File Path to the Radiance view file.Multiple view files are accepted.-cf, --config PATH              File Path to the config json file which canbe used to mount simulation data on HBJSON.-vd, --validate-data            Validate simulation data before loading onthe model. This is recommended when usingthis command locally.  [default: False]--grid / --model                Boolean to decide whether to export theimages of a whole model or only the grids.Set it to True to export the grids.[default: False]-gf, --grid-filter TEXT         Filter sensor grids by name. Use this optionmultiple times to use multiple grididentifiers as filters.  [default: ]--text-content TEXT             Text to be displayed on the image.-th, --text-height INTEGER      Set the height of the text in pixels.[default: 15]-tc, --text-color <INTEGER INTEGER INTEGER>...Set the text color.  [default: 0, 0, 0]-tp, --text-position <FLOAT FLOAT>...Set the text position in the image. Thesetting is applied at the lower left pointof the text. (0,0) will give you the lowerleft corner of the image. (1,1) will giveyou the upper right corner of the image.[default: 0.5, 0.0]-tb, --text-bold                Set the text to be bold.  [default: False]--help                          Show this message and exit.Write a config file to be consumed by the Translate commandUsage: honeybee-vtk config [OPTIONS] INPUT_FILEWrite a config file to be consumed by honeybee-vtk.Args:input_file: A path to the input file in json format.folder_path: Path to the folder where the config file shall be written.Defaults to the current working directory.name: A string as the name of the config file. Defaults to 'config'.Options:-fp, --folder-path PATH  Path to the folder where the config file shall bewritten.  [default: .]-n, --name TEXT          Name of the config file.  [default: config]--help                   Show this message and exit.Create arrows and write to a vtp file and open it in a minimalist desktopviewerfromladybug_geometry.geometry3dimportPoint3D,Vector3Dfromhoneybee_vtk.to_vtkimportcreate_arrowpoints=[Point3D(0,0,0),Point3D(1,1,0),Point3D(1,0,0)]vectors=[Vector3D(0,0,1),Vector3D(1,1,1),Vector3D(2,0,0)]arrows=create_arrow(points,vectors)arrows.to_vtk('.','arrows')Create a group of points and color them based on distance from origin, write them to a vtp file and and open it in a minimalist desktopviewerfromladybug_geometry.geometry3dimportPoint3Dfromhoneybee_vtk.to_vtkimportconvert_pointspoints=[]forxinrange(-50,50,5):foryinrange(-50,50,5):forzinrange(-50,50,5):points.append(Point3D(x,y,z))origin=Point3D(0,0,0)distance=[pt.distance_to_point(origin)forptinpoints]# convert points to polydatapts=convert_points(points)pts.add_data(distance,name='distance',cell=False)pts.color_by('distance',cell=False)pts.to_vtk('.','colored_points')Draw a sunpathfromladybug.locationimportLocationfromladybug.sunpathimportSunpath,Point3D,Vector3Dfromhoneybee_vtk.to_vtkimportconvert_polyline,create_polylinefromhoneybee_vtk.typesimportJoinedPolyDataimportmath# Create location. You can also extract location data from an epw file.sydney=Location('Sydney','AUS',latitude=-33.87,longitude=151.22,time_zone=10)# Initiate sunpathsp=Sunpath.from_location(sydney)radius=100origin=Point3D(0,0,0)polylines=sp.hourly_analemma_polyline3d(origin=origin,daytime_only=True,radius=radius)sp_pls=[convert_polyline(pl)forplinpolylines]# add a circlenorth=origin.move(Vector3D(0,radius,0))plot_points=[north.rotate_xy(math.radians(angle),origin)forangleinrange(0,365,5)]plot=create_polyline(plot_points)# join polylines into a single polydatasunpath=JoinedPolyData.from_polydata(sp_pls)# add plotsunpath.append(plot)sunpath.to_vtk('.','sunpath')Draw a sunpath with hourly datafromladybug.epwimportEPWfromladybug.sunpathimportSunpath,Point3D,Vector3Dfromhoneybee_vtk.to_vtkimportconvert_points,convert_polyline,create_polylinefromhoneybee_vtk.typesimportJoinedPolyDataimportmath# Get location from epw fileepw=EPW('./tests/assets/in.epw')location=epw.location# Initiate sunpathsp=Sunpath.from_location(location)radius=100origin=Point3D(0,0,0)polylines=sp.hourly_analemma_polyline3d(origin=origin,daytime_only=True,radius=radius)sp_pls=[convert_polyline(pl)forplinpolylines]# add a circlenorth=origin.move(Vector3D(0,radius,0))plot_points=[north.rotate_xy(math.radians(angle),origin)forangleinrange(0,365,5)]plot=create_polyline(plot_points)# join polylines into a single polydatasunpath=JoinedPolyData.from_polydata(sp_pls)# add plotsunpath.append(plot)sunpath.to_vtk('.','sunpath')# add sun positions and color them based on radiationday=sp.hourly_analemma_suns(daytime_only=True)# calculate sun positions from sun vectorpts=[]hours=[]forsunsinday:forsuninsuns:pts.append(origin.move(sun.sun_vector.reverse()*radius))hours.append(sun.hoy)radiation_data=epw.global_horizontal_radiationfiltered_radiation_data=radiation_data.filter_by_hoys(hours)sun_positions=convert_points(pts)sun_positions.add_data(filtered_radiation_data.values,name='Globale Horizontal Radiation',cell=False)sun_positions.color_by('Global Horizontal Radiation',cell=False)sun_positions.to_vtk('.','sun_positions')Load HB modelfromhoneybee_vtk.modelimportModelhbjson=r'./tests/assets/gridbased.hbjson'model=Model.from_hbjson(hbjson)model.to_html(folder='.',name='two-rooms',show=True)Load HB model - change display mode and colorsfromhoneybee_vtk.modelimportModel,DisplayModefromladybug.colorimportColorhbjson=r'./tests/assets/gridbased.hbjson'model=Model.from_hbjson(hbjson)# update model visualization to show edgesmodel.update_display_mode(DisplayMode.SurfaceWithEdges)# set shades to wireframe mode and change their color to blackmodel.shades.display_mode=DisplayMode.Wireframemodel.shades.color=Color(0,0,0,255)# create an HTML file with embedded visualization. You can share this HTML as is# and it will include all the information.model.to_html('.',name='two-rooms',show=True)# alternatively you can write it as a vtkjs file and visualize it in ParaviewGlance# the `to_html` method calls this method under the hood.# model.to_vtkjs(folder='.')Load HB Model and daylight factor resultsfromhoneybee_vtk.modelimportModel,DisplayMode,SensorGridOptionsimportpathlibhbjson=r'./tests/assets/revit_model/model.hbjson'results_folder=r'./tests/assets/revit_model/df_results'model=Model.from_hbjson(hbjson,load_grids=SensorGridOptions.Mesh)# load the results for each grid# note that we load the results using the order for model to ensure the order will matchdaylight_factor=[]forgridinmodel.sensor_grids.data:res_file=pathlib.Path(results_folder,f'{grid.identifier}.res')grid_res=[float(v)forvinres_file.read_text().splitlines()]daylight_factor.append(grid_res)# add the results to sensor grids as a new field# per face is set to True since we loaded grids as a meshmodel.sensor_grids.add_data_fields(daylight_factor,name='Daylight Factor',per_face=True)model.sensor_grids.color_by='Daylight Factor'# make it pop!# change display mode for sensor grids to be surface with edgesmodel.sensor_grids.display_mode=DisplayMode.SurfaceWithEdges# update model visualization to wireframemodel.update_display_mode(DisplayMode.Wireframe)# make shades to be shaded with edgemodel.shades.display_mode=DisplayMode.SurfaceWithEdges# export the model to a HTML file with embedded viewer and open the page in a browsermodel.to_html('c:/ladybug',name='revit-model',show=True)# alternatively you can write it as a vtkjs file and visualize it in ParaviewGlance# the `to_html` method calls this method under the hood.# model.to_vtkjs(folder='.')Load HB Model and annual daylight resultsfromhoneybee_vtk.modelimportModel,DisplayMode,SensorGridOptionsimportpathlibhbjson=r'./tests/assets/gridbased.hbjson'results_folder=r'./tests/assets/annual_metrics'model=Model.from_hbjson(hbjson,load_grids=SensorGridOptions.Mesh)# load the results for each grid# note that we load the results using the order for model to ensure the order will matchannual_metrics=[{'folder':'da','extension':'da','name':'Daylight Autonomy'},{'folder':'cda','extension':'cda','name':'Continuous Daylight Autonomy'},{'folder':'udi','extension':'udi','name':'Useful Daylight Illuminance'},{'folder':'udi_lower','extension':'udi','name':'Lower Daylight Illuminance'},{'folder':'udi_upper','extension':'udi','name':'Excessive Daylight Illuminance'}]formetricinannual_metrics:results=[]forgridinmodel.sensor_grids.data:res_file=pathlib.Path(results_folder,metric['folder'],f'{grid.identifier}.{metric["extension"]}')grid_res=[float(v)forvinres_file.read_text().splitlines()]results.append(grid_res)# add the results to sensor grids as a new field# per face is set to True since we loaded grids as a meshmodel.sensor_grids.add_data_fields(results,name=metric['name'],per_face=True)# Set color by to Useful Daylight Illuminancemodel.sensor_grids.color_by='Useful Daylight Illuminance'# make it pop!# change display mode for sensor grids to be surface with edgesmodel.sensor_grids.display_mode=DisplayMode.SurfaceWithEdges# update model visualization to wireframemodel.update_display_mode(DisplayMode.Wireframe)# export the model to a HTML file with embedded viewer and open the page in a browsermodel.to_html('.',name='two-rooms',show=True)# alternatively you can write it as a vtkjs file and visualize it in ParaviewGlance# the `to_html` method calls this method under the hood.# model.to_vtkjs(folder='.')Save model with results as an imagefromhoneybee_vtk.modelimportModel,DisplayMode,SensorGridOptionsfromhoneybee_vtk.sceneimportSceneimportpathlibhbjson=r'./tests/assets/gridbased.hbjson'results_folder=r'./tests/assets/df_results'model=Model.from_hbjson(hbjson,load_grids=SensorGridOptions.Mesh)# load the results for each grid# note that we load the results using the order for model to ensure the order will matchdaylight_factor=[]forgridinmodel.sensor_grids.data:res_file=pathlib.Path(results_folder,f'{grid.identifier}.res')grid_res=[float(v)forvinres_file.read_text().splitlines()]daylight_factor.append(grid_res)# add the results to sensor grids as a new field# per face is set to True since we loaded grids as a meshmodel.sensor_grids.add_data_fields(daylight_factor,name='Daylight Factor',per_face=True,data_range=(0,20))model.sensor_grids.color_by='Daylight Factor'# make it pop!# change display mode for sensor grids to be surface with edgesmodel.sensor_grids.display_mode=DisplayMode.SurfaceWithEdges# update model visualization to wireframemodel.update_display_mode(DisplayMode.Wireframe)# make shades to be shaded with edgemodel.shades.display_mode=DisplayMode.SurfaceWithEdges# create a scene to render the modelscene=Scene()scene.add_model(model)# set a scale bar based on daylight factor valuescolor_range=model.sensor_grids.active_field_info.color_range()# you can also save the scene as an image.# right now you can't control the camera but camera control can be implemented.scene.to_image('.',name='daylight_factor',image_scale=2,color_range=color_range)# alternatively you can start an interactive window# scene.show(color_range)