diff --git a/pixi.toml b/pixi.toml index 61e0bafd95..b229951ca9 100644 --- a/pixi.toml +++ b/pixi.toml @@ -48,7 +48,8 @@ build-release = { cmd = ["cmake", "--build", "build/win-release", "--config", "R [feature.dev.target.win-64.tasks] configure-debug = { cmd = ["cmake", "--preset", "win-debug", "-B", "build/win-debug", "cmake"], description = "Configure the project", depends-on=["init-submodules"], outputs=["$PIXI_PROJECT_ROOT/build/win-debug/CMakeCache.txt"] } build-debug = { cmd = ["cmake", "--build", "build/win-debug", "--config", "Debug"], description = "Build the project" } -install-debug = { cmd = ["cmake", "--install", "build/win-debug", "--config", "Debug"], description = "Install the project" } + +install-debug = { cmd = ["cmake", "--install", "build/win-debug", "--config", "Debug"], description = "Install the project" } # Optionally Install files to your desired env using --prefix vsdebug = { cmd = ["python"], description = "Run a python script with vs debugger attached" } diff --git a/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp b/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp index cbccc69215..c6992c3957 100644 --- a/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp +++ b/src/ifcgeom/mapping/IfcFixedReferenceSweptAreaSolid.cpp @@ -24,17 +24,6 @@ using namespace ifcopenshell::geometry; #ifdef SCHEMA_HAS_IfcFixedReferenceSweptAreaSolid -namespace { -// Helper function to check if an IFC instance has alignment elements -bool has_alignment_elements(const IfcSchema::IfcFixedReferenceSweptAreaSolid* inst) { - if (inst->Directrix()->declaration().name() == "IfcGradientCurve") { - return true; - } else { - return false; - } -} -} // namespace - taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid* inst) { auto dir = map(inst->Directrix()); auto ref = taxonomy::cast(map(inst->FixedReference())); @@ -44,34 +33,33 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid // @todo intialize as default loft->axis = nullptr; // Check if this instance has alignment elements - if (has_alignment_elements(inst)) { - // @todo currently only the case is handled where directrix returns a piecewise_function - if (auto fn = taxonomy::dcast(dir)) { - function_item_evaluator evaluator(settings_, fn); - double start = 0; - double end = fn->length(); + // @todo currently only the case is handled where directrix returns a piecewise_function + if (auto fn = std::dynamic_pointer_cast(dir)) { + function_item_evaluator evaluator(settings_, fn); + double start = 0; + double end = fn->length(); #ifdef SCHEMA_HAS_IfcDirectrixCurveSweptAreaSolid - // IfcDirectrixCurveSweptAreaSolid introduced in 4.3 changed attribute type - // from optional IfcParamValue to optional IfcCurveMeasureSelect. - // Invocation of mapping on pre-4.3 models can never result in a piecewise_function. - if (inst->StartParam() && inst->StartParam()->as()) { - double s = *inst->StartParam()->as(); - if (s > start) { - start = s; - } + // IfcDirectrixCurveSweptAreaSolid introduced in 4.3 changed attribute type + // from optional IfcParamValue to optional IfcCurveMeasureSelect. + // Invocation of mapping on pre-4.3 models can never result in a piecewise_function. + if (inst->StartParam() && inst->StartParam()->as()) { + double s = *inst->StartParam()->as(); + if (s > start) { + start = s; } - if (inst->EndParam() && inst->EndParam()->as()) { - double e = *inst->EndParam()->as(); - if (e < end) { - end = e; - } + } + if (inst->EndParam() && inst->EndParam()->as()) { + double e = *inst->EndParam()->as(); + if (e < end) { + end = e; } + } #endif - auto evaluation_points = evaluator.evaluation_points(); - for (const auto& dist_along : evaluation_points) { - auto m4 = evaluator.evaluate(dist_along); + auto evaluation_points = evaluator.evaluation_points(); + for (const auto& dist_along : evaluation_points) { + auto m4 = evaluator.evaluate(dist_along); - /* + /* std::stringstream ss; ss << m4; auto s = ss.str(); @@ -79,33 +67,33 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid std::wcout << "determinant: " << m4.determinant() << std::endl; */ - Eigen::Matrix4d m4b = Eigen::Matrix4d::Identity(); - bool is_directrix_derived = false; + Eigen::Matrix4d m4b = Eigen::Matrix4d::Identity(); + bool is_directrix_derived = false; #ifdef SCHEMA_HAS_IfcDirectrixDerivedReferenceSweptAreaSolid - if (inst->as()) { - is_directrix_derived = true; - } + if (inst->as()) { + is_directrix_derived = true; + } #endif - auto pos = m4.col(3).head<3>(); + auto pos = m4.col(3).head<3>(); - if (is_directrix_derived) { - m4b.col(0).head<3>() = m4.col(1).head<3>(); - m4b.col(1).head<3>() = m4.col(0).head<3>().cross(m4.col(1).head<3>()); - m4b.col(2).head<3>() = m4.col(0).head<3>(); - m4b.col(3).head<3>() = pos; - } else { - Eigen::Vector3d tangent = m4.col(0).head<3>().normalized(); - Eigen::Vector3d proj = (ref->components() - tangent * tangent.dot(ref->components())); - proj.normalize(); - auto ref = proj.cross(tangent); + if (is_directrix_derived) { + m4b.col(0).head<3>() = m4.col(1).head<3>(); + m4b.col(1).head<3>() = m4.col(0).head<3>().cross(m4.col(1).head<3>()); + m4b.col(2).head<3>() = m4.col(0).head<3>(); + m4b.col(3).head<3>() = pos; + } else { + Eigen::Vector3d tangent = m4.col(0).head<3>().normalized(); + Eigen::Vector3d proj = (ref->components() - tangent * tangent.dot(ref->components())); + proj.normalize(); + auto ref = proj.cross(tangent); - m4b.col(0).head<3>() = proj; - m4b.col(1).head<3>() = ref; - m4b.col(2).head<3>() = tangent; - m4b.col(3).head<3>() = pos; + 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); @@ -113,18 +101,17 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcFixedReferenceSweptAreaSolid 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. - // loft->children.push_back(taxonomy::clone(profile)); - loft->children.push_back(taxonomy::face::ptr(profile->clone_())); - loft->children.back()->matrix = taxonomy::make(); + // @todo taxonomy::clone() does not actually clone. That's really confusing. + // loft->children.push_back(taxonomy::clone(profile)); + loft->children.push_back(taxonomy::face::ptr(profile->clone_())); + loft->children.back()->matrix = taxonomy::make(); - if (profile->matrix) { - loft->children.back()->matrix->components() = (m4b * profile->matrix->ccomponents()).eval(); - } else { - loft->children.back()->matrix->components() = m4b; - } + if (profile->matrix) { + loft->children.back()->matrix->components() = (m4b * profile->matrix->ccomponents()).eval(); + } else { + loft->children.back()->matrix->components() = m4b; } } } else {