Refast extension for vtk
Project description
refast-vtk-js
3D visualization extension for Refast powered by react-vtk-js.
A Refast extension that provides VTK.js components for interactive 3D visualization in web applications.
Features
- View Components:
View,MultiViewRootfor creating 3D scenes - Representations:
GeometryRepresentation,VolumeRepresentation,SliceRepresentationfor different visualization modes - Data Components:
PolyData,ImageData,DataArrayfor defining geometry and data - Algorithms:
Algorithm,Readerfor data processing and file loading - Interaction:
Pickingfor mouse-based selection - Data Sharing:
ShareDataSetRoot,RegisterDataSet,UseDataSetfor efficient data reuse
Installation
pip install refast-vtk-js
Usage
Basic 3D Triangle
from fastapi import FastAPI
from refast import RefastApp, Context
from refast.components import Container
from refast_vtk_js import View, GeometryRepresentation, PolyData
ui = RefastApp(title="VTK.js Demo")
@ui.page("/")
def home(ctx: Context):
return Container(
children=[
View(
background=[0.2, 0.3, 0.4],
style={"width": "100%", "height": "400px"},
children=[
GeometryRepresentation(
property={"color": [1, 0, 0]},
children=[
PolyData(
points=[0, 0, 0, 1, 0, 0, 0.5, 1, 0],
connectivity="triangles"
)
]
)
]
)
]
)
app = FastAPI()
app.include_router(ui.router)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
Using VTK Algorithms (Cone, Sphere, etc.)
from refast_vtk_js import View, GeometryRepresentation, Algorithm
View(
style={"width": "100%", "height": "400px"},
children=[
GeometryRepresentation(
children=[
Algorithm(
vtk_class="vtkConeSource",
state={
"height": 2.0,
"radius": 0.5,
"resolution": 60
}
)
]
)
]
)
Volume Rendering
from refast_vtk_js import View, VolumeRepresentation, ImageData, PointData, DataArray
# Create a 10x10x10 volume with scalar data
dimensions = [10, 10, 10]
values = [i / 1000 for i in range(10 * 10 * 10)] # Scalar values
View(
style={"width": "100%", "height": "400px"},
children=[
VolumeRepresentation(
color_map_preset="Cool to Warm",
children=[
ImageData(
dimensions=dimensions,
spacing=[1, 1, 1],
origin=[0, 0, 0],
children=[
PointData(
children=[
DataArray(
registration="setScalars",
values=values,
number_of_components=1
)
]
)
]
)
]
)
]
)
Loading 3D Models from URL
from refast_vtk_js import View, GeometryRepresentation, Reader
View(
style={"width": "100%", "height": "400px"},
children=[
GeometryRepresentation(
children=[
Reader(
vtk_class="vtkOBJReader",
url="https://example.com/model.obj"
)
]
)
]
)
Interactive Picking
from refast_vtk_js import View, GeometryRepresentation, PolyData, Picking
async def handle_click(ctx):
selection = ctx.event_data.get("selection", {})
world_pos = selection.get("worldPosition")
print(f"Clicked at world position: {world_pos}")
View(
style={"width": "100%", "height": "400px"},
children=[
Picking(
on_click=ctx.callback(handle_click),
pointer_size=5
),
GeometryRepresentation(
children=[
PolyData(
points=[0, 0, 0, 1, 0, 0, 0.5, 1, 0],
connectivity="triangles"
)
]
)
]
)
Sharing Data Between Views
from refast_vtk_js import (
ShareDataSetRoot, RegisterDataSet, UseDataSet,
View, GeometryRepresentation, PolyData
)
ShareDataSetRoot(
children=[
# Register the shared data
RegisterDataSet(
dataset_id="shared-mesh",
children=[
PolyData(
points=[0, 0, 0, 1, 0, 0, 0.5, 1, 0],
connectivity="triangles"
)
]
),
# First view
View(
style={"width": "50%", "height": "300px"},
children=[
GeometryRepresentation(
property={"color": [1, 0, 0]},
children=[UseDataSet(dataset_id="shared-mesh")]
)
]
),
# Second view using same data
View(
style={"width": "50%", "height": "300px"},
children=[
GeometryRepresentation(
property={"color": [0, 0, 1]},
children=[UseDataSet(dataset_id="shared-mesh")]
)
]
)
]
)
Draggable Annotations with Lines
You can add interactive 3D annotations (either singular or plural) that display HTML cards anchored at 3D world coordinates. If draggable=True is set, cards can be moved in screen space, and their updated coordinates will be unprojected back into 3D world space. Fired release events can update state via Python callbacks.
from refast.components import Container, Text
from refast_vtk_js import View, Annotation, Annotations
async def handle_annotation_drag(ctx):
pos = ctx.event_data.get("cardPosition")
print(f"Annotation moved to: {pos}")
View(
children=[
# 1. Singular Annotation with custom Refast HTML children and a blue connecting line
Annotation(
position=[0.0, 0.5, 0.0],
card_position=[0.25, 0.75, 0.25],
show_line=True,
line_color="#3b82f6",
line_width=2.0,
draggable=True,
on_card_position_change=ctx.callback(handle_annotation_drag),
anchor="bottom-center",
bg_color="white",
children=[
Container(
class_name="bg-white border rounded p-2 text-black text-xs font-semibold",
children=[Text("Peak Annotation")],
)
]
),
# 2. Plural Annotations with simple text labels
Annotations(
items=[
{
"position": [-0.5, 0.0, 0.0],
"text": "Left Annotation",
"anchor": "right-center",
"bg_color": "rgba(16, 185, 129, 0.9)",
}
],
show_line=True,
line_color="#10b981",
draggable=True,
)
]
)
Available Components
View Components
View- Main 3D view containerMultiViewRoot- Container for multiple synchronized views
Annotation Components
Annotation- Render custom HTML children at a 3D world coordinate (supports dragging, lines, anchors)Annotations- Render multiple text-based overlays at 3D world coordinates (supports dragging, lines, anchors)
Representation Components
GeometryRepresentation- For surfaces, meshes, point cloudsGeometry2DRepresentation- For 2D overlaysVolumeRepresentation- For volume renderingSliceRepresentation- For 2D slices of 3D data
Dataset Components
PolyData- Polygonal geometry (points, lines, triangles)ImageData- Regular 3D grids (volumes)Dataset- Generic VTK dataset wrapper
Data Array Components
DataArray- Attach scalar/vector dataPointData- Container for point-associated arraysCellData- Container for cell-associated arraysFieldData- Container for field data
Algorithm & Reader Components
Algorithm- VTK filters and sourcesReader- File readers for OBJ, STL, VTK, etc.
Interaction Components
Picking- Mouse-based selectionVolumeController- UI for volume transfer functions
Data Sharing Components
ShareDataSetRoot- Root for data sharingRegisterDataSet- Register shared dataUseDataSet- Use registered data
Manual Registration
If auto-discovery doesn't work, you can manually register the extension:
from refast_vtk_js import VtkExtension
ui = RefastApp(
title="VTK Demo",
extensions=[VtkExtension()]
)
Development
Building the Frontend
cd frontend
npm install
npm run build
Watch Mode
npm run dev
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file refast_vtk_js-0.3.1.tar.gz.
File metadata
- Download URL: refast_vtk_js-0.3.1.tar.gz
- Upload date:
- Size: 62.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f61001d2dc5c51d6dcd3a6c3c7821f94c5dcb02493537342f65d79d6c7a8e98
|
|
| MD5 |
f2ca92731b4151b3319e5b6d8ca344bc
|
|
| BLAKE2b-256 |
32c01c4f2f2b13f2a0af6444fa09087730b4ee75d8a87cc2a4fd96e4ad0bc237
|
File details
Details for the file refast_vtk_js-0.3.1-py3-none-any.whl.
File metadata
- Download URL: refast_vtk_js-0.3.1-py3-none-any.whl
- Upload date:
- Size: 518.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf4f60afa312177e661d3b9c144f37a3ea8c7cb2f362553301af9324b69ce8c2
|
|
| MD5 |
f4321f44a6c76c769abbaf29424216c3
|
|
| BLAKE2b-256 |
a5436829e88bed6885027fa70d5732aa93a0bb1deb1037cb15ad632743f3e808
|