:orphan:


########################################
Industry Foundation Classes (IFC) Reader
########################################

.. rst-class:: format-title-block

+------------------------------------------------------------------------------+
|                        **Industry Foundation Classes**                       |
+-----------------------------------------+------------------------------------+
| **File Extension**                      | IFC, IFCZIP                        |
+-----------------------------------------+------------------------------------+
| **Supported Versions**                  | IFC2 up to 2.3.0.1, IFC4 up to 4.3 |
+-----------------------------------------+------------------------------------+
| **Platforms**                           | |wy| |ly| |my| |ay| |iy|           | 
+-----------------------------------------+------------------------------------+
| :ref:`ifc_tessellation`                 | |t_green| Supported                | 
+-----------------------------------------+------------------------------------+
| :ref:`ifc_brep`                         | |c_green| Supported                | 
+-----------------------------------------+------------------------------------+
| :ref:`ifc_pmi`                          | |c_grey| Partial                   | 
+-----------------------------------------+------------------------------------+

The IFC data model provides access to data used in the building and construction industry, and so some of the concepts like Assembly, B-rep and PMI are not exactly the same concepts as they are with our other formats. A file does not need to have a particular extension to be read correctly by HOOPS Exchange; however, the file extensions of IFC files that you can expect to be loaded by HOOPS Exchange are:

* `.IFC`
* `.IFCZIP`

How to Import From IFC 
=======================

To load an IFC file, use :cpp:func:`A3DAsmModelFileLoadFromFile`.
The :cpp:struct:`A3DParamsLoadData` structure is used to customize the loading behavior:

.. code-block:: c

   A3DAsmModelFile* pModelFile = 0;

   A3DRWParamsLoadData sReadParam;
   A3D_INITIALIZE_DATA(A3DRWParamsLoadData, sReadParam);
   sReadParam.m_sGeneral.m_bReadSolids = true;

   // ... set other A3DRWParamsLoadData fields as necessary

   A3DAsmModelFileLoadFromFile("path/to/file.ifc", &sReadParam, &pModelFile);

See :doc:`/guide/basic_operations/load_model` for more about loading model files.

.. _ifc_tessellation: 

Tessellation
============

This visualization data for this format is generated by the HOOPS Exchange tessellation engine.

.. _ifc_brep: 

B-rep
=====

The B-rep definition within IFC is based upon STEP.
HOOPS Exchange supports specific IFC B-rep definitions by creating a tessellated solid.

IFC-Specific B-rep
==================

HOOPS Exchange can create primitives by performing simple geometric operations on 2D entities.

The list of geometric objects available in IFC is:

* `IFCBOOLEANCLIPPINGRESULT`
* `IFCEXTRUDEDAREASOLID`
* `IFCOPENINGELEMENT`
* `IFCSURFACECURVESWEPTAREASOLID`
* `IFCSWEPTDISKSOLID`

The list of surface types available in IFC is:

* `IFCSURFACEOFLINEAREXTRUSION`
* `IFCSURFACEOFREVOLUTION`

The list of curve types available in IFC is:

* `IFCBEZIERCURVE`
* `IFCBSPLINECURVE`
* `IFCCIRCLE`
* `IFCCOMPOSITECURVE`
* `IFCELLIPSE`
* `IFCPOLYLINE`

Please note that for performance reasons, the level of detail of the generated tessellation is limited to a low setting.

.. _ifc_pmi: 

PMI
===

IFC has a concept which is close to PMI called *Notes* and these are supported by HOOPS Exchange.
The names of the Notes in IFC are:

* `IFCCANNOTATIONTEXTOCCURENCE`
* `IFCTEXTLITERALWITHEXTENT`
* `IFCTEXTLITERAL`

Assembly
========

The full assembly tree definition is supported. This includes maintaining any hidden attributes which may be set.
Incremental load is not supported by our IFC reader.

Support for IFC 4 Types
=======================

By the version 2019, IFC reader supports the following B-Rep and Tessellation types:

* `IFCADVANCEDBREPWITHVOIDS`
* `IFCADVANCEDBREP`
* `IFCINDEXEDPOLYCURVE` (from IFC 4 Addendum 2)
* `IFCPOLYGONALFACE` (from IFC 4 Addendum 2)
* `IFCTESSELLATEDFACESET`

IFC Relationship
================

IFC relationship can be read from an input file.
Our support of this feature is currently limited to reading the related and relating elements for the following relations:

* `IFCRELADHERESTOELEMENT`
* `IFCRELAGGREGATES`
* `IFCRELCONNECTSPATHELEMENTS`
* `IFCRELCONTAINEDINSPATIALSTRUCTURE`
* `IFCRELFILLSELEMENT`
* `IFCRELSPACEBOUNDARY`
* `IFCRELVOIDSELEMENT`
* `IFCRELASSIGNSTOGROUP`

See the :doc:`/guide/bim` in the programming guide for more information.

IFCXML
======

BIM Data can be exported to IFCXML using `A3DAsmModelFileExportToIfcXMLFile()` from the *A3DSDKBim.h* header.

Views
=====

Views are not a concept supported by IFC.

Limitations
===========

Our IFC reader doesn't support double precision.
However it is still possible to improve it by declaring a "TF_IFC_REPOSITION" environment variable for relocating models near the origin.
