fix(engine): 支持显式坐标选择器的阵列变换
This commit is contained in:
@@ -68,12 +68,19 @@ def _has_explicit_host_frame(params: dict[str, Any]) -> bool:
|
|||||||
def pattern_transform_blocker(source: FeaturePlanNode) -> str | None:
|
def pattern_transform_blocker(source: FeaturePlanNode) -> str | None:
|
||||||
"""Return the selector dependency that cannot be transformed exactly.
|
"""Return the selector dependency that cannot be transformed exactly.
|
||||||
|
|
||||||
An explicit host frame is coordinate data, not a topology guess. It can
|
Selectors fully captured by explicit coordinate data (a revolve axis with
|
||||||
be transformed with a patterned instance while preserving local hole
|
origin/direction, or a host face with a complete world frame) are
|
||||||
positions. All topology selectors and selector-dependent extents remain
|
transformed together with each patterned instance and are not blockers.
|
||||||
blocked until their geometry transform contract is implemented.
|
Any remaining topology selector and selector-dependent extent stays
|
||||||
|
blocked until its geometry transform contract is implemented.
|
||||||
"""
|
"""
|
||||||
if source.selectors:
|
for selector in source.selectors or ():
|
||||||
|
if selector.get("kind") == "axis" and _has_explicit_axis(source.params.get("axis")):
|
||||||
|
# The axis is coordinate data; _translated_node shifts its origin.
|
||||||
|
continue
|
||||||
|
if selector.get("kind") == "face" and _has_explicit_host_frame(source.params):
|
||||||
|
# The host face carries a complete world frame; positions stay local.
|
||||||
|
continue
|
||||||
return "feature selector"
|
return "feature selector"
|
||||||
host = source.params.get("host_face")
|
host = source.params.get("host_face")
|
||||||
if host is not None and not _has_explicit_host_frame(source.params):
|
if host is not None and not _has_explicit_host_frame(source.params):
|
||||||
|
|||||||
Reference in New Issue
Block a user