Как получить геометрию из файла IFC, используя Xbim? Или есть другая альтернатива этой задаче?

Я хочу получить данные из необработанного файла IFC. Я пытаюсь это с Xbim. Я могу получить элементы, но не могу получить данные, специфичные для геометрии. Мне нужно местоположение, ограничивающий прямоугольник.

Возможно ли это сделать с помощью xbim? Есть ли альтернатива xbim?

В моем случае IFC включает в себя стены, проемы, плиты, балки и шпильки. Мне нужны их соответствующие геометрии и местоположение. Балки и шпильки имеют просверленные отверстия. Но эти просверленные отверстия не принадлежат какой-либо сущности ifc, такой как IfcOpeningElement или Ifc Void.

Есть ли способ, которым я могу получить геометрию этих отверстий в форме тесселяна?

Все, что мне нужно, это доступ к геометрическим данным объектов IFC.

Я также пытался использовать Revit для получения данных. Но были проблемы с конвертацией, так как она сильно зависит от того, как присутствует отображение сущностей Ifc с категорией revit. Для каждой новой новой модели элементы ifc сопоставлены с другой категорией.

В revit я импортировал файл ifc и создал дополнение для revit. Эти надстройки могут читать все элементы и могут получать данные геометрии. Есть ли другое такое приложение, но менее тяжелое, чем revit, где я могу попробовать создать такое дополнение, и приложение должно правильно классифицировать элементы?

1 ответ

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>;
                    }
                }
            }
        }
Другие вопросы по тегам