Updating to Version 21

The v21 release uses the IFC 4x3 ADD2 schema, which has been published as ISO 16739-1:2024. The APIs have remained stable, so aside from new definitions in ADD2, your existing code should not require modification.

The IFC mesher has been expanded to handle revolved-area solids, swept disk solids, and curve-bounded planes. In addtion, closed profiles with voids, composite profiles are now processed for extruded solids. Trimmed ellipses in composite curves and indexed poly curves are also now available for use in explicit profiles.

The meshes for extruded and swept solids are now broken into faces based on curve segments in their underlying profiles. Furthermore, the mesher has additional testing and healing for self-intersection on the curves used by profiles.

Polygonal bounded half-spaces is now supported as a boolean operator. Color information is now carried through boolean operations. Color and transparency is also now available for associated material and for type products.

We now create one mesh per repitem rather than one for each repitem/rep pair. Shared repitems is more common in IFC, while STEP usually shares representations. This significantly improves meshing speed for files with such sharing. Voids operations still create a mesh tied to a particular representation.

FaceBasedSurface and FacettedBreps were often used for tesselated models by older systems before IFC got explicit definitions. These have many tri or quad faces and now go through a simpler path than more complex surfaces, with large speed and memory improvements. Meshes created for an IfcConnectedFaceSet, not the open or closed shell subtype, are now marked as an open mesh.

The IFC Helper library has new project, unit, and measure functions for context information, recognizing making and making all units commonly used by IFC files, and working with IFC measure values.

Updating to Version 20

Your v19 code should work without change with v20, except as noted below. As always, header files have changed so you must completely recompile all code with the new headers.

The v20 release now uses the IFC 4x3 ADD1 schema. IFC 4x3 removed the following "standard case" subtypes, so code that used them should be changed to use the supertype. IfcWallStandardCase is still present.

IfcBeamStandardCase ->    IfcBeam
IfcColumnStandardCase ->  IfcColumn
IfcDoorStandardCase  ->   IfcDoor
IfcMemberStandardCase ->  IfcMember
IfcOpeningStandardCase -> IfcOpening
IfcPlateStandardCase ->   IfcPlate
IfcSlabElementedCase ->   IfcSlab
IfcSlabStandardCase ->    IfcSlab
IfcWallElementedCase ->   IfcWall
IfcWindowStandardCase ->  IfcWindow

The IfcDoorStyle, IfcProxy, and IfcWindowStyle classes were also removed by IFC4x3, but we have retained them for compatibility with previous editions.

The IFC mesher in v20 now calculates meshes for boolean results and products with voids. Boolean results and clipping results just representation items so they are handled the same as all other kinds of geometry.

Voids are defined by the product structure rather than within a representation, so you may need to adjust your code if you are just iterating over representation items. Calling ifcx_mesh_make_all() calculates everything, including voids. There is also a new overload of ifcx_mesh_make() that takes an IfcProduct and calculates the meshes and voids for the items associated with the product.

We have added new ifcx_asm functions which simplify working with the spatial structure of IFC files, and tracking the aggregates and contains relations, voids relations, and global xforms.

Updating to Version 19

The v19 release adds support for IFC bspline surfaces, other advanced geometry, and now builds meshes in the background using multiple threads for speed. API has been simplified, and can control when the background work must be completed. Class and function names have changed to accommodate things beyond meshing. Link libraries have changed slightly, as described in the setup notes, for new math utilities.

Functions start with ifcx_ with sub-names that group functions by subject matter: meshes (ifcx_mesh_*), styles (ifcx_style_*), transforms (ifcx_xform_*), and so on. Classes now start with Ifcx to more clearly distinguish from IFC data. The RoseMeshFacetSet has been renamed RoseMesh and a subtype called IfcxMesh is used, with extra functions to return the IFC source objects for faces and edges.

It is now easy to generate meshes for everything, and the mesher uses multiple threads to produce results faster. The "get_shell_item" functions are no longer needed because ifcx_mesh_make() works on all supported types.

// OLD CODE
loop over all renderable things {
   // call ifcmesh_make_shell on each item, possibly
   // looping over subitems with ifcmesh_get_shell_items
}

// NEW CODE
ifcx_mesh_make_all(design);  // does all in parallel

loop over all renderable things {
   // call ifcx_mesh_find to get mesh if one exists
}

Individual changes are listed below:

Old Definition New Definition Notes
#include <ifcmesh.h> #include <ifcx.h>
RoseMeshFacetSet RoseMesh Functions return IfcxMesh subclass.
rose_mesh_bounds() RoseMesh::applyMeshBounds() or
RoseMesh::applyFacetBounds()
Clear box before calling.
rose_mesh_update_bounds() Same as above Do not clear box before calling
rose_mesh_get_color() RoseMesh::getFaceColor() or
RoseMeshFace::getColor()
Integrated value into face.
rose_mesh_set_color() RoseMesh::setFaceColor() or
RoseMeshFace::setColor()
Integrated value into face.
ifcmesh_can_facet_item() ifcx_mesh_can_make() Boolean, no longer a code
ifcmesh_facet_item() ifcx_mesh_make()
ifcmesh_find_face() IfcxMesh::getFaceIndexFromIfc() Returns index, call getFace() or other function with the result
ifcmesh_find_shell() ifcx_mesh_find()
ifcmesh_get_ifc_face() IfcxMesh::getIfcFace()
ifcmesh_get_shell_item() N/A No longer needed
ifcmesh_get_shell_items() N/A No longer needed
ifcmesh_get_style() ifcx_style_get_list()
ifcmesh_get_surface_color() ifcx_style_get_color()
ifcmesh_make_shell() ifcx_mesh_make() Reverse argument order
ifcmesh_put_ifc_face() RoseMeshFace::setObject() Done automatically by mesh creation.
ifcmesh_resolve_styles() ifcx_style_tag()