Хабрахабр

Industry Foundation Classes. Краткое введение

Введение

В связи с политикой Партии и Правительства, происходит активное изменение законодательства в целях внедрения технологии BIM — Информационное моделирование Зданий. В продолжении линии Партии рассмотрим открытый формат представления BIM — IFC (Industry Foundation Classes).

История IFC начинается в 1995 (на самом деле — летом 1993 [1]), когда корпорация Autodesk с группой «товарищей» организовала Картельный сговор с целью разработки обменного формата для различных САПР для проектирования зданий. Через год, товарищи пришли к пониманию, что этот формат должен быть открытым и разрабатываться организацией с открытым членством, так в 1996 появилась International Alliance for Interoperability. Позже, в 2008 году, организация была переименована в buildingSMART — для большей гламурности.

Поэтому, они взяли за основу формат STEP (Standard for the Exchange of Product model data), а точнее Application Protocol 225: Building Elements. Разработчики IFC не обладали богатым воображением, да и не имели возможности его применить – им были поставлены весьма скромные сроки, а задача выглядела весьма глобально. В основе этой инфраструктуры лежит язык моделирования данных EXPRESS и его графическая инкарнация EXPRESS-G, этот язык разрабатывался для удобства автогенерации кода на различных языках программирования. Надо сказать, что вокруг STEP создана богатая инфраструктура в виде кучи спецификаций в статусе ИСО-стандартов.

0 опубликован в Июне 1996, окончательная редакция в Январе 1997. Разработка IFC началась в Сентябре 1995, IFC 1. Фактически целью первой версии IFC — была демонстрации самой возможности реализации задуманной цели, различные компании представили свои демонстрации экспорта/импорта в этот формат.

5, но попытка её реализация быстро выявило множество ошибок, которые потребовали разработки исправленной версии 1. В Ноябре 1997 вышла следующая версия — 1. 1, которая ввелась параллельно с разработкой версией 2. 5. 0 — которая была представлена в Марте 1999.

Все эти версии сейчас признаны устаревшими.

1, это самая старая версия, по которой доступна документация. В Ноябре 2000 вышла версия 2. Позже она была опубликована как ISO/PAS 16739:2005.

3. Сейчас наиболее распространённая версия (которую понимает большинство программ) — IFC 2.

Софт

Для чтения IFC пригодится текстовый редактор с подсветкой синтаксиса, например я использовал n++ и vs code со своими корявыми настройками синтаксиса IFC.

