From 201026818789a5bf6790ca7237853f9e97fb91fa Mon Sep 17 00:00:00 2001 From: Florian Foinant-Willig Date: Sat, 28 Oct 2023 15:38:12 +0200 Subject: [PATCH] PartDesign_Pad: add an up to shape mode --- src/Mod/PartDesign/App/FeatureExtrude.cpp | 5 +++- src/Mod/PartDesign/App/FeatureExtrude.h | 2 +- src/Mod/PartDesign/App/FeaturePad.cpp | 34 +++++++++++++++-------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/Mod/PartDesign/App/FeatureExtrude.cpp b/src/Mod/PartDesign/App/FeatureExtrude.cpp index 54c5eaa37c..6e971d9c7a 100644 --- a/src/Mod/PartDesign/App/FeatureExtrude.cpp +++ b/src/Mod/PartDesign/App/FeatureExtrude.cpp @@ -194,7 +194,7 @@ void FeatureExtrude::generatePrism(TopoDS_Shape& prism, const TopoDS_Shape& baseshape, const TopoDS_Shape& profileshape, const TopoDS_Face& supportface, - const TopoDS_Face& uptoface, + const TopoDS_Shape& uptoface, const gp_Dir& direction, PrismMode Mode, Standard_Boolean Modify) @@ -335,6 +335,9 @@ void FeatureExtrude::updateProperties(const std::string &method) isTaper2Visible = true; isReversedEnabled = true; } + else if (method == "UpToShape") { + isReversedEnabled = true; + } Length.setReadOnly(!isLengthEnabled); AlongSketchNormal.setReadOnly(!isLengthEnabled); diff --git a/src/Mod/PartDesign/App/FeatureExtrude.h b/src/Mod/PartDesign/App/FeatureExtrude.h index c155f9935b..2bcdeb6832 100644 --- a/src/Mod/PartDesign/App/FeatureExtrude.h +++ b/src/Mod/PartDesign/App/FeatureExtrude.h @@ -94,7 +94,7 @@ protected: const TopoDS_Shape& baseshape, const TopoDS_Shape& profileshape, const TopoDS_Face& sketchface, - const TopoDS_Face& uptoface, + const TopoDS_Shape& uptoface, const gp_Dir& direction, PrismMode Mode, Standard_Boolean Modify); diff --git a/src/Mod/PartDesign/App/FeaturePad.cpp b/src/Mod/PartDesign/App/FeaturePad.cpp index 761c5fd965..3e22e81077 100644 --- a/src/Mod/PartDesign/App/FeaturePad.cpp +++ b/src/Mod/PartDesign/App/FeaturePad.cpp @@ -38,7 +38,7 @@ using namespace PartDesign; -const char* Pad::TypeEnums[]= {"Length", "UpToLast", "UpToFirst", "UpToFace", "TwoLengths", nullptr}; +const char* Pad::TypeEnums[]= {"Length", "UpToLast", "UpToFirst", "UpToFace", "TwoLengths", "UpToShape", nullptr}; PROPERTY_SOURCE(PartDesign::Pad, PartDesign::FeatureExtrude) @@ -78,6 +78,8 @@ App::DocumentObjectExecReturn *Pad::execute() Midplane.setReadOnly(hasReversed); Reversed.setReadOnly(hasMidplane); + std::string method(Type.getValueAsString()); + TopoDS_Shape sketchshape; try { sketchshape = getVerifiedFace(); @@ -92,6 +94,9 @@ App::DocumentObjectExecReturn *Pad::execute() base = getBaseShape(); } catch (const Base::Exception&) { + if (method == "UpToShape") { + return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Pad: Can't pad up to shape without base shape.")); + } base = TopoDS_Shape(); } @@ -137,8 +142,7 @@ App::DocumentObjectExecReturn *Pad::execute() sketchshape.Move(invObjLoc); TopoDS_Shape prism; - std::string method(Type.getValueAsString()); - if (method == "UpToFirst" || method == "UpToLast" || method == "UpToFace") { + if (method == "UpToFirst" || method == "UpToLast" || method == "UpToFace" || method == "UpToShape") { // Note: This will return an unlimited planar face if support is a datum plane TopoDS_Face supportface = getSupportFace(); supportface.Move(invObjLoc); @@ -146,14 +150,16 @@ App::DocumentObjectExecReturn *Pad::execute() if (Reversed.getValue()) dir.Reverse(); - // Find a valid face or datum plane to extrude up to TopoDS_Face upToFace; - if (method == "UpToFace") { - getFaceFromLinkSub(upToFace, UpToFace); - upToFace.Move(invObjLoc); + if (method != "UpToShape") { + // Find a valid face or datum plane to extrude up to + if (method == "UpToFace") { + getFaceFromLinkSub(upToFace, UpToFace); + upToFace.Move(invObjLoc); + } + getUpToFace(upToFace, base, sketchshape, method, dir); + addOffsetToFace(upToFace, dir, Offset.getValue()); } - getUpToFace(upToFace, base, sketchshape, method, dir); - addOffsetToFace(upToFace, dir, Offset.getValue()); // TODO: Write our own PrismMaker which does not depend on a solid base shape if (base.IsNull()) { @@ -165,7 +171,10 @@ App::DocumentObjectExecReturn *Pad::execute() supportface = TopoDS_Face(); PrismMode mode = PrismMode::None; - generatePrism(prism, method, base, sketchshape, supportface, upToFace, dir, mode, Standard_True); + if (method == "UpToShape") + generatePrism(prism, "UpToFace", base, sketchshape, supportface, base, dir, mode, Standard_True); + else + generatePrism(prism, method, base, sketchshape, supportface, upToFace, dir, mode, Standard_True); base.Nullify(); } else { @@ -182,7 +191,10 @@ App::DocumentObjectExecReturn *Pad::execute() if (!Ex.More()) supportface = TopoDS_Face(); PrismMode mode = PrismMode::None; - generatePrism(prism, method, base, sketchshape, supportface, upToFace, dir, mode, Standard_True); + if (method == "UpToShape") + generatePrism(prism, "UpToFace", base, sketchshape, supportface, base, dir, mode, Standard_True); + else + generatePrism(prism, method, base, sketchshape, supportface, upToFace, dir, mode, Standard_True); } } else {