The C2F4DT console is a lightweight, Abaqus-style interactive Python terminal built into the UI. It lets you:
- Inspect objects in the current scene (viewer, datasets, treeMCTS).
- Query VTK/PyVista data (points, cells, arrays).
- Batch operations: styling, screenshots, exports.
- Run quick scripts with a persistent namespace.
Tip: Press TAB for autocompletion. Use Shift+Enter to insert a newline without executing.
# Get common objects from the live contextwindow# MainWindow instanceviewer=window.viewer3dmct# Current dataset record (dict)mcts# All dataset records (dict[str, dict])# Current dataset index and recordds=window._current_dataset_index()rec=viewer._datasets[ds]# Switch representation / color modeviewer.set_mesh_representation(ds,"Surface with Edges")viewer.set_color_mode("Solid Color",ds)viewer.set_color_mode("PointData/displacement",ds)# then choose vector mode in UI# Change visualsviewer.set_mesh_opacity(ds,60)# 0..100viewer.set_point_size(5,ds)viewer.set_line_width(ds,2)viewer.set_edge_visibility(ds,True)viewer.set_edge_color(ds,0,0,0)viewer.set_scalar_bar_visible(ds,True)# Fit camera & screenshotviewer.view_fit()viewer.save_screenshot("scene.png")# File system magics%pwd%ls*.vtk%cdpath/to/data%runmy_script.py%clear
# Inspect current dataset and its arraysds=window._current_dataset_index()rec=window.viewer3d._datasets[ds]# internal record# Prefer the renderable surface (PolyData) for visualizationpdata=rec.get("mesh_surface")orrec.get("mesh")orrec.get("pdata")orrec.get("full_pdata")print("Dataset keys:",list(rec.keys()))print("n_points =",getattr(pdata,"n_points",None)," n_cells =",getattr(pdata,"n_cells",None))print("PointData arrays:",list(getattr(pdata,"point_data",{}).keys()))print("CellData arrays:",list(getattr(pdata,"cell_data",{}).keys()))
importnumpyasnpimportcsvdefexport_point_magnitude(array_name:str,csv_path:str)->None:# Export the vector magnitude of a PointData array to CSVds=window._current_dataset_index()rec=window.viewer3d._datasets[ds]src=rec.get("mesh_orig")orrec.get("mesh")orrec.get("pdata")orrec.get("full_pdata")arr=np.asarray(src.point_data[array_name])ifarr.ndim!=2orarr.shape[1]notin(2,3):raiseValueError(f"{array_name} is not a 2D vector array")mag=np.linalg.norm(arr,axis=1)withopen(csv_path,"w",newline="")asf:w=csv.writer(f)w.writerow(["point_id",f"{array_name}_magnitude"])fori,vinenumerate(mag):w.writerow([i,float(v)])export_point_magnitude("displacement","displacement_mag.csv")print("Saved: displacement_mag.csv")
3) Color the mesh by displacement magnitude from the console¶
frompathlibimportPathdefbatch_screenshots(out_dir:str="_shots")->None:reps=["Surface","Surface with Edges","Wireframe","Points"]Path(out_dir).mkdir(exist_ok=True)ds=window._current_dataset_index()forrinreps:window.viewer3d.set_mesh_representation(ds,r)window.viewer3d.view_fit()path=str(Path(out_dir)/f"{r.replace(' ','_')}.png")window.viewer3d.save_screenshot(path)print("[saved]",path)batch_screenshots()
5) Extract displacement X/Y/Z to Pandas (optional)¶
importnumpyasnpimportpandasaspddefpoint_components_to_dataframe(array_name:str)->"pd.DataFrame":ds=window._current_dataset_index()rec=window.viewer3d._datasets[ds]src=rec.get("mesh_orig")orrec.get("mesh")orrec.get("pdata")orrec.get("full_pdata")vec=np.asarray(src.point_data[array_name])ifvec.ndim!=2orvec.shape[1]notin(2,3):raiseValueError("Not a vector array")cols=["X","Y"]ifvec.shape[1]==2else["X","Y","Z"]returnpd.DataFrame(vec,columns=cols)df=point_components_to_dataframe("displacement")df.describe()
defset_pretty_style(ds:int)->None:viewer=window.viewer3dviewer.set_mesh_representation(ds,"Surface with Edges")viewer.set_mesh_opacity(ds,100)viewer.set_edge_visibility(ds,True)viewer.set_edge_color(ds,0,0,0)viewer.set_point_size(3,ds)viewer.set_line_width(ds,1)viewer.view_fit()viewer.view_render()set_pretty_style(window._current_dataset_index())
This guide corresponds to the version where:
- PointData → surface mapping was added (via vtkOriginalPointIds + KDTree fallback).
- LUT normalization and scalar array robustness were improved.