Сейчас появилось множество вьюверов для этого и даже бесплатных, лично я предпочитаю XbimXplorer от проекта xBIM. Но ещё необходимым инструментом будет программа способная визуализировать графику в IFC. Также я использовал Revit, но надо сказать, что чистый Revit не очень дружит с IFC — он даже не способен прочитать файл, который сам создал (да, Revit от Autodesk'а не умеет работать с форматом придуманным Autodesk'ом — это визитная карточка Autodesk'а, просто они не придумали Revit, а купили его — как обычно), но у него есть не плохой плагин для этого — IFC for Revit (пока писал статью — нащёл несколько ошибок, нужно будет исправить, когда будет время...)

Так XbimXplorer игнорирует 2d-графику и некоторые синтаксические ошибки. Надо сказать, что формат IFC настолько запутанный, что ни одна программа не обрабатывает его правильно — каждая это делает по своему.

Описание

Формат IFC существует в трёх ипостасях: IFC-SPF (.ifc), IFC-XML (.ifcXML), IFC-ZIP (.ifcZIP)
IFC-SPF — это текстовый формат, определённый в ISO 10303-21 — фактически это STEP-файл
IFC-XML — это XML-формат определённый в ISO 10303-28 («STEP-XML»)
IFC-ZIP — zip-архив который может содержать .ifc или .ifcXML

Это текстовый файл, в котором используется только символы с кодами в диапазоне 32-126 (третье издание допускает использование символов с кодами 127-255, но не рекомендуется — для совместимости)
Многострочные комментарии отмечаются парами символов /* */ Структура файла IFC-SPF описана в ISO 10303-21 (существует ГОСТ ИСО 10303-21-2002) в нотации Вирта.

Для записи символов в другой кодировке предусмотрено несколько способов

д. Запись ISO 8859:
Директива \S\ — код символа после директивы указывает код символа в таблице ISO 8859-1
Директива \P*\ — здесь вместо * должна стоять заглавная латинская буква, она указывает номер таблицы ISO 8859 которая используется для директивы \S\, A означает ISO 8859-1, B означает ISO 8859-2 и т.

Запись ISO 10646:
Директива \X\ — за директивой следует двузначное шестнадцатеричное число указывающее символ в диапазоне от U+0000 до U+00FF
Директивы \X2\*\X0\ и \X4\*\X0\ — здесь вместо * идёт последовательность двузначных (X2) или четырёхзначных (X4) шестнадцатеричных чисел, которые обозначают соответствующие символы

=> \X2\041F04400438043204350442\X0\, \X2\041C04380440\X0\! Привет, Мир!

Максимальная длина сырой строки — 32769 байт

Структура файла — файл начинается строкой ISO-10303-21; и заканчивается строкой END-ISO-10303-21; правда после ещё может быть секция подписи SIGNATURE_SECTION, но этот вариант я не буду рассматривать.
Между этими строками должна быть секция заголовка HEADER_SECTION, после неё могут быть секции ANCHOR_SECTION и/или REFERENCE_SECTION, а также одна или несколько DATA_SECTION (в IFC только одна)

Структура заголовочной секции HEADER_SECTION — IFC допускает лишь три элемента в этой секции: FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMA

ENTITY file_description;
description : LIST [1:?] OF STRING (256) ;
implementation_level : STRING (256) ;
END_ENTITY;

0]'),'2;1');
Содержимое description очень важно для IFC – здесь перечисляются используемые дополнения ViewDefinition, содержание ExchangeRequirement и опции Option[2], но обязательным является только элемент ViewDefinition
implementation_level состоит из двух цифр, первая обозначает редакцию ISO-10303-21 (их три), вторая – режим совместимости (их два), описаны в п. Минимальный вариант:
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2. 3 ISO-10303-21. 4. Для IFC implementation_level всегда имеет значение — 2;1

