126 lines
3.8 KiB
Python
126 lines
3.8 KiB
Python
|
|
"""
|
||
|
|
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()
|