public TTColorAvailable2 GetTTifExistsCalculateifNot_IFC4(Xbim.Ifc4.Kernel.IfcProduct ifcProduct)
        {
            //bool found = false;
            var propertySets = ifcProduct.PropertySets.ToList();
            int ii           = 0;

            while (ii < propertySets.Count)
            {
                var onepropertySet = propertySets[ii].HasProperties.ToList();
                int jj             = 0;
                while (jj < onepropertySet.Count)
                {
                    if (onepropertySet[jj].Name == "ThermalTransmittance")
                    {
                        double thisTT = (double)((Xbim.Ifc4.PropertyResource.IfcPropertySingleValue)onepropertySet[jj]).NominalValue.Value;


                        return(new TTColorAvailable2(thisTT, true));
                    }
                    jj++;
                }
                ii++;
            }
            //if it comes up 2 here, no TT was found... we r going 2 calculate it...
            if (ifcProduct.GetType() == typeof(Xbim.Ifc4.SharedBldgElements.IfcColumn))
            {
                double thisTT = CalculateTT_IFC4((Xbim.Ifc4.SharedBldgElements.IfcColumn)ifcProduct);
                return(new TTColorAvailable2(thisTT, false));
            }
            else if (ifcProduct.GetType() == typeof(Xbim.Ifc4.SharedBldgElements.IfcDoor))
            {
                double thisTT = CalculateTT_IFC4((Xbim.Ifc4.SharedBldgElements.IfcDoor)ifcProduct);
                return(new TTColorAvailable2(thisTT, false));
            }
            else if (ifcProduct.GetType() == typeof(Xbim.Ifc4.SharedBldgElements.IfcCurtainWall))
            {
                double thisTT = CalculateTT_IFC4((Xbim.Ifc4.SharedBldgElements.IfcCurtainWall)ifcProduct);
                return(new TTColorAvailable2(thisTT, false));
            }

            return(new TTColorAvailable2(-1, true));//smth may be wrong...
        }
        public Material GetStyleFromXbimModel_IFC4(Xbim.Ifc4.Kernel.IfcProduct item, double opacity = 1)
        {
            var context = new Xbim3DModelContext(item.Model);

            var productShape = context.ShapeInstancesOf((Xbim.Ifc4.Interfaces.IIfcProduct)item)
                               .Where(s => s.RepresentationType != XbimGeometryRepresentationType.OpeningsAndAdditionsExcluded)
                               .ToList();

            Material wpfMaterial = null;

            if (productShape.Count > 0)
            {
                wpfMaterial = GetWpfMaterial(item.Model, productShape[0].StyleLabel);
            }
            else
            {
                wpfMaterial = GetWpfMaterial(item.Model, 0);
            }

            ((System.Windows.Media.Media3D.DiffuseMaterial)wpfMaterial).Brush.Opacity = opacity;
            return(wpfMaterial);
        }
        protected void OnElementMouseDown_IFC4(object sender, MouseButtonEventArgs e, IfcViewerNode ifcParseGeometryNode, Xbim.Ifc4.Kernel.IfcProduct itemModel)
        {
            if (e.LeftButton != MouseButtonState.Pressed)
            {
                return;
            }

            var element = sender as ModelUIElement3D;

            if (element != null)
            {
                var geometryModel3D = element.Model as GeometryModel3D;
                if (geometryModel3D == null)
                {
                    return;
                }

                if (SelectedProductsIFC4 != null && SelectedProductsIFC4.Contains(itemModel.GlobalId))
                {
                    geometryModel3D.Material = geometryModel3D.BackMaterial;
                    SelectedProductsIFC4.Remove(itemModel.GlobalId);
                }
                else
                {
                    SelectedProductsIFC4.Add(itemModel.GlobalId);
                    geometryModel3D.Material = _selectionMaterial;
                }
            }
            var ifcViewerControl = ControlElements[0] as IFCViewerControl;
            var button_2         = ifcViewerControl.RadioButton_2;

            if (button_2 == null)
            {
                return;
            }

            if ((bool)button_2.IsChecked)
            {
                var           modelId       = ((ModelInfoIFC4)(InputPorts[0].Data)).ModelId;
                ModelInfoIFC4 modelInfoIfc4 = new ModelInfoIFC4(modelId);
                foreach (var item in SelectedProductsIFC4)
                {
                    modelInfoIfc4.AddElementIds(item);
                }
                OutputPorts[0].Data = modelInfoIfc4;
            }

            e.Handled = true;
        }
        public ModelUIElement3D VisualizeMesh_IFC4(MeshBuilder meshBuilder, MeshGeometry3D mesh, Material mat, Xbim.Ifc4.Kernel.IfcProduct itemModel)
        {
            var points = new List <Point3D>();

            foreach (var item in mesh.Positions)
            {
                points.Add(new Point3D {
                    X = item.X, Y = item.Y, Z = item.Z
                });
            }

            for (var i = 0; i < mesh.TriangleIndices.Count; i += 3)
            {
                meshBuilder.AddTriangle(points[mesh.TriangleIndices[i]], points[mesh.TriangleIndices[i + 1]],
                                        points[mesh.TriangleIndices[i + 2]]);
            }

            var myGeometryModel = new GeometryModel3D
            {
                Material     = mat,
                BackMaterial = mat,
                Geometry     = meshBuilder.ToMesh(true)
            };


            var element = new ModelUIElement3D {
                Model = myGeometryModel
            };

            element.MouseDown += (sender1, e1) => OnElementMouseDown_IFC4(sender1, e1, this, itemModel);

            return(element);
        }