0, QuantityTakeOffAddOnView]', 'ExchangeRequirement[Structural]'),'2;1'); Ещё вариант:
FILE_DESCRIPTION( ('ViewDefinition [CoordinationView_V2.

] OF STRING (256) ;
organization : LIST [ 1 : ? ENTITY file_name;
name : STRING (256) ;
time_stamp : time_stamp_text ;
author : LIST [ 1 : ? ] OF STRING (256) ;
preprocessor_version : STRING (256) ;
originating_system : STRING (256) ;
authorization : STRING (256) ;
END_ENTITY;

Имя файла, штамп времени, автор, организация, версия препроцессора, программа создания, авторизация. Все значения можно оставить пустыми.

ENTITY file_schema;
schema_identifiers : LIST [1:?] OF UNIQUE schema_name;
END_ENTITY;

Имя схемы, в которой описано содержание секции данных (смотри столбец Индефекатор в таблице выше)

Содержимым этой секции является последовательность сущностей следующего синтаксиса:
#<индекс сущности>= <имя сущности>(<список атрибутов>);
Возможные сущности и их параметры описаны в IFC-схеме. Секция данных начинается с ключевого слова DATA; и заканчивается ENDSEC;.

0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21; Пустой IFC файл:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.

Секция данных

Корневым элементом IFC является IfcProject. Тут надо рассказать, как формируется список атрибутов, нужный для создания сущности, во-первых, сущность может иметь собственные атрибуты, а во-вторых она может унаследовать их от предка, порядок атрибутов задаётся — от предка к потомку. Для IfcProject цепочка наследования будет следующая: IfcRoot=>IfcObjectDefinition=>IfcObject=>IfcProject.

IFCPROJECT(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>, <LongName>,<Phase>, (<RepresentationContexts>),<UnitsInContext>);

Первый атрибут, унаследованный от IfcRoot – GlobalId, имеет значение IfcGloballyUniqueId. Теперь для создания IfcProject нам нужно задать значения для всех атрибутов. Следующий атрибут OwnerHistory имеет значение IfcOwnerHistory. Это простой тип – строка длиной в 22 символа, в них нужно записать уникальный идентификатор GUID или UUID, что бы 128 битное число упихать в 22 символа – существует специальный алгоритм, опубликованный на сайте buildingSMART[3]. Что бы заполнить этот атрибут, можно создать элемент «по месту», но лучше сделать это в другом месте, а на месте просто на него сослаться записью вида #<индекс сущности>. Этот элемент отвечает на вопросы – кто, как и когда создал этот IFC-элемент, фактически почти для каждого объекта в IFC может быть указан его автор, через этот элемент. Значения типа enum записываются между двумя точками — . Также символ $ означает null-значение, символ * используется если потомок сам присваивает значению атрибуту предка. ELEMENT.

READWRITE.,. Пример создания IfcProject:
#1=IFCPROJECT('abcdefghijklmnopqrs101', #2, 'sample project', $, $, '','',$,$);
#2=IFCOWNERHISTORY(#3,#6,. Public, Inc.',$,(),());
#6=IFCAPPLICATION(#7,'Version 1. ADDED.,87763554,#3,#6,87763554);
#3=IFCPERSONANDORGANIZATION(#4,#5,());
#4=IFCPERSON('Public','Jane','Q.',(),(),(),(),());
#5=IFCORGANIZATION($,'Architecture by Jane Q. 0');
#7=IFCORGANIZATION($,'Creating Instance Software, Inc.',$,(),());
0','Building Architecture Toolkit','BAT1.

Следующие элементы <Имя>, <Описание>, <ObjectType>, <LongName>,<Phase> — опциональные и текстовые (IfcLabel, IfcText) — описание проекта для человека

И разные объекты могут иметь разное представление в разных контекстах. RepresentationContexts – это список пространств/контекстов, идея была в том, что у нас может быть несколько пространств/контекстов, например: эскиз, проект и рабочая документация. Но в IFC2x3 концепция поменялась, контексты 'Sketch', 'Outline', 'Design', 'Detail' или отменили или они переехали в IfcGeometricRepresentationSubContext. Например, стена в эскизе – просто линия, в проекте уже имеет толщину, а в рабочей документации – состоит из разных слоёв. А сам класс IfcRepresentationContext стал абстрактным, с единственным потомком – IfcGeometricRepresentationContext, который может быть объёмным ContextType = 'Model', CoordinateSpaceDimension = 3, плоским ContextType = 'Plan', CoordinateSpaceDimension = 2 и фиг знает каким ContextType = 'NotDefined'.

IFCGEOMETRICREPRESENTATIONCONTEXT(<Имя>,<Тип>,<Размерность пространства>,<Точность - расстояние на котором точки считаются идентичными>,<Система координат>,<Направление на север>)

UnitsInContext – объект IfcUnitAssignment, формирующий список элементов IfcUnit с описанием единиц измерения проекта, нужно для правильного импорта, иначе софт будет применять свои настройки по умолчанию – в Revit’е например стоят футы (он всё хранит в футах).

LENGTHUNIT.,. #2= IFCSIUNIT(*,. METRE.);
#3= IFCSIUNIT(*,. MILLI.,. SQUARE_METRE.);
#4= IFCSIUNIT(*,. AREAUNIT.,$,. CUBIC_METRE.);
#5= IFCSIUNIT(*,. VOLUMEUNIT.,$,. RADIAN.);
#6= IFCUNITASSIGNMENT((#2,#3,#4,#5));
PLANEANGLEUNIT.,$,.

Но эти элементы связываются не на прямую, а через специальный элемент IfcRelAggregates, отношением один-к-многим. От корневого элемента IfcProject формируется дерево элементов, наследников типа IfcSpatialStructureElement (IfcBuilding (здание), IfcBuildingStorey (этаж), IfcSpace (пространство или помещение), IfcSite (участок)).

IFCRELAGGREGATES(<GlobalId>, <OwnerHistory>, <Имя>, <Описание>, <Родительский элемент>, (<список потомков>));

Эти элементы могут быть связанны только в следующем порядке: IfcSite=>IfcBuilding=>IfcBuildingStorey=>IfcSpace, а также могут быть связанны однотипные элементы, но тогда их атрибут CompositionType должен иметь разное значение и только в определённом порядке COMPLEX=>ELEMENT=>PARTIAL

COMPLEX=>IfcSite. Полная возможная структура проекта:
IfcSite. PARTIAL=> IfcBuilding. ELEMENT=>IfcSite. ELEMENT=>IfcBuilding. COMPLEX=>IfcBuilding. COMPLEX=>IfcBuildingStorey. PARTIAL=> IfcBuildingStorey. PARTIAL=> IfcSpace. ELEMENT=>IfcBuildingStorey. ELEMENT=>IfcSpace. COMPLEX=> IfcSpace. PARTIAL

ifc-файл

Хотя все элементы не обязательные, обязателен лишь порядок наследования
Предпологоается, что вы описываете Здание (Building), которое состоит из этажей (Storey) и в которых существуют помещения (Space), вам нужно показать существующий рельеф (Site) в который вы вписываете своё здание

IFCSITE(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<LongName>,<CompositionType>,<RefLatitude>,<RefLongitude>,<RefElevation>,<LandTitleNumber>,<SiteAddress>);

Атрибут Representation, унаследованный от IfcProduct, указывает на объект IfcProductRepresentation, имеет двух потомков IfcProductDefinitionShape – для описания формы объекта и IfcMaterialDefinitionRepresentation – описания материала (стиля визуализации), они через атрибут Representations связывают различные представления.

IfcProductDefinitionShape(<Имя>,<Описание>,(<Representations>))
IfcMaterialDefinitionRepresentation(<Имя>, <Описание>,<Representations>),<RepresentedMaterial>)

IfcMaterialDefinitionRepresentation для Representations принимает только IfcStyledRepresentation — описания стиля
Атрибут RepresentedMaterial даёт текстовое описание материала объекта.
IfcProductDefinitionShape для Representations принимает только IfcShapeRepresentation или IfcTopologyRepresentation (IfcShapeModel)

Доступные типы геометрии: Curve2D (плоские линии), GeometricSet (точки, линии, поверхности, 2d и 3d), SurfaceModel (поверхности), SolidModel (тела), дополнительные типы (BoundingBox, SectionedSpine, MappedRepresentation) IfcShapeRepresentation самый важный в IFC класс, потому что отвечает за геометрическое представление объектов.

IFCSHAPEREPRESENTATION(<контекст>,<RepresentationIdentifier>,<тип геометрии>,<список элементов>);

UNSPECIFIED.,. В основе любой геометрии находится элемент IfcCartesianPoint – просто точка.
#13= IFCCARTESIANPOINT((0.,0.,0.));
#16= IFCCARTESIANPOINT((1.,0.,0.));
#22= IFCPOLYLINE((#13, #16));

#510= IFCBSPLINECURVEWITHKNOTS(3,(#511,#512,#513,#514,#511,#512,#513),. T.,(1,1,1,1,1,1,1,1,1,1,1),(-7. T.,. 0,-5. 0,-6. 0,-3. 0,-4. 0,-1. 0,-2. 0,1. 0,0. 0,3. 0,2. UNSPECIFIED.);
#511= IFCCARTESIANPOINT((239. 0),. 193559404919,-83. 758213537139,192. 0,275. 9999999999991));
#512= IFCCARTESIANPOINT((0. 9999999999991));
#513= IFCCARTESIANPOINT((-239. 591853484122,-83. 193559404918,-83. 75821353295,192. 0,-108. 9999999999991));
#514= IFCCARTESIANPOINT((0. 9999999999991));

#34= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#35));
#35= IFCEXTRUDEDAREASOLID(#36,#8,#37,0. 13323051355,-83. AREA.,$,#38,0. 5);
#36= IFCRECTANGLEPROFILEDEF(. 5);
#37= IFCDIRECTION((0.,0.,1.));
#38= IFCAXIS2PLACEMENT2D(#39,#9);
#7= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0. 5,0. Атрибут SweptArea имеет тип IfcProfileDef – это абстрактный класс, имеющий большое количество потомков «на все случаи жизни», в данном случае используется IfcRectangleProfileDef(<ProfileType>,<ProfileName>,<Position>,<XDim>,<YDim>) 01,#8,#9);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#9= IFCDIRECTION((0.,1.));
#39= IFCCARTESIANPOINT((0.,0.));

Геометрия может состоять просто из списка точек, а может иметь сложную структуру с кучей параметров и дочерних элементов.
Рассмотрим IfcExtrudedAreaSolid(<SweptArea>,<Position>,<ExtrudedDirection>,<Depth>)

Это тело полученное выдавливанием исходного плоского контура SweptArea размещённого в пространстве Position выдавленного в направлении ExtrudedDirection на глубину ExtrudedDirection.

Опциональное имя профиля ProfileName, размещение Position и размер по координатам X Y – XDim, YDim.
ProfileType – тип профиля enum-значение типа IfcProfileTypeEnum (Значения: CURVE,AREA).

Граничное представление (brep) диктует массу условий на свою структуру – подробно описанные в документации и соответствующей литературе. Или более сложный IfcFacetedBrep он состоит из одной закрытой оболочки IfcClosedShell, которая в свою очередь состоит из списка граней IfcFace, которые состоят из рёбер IfcFaceBound, которые описаны петлями IfcLoop, которые уже состоят из точек IfcCartesianPoint.

#57= IFCSHAPEREPRESENTATION(#7, 'Body', 'Brep', (#58));
#58= IFCFACETEDBREP(#59);
#59= IFCCLOSEDSHELL((#80, #81, #82, #83, #84, #85));

#60 = IFCCARTESIANPOINT((0.,0.,0.));
#61 = IFCCARTESIANPOINT((1.,0.,0.));
#62 = IFCCARTESIANPOINT((1.,1.,0.));
#63 = IFCCARTESIANPOINT((0.,1.,0.));
#64 = IFCCARTESIANPOINT((0.,0.,1.));
#65 = IFCCARTESIANPOINT((1.,0.,1.));
#66 = IFCCARTESIANPOINT((1.,1.,1.));
#67 = IFCCARTESIANPOINT((0.,1.,1.));

#68= IFCPOLYLOOP((#60, #61, #62, #63));
#69= IFCPOLYLOOP((#64, #65, #66, #67));
#70= IFCPOLYLOOP((#60, #61, #65, #64));
#71= IFCPOLYLOOP((#61, #62, #66, #65));
#72= IFCPOLYLOOP((#62, #63, #67, #66));
#73= IFCPOLYLOOP((#63, #60, #64, #67));

T.);
#75= IFCFACEOUTERBOUND(#69, . #74= IFCFACEOUTERBOUND(#68, . T.);
#77= IFCFACEOUTERBOUND(#71, . T.);
#76= IFCFACEOUTERBOUND(#70, . T.);
#79= IFCFACEOUTERBOUND(#73, . T.);
#78= IFCFACEOUTERBOUND(#72, . T.);

