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
Metadata
Release files for refast_vtk_js 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| refast_vtk_js-0.3.1.tar.gz | 62.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| refast_vtk_js-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 581.0 kB
Release files / refast_vtk_js-0.3.1.tar.gz
| Download URL | refast_vtk_js-0.3.1.tar.gz |
|---|---|
| Size | 62.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7f61001d2dc5c51d6dcd3a6c3c7821f94c5dcb02493537342f65d79d6c7a8e98
|
|
BLAKE2b-256 checksum How to use checksums |
32c01c4f2f2b13f2a0af6444fa09087730b4ee75d8a87cc2a4fd96e4ad0bc237
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / refast_vtk_js-0.3.1-py3-none-any.whl
| Download URL | refast_vtk_js-0.3.1-py3-none-any.whl |
|---|---|
| Size | 518.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bf4f60afa312177e661d3b9c144f37a3ea8c7cb2f362553301af9324b69ce8c2
|
|
BLAKE2b-256 checksum How to use checksums |
a5436829e88bed6885027fa70d5732aa93a0bb1deb1037cb15ad632743f3e808
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Security for refast_vtk_js 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.