diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebfb366 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# documentation diff --git a/docs/.buildinfo b/docs/.buildinfo new file mode 100644 index 0000000..c94df96 --- /dev/null +++ b/docs/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: c56abcf1e782822eb1141ce22e3b8599 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/cli/index.doctree b/docs/.doctrees/cli/index.doctree new file mode 100644 index 0000000..38fc9f8 Binary files /dev/null and b/docs/.doctrees/cli/index.doctree differ diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle new file mode 100644 index 0000000..e1bb9ed Binary files /dev/null and b/docs/.doctrees/environment.pickle differ diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree new file mode 100644 index 0000000..9e3ee71 Binary files /dev/null and b/docs/.doctrees/index.doctree differ diff --git a/docs/.doctrees/ladybug_display.altnumber.doctree b/docs/.doctrees/ladybug_display.altnumber.doctree new file mode 100644 index 0000000..547e97b Binary files /dev/null and b/docs/.doctrees/ladybug_display.altnumber.doctree differ diff --git a/docs/.doctrees/ladybug_display.dictutil.doctree b/docs/.doctrees/ladybug_display.dictutil.doctree new file mode 100644 index 0000000..ba9ec20 Binary files /dev/null and b/docs/.doctrees/ladybug_display.dictutil.doctree differ diff --git a/docs/.doctrees/ladybug_display.doctree b/docs/.doctrees/ladybug_display.doctree new file mode 100644 index 0000000..119ab2c Binary files /dev/null and b/docs/.doctrees/ladybug_display.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.adaptivechart.doctree b/docs/.doctrees/ladybug_display.extension.adaptivechart.doctree new file mode 100644 index 0000000..f64ee09 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.adaptivechart.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.compass.doctree b/docs/.doctrees/ladybug_display.extension.compass.doctree new file mode 100644 index 0000000..b8ed535 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.compass.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.doctree b/docs/.doctrees/ladybug_display.extension.doctree new file mode 100644 index 0000000..1f1e892 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.hourlyplot.doctree b/docs/.doctrees/ladybug_display.extension.hourlyplot.doctree new file mode 100644 index 0000000..3c3bd92 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.hourlyplot.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.monthlychart.doctree b/docs/.doctrees/ladybug_display.extension.monthlychart.doctree new file mode 100644 index 0000000..989a8aa Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.monthlychart.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.psychchart.doctree b/docs/.doctrees/ladybug_display.extension.psychchart.doctree new file mode 100644 index 0000000..efd71c8 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.psychchart.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.raddome.doctree b/docs/.doctrees/ladybug_display.extension.raddome.doctree new file mode 100644 index 0000000..b433b8e Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.raddome.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.radrose.doctree b/docs/.doctrees/ladybug_display.extension.radrose.doctree new file mode 100644 index 0000000..032e6c3 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.radrose.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.skydome.doctree b/docs/.doctrees/ladybug_display.extension.skydome.doctree new file mode 100644 index 0000000..1e89125 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.skydome.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.study.directsun.doctree b/docs/.doctrees/ladybug_display.extension.study.directsun.doctree new file mode 100644 index 0000000..0b0ad8d Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.study.directsun.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.study.doctree b/docs/.doctrees/ladybug_display.extension.study.doctree new file mode 100644 index 0000000..fd3a556 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.study.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.study.radiation.doctree b/docs/.doctrees/ladybug_display.extension.study.radiation.doctree new file mode 100644 index 0000000..fcb8743 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.study.radiation.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.sunpath.doctree b/docs/.doctrees/ladybug_display.extension.sunpath.doctree new file mode 100644 index 0000000..2cf9aa7 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.sunpath.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.windprofile.doctree b/docs/.doctrees/ladybug_display.extension.windprofile.doctree new file mode 100644 index 0000000..c70b489 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.windprofile.doctree differ diff --git a/docs/.doctrees/ladybug_display.extension.windrose.doctree b/docs/.doctrees/ladybug_display.extension.windrose.doctree new file mode 100644 index 0000000..35223d2 Binary files /dev/null and b/docs/.doctrees/ladybug_display.extension.windrose.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.arc.doctree b/docs/.doctrees/ladybug_display.geometry2d.arc.doctree new file mode 100644 index 0000000..9335290 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.arc.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.doctree b/docs/.doctrees/ladybug_display.geometry2d.doctree new file mode 100644 index 0000000..173caa4 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.line.doctree b/docs/.doctrees/ladybug_display.geometry2d.line.doctree new file mode 100644 index 0000000..8642d14 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.line.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.mesh.doctree b/docs/.doctrees/ladybug_display.geometry2d.mesh.doctree new file mode 100644 index 0000000..609f6a0 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.mesh.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.point.doctree b/docs/.doctrees/ladybug_display.geometry2d.point.doctree new file mode 100644 index 0000000..64a1373 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.point.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.polygon.doctree b/docs/.doctrees/ladybug_display.geometry2d.polygon.doctree new file mode 100644 index 0000000..f6f3d9b Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.polygon.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.polyline.doctree b/docs/.doctrees/ladybug_display.geometry2d.polyline.doctree new file mode 100644 index 0000000..8272692 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.polyline.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.ray.doctree b/docs/.doctrees/ladybug_display.geometry2d.ray.doctree new file mode 100644 index 0000000..fc54426 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.ray.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry2d.vector.doctree b/docs/.doctrees/ladybug_display.geometry2d.vector.doctree new file mode 100644 index 0000000..f247f3e Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry2d.vector.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.arc.doctree b/docs/.doctrees/ladybug_display.geometry3d.arc.doctree new file mode 100644 index 0000000..de4dd79 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.arc.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.cone.doctree b/docs/.doctrees/ladybug_display.geometry3d.cone.doctree new file mode 100644 index 0000000..2b27cb4 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.cone.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree b/docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree new file mode 100644 index 0000000..fb80ffd Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.doctree b/docs/.doctrees/ladybug_display.geometry3d.doctree new file mode 100644 index 0000000..e2aa1a5 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.face.doctree b/docs/.doctrees/ladybug_display.geometry3d.face.doctree new file mode 100644 index 0000000..9ca5083 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.face.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.line.doctree b/docs/.doctrees/ladybug_display.geometry3d.line.doctree new file mode 100644 index 0000000..9f2e750 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.line.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.mesh.doctree b/docs/.doctrees/ladybug_display.geometry3d.mesh.doctree new file mode 100644 index 0000000..b3df441 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.mesh.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.plane.doctree b/docs/.doctrees/ladybug_display.geometry3d.plane.doctree new file mode 100644 index 0000000..8d4da9d Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.plane.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.point.doctree b/docs/.doctrees/ladybug_display.geometry3d.point.doctree new file mode 100644 index 0000000..628cc23 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.point.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.polyface.doctree b/docs/.doctrees/ladybug_display.geometry3d.polyface.doctree new file mode 100644 index 0000000..d0fa599 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.polyface.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.polyline.doctree b/docs/.doctrees/ladybug_display.geometry3d.polyline.doctree new file mode 100644 index 0000000..c3dfcfd Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.polyline.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.ray.doctree b/docs/.doctrees/ladybug_display.geometry3d.ray.doctree new file mode 100644 index 0000000..d8dda60 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.ray.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.sphere.doctree b/docs/.doctrees/ladybug_display.geometry3d.sphere.doctree new file mode 100644 index 0000000..c56430a Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.sphere.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.text.doctree b/docs/.doctrees/ladybug_display.geometry3d.text.doctree new file mode 100644 index 0000000..532cd74 Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.text.doctree differ diff --git a/docs/.doctrees/ladybug_display.geometry3d.vector.doctree b/docs/.doctrees/ladybug_display.geometry3d.vector.doctree new file mode 100644 index 0000000..bb268ac Binary files /dev/null and b/docs/.doctrees/ladybug_display.geometry3d.vector.doctree differ diff --git a/docs/.doctrees/ladybug_display.typing.doctree b/docs/.doctrees/ladybug_display.typing.doctree new file mode 100644 index 0000000..f4aa411 Binary files /dev/null and b/docs/.doctrees/ladybug_display.typing.doctree differ diff --git a/docs/.doctrees/ladybug_display.visualization.doctree b/docs/.doctrees/ladybug_display.visualization.doctree new file mode 100644 index 0000000..412eb89 Binary files /dev/null and b/docs/.doctrees/ladybug_display.visualization.doctree differ diff --git a/docs/.doctrees/modules.doctree b/docs/.doctrees/modules.doctree new file mode 100644 index 0000000..90742cb Binary files /dev/null and b/docs/.doctrees/modules.doctree differ diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..ebfb366 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +# documentation diff --git a/docs/_modules/index.html b/docs/_modules/index.html new file mode 100644 index 0000000..d280747 --- /dev/null +++ b/docs/_modules/index.html @@ -0,0 +1,961 @@ + + + + + + + Overview: module code — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/altnumber.html b/docs/_modules/ladybug_display/altnumber.html new file mode 100644 index 0000000..96a6a57 --- /dev/null +++ b/docs/_modules/ladybug_display/altnumber.html @@ -0,0 +1,959 @@ + + + + + + + ladybug_display.altnumber — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.altnumber

+"""Objects used as alternatives to various numerical properties."""
+
+
+class _AltNumber(object):
+    __slots__ = ()
+
+    def __init__(self):
+        pass
+
+    @property
+    def name(self):
+        return self.__class__.__name__
+
+    def to_dict(self):
+        """Get the object as a dictionary."""
+        return {'type': self.name}
+
+    def ToString(self):
+        return self.__repr__()
+
+    def __eq__(self, other):
+        return self.__class__ == other.__class__
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __repr__(self):
+        return self.name
+
+
+
[docs]class Default(_AltNumber): + """Object to signify when the default value of a visual interface should be used.""" + __slots__ = () + pass
+ + +default = Default() +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/dictutil.html b/docs/_modules/ladybug_display/dictutil.html new file mode 100644 index 0000000..ba21ab5 --- /dev/null +++ b/docs/_modules/ladybug_display/dictutil.html @@ -0,0 +1,986 @@ + + + + + + + ladybug_display.dictutil — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.dictutil

+# coding=utf-8
+"""Utilities to convert any Ladybug Display dictionary to Python objects."""
+
+from ladybug_display.geometry2d import DisplayVector2D, DisplayPoint2D, \
+    DisplayRay2D, DisplayLineSegment2D, DisplayPolyline2D, DisplayArc2D, \
+    DisplayPolygon2D, DisplayMesh2D
+from ladybug_display.geometry3d import DisplayVector3D, DisplayPoint3D, \
+    DisplayRay3D, DisplayPlane, DisplayLineSegment3D, DisplayPolyline3D, DisplayArc3D, \
+    DisplayFace3D, DisplayMesh3D, DisplayPolyface3D, DisplaySphere, DisplayCone, \
+    DisplayCylinder, DisplayText3D
+
+
+
[docs]def dict_to_object(display_dict, raise_exception=True): + """ + Args: + display_dict (dict): A dictionary of any Ladybug Display geometry object. + raise_exception (bool): Boolean to note whether an exception should be + raised if the object is not identified as a part of + ladybug_display. (Default: True). + + Returns: + A Python object derived from the input display_dict. + """ + lbt_types = { + 'DisplayVector2D': DisplayVector2D, + 'DisplayPoint2D': DisplayPoint2D, + 'DisplayRay2D': DisplayRay2D, + 'DisplayLineSegment2D': DisplayLineSegment2D, + 'DisplayArc2D': DisplayArc2D, + 'DisplayPolyline2D': DisplayPolyline2D, + 'DisplayPolygon2D': DisplayPolygon2D, + 'DisplayMesh2D': DisplayMesh2D, + 'DisplayVector3D': DisplayVector3D, + 'DisplayPoint3D': DisplayPoint3D, + 'DisplayRay3D': DisplayRay3D, + 'DisplayLineSegment3D': DisplayLineSegment3D, + 'DisplayArc3D': DisplayArc3D, + 'DisplayPolyline3D': DisplayPolyline3D, + 'DisplayMesh3D': DisplayMesh3D, + 'DisplayPlane': DisplayPlane, + 'DisplayPolyface3D': DisplayPolyface3D, + 'DisplayFace3D': DisplayFace3D, + 'DisplaySphere': DisplaySphere, + 'DisplayCone': DisplayCone, + 'DisplayCylinder': DisplayCylinder, + 'DisplayText3D': DisplayText3D + } + + # Get the ladybug_geometry object 'Type' + try: + obj_type = display_dict['type'] + except KeyError: + raise ValueError('Ladybug dictionary lacks required "type" key.') + + # Build a new Ladybug Python Object based on the "Type" + try: + lbt_class = lbt_types[obj_type] + return lbt_class.from_dict(display_dict) + except KeyError: + if raise_exception: + raise ValueError( + '{} is not a recognized ladybug display type'.format(obj_type)) + else: + return None
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/adaptivechart.html b/docs/_modules/ladybug_display/extension/adaptivechart.html new file mode 100644 index 0000000..f9b70c9 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/adaptivechart.html @@ -0,0 +1,1115 @@ + + + + + + + ladybug_display.extension.adaptivechart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.adaptivechart

+"""Method to draw an AdaptiveChart as a VisualizationSet."""
+from ladybug_geometry.geometry2d import Polyline2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
+    Polyline3D, Mesh3D
+from ladybug.datatype.time import Time
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def adaptive_chart_to_vis_set( + adaptive_chart, data=None, legend_parameters=None, z=0): + """Get a Ladybug AdaptiveChart represented as a VisualizationSet. + + Args: + adaptive_chart: A Ladybug AdaptiveChart object. + data: An optional list of data collection objects, which are aligned with + the prevailing and operative temperature values of the chart. and will + generate additional colored AnalysisGeometries on the chart. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the adaptive + chart. Note that this relates only to the data supplied as input + for this method and, to customize the display of the time/frequency + mesh, the AdaptiveChart's native legend_parameters should be + edited. If a list is used here, this should align with the input data + (one legend parameter per data collection). + z: A number for the Z-coordinate to be used in translation. (Default: 0). + + Returns: + A VisualizationSet with the adaptive chart represented several + ContextGeometries and an AnalysisGeometry. This includes these objects + in the following order. + + - Title -- A ContextGeometry for the title and border around the + adaptive chart. + + - Prevailing_Axis -- A ContextGeometry with lines and text for the + Prevailing Outdoor Temperature (X) axis of the adaptive chart. + + - Operative_Axis -- A ContextGeometry with lines and text for the + Indoor Operative Temperature (Y) axis of the adaptive chart. + + - Comfort_Polygon -- A ContextGeometry with lines for the comfort polygon + and neutral temperature of the adaptive chart. + + - Analysis_Data -- An AnalysisGeometry for the data on the adaptive + chart. This will include multiple data sets if the data input + is provided. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet('Adaptive_Chart', ()) + vis_set.display_name = 'Adaptive Chart' + + # get values used throughout the translation + txt_hgt = adaptive_chart.legend_parameters.text_height + font = adaptive_chart.legend_parameters.font + bp = Plane(o=Point3D(0, 0, z)) + + # add the title and border + meta_i = adaptive_chart.operative_temperature.header.metadata.items() + title_items = ['Adaptive Chart', 'Time [hr]'] + \ + ['{}: {}'.format(k, v) for k, v in meta_i] + ttl_pl = adaptive_chart.container.lower_title_location.move( + Vector3D(0, -txt_hgt * 3)) + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + ttl_txt = DisplayText3D( + '\n'.join(title_items), ttl_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + border_geo = Polyline3D.from_polyline2d( + Polyline2D.from_polygon(adaptive_chart.chart_border), bp) + title_objs = [ttl_txt, DisplayPolyline3D(border_geo, line_width=2)] + title = ContextGeometry('Title', title_objs) + vis_set.add_geometry(title) + + # add the prevailing temperature axis + tm_pl = _plane_from_point(adaptive_chart.x_axis_location, z) + temp_txt = DisplayText3D( + adaptive_chart.x_axis_text, tm_pl, txt_hgt * 1.5, None, font, 'Center', 'Top') + temp_geo = [temp_txt] + for tl in adaptive_chart.prevailing_lines: + tl_geo = LineSegment3D.from_line_segment2d(tl, z) + temp_geo.append(DisplayLineSegment3D(tl_geo, line_type='Dotted')) + tl_pts = adaptive_chart.prevailing_label_points + for txt, pt in zip(adaptive_chart.prevailing_labels, tl_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + temp_geo.append(txt_obj) + temp_axis = ContextGeometry('Prevailing_Axis', temp_geo) + temp_axis.display_name = 'Prevailing Axis' + vis_set.add_geometry(temp_axis) + + # add the operative temperature axis + op_pl = _plane_from_point(adaptive_chart.y_axis_location, z, Vector3D(0, 1)) + op_txt = DisplayText3D( + adaptive_chart.y_axis_text, op_pl, txt_hgt * 1.5, None, font, 'Center', 'Top') + op_geo = [op_txt] + for hl in adaptive_chart.operative_lines: + hl_geo = LineSegment3D.from_line_segment2d(hl, z) + op_geo.append(DisplayLineSegment3D(hl_geo, line_type='Dotted')) + op_pts = adaptive_chart.operative_label_points + for txt, pt in zip(adaptive_chart.operative_labels, op_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + op_geo.append(txt_obj) + op_axis = ContextGeometry('Operative_Axis', op_geo) + op_axis.display_name = 'Operative Axis' + vis_set.add_geometry(op_axis) + + # add the comfort polygon + poly_geo = [] + neutral_geo = Polyline3D.from_polyline2d( + Polyline2D.from_polygon(adaptive_chart.comfort_polygon), bp) + poly_geo.append(DisplayPolyline3D(neutral_geo, line_width=3)) + neutral_geo = Polyline3D.from_polyline2d(adaptive_chart.neutral_polyline, bp) + poly_geo.append(DisplayPolyline3D(neutral_geo, line_width=1)) + comf_poly = ContextGeometry('Comfort_Polygon', poly_geo) + comf_poly.display_name = 'Comfort Polygon' + vis_set.add_geometry(comf_poly) + + # add the analysis geometry + # ensure 3D legend defaults are overridden to make the data readable + l_par = adaptive_chart.legend.legend_parameters.duplicate() + l_par.base_plane = l_par.base_plane + l_par.segment_height = l_par.segment_height + l_par.segment_width = l_par.segment_width + # gather all of the visualization data sets + vis_data = [VisualizationData(adaptive_chart.hour_values, l_par, Time(), 'hr')] + if data is not None and len(data) != 0: + if legend_parameters is None: + l_pars = [LegendParameters()] * len(data) + elif isinstance(legend_parameters, LegendParameters): + l_pars = [legend_parameters] * len(data) + else: # assume it's a list that aligns with the data + l_pars = legend_parameters + for dat, lp in zip(data, l_pars): + # process the legend parameters + lp = lp.duplicate() + if lp.is_base_plane_default: + lp.base_plane = l_par.base_plane + if lp.is_segment_height_default: + lp.segment_height = l_par.segment_height + if lp.is_segment_width_default: + lp.segment_width = l_par.segment_width + # check to be sure the data collection aligns + d_vals = dat.values + _tp_values = adaptive_chart.prevailing_outdoor_temperature.values + _to_values = adaptive_chart.operative_temperature.values + # create a matrix with a tally of the hours for all the data + base_mtx = [[[] for val in adaptive_chart._tp_category] + for rh in adaptive_chart._to_category] + for tp, to, val in zip(_tp_values, _to_values, d_vals): + if tp < adaptive_chart._min_prevailing or \ + tp > adaptive_chart._max_prevailing: + continue # temperature value does not currently fit on the chart + if to < adaptive_chart._min_operative or \ + to > adaptive_chart._max_operative: + continue # temperature value does not currently fit on the chart + for y, to_cat in enumerate(adaptive_chart._to_category): + if to < to_cat: + break + for x, tp_cat in enumerate(adaptive_chart._tp_category): + if tp < tp_cat: + break + base_mtx[y][x].append(val) + # compute average values + avg_values = [sum(val_list) / len(val_list) for rh_l in base_mtx + for val_list in rh_l if len(val_list) != 0] + hd = dat.header + vd = VisualizationData(avg_values, lp, hd.data_type, hd.unit) + vis_data.append(vd) + # create the analysis geometry + mesh_3d = Mesh3D.from_mesh2d(adaptive_chart.colored_mesh, bp) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [mesh_3d], vis_data, active_data=len(vis_data) - 1) + mesh_geo.display_name = 'Analysis Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _plane_from_point(point_2d, z, align_vec=Vector3D(1, 0, 0)): + """Get a Plane from a Point2D. + + Args: + point_2d: A Point2D to serve as the origin of the plane. + z: The Z value for the plane origin. + align_vec: A Vector3D to serve as the X-Axis of the plane. + """ + return Plane(o=Point3D(point_2d.x, point_2d.y, z), x=align_vec) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/compass.html b/docs/_modules/ladybug_display/extension/compass.html new file mode 100644 index 0000000..a75c0ce --- /dev/null +++ b/docs/_modules/ladybug_display/extension/compass.html @@ -0,0 +1,1042 @@ + + + + + + + ladybug_display.extension.compass — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.compass

+"""Method to draw a Compass as a VisualizationSet."""
+import math
+
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, Arc3D
+
+from ..geometry3d import DisplayText3D, DisplayArc3D, DisplayLineSegment3D
+from ..visualization import VisualizationSet, ContextGeometry
+
+
+
[docs]def compass_to_vis_set(compass, z=0, custom_angles=None, projection=None, font='Arial', + maj_txt_size=None, min_txt_size=None): + """Translate a Ladybug Compass object into Display geometry. + + Args: + compass: A Ladybug Compass object to be converted to display geometry. + z: A number for the Z-coordinate to be used in translation. (Default: 0) + custom_angles: An array of numbers between 0 and 360 to be used to + generate custom angle labels around the compass. + projection: Text for the name of the projection to use from the sky + dome hemisphere to the 2D plane. If None, no altitude circles o + labels will be drawn (Default: None). Choose from the following: + + * Orthographic + * Stereographic + + font: Optional text for the font to be used in creating the text. + (Default: 'Arial') + maj_txt_size: An optional number for the size of the major text. If None, + it will be set to one 20th of the radius. + min_txt_size: An optional number for the size of the major text. Set to + zero to have no minor text in the compass. If None, it will be set + to half of the major text size. + + Returns: + A VisualizationSet with the Compass represented as a single ContextGeometry. + This context geometry includes these objects in the following order. + + - all_boundary_circles -- Three Circle objects for the compass boundary. + + - major_azimuth_ticks -- Line objects for the major azimuth labels. + + - major_azimuth_text -- Text objects for the major azimuth labels. + + - minor_azimuth_ticks -- Line objects for the minor azimuth labels + (if applicable). + + - minor_azimuth_text -- Text objects for the minor azimuth + labels (if applicable). + + - altitude_circles -- Circle objects for altitude labels (if projection + is not None). + + - altitude_text -- Text objects for altitude labels (if projection + is not None). + + """ + # set default variables based on the compass properties + maj_txt = compass.radius / 20 if maj_txt_size is None else maj_txt_size + min_txt = maj_txt / 2 if min_txt_size is None else min_txt_size + xaxis = Vector3D(1, 0, 0).rotate_xy(math.radians(compass.north_angle)) + + result = [] # list to hold all of the returned objects + for i, circle in enumerate(compass.all_boundary_circles): + lw = 2 if i == 0 else 1 + result.append(DisplayArc3D(Arc3D.from_arc2d(circle, z), line_width=lw)) + + # create a method that translates LineSegment2D into DisplayLineSegment3D + def from_linesegment2d(line, z, line_width=1): + pt_array = ((line.p1.x, line.p1.y, z), (line.p2.x, line.p2.y, z)) + ls_3d = LineSegment3D.from_array(pt_array) + return DisplayLineSegment3D(ls_3d, line_width=line_width) + + # generate the labels and tick marks for the azimuths + if custom_angles is None: + for line in compass.major_azimuth_ticks: + result.append(from_linesegment2d(line, z, 2)) + for txt, pt in zip(compass.MAJOR_TEXT, compass.major_azimuth_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + result.append( + DisplayText3D(txt, txt_pln, maj_txt, None, font, 'Center', 'Middle')) + if min_txt > 0: + for line in compass.minor_azimuth_ticks: + result.append(from_linesegment2d(line, z)) + for txt, pt in zip(compass.MINOR_TEXT, compass.minor_azimuth_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + result.append( + DisplayText3D(txt, txt_pln, min_txt, None, font, 'Center', 'Middle')) + else: + for line in compass.ticks_from_angles(custom_angles): + result.append(from_linesegment2d(line, z)) + for txt, pt in zip( + custom_angles, compass.label_points_from_angles(custom_angles)): + t_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + d_t = DisplayText3D(str(txt), t_pln, maj_txt, None, font, 'Center', 'Middle') + result.append(d_t) + + # generate the labels and tick marks for the altitudes + if projection is not None: + if projection.title() == 'Orthographic': + for circle in compass.orthographic_altitude_circles: + arc_geo = Arc3D.from_arc2d(circle, z) + result.append(DisplayArc3D(arc_geo, line_width=1, line_type='Dotted')) + for txt, pt in zip(compass.ALTITUDES, compass.orthographic_altitude_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z + 0.01), x=xaxis) + d_txt = DisplayText3D( + str(txt), txt_pln, min_txt, None, font, 'Center', 'Top') + result.append(d_txt) + elif projection.title() == 'Stereographic': + for circle in compass.stereographic_altitude_circles: + arc_geo = Arc3D.from_arc2d(circle, z) + result.append(DisplayArc3D(arc_geo, line_width=1, line_type='Dotted')) + for txt, pt in zip(compass.ALTITUDES, compass.stereographic_altitude_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z + 0.01), x=xaxis) + d_txt = DisplayText3D( + str(txt), txt_pln, min_txt, None, font, 'Center', 'Top') + result.append(d_txt) + + # assemble everything into a ContextGeometry and VisualizationSet + con_geo = ContextGeometry('Compass', result) + return VisualizationSet('Compass', [con_geo])
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/hourlyplot.html b/docs/_modules/ladybug_display/extension/hourlyplot.html new file mode 100644 index 0000000..a8b0f15 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/hourlyplot.html @@ -0,0 +1,1022 @@ + + + + + + + ladybug_display.extension.hourlyplot — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.hourlyplot

+"""Method to draw an HourlyPlot as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Plane
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def hourly_plot_to_vis_set( + hourly_plot, z=0, custom_hours=(0, 3, 6, 9, 12, 15, 18, 21, 24), + include_title=True): + """Get a Ladybug HourlyPlot represented as a VisualizationSet. + + Args: + hourly_plot: A Ladybug HourlyPlot object. + z: A number for the Z-coordinate to be used in translation. (Default: 0). + custom_hours: A tuple of integers from 0 to 24 to indicate which hours + of the day should appear in the Hour_Axis of the visualization. + The default is (0, 3, 6, 9, 12, 15, 18, 21, 24). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the hourly plot represented several ContextGeometries + (and an AnalysisGeometry). This includes these objects in the following order. + + - Hour_Axis -- A ContextGeometry with lines and text for the hour-of-the-day + axis of the hourly plot. + + - Month_Axis -- A ContextGeometry with lines and text for the month-of-the-year + axis of the hourly plot. + + - Title -- A ContextGeometry with text for the title of the hourly plot. + This layer will be excluded if include_title is False. + + - Analysis_Data -- An AnalysisGeometry for the data on the hourly plot. + """ + # establish the VisualizationSet object + data_header = hourly_plot.data_collection.header + data_type, unit = data_header.data_type, data_header.unit + set_id = 'Hourly_Plot_{}'.format(data_type.name.replace(' ', '_')) + vis_set = VisualizationSet(set_id, ()) + + # get global variables used in other places + chart_border = DisplayPolyline3D(hourly_plot.chart_border3d, line_width=2) + txt_h = hourly_plot.legend_parameters.text_height + font = hourly_plot.legend_parameters.font + major_hr = hourly_plot.HOUR_LABELS + + # add the hour axis + dis_hour, dis_hour_text = [], [] + h_lines = hourly_plot.custom_hour_lines3d(custom_hours) + h_pts = hourly_plot.custom_hour_label_points3d(custom_hours) + h_text = hourly_plot.custom_hour_labels(custom_hours) + for hr, lin, pt, txt in zip(custom_hours, h_lines, h_pts, h_text): + if hr in major_hr: + lt, t_sz = 'Continuous', txt_h + else: + lt, t_sz = 'Dotted', txt_h * 0.8 + dis_hour.append(DisplayLineSegment3D(lin, line_width=1, line_type=lt)) + d_txt = DisplayText3D(txt, Plane(o=pt), t_sz, None, font, 'Right', 'Middle') + dis_hour_text.append(d_txt) + hour_axis = ContextGeometry('Hour_Axis', [chart_border] + dis_hour + dis_hour_text) + hour_axis.display_name = 'Hour Axis' + vis_set.add_geometry(hour_axis) + + # add the month axis + dis_month, dis_month_text = [], [] + m_lines = hourly_plot.month_lines3d + m_pts = hourly_plot.month_label_points3d + m_text = hourly_plot.month_labels + for lin in m_lines: + dis_month.append(DisplayLineSegment3D(lin, line_width=1)) + for pt, txt in zip(m_pts, m_text): + d_txt = DisplayText3D(txt, Plane(o=pt), t_sz, None, font, 'Center', 'Top') + dis_month_text.append(d_txt) + month_axis = ContextGeometry( + 'Month_Axis', [chart_border] + dis_month + dis_month_text) + month_axis.display_name = 'Month Axis' + vis_set.add_geometry(month_axis) + + if include_title: + tit_txt = DisplayText3D( + hourly_plot.title_text, hourly_plot.lower_title_location, txt_h, + None, font, 'Left', 'Bottom') + title = ContextGeometry('Title', [tit_txt]) + title.display_name = 'Title' + vis_set.add_geometry(title) + + # add the colored mesh + vis_data = VisualizationData( + hourly_plot.values, hourly_plot.legend_parameters, data_type, unit) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [hourly_plot.colored_mesh3d], [vis_data]) + mesh_geo.display_name = data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/monthlychart.html b/docs/_modules/ladybug_display/extension/monthlychart.html new file mode 100644 index 0000000..467d77b --- /dev/null +++ b/docs/_modules/ladybug_display/extension/monthlychart.html @@ -0,0 +1,1091 @@ + + + + + + + ladybug_display.extension.monthlychart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.monthlychart

