diff --git a/src/Mod/PartDesign/App/FeatureHole.cpp b/src/Mod/PartDesign/App/FeatureHole.cpp index a1522d51ec..086c408c99 100644 --- a/src/Mod/PartDesign/App/FeatureHole.cpp +++ b/src/Mod/PartDesign/App/FeatureHole.cpp @@ -1938,13 +1938,7 @@ App::DocumentObjectExecReturn* Hole::execute(void) helix.Move(loc1); // rotate the helix so that it is pointing in the zdir. - double angle = acos(dir_axis1 * zDir); - if (abs(angle) > Precision::Confusion()) { - gp_Dir rotAxis = dir_axis1 ^ zDir; - mov.SetRotation(gp_Ax1(origo, rotAxis), angle); - TopLoc_Location loc2(mov); - helix.Move(loc2); - } + rotateToNormal(dir_axis1, zDir, helix); // create the pipe shell BRepOffsetAPI_MakePipeShell mkPS(TopoDS::Wire(helix)); @@ -2071,6 +2065,41 @@ App::DocumentObjectExecReturn* Hole::execute(void) } } +void Hole::rotateToNormal(const gp_Dir& helixAxis, const gp_Dir& normalAxis, TopoDS_Shape& helixShape) +{ + auto getRotationAxis = [](const gp_Dir& dir1, const gp_Dir& dir2, gp_Dir& dir3, double& angle) { + if (dir1.IsEqual(dir2, Precision::Angular())) + return false; + + angle = acos(dir1 * dir2); + if (dir1.IsOpposite(dir2, Precision::Angular())) { + // Create a vector that is not parallel to dir1 + gp_XYZ xyz(dir1.XYZ()); + if (fabs(xyz.X()) <= fabs(xyz.Y()) && fabs(xyz.X()) <= fabs(xyz.Z())) + xyz.SetX(1.0); + else if (fabs(xyz.Y()) <= fabs(xyz.X()) && fabs(xyz.Y()) <= fabs(xyz.Z())) + xyz.SetY(1.0); + else + xyz.SetZ(1.0); + dir3 = dir1.Crossed(gp_Dir(xyz)); + } + else { + dir3 = dir1.Crossed(dir2); + } + return true; + }; + // rotate the helixAxis so that it is pointing in the normalAxis. + double angle; + gp_Dir rotAxis; + if (getRotationAxis(helixAxis, normalAxis, rotAxis, angle)) { + gp_Pnt origo(0.0, 0.0, 0.0); + gp_Trsf mov = helixShape.Location().Transformation(); + mov.SetRotation(gp_Ax1(origo, rotAxis), angle); + TopLoc_Location loc2(mov); + helixShape.Move(loc2); + } +} + void Hole::addCutType(const CutDimensionSet& dimensions) { const CutDimensionSet::ThreadType thread = dimensions.thread_type; diff --git a/src/Mod/PartDesign/App/FeatureHole.h b/src/Mod/PartDesign/App/FeatureHole.h index 1e556d004f..02d84c5c71 100644 --- a/src/Mod/PartDesign/App/FeatureHole.h +++ b/src/Mod/PartDesign/App/FeatureHole.h @@ -219,6 +219,7 @@ private: double getThreadClassClearance(); double getThreadRunout(int mode = 1); double getThreadPitch(); + void rotateToNormal(const gp_Dir& helixAxis, const gp_Dir& normalAxis, TopoDS_Shape& helixShape); // helpers for nlohmann json friend void from_json(const nlohmann::json &j, CounterBoreDimension &t);