Files

126 lines
3.8 KiB
Python
Raw Permalink Normal View History

"""
Test script for NX Open hooks.
This script tests the hooks module with a real NX part.
Run with: python -m optimization_engine.hooks.test_hooks
"""
import os
import sys
import json
# Add the project root to path
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.insert(0, project_root)
from optimization_engine.hooks.nx_cad import (
part_manager,
expression_manager,
geometry_query,
feature_manager,
)
def test_hooks(part_path: str):
"""Test all hooks with the given part."""
print(f"\n{'='*60}")
print(f"Testing NX Open Hooks")
print(f"Part: {part_path}")
print(f"{'='*60}\n")
if not os.path.exists(part_path):
print(f"ERROR: Part file not found: {part_path}")
return False
all_passed = True
# Test 1: Get expressions
print("\n--- Test 1: Get Expressions ---")
result = expression_manager.get_expressions(part_path)
if result["success"]:
print(f"SUCCESS: Found {result['data']['count']} expressions")
# Show first 5 expressions
for i, (name, expr) in enumerate(list(result['data']['expressions'].items())[:5]):
print(f" {name} = {expr['value']} {expr.get('units', '')}")
if result['data']['count'] > 5:
print(f" ... and {result['data']['count'] - 5} more")
else:
print(f"FAILED: {result['error']}")
all_passed = False
# Test 2: Get mass properties
print("\n--- Test 2: Get Mass Properties ---")
result = geometry_query.get_mass_properties(part_path)
if result["success"]:
data = result['data']
print(f"SUCCESS:")
print(f" Mass: {data['mass']:.6f} {data['mass_unit']}")
print(f" Volume: {data['volume']:.2f} {data['volume_unit']}")
print(f" Surface Area: {data['surface_area']:.2f} {data['area_unit']}")
print(f" Material: {data.get('material', 'N/A')}")
print(f" Centroid: ({data['centroid']['x']:.2f}, {data['centroid']['y']:.2f}, {data['centroid']['z']:.2f}) mm")
else:
print(f"FAILED: {result['error']}")
all_passed = False
# Test 3: Get bodies
print("\n--- Test 3: Get Bodies ---")
result = geometry_query.get_bodies(part_path)
if result["success"]:
data = result['data']
print(f"SUCCESS:")
print(f" Total bodies: {data['count']}")
print(f" Solid bodies: {data['solid_count']}")
print(f" Sheet bodies: {data['sheet_count']}")
else:
print(f"FAILED: {result['error']}")
all_passed = False
# Test 4: Get features
print("\n--- Test 4: Get Features ---")
result = feature_manager.get_features(part_path)
if result["success"]:
data = result['data']
print(f"SUCCESS: Found {data['count']} features ({data['suppressed_count']} suppressed)")
# Show first 5 features
for i, feat in enumerate(data['features'][:5]):
status = "suppressed" if feat['is_suppressed'] else "active"
print(f" {feat['name']} ({feat['type']}): {status}")
if data['count'] > 5:
print(f" ... and {data['count'] - 5} more")
else:
print(f"FAILED: {result['error']}")
all_passed = False
# Summary
print(f"\n{'='*60}")
if all_passed:
print("ALL TESTS PASSED!")
else:
print("SOME TESTS FAILED")
print(f"{'='*60}\n")
return all_passed
def main():
"""Main entry point."""
# Default to bracket study part
default_part = os.path.join(
project_root,
"studies/bracket_stiffness_optimization_V3/1_setup/model/Bracket.prt"
)
# Use command line argument if provided
if len(sys.argv) > 1:
part_path = sys.argv[1]
else:
part_path = default_part
success = test_hooks(part_path)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()