#80= IFCFACE((#74));
#81= IFCFACE((#75));
#82= IFCFACE((#76));
#83= IFCFACE((#77));
#84= IFCFACE((#78));
#85= IFCFACE((#79));

В IFC4 появился IfcAdvancedBrep, грани которого могут быть описаны NURBS-кривыми

д. Объекты IfcSpatialStructureElement могут иметь собственную геометрию, но вообще то здания состоят из других объектов: стен, полов, крыш, окон, дверей и т. Все эти объекты могут быть связанны с соответствующим объектом IfcSpatialStructureElement, через специальный объект IfcRelContainedInSpatialStructure В IFC все эти объекты описываются соответствующими объектами: IfcWall, IfcSlab, IfcRoof, IfcWindow, IfcDoor – все они являются потомками IfcProduct.

IFCRELCONTAINEDINSPATIALSTRUCTURE(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>, (<RelatedElements>),<RelatingStructure>)

В случае IfcWallStandardCase нужно использовать SweptSolid – выдавливающий контур стены на заданную высоту Для стен постоянной толщины принято использовать IfcWallStandardCase (в IFC4 считается устаревшим), для остальных случаев используем IfcWall.

IFCWALLSTANDARDCASE(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>);

AREA.,$,#23,100.,1000.);
#31= IFCCARTESIANPOINT((500.,0.,100.));
#32= IFCAXIS2PLACEMENT3D(#31,$,$);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#10= IFCCARTESIANPOINT((0.,0.,0.));
#13= IFCLOCALPLACEMENT($,#8);
#22= IFCDIRECTION((0.,0.,1.));
#23= IFCAXIS2PLACEMENT2D(#24,#25);
#24= IFCCARTESIANPOINT((0.,0.));
#25= IFCDIRECTION((1.,0.));
#26= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs107',$,'wall1',$,'',#13,#27,'');
#27= IFCPRODUCTDEFINITIONSHAPE($,$,(#28));
#28= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#29));
#29= IFCEXTRUDEDAREASOLID(#30,#32,#22,1000.);
#30= IFCRECTANGLEPROFILEDEF(.

