Vis Automations · Reference
Traps
Every trap found while automating Vis 2606, in one place. Each was hit in a real run on 2026-10-29 unless the row says DERIVED. Most of them are calls that succeed and do nothing, which is why every check on this site reads the result back.
| Area | Trap |
|---|---|
| Rendering | A fresh open renders nothingStraight after OpenDocument, NumVisibleNodes is 0 and CaptureImage writes a valid ~4.5 KB PNG: white, with only the axis triad. It passes PNG-magic and file-size checks. Call AllNodesOn() before FitAll(), and verify a capture by counting pixels unlike the background (blank control 0.0, engine 0.12). A model opened from the GUI shows the same until AllNodesOn(). |
| Rendering | NumLoadedNodes is not a load signal67 on the first launch, then 0 for a full 60 s on later launches while the same model rendered correctly. Never wait or gate on it. |
| Node tree | Node lists are NumNodes + Node(i)Zero-based, as in the shipped FindExample.py. .Count and .Item raise AttributeError. |
| Find | Find takes the metadata key without the :: suffixGetProperty shows "I-DEAS Part Number::"; Find wants "I-DEAS Part Number". Name, Name:: and PrintableName returned 0 for a part that exists, so a zero from Find proves nothing alone: pair it with a property you know matches. |
| Sections | A new section does not cutCreateSection leaves Clipping at 0 and only the plane outline changes the render. Set Clipping = 1 (near) or 2 (far); both read back. The names CS_CLIP_NONE / NEAR / FAR / BOTH are documented but ENUMS.INC gives no values (0 to 3 is DERIVED). |
| Export | STEP from a tessellated-only JT writes nothing and raises nothingThe engine example gave no file and no exception; the B-rep XTBlock.jt gave a 104 KB ISO-10303-21 file. Always check the file exists and read its header. |
| Dispatch | Out-parameter methods work under plain dynamic dispatchGetPhysicalProperties() returns (area, volume, centroid), GetCameraPosition() returns (up, lookAt, eye), GetProperty(i) returns (name, value). Corrected the same day: an earlier note said typed gencache.EnsureDispatch was required. It is not; makepy refuses VFFrame (no type info). |
| Dispatch | GetActiveObject fails, Dispatch attachesVis is not in the running-object table, so GetActiveObject("VFFrame.Application") fails. Dispatch("VFFrame.Application") reaches the running session (same VisView_NG pid before and after) rather than starting a new one. |
| Dispatch | A headless script can hijack the user’s open VisBecause Dispatch attaches, a probe run loaded a model into a session someone had open, and its Quit() raised “save session before closing?”. vis_smoke, vis_validate, vis_census and the Fastener Stacks test now refuse to run while VisView or VisView_NG is running (control: both refused with Vis open). |
| Process | VisView.exe is a launcher that exitsThe GUI session runs as VisView_NG.exe. Count and watch that process, not VisView.exe. |
| Selection | Selecting a body raises a blocking modalSelection, visibility and color must target the instance (a body’s Parent). Selecting a body raises a modal “Selection/Visibility Error” that blocks every later COM call. |
| Selection | Node.Selected = True replaces the selectionBuild a multi-node selection with AppendNode on an empty SelectedNodes list. |
| Color | Group.Material reads back right but renders wrongAcross families, a blue group drew magenta and a bolt inside a green stack drew blue. Color each instance’s BasicMaterial instead (about 0.1 s each). |
| Rendering | Whole-assembly views do not draw sub-pixel partsRivets 1 to 2 px across over a 122 in flap render as nothing, so a fastener-only whole-model capture looks blank. Check colors zoomed per stack. |
| Geometry | GlobalTransformation is row-majorThe translation is in elements 12 to 14. |
| Performance | Walking every body is slowVisiting bodies cost about 29k COM calls and 288 s on a 3,615-body wing flap. Walking instances from the root brought it to 134 s. |
| Process | OpenDocument fails once right after a force-ended VisRetry after a few seconds. |
| Automation Scripts | Use New Script, not LoadThe Manage Scripts root right-click menu is Load / Save / New Group / New Script / Expand All / Delete all. Load expects a profile XML; pointing it at a .py gives “Error in loading script profile file”. |
| Automation Scripts | Never press Enter while driving the Manage Scripts dialogWith no profile known, OK raises a Save As for the profile XML. It opened invisibly behind another window and left Vis disabled until the process was ended. |
| Automation Scripts | The registry registration does not loadA FileLocation key under HKCU, in both the VisView and VisView_Retained roots, with Vis restarted, left the menu showing only Manage Scripts... . The mechanism was DERIVED from strings in VisLinkList.dll; as written it is disproven. HKLM is untested. Adding through the dialog does work and persists across restarts. |
| Environment | python -I cannot import win32comWhen pywin32 lives in user site-packages, isolated mode hides it. |
| Environment | ShowState has no enum in ENUMS.INCThe smoke script assumes Win32 SW_SHOWMINNOACTIVE = 7. The capture still renders with it set; whether the window actually minimized was not observed. |
| Environment | The HTML / VBScript samples are deadThey need IE11, which Windows 11 does not run. Use the Python samples or .NET. |
Sources: tc-vis-automation README.md and commits 05447c0, 684255a, 9f1b0af; inapp/fastener_stacks.py; the tc-visualization-headless skill in tc-automation-skills.