Как получить геометрию из файла 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>;
}
}
}
}