scene_documentation.py 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from nicegui import ui
  2. from ...model import UiElementDocumentation
  3. class SceneDocumentation(UiElementDocumentation, element=ui.scene):
  4. def main_demo(self) -> None:
  5. with ui.scene().classes('w-full h-64') as scene:
  6. scene.sphere().material('#4488ff')
  7. scene.cylinder(1, 0.5, 2, 20).material('#ff8800', opacity=0.5).move(-2, 1)
  8. scene.extrusion([[0, 0], [0, 1], [1, 0.5]], 0.1).material('#ff8888').move(-2, -2)
  9. with scene.group().move(z=2):
  10. scene.box().move(x=2)
  11. scene.box().move(y=2).rotate(0.25, 0.5, 0.75)
  12. scene.box(wireframe=True).material('#888888').move(x=2, y=2)
  13. scene.line([-4, 0, 0], [-4, 2, 0]).material('#ff0000')
  14. scene.curve([-4, 0, 0], [-4, -1, 0], [-3, -1, 0], [-3, -2, 0]).material('#008800')
  15. logo = 'https://avatars.githubusercontent.com/u/2843826'
  16. scene.texture(logo, [[[0.5, 2, 0], [2.5, 2, 0]],
  17. [[0.5, 0, 0], [2.5, 0, 0]]]).move(1, -2)
  18. teapot = 'https://upload.wikimedia.org/wikipedia/commons/9/93/Utah_teapot_(solid).stl'
  19. scene.stl(teapot).scale(0.2).move(-3, 4)
  20. scene.text('2D', 'background: rgba(0, 0, 0, 0.2); border-radius: 5px; padding: 5px').move(z=2)
  21. scene.text3d('3D', 'background: rgba(0, 0, 0, 0.2); border-radius: 5px; padding: 5px').move(y=-2).scale(.05)
  22. def more(self) -> None:
  23. @self.demo('Handling Click Events', '''
  24. You can use the `on_click` argument to `ui.scene` to handle click events.
  25. The callback receives a `SceneClickEventArguments` object with the following attributes:
  26. - `click_type`: the type of click ("click" or "dblclick").
  27. - `button`: the button that was clicked (1, 2, or 3).
  28. - `alt`, `ctrl`, `meta`, `shift`: whether the alt, ctrl, meta, or shift key was pressed.
  29. - `hits`: a list of `SceneClickEventHit` objects, sorted by distance from the camera.
  30. The `SceneClickEventHit` object has the following attributes:
  31. - `object_id`: the id of the object that was clicked.
  32. - `object_name`: the name of the object that was clicked.
  33. - `x`, `y`, `z`: the x, y and z coordinates of the click.
  34. ''')
  35. def click_events() -> None:
  36. from nicegui import events
  37. def handle_click(e: events.SceneClickEventArguments):
  38. hit = e.hits[0]
  39. name = hit.object_name or hit.object_id
  40. ui.notify(f'You clicked on the {name} at ({hit.x:.2f}, {hit.y:.2f}, {hit.z:.2f})')
  41. with ui.scene(width=285, height=220, on_click=handle_click) as scene:
  42. scene.sphere().move(x=-1, z=1).with_name('sphere')
  43. scene.box().move(x=1, z=1).with_name('box')
  44. @self.demo('Draggable objects', '''
  45. You can make objects draggable using the `.draggable` method.
  46. There is an optional `on_drag_start` and `on_drag_end` argument to `ui.scene` to handle drag events.
  47. The callbacks receive a `SceneDragEventArguments` object with the following attributes:
  48. - `type`: the type of drag event ("dragstart" or "dragend").
  49. - `object_id`: the id of the object that was dragged.
  50. - `object_name`: the name of the object that was dragged.
  51. - `x`, `y`, `z`: the x, y and z coordinates of the dragged object.
  52. You can also use the `drag_constraints` argument to set comma-separated JavaScript expressions
  53. for constraining positions of dragged objects.
  54. ''')
  55. def draggable_objects() -> None:
  56. from nicegui import events
  57. def handle_drag(e: events.SceneDragEventArguments):
  58. ui.notify(f'You dropped the sphere at ({e.x:.2f}, {e.y:.2f}, {e.z:.2f})')
  59. with ui.scene(width=285, height=220,
  60. drag_constraints='z = 1', on_drag_end=handle_drag) as scene:
  61. sphere = scene.sphere().move(z=1).draggable()
  62. ui.switch('draggable sphere',
  63. value=sphere.draggable_,
  64. on_change=lambda e: sphere.draggable(e.value))
  65. @self.demo('Rendering point clouds', '''
  66. You can render point clouds using the `point_cloud` method.
  67. The `points` argument is a list of point coordinates, and the `colors` argument is a list of RGB colors (0..1).
  68. ''')
  69. def point_clouds() -> None:
  70. import numpy as np
  71. with ui.scene().classes('w-full h-64') as scene:
  72. x, y = np.meshgrid(np.linspace(-3, 3), np.linspace(-3, 3))
  73. z = np.sin(x) * np.cos(y) + 1
  74. points = np.dstack([x, y, z]).reshape(-1, 3)
  75. scene.point_cloud(points=points, colors=points, point_size=0.1)