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