예제 #1
0
    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);
        }
    }
예제 #2
0
    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;
        }
    }
예제 #3
0
    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;
        }
    }
예제 #4
0
    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
    }