xBim獲取ifc文件三角剖分後的三角面片座標對

private static void Main(string[] args)
{
    //打開文件
    using (var store = IfcStore.Open("D://Outer4.ifc"))
    {
        var tessellator = new XbimTessellator(store, XbimGeometryType.PolyhedronBinary);
        XbimShapeGeometry geom = new XbimShapeGeometry();
        //判斷幾何類型並三角剖分
        if ((store.Instances.OfType<IIfcFaceBasedSurfaceModel>().FirstOrDefault()) != null)
        {
            geom = tessellator.Mesh(store.Instances.OfType<IIfcFaceBasedSurfaceModel>().FirstOrDefault());
            //本例子只獲取第一部分(FirstOrDefault())幾何數據
            //如需所有數據總量,可使用Count();
            //int n = store.Instances.OfType<IIfcFaceBasedSurfaceModel>().Count();
            //獲取第n個部分幾何數據,可使用ElementAt(n)
            //XbimShapeGeometry geomN =                             
            tessellator.Mesh(store.Instances.OfType<IIfcFaceBasedSurfaceModel>().ElementAt(n));
            //下同
        }
        else if ((store.Instances.OfType<IIfcShellBasedSurfaceModel>().FirstOrDefault()) != null)
            geom = tessellator.Mesh(store.Instances.OfType<IIfcShellBasedSurfaceModel>().FirstOrDefault());
        else if ((store.Instances.OfType<IIfcConnectedFaceSet>().FirstOrDefault()) != null)
            geom = tessellator.Mesh(store.Instances.OfType<IIfcConnectedFaceSet>().FirstOrDefault());
        else if ((store.Instances.OfType<IIfcTessellatedFaceSet>().FirstOrDefault()) != null)
            geom = tessellator.Mesh(store.Instances.OfType<IIfcTessellatedFaceSet>().FirstOrDefault());
        else if ((store.Instances.OfType<IIfcFacetedBrep>().FirstOrDefault()) != null)
            geom = tessellator.Mesh(store.Instances.OfType<IIfcFacetedBrep>().FirstOrDefault());

        using (var ms = new MemoryStream(((IXbimShapeGeometryData)geom).ShapeData))
        {
            using (var br = new BinaryReader(ms))
            {
                //二進制流讀取幾何數據的三角面片
                XbimShapeTriangulation myShapeTriangulation = br.ReadShapeTriangulation();
                IList<XbimFaceTriangulation> listFace = myShapeTriangulation.Faces;
                IList<XbimPoint3D> listVer = myShapeTriangulation.Vertices;
                Console.WriteLine("The Count of Face(s):" + listFace.Count + "\n");
                foreach (XbimFaceTriangulation FaceTri in listFace)
                {
                    Console.WriteLine("============================Face" + (listFace.IndexOf(FaceTri) + 1)+ " ============================ ");
                    Console.WriteLine("The Count of Triangle(s):" + FaceTri.TriangleCount);
                    for (int nTri = 0; nTri != FaceTri.TriangleCount; ++nTri)
                    {
                        XbimPoint3D pt1 = listVer[FaceTri.Indices[nTri * 3]];
                        XbimPoint3D pt2 = listVer[FaceTri.Indices[nTri * 3 + 1]];
                        XbimPoint3D pt3 = listVer[FaceTri.Indices[nTri * 3 + 2]];

                        Console.WriteLine("--------Triangle[" + (nTri + 1) + "]:");
                        Console.WriteLine("(" + pt1.X + "," + pt1.Y + "," + pt1.Z + ")");
                        Console.WriteLine("(" + pt2.X + "," + pt2.Y + "," + pt2.Z + ")");
                        Console.WriteLine("(" + pt3.X + "," + pt3.Y + "," + pt3.Z + ")");
                    }
                }
            }
        }
    }
    Console.ReadKey();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章