From 42b512960b32c39427ed4c395b5688e216625bce Mon Sep 17 00:00:00 2001 From: Ken Arroyo Ohori Date: Tue, 7 Feb 2017 20:25:04 -0600 Subject: [PATCH] Filling in most of the placement code. To check. --- .../kernels/cgal/CgalConversionFunctions.cpp | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp b/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp index 3320c606e0..94f694dcdd 100644 --- a/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp +++ b/src/ifcgeom/kernels/cgal/CgalConversionFunctions.cpp @@ -51,24 +51,25 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcDirection* l, cgal_directi 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()); -// } -// + cgal_point_t o; + cgal_direction_t axis = new Kernel::Vector_3(0,0,1); + cgal_direction_t refDirection = new Kernel::Vector_3(1,0,0); // TODO: Put identity for now. Check? + IfcGeom::CgalKernel::convert(l->Location(),o); + bool hasRef = l->hasRefDirection(); + if ( l->hasAxis() ) IfcGeom::CgalKernel::convert(l->Axis(),axis); + if ( hasRef ) IfcGeom::CgalKernel::convert(l->RefDirection(),refDirection); + + // TODO: From Thomas' email. Should be checked. + trsf = new Kernel::Aff_transformation_3(refDirection->cartesian(0), axis->cartesian(0)*refDirection->cartesian(0), axis->cartesian(0), o->cartesian(0), + refDirection->cartesian(1), axis->cartesian(1)*refDirection->cartesian(1), axis->cartesian(1), o->cartesian(1), + refDirection->cartesian(2), axis->cartesian(2)*refDirection->cartesian(2), axis->cartesian(2), o->cartesian(2)); + // CACHE(IfcAxis2Placement3D,l,trsf) return true; } bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcObjectPlacement* l, cgal_placement_t& trsf) { + // TODO: These macros don't work for the CGAL types. Need to check why. // IN_CACHE(IfcObjectPlacement,l,cgal_placement_t,trsf) if ( ! l->is(IfcSchema::Type::IfcLocalPlacement) ) { Logger::Message(Logger::LOG_ERROR, "Unsupported IfcObjectPlacement:", l->entity); @@ -80,7 +81,13 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcObjectPlacement* l, cgal_p 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? + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + std::cout << "trsf " << trsf->m(i, j) << std::endl; + } + } +// std::cout << "trsf2" << trsf2 << std::endl; + *trsf = *trsf * *trsf2; // TODO: I think it's fine, but maybe should it be the other way around? } if ( current->hasPlacementRelTo() ) { IfcSchema::IfcObjectPlacement* relto = current->PlacementRelTo();