336 lines
9.3 KiB
Markdown
336 lines
9.3 KiB
Markdown
|
|
# NXOpen Resources and References
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document lists valuable resources for NXOpen development that can inform our implementation without direct code copying.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Primary Resources
|
||
|
|
|
||
|
|
### 1. **Official Siemens NXOpen API Documentation**
|
||
|
|
|
||
|
|
**URL**: https://docs.sw.siemens.com/en-US/doc/209349590/PL20231101866122454.custom_api.nxopen_net
|
||
|
|
|
||
|
|
**Usage**:
|
||
|
|
- Primary reference for API syntax and methods
|
||
|
|
- Official namespace documentation
|
||
|
|
- Method signatures and return types
|
||
|
|
- Parameter descriptions
|
||
|
|
|
||
|
|
**Integration Strategy**:
|
||
|
|
- MCP tool `search_nxopen_docs` will fetch pages on-demand
|
||
|
|
- Cache frequently-used API snippets locally
|
||
|
|
- LLM can reference documentation when generating NXOpen code
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 2. **NXOpenTSE by The Scripting Engineer**
|
||
|
|
|
||
|
|
**GitHub**: https://github.com/theScriptingEngineer/nxopentse/tree/main
|
||
|
|
**Documentation**: https://nxopentsedocumentation.thescriptingengineer.com/
|
||
|
|
|
||
|
|
#### About NXOpenTSE
|
||
|
|
|
||
|
|
NXOpenTSE is an open-source Python library that provides:
|
||
|
|
- **High-level wrappers** around NXOpen API
|
||
|
|
- **Utility functions** for common NX operations
|
||
|
|
- **Well-documented examples** of NX automation patterns
|
||
|
|
- **Best practices** for NX scripting
|
||
|
|
|
||
|
|
**License**: MIT (as of last check - verify before use)
|
||
|
|
|
||
|
|
#### Why NXOpenTSE is Valuable for Atomizer
|
||
|
|
|
||
|
|
1. **Reference for Design Patterns**:
|
||
|
|
- How to structure NXOpen scripts
|
||
|
|
- Error handling approaches
|
||
|
|
- Session management patterns
|
||
|
|
- Part loading/unloading workflows
|
||
|
|
|
||
|
|
2. **Understanding API Usage**:
|
||
|
|
- See real-world examples of API calls
|
||
|
|
- Learn parameter combinations that work
|
||
|
|
- Understand method call sequences
|
||
|
|
|
||
|
|
3. **Avoiding Common Pitfalls**:
|
||
|
|
- See solutions to typical problems
|
||
|
|
- Learn about NX-specific gotchas
|
||
|
|
- Understand threading/transaction requirements
|
||
|
|
|
||
|
|
4. **Inspiration for Features**:
|
||
|
|
- Discover what's possible with NXOpen
|
||
|
|
- See advanced techniques
|
||
|
|
- Learn about lesser-known APIs
|
||
|
|
|
||
|
|
#### Integration Strategy for Atomizer
|
||
|
|
|
||
|
|
**Approach**: Reference, don't copy
|
||
|
|
|
||
|
|
```
|
||
|
|
✅ DO:
|
||
|
|
- Study NXOpenTSE documentation for understanding NX concepts
|
||
|
|
- Reference example patterns when writing our own code
|
||
|
|
- Learn from error handling approaches
|
||
|
|
- Use as inspiration for our API wrapper design
|
||
|
|
- Link to NXOpenTSE docs in our MCP system prompts
|
||
|
|
- Ask LLM to "check NXOpenTSE documentation for similar examples"
|
||
|
|
|
||
|
|
❌ DON'T:
|
||
|
|
- Copy code verbatim without attribution
|
||
|
|
- Replicate their library structure
|
||
|
|
- Import NXOpenTSE as a dependency (we build our own)
|
||
|
|
- Reuse their code without understanding it
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Specific Areas to Reference
|
||
|
|
|
||
|
|
| Our Component | NXOpenTSE Reference Area | What to Learn |
|
||
|
|
|--------------|-------------------------|---------------|
|
||
|
|
| `nx_journals/update_and_solve.py` | Expression handling, part updates | How to safely modify expressions |
|
||
|
|
| `nx_journals/api_dispatcher.py` | Session management | Best practices for NX session handling |
|
||
|
|
| `mcp_server/tools/model_discovery.py` | Part file reading | How to extract model information |
|
||
|
|
| `optimization_engine/result_extractors/` | CAE result reading | Methods for accessing simulation results |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Using NXOpenTSE Documentation with MCP
|
||
|
|
|
||
|
|
### MCP System Prompt Extension
|
||
|
|
|
||
|
|
When generating NXOpen code, the LLM can be instructed to:
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
When writing NXOpen code:
|
||
|
|
1. First check official Siemens NXOpen API docs for method signatures
|
||
|
|
2. Reference NXOpenTSE documentation (https://nxopentsedocumentation.thescriptingengineer.com/)
|
||
|
|
for real-world usage patterns and best practices
|
||
|
|
3. Adapt patterns to our specific use case rather than copying directly
|
||
|
|
4. Always include error handling and validation
|
||
|
|
5. Add comments explaining NX-specific requirements
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example LLM Workflow
|
||
|
|
|
||
|
|
**User**: "I need to read all expressions from a .sim file"
|
||
|
|
|
||
|
|
**LLM Reasoning**:
|
||
|
|
1. Check official API: `NXOpen.Part.Expressions`
|
||
|
|
2. Look at NXOpenTSE example: https://nxopentsedocumentation.thescriptingengineer.com/expressions.html
|
||
|
|
3. See pattern: Loop through `work_part.Expressions`, handle edge cases
|
||
|
|
4. Adapt to our needs: Add filtering, type checking, JSON serialization
|
||
|
|
|
||
|
|
**Generated Code** (our implementation, inspired by reference):
|
||
|
|
```python
|
||
|
|
def get_expressions(sim_file_path: Path) -> dict:
|
||
|
|
"""Extract all expressions from a .sim file."""
|
||
|
|
import NXOpen
|
||
|
|
|
||
|
|
session = NXOpen.Session.GetSession()
|
||
|
|
|
||
|
|
# Load sim file
|
||
|
|
part, status = session.Parts.OpenActiveDisplay(str(sim_file_path))
|
||
|
|
|
||
|
|
expressions = {}
|
||
|
|
try:
|
||
|
|
for expr in part.Expressions:
|
||
|
|
# Filter out system expressions (start with underscore)
|
||
|
|
if not expr.Name.startswith("_"):
|
||
|
|
expressions[expr.Name] = {
|
||
|
|
"value": expr.Value,
|
||
|
|
"units": expr.Units if expr.Units else "",
|
||
|
|
"type": str(expr.Type)
|
||
|
|
}
|
||
|
|
finally:
|
||
|
|
# Clean up
|
||
|
|
session.Parts.SetWork(None)
|
||
|
|
|
||
|
|
return expressions
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Additional Resources
|
||
|
|
|
||
|
|
### 3. **Eng-Tips NXOpen Forum**
|
||
|
|
|
||
|
|
**URL**: https://www.eng-tips.com/threadminder.cfm?pid=561
|
||
|
|
|
||
|
|
- Community Q&A
|
||
|
|
- Troubleshooting help
|
||
|
|
- User-contributed examples
|
||
|
|
|
||
|
|
### 4. **Stack Overflow - NXOpen Tag**
|
||
|
|
|
||
|
|
**URL**: https://stackoverflow.com/questions/tagged/nxopen
|
||
|
|
|
||
|
|
- Specific problem solutions
|
||
|
|
- Code snippets for common tasks
|
||
|
|
|
||
|
|
### 5. **Siemens PLM Community Forums**
|
||
|
|
|
||
|
|
**URL**: https://community.sw.siemens.com/
|
||
|
|
|
||
|
|
- Official support
|
||
|
|
- Product announcements
|
||
|
|
- Beta access information
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Best Practices Learned from NXOpenTSE
|
||
|
|
|
||
|
|
### 1. **Session Management**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Always get session at the start
|
||
|
|
session = NXOpen.Session.GetSession()
|
||
|
|
|
||
|
|
# Always check if part is loaded
|
||
|
|
if session.Parts.Work is None:
|
||
|
|
raise ValueError("No work part loaded")
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. **Error Handling**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Wrap NX operations in try-finally for cleanup
|
||
|
|
try:
|
||
|
|
# NX operations here
|
||
|
|
result = do_something()
|
||
|
|
finally:
|
||
|
|
# Always clean up, even on error
|
||
|
|
if temp_part:
|
||
|
|
session.Parts.CloseAll(NXOpen.BasePart.CloseWholeTree.True)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. **Expression Updates**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Use Edit method for updating expressions
|
||
|
|
expr = part.Expressions.FindObject("parameter_name")
|
||
|
|
if expr:
|
||
|
|
expr.Edit(new_value)
|
||
|
|
else:
|
||
|
|
# Create if doesn't exist
|
||
|
|
unit = part.UnitCollection.FindObject("MilliMeter")
|
||
|
|
part.Expressions.CreateExpression(unit, "parameter_name", str(new_value))
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. **Simulation Solution Access**
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Access simulation objects safely
|
||
|
|
sim_simulation = sim_part.Simulation
|
||
|
|
if sim_simulation:
|
||
|
|
solutions = sim_simulation.Solutions
|
||
|
|
for solution in solutions:
|
||
|
|
if solution.Name == target_name:
|
||
|
|
# Found our solution
|
||
|
|
pass
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Attribution and Licensing
|
||
|
|
|
||
|
|
### When Using Ideas from NXOpenTSE
|
||
|
|
|
||
|
|
1. **Add attribution in comments**:
|
||
|
|
```python
|
||
|
|
# Approach inspired by NXOpenTSE expression handling
|
||
|
|
# See: https://nxopentsedocumentation.thescriptingengineer.com/expressions.html
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Link in documentation**:
|
||
|
|
- Acknowledge inspiration in our docs
|
||
|
|
- Link to relevant NXOpenTSE pages
|
||
|
|
- Credit The Scripting Engineer for educational resources
|
||
|
|
|
||
|
|
3. **Respect MIT License** (verify current license):
|
||
|
|
- Give credit to original authors
|
||
|
|
- Don't claim their work as ours
|
||
|
|
- Contribute back to community if we find improvements
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Contributing to NXOpenTSE
|
||
|
|
|
||
|
|
If we discover useful patterns or fixes while building Atomizer:
|
||
|
|
- Consider contributing examples back to NXOpenTSE
|
||
|
|
- Report issues if we find documentation errors
|
||
|
|
- Share knowledge with the NX scripting community
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Integration with Atomizer MCP
|
||
|
|
|
||
|
|
### MCP Tool: `search_nxopen_resources`
|
||
|
|
|
||
|
|
```python
|
||
|
|
{
|
||
|
|
"name": "search_nxopen_resources",
|
||
|
|
"description": "Search NXOpen documentation and reference materials",
|
||
|
|
"inputSchema": {
|
||
|
|
"query": "How to update expressions in NX",
|
||
|
|
"sources": ["official", "nxopentse", "community"],
|
||
|
|
"return_examples": true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output**:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"official_docs": "https://docs.sw.siemens.com/.../Expressions",
|
||
|
|
"nxopentse_example": "https://nxopentsedocumentation.thescriptingengineer.com/expressions.html",
|
||
|
|
"code_pattern": "Use part.Expressions.CreateExpression() or FindObject().Edit()",
|
||
|
|
"community_threads": [...]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### System Prompt Reference Section
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
## NXOpen Development Resources
|
||
|
|
|
||
|
|
When implementing NXOpen functionality:
|
||
|
|
|
||
|
|
1. **Official API**: Consult Siemens NXOpen .NET documentation for authoritative API reference
|
||
|
|
2. **NXOpenTSE**: Reference https://nxopentsedocumentation.thescriptingengineer.com/ for:
|
||
|
|
- Practical usage patterns
|
||
|
|
- Common parameter combinations
|
||
|
|
- Error handling approaches
|
||
|
|
- Real-world examples
|
||
|
|
3. **Adaptation**: Always adapt patterns to Atomizer's specific architecture rather than copying
|
||
|
|
|
||
|
|
Remember: NXOpenTSE is a reference for learning, not a dependency to import.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Summary
|
||
|
|
|
||
|
|
**NXOpenTSE is invaluable** for accelerating Atomizer development by:
|
||
|
|
- ✅ Showing proven patterns
|
||
|
|
- ✅ Teaching NX best practices
|
||
|
|
- ✅ Providing working examples to learn from
|
||
|
|
- ✅ Documenting edge cases and gotchas
|
||
|
|
|
||
|
|
**We will use it as**:
|
||
|
|
- 📚 Educational reference
|
||
|
|
- 🎯 Design pattern inspiration
|
||
|
|
- 🔍 Problem-solving resource
|
||
|
|
- 🧭 Navigation aid through complex NXOpen API
|
||
|
|
|
||
|
|
**Not as**:
|
||
|
|
- ❌ Code to copy-paste
|
||
|
|
- ❌ Dependency to import
|
||
|
|
- ❌ Replacement for understanding
|
||
|
|
|
||
|
|
This approach allows us to learn from the community while building something unique and tailored to Atomizer's specific optimization use case.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated**: 2025-11-15
|
||
|
|
**Maintainer**: Atomaster Development Team
|