Merge pull request #25580 from kadet1090/fix-boolean-position

PartDesign: Fix boolean positioning
This commit is contained in:
Chris Hennes
2025-11-26 14:22:59 -06:00
committed by GitHub
5 changed files with 30 additions and 52 deletions

View File

@@ -40,10 +40,9 @@ using namespace PartDesign;
namespace PartDesign
{
extern bool getPDRefineModelParameter();
PROPERTY_SOURCE_WITH_EXTENSIONS(PartDesign::Boolean, PartDesign::Feature)
PROPERTY_SOURCE_WITH_EXTENSIONS(PartDesign::Boolean, PartDesign::FeatureRefine)
const char* Boolean::TypeEnums[] = {"Fuse", "Cut", "Common", nullptr};
@@ -52,15 +51,6 @@ Boolean::Boolean()
ADD_PROPERTY(Type, ((long)0));
Type.setEnums(TypeEnums);
ADD_PROPERTY_TYPE(
UsePlacement,
(0),
"Part Design",
(App::PropertyType)(App::Prop_None),
"Apply the placement of the second ( tool ) object"
);
this->UsePlacement.setValue(false);
App::GeoFeatureGroupExtension::initExtension(this);
}
@@ -115,15 +105,6 @@ App::DocumentObjectExecReturn* Boolean::execute()
);
}
// get the body this boolean feature belongs to
Part::BodyBase* baseBody = Part::BodyBase::findBodyOf(this);
if (!baseBody) {
return new App::DocumentObjectExecReturn(
QT_TRANSLATE_NOOP("Exception", "Cannot do boolean on feature which is not in a body")
);
}
std::vector<TopoShape> shapes;
shapes.push_back(baseTopShape);
for (auto it = tools.begin(); it < tools.end(); ++it) {
@@ -137,36 +118,9 @@ App::DocumentObjectExecReturn* Boolean::execute()
}
TopoShape result(baseTopShape);
Base::Placement bodyPlacement = baseBody->globalPlacement().inverse();
for (auto tool : tools) {
if (!tool->isDerivedFrom<Part::Feature>()) {
return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP(
"Exception",
"Cannot do boolean with anything but Part::Feature and its derivatives"
));
}
Part::TopoShape toolShape = static_cast<Part::Feature*>(tool)->Shape.getShape();
if (UsePlacement.getValue()) {
toolShape.setPlacement(bodyPlacement * toolShape.getPlacement());
}
TopoDS_Shape shape = toolShape.getShape();
TopoDS_Shape boolOp;
// Must not pass null shapes to the boolean operations
if (result.isNull()) {
return new App::DocumentObjectExecReturn(
QT_TRANSLATE_NOOP("Exception", "Base shape is null")
);
}
if (shape.IsNull()) {
return new App::DocumentObjectExecReturn(
QT_TRANSLATE_NOOP("Exception", "Tool shape is null")
);
}
if (!tools.empty()) {
const char* op = nullptr;
if (type == "Fuse") {
op = Part::OpCodes::Fuse;
}
@@ -199,6 +153,8 @@ App::DocumentObjectExecReturn* Boolean::execute()
}
}
result.bakeInTransform();
result = refineShapeIfActive(result);
if (!isSingleSolidRuleSatisfied(result.getShape())) {