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.

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

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
Clear box before calling.
rose_mesh_update_bounds() Same as above Do not clear box before calling
rose_mesh_get_color() RoseMesh::getFaceColor() or
Integrated value into face.
rose_mesh_set_color() RoseMesh::setFaceColor() or
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()