public static global::OpenStudio.Material ToOSM(this BHM.Material material, global::OpenStudio.Model modelReference, double thickness = 0.0, bool isGlazed = false) { List <BHM.IMaterialProperties> environmentMaterialProperties = material.Properties.Where(x => x is BHEM.IEnvironmentMaterial).ToList(); if (environmentMaterialProperties.Count > 0) { if (environmentMaterialProperties[0].GetType() == typeof(BHEM.SolidMaterial)) { if (material.IsTransparent()) { return(material.ToOSMGlazing(thickness, modelReference)); } else { return(material.ToOSMOpaqueMaterial((environmentMaterialProperties[0] as BHEM.IEnvironmentMaterial).Roughness, thickness, modelReference)); } } else if (environmentMaterialProperties[0].GetType() == typeof(BHEM.GasMaterial)) { if (isGlazed) { return(material.ToOSMGas(thickness, modelReference)); } else { return(material.ToOSMAirGap(modelReference)); } } } return(null); }
public static global::OpenStudio.ScheduleTypeLimits ToOSMScheduleTypeLimits(global::OpenStudio.Model modelReference) { // TODO: Convert from BH.oM Profiles to OpenStudio profiles rather than using these fixed/constant profiles! ScheduleTypeLimits ScheduleTypeLimitsAlwaysOn = new ScheduleTypeLimits(modelReference); ScheduleTypeLimitsAlwaysOn.setNumericType("Discrete"); ScheduleTypeLimitsAlwaysOn.setUnitType("Dimensionless"); ScheduleTypeLimitsAlwaysOn.setLowerLimitValue(0); ScheduleTypeLimitsAlwaysOn.setUpperLimitValue(1); return(ScheduleTypeLimitsAlwaysOn); }
public static global::OpenStudio.AirGap ToOSMAirGap(this BHM.Material material, global::OpenStudio.Model modelReference) { AirGap airGap = new AirGap(modelReference); airGap.setName(material.Name); if (material.Properties.Where(x => x is BHEM.IEnvironmentMaterial).FirstOrDefault() != null) { airGap.setThermalConductivity((material.Properties.Where(x => x is BHEM.IEnvironmentMaterial).FirstOrDefault() as BHEM.IEnvironmentMaterial).Conductivity); } return(airGap); }
public static global::OpenStudio.OpaqueMaterial ToOSMOpaqueMaterial(this BHM.Material material, BHEM.Roughness roughness, double thickness, global::OpenStudio.Model modelReference) { BHEM.SolidMaterial matProp = material.Properties.Where(x => x.GetType() == typeof(BHEM.SolidMaterial)).FirstOrDefault() as BHEM.SolidMaterial; StandardOpaqueMaterial osmMaterial = new StandardOpaqueMaterial(modelReference); osmMaterial.setName(material.Name); osmMaterial.setRoughness(roughness.ToOSM()); osmMaterial.setThickness(thickness); if (matProp != null) { osmMaterial.setConductivity(matProp.Conductivity); osmMaterial.setDensity(matProp.Density); osmMaterial.setSpecificHeat(matProp.SpecificHeat); osmMaterial.setThermalAbsorptance(1 - matProp.EmissivityExternal); //ToDo Review for external and internal as appropriate at some point osmMaterial.setSolarAbsorptance(1 - matProp.SolarReflectanceExternal); //ToDo Review for external and internal as appropriate at some point osmMaterial.setVisibleAbsorptance(1 - matProp.LightReflectanceExternal); //ToDo Review for external and internal as appropriate at some point } return(osmMaterial); }
public static global::OpenStudio.Gas ToOSMGas(this BHM.Material material, double thickness, global::OpenStudio.Model modelReference) { BHEM.GasMaterial matProp = material.Properties.Where(x => x.GetType() == typeof(BHEM.GasMaterial)).FirstOrDefault() as BHEM.GasMaterial; Gas gas = new Gas(modelReference); gas.setName(material.Name); gas.setThickness(thickness); gas.setGasType(matProp.Gas.ToOSM()); return(gas); }
public static global::OpenStudio.StandardGlazing ToOSMGlazing(this BHM.Material material, double thickness, global::OpenStudio.Model modelReference) { BHEM.SolidMaterial matProp = material.Properties.Where(x => x.GetType() == typeof(BHEM.SolidMaterial)).FirstOrDefault() as BHEM.SolidMaterial; StandardGlazing glazing = new StandardGlazing(modelReference); //ToDo: Front and back side checks and inclusion when required - issue raised glazing.setName(material.Name); glazing.setOpticalDataType("SpectralAverage"); glazing.setThickness(thickness); glazing.setSolarTransmittance(matProp.SolarTransmittance); glazing.setFrontSideSolarReflectanceatNormalIncidence(0); glazing.setBackSideSolarReflectanceatNormalIncidence(0); glazing.setVisibleTransmittance(matProp.LightTransmittance); glazing.setFrontSideVisibleReflectanceatNormalIncidence(0); glazing.setBackSideVisibleReflectanceatNormalIncidence(0); //ToDo: Figure out infrared transmittance if required glazing.setFrontSideInfraredHemisphericalEmissivity(0); glazing.setBackSideInfraredHemisphericalEmissivity(0); glazing.setConductivity(matProp.Conductivity); glazing.setSolarDiffusing(false); return(glazing); }
//[Description("BH.Engine.EnergyPlus.Convert ToOSM => gets Internal gains from BH.oM.Environment.Elements.InternalGain")] //[Input("InternalGain", "BHoM InternalGain")] //[Output("EnergyPlus InternalGain")] public static global::OpenStudio.People ToOSMPeopleGain(this BH.oM.Environment.SpaceCriteria.People peopleGain, global::OpenStudio.Model modelReference, global::OpenStudio.Space space) { // TODO: remove static instance below for input of profile object instead! global::OpenStudio.ScheduleConstant activitySchedule = ToOSMScheduleConstantActivity(modelReference); global::OpenStudio.ScheduleConstant occupancySchedule = ToOSMScheduleConstantsAlwaysOn(modelReference); PeopleDefinition PeopleDefinition = new PeopleDefinition(modelReference); // TODO:Check the method being used to define the number of poeple within the space PeopleDefinition.setPeopleperSpaceFloorArea(peopleGain.Sensible); global::OpenStudio.People osPeopleGain = new global::OpenStudio.People(PeopleDefinition); osPeopleGain.setNumberofPeopleSchedule(occupancySchedule); osPeopleGain.setActivityLevelSchedule(activitySchedule); osPeopleGain.setSpace(space); return(osPeopleGain); }
public static global::OpenStudio.ScheduleConstant ToOSMScheduleConstantActivity(global::OpenStudio.Model modelReference) { // TODO: Convert from BH.oM Profiles to OpenStudio profiles rather than using these fixed/constant profiles! ScheduleConstant ScheduleConstantActivity = new ScheduleConstant(modelReference); ScheduleConstantActivity.setScheduleTypeLimits(ToOSMScheduleTypeLimitsActivity(modelReference)); ScheduleConstantActivity.setValue(70); return(ScheduleConstantActivity); }
public static global::OpenStudio.ScheduleTypeLimits ToOSMScheduleTypeLimitsActivity(global::OpenStudio.Model modelReference) { // TODO: Convert from BH.oM Profiles to OpenStudio profiles rather than using these fixed/constant profiles! ScheduleTypeLimits ScheduleTypeLimitsActivity = new ScheduleTypeLimits(modelReference); ScheduleTypeLimitsActivity.setNumericType("Continuous"); ScheduleTypeLimitsActivity.setUnitType("ActivityLevel"); ScheduleTypeLimitsActivity.setLowerLimitValue(0); ScheduleTypeLimitsActivity.setUpperLimitValue(1000); return(ScheduleTypeLimitsActivity); }
public static global::OpenStudio.ElectricEquipment ToOSMEquipmentGain(this BH.oM.Environment.SpaceCriteria.Equipment equipGain, global::OpenStudio.Model modelReference, global::OpenStudio.Space space) { // TODO: remove static instance below for input of profile object instead! global::OpenStudio.ScheduleConstant equipmentSchedule = ToOSMScheduleConstantsAlwaysOn(modelReference); ElectricEquipmentDefinition EquipmentDefinition = new ElectricEquipmentDefinition(modelReference); EquipmentDefinition.setDesignLevel(equipGain.Sensible); // TODO: Include additional methods to calculate equipment load here based on alternative metrics ElectricEquipment equipmentGain = new ElectricEquipment(EquipmentDefinition); equipmentGain.setSpace(space); equipmentGain.setSchedule(equipmentSchedule); return(equipmentGain); }
public static global::OpenStudio.Lights ToOSMLightingGain(this BH.oM.Environment.SpaceCriteria.Lighting lightGain, global::OpenStudio.Model modelReference, global::OpenStudio.Space space) { // TODO: remove static instance below for input of profile object instead! global::OpenStudio.ScheduleConstant lightingSchedule = ToOSMScheduleConstantsAlwaysOn(modelReference); LightsDefinition LightsDefinition = new LightsDefinition(modelReference); LightsDefinition.setLightingLevel(lightGain.Sensible); // TODO: Include additional methods to calculate lighting load here based on alternative metrics Lights lightingGain = new Lights(LightsDefinition); lightingGain.setSpace(space); lightingGain.setSchedule(lightingSchedule); return(lightingGain); }
public static global::OpenStudio.SubSurface ToOSM(this BHE.Opening opening, global::OpenStudio.Surface hostSurface, global::OpenStudio.Construction construction, global::OpenStudio.Model referenceModel) { Point3dVector openingPts = opening.Polyline().IDiscontinuityPoints().ToOSM(); SubSurface osmOpening = new SubSurface(openingPts, referenceModel); osmOpening.setSubSurfaceType(opening.Type.ToOSMFenestrationType()); osmOpening.setSurface(hostSurface); osmOpening.setConstruction(construction); double oA = osmOpening.azimuth(); double hA = hostSurface.azimuth(); if (oA != hA) { osmOpening.setName("NOT EQUAL AZIMUTH - " + osmOpening.name()); } if (osmOpening.azimuth() < (hostSurface.azimuth() - 1) || osmOpening.azimuth() > (hostSurface.azimuth() + 1)) { osmOpening.setVertices(opening.Polyline().IFlip().ICollapseToPolyline(BHG.Tolerance.Angle).ToOSM()); } return(osmOpening); }
public static global::OpenStudio.Model CreateModel(List <List <BHE.Panel> > panelsAsSpaces, global::OpenStudio.Model modelReference) { List <BHC.Construction> uniqueConstructions = panelsAsSpaces.UniqueConstructions(); //Create a curtain wall construction BHC.Construction curtainWallConstruction = new BHC.Construction(); curtainWallConstruction.Name = "Curtain Wall Construction Replacement"; BHC.Layer curtainWallLayer = new BHC.Layer(); curtainWallLayer.Thickness = 0.1; BHM.Material curtainWallMaterial = new BHM.Material(); curtainWallMaterial.Name = "Curtain Wall Construction Replacement"; BHEM.SolidMaterial curtainWallMaterialProperties = new BHEM.SolidMaterial(); curtainWallMaterialProperties.Roughness = BHEM.Roughness.VerySmooth; curtainWallMaterialProperties.SpecificHeat = 101; curtainWallMaterialProperties.Conductivity = 0.1; curtainWallMaterialProperties.EmissivityExternal = 0.1; curtainWallMaterialProperties.SolarReflectanceExternal = 0.1; curtainWallMaterialProperties.LightReflectanceExternal = 0.1; curtainWallMaterialProperties.Density = 0.1; curtainWallMaterial.Properties.Add(curtainWallMaterialProperties); curtainWallLayer.Material = curtainWallMaterial; curtainWallConstruction.Layers.Add(curtainWallLayer); Dictionary <string, Construction> osmConstructions = new Dictionary <string, Construction>(); foreach (BHC.Construction c in uniqueConstructions) { osmConstructions.Add(c.UniqueConstructionName(), c.ToOSM(modelReference)); } osmConstructions.Add("CurtainWallReplacementConstruction", curtainWallConstruction.ToOSM(modelReference)); foreach (List <BHE.Panel> space in panelsAsSpaces) { ThermalZone osmZone = new ThermalZone(modelReference); Space osmSpace = new Space(modelReference); osmSpace.setThermalZone(osmZone); foreach (BHE.Panel be in space) { string conName = be.Construction.UniqueConstructionName(); //be.ToOSM(modelReference, osmSpace, (conName == "" ? null : osmConstructions[conName])); Surface host = be.ToOSM(modelReference, osmSpace, osmConstructions, be.OutsideBoundaryCondition(be.AdjacentSpaces(panelsAsSpaces))); foreach (BHE.Opening o in be.Openings) { conName = o.OpeningConstruction.UniqueConstructionName(); o.ToOSM(host, (conName == "" ? null : osmConstructions[conName]), modelReference); } } } return(modelReference); }
public static global::OpenStudio.Construction ToOSM(this BHP.Construction construction, global::OpenStudio.Model modelReference) { global::OpenStudio.Construction osmConstruction = new Construction(modelReference); osmConstruction.setName(construction.Name); MaterialVector materialLayer = new MaterialVector(); foreach (BHP.Layer layer in construction.Layers) { materialLayer.Add(layer.Material.ToOSM(modelReference)); } //foreach (BHM.Material material in construction.Materials) //materialLayer.Add(material.ToOSM(construction.Roughness, modelReference, (construction.ConstructionType == BHE.ConstructionType.Transparent))); osmConstruction.setLayers(materialLayer); return(osmConstruction); }
public static global::OpenStudio.Surface ToOSM(this BHE.Panel panel, global::OpenStudio.Model modelReference, global::OpenStudio.Space osmSpace, Dictionary <string, global::OpenStudio.Construction> uniqueConstructions, string outsideBoundaryCondition) { Surface osmElement = new Surface(panel.Polyline().ToOSM(), modelReference); osmElement.setName(panel.Name); osmElement.setSpace(osmSpace); if (outsideBoundaryCondition != "") { osmElement.setOutsideBoundaryCondition(outsideBoundaryCondition); } osmElement.setSurfaceType(panel.Type.ToOSMSurfaceType()); osmElement.setConstruction(uniqueConstructions[panel.Construction.UniqueConstructionName()]); BHP.OriginContextFragment envContextProperties = panel.FindFragment <BHP.OriginContextFragment>(typeof(BHP.OriginContextFragment)); //Fix curtain wall if (panel.Type == BHE.PanelType.CurtainWall) { osmElement.setConstruction(uniqueConstructions["CurtainWallReplacementConstruction"]); //No need for construction on a curtain wall as the opening will handle it List <BHG.Polyline> newOpeningBounds = new List <BHG.Polyline>(); if (panel.Openings.Count > 0) { //This surface already has openings - cut them out of the new opening List <BHG.Polyline> refRegion = panel.Openings.Where(y => y.Polyline() != null).ToList().Select(z => z.Polyline()).ToList(); newOpeningBounds.AddRange((panel.Polyline().BooleanDifference(refRegion, 0.01))); } else { newOpeningBounds.Add(panel.Polyline()); } BHE.Opening curtainWallOpening = new BHE.Opening() { Edges = BH.Engine.Geometry.Create.PolyCurve(newOpeningBounds).ICollapseToPolyline(BH.oM.Geometry.Tolerance.Angle).ToEdges() }; //Scale the bounding curve to comply with IDF rules BHG.Polyline crv = curtainWallOpening.Polyline(); curtainWallOpening.Edges = crv.Scale(crv.Centre(), BH.Engine.Geometry.Create.Vector(0.95, 0.95, 0.95)).ToEdges(); curtainWallOpening.Name = panel.Name; BHP.OriginContextFragment curtainWallProperties = new BHP.OriginContextFragment(); if (envContextProperties != null) { curtainWallProperties.ElementID = envContextProperties.ElementID; curtainWallProperties.TypeName = envContextProperties.TypeName; } curtainWallOpening.Type = BHE.OpeningType.CurtainWall; curtainWallOpening.OpeningConstruction = panel.Construction; panel.Openings = new List <BHE.Opening> { curtainWallOpening }; } return(osmElement); }