浏览代码

fix scene initialization

Falko Schindler 2 年之前
父节点
当前提交
fef5ee1b1b
共有 3 个文件被更改,包括 25 次插入11 次删除
  1. 10 0
      nicegui/elements/scene.js
  2. 12 7
      nicegui/elements/scene.py
  3. 3 4
      nicegui/elements/scene_object3d.py

+ 10 - 0
nicegui/elements/scene.js

@@ -6,6 +6,7 @@ var orbitControls;
 var texture_loader = new THREE.TextureLoader();
 var stl_loader = new THREE.STLLoader();
 var objects = new Map();
+var is_initialized = false;
 
 const None = null;
 const False = false;
@@ -136,9 +137,18 @@ export default {
     };
     this.$el.onclick = click_handler;
     this.$el.ondblclick = click_handler;
+
+    const sendConnectEvent = () => {
+      if (!is_initialized) this.$emit("connect");
+      else clearInterval(connectInterval);
+    };
+    const connectInterval = setInterval(sendConnectEvent, 100);
   },
 
   methods: {
+    init() {
+      is_initialized = true;
+    },
     create(type, id, parent_id, ...args) {
       let mesh;
       if (type == "group") {

+ 12 - 7
nicegui/elements/scene.py

@@ -1,5 +1,5 @@
 from dataclasses import dataclass
-from typing import Callable, Dict, List, Optional
+from typing import Callable, Dict, List, Optional, Union
 
 from ..element import Element
 from ..vue import register_component
@@ -29,6 +29,11 @@ class SceneCamera:
     up_z: float = 1
 
 
+@dataclass
+class SceneObject:
+    id: str = 'scene'
+
+
 class Scene(Element):
     from .scene_objects import Box as box
     from .scene_objects import Curve as curve
@@ -60,15 +65,15 @@ class Scene(Element):
         super().__init__('scene')
         self._props['width'] = width
         self._props['height'] = height
-        self.objects: Dict[Object3D] = {}
-        self.stack: List[Object3D] = []
-        with self:
-            SceneObject()
+        self.objects: Dict[str, Object3D] = {}
+        self.stack: List[Union[Object3D, SceneObject]] = [SceneObject()]
         self.camera: SceneCamera = SceneCamera()
         self.on('connect', self.handle_connect)
 
-    def handle_connect(self, msg: Dict) -> None:
-        print('CONNECT', msg, flush=True)
+    def handle_connect(self, _) -> None:
+        self.run_method('init')
+        for object in self.objects.values():
+            object.send()
 
     def __len__(self) -> int:
         return len(self.objects)

+ 3 - 4
nicegui/elements/scene_object3d.py

@@ -19,7 +19,7 @@ class Object3D:
         self.name: Optional[str] = None
         self.scene: 'Scene' = globals.client_stack[-1].slot_stack[-1].parent
         self.scene.objects[self.id] = self
-        self.parent: Optional[Object3D] = self.scene.stack[-1] if self.scene.stack else None
+        self.parent: Object3D = self.scene.stack[-1]
         self.args: List = list(args)
         self.color: str = '#ffffff'
         self.opacity: float = 1.0
@@ -32,8 +32,7 @@ class Object3D:
         self.sx: float = 1
         self.sy: float = 1
         self.sz: float = 1
-        if self.parent:
-            self._create()
+        self._create()
 
     def with_name(self, name: str):
         self.name = name
@@ -55,7 +54,7 @@ class Object3D:
         self.scene.stack.pop()
 
     def _create(self) -> None:
-        self.scene.run_method('create', self.type, self.id, self.parent.id, self.args)
+        self.scene.run_method('create', self.type, self.id, self.parent.id, *self.args)
 
     def _material(self) -> None:
         self.scene.run_method('material', self.id, self.color, self.opacity, self.side_)