From 41f1d66feeae2971075401f695b03622eddf81f5 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 22 Jul 2024 04:33:27 +0200 Subject: [PATCH] Fix 2d transform op + fixed ref column order #5048 --- .../IfcCartesianTransformationOperator2D.cpp | 8 ++++++++ .../mapping/IfcFixedReferenceSweptAreaSolid.cpp | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/ifcgeom/mapping/IfcCartesianTransformationOperator2D.cpp b/src/ifcgeom/mapping/IfcCartesianTransformationOperator2D.cpp index 70eedc7988..34d31b0903 100644 --- a/src/ifcgeom/mapping/IfcCartesianTransformationOperator2D.cpp +++ b/src/ifcgeom/mapping/IfcCartesianTransformationOperator2D.cpp @@ -32,10 +32,18 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcCartesianTransformationOpera if (inst->Axis1()) { taxonomy::direction3::ptr ax1 = taxonomy::cast(map(inst->Axis1())); axis1 << *ax1->components_, 0.0; + if (!inst->Axis2()) { + // orthogonal complement + axis2 << -axis1(1), axis1(0), 0., 0.; + } } if (inst->Axis2()) { taxonomy::direction3::ptr ax2 = taxonomy::cast(map(inst->Axis2())); axis2 << *ax2->components_, 0.0; + if (!inst->Axis2()) { + // orthogonal complement + axis1 << -axis2(1), axis2(0), 0., 0.; + } } double scale1, scale2; diff --git a/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp b/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp index 4b1e2461f4..7267f61b2a 100644 --- a/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp +++ b/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp @@ -65,7 +65,8 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid num_steps = (size_t) std::ceil(param); } for (size_t i = 0; i <= num_steps; ++i) { - auto m4 = pwf->evaluate(start + curve_length / num_steps * i); + auto distalong = start + curve_length / num_steps * i; + auto m4 = pwf->evaluate(distalong); /* std::stringstream ss; @@ -96,10 +97,19 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid proj.normalize(); auto ref = proj.cross(tangent); - m4b.col(0).head<3>() = ref; - m4b.col(1).head<3>() = proj; + m4b.col(0).head<3>() = proj; + m4b.col(1).head<3>() = ref; m4b.col(2).head<3>() = tangent; m4b.col(3).head<3>() = pos; + + /* + Eigen::JacobiSVD svd(m4b); + auto condition_number = svd.singularValues()(0) + / svd.singularValues()(svd.singularValues().size() - 1); + if (condition_number > 1.e10) { + Logger::Error("Non-invertible matrix at " + std::to_string(distalong) + " conversion will likely fail."); + } + */ } // @todo taxonomy::clone() does not actually clone. That's really confusing.