+"""Method to draw an MonthlyChart as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D, Plane, LineSegment3D, Polyline3D, \
+    Mesh3D
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def monthly_chart_to_vis_set( + monthly_chart, z=0, time_marks=False, global_title=None, y_axis_title=None): + """Get a Ladybug MonthlyChart represented as a VisualizationSet. + + Args: + monthly_chart: A Ladybug MonthlyChart object. + z: A number for the Z-coordinate to be used in translation. (Default: 0). + time_marks: Boolean to note whether the month labels should be replaced with + marks for the time of day in each month. This is useful for displaying + hourly data, particularly when the input data is only for a month + and not the whole year. + global_title: A text string to label the entire entire chart. It will be + displayed in the lower left of the output chart. If None, the + default is to display the metadata of the chart data. + y_axis_title: A text string to label the Y-axis of the chart. This can + also be a list of 2 Y-axis titles if there are two different types + of data plotted on the chart and there are two axes labels on either + side of the chart. The default will display the data type and + units of the plotted data. + + Returns: + A VisualizationSet with the monthly chart represented several ContextGeometries + (and an AnalysisGeometry). This includes these objects in the following order. + + - X_Axis -- A ContextGeometry with lines and text for the X axis of + the monthly chart. + + - Y_Axis -- A ContextGeometry with lines and text for the Y axis of + the monthly chart. + + - Y_Axis2 -- A ContextGeometry with lines and text for the second Y axis + of the monthly chart. + + - Title -- A ContextGeometry with text for the title of the monthly chart. + + - Data_Outlines -- A ContextGeometry with a list of polylines that outline + the input data. These will represent the average or total at + each hour whenever the input data is hourly or monthly-per-hour data. + + - Analysis_Data -- An AnalysisGeometry for the data on the monthly chart. + """ + # establish the VisualizationSet object + data_header = monthly_chart.data_collections[0].header + data_type = data_header.data_type + set_id = 'Monthly_Chart_{}'.format(data_type.name.replace(' ', '_')) + vis_set = VisualizationSet(set_id, ()) + + # get values used througout the translation + txt_hgt = monthly_chart.legend_parameters.text_height + font = monthly_chart.legend_parameters.font + x_dim = monthly_chart.x_dim + bp = Plane(o=Point3D(0, 0, z)) + + # add the X axis + border = Polyline3D.from_polyline2d(monthly_chart.chart_border, bp) + x_geo = [DisplayPolyline3D(border, line_width=2)] + for line in monthly_chart.month_lines: + line3d = LineSegment3D.from_line_segment2d(line, z) + x_geo.append(DisplayLineSegment3D(line3d)) + if time_marks: + txt_h = x_dim / 20 if x_dim / 20 < txt_hgt * 0.75 else txt_hgt * 0.75 + for txt, pt in zip(monthly_chart.time_labels, monthly_chart.time_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_h, None, font, 'Center', 'Top') + x_geo.append(txt_obj) + for line in monthly_chart.time_ticks: + line3d = LineSegment3D.from_line_segment2d(line, z) + x_geo.append(DisplayLineSegment3D(line3d)) + else: + for txt, pt in zip(monthly_chart.month_labels, monthly_chart.month_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + x_geo.append(txt_obj) + x_axis = ContextGeometry('X_Axis', x_geo) + x_axis.display_name = 'X Axis' + vis_set.add_geometry(x_axis) + + # add the y axis + y_geo = [] + for line in monthly_chart.y_axis_lines: + line3d = LineSegment3D.from_line_segment2d(line, z) + y_geo.append(DisplayLineSegment3D(line3d, line_type='Dashed')) + if y_axis_title is None or len(y_axis_title) == 0: + y1_txt = monthly_chart.y_axis_title_text1 + else: + y1_txt = y_axis_title if isinstance(y_axis_title, str) else y_axis_title[0] + y_pl = monthly_chart.y_axis_title_location1 + if z != 0: + y_pl = Plane(n=y_pl.n, o=Point3D(y_pl.o.x, y_pl.o.y, z), x=y_pl.x) + y_title = DisplayText3D(y1_txt, y_pl, txt_hgt, None, font) + y_geo.append(y_title) + for txt, pt in zip(monthly_chart.y_axis_labels1, monthly_chart.y_axis_label_points1): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + y_geo.append(txt_obj) + y_axis = ContextGeometry('Y_Axis', y_geo) + y_axis.display_name = y1_txt + vis_set.add_geometry(y_axis) + + # add the second y axis if it exists + if monthly_chart.y_axis_title_text2 is not None: + y2_geo = [] + if y_axis_title is None or len(y_axis_title) <= 1: + y2_txt = monthly_chart.y_axis_title_text2 + else: + y2_txt = monthly_chart.y_axis_title_text2 \ + if isinstance(y_axis_title, str) else y_axis_title[1] + y2_pl = monthly_chart.y_axis_title_location2 + if z != 0: + y2_pl = Plane(n=y2_pl.n, o=Point3D(y2_pl.o.x, y2_pl.o.y, z), x=y2_pl.x) + y_title2 = DisplayText3D(y2_txt, y2_pl, txt_hgt, None, font) + y2_geo.append(y_title2) + y2_label_pts = monthly_chart.y_axis_label_points2 + for txt, pt in zip(monthly_chart.y_axis_labels2, y2_label_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + y2_geo.append(txt_obj) + y2_axis = ContextGeometry('Y_Axis2', y2_geo) + y2_axis.display_name = y2_txt + vis_set.add_geometry(y2_axis) + + # add the title + title_txt = monthly_chart.title_text if global_title is None else global_title + ttl_pl = monthly_chart.lower_title_location + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + title = DisplayText3D(title_txt, ttl_pl, txt_hgt, None, font) + title_obj = ContextGeometry('Title', [title]) + vis_set.add_geometry(title_obj) + + # add the analysis geometry + legend = monthly_chart.legend + if monthly_chart.time_interval == 'MonthlyPerHour': + data_lines = [Polyline3D.from_polyline2d(line, bp) + for line in monthly_chart.data_polylines] + month_count = len(data_lines) / len(monthly_chart.data_collections) + data_vals = [int(i / month_count) for i, pline in enumerate(data_lines)] + vis_data = VisualizationData(data_vals, legend.legend_parameters) + a_geo = AnalysisGeometry('Analysis_Data', data_lines, [vis_data]) + else: + d_meshes = monthly_chart.data_meshes + data_mesh = [Mesh3D.from_mesh2d(msh, bp) for msh in d_meshes] + vis_data = VisualizationData(legend.values, legend.legend_parameters) + a_geo = AnalysisGeometry('Analysis_Data', data_mesh, [vis_data]) + if monthly_chart.time_interval == 'Monthly': + a_geo.display_mode = 'SurfaceWithEdges' + elif monthly_chart.time_interval == 'Daily': + a_geo.display_mode = 'Surface' + else: + out_geo = [] + for line in monthly_chart.data_polylines: + line3d = Polyline3D.from_polyline2d(line, bp) + out_geo.append(DisplayPolyline3D(line3d)) + data_outline = ContextGeometry('Data_Outlines', out_geo) + data_outline.display_name = 'Data Outlines' + vis_set.add_geometry(data_outline) + vis_set.add_geometry(a_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/psychchart.html b/docs/_modules/ladybug_display/extension/psychchart.html new file mode 100644 index 0000000..e3776a5 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/psychchart.html @@ -0,0 +1,1153 @@ + + + + + + + ladybug_display.extension.psychchart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.psychchart

+"""Method to draw an PsychrometricChart as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
+    Polyline3D, Mesh3D
+from ladybug.datatype.time import Time
+from ladybug.datacollection import BaseCollection
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def psychrometric_chart_to_vis_set( + psych_chart, data=None, legend_parameters=None, z=0, plot_wet_bulb=False): + """Get a Ladybug PsychrometricChart represented as a VisualizationSet. + + Args: + psych_chart: A Ladybug PsychrometricChart object. + data: An optional list of data collection objects, which are aligned with + the psychrometric chart temperature and relative_humidity and will + generate additional colored AnalysisGeometries on the chart. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the psychrometric + chart. Note that this relates only to the data supplied as input + for this method and, to customize the display of the time/frequency + mesh, the PsychrometricChart's native legend_parameters should be + edited. If a list is used here, this should align with the input data + (one legend parameter per data collection). + z: A number for the Z-coordinate to be used in translation. (Default: 0). + plot_wet_bulb: Boolean to note whether the psychrometric chart should be + plotted with lines of constant enthalpy (False) or lines of constant + wet bulb temperature (True). (Default: False). + + Returns: + A VisualizationSet with the psychrometric chart represented several + ContextGeometries and an AnalysisGeometry. This includes these objects + in the following order. + + - Title -- A ContextGeometry for the title and border around the + psychrometric chart. + + - Temperature_Axis -- A ContextGeometry with lines and text for the + Temperature (X) axis of the psychrometric chart. + + - Humidity_Axis -- A ContextGeometry with lines and text for the + Humidity (Y) axis of the psychrometric chart. + + - Relative_Humidity_Lines -- A ContextGeometry with lines and text + for the relative humidity of the psychrometric chart. + + - Enthalpy_Lines -- A ContextGeometry with lines and text for the + enthalpy of the psychrometric chart. This layer will not be + included if plot_wet_bulb is True. + + - Wet_Bulb_Lines -- A ContextGeometry with lines and text for the wet bulb + temperature of the psychrometric chart. This layer will not be + included if plot_wet_bulb is False. + + - Analysis_Data -- An AnalysisGeometry for the data on the psychrometric + chart. This will include multiple data sets if the data input + is provided. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet('Psychrometric_Chart', ()) + vis_set.display_name = 'Psychrometric Chart' + + # get values used throughout the translation + txt_hgt = psych_chart.legend_parameters.text_height + font = psych_chart.legend_parameters.font + bp = Plane(o=Point3D(0, 0, z)) + + # add the title and border + if isinstance(psych_chart.temperature, BaseCollection): + meta_i = psych_chart.temperature.header.metadata.items() + title_items = ['Time [hr]'] + ['{}: {}'.format(k, v) for k, v in meta_i] + else: + title_items = ['Psychrometric Chart'] + ttl_pl = psych_chart.container.upper_title_location + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + ttl_txt = DisplayText3D( + '\n'.join(title_items), ttl_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + border_geo = Polyline3D.from_polyline2d(psych_chart.chart_border, bp) + sat_geo = Polyline3D.from_polyline2d(psych_chart.saturation_line, bp) + title_objs = [ttl_txt, DisplayPolyline3D(sat_geo, line_width=2), + DisplayPolyline3D(border_geo, line_width=2)] + title = ContextGeometry('Title', title_objs) + vis_set.add_geometry(title) + + # add the temperature axis + tm_pl = _plane_from_point(psych_chart.x_axis_location, z) + temp_txt = DisplayText3D( + psych_chart.x_axis_text, tm_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + temp_geo = [temp_txt] + for tl in psych_chart.temperature_lines: + tl_geo = LineSegment3D.from_line_segment2d(tl, z) + temp_geo.append(DisplayLineSegment3D(tl_geo)) + tl_pts = psych_chart.temperature_label_points + for txt, pt in zip(psych_chart.temperature_labels, tl_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + temp_geo.append(txt_obj) + temp_axis = ContextGeometry('Temperature_Axis', temp_geo) + temp_axis.display_name = 'Temperature Axis' + vis_set.add_geometry(temp_axis) + + # add the humidity axis + hr_pl = _plane_from_point(psych_chart.y_axis_location, z, Vector3D(0, 1)) + hr_txt = DisplayText3D( + psych_chart.y_axis_text, hr_pl, txt_hgt * 1.5, None, font, 'Right', 'Top') + hr_geo = [hr_txt] + for hl in psych_chart.hr_lines: + hl_geo = LineSegment3D.from_line_segment2d(hl, z) + hr_geo.append(DisplayLineSegment3D(hl_geo)) + for txt, pt in zip(psych_chart.hr_labels, psych_chart.hr_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + hr_geo.append(txt_obj) + hr_axis = ContextGeometry('Humidity_Axis', hr_geo) + hr_axis.display_name = 'Humidity Axis' + vis_set.add_geometry(hr_axis) + + # add the relative humidity lines + rh_geo = [] + for rl in psych_chart.rh_lines: + rl_geo = Polyline3D.from_polyline2d(rl, bp) + rh_geo.append(DisplayPolyline3D(rl_geo)) + for txt, pt in zip(psych_chart.rh_labels[:-1], psych_chart.rh_label_points[:-1]): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt * 0.8, None, font, 'Right', 'Middle') + rh_geo.append(txt_obj) + rh_axis = ContextGeometry('Relative_Humidity_Lines', rh_geo) + rh_axis.display_name = 'Relative Humidity Lines' + vis_set.add_geometry(rh_axis) + + # add enthalpy or wet bulb lines + if plot_wet_bulb: + wb_geo = [] + for wl in psych_chart.wb_lines: + wl_geo = LineSegment3D.from_line_segment2d(wl, z) + wb_geo.append(DisplayLineSegment3D(wl_geo, line_type='Dotted')) + for txt, pt in zip(psych_chart.wb_labels, psych_chart.wb_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + wb_geo.append(txt_obj) + wb_axis = ContextGeometry('Wet_Bulb_Lines', wb_geo) + wb_axis.display_name = 'Wet Bulb Lines' + vis_set.add_geometry(wb_axis) + else: + enth_geo = [] + for wl in psych_chart.enthalpy_lines: + wl_geo = LineSegment3D.from_line_segment2d(wl, z) + enth_geo.append(DisplayLineSegment3D(wl_geo, line_type='Dotted')) + enth_pts = psych_chart.enthalpy_label_points + for txt, pt in zip(psych_chart.enthalpy_labels, enth_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + enth_geo.append(txt_obj) + enth_axis = ContextGeometry('Enthalpy_Lines', enth_geo) + enth_axis.display_name = 'Enthalpy Lines' + vis_set.add_geometry(enth_axis) + + # add the analysis geometry + # ensure 3D legend defaults are overridden to make the data readable + l_par = psych_chart.legend.legend_parameters.duplicate() + l_par.base_plane = l_par.base_plane + l_par.segment_height = l_par.segment_height + l_par.segment_width = l_par.segment_width + # gather all of the visualization data sets + vis_data = [VisualizationData(psych_chart.hour_values, l_par, Time(), 'hr')] + if data is not None and len(data) != 0: + if legend_parameters is None: + l_pars = [LegendParameters()] * len(data) + elif isinstance(legend_parameters, LegendParameters): + l_pars = [legend_parameters] * len(data) + else: # assume it's a list that aligns with the data + l_pars = legend_parameters + for dat, lp in zip(data, l_pars): + # process the legend parameters + lp = lp.duplicate() + if lp.is_base_plane_default: + lp.base_plane = l_par.base_plane + if lp.is_segment_height_default: + lp.segment_height = l_par.segment_height + if lp.is_segment_width_default: + lp.segment_width = l_par.segment_width + # check to be sure the data collection aligns + d_vals = dat.values + assert len(d_vals) == psych_chart._calc_length, \ + 'Number of data collection values ' \ + 'must match those of the psychrometric chart temperature and humidity.' + # create a matrix with a tally of the hours for all the data + base_mtx = [[[] for val in psych_chart._t_category] + for rh in psych_chart._rh_category] + for t, rh, v in zip(psych_chart._t_values, psych_chart._rh_values, d_vals): + if t < psych_chart._min_temperature or t > psych_chart._max_temperature: + continue # temperature value does not currently fit on the chart + for y, rh_cat in enumerate(psych_chart._rh_category): + if rh < rh_cat: + break + for x, t_cat in enumerate(psych_chart._t_category): + if t < t_cat: + break + base_mtx[y][x].append(v) + # compute average values + avg_values = [sum(val_list) / len(val_list) for rh_l in base_mtx + for val_list in rh_l if len(val_list) != 0] + hd = dat.header + vd = VisualizationData(avg_values, lp, hd.data_type, hd.unit) + vis_data.append(vd) + # create the analysis geometry + mesh_3d = Mesh3D.from_mesh2d(psych_chart.colored_mesh, bp) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [mesh_3d], vis_data, active_data=len(vis_data) - 1) + mesh_geo.display_name = 'Analysis Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _plane_from_point(point_2d, z, align_vec=Vector3D(1, 0, 0)): + """Get a Plane from a Point2D. + + Args: + point_2d: A Point2D to serve as the origin of the plane. + z: The Z value for the plane origin. + align_vec: A Vector3D to serve as the X-Axis of the plane. + """ + return Plane(o=Point3D(point_2d.x, point_2d.y, z), x=align_vec) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/raddome.html b/docs/_modules/ladybug_display/extension/raddome.html new file mode 100644 index 0000000..95e1d55 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/raddome.html @@ -0,0 +1,1050 @@ + + + + + + + ladybug_display.extension.raddome — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.raddome

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane
+
+from ladybug_display.geometry3d import DisplayPoint3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_dome_to_vis_set(radiation_dome, show_components=False, include_title=True): + """Translate radiation dome geometry into a VisualizationSet. + + Args: + radiation_dome: A Ladybug-Radiance RadiationDome object. + show_components: Boolean to indicate whether only one dome with total radiation + should be displayed (False) or three domes with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the radiation dome represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the dome. + + - Max_Info -- A ContextGeometry with a Point and text for the maximum + radiation occurring on the dome. + + - Title -- A ContextGeometry with text for the title of the dome. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the radiation dome data. + """ + # extract properties relevant for the Compass + cent_pt = radiation_dome.center_point + radius = radiation_dome.radius + proj = radiation_dome.projection + az = radiation_dome.azimuth_count + + # create the dome visualization + if not show_components: # only create the total dome mesh + mesh, compass_obj, dome_graphic, title_txt = radiation_dome.draw() + compass, title = _translate_context( + compass_obj, dome_graphic, title_txt, cent_pt, proj, az) + mesh, title = [mesh], [title] + mesh_values = radiation_dome.total_values + else: # create domes for total, direct and diffuse + # loop through the 3 radiation types and produce a dome + mesh, compass, title, mesh_values = [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for dome_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * dome_i, cent_pt.y, cent_pt.z) + dome_mesh, dome_compass, dome_graphic, dome_title = \ + radiation_dome.draw(rad_types[dome_i], c_pt) + compass_con, title_con = _translate_context( + dome_compass, dome_graphic, dome_title, cent_pt, proj, az) + mesh.append(dome_mesh) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend( + getattr(radiation_dome, '{}_values'.format(rad_types[dome_i]))) + + # create the visualization set object + vis_set = VisualizationSet('RadiationDome', ()) + vis_set.display_name = 'Radiation Dome' + + # create all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + m_pt = radiation_dome.max_point + txt_hgt = dome_graphic.legend_parameters.text_height * 0.5 + max_pt = DisplayPoint3D(m_pt, radius=3) + m_pl = Plane(o=Point3D(m_pt.x, m_pt.y - txt_hgt * 1.5, m_pt.z + 0.01), + n=Vector3D(0, 0, 1)) + max_info = DisplayText3D( + radiation_dome.max_info, m_pl, txt_hgt, None, + dome_graphic.legend_parameters.font, 'Center', 'Top') + max_geo = ContextGeometry('Max_Info', (max_pt, max_info)) + max_geo.display_name = 'Max Info' + vis_set.add_geometry(max_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, radiation_dome.legend_parameters, + dome_graphic.data_type, dome_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = dome_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, graphic, title_txt, cent_pt, projection, az_count): + """Translate radiation dome geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + graphic: A GraphicContainer for the dome. + title_txt: Text for title of the dome. + cent_pt: The center point of the dome. + project: Text for the projection of the radiation dome. + az_count: The number of azimuth directions in the dome. + + Returns: + dome_compass: A ContextGeometry for the dome compass. + dome_title: DisplayText3D for the title for the dome. + """ + dome_angles = list(range(0, 360, int(360 / az_count))) + start, stop, step, dome_angles = 0, 360, 360 / az_count, [] + while start < stop: + dome_angles.append(start) + start += step + dome_angles = [int(n) for n in dome_angles] + if len(dome_angles) > 36: + dome_angles = dome_angles[::2] + dome_compass = compass.to_vis_set( + cent_pt.z, dome_angles, projection, graphic.legend_parameters.font)[0] + dome_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return dome_compass, dome_title +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/radrose.html b/docs/_modules/ladybug_display/extension/radrose.html new file mode 100644 index 0000000..8468e21 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/radrose.html @@ -0,0 +1,1053 @@ + + + + + + + ladybug_display.extension.radrose — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.radrose

+"""Method to draw a RadiationRose as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_rose_to_vis_set( + radiation_rose, max_rad=None, show_components=False, include_title=True): + """Translate radiation rose geometry into a format suitable for Rhino. + + Args: + radiation_rose: A Ladybug-Radiance RadiationRose object. + max_rad: An optional number to set the level of radiation or irradiance + associated with the full radius of the rose. If None, this is + determined by the maximum level of radiation in the input data + but a number can be specified here to fix this at a specific value. + This is particularly useful when comparing different roses to one + another. (Default: None). + show_components: Boolean to indicate whether only one rose with total radiation + should be displayed (False) or three roses with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the radiation rose represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the rose. + + - Orientation_Lines -- A ContextGeometry with lines representing the + edges (or "spokes") of the wind rose directions. + + - Title -- A ContextGeometry with text for the title of the rose. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the radiation rose data. + """ + # extract properties relevant for the Compass + cent_pt = radiation_rose.center_point + radius = radiation_rose.radius + d_count = radiation_rose.direction_count + + # create the rose visualization + if not show_components: # only create the total rose mesh + mesh, orient, compass_obj, rose_graphic, title_txt = \ + radiation_rose.draw(max_rad=max_rad) + compass, orient_lines, title = _translate_context( + compass_obj, orient, rose_graphic, title_txt, cent_pt, d_count) + mesh, title = [mesh], [title] + mesh_values = radiation_rose.total_values + else: # create roses for total, direct and diffuse + # loop through the 3 radiation types and produce a rose + mesh, orient_lines, compass, title, mesh_values = [], [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for rose_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * rose_i, cent_pt.y, cent_pt.z) + rose_mesh, orient, rose_compass, rose_graphic, rose_title = \ + radiation_rose.draw(rad_types[rose_i], c_pt, max_rad=max_rad) + compass_con, orient_con, title_con = _translate_context( + rose_compass, orient, rose_graphic, rose_title, cent_pt, d_count) + mesh.append(rose_mesh) + orient_lines.extend(orient_con) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend( + getattr(radiation_rose, '{}_values'.format(rad_types[rose_i]))) + + # create the visualization set object + vis_set = VisualizationSet('RadiationRose', ()) + vis_set.display_name = 'Radiation Rose' + + # create all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + orient_geo = ContextGeometry('Orientation_Lines', orient_lines) + vis_set.display_name = 'Orientation Lines' + vis_set.add_geometry(orient_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, radiation_rose.legend_parameters, + rose_graphic.data_type, rose_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = rose_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, dir_lines, graphic, title_txt, cent_pt, dir_count): + """Translate radiation rose geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + dir_lines: Line segments for each of the directions plotted on the rose. + graphic: A GraphicContainer for the rose. + title_txt: Text for title of the rose. + cent_pt: The center point of the sky rose. + dir_count: The number of directions in the rose. + + Returns: + rose_compass: A ContextGeometry for the rose compass. + rose_lines: DisplayLineSegment3D for the directions of the rose. + rose_title: DisplayText3D for the title for the rose. + """ + rose_angles = list(range(0, 360, int(360 / dir_count))) + start, stop, step, rose_angles = 0, 360, 360 / dir_count, [] + while start < stop: + rose_angles.append(start) + start += step + rose_angles = [int(n) for n in rose_angles] + if len(rose_angles) > 36: + rose_angles = rose_angles[::2] + rose_compass = compass.to_vis_set( + cent_pt.z, rose_angles, None, graphic.legend_parameters.font)[0] + rose_lines = [DisplayLineSegment3D(lin, line_width=1, line_type='Dotted') + for lin in dir_lines] + rose_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return rose_compass, rose_lines, rose_title +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/skydome.html b/docs/_modules/ladybug_display/extension/skydome.html new file mode 100644 index 0000000..9aa42e7 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/skydome.html @@ -0,0 +1,1022 @@ + + + + + + + ladybug_display.extension.skydome — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.skydome

