c++ifcifc-open-shell

Absolute wall positions in IFC


Because I want to associate windows with walls, I am trying to find the endpoints of a wall using IFCOpenShell.

#include <ifcgeom/IfcGeom.h>
#include <ifcparse/IfcFile.h>

using namespace Ifc2x3;
using namespace IfcSchema;
using namespace IfcParse;
using namespace IfcUtil;
using namespace IfcGeom;

std::string tostr(gp_XYZ a) {
  std::stringstream ss;
  ss << a.X() << "," << a.Y() << "," << a.Z();
  return ss.str();
}

int main(int argc, char** argv) {
  IfcFile file;
  if (!file.Init(argc > 1 ? argv[1] : "windows connected to walls Archicad.ifc")) abort();
  Kernel k;

  gp_Pnt start;
  gp_Pnt end;

  auto list = file.entitiesByType<IfcWall>();
  for ( auto it = list->begin(); it != list->end(); ++it) {
    auto w1 = *it;
    std::cout << "wall " << w1->entity->id() << std::endl;
    bool suc = k.find_wall_end_points(w1, start, end);

    std::cout << suc << std::endl;
    std::cout << tostr(start.XYZ()) << std::endl;
    std::cout << tostr(end.XYZ()) << std::endl;
  }
}

This currently yields 10.1596,0,0 and 9.08038,0,0 as endpoints for two walls, and 0 as the starting point for both. This means they are parallel. But when I open the IFC file in Archicad, they are orthogonal. There is even an IFC tag in the file specifying that one wall connects to the other ATSTART/ATEND. How can I derive the correct coordinates?

Compilation command line: g++ -I/usr/include/oce wallpoints.cpp -l IfcGeom -l IfcParse $(for i in $(cd /usr/lib/x86_64-linux-gnu/; ls libTK*.so | cut -d. -f1 | cut -c4-); do echo "-l $i"; done) $(icu-config --ldflags) -ggdb3

IFC file: https://hushfile.it/592c22c69af2a#AwrpRI2O3ecDuAmP_pIjNmCAV3BWvwr30tfrazqJ


Solution

  • As stated in the standard, the placement is relative, so I have to multiply this with a couple of matrices.