From 96e9c8ecc160d26138c1bd13a428e8b146b8ced4 Mon Sep 17 00:00:00 2001 From: Ken Arroyo Ohori Date: Tue, 7 Feb 2017 19:51:16 -0600 Subject: [PATCH] Skeleton for IfcObjectPlacement and IfcAxis2Placement3D --- .../kernels/cgal/CgalConversionFunctions.cpp | 43 +++++++++++++++++++ src/ifcgeom/kernels/cgal/CgalEntityMapping.h | 3 ++ src/ifcgeom/kernels/cgal/CgalKernel.cpp | 4 +- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp b/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp index 9e66c5def6..3320c606e0 100644 --- a/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp +++ b/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp @@ -49,3 +49,46 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcDirection* l, cgal_directi return true; } +bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcAxis2Placement3D* l, cgal_placement_t& trsf) { +// IN_CACHE(IfcAxis2Placement3D,l,gp_Trsf,trsf) +// cgal_point_t o;cgal_direction_t axis = new Kernel::Vector_3(0,0,1);cgal_direction_t refDirection; +// IfcGeom::OpenCascadeKernel::convert(l->Location(),o); +// bool hasRef = l->hasRefDirection(); +// if ( l->hasAxis() ) IfcGeom::OpenCascadeKernel::convert(l->Axis(),axis); +// if ( hasRef ) IfcGeom::OpenCascadeKernel::convert(l->RefDirection(),refDirection); +// gp_Ax3 ax3; +// if ( hasRef ) ax3 = gp_Ax3(o,axis,refDirection); +// else ax3 = gp_Ax3(o,axis); +// +// if (!axis_equal(ax3, (gp_Ax3) gp::XOY(), getValue(GV_PRECISION))) { +// trsf.SetTransformation(ax3, gp::XOY()); +// } +// +// CACHE(IfcAxis2Placement3D,l,trsf) + return true; +} + +bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcObjectPlacement* l, cgal_placement_t& trsf) { +// IN_CACHE(IfcObjectPlacement,l,cgal_placement_t,trsf) + if ( ! l->is(IfcSchema::Type::IfcLocalPlacement) ) { + Logger::Message(Logger::LOG_ERROR, "Unsupported IfcObjectPlacement:", l->entity); + return false; + } + IfcSchema::IfcLocalPlacement* current = (IfcSchema::IfcLocalPlacement*)l; + for (;;) { + cgal_placement_t trsf2; + IfcSchema::IfcAxis2Placement* relplacement = current->RelativePlacement(); + if ( relplacement->is(IfcSchema::Type::IfcAxis2Placement3D) ) { + IfcGeom::CgalKernel::convert((IfcSchema::IfcAxis2Placement3D*)relplacement,trsf2); + *trsf = *trsf * *trsf2; // TODO: Or should it be the other way around? + } + if ( current->hasPlacementRelTo() ) { + IfcSchema::IfcObjectPlacement* relto = current->PlacementRelTo(); + if ( relto->is(IfcSchema::Type::IfcLocalPlacement) ) + current = (IfcSchema::IfcLocalPlacement*)current->PlacementRelTo(); + else break; + } else break; + } +// CACHE(IfcObjectPlacement,l,trsf) + return true; +} diff --git a/src/ifcgeom/kernels/cgal/CgalEntityMapping.h b/src/ifcgeom/kernels/cgal/CgalEntityMapping.h index d8e39626d2..a3c68c56ea 100644 --- a/src/ifcgeom/kernels/cgal/CgalEntityMapping.h +++ b/src/ifcgeom/kernels/cgal/CgalEntityMapping.h @@ -44,3 +44,6 @@ WIRE(IfcPolyLoop); CLASS(IfcCartesianPoint,cgal_point_t); CLASS(IfcDirection,cgal_direction_t); +//CLASS(IfcAxis2Placement2D,cgal_placement_t); +CLASS(IfcAxis2Placement3D,cgal_placement_t); +CLASS(IfcObjectPlacement,cgal_placement_t); diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index f4f830cbee..73f9bd761e 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -94,7 +94,7 @@ IfcGeom::NativeElement* IfcGeom::CgalKernel::create_brep_for_representat cgal_placement_t trsf; try { - // convert(product->ObjectPlacement(), trsf); + convert(product->ObjectPlacement(), trsf); } catch (...) {} // Does the IfcElement have any IfcOpenings? @@ -146,7 +146,7 @@ IfcGeom::NativeElement* IfcGeom::CgalKernel::create_brep_for_processed_r cgal_placement_t trsf; try { - // convert(product->ObjectPlacement(), trsf); + convert(product->ObjectPlacement(), trsf); } catch (...) {} std::string context_string = "";