+"""Method to draw a SkyDome as a VisualizationSet."""
+from ladybug_geometry.geometry3d.pointvector import Point3D
+
+from ladybug_display.geometry3d import DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def sky_dome_to_vis_set(sky_dome, show_components=False, include_title=True): + """Translate sky dome geometry into a VisualizationSet. + + Args: + sky_dome: A Ladybug-Radiance SkyDome object. + show_components: Boolean to indicate whether only one dome with total radiation + should be displayed (False) or three domes with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the sky dome represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the sky dome. + + - Title -- A ContextGeometry with text for the title of the sky dome. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the sky dome data. + """ + # extract properties relevant for the Compass + cent_pt, radius, proj = sky_dome.center_point, sky_dome.radius, sky_dome.projection + + # create the dome visualization + if not show_components: # only create the total dome mesh + mesh, compass_obj, dome_graphic, title_txt, mesh_values = sky_dome.draw() + compass, title = _translate_context( + compass_obj, dome_graphic, title_txt, cent_pt, proj) + mesh, title = [mesh], [title] + else: # create domes for total, direct and diffuse + # loop through the 3 radiation types and produce a dome + mesh, compass, title, mesh_values = [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for dome_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * dome_i, cent_pt.y, cent_pt.z) + dome_mesh, dome_compass, dome_graphic, dome_title, dome_values = \ + sky_dome.draw(rad_types[dome_i], c_pt) + compass_con, title_con = _translate_context( + dome_compass, dome_graphic, dome_title, cent_pt, proj) + mesh.append(dome_mesh) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend(dome_values) + + # create the visualization set object + vis_set = VisualizationSet('SkyDome', ()) + vis_set.display_name = 'Sky Dome' + + # merge all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, sky_dome.legend_parameters, + dome_graphic.data_type, dome_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = dome_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, graphic, title_txt, cent_pt, projection): + """Translate sky dome geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + graphic: A GraphicContainer for the dome. + title_txt: Text for title of the dome. + cent_pt: The center point of the sky dome. + project: Text for the projection of the sky dome. + + Returns: + dome_compass: A ContextGeometry for the dome compass. + dome_title: DisplayText3D for the title for the dome. + """ + dome_compass = compass.to_vis_set( + cent_pt.z, None, projection, graphic.legend_parameters.font)[0] + dome_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return dome_compass, dome_title +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/study/directsun.html b/docs/_modules/ladybug_display/extension/study/directsun.html new file mode 100644 index 0000000..e6c03e6 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/study/directsun.html @@ -0,0 +1,1013 @@ + + + + + + + ladybug_display.extension.study.directsun — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.study.directsun

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.geometry3d import Mesh3D
+from ladybug.color import Colorset, Color
+from ladybug.legend import LegendParameters
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.time import Time
+
+from ladybug_display.geometry3d import DisplayText3D, DisplayMesh3D, DisplayFace3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def direct_sun_study_to_vis_set( + direct_sun_study, legend_parameters=None, + include_title=True, include_context=False): + """Translate direct sun study into a VisualizationSet. + + Args: + direct_sun_study: A Ladybug-Radiance DirectSunStudy object. + legend_parameters: An optional LegendParameter object to change the display + of the direct sun study. If None, default legend parameters will be + used. (Default: None). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + include_context: Boolean to note whether the context geometry should be + included in the output visualization. (Default: False). + + Returns: + A VisualizationSet with the direct sun study represented as an + AnalysisGeometry. This includes these objects in the following order. + + - Direct_Sun_Data -- An AnalysisGeometry for the direct sun data. + + - Title -- A ContextGeometry with text for the title of the study. + This layer will be excluded if include_title is False. + + - Context_Geometry -- A ContextGeometry with the shading context used + in the study. This layer will be excluded when include_context is False. + """ + # process the legend parameters and override the legend colors + if legend_parameters is not None: + assert isinstance(legend_parameters, LegendParameters), \ + 'Expected LegendParameters. Got {}.'.format(type(legend_parameters)) + l_par = legend_parameters.duplicate() + else: + l_par = LegendParameters() + if l_par.are_colors_default: + l_par.colors = Colorset.ecotect() + + # create the visualization set object + vis_set = VisualizationSet('DirectSunStudy', ()) + vis_set.display_name = 'Direct Sun Study' + d_type, unit = Time(), 'hr' + sun_data = direct_sun_study.direct_sun_hours + + # create the AnalysisGeometry + vis_data = VisualizationData(sun_data, l_par, d_type, unit) + mesh_geo = AnalysisGeometry( + 'Direct_Sun_Data', [direct_sun_study.study_mesh], [vis_data]) + mesh_geo.display_name = 'Direct Sun Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + # create the ContextGeometry for the title + if include_title: + all_geo = (direct_sun_study.study_mesh,) + direct_sun_study.context_geometry + min_pt, max_pt = bounding_box(all_geo) + graphic = GraphicContainer( + sun_data, min_pt, max_pt, l_par, d_type, unit) + study_title = DisplayText3D( + 'Direct Sun Hours', graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + title_geo = ContextGeometry('Title', [study_title]) + vis_set.add_geometry(title_geo) + + # create the ContextGeometry for the context + if include_context: + con_color = Color(125, 125, 125, 125) + con_geos = [] + for geo in direct_sun_study.context_geometry: + if isinstance(geo, Mesh3D): + con_geos.append(DisplayMesh3D(geo, con_color)) + else: # it's a Face3D + con_geos.append(DisplayFace3D(geo, con_color)) + context_geo = ContextGeometry('Context_Geometry', con_geos) + context_geo.display_name = 'Context Geometry' + vis_set.add_geometry(context_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/study/radiation.html b/docs/_modules/ladybug_display/extension/study/radiation.html new file mode 100644 index 0000000..c939efe --- /dev/null +++ b/docs/_modules/ladybug_display/extension/study/radiation.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.extension.study.radiation — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.study.radiation

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.geometry3d import Mesh3D
+from ladybug.color import Colorset, Color
+from ladybug.legend import LegendParameters
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.energyintensity import Radiation
+from ladybug.datatype.energyflux import Irradiance
+
+from ladybug_display.geometry3d import DisplayText3D, DisplayMesh3D, DisplayFace3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_study_to_vis_set( + radiation_study, legend_parameters=None, plot_irradiance=False, + include_title=True, include_context=False): + """Translate radiation study into a VisualizationSet. + + Args: + radiation_study: A Ladybug-Radiance RadiationStudy object. + legend_parameters: An optional LegendParameter object to change the display + of the radiation study. If None, default legend parameters will be + used. (Default: None). + plot_irradiance: Boolean to note whether the results should be plotted + with units of total Radiation (kWh/m2) [False] or with units of average + Irradiance (W/m2) [True]. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + include_context: Boolean to note whether the context geometry should be + included in the output visualization. (Default: False). + + Returns: + A VisualizationSet with the radiation study represented as an + AnalysisGeometry. This includes these objects in the following order. + + - Radiation_Data -- An AnalysisGeometry for the radiation data. + + - Title -- A ContextGeometry with text for the title of the study. + This layer will be excluded if include_title is False. + + - Context_Geometry -- A ContextGeometry with the shading context used + in the study. This layer will be excluded when include_context is False. + """ + # get the radiation data + if plot_irradiance: + d_type, unit, title = Irradiance(), 'W/m2', 'Incident Irradiance' + rad_data = radiation_study.irradiance_values + else: + d_type, unit, title = Radiation(), 'kWh/m2', 'Incident Radiation' + rad_data = radiation_study.radiation_values + if radiation_study.is_benefit: + title = '{} Benefit/Harm'.format(title) + + # process the legend parameters and override the legend colors + if legend_parameters is not None: + assert isinstance(legend_parameters, LegendParameters), \ + 'Expected LegendParameters. Got {}.'.format(type(legend_parameters)) + l_par = legend_parameters.duplicate() + else: + l_par = LegendParameters() + if radiation_study.is_benefit: + if l_par.min is None: + l_par.min = min((min(rad_data), -max(rad_data))) + if l_par.max is None: + l_par.max = max((-min(rad_data), max(rad_data))) + if l_par.are_colors_default: + l_par.colors = reversed(Colorset.benefit_harm()) + else: + if l_par.min is None: + l_par.min = 0 + if l_par.max is None: + l_par.max = max(rad_data) + + # create the visualization set object + vis_set = VisualizationSet('RadiationStudy', ()) + vis_set.display_name = 'Radiation Study' + + # create the AnalysisGeometry + vis_data = VisualizationData(rad_data, l_par, d_type, unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', [radiation_study.study_mesh], [vis_data]) + mesh_geo.display_name = 'Radiation Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + # create the ContextGeometry for the title + if include_title: + all_geo = (radiation_study.study_mesh,) + radiation_study.context_geometry + min_pt, max_pt = bounding_box(all_geo) + graphic = GraphicContainer( + rad_data, min_pt, max_pt, l_par, d_type, unit) + study_title = DisplayText3D( + title, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + title_geo = ContextGeometry('Title', [study_title]) + vis_set.add_geometry(title_geo) + + # create the ContextGeometry for the context + if include_context: + con_color = Color(125, 125, 125, 125) + con_geos = [] + for geo in radiation_study.context_geometry: + if isinstance(geo, Mesh3D): + con_geos.append(DisplayMesh3D(geo, con_color)) + else: # it's a Face3D + con_geos.append(DisplayFace3D(geo, con_color)) + context_geo = ContextGeometry('Context_Geometry', con_geos) + context_geo.display_name = 'Context Geometry' + vis_set.add_geometry(context_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/sunpath.html b/docs/_modules/ladybug_display/extension/sunpath.html new file mode 100644 index 0000000..40c4c5f --- /dev/null +++ b/docs/_modules/ladybug_display/extension/sunpath.html @@ -0,0 +1,1122 @@ + + + + + + + ladybug_display.extension.sunpath — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.sunpath