Дверь описывается объектом IfcDoor, его можно добавить в IfcRelContainedInSpatialStructure, но этот объект не делает «вырез» в стене для себя

В IfcOpeningElement можно «вставить» дверь, с помощью объекта IfcRelFillsElement. За «вырез» отвечает специальный объект IfcOpeningElement, который связывается с «родительским» объектом через IfcRelVoidsElement. С помощью IfcOpeningElement можно делать не только сквозные отверстия, но и углубления.

IFCDOOR(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)

IFCWINDOW(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)

Объект IfcWindow сильно похож в использовании, на IfcDoor, OverallHeight, OverallWidth — номинальные габариты, можно не указывать – тогда эти значения будут браться из геометрии

Но при этом IfcRoof может иметь собственую геометрию Representation.
IFCSLAB(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<PredefinedType>);
IFCROOF(<GlobalId>,<OwnerHistory>,<Имя>,<Описание>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<IfcRoofTypeEnum>); Объект IfcRoof подразумевается сложным объектом – он должен описывать всю кровлю, для связи всех дочерних элементов с ним – нужно использовать IfcRelAggregates.

Пишем IFC

Теперь, вооружившись этим знанием, попробуем описать простой домик, для начало мы возмём пустой IFC файл — описание которого я уже приводил

пустой IFC файл

