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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 15 июля 2019

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>;
                    }
                }
            }
        }
...