diff --git a/src/Mod/PartDesign/App/FeatureGroove.cpp b/src/Mod/PartDesign/App/FeatureGroove.cpp index 006abdeeac..3cf3828027 100644 --- a/src/Mod/PartDesign/App/FeatureGroove.cpp +++ b/src/Mod/PartDesign/App/FeatureGroove.cpp @@ -34,6 +34,8 @@ # include # include # include +# include +# include #endif #include @@ -196,4 +198,40 @@ App::DocumentObjectExecReturn *Groove::execute(void) } } +bool Groove::suggestReversed(void) const +{ + // suggest a value for Reversed flag so that material is removed from the support + try { + Part::Part2DObject* sketch = getVerifiedSketch(); + std::vector wires = getSketchWires(); + TopoDS_Shape sketchshape = makeFace(wires); + + Base::Vector3f b = Base.getValue(); + Base::Vector3f v = Axis.getValue(); + + // get centre of gravity of the sketch face + GProp_GProps props; + BRepGProp::SurfaceProperties(sketchshape, props); + gp_Pnt cog = props.CentreOfMass(); + Base::Vector3f p_cog(cog.X(), cog.Y(), cog.Z()); + // get direction to cog from its projection on the revolve axis + Base::Vector3f perp_dir = p_cog - p_cog.Perpendicular(b, v); + // get cross product of projection direction with revolve axis direction + Base::Vector3f cross = v % perp_dir; + // get sketch vector pointing away from support material + Base::Placement SketchPos = sketch->Placement.getValue(); + Base::Rotation SketchOrientation = SketchPos.getRotation(); + Base::Vector3d SketchNormal(0,0,1); + SketchOrientation.multVec(SketchNormal,SketchNormal); + // simply convert double to float + Base::Vector3f norm(SketchNormal.x, SketchNormal.y, SketchNormal.z); + + // return true if the angle between norm and cross is acute + return norm * cross > 0.f; + } + catch (...) { + return false; + } +} + } diff --git a/src/Mod/PartDesign/App/FeatureGroove.h b/src/Mod/PartDesign/App/FeatureGroove.h index 7e637e607f..8fb2f2d994 100644 --- a/src/Mod/PartDesign/App/FeatureGroove.h +++ b/src/Mod/PartDesign/App/FeatureGroove.h @@ -62,6 +62,8 @@ public: return "PartDesignGui::ViewProviderGroove"; } //@} + + bool suggestReversed(void) const; }; } //namespace PartDesign