0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;

ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.

Дальше, мы должны наполнить содержанием DATA-секцию. Первым обязательным обектом должен быть IFCPROJECT (хотя он может быть и в конце файла, но он просто должен быть), также нам понадобится IFCUNITASSIGNMENT, если мы конечно хотим, что бы программы читали модель в тех еденицах измерения, которые мы задумали. Так же нам понадобится, хотя бы один IFCGEOMETRICREPRESENTATIONCONTEXT — иначе мы не сможем добавить описание геометрии.

IFCPROJECT, IFCUNITASSIGNMENT, IFCGEOMETRICREPRESENTATIONCONTEXT

#1=IFCPROJECT('abcdefghijklmnopqrs101', $, 'Project #1', $, $, '','', (#7), #6);

LENGTHUNIT.,. /* Единицы измерений модели */
#2= IFCSIUNIT(*,. METRE.);
#3= IFCSIUNIT(*,. MILLI.,. SQUARE_METRE.);
#4= IFCSIUNIT(*,. AREAUNIT.,$,. CUBIC_METRE.);
#5= IFCSIUNIT(*,. VOLUMEUNIT.,$,. RADIAN.);
#6= IFCUNITASSIGNMENT((#2,#3,#4,#5)); PLANEANGLEUNIT.,$,.

01,#8,#9);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#9= IFCDIRECTION((0.,1.));
#10= IFCCARTESIANPOINT((0.,0.,0.)); /* Контекст */
#7= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.

Структура дома

IFCBUILDING=>IFCBUILDINGSTOREY=>IFCRELCONTAINEDINSPATIALSTRUCTURE

/* Дом */
#11= IFCBUILDING('abcdefghijklmnopqrs102', $, $, $, $, #13, $, $, .ELEMENT., $, $, $);
#12= IFCRELAGGREGATES('abcdefghijklmnopqrs103', $, $, $, #1, (#11));
#13= IFCLOCALPLACEMENT($,#8);

ELEMENT.,0.);
#15= IFCRELAGGREGATES('abcdefghijklmnopqrs103', $, $, $, #11, (#14)); /* Этаж */
#14= IFCBUILDINGSTOREY('abcdefghijklmnopqrs104',$,'level1',$,'',#13,$,'',.

#16= IFCRELCONTAINEDINSPATIALSTRUCTURE('abcdefghijklmnopqrs105',$,$,$,(#17, #26, #33, #39, #46, #57, #94, #101),#14);

Опишем пол - IFCSLAB

BASESLAB.);
#18= IFCPRODUCTDEFINITIONSHAPE($,$,(#19));
#19= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#20));
#20= IFCEXTRUDEDAREASOLID(#21,#8,#22,100.);
#21= IFCRECTANGLEPROFILEDEF(. #17= IFCSLAB('abcdefghijklmnopqrs106',$,'slab',$,'',#13,#18,'',. AREA.,$,#23,1000.,1000.);
#22= IFCDIRECTION((0.,0.,1.));
#23= IFCAXIS2PLACEMENT2D(#24,#25);
#24= IFCCARTESIANPOINT((0.,0.));
#25= IFCDIRECTION((1.,0.));