+"""Method to draw a Sunpath as a VisualizationSet."""
+from ladybug_geometry.geometry2d.pointvector import Point2D
+from ladybug_geometry.geometry3d import Point3D, Plane, Polyline3D, Sphere
+from ladybug.dt import Date
+from ladybug.color import Color
+from ladybug.legend import LegendParameters
+from ladybug.compass import Compass
+
+from ..geometry3d import DisplayPoint3D, DisplayArc3D, DisplayPolyline3D, DisplaySphere
+from ..visualization import VisualizationSet, \
+    ContextGeometry, AnalysisGeometry, VisualizationData
+from .compass import compass_to_vis_set
+
+
+
[docs]def sunpath_to_vis_set( + sunpath, hoys=None, data=None, legend_parameters=None, + radius=100, center_point=Point3D(0, 0, 0), + solar_time=False, daily=False, projection=None, sun_spheres=False): + """Get a Ladybug Sunpath represented as a VisualizationSet. + + Args: + sunpath: A Ladybug Sunpath object. + hoys: An optional list of numbers between 0 and 8760 that represent the + hours of the year at which the sun position will be displayed. + The Ladybug AnalysisPeriod class can output a list of HOYs within + a certain hour or date range. (Default: None). + data: An optional list of hourly data collection objects, which will + generate colored sun positions for each of the hoys. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the sun path. If a + list is used, these should align with the input data (one legend + parameter per data collection). + radius: Number for the radius of the sun path. (Default: 100). + center_point: Point3D for the center of the sun path. (Default: (0, 0, 0)). + solar_time: A boolean to indicate if the sunpath should be drawn with solar + time hours instead of standard or daylight time. (Default: False) + daily: Boolean to note whether the sunpath should display only one daily + arc for each unique day in the input hoys_ (True) or whether the + output sun path geometry should be for the entire year, complete + with analemmas for all sun-up hours and a daily arc for each + month (False). (Default: False) + projection: Optional text for the name of a projection to use from the sky + dome hemisphere to the 2D plane. If None, a 3D sun path will be drawn + instead of a 2D one. (Default: None) Choose from the following: + * Orthographic + * Stereographic + sun_spheres: Boolean to note whether sun positions should be drawn as points + or as fully-detailed spheres. Note that this option should only be + used when there are relatively few hoys input. Anything more than + 100 hoys can make the display very slow. (Default: False). + + Returns: + A VisualizationSet with the Sunpath represented several ContextGeometries + (and optionally an AnalysisGeometry if data is input). This includes these + objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the sunpath. + + - Analemmas -- A ContextGeometry for the analemmas of the sunpath (if + the daily input is False). + + - Daily_Arcs -- A ContextGeometry for the daily arcs across the sunpath. + + - Sun_Positions -- Either a ContextGeometry or an AnalysisGeometry for + the sun positions (if hoys are input). The object will be an + AnalysisGeometry if data is input, indicating that suns are colored + with this data. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet( + 'Sunpath_{}_{}'.format(int(sunpath.latitude), int(sunpath.longitude)), ()) + vis_set.display_name = 'Sunpath' + + # add the compass to the bottom of the path + center_2d = Point2D(center_point.x, center_point.y) + compass = Compass(radius, center_2d, sunpath.north_angle) + compass_vis = compass_to_vis_set(compass, z=center_point.z, projection=projection) + vis_set.add_geometry(compass_vis[0]) + + # create a intersection of the input hoys and the data hoys (if provided) + if data is not None and len(data) > 0 and hoys is not None and len(hoys) > 0: + all_aligned = all(data[0].is_collection_aligned(d) for d in data[1:]) + assert all_aligned, 'All collections input to data must be aligned for ' \ + 'each Sunpath.\nGrafting the data and supplying multiple grafted ' \ + '_center_pt_ can be used to view each data on its own path.' + data_hoys = set(dt.hoy for dt in data[0].datetimes) + hoys = list(data_hoys.intersection(set(hoys))) + + # get the relevant sus and datetimes + suns, datetimes, moys = [], [], [] + if hoys is not None and len(hoys) > 0: + for hoy in hoys: + sun = sunpath.calculate_sun_from_hoy(hoy, solar_time) + if sun.is_during_day: + suns.append(sun) + datetimes.append(sun.datetime) + moys.append(sun.datetime.moy) + + # add the daily arcs and analemmas to the visualization set + original_dls = sunpath.daylight_saving_period + sunpath.daylight_saving_period = None # set here so analemmas aren't messed up + center_pt, z = Point2D(center_point.x, center_point.y), center_point.z + if not daily: + if projection is None: + # draw arcs and analemmas in 3D + ana_plin_1 = sunpath.hourly_analemma_polyline3d( + center_point, radius, True, solar_time, 1, 6, 4) + ana_plin_2 = sunpath.hourly_analemma_polyline3d( + center_point, radius, True, solar_time, 7, 12, 4) + analemma = [DisplayPolyline3D(pl, line_width=1) for pl in ana_plin_1] + \ + [DisplayPolyline3D(pl, line_width=1, line_type='Dashed') + for pl in ana_plin_2] + daily_arc = sunpath.monthly_day_arc3d(center_point, radius) + daily = [] + for i, arc in enumerate(daily_arc): + lw = 2 if (i + 1) % 6 == 0 else 1 + lt = 'Continuous' if i <= 5 else 'Dashed' + daily.append(DisplayArc3D(arc, line_width=lw, line_type=lt)) + else: + # draw arcs and analemmas in the requested projection + bp = Plane(o=Point3D(0, 0, z)) + ana_plin_1 = sunpath.hourly_analemma_polyline2d( + projection, center_point, radius, True, solar_time, 1, 6, 4) + ana_plin_2 = sunpath.hourly_analemma_polyline2d( + projection, center_point, radius, True, solar_time, 7, 12, 4) + analemma = \ + [DisplayPolyline3D(Polyline3D.from_polyline2d(p, bp), line_width=1) + for p in ana_plin_1] + \ + [DisplayPolyline3D( + Polyline3D.from_polyline2d(p, bp), line_width=1, line_type='Dashed') + for p in ana_plin_2] + daily_arc = sunpath.monthly_day_polyline2d( + projection, center_point, radius, divisions=30) + daily = [] + for i, arc in enumerate(daily_arc): + lw = 2 if (i + 1) % 6 == 0 else 1 + lt = 'Continuous' if i <= 5 else 'Dashed' + pline = Polyline3D.from_polyline2d(arc, bp) + daily.append(DisplayPolyline3D(pline, line_width=lw, line_type=lt)) + analemma_geo = ContextGeometry('Analemmas', analemma) + vis_set.add_geometry(analemma_geo) + else: + # just draw daily arcs without the analemmas + doys = set(dt.doy for dt in datetimes) + dates = [Date.from_doy(doy) for doy in doys] + if projection is None: + daily = [] + for dat in dates: + d_arc = sunpath.day_arc3d(dat.month, dat.day, center_point, radius) + daily.append(DisplayArc3D(d_arc, line_width=1)) + else: + bp = Plane(o=Point3D(0, 0, z)) + daily = [] + for dat in dates: + d_arc = sunpath.day_polyline2d( + dat.month, dat.day, projection, center_pt, radius, divisions=30) + daily.append(DisplayPolyline3D( + Polyline3D.from_polyline2d(d_arc, bp), line_width=1)) + if len(daily) != 0: + daily_geo = ContextGeometry('Daily_Arcs', daily) + daily_geo.display_name = 'Daily Arcs' + vis_set.add_geometry(daily_geo) + sunpath.daylight_saving_period = original_dls # put back to avoid mutation + + # plot the sun positions as points on the sunpath + if hoys is not None and len(hoys) > 0: + # get Point3Ds for all of the sun positions + if projection is None: + sun_pts = [sun.position_3d(center_point, radius) for sun in suns] + else: + sun_pts = [] + for sun in suns: + pt2d = sun.position_2d(projection, center_point, radius) + sun_pts.append(Point3D.from_point2d(pt2d, z)) + if sun_spheres: + sun_pts = [Sphere(pt, radius / 30) for pt in sun_pts] + # plot the sun positions as either context or analysis geometry + if data is not None and len(data) > 0: + # plot points as context or analysis geometry (if data is connected) + if isinstance(legend_parameters, LegendParameters): + legend_parameters = [legend_parameters] * len(data) + all_data = [] + for i, dat_c in enumerate(data): + l_par = legend_parameters[i] if legend_parameters is not None else None + n_data = dat_c.filter_by_moys(moys) # filter data by sun-up hours + v_data = VisualizationData( + n_data.values, l_par, dat_c.header.data_type, dat_c.header.unit) + all_data.append(v_data) + sun_geo = AnalysisGeometry('Sun_Positions', sun_pts, all_data) + else: # otherwise, plot the suns as context geometry + orange = Color(255, 165, 0) + if sun_spheres: + dis_pts = [DisplaySphere(pt, color=orange) for pt in sun_pts] + else: + dis_pts = [DisplayPoint3D(pt, color=orange, radius=5) for pt in sun_pts] + sun_geo = ContextGeometry('Sun_Positions', dis_pts) + sun_geo.display_name = 'Sun Positions' + vis_set.add_geometry(sun_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/windprofile.html b/docs/_modules/ladybug_display/extension/windprofile.html new file mode 100644 index 0000000..6fee9fb --- /dev/null +++ b/docs/_modules/ladybug_display/extension/windprofile.html @@ -0,0 +1,1084 @@ + + + + + + + ladybug_display.extension.windprofile — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.windprofile

+"""Method to draw a WindProfile as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D
+
+from ladybug.datatype.speed import WindSpeed
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayMesh3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def wind_profile_to_vis_set( + profile, meteorological_wind_speed=5, direction=None, + legend_parameters=None, base_point=Point3D(0, 0, 0), + max_height=30, vector_spacing=2, + vector_length_dimension=5, vector_height_dimension=1, + max_speed=None, scale_factor=1, feet_labels=False): + """Get a Ladybug WindProfile represented as a VisualizationSet. + + Args: + profile: A Ladybug WindProfile object. + meteorological_wind_speed: A number for the meteorological wind speed [m/s]. + This is usually for a point in time or it is the average wind speed + over a range of times. (Default: 5). + direction: An optional number between 0 and 360 that represents the + cardinal direction that the wind profile is facing in the XY + plane. 0 = North, 90 = East, 180 = South, 270 = West. Note that this + should already account for any difference between true North and + project North, which simply involves subtracting the counterclockwise + north angle from the wind direction. If None, the wind profile will + simply be placed in the XY plane. (Default: None). + legend_parameters: Optional LegendParameters to change the display of the + wind profile arrows. + base_point: A ladybug-geometry Point3D that represents the ground + location of the wind profile. (Default, (0, 0, 0)). + max_height: A number in meters to specify the maximum height of the + wind profile curve. (Default: 30 meters). + vector_spacing: A number in meters to specify the difference in height + between each of the mesh arrows. (Default 2 meters). + vector_length_dimension: A number to denote the length dimension of a 1 m/s + wind vector in meters. (Default: 5). + vector_height_dimension: A number to denote the height dimension of the + wind vector in meters. (Default: 1). + max_speed: A number for the maximum wind speed along the speed axis + in [m/s]. If None, it will be set automatically by the wind profile + maximum value. (Default: None). + scale_factor: An optional number that will be multiplied by all dimensions + to account for the fact that the wind profile may be displaying in + a units system other than meters. (Default: 1). + feet_labels: A boolean to note whether the text labels on the height axis + should be in feet (True) or meters (False). (Default: False). + + Returns: + A VisualizationSet with the wind profile represented several ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Arrows -- An AnalysisGeometry of colored mesh objects that represent + the wind speeds along the height of the wind profile. + + - Profile -- A Polyline outlining the wind speed as it changes + with height. + + - Speed_Axis -- A ContextGeometry of line segments and text objects + that mark the X axis, which relates to the wind speed in (m/s). + + - Height_Axis -- A ContextGeometry of line segments and text objects + that mark the Y axis, which relates to the the height above the ground. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet( + 'WindProfile_{}'.format(int(meteorological_wind_speed)), ()) + vis_set.display_name = 'Wind Profile' + + # shorten the names of the inputs to make them easier to work with + met_ws = meteorological_wind_speed + bp, len_d, height_d = base_point, vector_length_dimension, vector_height_dimension + + # generate the arrow geometries of the visualization + _, mesh_arrows, wind_speeds, wind_vectors, anchor_pts = \ + profile.mesh_arrow_profile( + met_ws, max_height, vector_spacing, direction, bp, + len_d, height_d, scale_factor) + + # customize the legend parameters to ensure the default legend looks good + legend_par = legend_parameters.duplicate() if legend_parameters is not None \ + else LegendParameters() + max_speed = round(wind_speeds[-1]) if max_speed is None else max_speed + max_pt = Point3D(bp.x + ((max_speed + 2) * len_d * scale_factor), + bp.y + (30 * scale_factor), bp.z) + # set the default segment_height + if legend_par.is_segment_height_default: + s_count = legend_par.segment_count + denom = s_count if s_count >= 8 else 8 + if legend_par.vertical: + seg_height = float((max_pt.y - bp.y) / denom) + if seg_height == 0: + seg_height = float((max_pt.x - bp.x) / denom) + else: + seg_height = float((max_pt.x - bp.x) / (denom * 2)) + if seg_height == 0: + seg_height = float((max_pt.y - bp.y) / denom) + legend_par.properties_3d.segment_height = seg_height + # set the default segment_width + if legend_par.is_segment_width_default: + if legend_par.vertical: + seg_width = legend_par.segment_height / 2 + else: + seg_width = legend_par.text_height * \ + (len(str(int(legend_par.max))) + legend_par.decimal_count + 2) + legend_par.properties_3d.segment_width = seg_width + # set the default base_plane + if legend_par.is_base_plane_default: + legend_par.base_plane = \ + profile.legend_plane(max_speed, direction, bp, len_d, scale_factor) + + # create an AnalysisGeometry for the colored arrows + vis_data = VisualizationData(wind_speeds, legend_par, WindSpeed(), 'm/s') + a_geo = AnalysisGeometry('Arrows', mesh_arrows, [vis_data]) + vis_set.add_geometry(a_geo) + + # create a ContextGeometry for the profile line + pl, _, _ = profile.profile_polyline3d( + met_ws, max_height, 0.1, direction, bp, len_d, scale_factor) + dis_profile_line = DisplayPolyline3D(pl, line_width=1) + profile_geo = ContextGeometry('Profile', [dis_profile_line]) + vis_set.add_geometry(profile_geo) + + # create a ContextGeometry for the speed axis + txt_h = legend_par.text_height + axis_line, axis_arrow, axis_ticks, text_planes, text = \ + profile.speed_axis(max_speed, direction, bp, len_d, scale_factor, txt_h) + speed_axis = [DisplayLineSegment3D(axis_line), DisplayMesh3D(axis_arrow)] + for tic in axis_ticks: + speed_axis.append(DisplayLineSegment3D(tic)) + for i, (pl, txt) in enumerate(zip(text_planes, text)): + txt_i_h = txt_h if i != len(text) - 1 else txt_h * 1.25 + txt_obj = DisplayText3D(txt, pl, txt_i_h, None, legend_par.font, 'Center', 'Top') + speed_axis.append(txt_obj) + speed_axis_geo = ContextGeometry('Speed_Axis', speed_axis) + speed_axis_geo.display_name = 'Speed Axis' + vis_set.add_geometry(speed_axis_geo) + + # create a ContextGeometry for the height axis + axis_line, axis_arrow, axis_ticks, text_planes, text = \ + profile.height_axis(max_height, vector_spacing * 2, direction, bp, + scale_factor, txt_h, feet_labels) + height_axis = [DisplayLineSegment3D(axis_line), DisplayMesh3D(axis_arrow)] + for tic in axis_ticks: + height_axis.append(DisplayLineSegment3D(tic)) + for i, (pl, txt) in enumerate(zip(text_planes, text)): + if i != len(text) - 1: + txt_i_h, ha, va = txt_h, 'Right', 'Middle' + else: + txt_i_h, ha, va = txt_h * 1.25, 'Center', 'Bottom' + txt_obj = DisplayText3D(txt, pl, txt_i_h, None, legend_par.font, ha, va) + height_axis.append(txt_obj) + height_axis_geo = ContextGeometry('Height_Axis', height_axis) + height_axis_geo.display_name = 'Height Axis' + vis_set.add_geometry(height_axis_geo) + + return vis_set
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/windrose.html b/docs/_modules/ladybug_display/extension/windrose.html new file mode 100644 index 0000000..19aea8f --- /dev/null +++ b/docs/_modules/ladybug_display/extension/windrose.html @@ -0,0 +1,1016 @@ + + + + + + + ladybug_display.extension.windrose — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

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
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/arc.html b/docs/_modules/ladybug_display/geometry2d/arc.html new file mode 100644 index 0000000..568a451 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/arc.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry2d.arc — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.arc

+"""An arc that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.arc import Arc2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayArc2D(_LineCurveBase2D): + """An arc in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Arc2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * c + * r + * p1 + * p2 + * length + * is_circle + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Arc2D), '\ + Expected ladybug_geometry Arc2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayArc2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayArc2D object. + """ + assert data['type'] == 'DisplayArc2D', \ + 'Expected DisplayArc2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Arc2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def c(self): + """Get a Point2D for the center of the arc.""" + return self._geometry.c + + @property + def r(self): + """Get a number for the radius of the arc.""" + return self._geometry.r + + @property + def p1(self): + """Get a Point2D representing the first end point of the arc.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second end point of the arc.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the arc.""" + return self._geometry.length + + @property + def is_circle(self): + """Get a boolean for whether the arc is a circle.""" + return self._geometry.is_circle + +
[docs] def to_dict(self): + """Return DisplayArc2D as a dictionary.""" + base = {'type': 'DisplayArc2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayArc2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayArc2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/line.html b/docs/_modules/ladybug_display/geometry2d/line.html new file mode 100644 index 0000000..99635b7 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/line.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.geometry2d.line — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.line

+"""A line segment that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.line import LineSegment2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayLineSegment2D(_LineCurveBase2D): + """A single line segment in 2D space with display properties. + + Args: + geometry: A ladybug-geometry LineSegment2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * p + * v + * p1 + * p2 + * length + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, LineSegment2D), '\ + Expected ladybug_geometry LineSegment2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayLineSegment2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayLineSegment2D object. + """ + assert data['type'] == 'DisplayLineSegment2D', \ + 'Expected DisplayLineSegment2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(LineSegment2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point2D representing the base of the line segment.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector2D representing the direction of the line segment.""" + return self._geometry.v + + @property + def p1(self): + """Get a Point2D representing the first point of the line segment.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second point of the line segment.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the line segment.""" + return self._geometry.length + +
[docs] def to_dict(self): + """Return DisplayLineSegment2D as a dictionary.""" + base = {'type': 'DisplayLineSegment2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayLineSegment2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayLineSegment2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/mesh.html b/docs/_modules/ladybug_display/geometry2d/mesh.html new file mode 100644 index 0000000..c62fa64 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/mesh.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry2d.mesh — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.mesh

+"""A mesh in 2D space with display properties."""
+from ladybug_geometry.geometry2d.mesh import Mesh2D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase2D
+
+
+
[docs]class DisplayMesh2D(_SingleColorModeBase2D): + """A mesh in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Mesh2D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * min + * max + * center + * area + * face_areas + * face_centroids + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Mesh2D), '\ + Expected ladybug_geometry Mesh2D. Got {}'.format(type(geometry)) + _SingleColorModeBase2D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayMesh2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayMesh2D object. + """ + assert data['type'] == 'DisplayMesh2D', \ + 'Expected DisplayMesh2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Mesh2D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the mesh.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all faces in the mesh.""" + return self._geometry.faces + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point2D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the mesh.""" + return self._geometry.area + + @property + def face_areas(self): + """Get a tuple with the area of each face in the mesh.""" + return self._geometry.face_areas + + @property + def face_centroids(self): + """Get a tuple with the centroid of each face in the mesh.""" + return self._geometry.face_centroids + +
[docs] def to_dict(self): + """Return DisplayMesh2D as a dictionary.""" + base = {'type': 'DisplayMesh2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayMesh2D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayMesh2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/point.html b/docs/_modules/ladybug_display/geometry2d/point.html new file mode 100644 index 0000000..1d8d739 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/point.html @@ -0,0 +1,1026 @@ + + + + + + + ladybug_display.geometry2d.point — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.point

+"""A point that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.pointvector import Point2D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase2D
+from ladybug_display.altnumber import default
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayPoint2D(_SingleColorBase2D): + """A point in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Point2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + radius: Number for radius in pixels (for the screen) or millimeters + (in print). This can also be the Default object to indicate that the + default settings of the interface should be used. + + Properties: + * geometry + * color + * radius + * x + * y + * user_data + """ + __slots__ = ('_radius',) + + def __init__(self, geometry, color=None, radius=default): + """Initialize base with shade object.""" + assert isinstance(geometry, Point2D), '\ + Expected ladybug_geometry Point2D. Got {}'.format(type(geometry)) + _SingleColorBase2D.__init__(self, geometry, color) + self.radius = radius + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPoint2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPoint2D object. + """ + assert data['type'] == 'DisplayPoint2D', \ + 'Expected DisplayPoint2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + rad = default if 'radius' not in data or \ + data['radius'] == default.to_dict() else data['radius'] + geo = cls(Point2D.from_dict(data['geometry']), color, rad) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def radius(self): + """Get or set a number for the radius of this object.""" + return self._radius + + @radius.setter + def radius(self, value): + if value == default: + self._radius = default + else: + self._radius = float_positive(value, 'point radius') + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + +
[docs] def distance_to_point(self, point): + """Get the distance from this point to another DisplayPoint2D.""" + return self.geometry.distance_to_point(point.geometry)
+ +
[docs] def to_dict(self): + """Return DisplayPoint2D as a dictionary.""" + base = {'type': 'DisplayPoint2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['radius'] = default.to_dict() if self.radius == default else self.radius + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPoint2D(self.geometry, self.color, self.radius) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y)[key] + + def __iter__(self): + return iter((self.x, self.y)) + + def __repr__(self): + return 'DisplayPoint2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/polygon.html b/docs/_modules/ladybug_display/geometry2d/polygon.html new file mode 100644 index 0000000..0881959 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/polygon.html @@ -0,0 +1,1065 @@ + + + + + + + ladybug_display.geometry2d.polygon — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.polygon

+"""A polygon that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.polygon import Polygon2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayPolygon2D(_LineCurveBase2D): + """A polygon in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Polygon2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * min + * max + * center + * perimeter + * area + * is_clockwise + * is_convex + * is_self_intersecting + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polygon2D), '\ + Expected ladybug_geometry Polygon2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolygon2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolygon2D object. + """ + assert data['type'] == 'DisplayPolygon2D', \ + 'Expected DisplayPolygon2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polygon2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point2Ds that make up the polygon.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment2Ds that make up the polygon.""" + return self._geometry.segments + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point2D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def perimeter(self): + """Get a number for the perimeter of the polygon.""" + return self._geometry.perimeter + + @property + def area(self): + """Get a number for the area of the polygon.""" + return self._geometry.area + + @property + def is_clockwise(self): + """Get a boolean for whether the polygon is clockwise.""" + return self._geometry.is_clockwise + + @property + def is_convex(self): + """Get a boolean for whether the polygon is convex.""" + return self._geometry.is_convex + + @property + def is_self_intersecting(self): + """Get a boolean for whether the polygon is self intersecting.""" + return self._geometry.is_self_intersecting + +
[docs] def to_dict(self): + """Return DisplayPolygon2D as a dictionary.""" + base = {'type': 'DisplayPolygon2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolygon2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolygon2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/polyline.html b/docs/_modules/ladybug_display/geometry2d/polyline.html new file mode 100644 index 0000000..8eb84a2 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/polyline.html @@ -0,0 +1,1054 @@ + + + + + + + ladybug_display.geometry2d.polyline — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.polyline

+"""A polyline that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.polyline import Polyline2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayPolyline2D(_LineCurveBase2D): + """A polyline in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Polyline2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * interpolated + * p1 + * p2 + * length + * min + * max + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyline2D), '\ + Expected ladybug_geometry Polyline2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyline2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyline2D object. + """ + assert data['type'] == 'DisplayPolyline2D', \ + 'Expected DisplayPolyline2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polyline2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point2D for the vertices of the polyline.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment2D for the segments of the polyline.""" + return self._geometry.segments + + @property + def interpolated(self): + """Get a boolean for whether the polyline should be interpreted as interpolated. + """ + return self._geometry.interpolated + + @property + def p1(self): + """Get a Point2D representing the first end point of the polyline.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second end point of the polyline.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the polyline.""" + return self._geometry.length + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + +
[docs] def to_dict(self): + """Return DisplayPolyline2D as a dictionary.""" + base = {'type': 'DisplayPolyline2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyline2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyline2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/ray.html b/docs/_modules/ladybug_display/geometry2d/ray.html new file mode 100644 index 0000000..edffd52 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/ray.html @@ -0,0 +1,998 @@ + + + + + + + ladybug_display.geometry2d.ray — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.ray

+"""A ray that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.ray import Ray2D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase2D
+
+
+
[docs]class DisplayRay2D(_SingleColorBase2D): + """A ray in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Ray2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * p + * v + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Ray2D), '\ + Expected ladybug_geometry Ray2D. Got {}'.format(type(geometry)) + _SingleColorBase2D.__init__(self, geometry, color) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayRay2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayRay2D object. + """ + assert data['type'] == 'DisplayRay2D', \ + 'Expected DisplayRay2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Ray2D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point2D representing the base of the ray.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector2D representing the direction of the ray.""" + return self._geometry.v + +
[docs] def reverse(self): + """Reverse this DisplayRay2D.""" + self._geometry = self._geometry.reverse()
+ +
[docs] def to_dict(self): + """Return DisplayRay2D as a dictionary.""" + base = {'type': 'DisplayRay2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayRay2D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayRay2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/vector.html b/docs/_modules/ladybug_display/geometry2d/vector.html new file mode 100644 index 0000000..8dd8777 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/vector.html @@ -0,0 +1,1072 @@ + + + + + + + ladybug_display.geometry2d.vector — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.vector

+"""A vector that can be displayed in 2D space."""
+import math
+
+from ladybug_geometry.geometry2d.pointvector import Vector2D
+from ladybug.color import Color
+
+from .._base import _DisplayBase
+
+
+
[docs]class DisplayVector2D(_DisplayBase): + """A vector in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Vector2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * x + * y + * magnitude + * user_data + """ + __slots__ = ('_color',) + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Vector2D), '\ + Expected ladybug_geometry Vector2D. Got {}'.format(type(geometry)) + _DisplayBase.__init__(self, geometry) + self.color = color + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayVector2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayVector2D object. + """ + assert data['type'] == 'DisplayVector2D', \ + 'Expected DisplayVector2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Vector2D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def color(self): + """Get or set a color for this object.""" + return self._color + + @color.setter + def color(self, value): + if value is None: + value = Color(0, 0, 0) + else: + assert isinstance(value, Color), 'Expected Color for ladybug_display ' \ + 'object color. Got {}.'.format(type(value)) + self._color = value + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def magnitude(self): + """Get the magnitude of the vector.""" + return self._geometry.magnitude + +
[docs] def normalize(self): + """Ensure that this DisplayVector2D is a unit vector (magnitude=1).""" + self._geometry = self._geometry.normalize()
+ +
[docs] def reverse(self): + """Get a copy of this vector that is reversed.""" + self._geometry = self._geometry.__neg__()
+ +
[docs] def dot(self, other): + """Get the dot product of this vector with another DisplayVector2D.""" + return self.geometry.dot(other.geometry)
+ +
[docs] def angle(self, other): + """Get the angle between this vector and another DisplayVector2D in degrees.""" + return math.degrees(self.geometry.angle(other.geometry))
+ +
[docs] def rotate(self, angle): + """Rotate this geometry by a certain angle around an axis and origin. + + Args: + axis: A ladybug_geometry Vector2D axis representing the axis of rotation. + angle: An angle for rotation in degrees. + """ + self._geometry = self.geometry.rotate(math.radians(angle))
+ +
[docs] def reflect(self, normal): + """Reflect this geometry across a plane with the input normal vector. + + Args: + normal: A Vector2D representing the normal vector for the plane across + which the vector will be reflected. THIS VECTOR MUST BE NORMALIZED. + """ + self._geometry = self.geometry.reflect(normal)
+ +
[docs] def to_dict(self): + """Return DisplayVector2D as a dictionary. + """ + base = {'type': 'DisplayVector2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayVector2D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y)[key] + + def __iter__(self): + return iter((self.x, self.y)) + + def __mul__(self, other): + assert type(other) in (int, float), 'Cannot multiply types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector2D(self.geometry * other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __div__(self, other): + assert type(other) in (int, float), 'Cannot divide types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector2D(self.geometry / other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayVector2D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/arc.html b/docs/_modules/ladybug_display/geometry3d/arc.html new file mode 100644 index 0000000..5a2fcc8 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/arc.html @@ -0,0 +1,1055 @@ + + + + + + + ladybug_display.geometry3d.arc — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.arc

+"""An arc that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.arc import Arc3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayArc3D(_LineCurveBase3D): + """An arc in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Arc3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * plane + * radius + * p1 + * p2 + * c + * angle + * length + * is_circle + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Arc3D), '\ + Expected ladybug_geometry Arc3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayArc3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayArc3D object. + """ + assert data['type'] == 'DisplayArc3D', \ + 'Expected DisplayArc3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Arc3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def plane(self): + """Get a Plane which the arc lies with an origin representing the center.""" + return self._geometry.plane + + @property + def radius(self): + """Get a number for the radius of the arc.""" + return self._geometry.radius + + @property + def p1(self): + """Get a Point3D representing the first end point of the arc.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second end point of the arc.""" + return self._geometry.p2 + + @property + def c(self): + """Get a Point3D representing the center of the arc.""" + return self._geometry.c + + @property + def angle(self): + """The total angle over the domain of the arc in degrees.""" + return math.degrees(self._geometry.angle) + + @property + def length(self): + """Get a number for the length of the arc.""" + return self._geometry.length + + @property + def is_circle(self): + """Get a boolean for whether the arc is a circle.""" + return self._geometry.is_circle + +
[docs] def to_dict(self): + """Return DisplayArc3D as a dictionary.""" + base = {'type': 'DisplayArc3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayArc3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayArc3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/cone.html b/docs/_modules/ladybug_display/geometry3d/cone.html new file mode 100644 index 0000000..aefed94 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/cone.html @@ -0,0 +1,1029 @@ + + + + + + + ladybug_display.geometry3d.cone — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.cone

+"""A cone that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.cone import Cone
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayCone(_SingleColorModeBase3D): + """A cone in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Cone. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertex + * axis + * height + * radius + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Cone), '\ + Expected ladybug_geometry Cone. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayCone from a dictionary. + + Args: + data: A dictionary representation of an DisplayCone object. + """ + assert data['type'] == 'DisplayCone', \ + 'Expected DisplayCone dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Cone.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertex(self): + """Get a Point3D for the vertex of the cone.""" + return self._geometry.vertex + + @property + def axis(self): + """Get a Vector3D for the axis of the cone.""" + return self._geometry.axis + + @property + def height(self): + """Get a number for the height of the cone.""" + return self._geometry.height + + @property + def radius(self): + """Get the radius of the cone.""" + return self._geometry.radius + + @property + def area(self): + """Get the surface area of the cone.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the cone.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplayCone as a dictionary.""" + base = {'type': 'DisplayCone'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayCone(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayCone: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/cylinder.html b/docs/_modules/ladybug_display/geometry3d/cylinder.html new file mode 100644 index 0000000..746c9ef --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/cylinder.html @@ -0,0 +1,1029 @@ + + + + + + + ladybug_display.geometry3d.cylinder — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.cylinder

+"""A cylinder that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.cylinder import Cylinder
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayCylinder(_SingleColorModeBase3D): + """A cylinder in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Cylinder. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * center + * axis + * height + * radius + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Cylinder), '\ + Expected ladybug_geometry Cylinder. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayCylinder from a dictionary. + + Args: + data: A dictionary representation of an DisplayCylinder object. + """ + assert data['type'] == 'DisplayCylinder', \ + 'Expected DisplayCylinder dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Cylinder.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def center(self): + """Get a Point3D for the center of the bottom of the cylinder.""" + return self._geometry.center + + @property + def axis(self): + """Get a Vector3D for the axis of the cylinder.""" + return self._geometry.axis + + @property + def height(self): + """Get a number for the height of the cylinder.""" + return self._geometry.height + + @property + def radius(self): + """Get the radius of the cylinder.""" + return self._geometry.radius + + @property + def area(self): + """Get the surface area of the cylinder.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the cylinder.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplayCylinder as a dictionary.""" + base = {'type': 'DisplayCylinder'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayCylinder(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayCylinder: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/face.html b/docs/_modules/ladybug_display/geometry3d/face.html new file mode 100644 index 0000000..1145231 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/face.html @@ -0,0 +1,1066 @@ + + + + + + + ladybug_display.geometry3d.face — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.face

+"""A single planar face that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.face import Face3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayFace3D(_SingleColorModeBase3D): + """A single planar face in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Face3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * normal + * center + * area + * perimeter + * min + * max + * altitude + * azimuth + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize object.""" + assert isinstance(geometry, Face3D), '\ + Expected ladybug_geometry Face3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayFace3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayFace3D object. + """ + assert data['type'] == 'DisplayFace3D', \ + 'Expected DisplayFace3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Face3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a list of vertices for the face (in counter-clockwise order).""" + return self._geometry.vertices + + @property + def normal(self): + """Get a Vector3D for the direction in which the face is pointing. + """ + return self._geometry.normal + + @property + def center(self): + """Get a Point3D for the center of the face. + + Note that this is the center of the bounding rectangle around this geometry + and not the area centroid. + """ + return self._geometry.center + + @property + def area(self): + """Get the area of the face.""" + return self._geometry.area + + @property + def perimeter(self): + """Get the perimeter of the face. This includes the length of holes in the face. + """ + return self._geometry.perimeter + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def altitude(self): + """Get the altitude of the geometry between +90 (up) and -90 (down).""" + return math.degrees(self._geometry.altitude) + + @property + def azimuth(self): + """Get the azimuth of the geometry, between 0 and 360. + + Given Y-axis as North, 0 = North, 90 = East, 180 = South, 270 = West + This will be zero if the Face3D is perfectly horizontal. + """ + return math.degrees(self._geometry.azimuth) + +
[docs] def to_dict(self, include_plane=True): + """Return DisplayFace3D as a dictionary. + + Args: + include_plane: Boolean to note wether the plane of the Face3D should be + included in the output. This can preserve the orientation of the + X/Y axes of the plane but is not required and can be removed to + keep the dictionary smaller. (Default: True). + """ + base = {'type': 'DisplayFace3D'} + base['geometry'] = self._geometry.to_dict(include_plane) + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayFace3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayFace3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/line.html b/docs/_modules/ladybug_display/geometry3d/line.html new file mode 100644 index 0000000..2a01fdf --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/line.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.geometry3d.line — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.line

+"""A line segment that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.line import LineSegment3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayLineSegment3D(_LineCurveBase3D): + """A single line segment in 3D space with display properties. + + Args: + geometry: A ladybug-geometry LineSegment3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * p + * v + * p1 + * p2 + * length + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, LineSegment3D), '\ + Expected ladybug_geometry LineSegment3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayLineSegment3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayLineSegment3D object. + """ + assert data['type'] == 'DisplayLineSegment3D', \ + 'Expected DisplayLineSegment3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(LineSegment3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point3D representing the base of the line segment.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector3D representing the direction of the line segment.""" + return self._geometry.v + + @property + def p1(self): + """Get a Point3D representing the first point of the line segment.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second point of the line segment.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the line segment.""" + return self._geometry.length + +
[docs] def to_dict(self): + """Return DisplayLineSegment3D as a dictionary.""" + base = {'type': 'DisplayLineSegment3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayLineSegment3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayLineSegment3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/mesh.html b/docs/_modules/ladybug_display/geometry3d/mesh.html new file mode 100644 index 0000000..183a96d --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/mesh.html @@ -0,0 +1,1053 @@ + + + + + + + ladybug_display.geometry3d.mesh — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.mesh

+"""A mesh in 3D space with display properties."""
+from ladybug_geometry.geometry3d.mesh import Mesh3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayMesh3D(_SingleColorModeBase3D): + """A mesh in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Mesh3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * min + * max + * center + * area + * face_areas + * face_centroids + * face_normals + * vertex_normals + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Mesh3D), '\ + Expected ladybug_geometry Mesh3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayMesh3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayMesh3D object. + """ + assert data['type'] == 'DisplayMesh3D', \ + 'Expected DisplayMesh3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Mesh3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the mesh.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all faces in the mesh.""" + return self._geometry.faces + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point3D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the mesh.""" + return self._geometry.area + + @property + def face_areas(self): + """Get a tuple with the area of each face in the mesh.""" + return self._geometry.face_areas + + @property + def face_centroids(self): + """Get a tuple with the centroid of each face in the mesh.""" + return self._geometry.face_centroids + + @property + def face_normals(self): + """Get a tuple of Vector3D objects for all face normals.""" + return self._geometry.face_normals + + @property + def vertex_normals(self): + """Get a tuple of Vector3D objects for all vertex normals.""" + return self._geometry.vertex_normals + +
[docs] def to_dict(self): + """Return DisplayMesh3D as a dictionary.""" + base = {'type': 'DisplayMesh3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayMesh3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayMesh3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/plane.html b/docs/_modules/ladybug_display/geometry3d/plane.html new file mode 100644 index 0000000..7ef87d6 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/plane.html @@ -0,0 +1,1050 @@ + + + + + + + ladybug_display.geometry3d.plane — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.plane

+"""A plane that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.plane import Plane
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+
+
+
[docs]class DisplayPlane(_SingleColorBase3D): + """A plane in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Plane object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + show_axes: A boolean to note whether the plane should be displayed with + XY axes instead of just an origin point and a normal vector. + show_grid: A boolean to note whether the plane should be displayed + with a grid. + + Properties: + * geometry + * color + * show_axes + * show_grid + * o + * n + * x + * y + * k + * user_data + """ + __slots__ = ('_show_axes', '_show_grid') + + def __init__(self, geometry, color=None, show_axes=False, show_grid=False): + """Initialize base with shade object.""" + assert isinstance(geometry, Plane), '\ + Expected ladybug_geometry Plane. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + self.show_axes = show_axes + self.show_grid = show_grid + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPlane from a dictionary. + + Args: + data: A dictionary representation of an DisplayPlane object. + """ + assert data['type'] == 'DisplayPlane', \ + 'Expected DisplayPlane dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + ax = data['show_axes'] if 'show_axes' in data else False + gd = data['show_grid'] if 'show_grid' in data else False + geo = cls(Plane.from_dict(data['geometry']), color, ax, gd) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def show_axes(self): + """Get or set a boolean for whether to display the XY axes of the plane.""" + return self._show_axes + + @show_axes.setter + def show_axes(self, value): + try: + self._show_axes = bool(value) + except TypeError: + raise TypeError( + 'Expected boolean for DisplayPlane.show_axes. Got {}.'.format(value)) + + @property + def show_grid(self): + """Get or set a boolean for whether to display the grid of the plane.""" + return self._show_grid + + @show_grid.setter + def show_grid(self, value): + try: + self._show_grid = bool(value) + except TypeError: + raise TypeError( + 'Expected boolean for DisplayPlane.show_grid. Got {}.'.format(value)) + + @property + def o(self): + """Get a Point3D representing the origin of the plane.""" + return self._geometry.o + + @property + def n(self): + """Get a Vector3D representing the normal of the plane.""" + return self._geometry.n + + @property + def x(self): + """Get aVector3D representing the x axis of the plane.""" + return self._geometry.x + + @property + def y(self): + """Get a Vector3D representing the y axis of the plane.""" + return self._geometry.y + + @property + def k(self): + """Get a number for the constant of the plane.""" + return self._geometry.k + +
[docs] def to_dict(self): + """Return DisplayPlane as a dictionary.""" + base = {'type': 'DisplayPlane'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['show_axes'] = self.show_axes + base['show_grid'] = self.show_grid + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPlane(self.geometry, self.color, self.show_axes, self.show_grid) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPlane: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/point.html b/docs/_modules/ladybug_display/geometry3d/point.html new file mode 100644 index 0000000..442ee14 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/point.html @@ -0,0 +1,1032 @@ + + + + + + + ladybug_display.geometry3d.point — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.point

+"""A point that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.pointvector import Point3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+from ladybug_display.altnumber import default
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayPoint3D(_SingleColorBase3D): + """A point in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Point3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + radius: Number for radius in pixels (for the screen) or millimeters + (in print). This can also be the Default object to indicate that the + default settings of the interface should be used. + + Properties: + * geometry + * color + * radius + * x + * y + * z + * user_data + """ + __slots__ = ('_radius',) + + def __init__(self, geometry, color=None, radius=default): + """Initialize base with shade object.""" + assert isinstance(geometry, Point3D), '\ + Expected ladybug_geometry Point3D. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + self.radius = radius + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPoint3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPoint3D object. + """ + assert data['type'] == 'DisplayPoint3D', \ + 'Expected DisplayPoint3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + rad = default if 'radius' not in data or \ + data['radius'] == default.to_dict() else data['radius'] + geo = cls(Point3D.from_dict(data['geometry']), color, rad) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def radius(self): + """Get or set a number for the radius of this object.""" + return self._radius + + @radius.setter + def radius(self, value): + if value == default: + self._radius = default + else: + self._radius = float_positive(value, 'point radius') + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def z(self): + """Get the Z coordinate.""" + return self._geometry.z + +
[docs] def distance_to_point(self, point): + """Get the distance from this point to another DisplayPoint3D.""" + return self.geometry.distance_to_point(point.geometry)
+ +
[docs] def to_dict(self): + """Return DisplayPoint3D as a dictionary.""" + base = {'type': 'DisplayPoint3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['radius'] = default.to_dict() if self.radius == default else self.radius + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPoint3D(self.geometry, self.color, self.radius) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __repr__(self): + return 'DisplayPoint3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/polyface.html b/docs/_modules/ladybug_display/geometry3d/polyface.html new file mode 100644 index 0000000..38e1499 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/polyface.html @@ -0,0 +1,1091 @@ + + + + + + + ladybug_display.geometry3d.polyface — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.polyface

+"""A polyface in 3D space with display properties."""
+from ladybug_geometry.geometry3d.polyface import Polyface3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayPolyface3D(_SingleColorModeBase3D): + """A polyface in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Polyface3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * edges + * naked_edges + * internal_edges + * non_manifold_edges + * face_indices + * edge_indices + * edge_types + * min + * max + * center + * area + * volume + * is_solid + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyface3D), '\ + Expected ladybug_geometry Polyface3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyface3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyface3D object. + """ + assert data['type'] == 'DisplayPolyface3D', \ + 'Expected DisplayPolyface3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Polyface3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the polyface.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all Face3D objects making up this polyface.""" + return self._geometry.faces + + @property + def edges(self): + """Get a tuple of all edges in this polyface as LineSegment3D objects.""" + return self._geometry.edges + + @property + def naked_edges(self): + """Get a tuple of all naked edges in this polyface as LineSegment3D objects.""" + return self._geometry.naked_edges + + @property + def internal_edges(self): + """Get a tuple of all internal edges in this polyface as LineSegment3D objects. + """ + return self._geometry.internal_edges + + @property + def non_manifold_edges(self): + """Get a tuple of all non-manifold edges as LineSegment3D objects.""" + return self._geometry.non_manifold_edges + + @property + def face_indices(self): + """Get a tuple of face tuples with integers corresponding to indices of vertices. + """ + return self._geometry.face_indices + + @property + def edge_indices(self): + """Get a tuple of edge tuples with integers corresponding to indices of vertices. + """ + return self._geometry.edge_indices + + @property + def edge_types(self): + """Get a tuple of integers for each edge that denotes the type of edge. + + 0 denotes a naked edge, 1 denotes an internal edge, and anything higher is a + non-manifold edge. + """ + return self._geometry.edge_types + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point3D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the polyface.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the polyface.""" + return self._geometry.volume + + @property + def is_solid(self): + """Get a boolean to note whether the polyface is solid (True) or is open (False). + """ + return self._geometry.is_solid + +
[docs] def to_dict(self): + """Return DisplayPolyface3D as a dictionary.""" + base = {'type': 'DisplayPolyface3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyface3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyface3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/polyline.html b/docs/_modules/ladybug_display/geometry3d/polyline.html new file mode 100644 index 0000000..2239502 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/polyline.html @@ -0,0 +1,1054 @@ + + + + + + + ladybug_display.geometry3d.polyline — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.polyline

+"""A polyline that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.polyline import Polyline3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayPolyline3D(_LineCurveBase3D): + """A polyline in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Polyline3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * interpolated + * p1 + * p2 + * length + * min + * max + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyline3D), '\ + Expected ladybug_geometry Polyline3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyline3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyline3D object. + """ + assert data['type'] == 'DisplayPolyline3D', \ + 'Expected DisplayPolyline3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polyline3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point3D for the vertices of the polyline.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment3D for the segments of the polyline.""" + return self._geometry.segments + + @property + def interpolated(self): + """Get a boolean for whether the polyline should be interpreted as interpolated. + """ + return self._geometry.interpolated + + @property + def p1(self): + """Get a Point3D representing the first end point of the polyline.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second end point of the polyline.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the polyline.""" + return self._geometry.length + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + +
[docs] def to_dict(self): + """Return DisplayPolyline3D as a dictionary.""" + base = {'type': 'DisplayPolyline3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyline3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyline3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/ray.html b/docs/_modules/ladybug_display/geometry3d/ray.html new file mode 100644 index 0000000..a3970c7 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/ray.html @@ -0,0 +1,998 @@ + + + + + + + ladybug_display.geometry3d.ray — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.ray

+"""A ray that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.ray import Ray3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+
+
+
[docs]class DisplayRay3D(_SingleColorBase3D): + """A ray in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Ray3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * p + * v + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Ray3D), '\ + Expected ladybug_geometry Ray3D. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayRay3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayRay3D object. + """ + assert data['type'] == 'DisplayRay3D', \ + 'Expected DisplayRay3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Ray3D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point3D representing the base of the ray.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector3D representing the direction of the ray.""" + return self._geometry.v + +
[docs] def reverse(self): + """Reverse this DisplayRay3D.""" + self._geometry = self._geometry.reverse()
+ +
[docs] def to_dict(self): + """Return DisplayRay3D as a dictionary.""" + base = {'type': 'DisplayRay3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayRay3D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayRay3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/sphere.html b/docs/_modules/ladybug_display/geometry3d/sphere.html new file mode 100644 index 0000000..4c79024 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/sphere.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry3d.sphere — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.sphere

+"""A sphere that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.sphere import Sphere
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplaySphere(_SingleColorModeBase3D): + """A sphere in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Sphere. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * center + * radius + * min + * max + * diameter + * circumference + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Sphere), '\ + Expected ladybug_geometry Sphere. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplaySphere from a dictionary. + + Args: + data: A dictionary representation of an DisplaySphere object. + """ + assert data['type'] == 'DisplaySphere', \ + 'Expected DisplaySphere dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Sphere.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def center(self): + """Get a Point3D for the center of the sphere.""" + return self._geometry.center + + @property + def radius(self): + """Get a number for the radius of the sphere.""" + return self._geometry.radius + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def diameter(self): + """Get the diameter of the sphere.""" + return self._geometry.diameter + + @property + def circumference(self): + """Get the circumference of the sphere.""" + return self._geometry.circumference + + @property + def area(self): + """Get the surface area of the sphere.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the sphere.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplaySphere as a dictionary.""" + base = {'type': 'DisplaySphere'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplaySphere(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplaySphere: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/text.html b/docs/_modules/ladybug_display/geometry3d/text.html new file mode 100644 index 0000000..fb31b81 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/text.html @@ -0,0 +1,1150 @@ + + + + + + + ladybug_display.geometry3d.text — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.text

+"""Class for specifying text within the 3D scene."""
+from ladybug_geometry.geometry3d import Plane, Point3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayText3D(_SingleColorBase3D): + """A text object in 3D space with display properties. + + Args: + text: A text string to be displayed in the 3D scene. + plane: A ladybug-geometry Plane object to locate and orient the text in + the 3D scene. + height: A number for the height of the text in the 3D scene. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + font: A text string for the font in which to draw the text. Note that this field + may not be interpreted the same on all machines and in all interfaces, + particularly when a machine lacks a given font. (Default: Arial) + horizontal_alignment: String to specify the horizontal alignment + of the text. (Default: Left). Choose from: + + * Left + * Center + * Right + + vertical_alignment: String to specify the vertical alignment + of the text. (Default: Bottom). Choose from: + + * Top + * Middle + * Bottom + + Properties: + * text + * plane + * geometry + * height + * color + * font + * horizontal_alignment + * vertical_alignment + * min + * max + * user_data + """ + __slots__ = ('_text', '_height', '_font', '_horizontal_alignment', + '_vertical_alignment') + + HORIZONTAL_ALIGN = ('Left', 'Center', 'Right') + VERTICAL_ALIGN = ('Top', 'Middle', 'Bottom') + + def __init__(self, text, plane, height, color=None, font='Arial', + horizontal_alignment='Left', vertical_alignment='Bottom'): + """Initialize object.""" + assert isinstance(plane, Plane), '\ + Expected ladybug_geometry Plane. Got {}'.format(type(plane)) + _SingleColorBase3D.__init__(self, plane, color) + self.text = text + self.height = height + self.font = font + self.horizontal_alignment = horizontal_alignment + self.vertical_alignment = vertical_alignment + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayText3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayText3D object. + """ + assert data['type'] == 'DisplayText3D', \ + 'Expected DisplayText3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + font = data['font'] if 'font' in data and \ + data['font'] is not None else 'Arial' + h_align = data['horizontal_alignment'] if 'horizontal_alignment' in data and \ + data['horizontal_alignment'] is not None else 'Left' + v_align = data['vertical_alignment'] if 'vertical_alignment' in data and \ + data['vertical_alignment'] is not None else 'Bottom' + geo = cls(data['text'], Plane.from_dict(data['plane']), data['height'], + color, font, h_align, v_align) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def text(self): + """Get or set a text string to be displayed in the 3D scene.""" + return self._text + + @text.setter + def text(self, value): + self._text = str(value) + + @property + def plane(self): + """Get a ladybug_geometry Plane for the text.""" + return self._geometry + + @property + def height(self): + """Get or set a number for the height of the text in the 3D scene.""" + return self._height + + @height.setter + def height(self, value): + self._height = float_positive(value, 'text height') + + @property + def font(self): + """Get or set a string for the font in which to draw the text.""" + return self._font + + @font.setter + def font(self, value): + self._font = str(value) + + @property + def horizontal_alignment(self): + """Get or set text to specify the horizontal alignment.""" + return self._horizontal_alignment + + @horizontal_alignment.setter + def horizontal_alignment(self, value): + clean_input = value.lower() + for key in self.HORIZONTAL_ALIGN: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'horizontal_alignment {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, self.HORIZONTAL_ALIGN)) + self._horizontal_alignment = value + + @property + def vertical_alignment(self): + """Get or set text to specify the vertical alignment.""" + return self._vertical_alignment + + @vertical_alignment.setter + def vertical_alignment(self, value): + clean_input = value.lower() + for key in self.VERTICAL_ALIGN: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'vertical_alignment {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, self.VERTICAL_ALIGN)) + self._vertical_alignment = value + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + sep_text = self.text.split('\n') + h_len = max([len(txt) for txt in sep_text]) + v_len = len(sep_text) + + if self.horizontal_alignment == 'Right': + min_x = h_len * self.height + elif self.horizontal_alignment == 'Center': + min_x = (h_len * self.height) / 2 + else: + min_x = 0 + min_x = self.plane.o.x - min_x + + if self.vertical_alignment == 'Top': + min_y = v_len * self.height + elif self.vertical_alignment == 'Middle': + min_y = (v_len * self.height) / 2 + else: + min_y = 0 + min_y = self.plane.o.y + min_y + return Point3D(min_x, min_y, self.plane.o.z) + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + sep_text = self.text.split('\n') + h_len = max([len(txt) for txt in sep_text]) + v_len = len(sep_text) + + if self.horizontal_alignment == 'Left': + max_x = h_len * self.height + elif self.horizontal_alignment == 'Center': + max_x = (h_len * self.height) / 2 + else: + max_x = 0 + max_x = self.plane.o.x + max_x + + if self.vertical_alignment == 'Bottom': + max_y = v_len * self.height + elif self.vertical_alignment == 'Middle': + max_y = (v_len * self.height) / 2 + else: + max_y = self.height + max_y = self.plane.o.y + max_y + return Point3D(max_x, max_y, self.plane.o.z) + +
[docs] def to_dict(self): + """Return DisplayText3D as a dictionary.""" + base = {'type': 'DisplayText3D'} + base['text'] = self.text + base['plane'] = self.plane.to_dict() + base['height'] = self.height + base['color'] = self.color.to_dict() + base['font'] = self.font + base['horizontal_alignment'] = self.horizontal_alignment + base['vertical_alignment'] = self.vertical_alignment + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayText3D( + self.text, self.plane, self.height, self.color, self.font, + self.horizontal_alignment, self.vertical_alignment) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayText3D: {}'.format(self.plane)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/vector.html b/docs/_modules/ladybug_display/geometry3d/vector.html new file mode 100644 index 0000000..5d3b989 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/vector.html @@ -0,0 +1,1090 @@ + + + + + + + ladybug_display.geometry3d.vector — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.vector

+"""A vector that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.pointvector import Vector3D
+from ladybug.color import Color
+
+from .._base import _DisplayBase
+
+
+
[docs]class DisplayVector3D(_DisplayBase): + """A vector in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Vector3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * x + * y + * z + * magnitude + * user_data + """ + __slots__ = ('_color',) + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Vector3D), '\ + Expected ladybug_geometry Vector3D. Got {}'.format(type(geometry)) + _DisplayBase.__init__(self, geometry) + self.color = color + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayVector3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayVector3D object. + """ + assert data['type'] == 'DisplayVector3D', \ + 'Expected DisplayVector3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Vector3D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def color(self): + """Get or set a color for this object.""" + return self._color + + @color.setter + def color(self, value): + if value is None: + value = Color(0, 0, 0) + else: + assert isinstance(value, Color), 'Expected Color for ladybug_display ' \ + 'object color. Got {}.'.format(type(value)) + self._color = value + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def z(self): + """Get the Z coordinate.""" + return self._geometry.z + + @property + def magnitude(self): + """Get the magnitude of the vector.""" + return self._geometry.magnitude + +
[docs] def normalize(self): + """Ensure that this DisplayVector3D is a unit vector (magnitude=1).""" + self._geometry = self._geometry.normalize()
+ +
[docs] def reverse(self): + """Reverse this DisplayVector3D.""" + self._geometry = self._geometry.__neg__()
+ +
[docs] def dot(self, other): + """Get the dot product of this vector with another DisplayVector3D.""" + return self.geometry.dot(other.geometry)
+ +
[docs] def cross(self, other): + """Get the cross product of this vector and another DisplayVector3D.""" + return self.geometry.cross(other.geometry)
+ +
[docs] def angle(self, other): + """Get the angle between this vector and another DisplayVector3D in degrees.""" + return math.degrees(self.geometry.angle(other.geometry))
+ +
[docs] def rotate(self, axis, angle): + """Rotate this geometry by a certain angle around an axis and origin. + + Args: + axis: A ladybug_geometry Vector3D axis representing the axis of rotation. + angle: An angle for rotation in degrees. + """ + self._geometry = self.geometry.rotate(axis, math.radians(angle))
+ +
[docs] def rotate_xy(self, angle): + """Rotate this geometry counterclockwise in the world XY plane by an angle. + + Args: + angle: An angle in degrees. + """ + self._geometry = self.geometry.rotate_xy(math.radians(angle))
+ +
[docs] def reflect(self, normal): + """Reflect this geometry across a plane with the input normal vector. + + Args: + normal: A Vector3D representing the normal vector for the plane across + which the vector will be reflected. THIS VECTOR MUST BE NORMALIZED. + """ + self._geometry = self.geometry.reflect(normal)
+ +
[docs] def to_dict(self): + """Return DisplayVector3D as a dictionary. + """ + base = {'type': 'DisplayVector3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayVector3D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __mul__(self, other): + assert type(other) in (int, float), 'Cannot multiply types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector3D(self.geometry * other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __div__(self, other): + assert type(other) in (int, float), 'Cannot divide types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector3D(self.geometry / other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayVector3D: {}'.format(self.geometry)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/typing.html b/docs/_modules/ladybug_display/typing.html new file mode 100644 index 0000000..197e67d --- /dev/null +++ b/docs/_modules/ladybug_display/typing.html @@ -0,0 +1,1044 @@ + + + + + + + ladybug_display.typing — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.typing

+"""Collection of methods for type input checking."""
+import re
+import math
+
+try:
+    INFPOS = math.inf
+    INFNEG = -1 * math.inf
+except AttributeError:
+    # python 2
+    INFPOS = float('inf')
+    INFNEG = float('-inf')
+
+
+
[docs]def valid_string(value, input_name=''): + """Check that a string is valid as an identifier.""" + try: + illegal_match = re.search(r'[^.A-Za-z0-9_-]', value) + except TypeError: + raise TypeError('Input {} must be a text string. Got {}: {}.'.format( + input_name, type(value), value)) + assert illegal_match is None, 'Illegal character "{}" found in {}'.format( + illegal_match.group(0), input_name) + assert len(value) > 0, 'Input {} "{}" contains no characters.'.format( + input_name, value) + assert len(value) <= 100, 'Input {} "{}" must be less than 100 characters.'.format( + input_name, value) + return value
+ + +def _number_check(value, input_name): + """Check if value is a number.""" + try: + number = float(value) + except (ValueError, TypeError): + raise TypeError('Input {} must be a number. Got {}: {}.'.format( + input_name, type(value), value)) + return number + + +
[docs]def float_in_range(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be between minimum and maximum.""" + number = _number_check(value, input_name) + assert mi <= number <= ma, 'Input number {} must be between {} and {}. ' \ + 'Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_excl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than minimum and less than maximum.""" + number = _number_check(value, input_name) + assert mi < number < ma, 'Input number {} must be greater than {} ' \ + 'and less than {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_excl_incl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than minimum and less than/equal to maximum.""" + number = _number_check(value, input_name) + assert mi < number <= ma, 'Input number {} must be greater than {} and less than ' \ + 'or equal to {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_incl_excl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than/equal to minimum and less than maximum.""" + number = _number_check(value, input_name) + assert mi <= number < ma, 'Input number {} must be greater than or equal to {} ' \ + 'and less than {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def int_in_range(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check an integer value to be between minimum and maximum.""" + try: + number = int(value) + except ValueError: + # try to convert to float and then digit if possible + try: + number = int(float(value)) + except (ValueError, TypeError): + raise TypeError('Input {} must be an integer. Got {}: {}.'.format( + input_name, type(value), value)) + except (ValueError, TypeError): + raise TypeError('Input {} must be an integer. Got {}: {}.'.format( + input_name, type(value), value)) + assert mi <= number <= ma, 'Input integer {} must be between {} and {}. ' \ + 'Got {}.'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_positive(value, input_name=''): + """Check a float value to be positive.""" + return float_in_range_excl(value, 0, INFPOS, input_name)
+ + +
[docs]def int_positive(value, input_name=''): + """Check if an integer value is positive.""" + return int_in_range(value, 0, INFPOS, input_name)
+ + +
[docs]def tuple_with_length(value, length=3, item_type=float, input_name=''): + """Try to create a tuple with a certain value.""" + try: + value = tuple(item_type(v) for v in value) + except (ValueError, TypeError): + raise TypeError('Input {} must be a {}.'.format( + input_name, item_type)) + assert len(value) == length, 'Input {} length must be {} not {}'.format( + input_name, length, len(value)) + return value
+ + +
[docs]def list_with_length(value, length=3, item_type=float, input_name=''): + """Try to create a list with a certain value.""" + try: + value = [item_type(v) for v in value] + except (ValueError, TypeError): + raise TypeError('Input {} must be a {}.'.format( + input_name, item_type)) + assert len(value) == length, 'Input {} length must be {} not {}'.format( + input_name, length, len(value)) + return value
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/visualization.html b/docs/_modules/ladybug_display/visualization.html new file mode 100644 index 0000000..a58b5b3 --- /dev/null +++ b/docs/_modules/ladybug_display/visualization.html @@ -0,0 +1,2525 @@ + + + + + + + ladybug_display.visualization — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.visualization

+# coding=utf-8
+from __future__ import division
+import os
+import sys
+import json
+import collections
+try:  # check if we are in IronPython
+    import cPickle as pickle
+except ImportError:  # wea are in cPython
+    import pickle
+
+from ladybug.legend import Legend, LegendParameters, LegendParametersCategorized
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.base import DataTypeBase
+
+from ladybug_geometry.geometry2d import Vector2D, Point2D, Ray2D, LineSegment2D, \
+    Polyline2D, Arc2D, Polygon2D, Mesh2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Ray3D, Plane, LineSegment3D, \
+    Polyline3D, Arc3D, Face3D, Mesh3D, Polyface3D, Sphere, Cone, Cylinder
+from .geometry2d import DisplayVector2D, DisplayPoint2D, \
+    DisplayRay2D, DisplayLineSegment2D, DisplayPolyline2D, DisplayArc2D, \
+    DisplayPolygon2D, DisplayMesh2D
+from .geometry3d import DisplayVector3D, DisplayPoint3D, \
+    DisplayRay3D, DisplayPlane, DisplayLineSegment3D, DisplayPolyline3D, DisplayArc3D, \
+    DisplayFace3D, DisplayMesh3D, DisplayPolyface3D, DisplaySphere, DisplayCone, \
+    DisplayCylinder, DisplayText3D
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.dictutil import geometry_dict_to_object
+
+from ._base import DISPLAY_MODES
+from .geometry2d._base import _DisplayBase2D
+from .geometry3d._base import _DisplayBase3D
+from .typing import int_in_range, valid_string
+from .dictutil import dict_to_object
+
+GEOMETRY_UNION = (
+    Vector2D, Point2D, Ray2D, LineSegment2D, Polyline2D, Arc2D, Polygon2D,
+    Mesh2D, Vector3D, Point3D, Ray3D, Plane, LineSegment3D,
+    Polyline3D, Arc3D, Face3D, Mesh3D, Polyface3D, Sphere, Cone, Cylinder
+)
+DISPLAY_UNION = (
+    DisplayVector2D, DisplayPoint2D, DisplayRay2D, DisplayLineSegment2D,
+    DisplayPolyline2D, DisplayArc2D, DisplayPolygon2D, DisplayMesh2D,
+    DisplayVector3D, DisplayPoint3D, DisplayRay3D, DisplayPlane, DisplayLineSegment3D,
+    DisplayPolyline3D, DisplayArc3D, DisplayFace3D, DisplayMesh3D,
+    DisplayPolyface3D, DisplaySphere, DisplayCone, DisplayCylinder, DisplayText3D
+)
+
+
+class _VisualizationBase(object):
+    """A base class for visualization objects.
+
+    Args:
+        identifier: Text string for a unique object ID. Must be less than 100
+            characters and not contain spaces or special characters.
+
+    Properties:
+        * identifier
+        * display_name
+        * full_id
+        * user_data
+    """
+    __slots__ = ('_identifier', '_display_name', '_user_data')
+
+    def __init__(self, identifier):
+        """Initialize base object."""
+        self.identifier = identifier
+        self._display_name = None
+        self._user_data = None
+
+    @property
+    def identifier(self):
+        """Get or set a text string for the unique object identifier.
+
+        This identifier remains constant as the object is mutated, copied, and
+        serialized to different formats.
+        """
+        return self._identifier
+
+    @identifier.setter
+    def identifier(self, value):
+        self._identifier = valid_string(value, 'visualization object identifier')
+
+    @property
+    def display_name(self):
+        """Get or set text for the object name without any character restrictions.
+
+        This is typically used to set the layer of the object in the interface that
+        renders the VisualizationSet. A :: in the display_name can be used to denote
+        sub-layers following a convention of ParentLayer::SubLayer.
+
+        If not set, the display_name will be equal to the object identifier.
+        """
+        if self._display_name is None:
+            return self._identifier
+        return self._display_name
+
+    @display_name.setter
+    def display_name(self, value):
+        if value is not None:
+            try:
+                value = str(value)
+            except UnicodeEncodeError:  # Python 2 machine lacking the character set
+                pass  # keep it as unicode
+        self._display_name = value
+
+    @property
+    def full_id(self):
+        """Get a string with both the object display_name and identifier.
+
+        This is formatted as display_name[identifier].
+
+        This is useful in error messages to give users an easy means of finding
+        invalid objects within models. If there is no display_name assigned,
+        only the identifier will be returned.
+        """
+        if self._display_name is None:
+            return self._identifier
+        else:
+            return '{}[{}]'.format(self._display_name, self._identifier)
+
+    @property
+    def user_data(self):
+        """Get or set an optional dictionary for additional meta data for this object.
+
+        This will be None until it has been set. All keys and values of this
+        dictionary should be of a standard Python type to ensure correct
+        serialization of the object to/from JSON (eg. str, float, int, list, dict)
+        """
+        return self._user_data
+
+    @user_data.setter
+    def user_data(self, value):
+        if value is not None:
+            assert isinstance(value, dict), 'Expected dictionary for visualization ' \
+                'object user_data. Got {}.'.format(type(value))
+        self._user_data = value
+
+    def duplicate(self):
+        """Get a copy of this object."""
+        return self.__copy__()
+
+    def __copy__(self):
+        new_obj = _VisualizationBase(self.identifier)
+        new_obj._display_name = self._display_name
+        new_obj._user_data = None if self.user_data is None else self.user_data.copy()
+        return new_obj
+
+
+
[docs]class VisualizationSet(_VisualizationBase): + """A visualization set containing analysis and context geometry to be visualized. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of AnalysisGeometry and ContextGeometry objects to display + in the visualization. Each geometry object will typically be translated + to its own layer within the interface that renders the VisualizationSet. + units: Text for the units system in which the visualization geometry + exists. If None, the geometry will always be assumed to be in the current + units system of the display interface. (Default: None). Choose from + the following: + + * Meters + * Millimeters + * Feet + * Inches + * Centimeters + + Properties: + * identifier + * display_name + * geometry + * min_point + * max_point + * units + * user_data + """ + __slots__ = ('_geometry', '_min_point', '_max_point', '_units') + + UNITS = ('Meters', 'Millimeters', 'Feet', 'Inches', 'Centimeters') + + def __init__(self, identifier, geometry, units=None): + """Initialize VisualizationSet.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + self.geometry = geometry + self.units = units + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an VisualizationSet from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationSet", + "identifier": "", # unique object identifier + "geometry": [] # list of AnalysisGeometry and ContextGeometry objects + } + """ + # check the type key + assert data['type'] == 'VisualizationSet', \ + 'Expected VisualizationSet, Got {}.'.format(data['type']) + # re-serialize the context and analysis geometry + geos = [] + for geo_data in data['geometry']: + if geo_data['type'] == 'AnalysisGeometry': + geos.append(AnalysisGeometry.from_dict(geo_data)) + else: + geos.append(ContextGeometry.from_dict(geo_data)) + new_obj = cls(data['identifier'], geos) + if 'units' in data and data['units'] is not None: + new_obj.units = data['units'] + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ +
[docs] @classmethod + def from_file(cls, vis_set_file): + """Initialize a VisualizationSet from a JSON or pkl file, auto-sensing the type. + + Args: + VisualizationSet: Path to either a VisualizationSet JSON or pkl file. + """ + # sense the file type from the first character to avoid maxing memory with JSON + # this is needed since queenbee overwrites all file extensions + with open(vis_set_file) as inf: + try: + first_char = inf.read(1) + is_json = True if first_char == '{' else False + except UnicodeDecodeError: # definitely a pkl file + is_json = False + # load the file using either JSON pathway or pkl + if is_json: + return cls.from_json(vis_set_file) + return cls.from_pkl(vis_set_file)
+ +
[docs] @classmethod + def from_json(cls, json_file): + """Initialize a VisualizationSet from a JSON file. + + Args: + json_file: Path to VisualizationSet JSON file. + """ + assert os.path.isfile(json_file), 'Failed to find %s' % json_file + if (sys.version_info < (3, 0)): + with open(json_file) as inf: + data = json.load(inf) + else: + with open(json_file, encoding='utf-8') as inf: + data = json.load(inf) + return cls.from_dict(data)
+ +
[docs] @classmethod + def from_pkl(cls, pkl_file): + """Initialize a Model from a pkl file. + + Args: + pkl_file: Path to pkl file. + """ + assert os.path.isfile(pkl_file), 'Failed to find %s' % pkl_file + with open(pkl_file, 'rb') as inf: + data = pickle.load(inf) + return cls.from_dict(data)
+ +
[docs] @classmethod + def from_single_analysis_geo( + cls, identifier, geometry, values, legend_parameters=None, + data_type=None, unit=None): + """Create an VisualizationSet from a raw geometry object and a list of values. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry objects that is aligned with the + values. The length of this list should usually be equal to the total + number of values in each data_set, indicating that each geometry gets + a single color. Alternatively, if all of the geometry objects are + meshes, the number of values in the data can be equal to the total + number of faces across the meshes or the total number of vertices + across the meshes. + values: A list of numerical values that will be used to generate the + visualization colors. + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + """ + viz_data = VisualizationData(values, legend_parameters, data_type, unit) + a_geo = AnalysisGeometry('{}_Geometry'.format(identifier), geometry, [viz_data]) + return cls(identifier, (a_geo,))
+ + @property + def geometry(self): + """Get or set a tuple of AnalysisGeometry and ContextGeometry objects.""" + return self._geometry + + @geometry.setter + def geometry(self, value): + assert isinstance(value, (list, tuple)), 'Expected list or tuple for' \ + ' VisualizationSet geometry. Got {}.'.format(type(value)) + if not isinstance(value, tuple): + value = tuple(value) + for geo in value: + self._check_geometry(geo) + self._geometry = value + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + + @property + def units(self): + """Get or set Text for the units system in which the geometry exists.""" + return self._units + + @units.setter + def units(self, value): + if value is not None: + value = value.title() + assert value in self.UNITS, '{} is not supported as a units system. ' \ + 'Choose from the following: {}'.format(value, self.UNITS) + self._units = value + +
[docs] def add_vis_set(self, vis_set): + """Add all geometry objects of another VisualizationSet to this one. + + Args: + vis_set: A VisualizationData object to be added to this AnalysisGeometry. + """ + for geo in vis_set.geometry: + self.add_geometry(geo)
+ +
[docs] def add_geometry(self, geometry, insert_index=None): + """Add a ContextGeometry or AnalysisGeometry object to this VisualizationSet. + + Args: + geometry: A ContextGeometry or AnalysisGeometry object to be added + to this VisualizationSet. + insert_index: An integer for the index at which the data should be + inserted. If None, the data will be appended to the end. (Default: None). + """ + self._check_geometry(geometry) + if insert_index is None: + self._geometry = self._geometry + (geometry,) + else: + geos_list = list(self._geometry) + geos_list.insert(insert_index, geometry) + self._geometry = tuple(geos_list) + self._min_point = None + self._max_point = None
+ +
[docs] def remove_geometry(self, geo_index): + """Remove a geometry object from this VisualizationSet. + + Args: + geo_index: An integer for the geometry index to be removed. + """ + assert geo_index < len(self._geometry), 'geo_index ({}) must be less than ' \ + 'the number of items in the data_sets ({}).'.format( + geo_index, len(self._geometry)) + geos_list = list(self._geometry) + geos_list.pop(geo_index) + self._geometry = tuple(geos_list) + self._min_point = None + self._max_point = None
+ +
[docs] def check_duplicate_identifiers(self, raise_exception=True, detailed=False): + """Check that there are no duplicate geometry object identifiers in the set. + + Args: + raise_exception: Boolean to note whether a ValueError should be raised + if duplicate identifiers are found. (Default: True). + detailed: Boolean for whether the returned object is a detailed list of + dicts with error info or a string with a message. (Default: False). + + Returns: + A string with the message or a list with a dictionary if detailed is True. + """ + detailed = False if raise_exception else detailed + obj_id_iter = (obj.identifier for obj in self.geometry) + dup = [t for t, c in collections.Counter(obj_id_iter).items() if c > 1] + if len(dup) != 0: + if detailed: + err_list = [] + for dup_id in dup: + msg = 'There is a duplicated geometry identifier: {}'.format(dup_id) + dup_dict = { + 'type': 'ValidationError', + 'element_type': 'Geometry', + 'element_id': dup_id, + 'element_name': dup_id, + 'message': msg + } + err_list.append(dup_dict) + return err_list + msg = 'The following duplicated Geometry identifiers were found:\n{}'.format( + '\n'.join(dup)) + if raise_exception: + raise ValueError(msg) + return msg + return [] if detailed else ''
+ +
[docs] def graphic_container(self, geo_index=0, data_index=None, + min_point=None, max_point=None): + """Get a Ladybug GraphicContainer object, which can be used to draw legends. + + Args: + geo_index: Integer for the index of the geometry for which a + GraphicContainer will be returned. Note that this index must refer + to an analysis geometry in order to produce a valid graphic + container. (Default: 0). + data_index: Integer for the index of the data set for which a + GraphicContainer will be returned. If None, the active_data set + will be used. (Default: None). + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. If None, this object's own min_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. If None, this object's own max_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + """ + # check to be sure that there is analysis geometry + geo_obj = self.geometry[geo_index] + assert isinstance(geo_obj, AnalysisGeometry), 'VisualizationSet geo_index ' \ + 'must refer to an AnalysisGeometry in order to use ' \ + 'graphic_container method.' + # ensure that min and max points always make sense + min_point = self.min_point if min_point is None else min_point + max_point = self.max_point if max_point is None else max_point + # return the Graphic Container for the correct data set + data_index = geo_obj.active_data if data_index is None else data_index + dat_set = geo_obj.data_sets[data_index] + return dat_set.graphic_container(min_point, max_point)
+ +
[docs] def move(self, moving_vec): + """Move this VisualizationSet along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the VisualizationSet. + """ + for geo in self.geometry: + geo.move(moving_vec)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this VisualizationSet counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + for geo in self.geometry: + geo.rotate_xy(angle, origin)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this VisualizationSet by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + for geo in self._geometry: + geo.scale(factor, origin)
+ +
[docs] def convert_to_units(self, units): + """Convert all of the geometry in this VisualizationSet to certain units. + + This involves scaling the geometry and changing the VisualizationSet's + units property. + + Args: + units: Text for the units to which the VisualizationSet geometry should be + converted. Choose from the following: + + * Meters + * Millimeters + * Feet + * Inches + * Centimeters + """ + if self.units != units: + scale_fac1 = self._conversion_factor_to_meters(self.units) + scale_fac2 = self._conversion_factor_to_meters(units) + scale_fac = scale_fac1 / scale_fac2 + self.scale(scale_fac) + self.units = units
+ +
[docs] def to_dict(self): + """Get VisualizationSet as a dictionary.""" + base = { + 'type': 'VisualizationSet', + 'identifier': self.identifier, + 'geometry': [geo_obj.to_dict() for geo_obj in self.geometry] + } + if self._units is not None: + base['units'] = self.units + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def to_json(self, name, folder, indent=None): + """Write VisualizationSet to JSON. + + Args: + name: A text string for the name of the JSON file. + folder: A text string for the directory where the JSON will be written. + indent: A positive integer to set the indentation used in the resulting + JSON file. (Default: None). + """ + # create dictionary from the VisualizationSet + vs_dict = self.to_dict() + # set up a name and folder for the JSON + nl = name.lower() + file_name = name if nl.endswith('.vsf') or nl.endswith('.json') \ + else '{}.vsf'.format(name) + if not os.path.isdir(folder): + os.makedirs(folder) + vs_file = os.path.join(folder, file_name) + # write JSON + with open(vs_file, 'w') as fp: + json.dump(vs_dict, fp, indent=indent) + return vs_file
+ +
[docs] def to_pkl(self, name, folder): + """Write VisualizationSet to compressed pickle file (pkl). + + Args: + name: A text string for the name of the pickle file. + folder: A text string for the directory where the pickle file will be + written. + """ + # create dictionary from the VisualizationSet + vs_dict = self.to_dict() + # set up a name and folder for the pkl + nl = name.lower() + file_name = name if nl.endswith('.vsf') or nl.endswith('.pkl') \ + else '{}.vsf'.format(name) + if not os.path.isdir(folder): + os.makedirs(folder) + vs_file = os.path.join(folder, file_name) + # write the Model dictionary into a file + with open(vs_file, 'wb') as fp: + pickle.dump(vs_dict, fp) + return vs_file
+ + def _check_geometry(self, geo): + """Check that the geometry object is valid.""" + assert isinstance(geo, (AnalysisGeometry, ContextGeometry)), 'Expected ' \ + 'AnalysisGeometry or ContextGeometry for VisualizationSet geometry. ' \ + 'Got {}.'.format(type(geo)) + + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + all_geo = [] + for geo_obj in self.geometry: + all_geo.append(geo_obj.min_point) + all_geo.append(geo_obj.max_point) + if len(all_geo) != 0: + self._min_point, self._max_point = bounding_box(all_geo) + + def _conversion_factor_to_meters(self, units): + """Get the conversion factor to meters based on input units. + + Args: + units: Text for the units. + + Returns: + A number for the conversion factor, which should be multiplied by + all distance units taken from Rhino geometry in order to convert + them to meters. + """ + if units == 'Meters': + return 1.0 + elif units == 'Millimeters': + return 0.001 + elif units == 'Feet': + return 0.305 + elif units == 'Inches': + return 0.0254 + elif units == 'Centimeters': + return 0.01 + else: + raise ValueError( + 'You are kidding me! What units are you using? {}?\n' + 'Please use one of the following: {}'.format(units, ' '.join(self.UNITS)) + ) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __copy__(self): + new_geo_objs = tuple(obj.duplicate() for obj in self.geometry) + new_obj = VisualizationSet(self.identifier, new_geo_objs, self.units) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of geometries on the object.""" + return len(self.geometry) + + def __getitem__(self, key): + """Return one of the geometries.""" + return self.geometry[key] + + def __iter__(self): + """Iterate through the geometries.""" + return iter(self.geometry) + + def __repr__(self): + """VisualizationSet representation.""" + return 'Visualization Set: {}'.format(self.display_name)
+ + +
[docs]class ContextGeometry(_VisualizationBase): + """An object representing context geometry to display. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry or ladybug-display objects that gives + context to analysis geometry or other aspects of the visualization. + Typically, these will display in wireframe around the geometry, though + the properties of display geometry can be used to customize the + visualization. + hidden: A boolean to note whether the geometry is hidden by default and + must be un-hidden to be visible in the 3D scene. (Default: False). + + Properties: + * identifier + * display_name + * geometry + * hidden + * min_point + * max_point + * user_data + """ + __slots__ = ('_geometry', '_min_point', '_max_point', '_hidden') + + WIREFRAME_MAP = { + Vector2D: (DisplayVector2D, None), + Point2D: (DisplayPoint2D, None), + Ray2D: (DisplayRay2D, None), + LineSegment2D: (DisplayLineSegment2D, None), + Polyline2D: (DisplayPolyline2D, None), + Arc2D: (DisplayArc2D, None), + Polygon2D: (DisplayPolygon2D, None, 'Wireframe'), + Mesh2D: (DisplayMesh2D, None, 'Wireframe'), + Vector3D: (DisplayVector3D, None), + Point3D: (DisplayPoint3D, None), + Ray3D: (DisplayRay3D, None), + Plane: (DisplayPlane, None), + LineSegment3D: (DisplayLineSegment3D, None), + Polyline3D: (DisplayPolyline3D, None), + Arc3D: (DisplayArc3D, None), + Face3D: (DisplayFace3D, None, 'Wireframe'), + Mesh3D: (DisplayMesh3D, None, 'Wireframe'), + Polyface3D: (DisplayPolyface3D, None, 'Wireframe'), + Sphere: (DisplaySphere, None, 'Wireframe'), + Cone: (DisplayCone, None, 'Wireframe'), + Cylinder: (DisplayCylinder, None, 'Wireframe') + } + + def __init__(self, identifier, geometry, hidden=False): + """Initialize ContextGeometry.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + self.geometry = geometry + self.hidden = hidden + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an ContextGeometry from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "ContextGeometry", + "identifier": "", # unique object identifier + "geometry": [], # list of ladybug-display geometry objects + "hidden": True # boolean for whether the layer is hidden by default + } + """ + # check the type key + assert data['type'] == 'ContextGeometry', \ + 'Expected ContextGeometry, Got {}.'.format(data['type']) + # re-serialize the object + geos = tuple(dict_to_object(geo) for geo in data['geometry']) + hidden = False if 'hidden' not in data else data['hidden'] + new_obj = cls(data['identifier'], geos, hidden) + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def geometry(self): + """Get or set a tuple of ladybug_display geometry objects for context. + + When setting this property, it is also acceptable to include raw + ladybug_geometry objects in the list and they will automatically be + converted into a wireframe representation as a ladybug-display object. + """ + return self._geometry + + @geometry.setter + def geometry(self, value): + assert isinstance(value, (list, tuple)), 'Expected list or tuple for' \ + ' ContextGeometry geometry. Got {}.'.format(type(value)) + processed_value = [] + for geo in value: + if isinstance(geo, DISPLAY_UNION): + processed_value.append(geo) + elif isinstance(geo, GEOMETRY_UNION): + processed_value.append(self.geometry_to_wireframe(geo)) + else: + raise ValueError( + 'Expected ladybug-geometry or ladybug-display object for ' + 'ContextGeometry. Got {}.'.format(type(geo))) + self._geometry = tuple(processed_value) + + @property + def hidden(self): + """Get or set a boolean for whether the geometry is hidden by default.""" + return self._hidden + + @hidden.setter + def hidden(self, value): + self._hidden = bool(value) + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + +
[docs] def move(self, moving_vec): + """Move this ContextGeometry along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the ContextGeometry. + """ + moving_vec_2d = Vector2D(moving_vec.x, moving_vec.y) + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.move(moving_vec) + elif isinstance(geo, _DisplayBase2D): + geo.move(moving_vec_2d)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this ContextGeometry counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + origin_2d = Point2D(origin.x, origin.y) + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.rotate_xy(angle, origin) + elif isinstance(geo, _DisplayBase2D): + geo.rotate(angle, origin_2d)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this ContextGeometry by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + origin_2d = Point2D(origin.x, origin.y) if origin is not None else None + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.scale(factor, origin) + elif isinstance(geo, _DisplayBase2D): + geo.scale(factor, origin_2d)
+ +
[docs] def to_dict(self): + """Get ContextGeometry as a dictionary.""" + base = { + 'type': 'ContextGeometry', + 'identifier': self.identifier, + 'geometry': [geo.to_dict() for geo in self.geometry], + 'hidden': self.hidden + } + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] @staticmethod + def geometry_to_wireframe(geometry): + """Convert a raw ladybug-geometry object into a wireframe ladybug-display object. + + Args: + geometry: A raw ladybug-geometry object to be converted to a wireframe + ladybug-display object. + """ + conv_info = ContextGeometry.WIREFRAME_MAP[geometry.__class__] + new_class, wire_args = conv_info[0], list(conv_info[1:]) + wire_args.insert(0, geometry) + return new_class(*wire_args)
+ + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + lb_geos = [d_geo.geometry for d_geo in self.geometry] + self._min_point, self._max_point = bounding_box(lb_geos) + + def __copy__(self): + new_geo_objs = tuple(geo.duplicate() for geo in self.geometry) + new_obj = ContextGeometry(self.identifier, new_geo_objs, self.hidden) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of geometries on the object.""" + return len(self.geometry) + + def __getitem__(self, key): + """Return one of the geometries.""" + return self.geometry[key] + + def __iter__(self): + """Iterate through the geometries.""" + return iter(self.geometry) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """AnalysisGeometry representation.""" + return 'Context Geometry: {}'.format(self.display_name)
+ + +
[docs]class AnalysisGeometry(_VisualizationBase): + """An object where geometry is colored with data. + + Multiple data sets for different metrics can correspond to the same geometry. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry objects that is aligned with the values in + the input data_sets. The length of this list should usually be equal to the + total number of values in each data_set, indicating that each geometry + gets a single color. Alternatively, if all of the geometry objects are + meshes, the number of values in the data can be equal to the total number + of faces across the meshes or the total number of vertices across the meshes. + data_sets: A list of VisualizationData objects representing the data sets + that are associated with the input geometry. + active_data: An integer to denote which of the input data_sets should be + displayed by default. (Default: 0). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + hidden: A boolean to note whether the geometry is hidden by default and + must be un-hidden to be visible in the 3D scene. (Default: False). + + Properties: + * identifier + * display_name + * geometry + * data_sets + * active_data + * display_mode + * hidden + * min_point + * max_point + * matching_method + * user_data + """ + __slots__ = ( + '_geometry', '_data_sets', '_active_data', '_display_mode', '_hidden', + '_min_point', '_max_point', '_possible_lengths', '_matching_method') + T_FORMABLE_2D = (Point2D, Ray2D, LineSegment2D, Polyline2D, Arc2D, Polygon2D, Mesh2D) + + def __init__(self, identifier, geometry, data_sets, + active_data=0, display_mode='Surface', hidden=False): + """Initialize AnalysisGeometry.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + if not isinstance(geometry, tuple): + geometry = tuple(geometry) + if not isinstance(data_sets, tuple): + data_sets = tuple(data_sets) + self._possible_lengths = self._possible_data_lengths(geometry) + self._matching_method = None + for dat in data_sets: + self._check_data_set(dat) + self._geometry = geometry + self._data_sets = data_sets + self.active_data = active_data + self.display_mode = display_mode + self.hidden = hidden + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an AnalysisGeometry from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "AnalysisGeometry", + "identifier": "", # unique object identifier + "geometry": [], # list of geometry objects + "data_sets": [], # list of data sets associated with the geometry + "active_data": 0, # integer for the index of the active data set + "display_mode": "Surface", # text for the display mode of the data + "hidden": True # boolean for whether the layer is hidden by default + } + """ + # check the type key + assert data['type'] == 'AnalysisGeometry', \ + 'Expected AnalysisGeometry, Got {}.'.format(data['type']) + # re-serialize the geometry and data sets + geos = tuple(geometry_dict_to_object(geo) for geo in data['geometry']) + dts = tuple(VisualizationData.from_dict(dt) for dt in data['data_sets']) + # re-serialize the data type and unit + act_dt = data['active_data'] if 'active_data' in data else 0 + d_mode = data['display_mode'] if 'display_mode' in data else 'Surface' + hidden = False if 'hidden' not in data else data['hidden'] + new_obj = cls(data['identifier'], geos, dts, act_dt, d_mode, hidden) + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def geometry(self): + """Get a tuple of geometry objects assigned to this AnalysisGeometry.""" + return self._geometry + + @property + def data_sets(self): + """Get a tuple of VisualizationData assigned to the AnalysisGeometry.""" + return self._data_sets + + @property + def active_data(self): + """Get or set an integer for the index of data set that is actively displaying. + """ + return self._active_data + + @active_data.setter + def active_data(self, value): + self._active_data = int_in_range( + value, 0, len(self._data_sets) - 1, 'active_data') + + @property + def display_mode(self): + """Get or set text to indicate the display mode.""" + return self._display_mode + + @display_mode.setter + def display_mode(self, value): + clean_input = value.lower() + for key in DISPLAY_MODES: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'display_mode {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, DISPLAY_MODES)) + self._display_mode = value + + @property + def hidden(self): + """Get or set a boolean for whether the geometry is hidden by default.""" + return self._hidden + + @hidden.setter + def hidden(self, value): + self._hidden = bool(value) + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + + @property + def matching_method(self): + """Get text for the method by which the data is matched to the geometry. + + This will be one of the following. + + * geometries - One value is assigned for each geometry + * faces - One value is assigned per each face of the Mesh + * vertices - One value is assigned per each vertex of the Mesh + """ + return self._matching_method + + @property + def user_data(self): + """Get or set an optional dictionary for additional meta data for this object. + + This will be None until it has been set. All keys and values of this + dictionary should be of a standard Python type to ensure correct + serialization of the object to/from JSON (eg. str, float, int, list, dict) + """ + return self._user_data + + @user_data.setter + def user_data(self, value): + if value is not None: + assert isinstance(value, dict), 'Expected dictionary for ' \ + 'object user_data. Got {}.'.format(type(value)) + self._user_data = value + +
[docs] def add_data_set(self, data, insert_index=None): + """Add a data set to this AnalysisGeometry object. + + Args: + data: A VisualizationData object to be added to this AnalysisGeometry. + insert_index: An integer for the index at which the data should be + inserted. If None, the data will be appended to the end. (Default: None). + """ + self._check_data_set(data) + if insert_index is None: + self._data_sets = self._data_sets + (data,) + else: + ds_list = list(self._data_sets) + ds_list.insert(insert_index, data) + self._data_sets = tuple(ds_list)
+ +
[docs] def remove_data_set(self, data_index): + """Remove a data set from this AnalysisGeometry object. + + Args: + data_index: An integer for the data index to be removed. + """ + assert data_index < len(self._data_sets), 'data_index ({}) must be less than ' \ + 'the number of items in the data_sets ({}).'.format( + data_index, len(self._data_sets)) + ds_list = list(self._data_sets) + ds_list.pop(data_index) + self._data_sets = tuple(ds_list) + if self._active_data == len(self._data_sets): + self._active_data = len(self._data_sets) - 1
+ +
[docs] def graphic_container(self, data_index=None, min_point=None, max_point=None): + """Get a Ladybug GraphicContainer object, which can be used to draw legends. + + Args: + data_index: Integer for the index of the data set for which a + GraphicContainer will be returned. If None, the active_data set + will be used. (Default: None). + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. If None, this object's own min_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. If None, this object's own max_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + """ + # ensure that min and max points always make sense + min_point = self.min_point if min_point is None else min_point + max_point = self.max_point if max_point is None else max_point + # return the Graphic Container for the correct data set + data_index = self.active_data if data_index is None else data_index + return self.data_sets[data_index].graphic_container(min_point, max_point)
+ +
[docs] def move(self, moving_vec): + """Move this AnalysisGeometry along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the AnalysisGeometry. + """ + new_geo = [] + moving_vec_2d = Vector2D(moving_vec.x, moving_vec.y) + for geo in self._geometry: + try: # most likely a 3D object + new_geo.append(geo.move(moving_vec)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.move(moving_vec_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this AnalysisGeometry counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + new_geo = [] + origin_2d = Point2D(origin.x, origin.y) + for geo in self._geometry: + try: + new_geo.append(geo.rotate_xy(angle, origin)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.rotate(angle, origin_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this AnalysisGeometry by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + new_geo = [] + origin_2d = Point2D(origin.x, origin.y) if origin is not None else None + for geo in self._geometry: + try: + new_geo.append(geo.scale(factor, origin)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.scale(factor, origin_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def to_dict(self): + """Get AnalysisGeometry as a dictionary.""" + base = { + 'type': 'AnalysisGeometry', + 'identifier': self.identifier, + 'geometry': [geo.to_dict() for geo in self.geometry], + 'data_sets': [ds.to_dict() for ds in self.data_sets], + 'active_data': self.active_data, + 'display_mode': self.display_mode, + 'hidden': self.hidden + } + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def _check_data_set(self, data_set): + """Check that a data set is compatible with the geometry.""" + assert isinstance(data_set, VisualizationData), 'Expected VisualizationData ' \ + 'for AnalysisGeometry. Got {}.'.format(type(data_set)) + if self._matching_method is None: # first data set to be matched + pl = self._possible_lengths + if pl[1] == 0 and pl[2] == 0: + assert len(data_set) == pl[0], 'Expected number of data set values ' \ + '({}) to align with the number of geometries ({}).'.format( + len(data_set.values), pl[0]) + else: + assert len(data_set) in pl, 'Expected number of data set values ' \ + '({}) to align with the number of geometries ({}), the number of ' \ + 'geometry faces ({}), or the number of geometry vertices ' \ + '({}).'.format(len(data_set.values), pl[0], pl[1], pl[2]) + self._matching_method = self._matching_type(data_set)[0] + else: + assert self._matching_type(data_set)[0] == self._matching_method, \ + 'Expected number of data set values ({}) to align with the number ' \ + 'of {} ({}).'.format(len(data_set.values), self._matching_method, + self._matching_type(data_set)[1]) + + def _matching_type(self, dat_set): + """Get text and number of values for the method by which data and geometry match. + + Args: + dat_set: A data set which will have its length evaluated in relation to + this object's geometry. + """ + geo_len, face_len, vert_len = self._possible_lengths + if len(dat_set) == geo_len: + return 'geometries', geo_len + if len(dat_set) == face_len: + return 'faces', face_len + if len(dat_set) == vert_len: + return 'vertices', vert_len + + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + self._min_point, self._max_point = bounding_box(self.geometry) + + @staticmethod + def _possible_data_lengths(geometry): + """Get the acceptable data lengths given the input geometry.""" + geo_count_0, geo_count_1, geo_count_2 = len(geometry), 0, 0 + for geo in geometry: + if isinstance(geo, (Mesh2D, Mesh3D)): + geo_count_1 += len(geo.faces) + geo_count_2 += len(geo.vertices) + else: + assert isinstance(geo, GEOMETRY_UNION), 'Expected ladybug geometry ' \ + 'object for AnalysisGeometry. Got {}.'.format(type(geo)) + return (geo_count_0, geo_count_1, geo_count_2) + + def __copy__(self): + new_d = tuple(data.duplicate() for data in self.data_sets) + new_obj = AnalysisGeometry( + self.identifier, self.geometry, new_d, self.active_data, + self.display_mode, self.hidden) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of data sets on the object.""" + return len(self.data_sets) + + def __getitem__(self, key): + """Return one of the data sets.""" + return self.data_sets[key] + + def __iter__(self): + """Iterate through the data sets.""" + return iter(self.data_sets) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """AnalysisGeometry representation.""" + return 'Analysis Geometry: {}'.format(self.display_name)
+ + +
[docs]class VisualizationMetaData(object): + """Represents the metadata for visualization with legend parameters and data type. + + Args: + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + + Properties: + * legend_parameters + * data_type + * unit + * user_data + """ + __slots__ = ('_legend_parameters', '_data_type', '_unit', '_user_data') + + def __init__(self, legend_parameters=None, data_type=None, unit=None): + """Initialize VisualizationMetaData.""" + self._legend_parameters = legend_parameters + self._data_type = data_type + self._unit = unit + self._user_data = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create VisualizationMetaData from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationMetaData", + "legend_parameters": {}, # optional LegendParameter specification + "data_type": {}, # optional DataType object + "unit": "C" # optional text for the units + } + """ + # check the type key + assert data['type'] == 'VisualizationMetaData', \ + 'Expected VisualizationMetaData, Got {}.'.format(data['type']) + # re-serialize the legend parameters + legend_parameters = None + if 'legend_parameters' in data and data['legend_parameters'] is not None: + if data['legend_parameters']['type'] == 'LegendParametersCategorized': + legend_parameters = LegendParametersCategorized.from_dict( + data['legend_parameters']) + else: + legend_parameters = LegendParameters.from_dict(data['legend_parameters']) + # re-serialize the data type and unit + data_type = None + if 'data_type' in data and data['data_type'] is not None: + data_type = DataTypeBase.from_dict(data['data_type']) + unit = data['unit'] if 'unit' in data else None + new_obj = cls(legend_parameters, data_type, unit) + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def legend_parameters(self): + """Get the legend parameters assigned to this data set.""" + return self._legend_parameters + + @property + def data_type(self): + """Get the data_type input to this object (if it exists).""" + return self._data_type + + @property + def unit(self): + """Get the unit input to this object (if it exists).""" + return self._unit + + @property + def user_data(self): + """Get or set an optional dictionary for additional meta data for this object. + + This will be None until it has been set. All keys and values of this + dictionary should be of a standard Python type to ensure correct + serialization of the object to/from JSON (eg. str, float, int, list, dict) + """ + return self._user_data + + @user_data.setter + def user_data(self, value): + if value is not None: + assert isinstance(value, dict), 'Expected dictionary for ' \ + 'object user_data. Got {}.'.format(type(value)) + self._user_data = value + +
[docs] def to_dict(self): + """Get visualization data as a dictionary.""" + base = { + 'type': 'VisualizationMetaData' + } + if self._legend_parameters is not None: + base['legend_parameters'] = self._legend_parameters.to_dict() + if self.data_type is not None: + base['data_type'] = self.data_type.to_dict() + if self.unit: + base['unit'] = self.unit + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """VisualizationMetaData representation.""" + return 'Visualization MetaData'
+ + +
[docs]class VisualizationData(VisualizationMetaData): + """Represents a data set for visualization with legend parameters and data type. + + Args: + values: A list of numerical values that will be used to generate the + visualization colors. + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + + Properties: + * values + * legend_parameters + * legend + * data_type + * unit + * value_colors + * user_data + """ + __slots__ = ('_legend',) + + def __init__(self, values, legend_parameters=None, data_type=None, unit=None): + """Initialize VisualizationData.""" + # set up the legend using the values and legend parameters + VisualizationMetaData.__init__(self, legend_parameters, data_type, unit) + + # assign defaults to the legend parameter using the values and the data type + self._legend = Legend(values, legend_parameters) + if data_type is not None: + assert isinstance(data_type, DataTypeBase), \ + 'data_type should be a ladybug DataType. Got {}'.format(type(data_type)) + if self.legend_parameters.is_title_default: + unit = unit if unit else data_type.units[0] + data_type.is_unit_acceptable(unit) + self.legend_parameters.title = unit if \ + self.legend_parameters.vertical \ + else '{} ({})'.format(data_type.name, unit) + if data_type.unit_descr is not None and \ + self.legend_parameters.ordinal_dictionary is None and not \ + isinstance(self.legend_parameters, LegendParametersCategorized): + self.legend_parameters.ordinal_dictionary = data_type.unit_descr + sorted_keys = sorted(data_type.unit_descr.keys()) + if self.legend.is_min_default: + self.legend_parameters._min = sorted_keys[0] + if self.legend.is_max_default: + self.legend_parameters._max = sorted_keys[-1] + assert self.legend_parameters._min <= self.legend_parameters._max, \ + 'Legend min is greater than legend max. {} > {}.'.format( + self.legend_parameters._min, self.legend_parameters._max) + if self.legend_parameters.is_segment_count_default: + try: # try to set the number of segments to align with ordinal text + min_i = sorted_keys.index(self.legend_parameters.min) + max_i = sorted_keys.index(self.legend_parameters.max) + self.legend_parameters.segment_count = \ + len(sorted_keys[min_i:max_i + 1]) + except IndexError: + pass + elif unit and self.legend_parameters.is_title_default: + assert isinstance(unit, str), \ + 'Expected string for unit. Got {}.'.format(type(unit)) + self.legend_parameters.title = unit + +
[docs] @classmethod + def from_dict(cls, data): + """Create VisualizationData from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationData", + "values": [0, 10], + "legend_parameters": {}, # optional LegendParameter specification + "data_type": {}, # optional DataType object + "unit": "C" # optional text for the units + } + """ + # check the type key + assert data['type'] == 'VisualizationData', \ + 'Expected VisualizationData, Got {}.'.format(data['type']) + # re-serialize the legend parameters + legend_parameters = None + if 'legend_parameters' in data and data['legend_parameters'] is not None: + if data['legend_parameters']['type'] == 'LegendParametersCategorized': + legend_parameters = LegendParametersCategorized.from_dict( + data['legend_parameters']) + else: + legend_parameters = LegendParameters.from_dict(data['legend_parameters']) + # re-serialize the data type and unit + data_type = None + if 'data_type' in data and data['data_type'] is not None: + data_type = DataTypeBase.from_dict(data['data_type']) + unit = data['unit'] if 'unit' in data else None + new_obj = cls(data['values'], legend_parameters, data_type, unit) + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def values(self): + """Get the values assigned to the data set.""" + return self._legend.values + + @property + def legend_parameters(self): + """Get the legend parameters assigned to this data set.""" + return self._legend._legend_par + + @property + def legend(self): + """Get the legend assigned to this data set.""" + return self._legend + + @property + def value_colors(self): + """Get a List of colors associated with the assigned values.""" + return self._legend.value_colors + +
[docs] def graphic_container(self, min_point, max_point): + """Get a Ladybug GraphicContainer object, which can be used to a draw legend. + + Args: + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. + """ + return GraphicContainer( + self.values, min_point, max_point, self._legend_parameters, + self._data_type, self._unit)
+ +
[docs] def to_dict(self): + """Get visualization data as a dictionary.""" + base = { + 'type': 'VisualizationData', + 'values': self.values + } + if self._legend_parameters is not None: + base['legend_parameters'] = self._legend_parameters.to_dict() + if self.data_type is not None: + base['data_type'] = self.data_type.to_dict() + if self.unit: + base['unit'] = self.unit + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def duplicate(self): + """Get a copy of this object.""" + return self.__copy__()
+ + def __copy__(self): + new_obj = VisualizationData( + self.values, self._legend_parameters, self._data_type, self._unit) + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return length of values on the object.""" + return len(self._legend._values) + + def __getitem__(self, key): + """Return one of the values.""" + return self._legend._values[key] + + def __iter__(self): + """Iterate through the values.""" + return iter(self._legend._values) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """VisualizationData representation.""" + return 'Visualization Data ({} values)'.format(len(self))
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_sources/cli/index.rst.txt b/docs/_sources/cli/index.rst.txt new file mode 100644 index 0000000..6172e77 --- /dev/null +++ b/docs/_sources/cli/index.rst.txt @@ -0,0 +1,7 @@ +CLI Docs +======== + +Installation +------------ + +To check if the command line is installed correctly use ``ladybug-display --help`` diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt new file mode 100644 index 0000000..e255363 --- /dev/null +++ b/docs/_sources/index.rst.txt @@ -0,0 +1,28 @@ +Welcome to ladybug-display's documentation! +=================================== + +A library that assigns basic display attributes to ladybug-geometry objects (color, line weight, line type, etc). + + +Installation +============ + +``pip install ladybug-display`` + + +ladybug-display +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +.. include:: modules.rst + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/_sources/ladybug_display.altnumber.rst.txt b/docs/_sources/ladybug_display.altnumber.rst.txt new file mode 100644 index 0000000..c01dcfb --- /dev/null +++ b/docs/_sources/ladybug_display.altnumber.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.altnumber module +================================= + +.. automodule:: ladybug_display.altnumber + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.dictutil.rst.txt b/docs/_sources/ladybug_display.dictutil.rst.txt new file mode 100644 index 0000000..995ca97 --- /dev/null +++ b/docs/_sources/ladybug_display.dictutil.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.dictutil module +================================ + +.. automodule:: ladybug_display.dictutil + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt b/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt new file mode 100644 index 0000000..96980fe --- /dev/null +++ b/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.adaptivechart module +=============================================== + +.. automodule:: ladybug_display.extension.adaptivechart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.compass.rst.txt b/docs/_sources/ladybug_display.extension.compass.rst.txt new file mode 100644 index 0000000..1b6fffb --- /dev/null +++ b/docs/_sources/ladybug_display.extension.compass.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.compass module +========================================= + +.. automodule:: ladybug_display.extension.compass + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt b/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt new file mode 100644 index 0000000..0724912 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.hourlyplot module +============================================ + +.. automodule:: ladybug_display.extension.hourlyplot + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.monthlychart.rst.txt b/docs/_sources/ladybug_display.extension.monthlychart.rst.txt new file mode 100644 index 0000000..6e1cba6 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.monthlychart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.monthlychart module +============================================== + +.. automodule:: ladybug_display.extension.monthlychart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.psychchart.rst.txt b/docs/_sources/ladybug_display.extension.psychchart.rst.txt new file mode 100644 index 0000000..59a3904 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.psychchart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.psychchart module +============================================ + +.. automodule:: ladybug_display.extension.psychchart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.raddome.rst.txt b/docs/_sources/ladybug_display.extension.raddome.rst.txt new file mode 100644 index 0000000..651007b --- /dev/null +++ b/docs/_sources/ladybug_display.extension.raddome.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.raddome module +========================================= + +.. automodule:: ladybug_display.extension.raddome + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.radrose.rst.txt b/docs/_sources/ladybug_display.extension.radrose.rst.txt new file mode 100644 index 0000000..70c5eb9 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.radrose.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.radrose module +========================================= + +.. automodule:: ladybug_display.extension.radrose + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.rst.txt b/docs/_sources/ladybug_display.extension.rst.txt new file mode 100644 index 0000000..5e9da9d --- /dev/null +++ b/docs/_sources/ladybug_display.extension.rst.txt @@ -0,0 +1,36 @@ +ladybug\_display.extension package +================================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.study + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.adaptivechart + ladybug_display.extension.compass + ladybug_display.extension.hourlyplot + ladybug_display.extension.monthlychart + ladybug_display.extension.psychchart + ladybug_display.extension.raddome + ladybug_display.extension.radrose + ladybug_display.extension.skydome + ladybug_display.extension.sunpath + ladybug_display.extension.windprofile + ladybug_display.extension.windrose + +Module contents +--------------- + +.. automodule:: ladybug_display.extension + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.skydome.rst.txt b/docs/_sources/ladybug_display.extension.skydome.rst.txt new file mode 100644 index 0000000..6365d4d --- /dev/null +++ b/docs/_sources/ladybug_display.extension.skydome.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.skydome module +========================================= + +.. automodule:: ladybug_display.extension.skydome + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.directsun.rst.txt b/docs/_sources/ladybug_display.extension.study.directsun.rst.txt new file mode 100644 index 0000000..a5644c4 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.directsun.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.study.directsun module +================================================= + +.. automodule:: ladybug_display.extension.study.directsun + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.radiation.rst.txt b/docs/_sources/ladybug_display.extension.study.radiation.rst.txt new file mode 100644 index 0000000..a781610 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.radiation.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.study.radiation module +================================================= + +.. automodule:: ladybug_display.extension.study.radiation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.rst.txt b/docs/_sources/ladybug_display.extension.study.rst.txt new file mode 100644 index 0000000..dee71d4 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.rst.txt @@ -0,0 +1,19 @@ +ladybug\_display.extension.study package +======================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.study.directsun + ladybug_display.extension.study.radiation + +Module contents +--------------- + +.. automodule:: ladybug_display.extension.study + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.sunpath.rst.txt b/docs/_sources/ladybug_display.extension.sunpath.rst.txt new file mode 100644 index 0000000..0cb21e3 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.sunpath.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.sunpath module +========================================= + +.. automodule:: ladybug_display.extension.sunpath + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.windprofile.rst.txt b/docs/_sources/ladybug_display.extension.windprofile.rst.txt new file mode 100644 index 0000000..e7d6eb1 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.windprofile.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.windprofile module +============================================= + +.. automodule:: ladybug_display.extension.windprofile + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.windrose.rst.txt b/docs/_sources/ladybug_display.extension.windrose.rst.txt new file mode 100644 index 0000000..6777523 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.windrose.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.windrose module +========================================== + +.. automodule:: ladybug_display.extension.windrose + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.arc.rst.txt b/docs/_sources/ladybug_display.geometry2d.arc.rst.txt new file mode 100644 index 0000000..94c15e6 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.arc.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.arc module +====================================== + +.. automodule:: ladybug_display.geometry2d.arc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.line.rst.txt b/docs/_sources/ladybug_display.geometry2d.line.rst.txt new file mode 100644 index 0000000..6304a80 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.line.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.line module +======================================= + +.. automodule:: ladybug_display.geometry2d.line + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt b/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt new file mode 100644 index 0000000..b6ffcc4 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.mesh module +======================================= + +.. automodule:: ladybug_display.geometry2d.mesh + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.point.rst.txt b/docs/_sources/ladybug_display.geometry2d.point.rst.txt new file mode 100644 index 0000000..0ec905e --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.point.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.point module +======================================== + +.. automodule:: ladybug_display.geometry2d.point + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt b/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt new file mode 100644 index 0000000..7327a49 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.polygon module +========================================== + +.. automodule:: ladybug_display.geometry2d.polygon + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt b/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt new file mode 100644 index 0000000..63000b4 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.polyline module +=========================================== + +.. automodule:: ladybug_display.geometry2d.polyline + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.ray.rst.txt b/docs/_sources/ladybug_display.geometry2d.ray.rst.txt new file mode 100644 index 0000000..3168a38 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.ray.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.ray module +====================================== + +.. automodule:: ladybug_display.geometry2d.ray + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.rst.txt b/docs/_sources/ladybug_display.geometry2d.rst.txt new file mode 100644 index 0000000..a566d74 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.rst.txt @@ -0,0 +1,25 @@ +ladybug\_display.geometry2d package +=================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.geometry2d.arc + ladybug_display.geometry2d.line + ladybug_display.geometry2d.mesh + ladybug_display.geometry2d.point + ladybug_display.geometry2d.polygon + ladybug_display.geometry2d.polyline + ladybug_display.geometry2d.ray + ladybug_display.geometry2d.vector + +Module contents +--------------- + +.. automodule:: ladybug_display.geometry2d + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.vector.rst.txt b/docs/_sources/ladybug_display.geometry2d.vector.rst.txt new file mode 100644 index 0000000..51a198a --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.vector.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.vector module +========================================= + +.. automodule:: ladybug_display.geometry2d.vector + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.arc.rst.txt b/docs/_sources/ladybug_display.geometry3d.arc.rst.txt new file mode 100644 index 0000000..7cf8fa9 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.arc.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.arc module +====================================== + +.. automodule:: ladybug_display.geometry3d.arc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.cone.rst.txt b/docs/_sources/ladybug_display.geometry3d.cone.rst.txt new file mode 100644 index 0000000..d1685e8 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.cone.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.cone module +======================================= + +.. automodule:: ladybug_display.geometry3d.cone + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt b/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt new file mode 100644 index 0000000..5c7996b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.cylinder module +=========================================== + +.. automodule:: ladybug_display.geometry3d.cylinder + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.face.rst.txt b/docs/_sources/ladybug_display.geometry3d.face.rst.txt new file mode 100644 index 0000000..004d24b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.face.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.face module +======================================= + +.. automodule:: ladybug_display.geometry3d.face + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.line.rst.txt b/docs/_sources/ladybug_display.geometry3d.line.rst.txt new file mode 100644 index 0000000..e05ac92 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.line.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.line module +======================================= + +.. automodule:: ladybug_display.geometry3d.line + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt b/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt new file mode 100644 index 0000000..05612dc --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.mesh module +======================================= + +.. automodule:: ladybug_display.geometry3d.mesh + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.plane.rst.txt b/docs/_sources/ladybug_display.geometry3d.plane.rst.txt new file mode 100644 index 0000000..eb1689b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.plane.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.plane module +======================================== + +.. automodule:: ladybug_display.geometry3d.plane + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.point.rst.txt b/docs/_sources/ladybug_display.geometry3d.point.rst.txt new file mode 100644 index 0000000..30fb6ee --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.point.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.point module +======================================== + +.. automodule:: ladybug_display.geometry3d.point + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt b/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt new file mode 100644 index 0000000..e7cb147 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.polyface module +=========================================== + +.. automodule:: ladybug_display.geometry3d.polyface + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt b/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt new file mode 100644 index 0000000..1815e21 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.polyline module +=========================================== + +.. automodule:: ladybug_display.geometry3d.polyline + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.ray.rst.txt b/docs/_sources/ladybug_display.geometry3d.ray.rst.txt new file mode 100644 index 0000000..57c7eea --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.ray.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.ray module +====================================== + +.. automodule:: ladybug_display.geometry3d.ray + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.rst.txt b/docs/_sources/ladybug_display.geometry3d.rst.txt new file mode 100644 index 0000000..989a3e9 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.rst.txt @@ -0,0 +1,31 @@ +ladybug\_display.geometry3d package +=================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.geometry3d.arc + ladybug_display.geometry3d.cone + ladybug_display.geometry3d.cylinder + ladybug_display.geometry3d.face + ladybug_display.geometry3d.line + ladybug_display.geometry3d.mesh + ladybug_display.geometry3d.plane + ladybug_display.geometry3d.point + ladybug_display.geometry3d.polyface + ladybug_display.geometry3d.polyline + ladybug_display.geometry3d.ray + ladybug_display.geometry3d.sphere + ladybug_display.geometry3d.text + ladybug_display.geometry3d.vector + +Module contents +--------------- + +.. automodule:: ladybug_display.geometry3d + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt b/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt new file mode 100644 index 0000000..9bf78b3 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.sphere module +========================================= + +.. automodule:: ladybug_display.geometry3d.sphere + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.text.rst.txt b/docs/_sources/ladybug_display.geometry3d.text.rst.txt new file mode 100644 index 0000000..2914b59 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.text.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.text module +======================================= + +.. automodule:: ladybug_display.geometry3d.text + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.vector.rst.txt b/docs/_sources/ladybug_display.geometry3d.vector.rst.txt new file mode 100644 index 0000000..923e90a --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.vector.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.vector module +========================================= + +.. automodule:: ladybug_display.geometry3d.vector + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.rst.txt b/docs/_sources/ladybug_display.rst.txt new file mode 100644 index 0000000..0f65fee --- /dev/null +++ b/docs/_sources/ladybug_display.rst.txt @@ -0,0 +1,31 @@ +ladybug\_display package +======================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension + ladybug_display.geometry2d + ladybug_display.geometry3d + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.altnumber + ladybug_display.dictutil + ladybug_display.typing + ladybug_display.visualization + +Module contents +--------------- + +.. automodule:: ladybug_display + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.typing.rst.txt b/docs/_sources/ladybug_display.typing.rst.txt new file mode 100644 index 0000000..f6e8776 --- /dev/null +++ b/docs/_sources/ladybug_display.typing.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.typing module +============================== + +.. automodule:: ladybug_display.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.visualization.rst.txt b/docs/_sources/ladybug_display.visualization.rst.txt new file mode 100644 index 0000000..62de668 --- /dev/null +++ b/docs/_sources/ladybug_display.visualization.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.visualization module +===================================== + +.. automodule:: ladybug_display.visualization + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/modules.rst.txt b/docs/_sources/modules.rst.txt new file mode 100644 index 0000000..51b6f80 --- /dev/null +++ b/docs/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +ladybug_display +=============== + +.. toctree:: + :maxdepth: 4 + + ladybug_display diff --git a/docs/_static/_sphinx_javascript_frameworks_compat.js b/docs/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8549469 --- /dev/null +++ b/docs/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,134 @@ +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 0000000..eeb0519 --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,899 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} +dl.field-list > dt:after { + content: ":"; +} + + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 0000000..09e88ce --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 0000000..f4ede63 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 0000000..b725064 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..b6428e6 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png differ diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png differ diff --git a/docs/_static/bootstrap-2.3.2/js/bootstrap.js b/docs/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 0000000..638bb18 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('