PartDesign: Fix symmetric regression & LengthAlongSketchNormal (#23418)

* PartDesign: Fix symmetric regression

* to squash

* Fix LengthAlongSketchNormal not working

* to squash

* Fix checkbox not initially visible
This commit is contained in:
PaddleStroke
2025-08-29 10:03:16 +02:00
committed by GitHub
parent 78a579804c
commit 7d3dd2605f
3 changed files with 26 additions and 25 deletions

View File

@@ -313,8 +313,10 @@ App::DocumentObjectExecReturn* FeatureExtrude::buildExtrusion(ExtrudeOptions opt
std::string method2(Type2.getValueAsString());
// Validate parameters
double L = Length.getValue();
double L2 = (Sidemethod == "Two sides" && method2 == "Length") ? Length2.getValue() : 0;
double L = method == "ThroughAll" ? getThroughAllLength() : Length.getValue();
double L2 = Sidemethod == "Two sides"
? method2 == "ThroughAll" ? getThroughAllLength() : Length2.getValue()
: 0;
if ((Sidemethod == "One side" && method == "Length")
|| (Sidemethod == "Two sides" && method == "Length" && method2 == "Length")) {
@@ -447,21 +449,19 @@ App::DocumentObjectExecReturn* FeatureExtrude::buildExtrusion(ExtrudeOptions opt
sketchshape.move(invObjLoc);
std::vector<TopoShape> prisms; // Stores prisms, all in global CS
std::string sideTypeStr = SideType.getValueAsString();
std::string method1 = Type.getValueAsString();
double len1 = method1 == "ThroughAll" ? getThroughAllLength() : Length.getValue();
double taper1 = TaperAngle.getValue();
double offset1 = Offset.getValue();
if (sideTypeStr == "One side") {
if (Sidemethod == "One side") {
TopoShape prism1 = generateSingleExtrusionSide(sketchshape,
method1, len1, taper1, UpToFace, UpToShape,
method, L, taper1, UpToFace, UpToShape,
dir, offset1, makeface, base);
prisms.push_back(prism1);
}
else if (sideTypeStr == "Symmetric") {
else if (Sidemethod == "Symmetric") {
L /= 2.0;
TopoShape prism1 = generateSingleExtrusionSide(sketchshape,
method1, len1, taper1, UpToFace, UpToShape,
method, L, taper1, UpToFace, UpToShape,
dir, offset1, makeface, base);
prisms.push_back(prism1);
@@ -472,10 +472,10 @@ App::DocumentObjectExecReturn* FeatureExtrude::buildExtrusion(ExtrudeOptions opt
prisms.push_back(prism2);
}
else if (sideTypeStr == "Two sides") {
else if (Sidemethod == "Two sides") {
TopoShape prism1 = generateSingleExtrusionSide(sketchshape.makeElementCopy(),
method1,
len1,
method,
L,
taper1,
UpToFace,
UpToShape,
@@ -488,8 +488,6 @@ App::DocumentObjectExecReturn* FeatureExtrude::buildExtrusion(ExtrudeOptions opt
}
// Side 2
std::string method2 = Type2.getValueAsString();
double len2 = method2 == "ThroughAll" ? getThroughAllLength() : Length2.getValue();
double taper2 = TaperAngle2.getValue();
double offset2 = Offset2.getValue();
gp_Dir dir2 = dir;
@@ -497,7 +495,7 @@ App::DocumentObjectExecReturn* FeatureExtrude::buildExtrusion(ExtrudeOptions opt
TopoShape prism2 = generateSingleExtrusionSide(sketchshape.makeElementCopy(),
method2,
len2,
L2,
taper2,
UpToFace2,
UpToShape2,
@@ -739,18 +737,18 @@ TopoShape FeatureExtrude::generateSingleExtrusionSide(const TopoShape& sketchsha
return prism;
}
void FeatureExtrude::handleChangedPropertyType(Base::XMLReader& reader,
const char* TypeName,
App::Property* prop)
void FeatureExtrude::onDocumentRestored()
{
// property Type no longer has TwoLengths.
if (prop == &Type && strcmp(Type.getValueAsString(), "TwoLengths") == 0) {
if (strcmp(Type.getValueAsString(), "TwoLengths") == 0) {
Type.setValue("Length");
Type2.setValue("Length");
SideType.setValue("Two sides");
}
else {
ProfileBased::handleChangedPropertyType(reader, TypeName, prop);
else if (Midplane.getValue()) {
Midplane.setValue(false);
SideType.setValue("Symmetric");
}
ProfileBased::onDocumentRestored();
}

View File

@@ -73,7 +73,7 @@ public:
static const char* SideTypesEnums[];
protected:
void handleChangedPropertyType(Base::XMLReader& reader, const char* TypeName, App::Property* prop) override;
void onDocumentRestored() override;
Base::Vector3d computeDirection(const Base::Vector3d& sketchVector, bool inverse);
bool hasTaperedAngle() const;

View File

@@ -768,8 +768,10 @@ void TaskExtrudeParameters::updateWholeUI(Type type, Side side)
// Side 2 is only visible if in TwoSides mode, and we pass whether it should receive focus.
updateSideUI(m_side2, type, mode2, isSide2GroupVisible, (side == Side::Second));
ui->checkBoxAlongDirection->setVisible(m_side1.lengthEdit->isVisible()
|| m_side2.lengthEdit->isVisible());
bool side1HasLength = (mode1 == Mode::Dimension);
bool side2HasLength = (sidesMode == SidesMode::TwoSides && mode2 == Mode::Dimension);
ui->checkBoxAlongDirection->setVisible(side1HasLength || side2HasLength);
ui->checkBoxReversed->setEnabled(sidesMode != SidesMode::Symmetric || mode1 != Mode::Dimension);
}
@@ -1363,3 +1365,4 @@ bool TaskDlgExtrudeParameters::reject()
#include "moc_TaskExtrudeParameters.cpp"