Merge pull request #11136 from FlachyJoe/fix_11135

PD: Pad to the base shape
This commit is contained in:
sliptonic
2023-11-13 10:46:54 -06:00
committed by GitHub
3 changed files with 28 additions and 13 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 {