Example #1
0
        /// <summary>
        /// Appends a geometry data object to the Mesh, returns false if the mesh would become too big and needs splitting
        /// </summary>
        /// <param name="geometryMeshData"></param>
        /// <param name="modelId"></param>
        public bool Add(XbimGeometryData geometryMeshData, short modelId = 0)
        {
            var transform = XbimMatrix3D.FromArray(geometryMeshData.DataArray2);

            if (geometryMeshData.GeometryType == XbimGeometryType.TriangulatedMesh)
            {
                var strm     = new XbimTriangulatedModelStream(geometryMeshData.ShapeData);
                var fragment = strm.BuildWithNormals(this, transform, modelId);
                if (fragment.EntityLabel == -1) //nothing was added due to size being exceeded
                {
                    return(false);
                }
                fragment.EntityLabel  = geometryMeshData.IfcProductLabel;
                fragment.EntityTypeId = geometryMeshData.IfcTypeId;
                _meshes.Add(fragment);
            }
            else if (geometryMeshData.GeometryType == XbimGeometryType.BoundingBox)
            {
                var r3D = XbimRect3D.FromArray(geometryMeshData.ShapeData);
                throw new NotImplementedException();//need to fix this
                // Add(MakeBoundingBox(r3D, transform), geometryMeshData.IfcProductLabel, IfcMetaData.GetType(geometryMeshData.IfcTypeId), modelId);
            }
            else
            {
                throw new XbimException("Illegal geometry type found");
            }
            return(true);
        }
Example #2
0
        //adds the content of the toAdd to this, it is added as a single mesh fragment, any meshes in toAdd are lost
        public void Add(IXbimMeshGeometry3D toAdd, int entityLabel, Type ifcType, short modelId)
        {
            var startPosition = Positions.Count;
            var fragment      = new XbimMeshFragment(startPosition, TriangleIndexCount, modelId);

            Positions.AddRange(toAdd.Positions);
            Normals.AddRange(toAdd.Normals);
            foreach (var idx in toAdd.TriangleIndices)
            {
                TriangleIndices.Add(idx + startPosition);
            }
            fragment.EndPosition      = PositionCount - 1;
            fragment.EndTriangleIndex = TriangleIndexCount - 1;
            fragment.EntityLabel      = entityLabel;
            fragment.EntityTypeId     = IfcMetaData.IfcTypeId(ifcType);
            _meshes.Add(fragment);
        }