Source code for ladybug_display.extension.windrose

"""Method to draw a WindRose as a VisualizationSet."""
import math

from ladybug_geometry.geometry2d import Polyline2D
from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
    Polyline3D, Mesh3D

from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
    DisplayText3D
from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
    VisualizationData, ContextGeometry
from ladybug_display.extension.compass import compass_to_vis_set


[docs]def wind_rose_to_vis_set(windrose, z=0, frequency_labels=True): """Get a Ladybug WindRose represented as a VisualizationSet. Args: windrose: A Ladybug WindRose object. z: A number for the Z-coordinate to be used in translation. (Default: 0). frequency_labels: A boolean to note whether frequency labels should be included in the output visualization. (Default: True). Returns: A VisualizationSet with the wind rose represented several ContextGeometries and an AnalysisGeometry. This includes these objects in the following order. - Compass -- A ContextGeometry for the Compass at the base of the wind rose. - Orientation_Lines -- A ContextGeometry with lines representing the edges (or "spokes") of the wind rose directions. - Frequency_Lines -- A ContextGeometry with polygons representing the frequency intervals of the wind rose. - Analysis_Data -- An AnalysisGeometry for the wind rose data. """ # establish the VisualizationSet object wr_metadata = windrose.analysis_data_collection.header.metadata set_id = 'Wind_Rose_{}'.format(wr_metadata['city'].replace(' ', '_')) \ if wr_metadata is not None \ and 'city' in wr_metadata else 'Wind_Rose' vis_set = VisualizationSet(set_id, ()) # add the compass to the bottom of the path legend_par = windrose.legend.legend_parameters font, txt_h = legend_par.font, legend_par.text_height vis_set.add_geometry(compass_to_vis_set(windrose.compass, z=z, font=font)[0]) # add the orientation lines orient_line = [LineSegment3D.from_line_segment2d(seg, z) for seg in windrose.orientation_lines] dis_orient = [] for lin in orient_line: dis_orient.append(DisplayLineSegment3D(lin, line_width=1, line_type='Dotted')) orient_geo = ContextGeometry('Orientation_Lines', dis_orient) orient_geo.display_name = 'Orientation Lines' vis_set.add_geometry(orient_geo) # add the frequency lines wr_pln = Plane(o=Point3D(0, 0, z)) freq_line = [Polyline3D.from_polyline2d(Polyline2D.from_polygon(poly), wr_pln) for poly in windrose.frequency_lines[:-1]] dis_freq, freq_text = [], [] for lin in freq_line: dis_freq.append(DisplayPolyline3D(lin, line_width=1, line_type='Dotted')) if frequency_labels: b_pln_x = Vector3D(1, 0, 0) if windrose.north == 0 else \ Vector3D(1, 0, 0).rotate_xy(math.radians(windrose.north)) f_int = windrose.frequency_hours txt_h = min((windrose.frequency_spacing_distance / 4, txt_h)) freqs = range(0, f_int * windrose.frequency_intervals_compass, f_int) for i, (lin, val) in enumerate(zip(freq_line, freqs)): if i % 2 == 0 and i != 0: b_pln = Plane(o=lin.segments[0].midpoint, x=b_pln_x) d_txt = DisplayText3D(str(val), b_pln, txt_h, None, font, 'Center', 'Bottom') freq_text.append(d_txt) freq_geo = ContextGeometry('Frequency_Lines', dis_freq + freq_text) freq_geo.display_name = 'Frequency Lines' vis_set.add_geometry(freq_geo) # add the colored mesh msh = Mesh3D.from_mesh2d(windrose.colored_mesh, wr_pln) data_header = windrose.analysis_data_collection.header data_type, unit = data_header.data_type, data_header.unit vis_data = VisualizationData( windrose._color_array, windrose.legend_parameters, data_type, unit) mesh_geo = AnalysisGeometry('Analysis_Data', [msh], [vis_data]) mesh_geo.display_name = data_type.name mesh_geo.display_mode = 'SurfaceWithEdges' vis_set.add_geometry(mesh_geo) return vis_set