Четыре стены

#26= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs107',$,'wall1',$,'',#13,#27,'');
#27= IFCPRODUCTDEFINITIONSHAPE($,$,(#28));
#28= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#29));
#29= IFCEXTRUDEDAREASOLID(#30,#32,#22,1000.);
#30= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,100.,1000.);
#31= IFCCARTESIANPOINT((500.,0.,100.));
#32= IFCAXIS2PLACEMENT3D(#31,$,$);

#33= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs108',$,'wall2',$,'',#13,#34,'');
#34= IFCPRODUCTDEFINITIONSHAPE($,$,(#35));
#35= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#36));
#36= IFCEXTRUDEDAREASOLID(#30,#38,#22,1000.);
#37= IFCCARTESIANPOINT((-500.,0.,100.));
#38= IFCAXIS2PLACEMENT3D(#37,$,$);

AREA.,$,#23,1000.,100.);
#44= IFCCARTESIANPOINT((0.,-500.,100.));
#45= IFCAXIS2PLACEMENT3D(#44,$,$); #39= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs110',$,'wall3',$,'',#13,#40,'');
#40= IFCPRODUCTDEFINITIONSHAPE($,$,(#41));
#41= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#42));
#42= IFCEXTRUDEDAREASOLID(#43,#45,#22,1000.);
#43= IFCRECTANGLEPROFILEDEF(.

AREA.,$,#23,1000.,100.);
#51= IFCCARTESIANPOINT((0.,500.,100.));
#52= IFCAXIS2PLACEMENT3D(#51,$,$); #46= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs109',$,'wall4',$,'',#13,#47,'');
#47= IFCPRODUCTDEFINITIONSHAPE($,$,(#48));
#48= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#49));
#49= IFCEXTRUDEDAREASOLID(#50,#52,#22,1000.);
#50= IFCRECTANGLEPROFILEDEF(.

Дверь

#57= IFCDOOR('abcdefghijklmnopqrs111',$,'door',$,'',#88,#86,'',$,$);
#86= IFCPRODUCTDEFINITIONSHAPE($,$,(#87));
#87= IFCSHAPEREPRESENTATION(#7,'Body','Brep',(#58));

#58= IFCFACETEDBREP(#59);
#59= IFCCLOSEDSHELL((#80, #81, #82, #83, #84, #85));

#60 = IFCCARTESIANPOINT((0.,0.,0.));
#61 = IFCCARTESIANPOINT((200.,0.,0.));
#62 = IFCCARTESIANPOINT((200.,200.,0.));
#63 = IFCCARTESIANPOINT((0.,200.,0.));
#64 = IFCCARTESIANPOINT((0.,0.,500.));
#65 = IFCCARTESIANPOINT((200.,0.,500.));
#66 = IFCCARTESIANPOINT((200.,200.,500.));
#67 = IFCCARTESIANPOINT((0.,200.,500.));

#68= IFCPOLYLOOP((#60, #61, #62, #63));
#69= IFCPOLYLOOP((#64, #65, #66, #67));
#70= IFCPOLYLOOP((#60, #61, #65, #64));
#71= IFCPOLYLOOP((#61, #62, #66, #65));
#72= IFCPOLYLOOP((#62, #63, #67, #66));
#73= IFCPOLYLOOP((#63, #60, #64, #67));

T.);
#75= IFCFACEOUTERBOUND(#69, . #74= IFCFACEOUTERBOUND(#68, . T.);
#77= IFCFACEOUTERBOUND(#71, . T.);
#76= IFCFACEOUTERBOUND(#70, . T.);
#79= IFCFACEOUTERBOUND(#73, . T.);
#78= IFCFACEOUTERBOUND(#72, . T.);

#80= IFCFACE((#74));
#81= IFCFACE((#75));
#82= IFCFACE((#76));
#83= IFCFACE((#77));
#84= IFCFACE((#78));
#85= IFCFACE((#79));

#88= IFCLOCALPLACEMENT($,#89);
#89= IFCAXIS2PLACEMENT3D(#90,$,$);
#90= IFCCARTESIANPOINT((-100.,400.,100.));

