private void WriteShapeGeometry(JsonWriter writer, XbimShapeGeometry geom, XbimMatrix3D?transform = null) { XbimMeshGeometry3D mesh = new XbimMeshGeometry3D(); mesh.Read(geom.ShapeData, transform); writer.WritePropertyName("positions"); writer.WriteStartArray(); foreach (var point in mesh.Positions) { writer.WriteValue(Math.Round(point.X, 4)); //we are converting to metres so this is effectively .1mm writer.WriteValue(Math.Round(point.Y, 4)); writer.WriteValue(Math.Round(point.Z, 4)); } writer.WriteEndArray(); writer.WritePropertyName("indices"); writer.WriteStartArray(); foreach (var idx in mesh.TriangleIndices) { writer.WriteValue(idx); } writer.WriteEndArray(); writer.WritePropertyName("normals"); writer.WriteStartArray(); foreach (var norm in mesh.Normals) { writer.WriteValue(norm.X); writer.WriteValue(norm.Y); writer.WriteValue(norm.Z); } writer.WriteEndArray(); }
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> /// Returns the Mesh Position, Normal, Indices data in a XbimMeshGeometry3D for the specified fragment /// </summary> /// <param name="sourceMesh"></param> /// <param name="fragment"></param> /// <returns></returns> public static XbimMeshGeometry3D GetMeshGeometry3D(this MeshGeometry3D sourceMesh, XbimMeshFragment fragment) { XbimMeshGeometry3D mesh = new XbimMeshGeometry3D(fragment.PositionCount); for (int i = fragment.StartPosition; i <= fragment.EndPosition; i++) { mesh.Positions.Add(sourceMesh.Positions[i]); mesh.Normals.Add(sourceMesh.Normals[i]); } for (int i = fragment.StartTriangleIndex; i <= fragment.EndTriangleIndex; i++) { mesh.TriangleIndices.Add(sourceMesh.TriangleIndices[i] - fragment.StartPosition); } return mesh; }
public IXbimMeshGeometry3D GetMeshGeometry3D(XbimMeshFragment frag) { var m3D = new XbimMeshGeometry3D(); for (var i = frag.StartPosition; i <= frag.EndPosition; i++) { m3D.Positions.Add(Positions[i]); m3D.Normals.Add(Normals[i]); } for (var i = frag.StartTriangleIndex; i <= frag.EndTriangleIndex; i++) { m3D.TriangleIndices.Add(TriangleIndices[i] - frag.StartPosition); } return(m3D); }
/// <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); }
/// <summary> /// Remove the specified fragments from the mesh /// </summary> /// <param name="sourceMesh"></param> /// <param name="fragments">The fragments to include in the copy</param> /// <param name="notCopied">List of mesh geometries removed from the geometry mesh</param> /// <returns></returns> public static XbimMeshGeometry3D Copy(this MeshGeometry3D sourceMesh, IList<XbimMeshFragment> fragments, out List<XbimMeshGeometry3D> notCopied) { XbimMeshGeometry3D mesh = new XbimMeshGeometry3D(sourceMesh.Positions.Count); notCopied = new List<XbimMeshGeometry3D>(); foreach (var fragment in fragments) { int meshStartPosition = mesh.PositionCount; for (int i = fragment.StartPosition; i <= fragment.EndPosition; i++) { mesh.Positions.Add(sourceMesh.Positions[i]); mesh.Normals.Add(sourceMesh.Normals[i]); } for (int i = fragment.StartTriangleIndex; i <= fragment.EndTriangleIndex; i++) { mesh.TriangleIndices.Add(sourceMesh.TriangleIndices[i] - fragment.StartPosition + meshStartPosition); } } return mesh; }
public static XbimMeshGeometry3D MakeBoundingBox(XbimRect3D r3D, XbimMatrix3D transform) { XbimMeshGeometry3D mesh = new XbimMeshGeometry3D(8); XbimPoint3D p0 = transform.Transform(r3D.Location); XbimPoint3D p1 = p0; p1.X += r3D.SizeX; XbimPoint3D p2 = p1; p2.Z += r3D.SizeZ; XbimPoint3D p3 = p2; p3.X -= r3D.SizeX; XbimPoint3D p4 = p3; p4.Y += r3D.SizeY; XbimPoint3D p5 = p4; p5.Z -= r3D.SizeZ; XbimPoint3D p6 = p5; p6.X += r3D.SizeX; XbimPoint3D p7 = p6; p7.Z += r3D.SizeZ; mesh.Positions.Add(p0); mesh.Positions.Add(p1); mesh.Positions.Add(p2); mesh.Positions.Add(p3); mesh.Positions.Add(p4); mesh.Positions.Add(p5); mesh.Positions.Add(p6); mesh.Positions.Add(p7); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(5); return mesh; }
public IXbimMeshGeometry3D GetMeshGeometry3D(XbimMeshFragment frag) { XbimMeshGeometry3D m3d = new XbimMeshGeometry3D(); for (int i = frag.StartPosition; i <= frag.EndPosition; i++) { m3d.Positions.Add(this.Positions[i]); m3d.Normals.Add(this.Normals[i]); } for (int i = frag.StartTriangleIndex; i <= frag.EndTriangleIndex; i++) { m3d.TriangleIndices.Add(this.TriangleIndices[i] - frag.StartPosition); } return m3d; }
static public XbimMeshGeometry3D MakeBoundingBox(XbimRect3D r3D, XbimMatrix3D transform) { var mesh = new XbimMeshGeometry3D(8); var p0 = transform.Transform(r3D.Location); var p1 = p0; p1.X += r3D.SizeX; var p2 = p1; p2.Z += r3D.SizeZ; var p3 = p2; p3.X -= r3D.SizeX; var p4 = p3; p4.Y += r3D.SizeY; var p5 = p4; p5.Z -= r3D.SizeZ; var p6 = p5; p6.X += r3D.SizeX; var p7 = p6; p7.Z += r3D.SizeZ; mesh.Positions.Add(p0); mesh.Positions.Add(p1); mesh.Positions.Add(p2); mesh.Positions.Add(p3); mesh.Positions.Add(p4); mesh.Positions.Add(p5); mesh.Positions.Add(p6); mesh.Positions.Add(p7); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(4); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(3); mesh.TriangleIndices.Add(2); mesh.TriangleIndices.Add(7); mesh.TriangleIndices.Add(6); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(5); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(5); return(mesh); }
public static void Add(this MeshGeometry3D m3D, XbimMeshGeometry3D addedGeometry3D) { m3D.TriangleIndices = Extensions.Utility.GeomUtils.CombineIndexCollection(m3D.TriangleIndices, addedGeometry3D.TriangleIndices, m3D.Positions.Count); m3D.Positions = Extensions.Utility.GeomUtils.CombinePointCollection(m3D.Positions, addedGeometry3D.Positions); m3D.Normals = Extensions.Utility.GeomUtils.CombineVectorCollection(m3D.Normals, addedGeometry3D.Normals); }
public IXbimMeshGeometry3D GetMeshGeometry3D(XbimMeshFragment frag) { var m3D = new XbimMeshGeometry3D(); for (var i = frag.StartPosition; i <= frag.EndPosition; i++) { m3D.Positions.Add(Positions[i]); m3D.Normals.Add(Normals[i]); } for (var i = frag.StartTriangleIndex; i <= frag.EndTriangleIndex; i++) { m3D.TriangleIndices.Add(TriangleIndices[i] - frag.StartPosition); } return m3D; }
private void WriteShapeGeometry(JsonWriter writer, XbimShapeGeometry geom, XbimMatrix3D? transform = null) { XbimMeshGeometry3D mesh = new XbimMeshGeometry3D(); mesh.Read(geom.ShapeData, transform); writer.WritePropertyName("positions"); writer.WriteStartArray(); foreach (var point in mesh.Positions) { writer.WriteValue(Math.Round(point.X,4)); //we are converting to metres so this is effectively .1mm writer.WriteValue(Math.Round(point.Y,4)); writer.WriteValue(Math.Round(point.Z,4)); } writer.WriteEndArray(); writer.WritePropertyName("indices"); writer.WriteStartArray(); foreach (var idx in mesh.TriangleIndices) { writer.WriteValue(idx); } writer.WriteEndArray(); writer.WritePropertyName("normals"); writer.WriteStartArray(); foreach (var norm in mesh.Normals) { writer.WriteValue(norm.X); writer.WriteValue(norm.Y); writer.WriteValue(norm.Z); } writer.WriteEndArray(); }
public IXbimMeshGeometry3D GetMeshGeometry3D(XbimMeshFragment frag) { var m3D = new XbimMeshGeometry3D(); var m = Mesh; if (m != null) { for (int i = frag.StartPosition; i <= frag.EndPosition; i++) { Point3D p = m.Positions[i]; Vector3D v = m.Normals[i]; m3D.Positions.Add(new XbimPoint3D(p.X, p.Y, p.Z)); m3D.Normals.Add(new XbimVector3D(v.X, v.Y, v.Z)); } for (int i = frag.StartTriangleIndex; i <= frag.EndTriangleIndex; i++) { m3D.TriangleIndices.Add(m.TriangleIndices[i] - frag.StartPosition); } m3D.Meshes.Add(new XbimMeshFragment(0, 0,0) { EndPosition = m3D.PositionCount - 1, StartTriangleIndex = frag.StartTriangleIndex - m3D.PositionCount - 1, EndTriangleIndex = frag.EndTriangleIndex - m3D.PositionCount - 1 }); } return m3D; }