Vis Automations · Python over OLE/COM
Headless COM Automation
Drives Vis Mockup with no clicks through its COM server VFFrame.Application: open a JT, read the tree, find, measure, read metadata, set the camera, snapshot, section, show PMI, capture and export.
Verification passing on Vis 2606.0 build 26134 + 2606.2610 · 2026-10-29 · repo tc-vis-automation 684255a
One Vis session, no clicks, about 35 s, one VisView session, no clicks, against the examples Vis installs. Each task asserts on a value read back from Vis, on the bytes of a written file, or on a pixel difference between captures. The captures were also inspected by eye. Command: python tools/vis_validate.py --out out/validate.
- Vis
- 2606.0 build 26134 + 2606.2610
- Run
- 2026-10-29 · EXERCISED
- Checks
- 12 of 12 hold
- Overall
- All checks hold
- Source
- tc-vis-automation README.md (Multi-task validation, Smoke test, Status) and tools/vis_validate.py, repo commit 684255a
| Result | Check |
|---|---|
| Holds | AttachVersion read back: 2606.0 build 26134. Dynamic dispatch; makepy refuses VFFrame (no type info). |
| Holds | Open 2_Cylinder_Engine.jt and render67 nodes visible, geometry in the capture. |
| Holds | Find nodesCADID round-trip returns the same node; Find(ALL_PARTS, PARTS, "I-DEAS Part Number", EQUAL, "123-006") returns 4; a fake value returns 0. |
| Holds | BBox and physical propertiesRoot BBox max > min on all axes; part area and volume > 0; centroid inside its BBox. |
| Holds | Metadata14 properties on a part; GetProperty(i) and GetPropertyByName agree. |
| Holds | Hide all / isolate one partAllNodesOff gives 0 visible and a blank capture; one part shown renders alone. |
| Holds | CameraSetCameraPosition to iso, read back; capture differs from front by 17% of pixels. |
| Holds | SnapshotCount 0 to 1, named "Snapshot 1". |
| Holds | Cross-sectionNear / far clipping cut the render (9% / 5% pixel change); DeleteAllSections restores it exactly. |
| Holds | ExportPLMXML 140 KB with 81 instances; JT with a Version header; STEP 104 KB ISO-10303-21 from XTBlock.jt. |
| Holds | PMI on 1_PMI_Block.jt64 entities; Hide() / Show() change the render (inspected: callouts on vs off). |
| Holds | QuitNo VisView process left. |
Smoke test
Pass python tools/vis_smoke.py <model.jt> --out out --minimize. PASS on the installed example 2_Cylinder_Engine.jt, plain and --minimize, about 22 s each: 67 nodes visible, 12% of pixels geometry, no VisView process after Quit().
Why pixels and not file size: a blank capture is a valid PNG of about 4.5 KB, so size and PNG magic both pass on it. The tests count pixels unlike the background instead (blank control 0.0, engine 0.12).