#91= IFCRELVOIDSELEMENT('abcdefghijklmnopqrs112',$,$,$,#46,#92);
#92= IFCOPENINGELEMENT('abcdefghijklmnopqrs113',$,$,$,'Opening',#88,#86,$);
#93= IFCRELFILLSELEMENT('abcdefghijklmnopqrs114',$,$,$,#92,#57);

Используя разные IFCLOCALPLACEMENT мы можем вставить одну и туже геометрию в разные места и для представления разных объектов — например можем использовать тот же IFCFACETEDBREP для окна. Для описания двери мы используем IFCFACETEDBREP и его используем для IFCOPENINGELEMENT в который вставленна наша дверь.

Окно

#94= IFCWINDOW('abcdefghijklmnopqrs115',$,$,$,$,#95,#86,$,$,$);
#95= IFCLOCALPLACEMENT($,#96);
#96= IFCAXIS2PLACEMENT3D(#97,$,$);
#97= IFCCARTESIANPOINT((-100.,-600.,400.));

#98= IFCRELVOIDSELEMENT('abcdefghijklmnopqrs116',$,$,$,#39,#99);
#99= IFCOPENINGELEMENT('abcdefghijklmnopqrs117',$,$,$,'Opening',#95,#86,$);
#100= IFCRELFILLSELEMENT('abcdefghijklmnopqrs118',$,$,$,#99,#94);

Крыша

FLAT_ROOF.);
#102= IFCSLAB('abcdefghijklmnopqrs120',$,'roof',$,'',#105,#18,'',. #101= IFCROOF('abcdefghijklmnopqrs119',$,$,$,$,#105,$,$,. ROOF.);
#103= IFCAXIS2PLACEMENT3D(#104,$,$);
#104= IFCCARTESIANPOINT((0.,0.,1100.));
#105= IFCLOCALPLACEMENT(#13,#103);
#106= IFCRELAGGREGATES('abcdefghijklmnopqrs121',$,$,$,#101,(#102));

готовый файл

Заключение

Теперь, мой дорогой читатель, ты можешь написать дом свой мечты. К сожалению я не расмотрел IfcMaterialDefinitionRepresentation который отвечат за стиль отображения объектов, не расмотрел IfcTopologyRepresentation — не очень понимаю для чего он служит и не знаю как его визуалезировать. Не расмотрел опции IFC и дополнительный набоы свойств. Но иначе это не было бы кратким введением.

В тексте спецификации встречаются примечания, которые не отраженны в EXPRESS-схеме, но при этом сильно влияют на обработку файла. Формат IFC содержит огромное количество объектов, которое становится лишь больше от версии к версии. И если в случае open source программ всегда есть возможность исправить обнаруженные ошибки, для проприетарных программ это приводит к невозможности полноценного использования формата IFC. По этому трудно реализовать этот формат, не прочитав внимательно всю документацию, но это врядли возможно одному человеку, по этому не существует программы — которая читает его абсолютно правильно, каждая имеет свои особенности.

Так же сейчас идёт работа над IFC Road, IFC Airport и IFC4precast (сборный железобетон). Формат IFC абсолютно не приспособлен для хранения информации раздела генплана, но в настоящее время идёт активная работа над этим разделом, эта работа должна быть закончена к концу Апреля 2020 и войти в состав IFC5. При этом IFC делает упор на описание внутренних структур объекта, а GML описывает его внешнее представление. В IFC4x2 появился IFC Bridge, для котрого придумали специальный геометрический объект — IfcSectionedSolidHorizontal

Последние изменения IFC сильно сближают его с GML, даже появился IfcCoordinateReferenceSystem — описание геодезической системы координат. В GML же, каждый геометрический объект — абсолютно независим. Но главным отличием IFC является возможномть ссылатся на одни и тежи объекты в разных местах — одна и таже точка, может быть использованна в описании геометрии стены и окна.

www.ibpsa.org/proceedings/BS1997/BS97_P125.pdf
2. Ссылки:
1. 0. standards.buildingsmart.org/documents/Implementation/ImplementationGuide_IFCHeaderData_Version_1. technical.buildingsmart.org/resources/ifcimplementationguidance/ifc-guid 2.pdf
3.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть