如何使用Xbim从IFC文件中检索几何?还是有其他替代方法?

时间:2019-06-14 10:59:27

标签: geometry revit-api ifc xbim

我想从原始IFC文件中检索数据。 我正在尝试用Xbim。我能够检索元素,但无法获取特定于几何的数据。我需要位置,boundingbox。

是否可以使用xbim做到这一点? xbim可以替代吗?

就我而言, IFC包括墙壁,开口,平板,横梁和双头螺栓。 我需要它们的相关几何形状和位置。 梁和螺柱上有钻孔。 但是这些钻孔不属于任何ifc实体,例如IfcOpeningElement或Ifc Void。

有没有办法让我获得这些孔的几何形状 呈棋盘格形式?

我所需要做的就是访问IFC实体的几何数据。

我也尝试过使用Revit来获取数据,但是转换存在问题,例如它很大程度上取决于如何将具有revit类别的Ifc实体映射到其他所有新模型中,将ifc元素映射到不同的类别

在revit中,我导入了ifc文件并为revit创建了插件。 这些插件可以读取所有元素并获取其几何数据。 还有其他任何这样的应用程序,但是比revit轻的多,我可以尝试构建这样的插件,而且应用程序必须正确地对元素进行分类?

1 个答案:

答案 0 :(得分:0)

Revit是一个繁琐的程序,请改用xbim,尝试以下代码获取几何信息:

        using (var model = IfcStore.Open("ifc_file.ifc"))
        {
            Xbim3DModelContext context = new Xbim3DModelContext(model);
            context.CreateContext();

            List<XbimShapeGeometry> geometrys = context.ShapeGeometries().ToList();
            List<XbimShapeInstance> instances = context.ShapeInstances().ToList();

            //Check all the instances
            foreach (var instance in instances)
            {
                var transfor = instance.Transformation; //Transformation matrix (location point inside)

                XbimShapeGeometry geometry = context.ShapeGeometry(instance);   //Instance's geometry
                XbimRect3D box = geometry.BoundingBox; //bounding box you need

                byte[] data = ((IXbimShapeGeometryData)geometry).ShapeData;

                //If you want to get all the faces and trinagulation use this
                using (var stream = new MemoryStream(data))
                {
                    using (var reader = new BinaryReader(stream))
                    {
                        var mesh = reader.ReadShapeTriangulation();

                        List<XbimFaceTriangulation> faces = mesh.Faces as List<XbimFaceTriangulation>;
                        List<XbimPoint3D> vertices = mesh.Vertices as List<XbimPoint3D>;
                    }
                }
            }
        }