示例#1
0
        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;
            }
        }
示例#3
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);
        }
 /// <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;
 }
示例#5
0
        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);
        }
示例#6
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);
        }
        /// <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;
        }
示例#8
0
        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;
        }
示例#9
0
 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;
 }
示例#10
0
        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);
 }
示例#12
0
 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;
 }
示例#13
0
 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();
 }
示例#14
0
 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;
 }