fix: search features + feature names for ISOGRID_SANDBOX attribute (Promote Body stores attrs on feature, not body)
This commit is contained in:
@@ -239,9 +239,18 @@ def find_sandbox_bodies(
|
|||||||
) -> List[Tuple[str, Any, Any]]:
|
) -> List[Tuple[str, Any, Any]]:
|
||||||
"""
|
"""
|
||||||
Find bodies tagged with ISOGRID_SANDBOX attribute.
|
Find bodies tagged with ISOGRID_SANDBOX attribute.
|
||||||
|
|
||||||
|
Search order:
|
||||||
|
1. Body-level attributes (part.Bodies)
|
||||||
|
2. Face-level attributes
|
||||||
|
3. Feature-level attributes (part history — Promote Body features)
|
||||||
|
4. Feature name matching (e.g. 'Sandbox_1' in feature name)
|
||||||
|
5. Body name matching
|
||||||
|
|
||||||
Returns list of (sandbox_id, body, face) tuples.
|
Returns list of (sandbox_id, body, face) tuples.
|
||||||
"""
|
"""
|
||||||
tagged: List[Tuple[str, Any, Any]] = []
|
tagged: List[Tuple[str, Any, Any]] = []
|
||||||
|
found_ids: set = set()
|
||||||
|
|
||||||
bodies = []
|
bodies = []
|
||||||
try:
|
try:
|
||||||
@@ -251,6 +260,7 @@ def find_sandbox_bodies(
|
|||||||
|
|
||||||
lister.WriteLine(f"[extract_sandbox] Scanning {len(bodies)} bodies...")
|
lister.WriteLine(f"[extract_sandbox] Scanning {len(bodies)} bodies...")
|
||||||
|
|
||||||
|
# --- Pass 1: body-level and face-level attributes ---
|
||||||
for body in bodies:
|
for body in bodies:
|
||||||
body_name = ""
|
body_name = ""
|
||||||
try:
|
try:
|
||||||
@@ -258,37 +268,106 @@ def find_sandbox_bodies(
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Check body-level attribute
|
|
||||||
sandbox_id = _get_string_attribute(body, attr_name)
|
sandbox_id = _get_string_attribute(body, attr_name)
|
||||||
if sandbox_id:
|
if sandbox_id and sandbox_id not in found_ids:
|
||||||
faces = body.GetFaces()
|
faces = body.GetFaces()
|
||||||
if faces:
|
if faces:
|
||||||
tagged.append((sandbox_id, body, faces[0]))
|
tagged.append((sandbox_id, body, faces[0]))
|
||||||
lister.WriteLine(f"[extract_sandbox] Found: {sandbox_id} (body attr on '{body_name}', {len(faces)} face(s))")
|
found_ids.add(sandbox_id)
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Found: {sandbox_id} (body attr on '{body_name}')")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Check face-level attribute
|
|
||||||
for face in body.GetFaces():
|
for face in body.GetFaces():
|
||||||
sandbox_id = _get_string_attribute(face, attr_name)
|
sandbox_id = _get_string_attribute(face, attr_name)
|
||||||
if sandbox_id:
|
if sandbox_id and sandbox_id not in found_ids:
|
||||||
tagged.append((sandbox_id, body, face))
|
tagged.append((sandbox_id, body, face))
|
||||||
|
found_ids.add(sandbox_id)
|
||||||
lister.WriteLine(f"[extract_sandbox] Found: {sandbox_id} (face attr on '{body_name}')")
|
lister.WriteLine(f"[extract_sandbox] Found: {sandbox_id} (face attr on '{body_name}')")
|
||||||
|
|
||||||
# Fallback: body name matching
|
if tagged:
|
||||||
if not tagged:
|
return tagged
|
||||||
lister.WriteLine("[extract_sandbox] No attributes found, trying name matching...")
|
|
||||||
for body in bodies:
|
# --- Pass 2: feature-level attributes (Promote Body features) ---
|
||||||
bname = ""
|
lister.WriteLine("[extract_sandbox] No body/face attrs found, scanning features...")
|
||||||
|
try:
|
||||||
|
features = part.Features.ToArray() if hasattr(part.Features, "ToArray") else list(part.Features)
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Found {len(features)} features")
|
||||||
|
|
||||||
|
for feat in features:
|
||||||
|
feat_name = ""
|
||||||
try:
|
try:
|
||||||
bname = body.Name if hasattr(body, "Name") else str(body)
|
feat_name = feat.Name if hasattr(feat, "Name") else str(feat)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Check feature attribute
|
||||||
|
sandbox_id = _get_string_attribute(feat, attr_name)
|
||||||
|
if sandbox_id and sandbox_id not in found_ids:
|
||||||
|
# Get the body produced by this feature
|
||||||
|
try:
|
||||||
|
feat_bodies = feat.GetBodies()
|
||||||
|
if feat_bodies:
|
||||||
|
body = feat_bodies[0]
|
||||||
|
faces = body.GetFaces()
|
||||||
|
if faces:
|
||||||
|
tagged.append((sandbox_id, body, faces[0]))
|
||||||
|
found_ids.add(sandbox_id)
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Found: {sandbox_id} (feature attr on '{feat_name}')")
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Feature '{feat_name}' has attr but GetBodies failed: {exc}")
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Feature scan error: {exc}")
|
||||||
|
|
||||||
|
if tagged:
|
||||||
|
return tagged
|
||||||
|
|
||||||
|
# --- Pass 3: feature name matching (e.g. "Sandbox_1" in name) ---
|
||||||
|
lister.WriteLine("[extract_sandbox] No feature attrs found, trying feature name matching...")
|
||||||
|
try:
|
||||||
|
features = part.Features.ToArray() if hasattr(part.Features, "ToArray") else list(part.Features)
|
||||||
|
for feat in features:
|
||||||
|
feat_name = ""
|
||||||
|
try:
|
||||||
|
feat_name = feat.Name if hasattr(feat, "Name") else str(feat)
|
||||||
except Exception:
|
except Exception:
|
||||||
continue
|
continue
|
||||||
if "sandbox" in bname.lower():
|
|
||||||
faces = body.GetFaces()
|
if "sandbox" in feat_name.lower():
|
||||||
if faces:
|
try:
|
||||||
sid = bname.lower().replace(" ", "_")
|
feat_bodies = feat.GetBodies()
|
||||||
|
if feat_bodies:
|
||||||
|
body = feat_bodies[0]
|
||||||
|
faces = body.GetFaces()
|
||||||
|
if faces:
|
||||||
|
sid = feat_name.lower().replace(" ", "_")
|
||||||
|
if sid not in found_ids:
|
||||||
|
tagged.append((sid, body, faces[0]))
|
||||||
|
found_ids.add(sid)
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Found by feature name: {sid} ('{feat_name}')")
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Feature '{feat_name}' name match but GetBodies failed: {exc}")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if tagged:
|
||||||
|
return tagged
|
||||||
|
|
||||||
|
# --- Pass 4: body name matching ---
|
||||||
|
lister.WriteLine("[extract_sandbox] No features matched, trying body name matching...")
|
||||||
|
for body in bodies:
|
||||||
|
bname = ""
|
||||||
|
try:
|
||||||
|
bname = body.Name if hasattr(body, "Name") else str(body)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
if "sandbox" in bname.lower():
|
||||||
|
faces = body.GetFaces()
|
||||||
|
if faces:
|
||||||
|
sid = bname.lower().replace(" ", "_")
|
||||||
|
if sid not in found_ids:
|
||||||
tagged.append((sid, body, faces[0]))
|
tagged.append((sid, body, faces[0]))
|
||||||
lister.WriteLine(f"[extract_sandbox] Found by name: {sid}")
|
found_ids.add(sid)
|
||||||
|
lister.WriteLine(f"[extract_sandbox] Found by body name: {sid}")
|
||||||
|
|
||||||
return tagged
|
return tagged
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user