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; } }
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); }
/// <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); }