simready-forge 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- simready_forge/__init__.py +14 -0
- simready_forge/cli.py +221 -0
- simready_forge/cost.py +120 -0
- simready_forge/examples/__init__.py +0 -0
- simready_forge/examples/cabinet.py +124 -0
- simready_forge/export.py +170 -0
- simready_forge/isaac_probe.py +785 -0
- simready_forge/isaac_review.py +420 -0
- simready_forge/kit.py +1047 -0
- simready_forge/poses.py +293 -0
- simready_forge/prefs.py +105 -0
- simready_forge/preview.py +74 -0
- simready_forge/readback.py +177 -0
- simready_forge/review.py +167 -0
- simready_forge/scan.py +129 -0
- simready_forge/trellis.py +378 -0
- simready_forge/validate.py +66 -0
- simready_forge-0.1.0.dist-info/METADATA +165 -0
- simready_forge-0.1.0.dist-info/RECORD +22 -0
- simready_forge-0.1.0.dist-info/WHEEL +4 -0
- simready_forge-0.1.0.dist-info/entry_points.txt +2 -0
- simready_forge-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""NVIDIA's official SimReady validator (simready-validate 2026.8) on profile Robotics-Prop 4.0.0."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from .kit import PROFILE, PROFILE_VERSION
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def feature_results(summary):
|
|
10
|
+
"""{feature id: passed} from the validator's features summary."""
|
|
11
|
+
items = summary.items() if isinstance(summary, dict) else enumerate(summary or [])
|
|
12
|
+
out = {}
|
|
13
|
+
for key, value in items:
|
|
14
|
+
feature, passed = key, value
|
|
15
|
+
if isinstance(value, dict):
|
|
16
|
+
feature = value.get("id") or value.get("feature") or key
|
|
17
|
+
passed = value.get("passed", value.get("status"))
|
|
18
|
+
out[str(feature)] = passed
|
|
19
|
+
return out
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def validate(asset, out=None, quiet=False):
|
|
23
|
+
"""Validate a .usda; write <name>_reports/validate.json (or `out`) and return the summary."""
|
|
24
|
+
import simready.validate as sv
|
|
25
|
+
|
|
26
|
+
asset = Path(asset).resolve()
|
|
27
|
+
if out is None:
|
|
28
|
+
out = asset.parent.parent.parent / f"{asset.stem}_reports" / "validate.json"
|
|
29
|
+
out = Path(out)
|
|
30
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
sv.initialize(rules_and_requirements_paths=[], features_paths=[], profiles_paths=[])
|
|
32
|
+
config = sv.AssetValidationConfig(
|
|
33
|
+
asset_path=str(asset), profile_id=PROFILE, profile_version=PROFILE_VERSION, write_metadata=False
|
|
34
|
+
)
|
|
35
|
+
result = sv.validate_asset_list([config], report_file_path=str(out.with_suffix(".nvidia.json")))[0]
|
|
36
|
+
if result is None or not result.features_summary:
|
|
37
|
+
summary = {"asset": str(asset), "passed": False, "status": "no-result"}
|
|
38
|
+
else:
|
|
39
|
+
|
|
40
|
+
def record(item):
|
|
41
|
+
return {k: str(getattr(item, k)) for k in ("code", "message", "at") if getattr(item, k, None) is not None}
|
|
42
|
+
|
|
43
|
+
passed = bool(sv.features_summary_passed(result.features_summary) and not result.issues)
|
|
44
|
+
summary = {
|
|
45
|
+
"asset": str(asset),
|
|
46
|
+
"profile": f"{PROFILE}@{PROFILE_VERSION}",
|
|
47
|
+
"passed": passed,
|
|
48
|
+
"status": "passed" if passed else "failed",
|
|
49
|
+
"mandatory_failures": len(result.issues),
|
|
50
|
+
"optional_findings": len(result.soft_issues),
|
|
51
|
+
"features": feature_results(result.features_summary),
|
|
52
|
+
"mandatory": [record(i) for i in result.issues],
|
|
53
|
+
"optional": [record(i) for i in result.soft_issues],
|
|
54
|
+
}
|
|
55
|
+
out.write_text(json.dumps(summary, indent=1, default=str), encoding="utf-8")
|
|
56
|
+
if not quiet:
|
|
57
|
+
print(
|
|
58
|
+
f"{'PASSED' if summary['passed'] else 'FAILED'}: {summary.get('mandatory_failures')} mandatory failures, "
|
|
59
|
+
f"{summary.get('optional_findings')} optional findings (report: {out})"
|
|
60
|
+
)
|
|
61
|
+
features = sorted(k for k, v in summary.get("features", {}).items() if v is True)
|
|
62
|
+
if features:
|
|
63
|
+
print(" features passed: " + ", ".join(features))
|
|
64
|
+
for issue in summary.get("mandatory", [])[:25]:
|
|
65
|
+
print(f" [{issue.get('code', '')}] {issue.get('message', '')[:300]} at {issue.get('at', '')[:120]}")
|
|
66
|
+
return summary
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: simready-forge
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Turn a prompt or a photo into an NVIDIA SimReady asset: OpenUSD with materials, physics and joints
|
|
5
|
+
Project-URL: Homepage, https://github.com/serionist/simready-forge
|
|
6
|
+
Project-URL: Repository, https://github.com/serionist/simready-forge
|
|
7
|
+
Project-URL: Documentation, https://github.com/serionist/simready-forge/tree/main/docs
|
|
8
|
+
Project-URL: Issues, https://github.com/serionist/simready-forge/issues
|
|
9
|
+
Author: Soma Osvay
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: build123d,claude-code,isaac-sim,omniverse,openusd,robotics,simready,simulation,usd
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
21
|
+
Requires-Python: <3.14,>=3.12
|
|
22
|
+
Requires-Dist: build123d==0.13.0
|
|
23
|
+
Requires-Dist: coacd==1.0.14
|
|
24
|
+
Requires-Dist: matplotlib==3.11.2
|
|
25
|
+
Requires-Dist: numpy==2.5.4
|
|
26
|
+
Requires-Dist: physx-usd-schemas==25.11.2.72696984
|
|
27
|
+
Requires-Dist: pillow==13.0.0
|
|
28
|
+
Requires-Dist: scipy==1.18.1
|
|
29
|
+
Requires-Dist: simready-foundation-tier-core==2026.8.0
|
|
30
|
+
Requires-Dist: simready-validate==2026.8.0
|
|
31
|
+
Requires-Dist: trimesh==5.2.0
|
|
32
|
+
Requires-Dist: usd-core==26.11
|
|
33
|
+
Requires-Dist: usd-profiles-nvidia==1.22.0
|
|
34
|
+
Requires-Dist: usd-validation-nvidia==1.22.0
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
<h1 align="center">
|
|
38
|
+
<picture>
|
|
39
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/serionist/simready-forge/main/docs/assets/logo-dark.svg">
|
|
40
|
+
<img src="https://raw.githubusercontent.com/serionist/simready-forge/main/docs/assets/logo.svg" alt="simready-forge" width="520">
|
|
41
|
+
</picture>
|
|
42
|
+
</h1>
|
|
43
|
+
|
|
44
|
+
<p align="center"><b>Type what you want, or attach a photo. Get an NVIDIA SimReady asset that simulates.</b></p>
|
|
45
|
+
|
|
46
|
+
<p align="center">
|
|
47
|
+
<a href="https://github.com/serionist/simready-forge/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/serionist/simready-forge/actions/workflows/ci.yml/badge.svg?branch=main"></a>
|
|
48
|
+
<a href="https://github.com/serionist/simready-forge/actions/workflows/codeql.yml"><img alt="CodeQL" src="https://github.com/serionist/simready-forge/actions/workflows/codeql.yml/badge.svg?branch=main"></a>
|
|
49
|
+
<a href="https://github.com/serionist/simready-forge/blob/main/LICENSE"><img alt="Licence: MIT" src="https://img.shields.io/badge/licence-MIT-007ec6"></a>
|
|
50
|
+
<a href="https://www.python.org/"><img alt="Python 3.12 | 3.13" src="https://img.shields.io/badge/python-3.12%20%7C%203.13-3776ab?logo=python&logoColor=white"></a>
|
|
51
|
+
<a href="https://docs.anthropic.com/en/docs/claude-code"><img alt="Claude Code plugin" src="https://img.shields.io/badge/Claude%20Code-plugin-d97757"></a>
|
|
52
|
+
<a href="#how-an-asset-is-checked"><img alt="SimReady: Robotics-Prop 4.0.0" src="https://img.shields.io/badge/SimReady-Robotics--Prop%204.0.0-1f7a8c"></a>
|
|
53
|
+
<a href="https://openusd.org/"><img alt="OpenUSD" src="https://img.shields.io/badge/OpenUSD-26.11-4a4a4a"></a>
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
<p align="center">
|
|
57
|
+
<img src="https://raw.githubusercontent.com/serionist/simready-forge/main/docs/assets/showcase.jpg" alt="Eight assets made by simready-forge: a desk lamp, a rangefinder camera, a bottle, a nightstand, a running shoe, a pipe pile, a cable drum and a barricade" width="100%">
|
|
58
|
+
<br><sub>Eight assets made in Max mode, rendered in Isaac Sim by the review that checks them.</sub>
|
|
59
|
+
</p>
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
/simready-forge:make a 180 mm desk lamp with an adjustable arm, a weighted base and a translucent shade
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
A Claude Code plugin and a Python kit. One prompt or photo in; out comes:
|
|
66
|
+
|
|
67
|
+
- **OpenUSD** (NVIDIA SimReady, Robotics-Prop 4.0.0) with real dimensions, materials and physics
|
|
68
|
+
- **Every joint the real object has**, driven and measured in Isaac Sim
|
|
69
|
+
- **URDF and GLB** exports, a report, and the build script to tweak and rerun
|
|
70
|
+
|
|
71
|
+
<p align="center">
|
|
72
|
+
<img src="https://raw.githubusercontent.com/serionist/simready-forge/main/docs/assets/joints.webp" alt="A desk lamp, a camera, a nightstand and a barricade, at rest and with every joint driven" width="80%">
|
|
73
|
+
<br><sub>At rest, then every joint driven: the review watches each mechanism move.</sub>
|
|
74
|
+
</p>
|
|
75
|
+
|
|
76
|
+
## How it works
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
flowchart LR
|
|
80
|
+
R["Prompt or photo"] --> S["Spec<br/>parts, joints,<br/>materials"]
|
|
81
|
+
S --> B["Builder<br/>build123d + kit,<br/>or TRELLIS.2"]
|
|
82
|
+
B --> V["NVIDIA validator"]
|
|
83
|
+
V --> I["Isaac Sim review<br/>every joint driven"]
|
|
84
|
+
I --> C["Critics + refuter"]
|
|
85
|
+
C -- "findings" --> B
|
|
86
|
+
C -- "clean" --> P["Package + report"]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Mode | What runs |
|
|
90
|
+
|---|---|
|
|
91
|
+
| **Quick** | one builder, one fix round at most |
|
|
92
|
+
| **Standard** | one builder, then critics and a refuter until clean (≤ 4 rounds) |
|
|
93
|
+
| **Max** | three builders, a blind judge picks one, then Standard on it |
|
|
94
|
+
|
|
95
|
+
Asked once, remembered per session, project or always. Override per run: `mode=max`, `builder=opus`, `effort=high`.
|
|
96
|
+
|
|
97
|
+
## How an asset is checked
|
|
98
|
+
|
|
99
|
+
<p align="center">
|
|
100
|
+
<img src="https://raw.githubusercontent.com/serionist/simready-forge/main/docs/assets/review-sheet.jpg" alt="The Isaac review's contact sheet for a desk lamp: views at rest and with every joint driven, with each joint's measured reach" width="100%">
|
|
101
|
+
<br><sub>The Isaac review's contact sheet: at rest, every joint driven both ways, each joint's reach.</sub>
|
|
102
|
+
</p>
|
|
103
|
+
|
|
104
|
+
| Check | What it does |
|
|
105
|
+
|---|---|
|
|
106
|
+
| NVIDIA validator | [simready-validate](https://pypi.org/project/simready-validate/), profile Robotics-Prop 4.0.0 |
|
|
107
|
+
| Isaac review | RTX renders, every joint driven both ways, settle test |
|
|
108
|
+
| Physics probe | tilt, a hand's push on each part, lift and shake, a box on top |
|
|
109
|
+
| Poses | overlaps, the ground and openings, without Isaac |
|
|
110
|
+
| Critics + refuter | fresh eyes on the renders; every claim checked against the files |
|
|
111
|
+
|
|
112
|
+
## Modes, measured
|
|
113
|
+
|
|
114
|
+
Eight cases (five prompts, three photos), judged the same way:
|
|
115
|
+
|
|
116
|
+
| Mode | Validator | Joint review | Drops (¼ h, 0.5 m) | Probe | Cost per asset |
|
|
117
|
+
|---|:---:|:---:|:---:|:---:|---|
|
|
118
|
+
| Quick, Sonnet builder | 8/8 | 8/8 | 8/8 · 8/8 | 5/8 | $2 – 7 |
|
|
119
|
+
| Quick, Opus builder | 8/8 | 8/8 | 6/8 · 7/8 | 4/8 | $5 – 16 |
|
|
120
|
+
| Standard, Sonnet builder | 8/8 | 8/8 | 8/8 · 7/8 | 4/8 | $7 – 26 |
|
|
121
|
+
| Standard, Opus builder | 8/8 | 8/8 | 7/8 · 7/8 | 5/8 | $15 – 34 |
|
|
122
|
+
| Standard, TRELLIS.2 meshes | 8/8 | 7/8 | 7/8 · 7/8 | 3/8 | $13 – 45 |
|
|
123
|
+
| Max | 8/8 | 8/8 | 7/8 · 8/8 | 4/8 | $21 – 67 |
|
|
124
|
+
|
|
125
|
+
- Quick + Sonnet passes every physics check; the extra rounds buy fidelity.
|
|
126
|
+
- Probe misses are the same in every mode: no joint friction in the kit yet.
|
|
127
|
+
|
|
128
|
+
## Install
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
/plugin marketplace add serionist/simready-forge
|
|
132
|
+
/plugin install simready-forge@simready-forge
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
| You need | For |
|
|
136
|
+
|---|---|
|
|
137
|
+
| [uv](https://docs.astral.sh/uv/) | everything |
|
|
138
|
+
| Isaac Sim 5.x / 6.x + NVIDIA RTX GPU | the review and the probe (else a software preview) |
|
|
139
|
+
| ComfyUI + TRELLIS.2 | generated meshes (optional) |
|
|
140
|
+
|
|
141
|
+
Working on the kit itself? Set `SIMREADY_FORGE_DEV` to your clone.
|
|
142
|
+
|
|
143
|
+
## The kit, by hand
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
from build123d import Box, Pos
|
|
147
|
+
from simready_forge import Asset, validate
|
|
148
|
+
|
|
149
|
+
asset = Asset("storage_box", "simready_assets", label="box", qcode="Q188075", units="mm")
|
|
150
|
+
pine = asset.material("pine", color=(0.78, 0.62, 0.42), density=500, nonvisual=("wood", "none"))
|
|
151
|
+
box, lid = asset.body("box"), asset.body("lid")
|
|
152
|
+
asset.add(box, "box", Pos(0, 0, 150) * Box(400, 300, 300), pine, collider="box")
|
|
153
|
+
asset.add(lid, "lid", Pos(0, 0, 310) * Box(400, 300, 20), pine, collider="box")
|
|
154
|
+
asset.revolute("hinge", box, lid, anchor=(0, 150, 300), axis="X", limits=(-110, 0), hold=1)
|
|
155
|
+
validate(asset.save())
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Docs
|
|
159
|
+
|
|
160
|
+
[Usage](https://github.com/serionist/simready-forge/blob/main/docs/USAGE.md) · [Contributing](https://github.com/serionist/simready-forge/blob/main/CONTRIBUTING.md) · [Security](https://github.com/serionist/simready-forge/blob/main/SECURITY.md) ·
|
|
161
|
+
[Changelog](https://github.com/serionist/simready-forge/blob/main/CHANGELOG.md) · [Releasing](https://github.com/serionist/simready-forge/blob/main/docs/releasing.md)
|
|
162
|
+
|
|
163
|
+
## Licence
|
|
164
|
+
|
|
165
|
+
[MIT](https://github.com/serionist/simready-forge/blob/main/LICENSE). Not affiliated with NVIDIA; SimReady, Omniverse and Isaac Sim are NVIDIA's trademarks.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
simready_forge/__init__.py,sha256=-ptF5l_G03kyzs2kLvLa9argPtYSOH4OJhkaedFAUsU,474
|
|
2
|
+
simready_forge/cli.py,sha256=zyOT0lRQUsLf3-7ruOX6KPKdB1zbNlC37Ak2a11YO_Q,9169
|
|
3
|
+
simready_forge/cost.py,sha256=s1i2_Oea3MwvLCGQXfkL6EkWoweW6T0HbRRwmYYpDL0,4983
|
|
4
|
+
simready_forge/export.py,sha256=X-FfIRrJ6MVyMSN_LrItxDpGn7JxipG8c9krf-sdGRM,7807
|
|
5
|
+
simready_forge/isaac_probe.py,sha256=VIrOVD9DwLJEtfaNVSuivY8bZVoy-GUnhyq6NccM3HQ,38911
|
|
6
|
+
simready_forge/isaac_review.py,sha256=zSJaIddr_L1Sf1CgExt1loFoOBwsjwje3-MBnCXG2XQ,19971
|
|
7
|
+
simready_forge/kit.py,sha256=mJ7p-zKJKlNYmHrbzZazJV8JEXQa8XNEcPUXqT9s2qw,50577
|
|
8
|
+
simready_forge/poses.py,sha256=4zrvX-rWq5IRICtgR1kbeQoc6cO_vf0ggmVHoGmb2LU,14732
|
|
9
|
+
simready_forge/prefs.py,sha256=4siJRRst-SgLUcGsGka-u7rbDgSBozv7bnpfUfLtgE0,4006
|
|
10
|
+
simready_forge/preview.py,sha256=Yrtt3PjSQjP9NYFFvk-HNDqb_guaHl3fwivA75TOLBs,2979
|
|
11
|
+
simready_forge/readback.py,sha256=OLXmx3U7FBCUo5DIJEWnOF0HQgN8dwaBWmTttH12Vyg,7604
|
|
12
|
+
simready_forge/review.py,sha256=KLSQLxsmJVIYLKdgaTYKrLR8hPCHMqMqbI7vGQjMnS0,6780
|
|
13
|
+
simready_forge/scan.py,sha256=ce6nXQPi1cB7_HXuB5J5XzrcCDPG0PcLumEt5mrVK4Q,6188
|
|
14
|
+
simready_forge/trellis.py,sha256=naLKmnbyKGH7pkLp7dN8cFzLKHYMDPHT9QQgyZV6PYA,13854
|
|
15
|
+
simready_forge/validate.py,sha256=OutxD7rEhR7Ywa6toFPXeCY-akYgpYi53mfejiXrh00,2987
|
|
16
|
+
simready_forge/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
simready_forge/examples/cabinet.py,sha256=EpzapRZ3LlP6llG_Z8NJtOfbXH3g3ukZ95rc1lgoO5I,5422
|
|
18
|
+
simready_forge-0.1.0.dist-info/METADATA,sha256=DfixPbmTav21EX0KoKDziT50C41udykzWupc8oWYku4,8371
|
|
19
|
+
simready_forge-0.1.0.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
|
|
20
|
+
simready_forge-0.1.0.dist-info/entry_points.txt,sha256=5ovwqDQHqsLe7TnEs72e_uuTy8yJ9zBZRxX-WHXJCdk,59
|
|
21
|
+
simready_forge-0.1.0.dist-info/licenses/LICENSE,sha256=e2lbWThJjjhKF3ryLKZdVv0ID8xQ1cCu4SR8J8JdopY,1067
|
|
22
|
+
simready_forge-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Soma Osvay
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|