Core: Add getPlacementOf replacing previous getGlobalPlacement logic. (#26059)

* Core: Add getPlacementOf replacing previous getGlobalPlacement logic.

* Update src/App/DocumentObject.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update DocumentObject.cpp

* Fix error when called from python with targetObj == None

---------

Co-authored-by: Kacper Donat <kadet1090@gmail.com>
This commit is contained in:
PaddleStroke
2025-12-10 22:47:20 +01:00
committed by GitHub
parent a23ccfffff
commit eb25021f39
11 changed files with 368 additions and 35 deletions

View File

@@ -91,6 +91,11 @@ public:
bool editProperty(const char* propName);
ValueT isLink() const;
ValueT isLinkGroup() const;
bool getPlacementOf(Base::Placement& ret, const char* subname, App::DocumentObject* target) const;
private:
App::DocumentObject* object;
bool has__object__ {false};
@@ -114,7 +119,10 @@ private:
FC_PY_ELEMENT(hasChildElement) \
FC_PY_ELEMENT(isElementVisible) \
FC_PY_ELEMENT(setElementVisible) \
FC_PY_ELEMENT(editProperty)
FC_PY_ELEMENT(editProperty) \
FC_PY_ELEMENT(isLink) \
FC_PY_ELEMENT(isLinkGroup) \
FC_PY_ELEMENT(getPlacementOf)
#define FC_PY_ELEMENT_DEFINE(_name) Py::Object py_##_name;
@@ -349,6 +357,41 @@ public:
}
}
bool isLink() const override
{
switch (imp->isLink()) {
case FeaturePythonImp::Accepted:
return true;
case FeaturePythonImp::Rejected:
return false;
default:
return FeatureT::isLink();
}
}
bool isLinkGroup() const override
{
switch (imp->isLinkGroup()) {
case FeaturePythonImp::Accepted:
return true;
case FeaturePythonImp::Rejected:
return false;
default:
return FeatureT::isLinkGroup();
}
}
Base::Placement getPlacementOf(const std::string& sub, DocumentObject* targetObj = nullptr) override
{
Base::Placement ret;
// Try to call the python implementation first
if (imp->getPlacementOf(ret, sub.c_str(), targetObj)) {
return ret;
}
// Fallback to C++ implementation
return FeatureT::getPlacementOf(sub, targetObj);
}
PyObject* getPyObject() override
{
if (FeatureT::PythonObject.is(Py::_None())) {