Исходные данные

IFC file размером 206.1 Мб
При открытии создаётся
Файл базы данных 212 Мб, т.к. файл больше 50 мб и он будет обрабатываться используя модель базы данных, если бы файл был меньше использовалась бы память.
При открытии происходит только парсин всех сущностей IFC модели, графической информации пока нет.
Для получение графической информации используется модуль Xbim Geometry, выполняется метод Create Context
Во время выполнения метода CPU 99% ОЗУ 400-500 Мб, используется графическое ядро OpenCASECADE.
Файл БД увеличивается до 245 Мб
Полигональные сетки создаются в бинарном формате (XbimGeometryType.PolyhedronBinary) в формате PLY
geomRead.ShapeGeometries
Нужен метод аналоничный методу
SaveAsWexBim(BinaryWriter binaryStream, IEnumerable products = null)
Из метода:
// binaryStream.Write(geometry.ShapeData);
var ms = new MemoryStream(((IXbimShapeGeometryData) geometry).ShapeData);
var br = new BinaryReader(ms);
var tr = br.ReadShapeTriangulation();
tr.Write(binaryStream);
только сохраняющий полигональные сетки
Проверял на простых моделях, модель из 4-х стен,
var lookup = geomRead.ShapeGeometries; // содержит 4 полигональные сетки
geometry.ShapeData создержит данные в формате PLY (в бинарном виде), но не содержит заголовок PLY файла
После этого сохраняем файл с полигональными сетками:
global_model_v2.wexbim
28 мб
Вывод:
Полигональные сетки не занимают много памяти сами по себе, память потребляет сам модуль визуализации.
Метаданные к полигональным сеткам
wexbim файл не содержит GUID объекта, но каждая форма (Shape) содержит уникальную метку IfcProductLabel («ExternalId»: «229» в json-файле).
Для получения метаданных в json используется модуль COBieLiteUK из проекта XbimExchange
Тест получения метаданных:
using (var m = IfcStore.Open("d:\\Temp\\global_model_v11.ifc")
{
var facilities = new List<Facility>();
var ifcToCoBieLiteUkExchanger = new IfcToCOBieLiteUkExchanger(m, facilities);
facilities = ifcToCoBieLiteUkExchanger.Convert();
var facilityType = facilities.FirstOrDefault();
if(facilityType!=null)
{
//write the cobie data in json format
facilityType.WriteJson("d:\\Temp\\global_model_v11.json", true);
}
}
Обработка 200 Мб IFC меньше минуты, json файл 45 Мб.
Ответ разработчиков по поводу метаданных:
«It is our own schema called COBieLiteUK and is implemented in XbimExchange where you can also find a code for conversions. However, converting complete model into single JSON semantic file is not viable for large models. Resulting files tend to be too large for web publishing.»
Запись в бинарный формат полигональной модели (в формате PLY)
Класс XbimShapeTriangulation
Метод
public void Write(BinaryWriter bw)
{
bw.Write((byte)_version); //stream format version
bw.Write((Int32)_vertices.Count);
bw.Write((Int32)_faces.Sum(face => face.TriangleCount));
foreach (var v in _vertices)
{
bw.Write((float)v.X);
bw.Write((float)v.Y);
bw.Write((float)v.Z);
}
bw.Write((Int32)_faces.Count);
foreach (var xbimFaceTriangulation in _faces)
{
if (xbimFaceTriangulation.IsPlanar)
{
bw.Write((Int32) xbimFaceTriangulation.TriangleCount);
xbimFaceTriangulation.Normals[0].Write(bw);
xbimFaceTriangulation.WriteIndices(bw, _vertices.Count);
}
else
{
bw.Write((Int32)(-xbimFaceTriangulation.TriangleCount));
xbimFaceTriangulation.WriteIndicesAndNormals(bw, _vertices.Count);
}
}
}
Сравнение визуализаторов
Критерий | Helix-toolkit https://github.com/helix-toolkit/helix-toolkit | Eyeshot Ultimate 9.0 (http://www.devdept.com/) |
Цена | Бесплатный | платный |
Работа с матрицами преобразований | Есть | Есть |
Библиотека, которая используется для рендеринга | DirectX | DirectX |
Скорость работы (субъективно) на графической станции House_1.ifc (5 Мб) | высокая | Ультра высока |
ноутбук | Средняя | |
Скорость работы rac_basic_sample_project.ifc (26 Мб) графическая станция | Высоко | Ультра высока |
ноутбук | Средняя | |
Big.ifc (200 Мб) | Очень низкая | Низкая |
ноутбук | Очень низкая | |
Размер памяти для модели Big.ifc | 1,8 Gb | 2,5 Gb |
Документация (субъективно) | 8 из 10 | 5 из 10 |
Reference
- The PLY File Format http://www.cc.gatech.edu/projects/large_models/ply.html
- https://en.wikipedia.org/wiki/PLY_(file_format)
- https://people.sc.fsu.edu/~jburkardt/data/ply/ply.html — примеры PLY файлов
- PLY — Polygon File Format — Also known as the Stanford Triangle Format http://paulbourke.net/dataformats/ply/
- Greg Turk, The PLY Polygon File Format http://www.dcs.ed.ac.uk/teaching/cs4/www/graphics/Web/ply.html
- Описание OBJ файла http://www.martinreddy.net/gfx/3d/OBJ.spec
Данная статья содержит материалы моих исследования от 17.10.2016 года