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
ResultCheck
HoldsAttachVersion read back: 2606.0 build 26134. Dynamic dispatch; makepy refuses VFFrame (no type info).
HoldsOpen 2_Cylinder_Engine.jt and render67 nodes visible, geometry in the capture.
HoldsFind 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.
HoldsBBox and physical propertiesRoot BBox max > min on all axes; part area and volume > 0; centroid inside its BBox.
HoldsMetadata14 properties on a part; GetProperty(i) and GetPropertyByName agree.
HoldsHide all / isolate one partAllNodesOff gives 0 visible and a blank capture; one part shown renders alone.
HoldsCameraSetCameraPosition to iso, read back; capture differs from front by 17% of pixels.
HoldsSnapshotCount 0 to 1, named "Snapshot 1".
HoldsCross-sectionNear / far clipping cut the render (9% / 5% pixel change); DeleteAllSections restores it exactly.
HoldsExportPLMXML 140 KB with 81 instances; JT with a Version header; STEP 104 KB ISO-10303-21 from XTBlock.jt.
HoldsPMI on 1_PMI_Block.jt64 entities; Hide() / Show() change the render (inspected: callouts on vs off).
HoldsQuitNo VisView process left.
Cross-section: clipping on, the render cut (headless).
PMI on 1_PMI_Block.jt: callouts shown (headless).

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).