public void IsInspecting(bool click) { GameObject go = GameObject.Find("Initializing emvironment"); LoadAssetIFC IfcScript = go.GetComponent <LoadAssetIFC>(); GameObject SecondCamera = GameObject.Find("CameraOrbit").transform.Find("SecondCamera").gameObject; Button bt = GameObject.Find("UI_IFCSelect_TextInfo(Clone)").transform.Find("Button_Inspect").GetComponent <Button>(); Button bt_b = GameObject.Find("UI_IFCSelect_TextInfo(Clone)").transform.Find("Button_Inspect_back").GetComponent <Button>(); if (click) { //Sel_original_layer = IfcScript.RayCastSelect.layer; //IfcScript.RayCastSelect.layer = 10; go_clone = Instantiate(IfcScript.RayCastSelect, IfcScript.RayCastSelect.transform); go_clone.layer = 10; go_clone.transform.parent = GameObject.Find("UI_IFCSelect_TextInfo(Clone)").transform; CullingMask = SecondCamera.GetComponent <Camera>().cullingMask; SecondCamera.GetComponent <Camera>().cullingMask = 1 << 10; bt.gameObject.SetActive(false); bt_b.gameObject.SetActive(true); } else { //IfcScript.RayCastSelect.layer = Sel_original_layer; SecondCamera.GetComponent <Camera>().cullingMask = CullingMask; Destroy(go_clone); bt.gameObject.SetActive(true); bt_b.gameObject.SetActive(false); } }
public void IFCSpaceSorting(int ind) { GameObject go = GameObject.Find("Initializing emvironment"); LoadAssetIFC IfcScript = go.GetComponent <LoadAssetIFC>(); GameObject Lego = GameObject.Find("Legend"); Text legend_text = Lego.transform.Find("Legend_range").GetComponent <Text>(); //to display range legend_text.text = ""; Text legend_title = Lego.transform.Find("Legend_title").GetComponent <Text>(); //to display title/unit legend_title.text = ""; Color Def_color = new Color(); //default space color is light blue ColorUtility.TryParseHtmlString("#ADD9E666", out Def_color); string[] Color_Gradient = { "#0500ff66", "#0032ff66", "#00d4ff66", "#3eff0066", "#FFd20066", "#FF6e0066", "#FF0a0066", "#FF009066", "#FF04F066", "#FF0EF066" }; switch (ind) { case 0: foreach (GameObject obj in GameObject.FindGameObjectsWithTag("XRay")) { obj.GetComponent <MeshRenderer>().material.color = Def_color; } legend_text.text = ""; legend_title.text = ""; Lego.GetComponent <Canvas>().enabled = false; break; case 1: //CoolingLoad MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_CoolingLoad.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_CoolingLoad.ToString())); ValMin = MList.Min(o => float.Parse(o.C_CoolingLoad.ToString())); legend_title.text = "Cooling Load Watt"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_CoolingLoad.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_CoolingLoad.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 2: //HeatingLoad MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_HeatingLoad.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_HeatingLoad.ToString())); ValMin = MList.Min(o => float.Parse(o.C_HeatingLoad.ToString())); legend_title.text = "Heating Load Watt"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_HeatingLoad.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_HeatingLoad.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 3: //LightingLoad MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_LightingLoad.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_LightingLoad.ToString())); ValMin = MList.Min(o => float.Parse(o.C_LightingLoad.ToString())); legend_title.text = "Lighting Load Watt"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_LightingLoad.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_LightingLoad.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 4: //PowerLoad MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_PowerLoad.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_PowerLoad.ToString())); ValMin = MList.Min(o => float.Parse(o.C_PowerLoad.ToString())); legend_title.text = "Power Load Watt"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_PowerLoad.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_PowerLoad.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 5: //CoolingLoad_pa MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_CoolingLoad_pa.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_CoolingLoad_pa.ToString())); ValMin = MList.Min(o => float.Parse(o.C_CoolingLoad_pa.ToString())); legend_title.text = "Cooling Load per Area Watt/Sq.Meter"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_CoolingLoad_pa.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_CoolingLoad_pa.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 6: //HeatingLoad_pa MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_HeatingLoad_pa.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_HeatingLoad_pa.ToString())); ValMin = MList.Min(o => float.Parse(o.C_HeatingLoad_pa.ToString())); legend_title.text = "Heating Load per Area Watt/Sq.Meter"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_HeatingLoad_pa.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_HeatingLoad_pa.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 7: //LightingLoad_pa MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_LightingLoad_pa.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_LightingLoad_pa.ToString())); ValMin = MList.Min(o => float.Parse(o.C_LightingLoad_pa.ToString())); legend_title.text = "Lighting Load per Area Watt/Sq.Meter"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_LightingLoad_pa.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_LightingLoad_pa.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; case 8: //PowerLoad_pa MList = IfcScript.SpaceList.OrderBy(o => float.Parse(o.C_PowerLoad_pa.ToString())); //more appropriate use Icompare ValMax = MList.Max(o => float.Parse(o.C_PowerLoad_pa.ToString())); ValMin = MList.Min(o => float.Parse(o.C_PowerLoad_pa.ToString())); legend_title.text = "Power Load per Area Watt/Sq.Meter"; if (IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = true; } for (int i = 0; i < 10; i++) { //subgroup values using Linq var querySpaces = from qs in MList where float.Parse(qs.C_PowerLoad_pa.ToString()) >= ValMin + (ValMax - ValMin) / 10 * i && float.Parse(qs.C_PowerLoad_pa.ToString()) <= ValMin + (ValMax - ValMin) / 10 * (i + 1) select qs; legend_text.text += $"{(ValMin + (ValMax - ValMin) / 10 * i).ToString("0.00")} - {(ValMin + (ValMax - ValMin) / 10 * (i + 1)).ToString("0.00")}\n"; foreach (var qspace in querySpaces) { var objects = GameObject.FindGameObjectsWithTag("XRay").Where(obj => obj.name == qspace.C_EntityLabel.ToString()); if (objects == null) { continue; } Color color = new Color(); ColorUtility.TryParseHtmlString(Color_Gradient[i], out color); foreach (var obj in objects) { obj.GetComponent <MeshRenderer>().material.color = color; } } } break; default: break; } }
public void IFCTypeFilter(int ind) { GameObject go = GameObject.Find("Initializing emvironment"); LoadAssetIFC IfcScript = go.GetComponent <LoadAssetIFC>(); GameObject Lego = GameObject.Find("Legend"); switch (ind) { case 0: //Arch IfcScript.Filter_IsArch = !IfcScript.Filter_IsArch; foreach (GameObject obj in GameObject.FindGameObjectsWithTag("Arch")) { obj.GetComponent <MeshRenderer>().enabled = IfcScript.Filter_IsArch; obj.GetComponent <MeshCollider>().enabled = IfcScript.Filter_IsArch; } foreach (GameObject obj in GameObject.FindGameObjectsWithTag("Arch_light")) { obj.GetComponent <MeshRenderer>().enabled = IfcScript.Filter_IsArch; obj.GetComponent <MeshCollider>().enabled = IfcScript.Filter_IsArch; if (IfcScript.Filter_IsLighting) { obj.GetComponent <Light>().enabled = false; } } break; case 1: //MEP IfcScript.Filter_IsMep = !IfcScript.Filter_IsMep; foreach (GameObject obj in GameObject.FindGameObjectsWithTag("MEP")) { obj.GetComponent <MeshRenderer>().enabled = IfcScript.Filter_IsMep; obj.GetComponent <MeshCollider>().enabled = IfcScript.Filter_IsMep; } break; case 2: //Stru IfcScript.Filter_IsStru = !IfcScript.Filter_IsStru; foreach (GameObject obj in GameObject.FindGameObjectsWithTag("Stru")) { obj.GetComponent <MeshRenderer>().enabled = IfcScript.Filter_IsStru; obj.GetComponent <MeshCollider>().enabled = IfcScript.Filter_IsStru; } break; case 3: //DayNight Light lt = GameObject.Find("Directional Light").GetComponent <Light>(); if (IfcScript.Filter_DayNight) { RenderSettings.skybox = Resources.Load("SkyNight", typeof(Material)) as Material; RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Skybox; RenderSettings.defaultReflectionResolution = 128; lt.intensity = 0f; RenderSettings.ambientIntensity = 0f; //RenderSettings.reflectionIntensity = .5f; } else { RenderSettings.skybox = Resources.Load("SkyNoon", typeof(Material)) as Material; lt.intensity = 1f; RenderSettings.ambientIntensity = .5f; } IfcScript.Filter_DayNight = !IfcScript.Filter_DayNight; break; case 4: //Space X-Ray IfcScript.Filter_IsSpace = !IfcScript.Filter_IsSpace; if (!IfcScript.Filter_IsSpace) { Lego.GetComponent <Canvas>().enabled = false; } foreach (GameObject obj in GameObject.FindGameObjectsWithTag("XRay")) { obj.GetComponent <MeshRenderer>().enabled = IfcScript.Filter_IsSpace; } IEnumerable <GameObject> CombineList = GameObject.FindGameObjectsWithTag("Arch").Concat(GameObject.FindGameObjectsWithTag("Stru")).Concat(GameObject.FindGameObjectsWithTag("MEP")); if (IfcScript.Filter_IsSpace) { foreach (GameObject obj in CombineList) { Color col = obj.GetComponent <MeshRenderer>().material.color; Color Ncol = new Color(col.r, col.g, col.b, col.a / 20f); obj.GetComponent <MeshRenderer>().material.color = Ncol; obj.GetComponent <MeshRenderer>().material.SetFloat("_Mode", 3); obj.GetComponent <MeshRenderer>().material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); obj.GetComponent <MeshRenderer>().material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); obj.GetComponent <MeshRenderer>().material.SetInt("_ZWrite", 0); obj.GetComponent <MeshRenderer>().material.DisableKeyword("_ALPHATEST_ON"); obj.GetComponent <MeshRenderer>().material.DisableKeyword("_ALPHABLEND_ON"); obj.GetComponent <MeshRenderer>().material.EnableKeyword("_ALPHAPREMULTIPLY_ON"); obj.GetComponent <MeshRenderer>().material.renderQueue = 3000; } } else if (!IfcScript.Filter_IsSpace) { foreach (GameObject obj in CombineList) { Color col = obj.GetComponent <MeshRenderer>().material.color; Color Ncol = new Color(col.r, col.g, col.b, col.a * 20f); obj.GetComponent <MeshRenderer>().material.color = Ncol; obj.GetComponent <MeshRenderer>().material.SetFloat("_Mode", 0); obj.GetComponent <MeshRenderer>().material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); obj.GetComponent <MeshRenderer>().material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); obj.GetComponent <MeshRenderer>().material.SetInt("_ZWrite", 1); obj.GetComponent <MeshRenderer>().material.DisableKeyword("_ALPHATEST_ON"); obj.GetComponent <MeshRenderer>().material.DisableKeyword("_ALPHABLEND_ON"); obj.GetComponent <MeshRenderer>().material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); obj.GetComponent <MeshRenderer>().material.renderQueue = 2000; } } break; case 5: //light switch if (IfcScript.Filter_IsArch) { IfcScript.Filter_IsLighting = !IfcScript.Filter_IsLighting; foreach (GameObject obj in GameObject.FindGameObjectsWithTag("Arch_light")) { obj.GetComponent <Light>().enabled = IfcScript.Filter_IsLighting; } } else { IfcScript.Filter_IsLighting = !IfcScript.Filter_IsLighting; } break; default: break; } }
public void IsAnalysing(bool click) { GameObject go = GameObject.Find("Initializing emvironment"); LoadAssetIFC IfcScript = go.GetComponent <LoadAssetIFC>(); GameObject SecondCamera = GameObject.Find("CameraOrbit").transform.Find("SecondCamera").gameObject; CullingMask = SecondCamera.GetComponent <Camera>().cullingMask; SecondCamera.GetComponent <Camera>().cullingMask = 1 << 11; try { GameObject LastBatch = GameObject.Find("CompoundWall").gameObject; if (LastBatch != null) { Destroy(LastBatch); } } catch { } try { GameObject LastBatchLine = GameObject.Find("Thermo_Liner").gameObject; if (LastBatchLine != null) { Destroy(LastBatchLine); } } catch { } try { GameObject LastBatchLine = GameObject.Find("Hygro_Liner").gameObject; if (LastBatchLine != null) { Destroy(LastBatchLine); } } catch { } GameObject CompoundWall = new GameObject("CompoundWall"); List <Ana_Layer> AnalyticalLayer = new List <Ana_Layer>(); float TotalThickness = 0f; float ThermalTransmittance = 0f; int EntityLabel_Select = int.Parse(IfcScript.RayCastSelect.name.ToString()); var Product_Sel = IfcScript.model.Instances.FirstOrDefault <IIfcProduct>(w => w.EntityLabel == EntityLabel_Select); IEnumerable <IfcRelDefinesByProperties> relations = Product_Sel.IsDefinedBy.OfType <IfcRelDefinesByProperties>(); foreach (IfcRelDefinesByProperties rel in relations) { IfcPropertySet pSet = rel.RelatingPropertyDefinition as IfcPropertySet; if (pSet == null) { continue; } foreach (IfcProperty prop in pSet.HasProperties) { IfcPropertySingleValue singleVal = prop as IfcPropertySingleValue; if (singleVal == null) { continue; } switch (singleVal.Name) { case "ThermalTransmittance": //without Rsi Rse ThermalTransmittance = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } var ProductMaterial = Product_Sel.Material; if (ProductMaterial != null) { try { switch (ProductMaterial.ExpressType.ToString()) { case "IfcMaterialLayerSetUsage": var IFCProductLayerSetUsage = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayerSetUsage>(m => m.EntityLabel == ProductMaterial.EntityLabel); TotalThickness = float.Parse(IFCProductLayerSetUsage.ForLayerSet.TotalThickness.ToString()); foreach (var Material_layer in IFCProductLayerSetUsage.ForLayerSet.MaterialLayers) { //layer has no name(all optional otherthan thickness), but its associated material has Ana_Layer Alayer_SU = new Ana_Layer(); Alayer_SU.MaterialName = Material_layer.Material.Name; Alayer_SU.Thickness = float.Parse(Material_layer.LayerThickness.ToString()); foreach (var IfcProperty in Material_layer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer_SU.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer_SU.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer_SU); } break; case "IfcMaterialLayerSet": var IFCProductLayerSet = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayerSet>(m => m.EntityLabel == ProductMaterial.EntityLabel); TotalThickness = float.Parse(IFCProductLayerSet.TotalThickness.ToString()); foreach (var Material_layer in IFCProductLayerSet.MaterialLayers) { Ana_Layer Alayer_S = new Ana_Layer(); Alayer_S.MaterialName = Material_layer.Material.Name; Alayer_S.Thickness = float.Parse(Material_layer.LayerThickness.ToString()); foreach (var IfcProperty in Material_layer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer_S.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer_S.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer_S); } break; case "IfcMaterialLayer": var IFCProductLayer = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayer>(m => m.EntityLabel == ProductMaterial.EntityLabel); Ana_Layer Alayer = new Ana_Layer(); Alayer.MaterialName = IFCProductLayer.Material.Name; Alayer.Thickness = float.Parse(IFCProductLayer.LayerThickness.ToString()); TotalThickness = float.Parse(IFCProductLayer.LayerThickness.ToString()); foreach (var IfcProperty in IFCProductLayer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer); break; } } catch { } } else { foreach (var type in Product_Sel.IsTypedBy) { var MaterialLayerSet = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayerSet>(m => m.EntityLabel == type.RelatingType.Material.EntityLabel); if (MaterialLayerSet != null) { TotalThickness = float.Parse(MaterialLayerSet.TotalThickness.ToString()); foreach (var Material_layer in MaterialLayerSet.MaterialLayers) { Ana_Layer Alayer_S = new Ana_Layer(); Alayer_S.MaterialName = Material_layer.Material.Name; Alayer_S.Thickness = float.Parse(Material_layer.LayerThickness.ToString()); foreach (var IfcProperty in Material_layer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer_S.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer_S.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer_S); } break; } var MaterialLayerSetUsage = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayerSetUsage>(m => m.EntityLabel == type.RelatingType.Material.EntityLabel); if (MaterialLayerSetUsage != null) { TotalThickness = float.Parse(MaterialLayerSetUsage.ForLayerSet.TotalThickness.ToString()); foreach (var Material_layer in MaterialLayerSetUsage.ForLayerSet.MaterialLayers) { Ana_Layer Alayer_SU = new Ana_Layer(); Alayer_SU.MaterialName = Material_layer.Material.Name; Alayer_SU.Thickness = float.Parse(Material_layer.LayerThickness.ToString()); foreach (var IfcProperty in Material_layer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer_SU.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer_SU.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer_SU); } break; } var MaterialLayer = IfcScript.model.Instances.FirstOrDefault <IIfcMaterialLayer>(m => m.EntityLabel == type.RelatingType.Material.EntityLabel); if (MaterialLayer != null) { Ana_Layer Alayer = new Ana_Layer(); Alayer.MaterialName = MaterialLayer.Material.Name; Alayer.Thickness = float.Parse(MaterialLayer.LayerThickness.ToString()); TotalThickness = float.Parse(MaterialLayer.LayerThickness.ToString()); foreach (var IfcProperty in MaterialLayer.Material.HasProperties) { var singleVals = IfcProperty.Properties.OfType <IfcPropertySingleValue>(); if (singleVals == null) { continue; } foreach (var singleVal in singleVals) { switch (singleVal.Name) { case "ThermalConductivity": Alayer.ThermalConductivity = float.Parse(singleVal.NominalValue.ToString()); break; case "VaporPermeability": Alayer.Permeability = float.Parse(singleVal.NominalValue.ToString()); break; default: break; } } } AnalyticalLayer.Add(Alayer); break; } } //var ProductType = Product_Sel.IsTypedBy.OfType<> } //implement slider TemperatureExternal = -5f; TemperatureInternal = 20f; AnalyticalLayer.Reverse();//reverse list order 'Exterior --> Interior' float OffSet_X = 0f; float SumThickness = 0f; Debug.Log($"ThermalTransmittance before Rsi Rse: {ThermalTransmittance}"); ThermalTransmittance = 1 / (1 / ThermalTransmittance + 0.25f + 0.04f); //Rsi = 0.13 Rse = 0.04 -- Vertical U-Value from IFC doesnt cover this 2 heat convect-coeff float R_Value = 0f; float SumRValue = 0.25f; //Rsi = 0.13 whereas in Vapor diffusion Rsi = 0.25 float TempDropRatio = SumRValue * ThermalTransmittance; float[] Array_TDropRatio = new float[AnalyticalLayer.Count + 1]; float[] Mu_Value = new float[AnalyticalLayer.Count]; float SumSd = 0f; float[] Array_SdAccumRatio = new float[AnalyticalLayer.Count]; float[] Arrary_Sd = new float[AnalyticalLayer.Count]; int i = 0; //index for layer Array_TDropRatio[0] = TempDropRatio; float clip = 1f; //formatting space foreach (var layer in AnalyticalLayer) { //Debug.Log("layer class- " + layer.MaterialName + ", ThermalConductivity: " + layer.ThermalConductivity + ", Permeability" + layer.Permeability); GameObject goos = Instantiate(Ana_Prefab); goos.name = layer.MaterialName; goos.transform.parent = CompoundWall.transform; goos.layer = 11; goos.GetComponent <MeshRenderer>().material.color = new Color(.8f + .1f * clip, .8f + .1f * clip, .8f + .1f * clip, .8f + .1f * clip); //OffSet solution goos.transform.localScale = new Vector3(layer.Thickness / 10f, 15f, 10f); OffSet_X = SumThickness + layer.Thickness / 2f; SumThickness += layer.Thickness; StartCoroutine(MovetoPos(goos, new Vector3(OffSet_X - TotalThickness / 2, 0, 0) / 10f, 2f)); clip *= -1; //Hanging Tags Annotation Prefab GameObject goostag = Instantiate(Ano_Prefab, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 8f + clip, -5f), new Quaternion()); goostag.transform.SetParent(CompoundWall.transform); goostag.layer = 11; Text HangTag = goostag.transform.Find("Anno_tx").gameObject.GetComponent <Text>(); HangTag.text = $"{layer.MaterialName}\nThickness:{layer.Thickness}"; //Thermal-Hygro Tags GameObject goostag2 = Instantiate(Ano_Prefab, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 10f + clip, -2f), new Quaternion()); goostag2.transform.SetParent(CompoundWall.transform); goostag2.layer = 11; Text HangTag2 = goostag2.transform.Find("Anno_tx").gameObject.GetComponent <Text>(); HangTag2.text = $"Conductivity:{layer.ThermalConductivity.ToString("F3")}\nPermeability:{layer.Permeability.ToString("F2")}"; //annotation & liner GameObject Liner = new GameObject("Anno_Line"); LineRenderer line = Liner.AddComponent <LineRenderer>(); Liner.transform.parent = CompoundWall.transform; Liner.gameObject.layer = 11; line.SetPosition(0, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 5f, -5f)); line.SetPosition(1, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 8f + clip, -5f)); line.startColor = Color.black; line.startWidth = 0.03f; Material mat = new Material(Shader.Find("UI/Default")); line.material = mat; //liner 2 GameObject Liner2 = new GameObject("Anno_Line2"); LineRenderer line2 = Liner2.AddComponent <LineRenderer>(); Liner2.transform.parent = CompoundWall.transform; Liner2.gameObject.layer = 11; line2.SetPosition(0, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 5f, -2f)); line2.SetPosition(1, new Vector3((OffSet_X - TotalThickness / 2) / 10f, 10f + clip, -2f)); line2.startColor = Color.black; line2.startWidth = 0.03f; line2.material = mat; //Thermal Liner if (layer.ThermalConductivity == 0) { layer.ThermalConductivity = 1000f;//k = 1000 is very conductive to ignore the fact that some layers K-value are not assigned } R_Value = layer.Thickness / layer.ThermalConductivity / 1000f; SumRValue = SumRValue + R_Value; TempDropRatio = SumRValue * ThermalTransmittance;//2nd last, Rse = 0.04 should be the last Debug.Log($"Temp.Drop.Ratio: {TempDropRatio},layer.Thickness {layer.Thickness}, layer.ThermalConductivity {layer.ThermalConductivity}"); if (TempDropRatio >= 1) { TempDropRatio = 0; Debug.Log($"Warming: IFC Material {layer.MaterialName}'s Thermal Properties are not valid. U-Value doesn't add up."); } Array_TDropRatio[++i] = TempDropRatio; //Hygro Liner if (layer.Permeability == 0) { layer.Permeability = 1000000f;//P = 1.000.000 is very permeable to ignore the fact that some layers P-value are not assigned } Mu_Value[i - 1] = 200f / layer.Permeability; SumSd = SumSd + Mu_Value[i - 1] * layer.Thickness / 1000f; } //this time for the Sd ratio float SdAccum = 0f; for (int k = 0; k < AnalyticalLayer.Count; k++) { Arrary_Sd[k] = Mu_Value[k] * AnalyticalLayer[k].Thickness / 1000f; SdAccum = SdAccum + Arrary_Sd[k]; Array_SdAccumRatio[k] = SdAccum / SumSd; Debug.Log($"Sd.Accu.Ratio: {Array_SdAccumRatio[k]},layer.Permeability {AnalyticalLayer[k].Permeability},SdAccum {SdAccum}"); } StartCoroutine(DrawTempLiner(TemperatureExternal, TemperatureInternal, Array_TDropRatio, TotalThickness, AnalyticalLayer)); //Hygroscopic analysis StartCoroutine(DrawMoistLiner(TemperatureExternal, TemperatureInternal, Array_SdAccumRatio, Array_TDropRatio, Arrary_Sd, SumSd, TotalThickness, AnalyticalLayer)); //Debug.Log($"SaturatedPressureTables 21.5 {SaturatedPressureTable[21.5]}"); read table like this, cap for 1 decimal }