Merge pull request 'fix(assembly): classify datum plane references in Distance joints' (#314) from fix/distance-datum-plane-classification into main
All checks were successful
Build and Test / build (push) Successful in 41m35s
Sync Silo Server Docs / sync (push) Successful in 34s

Reviewed-on: #314
This commit was merged in pull request #314.
This commit is contained in:
2026-02-22 04:04:41 +00:00

View File

@@ -164,6 +164,39 @@ DistanceType getDistanceType(App::DocumentObject* joint)
auto* obj1 = getLinkedObjFromRef(joint, "Reference1");
auto* obj2 = getLinkedObjFromRef(joint, "Reference2");
// Datum planes (App::Plane) have empty element types because their
// sub-name ends with "." and yields no Face/Edge/Vertex element.
// Detect them here and classify before the main geometry chain,
// which cannot handle the empty element type.
const bool datum1 = type1.empty() && obj1 && obj1->isDerivedFrom<App::Plane>();
const bool datum2 = type2.empty() && obj2 && obj2->isDerivedFrom<App::Plane>();
if (datum1 || datum2) {
if (datum1 && datum2) {
return DistanceType::PlanePlane;
}
// One side is a datum plane, the other has a real element type.
// Ensure the datum (plane) side is Reference1 for consistent
// convention (face/plane first), matching the existing swap logic.
const auto& otherType = datum1 ? type2 : type1;
if (!datum1) {
swapJCS(joint);
}
if (otherType == "Vertex") {
return DistanceType::PointPlane;
}
if (otherType == "Edge") {
return DistanceType::LinePlane;
}
if (otherType == "Face") {
return DistanceType::PlanePlane;
}
// Unknown element + datum plane → best-effort planar
return DistanceType::PlanePlane;
}
if (type1 == "Vertex" && type2 == "Vertex") {
return DistanceType::PointPoint;
}