public static void AddElements(this MeshGeometry3D m, IPersistIfcEntity item, XbimMatrix3D wcsTransform)
        {

            var fromModel = item.ModelOf as XbimModel;
            if (fromModel == null || !(item is IfcProduct)) 
                return;
            switch (fromModel.GeometrySupportLevel)
            {
                case 2:
                    var context = new Xbim3DModelContext(fromModel);

                    var productShape = context.ShapeInstancesOf((IfcProduct) item)
                        .Where(s => s.RepresentationType != XbimGeometryRepresentationType.OpeningsAndAdditionsExcluded)
                        .ToList();
                    if (!productShape.Any() && item is IfcFeatureElement)
                    {
                        productShape = context.ShapeInstancesOf((IfcProduct) item)
                            .Where(
                                s => s.RepresentationType == XbimGeometryRepresentationType.OpeningsAndAdditionsExcluded)
                            .ToList();
                    }

                    if (!productShape.Any()) 
                        return;
                    foreach (var shapeInstance in productShape)
                    {
                        IXbimShapeGeometryData shapeGeom =
                            context.ShapeGeometry(shapeInstance.ShapeGeometryLabel);
                        switch ((XbimGeometryType) shapeGeom.Format)
                        {
                            case XbimGeometryType.PolyhedronBinary:
                                m.Read(shapeGeom.ShapeData,
                                    XbimMatrix3D.Multiply(shapeInstance.Transformation, wcsTransform));
                                break;
                            case XbimGeometryType.Polyhedron:
                                m.Read(((XbimShapeGeometry) shapeGeom).ShapeData,
                                    XbimMatrix3D.Multiply(shapeInstance.Transformation, wcsTransform));
                                break;
                        }
                    }
                    break;
                case 1:
                    var xm3d = new XbimMeshGeometry3D();
                    var geomDataSet = fromModel.GetGeometryData(item.EntityLabel, XbimGeometryType.TriangulatedMesh);
                    foreach (var geomData in geomDataSet)
                    {
                        var gd = geomData.TransformBy(wcsTransform);
                        xm3d.Add(gd);
                    }
                    m.Add(xm3d);
                    break;
            }
        }
Esempio n. 2
0
        public IXbimMeshGeometry3D GetVisibleMeshGeometry3D(int entityLabel, short modelId)
        {
            var fragments = GetMeshFragments(entityLabel).ToArray(); //get all the fragments for this entity in the visible layer
            var maxSize   = fragments.Sum(f => f.PositionCount);
            var geometry  = new XbimMeshGeometry3D(maxSize);

            foreach (var fragment in fragments)
            {
                var geom = Visible.GetMeshGeometry3D(fragment);
                geometry.Add(geom, fragment.EntityLabel, fragment.EntityType, modelId);
            }
            return(geometry);
        }
Esempio n. 3
0
        /// <summary>
        /// Gets the geometry of an entity building it up from layers.
        /// </summary>
        /// <param name="entity">The entity instance</param>
        public IXbimMeshGeometry3D GetMeshGeometry3D(IPersistIfcEntity entity, short modelId)
        {
            var    geometry = new XbimMeshGeometry3D();
            IModel m        = entity.ModelOf;

            foreach (var layer in Layers)
            {
                // an entity model could be spread across many layers (e.g. in case of different materials)
                if (layer.Model == m)
                {
                    geometry.Add(layer.GetVisibleMeshGeometry3D(entity.EntityLabel, modelId));
                }
            }
            return(geometry);
        }