Pārlūkot izejas kodu

add object name; objects as dict instead of list; renaming

Falko Schindler 3 gadi atpakaļ
vecāks
revīzija
310bc907ce

+ 8 - 4
nicegui/elements/scene.js

@@ -39,7 +39,7 @@ Vue.component("scene", {
       new THREE.MeshPhongMaterial({ color: "#eee" })
     );
     ground.translateZ(-0.01);
-    ground.name = "ground";
+    ground.object_id = "ground";
     scene.add(ground);
 
     const grid = new THREE.GridHelper(100, 100);
@@ -67,10 +67,13 @@ Vue.component("scene", {
         id: this.$props.jp_props.id,
         page_id: page_id,
         websocket_id: websocket_id,
-        objects: raycaster
+        hits: raycaster
           .intersectObjects(scene.children, true)
-          .filter((o) => o.object.name)
-          .map((o) => ({ name: o.object.name, point: o.point })),
+          .filter((o) => o.object.object_id)
+          .map((o) => ({
+            object_id: o.object.object_id,
+            point: o.point,
+          })),
         click_type: mouseEvent.type,
         shift_key: mouseEvent.shiftKey,
       };
@@ -196,6 +199,7 @@ Vue.component("scene", {
           mesh = new THREE.Mesh(geometry, material);
         }
       }
+      mesh.object_id = id;
       objects.set(id, mesh);
       objects.get(parent_id).add(objects.get(id));
     },

+ 5 - 3
nicegui/elements/scene.py

@@ -11,13 +11,15 @@ class SceneView(CustomView):
         self.on_click = on_click
         self.allowed_events = ['onConnect', 'onClick']
         self.initialize(temp=False, onConnect=self.handle_connect, onClick=self.handle_click)
-        self.objects = []
+        self.objects = {}
 
     def handle_connect(self, msg):
-        for object in self.objects:
+        for object in self.objects.values():
             object.send_to(msg.websocket)
 
     def handle_click(self, msg):
+        for hit in msg.hits:
+            hit.object = self.objects.get(hit.object_id)
         if self.on_click is not None:
             return self.on_click(msg)
         return False
@@ -49,7 +51,7 @@ class Scene(Element):
 
     def __enter__(self):
         self.view_stack.append(self.view)
-        scene = self.view.objects[0] if self.view.objects else SceneObject(self.view)
+        scene = self.view.objects.get('scene', SceneObject(self.view))
         Object3D.stack.clear()
         Object3D.stack.append(scene)
         return self

+ 7 - 2
nicegui/elements/scene_object3d.py

@@ -12,6 +12,7 @@ class Object3D:
     def __init__(self, type: str, *args):
         self.type = type
         self.id = str(uuid.uuid4())
+        self.name = None
         self.parent = self.stack[-1]
         self.view = self.parent.view
         self.args = args
@@ -22,7 +23,11 @@ class Object3D:
         self.z = 0
         self.R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
         self.run_command(self._create_command)
-        self.view.objects.append(self)
+        self.view.objects[self.id] = self
+
+    def with_name(self, name: str) -> Object3D:
+        self.name = name
+        return self
 
     def run_command(self, command: str, socket=None):
         sockets = [socket] if socket else WebPage.sockets.get(Element.wp.page_id, {}).values()
@@ -88,5 +93,5 @@ class Object3D:
         return self
 
     def delete(self):
-        self.view.objects = [obj for obj in self.view.objects if obj != self]
+        del self.view.objects[self.id]
         self.run_command(self._delete_command)