IFC SDK 入门

BIM 套件最近新增了 IFC SDK,支持读取和渲染 IFC 2x3 文件、导航已加载的 IFC 模型实体以及查看只读实体属性。本文介绍了如何开始使用该 SDK。

IFC SDK 的初始版本基于当前可用的 ODA SDK 19.12 版。

初始化 ODA IFC SDK

要初始化 IFC SDK 模块,请调用在 IfcCore.h 头文件中声明的 OdResult odIfcInitialize(bool bInitIfcGeomResource /*= true*/) 函数。

渲染几何实体并非总是必需的(例如,可能只需要遍历 IfcModel),因此提供了参数 bInitIfcGeomResource 以避免几何模块初始化。如果使用预定义参数值调用该函数,则会加载 IfcCore.dll 和 IfcGeom.dll 模块。IfcCore 初始化还会加载 Spf.tx,其中包含用于与 STEP 物理文件进行低级、独立于对象模型的工作所需的例程和基类。

读取 .ifc 文件

要读取 .ifc 文件内容,应调用 OdIfcHostAppServices::readFile()。该方法返回一个 OdIfcFile 类实例的指针,该实例包含已加载 IFC 实体(IFC 模型)的数据库。OdIfcFile 类在 OdIfc 命名空间内的“IfcFile.h”头文件中声明。

可以通过调用 OdSpf::OdSpfHeaderSectionPtr OdIfcFile::getHeaderSection() 方法访问 .ifc 文件的头部分容器。头部分包含有关 .ifc 文件中模型的信息字段、模型的作者/所有者等。有关文件数据部分模式的信息也保存在头部分中:

OdIfc::OdIfcFilePtr pIfcFile = svcs.readFile(pBuffer);
OdDAI::OdSpfHeaderSectionPtr pHeader = pIfcFile >getHeaderSection(fileName);
OdDAI::OdSpfFileSchemaPtr pSchema = pHeader >getEntityByType(headerFileSchema);
OdString dataSectionSchema = pSchema->at(0);

要获取 OdIfcFile 的主实体容器,应调用其方法 OdIfcModelPtr OdIfcFile::getModel()。目前 ODA IFC SDK 仅支持 Ifc2x3 模式,因此在尝试加载不支持的文件时,getModel() 将返回 NULL。

OdIfcModelPtr pModel = pIfcFile->getModel();

首先应确定一组用于生成几何体的 IfcGeometricalContexts。让我们在已加载的 OdIfcModel 中,沿着派生自 Ifc2x3 Express Schema 实体类型 IfcGeometricRepresentationContext 的实体实例创建一个迭代器:


OdDAIObjectIds ids = pModel->getEntityExtent(“IfcGeometricRepresentationContext”);

OdIfcHandles selContexts;
for (OdDAIObjectIds::iterator it = ids.begin(), end = ids.end(); it != end; ++it){
  OdIfc::OdIfcEntityPtr pInst = it->OpenObject();
  OdAnsiString strContextType;
  if (pInst->getAttr("ContextType") >> strContextType)
  {

如果从实体实例中提取的名为“ContextType”的属性值已成功分配给 strContextType(类型一致),则继续。我们需要找到所需类型的所有上下文和子上下文:“Model”用于上下文,“Body”用于包含模型元素 3D 几何表示的子上下文。

            if (strContextType.compare("Model") == 0)
            {
              selContexts.append(*it);
            }

            OdDAIObjectIds hasSubContexts;
            if (pInst->getAttr("HasSubContexts") >> hasSubContexts)
            {
              for (OdDAIObjectIds::iterator itSub = hasSubContexts.begin(), endSub = hasSubContexts.end();
                itSub != endSub; ++itSub)
              {
                OdIfc::OdIfcEntityPtr pSubCtx = itSub->openObject();
                OdAnsiString strContextIdentifier;
                if (pSubCtx->getAttr("ContextIdentifier") >> strContextIdentifier &&
                  strContextIdentifier == "Body")
                {
                  selContexts.append(*itSub);
                }
              }
            }
          }

构建和渲染几何实体

填充 IfcGeometricRepresentationContext/SubContext 句柄数组以构建几何体。“Model”/“Body”上下文/子上下文足以获取 3D 实体;这些名称由 IFC 规范预定义,我们不需要其他类型的 GeometricContexts/SubContexts(它们仍然可以保留模型可绘制项的示意表示,或其它内容)。

pModel->setContextSelection(selContexts);

构建用于渲染的几何实体。此方法为已加载的 IFC 模型组合 OdGiDrawable 实体:

pModel->composeEntities ();

如果 OdIfcFile::setGeomResource() 的结果是 eOk,则几何体已成功生成,并且可以使用 GsDevice 进行渲染;用于绘制的根实体是 OdIfcProject:

OdIfcObjectId idProject = pIfcFile->getProjectId();

OdGiContextForIfcDatabasePtr pIfcContext = OdGiContextForIfcDatabase::createObject();
pIfcContext->setDatabase(pIfcFile);
pIfcContext->enableGsModel(true);

OdGsDevicePtr pDevice = …;

OdGsDevicePtr pIfcDevice = OdIfcGsManager::setupActiveLayoutViews(idProject, pDevice .get(), pIfcContext);
OdGsView* pView = pDevice->viewAt(0);
pView->setMode(...);

处理渲染:

pDevice->update(OdGsView::kFlatShaded);

通过调用 OdResult odIfcUninitialize() 来取消初始化模块。

更多信息

详情和实时演示:IFC SDK
下载试用版:即将推出

使用 ODA BimIfc SDK 的扩展示例可以在 Visualize/Examples/Ifc2Visualize 中找到,这是一个使用 ODA Visualize SDK 进行几何渲染的示例;在 Ifc/Exports/Ifc2Dwg 中,这是一个将加载的 IFC 文件中的几何体导出为 .dwg 图纸中的多面网格集的示例。还提供了两个额外的简单示例应用程序:ExIfcReadFile,仅用于读取所需的 Ifc2x3 文件;以及 ExIfcDump,用于通过遍历目录结构并从加载的 Ifc 模型中提取信息来收集实体统计数据。

如果您已经在使用或评估 IFC SDK,示例位于 Visualize/Examples 安装文件夹中:

  • Ifc2Visualize — 使用 ODA Visualize SDK 显示 .ifc 文件的几何渲染。
  • Ifc/Exports/Ifc2Dwg — 将加载的 .ifc 文件中的几何体导出为 .dwg 图纸中的多面网格集。
  • ExIfcReadFile — 读取 Ifc2x3 文件。
  • ExIfcDump — 通过遍历目录结构并从加载的 IFC 模型中提取信息来收集实体统计数据。
  • ExIfcModelFiller – 创建一个包含几何实体的有效 IFC 模型。
  • ExIfcWriteFile – 加载文件并将其重新保存为不同的文件。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用