From 5b7a1505cff5e918933ab552b32eff0041360cc7 Mon Sep 17 00:00:00 2001 From: Rowland <975945824@qq.com> Date: Fri, 25 Jul 2025 11:04:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=93=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QPanda3D/Helpers/Env_Grid_Maker.py | 279 ++++++++++ QPanda3D/Helpers/__init__.py | 2 + .../Env_Grid_Maker.cpython-312.pyc | Bin 0 -> 16522 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 263 bytes QPanda3D/Panda3DWorld.py | 180 +++++++ QPanda3D/QMouseWatcherNode.py | 41 ++ QPanda3D/QPanda3DWidget.py | 260 ++++++++++ QPanda3D/QPanda3D_Buttons_Translation.py | 52 ++ QPanda3D/QPanda3D_Keys_Translation.py | 486 ++++++++++++++++++ QPanda3D/QPanda3D_Modifiers_Translation.py | 24 + QPanda3D/Tools/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 277 bytes ...rate_qt_to_pd3d_translator.cpython-312.pyc | Bin 0 -> 808 bytes .../Tools/generate_qt_to_pd3d_translator.py | 11 + QPanda3D/__init__.py | 2 + .../__pycache__/Panda3DWorld.cpython-310.pyc | Bin 0 -> 3236 bytes .../__pycache__/Panda3DWorld.cpython-312.pyc | Bin 0 -> 5190 bytes .../QMouseWatcherNode.cpython-310.pyc | Bin 0 -> 1325 bytes .../QMouseWatcherNode.cpython-312.pyc | Bin 0 -> 1903 bytes .../QPanda3DWidget.cpython-310.pyc | Bin 0 -> 5998 bytes .../QPanda3DWidget.cpython-312.pyc | Bin 0 -> 10344 bytes ...anda3D_Buttons_Translation.cpython-310.pyc | Bin 0 -> 1451 bytes ...anda3D_Buttons_Translation.cpython-312.pyc | Bin 0 -> 2632 bytes .../QPanda3D_Keys_Translation.cpython-310.pyc | Bin 0 -> 15724 bytes .../QPanda3D_Keys_Translation.cpython-312.pyc | Bin 0 -> 29279 bytes ...da3D_Modifiers_Translation.cpython-310.pyc | Bin 0 -> 719 bytes ...da3D_Modifiers_Translation.cpython-312.pyc | Bin 0 -> 999 bytes QPanda3D/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 223 bytes QPanda3D/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 297 bytes __pycache__/main.cpython-310.pyc | Bin 24749 -> 25562 bytes core/__pycache__/__init__.cpython-310.pyc | Bin 763 -> 763 bytes .../__pycache__/alvr_streamer.cpython-310.pyc | Bin 11703 -> 11703 bytes .../__pycache__/event_handler.cpython-310.pyc | Bin 10196 -> 10196 bytes .../__pycache__/script_system.cpython-310.pyc | Bin 22926 -> 22926 bytes core/__pycache__/selection.cpython-310.pyc | Bin 21851 -> 22161 bytes core/__pycache__/tool_manager.cpython-310.pyc | Bin 1746 -> 2838 bytes .../vr_input_handler.cpython-310.pyc | Bin 12242 -> 12242 bytes core/__pycache__/vr_manager.cpython-310.pyc | Bin 14273 -> 14273 bytes core/__pycache__/world.cpython-310.pyc | Bin 5960 -> 12349 bytes gui/__pycache__/__init__.cpython-310.pyc | Bin 296 -> 296 bytes gui/__pycache__/gui_manager.cpython-310.pyc | Bin 23114 -> 23138 bytes project/__pycache__/__init__.cpython-310.pyc | Bin 384 -> 384 bytes .../project_manager.cpython-310.pyc | Bin 20122 -> 20122 bytes requirements/environment.yml | 1 + scene/__pycache__/__init__.cpython-310.pyc | Bin 339 -> 339 bytes .../__pycache__/scene_manager.cpython-310.pyc | Bin 18969 -> 20885 bytes ui/__pycache__/__init__.cpython-310.pyc | Bin 485 -> 485 bytes .../interface_manager.cpython-310.pyc | Bin 5723 -> 5834 bytes ui/__pycache__/main_window.cpython-310.pyc | Bin 17946 -> 18309 bytes ui/__pycache__/property_panel.cpython-310.pyc | Bin 9824 -> 33729 bytes ui/__pycache__/widgets.cpython-310.pyc | Bin 10224 -> 10224 bytes 51 files changed, 1340 insertions(+) create mode 100644 QPanda3D/Helpers/Env_Grid_Maker.py create mode 100644 QPanda3D/Helpers/__init__.py create mode 100644 QPanda3D/Helpers/__pycache__/Env_Grid_Maker.cpython-312.pyc create mode 100644 QPanda3D/Helpers/__pycache__/__init__.cpython-312.pyc create mode 100644 QPanda3D/Panda3DWorld.py create mode 100644 QPanda3D/QMouseWatcherNode.py create mode 100644 QPanda3D/QPanda3DWidget.py create mode 100644 QPanda3D/QPanda3D_Buttons_Translation.py create mode 100644 QPanda3D/QPanda3D_Keys_Translation.py create mode 100644 QPanda3D/QPanda3D_Modifiers_Translation.py create mode 100644 QPanda3D/Tools/__init__.py create mode 100644 QPanda3D/Tools/__pycache__/__init__.cpython-312.pyc create mode 100644 QPanda3D/Tools/__pycache__/generate_qt_to_pd3d_translator.cpython-312.pyc create mode 100644 QPanda3D/Tools/generate_qt_to_pd3d_translator.py create mode 100644 QPanda3D/__init__.py create mode 100644 QPanda3D/__pycache__/Panda3DWorld.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/Panda3DWorld.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/QMouseWatcherNode.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/QMouseWatcherNode.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/QPanda3DWidget.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/QPanda3DWidget.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Buttons_Translation.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Buttons_Translation.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-312.pyc create mode 100644 QPanda3D/__pycache__/__init__.cpython-310.pyc create mode 100644 QPanda3D/__pycache__/__init__.cpython-312.pyc diff --git a/QPanda3D/Helpers/Env_Grid_Maker.py b/QPanda3D/Helpers/Env_Grid_Maker.py new file mode 100644 index 00000000..7f0fd0ec --- /dev/null +++ b/QPanda3D/Helpers/Env_Grid_Maker.py @@ -0,0 +1,279 @@ +# -*- coding: utf-8-*- +""" +Module : Env_Grid_Maker +Author : Saifeddine ALOUI + code from Forklift 's code snippet could be found on panda3D's website +Description : + Creates a 3D implementation of grid that shows axes in 3 possible planes + +""" +from panda3d.core import * +from direct.interval.IntervalGlobal import * + +class Env_Grid_Maker: + def __init__(self, XYPlaneShow = True, XZPlaneShow = False, YZPlaneShow = False, endCapLinesShow = True, XSize = 50, YSize = 50, ZSize = 50, gridStep = 10, subdiv = 10): + #Create line objects + self.axisLines = LineSegs() + self.gridLines = LineSegs() + self.subdivLines = LineSegs() + + #Init passed variables + self.XSize = XSize + self.YSize = YSize + self.ZSize = ZSize + self.gridStep = gridStep + self.subdiv = subdiv + + #Init default variables + + #Plane and end cap line visibility (1 is show, 0 is hide) + self.XYPlaneShow = XYPlaneShow + self.XZPlaneShow = XZPlaneShow + self.YZPlaneShow = YZPlaneShow + self.endCapLinesShow = endCapLinesShow + + #Alpha variables for each plane + #self.XYPlaneAlpha = 1 + #self.XZPlaneAlpha = 1 + #self.YZPlaneAlpha = 1 + + #Colors (RGBA passed as a VBase4 object) + self.XAxisColor = VBase4(1, 0, 0, 1) + self.YAxisColor = VBase4(0, 1, 0, 1) + self.ZAxisColor = VBase4(0, 0, 1, 1) + self.gridColor = VBase4(1, 1, 1, 1) + self.subdivColor = VBase4(.35, .35, .35, 1) + + #Line thicknesses (in pixels) + self.axisThickness = 3 + self.gridThickness = 1 + self.subdivThickness = 1 + + + def create(self): + #Set line thicknesses + self.axisLines.setThickness(self.axisThickness) + self.gridLines.setThickness(self.gridThickness) + self.subdivLines.setThickness(self.subdivThickness) + + if(self.XSize != 0): + #Draw X axis line + self.axisLines.setColor(self.XAxisColor) + self.axisLines.moveTo(-(self.XSize), 0, 0) + self.axisLines.drawTo(self.XSize, 0, 0) + + if(self.YSize != 0): + #Draw Y axis line + self.axisLines.setColor(self.YAxisColor) + self.axisLines.moveTo(0, -(self.YSize), 0) + self.axisLines.drawTo(0, self.YSize, 0) + + if(self.ZSize != 0): + #Draw Z axis line + self.axisLines.setColor(self.ZAxisColor) + self.axisLines.moveTo(0, 0, -(self.ZSize)) + self.axisLines.drawTo(0, 0, self.ZSize) + + #Check to see if primary grid lines should be drawn at all + if(self.gridStep != 0): + + #Draw primary grid lines + self.gridLines.setColor(self.gridColor) + + #Draw primary grid lines metering x axis if any x-length + if(self.XSize != 0): + if((self.YSize != 0) and (self.XYPlaneShow)): + #Draw y lines across x axis starting from center moving out + #XY Plane + for x in self.myfrange(0, self.XSize, self.gridStep): + self.gridLines.moveTo(x, -(self.YSize), 0) + self.gridLines.drawTo(x, self.YSize, 0) + self.gridLines.moveTo(-x, -(self.YSize), 0) + self.gridLines.drawTo(-x, self.YSize, 0) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(self.XSize, -(self.YSize), 0) + self.gridLines.drawTo(self.XSize, self.YSize, 0) + self.gridLines.moveTo(-(self.XSize), -(self.YSize), 0) + self.gridLines.drawTo(-(self.XSize), self.YSize, 0) + + if((self.ZSize != 0) and (self.XZPlaneShow)): + #Draw z lines across x axis starting from center moving out + #XZ Plane + for x in self.myfrange(0, self.XSize, self.gridStep): + self.gridLines.moveTo(x, 0, -(self.ZSize)) + self.gridLines.drawTo(x, 0, self.ZSize) + self.gridLines.moveTo(-x, 0, -(self.ZSize)) + self.gridLines.drawTo(-x, 0, self.ZSize) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(self.XSize, 0, -(self.ZSize)) + self.gridLines.drawTo(self.XSize, 0, self.ZSize) + self.gridLines.moveTo(-(self.XSize), 0, -(self.ZSize)) + self.gridLines.drawTo(-(self.XSize), 0, self.ZSize) + + #Draw primary grid lines metering y axis if any y-length + if(self.YSize != 0): + + if((self.YSize != 0) and (self.XYPlaneShow)): + #Draw x lines across y axis + #XY Plane + for y in self.myfrange(0, self.YSize, self.gridStep): + self.gridLines.moveTo(-(self.XSize), y, 0) + self.gridLines.drawTo(self.XSize, y, 0) + self.gridLines.moveTo(-(self.XSize), -y, 0) + self.gridLines.drawTo(self.XSize, -y, 0) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(-(self.XSize), self.YSize, 0) + self.gridLines.drawTo(self.XSize, self.YSize, 0) + self.gridLines.moveTo(-(self.XSize), -(self.YSize), 0) + self.gridLines.drawTo(self.XSize, -(self.YSize), 0) + + if((self.ZSize != 0) and (self.YZPlaneShow)): + #Draw z lines across y axis + #YZ Plane + for y in self.myfrange(0, self.YSize, self.gridStep): + self.gridLines.moveTo(0, y, -(self.ZSize)) + self.gridLines.drawTo(0, y, self.ZSize) + self.gridLines.moveTo(0, -y, -(self.ZSize)) + self.gridLines.drawTo(0, -y, self.ZSize) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(0, self.YSize, -(self.ZSize)) + self.gridLines.drawTo(0, self.YSize, self.ZSize) + self.gridLines.moveTo(0, -(self.YSize), -(self.ZSize)) + self.gridLines.drawTo(0, -(self.YSize), self.ZSize) + + #Draw primary grid lines metering z axis if any z-length + if(self.ZSize != 0): + if((self.XSize != 0) and (self.XZPlaneShow)): + #Draw x lines across z axis + #XZ Plane + for z in self.myfrange(0, self.ZSize, self.gridStep): + self.gridLines.moveTo(-(self.XSize), 0, z) + self.gridLines.drawTo(self.XSize, 0, z) + self.gridLines.moveTo(-(self.XSize), 0, -z) + self.gridLines.drawTo(self.XSize, 0, -z) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(-(self.XSize), 0, self.ZSize) + self.gridLines.drawTo(self.XSize, 0, self.ZSize) + self.gridLines.moveTo(-(self.XSize), 0, -(self.ZSize)) + self.gridLines.drawTo(self.XSize, 0, -(self.ZSize)) + + if((self.YSize != 0) and (self.YZPlaneShow)): + #Draw y lines across z axis + #YZ Plane + for z in self.myfrange(0, self.ZSize, self.gridStep): + self.gridLines.moveTo(0, -(self.YSize), z) + self.gridLines.drawTo(0, self.YSize, z) + self.gridLines.moveTo(0, -(self.YSize), -z) + self.gridLines.drawTo(0, self.YSize, -z) + + if(self.endCapLinesShow): + #Draw endcap lines + self.gridLines.moveTo(0, -(self.YSize), self.ZSize) + self.gridLines.drawTo(0, self.YSize, self.ZSize) + self.gridLines.moveTo(0, -(self.YSize), -(self.ZSize)) + self.gridLines.drawTo(0, self.YSize, -(self.ZSize)) + + #Check to see if secondary grid lines should be drawn + if(self.subdiv != 0): + + #Draw secondary grid lines + self.subdivLines.setColor(self.subdivColor) + + if(self.XSize != 0): + adjustedstep = self.gridStep / self.subdiv + if((self.YSize != 0) and (self.XYPlaneShow)): + #Draw y lines across x axis starting from center moving out + #XY + for x in self.myfrange(0, self.XSize, adjustedstep): + self.subdivLines.moveTo(x, -(self.YSize), 0) + self.subdivLines.drawTo(x, self.YSize, 0) + self.subdivLines.moveTo(-x, -(self.YSize), 0) + self.subdivLines.drawTo(-x, self.YSize, 0) + + if((self.ZSize != 0) and (self.XZPlaneShow)): + #Draw z lines across x axis starting from center moving out + #XZ + for x in self.myfrange(0, self.XSize, adjustedstep): + self.subdivLines.moveTo(x, 0, -(self.ZSize)) + self.subdivLines.drawTo(x, 0, self.ZSize) + self.subdivLines.moveTo(-x, 0, -(self.ZSize)) + self.subdivLines.drawTo(-x, 0, self.ZSize) + + if(self.YSize != 0): + if((self.YSize != 0) and (self.XYPlaneShow)): + #Draw x lines across y axis + #XY + for y in self.myfrange(0, self.YSize, adjustedstep): + self.subdivLines.moveTo(-(self.XSize), y, 0) + self.subdivLines.drawTo(self.XSize, y, 0) + self.subdivLines.moveTo(-(self.XSize), -y, 0) + self.subdivLines.drawTo(self.XSize, -y, 0) + if((self.ZSize != 0) and (self.YZPlaneShow)): + #Draw z lines across y axis + #YZ + for y in self.myfrange(0, self.YSize, adjustedstep): + self.subdivLines.moveTo(0, y, -(self.ZSize)) + self.subdivLines.drawTo(0, y, self.ZSize) + self.subdivLines.moveTo(0, -y, -(self.ZSize)) + self.subdivLines.drawTo(0, -y, self.ZSize) + + if(self.ZSize != 0): + + if((self.XSize != 0) and (self.XZPlaneShow)): + #Draw x lines across z axis + #XZ + for z in self.myfrange(0, self.ZSize, adjustedstep): + self.subdivLines.moveTo(-(self.XSize), 0, z) + self.subdivLines.drawTo(self.XSize, 0, z) + self.subdivLines.moveTo(-(self.XSize), 0, -z) + self.subdivLines.drawTo(self.XSize, 0, -z) + + if((self.YSize != 0) and (self.YZPlaneShow)): + #Draw y lines across z axis + #YZ + for z in self.myfrange(0, self.ZSize, adjustedstep): + self.subdivLines.moveTo(0, -(self.YSize), z) + self.subdivLines.drawTo(0, self.YSize, z) + self.subdivLines.moveTo(0, -(self.YSize), -z) + self.subdivLines.drawTo(0, self.YSize, -z) + + #Create ThreeAxisGrid nodes and nodepaths + #Create parent node and path + self.parentNode = PandaNode('threeaxisgrid-parentnode') + self.parentNodePath = NodePath(self.parentNode) + + #Create axis lines node and path, then reparent + self.axisLinesNode = self.axisLines.create() + self.axisLinesNodePath = NodePath(self.axisLinesNode) + self.axisLinesNodePath.reparentTo(self.parentNodePath) + + #Create grid lines node and path, then reparent + self.gridLinesNode = self.gridLines.create() + self.gridLinesNodePath = NodePath(self.gridLinesNode) + self.gridLinesNodePath.reparentTo(self.parentNodePath) + + #Create subdivision lines node and path then reparent + self.subdivLinesNode = self.subdivLines.create() + self.subdivLinesNodePath = NodePath(self.subdivLinesNode) + self.subdivLinesNodePath.reparentTo(self.parentNodePath) + + return self.parentNodePath + def myfrange(self, start, stop=None, step=None): + if stop is None: + stop = float(start) + start = 0.0 + if step is None: + step = 1.0 + cur = float(start) + while cur < stop: + yield cur + cur += step \ No newline at end of file diff --git a/QPanda3D/Helpers/__init__.py b/QPanda3D/Helpers/__init__.py new file mode 100644 index 00000000..376e08da --- /dev/null +++ b/QPanda3D/Helpers/__init__.py @@ -0,0 +1,2 @@ +name="QPanda3D" +__all__ = ["Env_Grid_Maker"] \ No newline at end of file diff --git a/QPanda3D/Helpers/__pycache__/Env_Grid_Maker.cpython-312.pyc b/QPanda3D/Helpers/__pycache__/Env_Grid_Maker.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23ab32d8543876fd1d233e315bedb79bd2f97b8e GIT binary patch literal 16522 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 literal 0 HcmV?d00001 diff --git a/QPanda3D/Helpers/__pycache__/__init__.cpython-312.pyc b/QPanda3D/Helpers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0b56cb12c9df08b6dcbbe08892c23b7b524f1d1 GIT binary patch literal 263 zcmX@j%ge<81f7?2GjxIUV-N=h7@>^Md_cx@h7^VEF93@h>lqs97iX5F>J}s> zXD6no7VE?8*Y`-xDM&3U){l?R%*!l^kJl@x{Ka9Do1apelWJGQ3A7pHlVTwt@qw9< Xk?{sAe*?=6Zs`kLGL7s->_A}vk3&qx literal 0 HcmV?d00001 diff --git a/QPanda3D/Panda3DWorld.py b/QPanda3D/Panda3DWorld.py new file mode 100644 index 00000000..d26cdb5b --- /dev/null +++ b/QPanda3D/Panda3DWorld.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8-*- +""" +Module : Panda3DWorld +Author : Saifeddine ALOUI +Description : + Inherit this object to create your custom world +""" +import sys +import os + +# 获取 RenderPipelineFile 的路径 +render_pipeline_path = './RenderPipelineFile' +# 将该路径添加到 sys.path 中,确保 Python 能够找到它 +project_root = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, project_root) +sys.path.insert(0, render_pipeline_path) + +# 现在你可以导入 RenderPipelineFile 中的模块了 +# 例如,如果你想导入 RenderPipelineFile 中的 RenderPipeline 模块 +from RenderPipelineFile.rpcore import RenderPipeline +_global_render_pipeline = None + +# PyQt imports +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +# Panda imports +from panda3d.core import * +# from panda3d.core import loadPrcFileData +# loadPrcFileData("", "window-type none") # Set Panda to draw its main window in an offscreen buffer +from direct.showbase.DirectObject import DirectObject +from panda3d.core import GraphicsOutput, Texture, ConfigVariableManager, WindowProperties + +# Set up Panda environment +from direct.showbase.ShowBase import ShowBase +import platform + +# Local imports +from QPanda3D.QMouseWatcherNode import QMouseWatcherNode + +from rpcore.render_target import RenderTarget +__all__ = ["Panda3DWorld"] + +_global_world_instance=None +import builtins + + +class Panda3DWorld(ShowBase): + """ + Panda3DWorld : A class to handle all panda3D world manipulation + """ + + def __init__(self, width=1240, height=720, is_fullscreen=False, size=1.0, clear_color=LVecBase4f(0, 0.5, 0, 1), + name="qpanda3D"): + + global _global_world_instance + global _global_render_pipeline + + _global_world_instance = self + + sort = -100 + self.parent = None + # self.width = width + # self.height = height + + + loadPrcFileData("", "win-size {} {}".format(width, height)) + loadPrcFileData("", "show-frame-rate-meter 0") + loadPrcFileData("", f"win-size {width} {height}") + #loadPrcFileData("", "sync-video #t") + #loadPrcFileData("", "force-flush #t") + + if (is_fullscreen): + loadPrcFileData("", "fullscreen #t") + else: + loadPrcFileData("", "window-type offscreen") # Set Panda to draw its main window in an offscreen buffer + #loadPrcFileData("", "show-frame-rate-meter 0") # 可选 + self.render_pipeline = RenderPipeline() + self.render_pipeline.pre_showbase_init() + + ShowBase.__init__(self) + self.render_pipeline.create(self) + _global_render_pipeline = self.render_pipeline + #from RenderPipelineFile.toolkit.material_editor.main import MaterialEditor + #self.screenTexture = self.render_pipeline._final_stage.target.color_tex + #self.screenTexture.setComponentType(Texture.T_unsigned_byte) + #self.screenTexture.setFormat(Texture.F_rgba8) + + # 创建 Qt 能读的 RGBA8 贴图 + self.qt_output_tex = Texture("qt_output_tex") + self.qt_output_tex.set_format(Texture.F_rgba8) + self.qt_output_tex.set_component_type(Texture.T_unsigned_byte) + #self.screenTexture.set_keep_ram_image(True) + + # 添加到主窗口渲染输出,并指定复制回 CPU + self.win.add_render_texture(self.qt_output_tex, GraphicsOutput.RTM_copy_ram) + + #self.screenTexture = Texture() + #self.screenTexture.setMinfilter(Texture.FTLinear) + #self.screenTexture.setFormat(Texture.FRgba32) + #self.screenTexture.set_wrap_u(Texture.WM_clamp) + #self.screenTexture.set_wrap_v(Texture.WM_clamp) + + # buff_size_x = int(self.win.get_x_size() * size) + # buff_size_y = int(self.win.get_y_size() * size) + # winprops = WindowProperties() + # winprops.set_size(buff_size_x, buff_size_y) + # + # + # props = FrameBufferProperties() + # props.set_rgb_color(True) + # props.set_rgba_bits(8, 8, 8, 8) + # props.set_depth_bits(8) + + # self.buff = self.graphicsEngine.make_output( + # self.pipe, name, sort, + # props, winprops, + # GraphicsPipe.BF_resizeable, + # self.win.get_gsg(), self.win) + + #self.screenTexture = render_pipeline._final_stage.target.color_tex + + #self.buff.addRenderTexture(self.screenTexture, GraphicsOutput.RTMCopyRam) + # self.buff.set_sort(sort) + + + + #self.cam = self.makeCamera(self.buff) + #self.render_pipeline._showbase.cam=self.makeCamera(self.buff) + + #self.render_pipeline._showbase.cam=self.makeCamera(self.buff) + + #self.render_pipeline._showbase.camera.reparentTo(self.render) + #base.camera.reparentTo(self.render) + #self.cam.reparentTo(self.render) # 可选同步 + + #render_pipeline.set_camera(self.cam) + + #添加渲染效果后 + self.cam = self.render_pipeline._showbase.cam + self.camNode = self.cam.node() + self.camLens = self.camNode.get_lens() + self.render_pipeline._showbase.camera = self.render_pipeline._showbase.cam + #self.render_pipeline.daytime_mgr.update() + + # + # if clear_color is None: + # self.buff.set_clear_active(GraphicsOutput.RTPColor, False) + # else: + # self.buff.set_clear_color(clear_color) + # self.buff.set_clear_active(GraphicsOutput.RTPColor, True) + + self.disableMouse() + + def render_pipeline(self): + """获取 RenderPipeline 实例""" + return self._render_pipeline + + + def set_parent(self, parent: QWidget): + self.parent = parent + self.mouseWatcherNode = QMouseWatcherNode(parent) + + def getAspectRatio(self, win = None): + if win is None and self.parent is not None: + return float(self.parent.width()) / float(self.parent.height()) + else: + return super().getAspectRatio(win) + +def get_render_pipeline(): + """获取全局 RenderPipeline 单例""" + if _global_render_pipeline is None: + raise RuntimeError( + "RenderPipeline has not been initialized yet. Please create a Panda3DWorld instance first.") + return _global_render_pipeline + + + + diff --git a/QPanda3D/QMouseWatcherNode.py b/QPanda3D/QMouseWatcherNode.py new file mode 100644 index 00000000..c810df66 --- /dev/null +++ b/QPanda3D/QMouseWatcherNode.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8-*- +""" +Module : QMouseWatcherNode +Author : Niklas Mevenkamp +Description : + This is a MouseWatcherNode implementation that accesses + mouse position and button states through a parent QWidget. +""" + +# PyQt imports +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +# Panda imports +from panda3d.core import * + +__all__ = ["QMouseWatcherNode"] + + +class QMouseWatcherNode(MouseWatcher): + def __init__(self, parent): + super().__init__() + + self.parent = parent + + def getMouse(self, *args, **kwargs): + # map global QCursor pixel position to parent Widget coordinates + pos = self.parent.mapFromGlobal(QCursor.pos()) + + # map absolute pixel positions to relative ones + rel_x = -1 + 2 * pos.x() / self.parent.width() + rel_y = -1 + 2 * pos.y() / self.parent.height() + + # invert y + rel_y = -rel_y + + return LPoint2(rel_x, rel_y) + + def hasMouse(self): + return isinstance(self.parent, QWidget) diff --git a/QPanda3D/QPanda3DWidget.py b/QPanda3D/QPanda3DWidget.py new file mode 100644 index 00000000..f2e5a921 --- /dev/null +++ b/QPanda3D/QPanda3DWidget.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8-*- +""" +Module : QPanda3DWidget +Author : Saifeddine ALOUI +Description : + This is the QWidget to be inserted in your standard PyQt5 application. + It takes a Panda3DWorld object at init time. + You should first create the Panda3DWorkd object before creating this widget. +""" +# PyQt imports +from PyQt5 import QtWidgets, QtGui +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +# Panda imports +from panda3d.core import Texture, WindowProperties, CallbackGraphicsWindow +from panda3d.core import loadPrcFileData + +from QPanda3D.QPanda3D_Buttons_Translation import QPanda3D_Button_translation +from QPanda3D.QPanda3D_Keys_Translation import QPanda3D_Key_translation +from QPanda3D.QPanda3D_Modifiers_Translation import QPanda3D_Modifier_translation + +__all__ = ["QPanda3DWidget"] + + +class QPanda3DSynchronizer(QTimer): + def __init__(self, qPanda3DWidget, FPS=60): + QTimer.__init__(self) + self.qPanda3DWidget = qPanda3DWidget + dt = 1000 / FPS + self.setInterval(int(dt)) + self.timeout.connect(self.tick) + + def tick(self): + taskMgr.step() + self.qPanda3DWidget.update() + + +def get_panda_key_modifiers(evt): + panda_mods = [] + qt_mods = evt.modifiers() + for qt_mod, panda_mod in QPanda3D_Modifier_translation.items(): + if (qt_mods & qt_mod) == qt_mod: + panda_mods.append(panda_mod) + return panda_mods + + +def get_panda_key_modifiers_prefix(evt): + # join all modifiers (except NoModifier, which is None) with '-' + prefix = "-".join([mod for mod in get_panda_key_modifiers(evt) if mod is not None]) + + # if the prefix is not empty, append a '-' + if prefix: + prefix += '-' + + return prefix + + +class QPanda3DWidget(QWidget): + """ + An interactive panda3D QWidget + Parent : Parent QT Widget + FPS : Number of frames per socond to refresh the screen + debug: Switch printing key events to console on/off + """ + + def __init__(self, panda3DWorld, parent=None, FPS=60, debug=False): + QWidget.__init__(self, parent) + self.rp_sync_requested = False + # set fixed geometry + self.panda3DWorld = panda3DWorld + self.panda3DWorld.set_parent(self) + # Setup a timer in Qt that runs taskMgr.step() to simulate Panda's own main loop + # pandaTimer = QTimer(self) + # pandaTimer.timeout.connect() + # pandaTimer.start(0) + + self.setFocusPolicy(Qt.StrongFocus) + + # Setup another timer that redraws this widget in a specific FPS + # redrawTimer = QTimer(self) + # redrawTimer.timeout.connect(self.update) + # redrawTimer.start(1000/FPS) + + self.paintSurface = QPainter() + self.rotate = QTransform() + self.rotate.rotate(180) + self.out_image = QImage() + + size = self.panda3DWorld.cam.node().get_lens().get_film_size() + self.initial_film_size = QSizeF(size.x, size.y) + self.initial_size = self.size() + + self.synchronizer = QPanda3DSynchronizer(self, FPS) + self.synchronizer.start() + + self.debug = debug + + def mousePressEvent(self, evt): + button = evt.button() + try: + b = "{}{}".format(get_panda_key_modifiers_prefix(evt), QPanda3D_Button_translation[button]) + if self.debug: + print(b) + messenger.send(b,[{"x":evt.x(),"y":evt.y()}]) + except: + print("Unimplemented button. Please send an issue on github to fix this problem") + + def mouseMoveEvent(self, evt:QtGui.QMouseEvent): + button = evt.button() + try: + b = "mouse-move" + if self.debug: + print(b) + messenger.send(b,[{"x":evt.x(),"y":evt.y()}]) + except: + print("Unimplemented button. Please send an issue on github to fix this problem") + + + def mouseReleaseEvent(self, evt): + button = evt.button() + try: + b = "{}{}-up".format(get_panda_key_modifiers_prefix(evt), QPanda3D_Button_translation[button]) + if self.debug: + print(b) + messenger.send(b,[{"x":evt.x(),"y":evt.y()}]) + except: + print("Unimplemented button. Please send an issue on github to fix this problem") + + def wheelEvent(self, evt): + delta = evt.angleDelta().y() + try: + if self.debug: + print(f"wheel {delta}") + messenger.send('wheel',[{"delta":delta}]) + except: + print("Unimplemented button. Please send an issue on github to fix this problem") + + def keyPressEvent(self, evt): + key = evt.key() + try: + k = "{}{}".format(get_panda_key_modifiers_prefix(evt), QPanda3D_Key_translation[key]) + if self.debug: + print(k) + messenger.send(k) + except: + print("Unimplemented key. Please send an issue on github to fix this problem") + + def keyReleaseEvent(self, evt): + key = evt.key() + try: + k = "{}{}-up".format(get_panda_key_modifiers_prefix(evt), QPanda3D_Key_translation[key]) + if self.debug: + print(k) + messenger.send(k) + except: + print("Unimplemented key. Please send an issue on github to fix this problem") + + def resizeEvent(self, evt): + # new_width = evt.size().width() + # new_height = evt.size().height() + # + # # 更新 Panda3D 相机的 Film Size,保持视野正常 + # lens = self.panda3DWorld.cam.node().get_lens() + # lens.set_film_size( + # self.initial_film_size.width() * new_width / self.initial_size.width(), + # self.initial_film_size.height() * new_height / self.initial_size.height() + # ) + # + # if hasattr(self.panda3DWorld, "win"): + # winprops = WindowProperties() + # winprops.set_size(new_width, new_height) + # self.panda3DWorld.win.request_properties(winprops) + lens = self.panda3DWorld.cam.node().get_lens() + lens.set_film_size(self.initial_film_size.width() * evt.size().width() / self.initial_size.width(), + self.initial_film_size.height() * evt.size().height() / self.initial_size.height()) + #self.panda3DWorld.buff.setSize(evt.size().width(), evt.size().height()) + + def minimumSizeHint(self): + return QSize(400, 300) + + # Use the paint event to pull the contents of the panda texture to the widget + # def paintEvent(self, event): + # if self.panda3DWorld.screenTexture.mightHaveRamImage(): + # tex = self.panda3DWorld.screenTexture + # gsg = base.win.getGsg() + # #self.panda3DWorld.screenTexture.store(gsg) + # base.graphicsEngine.extractTextureData(tex, gsg) + # self.panda3DWorld.screenTexture.setFormat(Texture.FRgba32) + # data = self.panda3DWorld.screenTexture.getRamImage().getData() + # img = QImage(data, self.panda3DWorld.screenTexture.getXSize(), self.panda3DWorld.screenTexture.getYSize(), + # QImage.Format_ARGB32).mirrored() + # self.paintSurface.begin(self) + # self.paintSurface.drawImage(0, 0, img) + # self.paintSurface.end() + + # def paintEvent(self, event): + # tex = self.panda3DWorld.qt_output_tex + # + # gsg = base.win.getGsg() + # + # + # if not self.rp_sync_requested: + # base.graphicsEngine.extractTextureData(tex, gsg) + # self.rp_sync_requested = True + # self.update() + # return + # + # if tex.hasRamImage(): + # data = tex.getRamImage().getData() + # width = tex.getXSize() + # height = tex.getYSize() + # + # # ✅ 应该 data 长度 = width * height * 4 + # img = QImage(data, width, height, QImage.Format_ARGB32).mirrored() + # + # painter = QPainter(self) + # painter.drawImage(0, 0, img) + # painter.end() + # + # self.rp_sync_requested = False + # else: + # print("⚠️ Texture has no RAM image yet, retrying next frame") + # self.rp_sync_requested = False + # self.update() + + def paintEvent(self, event): + tex = self.panda3DWorld.qt_output_tex + + gsg = base.win.getGsg() + + if not tex.hasRamImage(): + base.graphicsEngine.extractTextureData(tex, gsg) + self.update() # 请求下一帧更新 + return + + data = tex.getRamImage().getData() + width = tex.getXSize() + height = tex.getYSize() + expected_len = width * height * 4 + + if len(data) != expected_len: + print(f"⚠️ 像素数据长度异常({len(data)} != {expected_len}),跳过绘制") + self.update() + return + + # 一切正常才绘制 + img = QImage(data, width, height, QImage.Format_ARGB32).mirrored() + + painter = QPainter(self) + painter.drawImage(0, 0, img) + painter.end() + + + + + + + diff --git a/QPanda3D/QPanda3D_Buttons_Translation.py b/QPanda3D/QPanda3D_Buttons_Translation.py new file mode 100644 index 00000000..db011c66 --- /dev/null +++ b/QPanda3D/QPanda3D_Buttons_Translation.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8-*- +""" +Module : QPanda3D_Translation_Buttons +Author : Niklas Mevenkamp +Description : + Contains a dictionary that translates QT mouse events to panda3d + mouse events. +""" +# PyQt imports +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +import sys +__all__ = ["QPanda3D_Keys_Translation"] + +QPanda3D_Button_translation ={ +Qt.NoButton:'', +Qt.AllButtons:'unknown', +Qt.LeftButton:'mouse1', +Qt.RightButton:'mouse2', +Qt.MidButton:'mouse3', +Qt.MiddleButton:'mouse3', +Qt.BackButton:'unknown', +Qt.XButton1:'unknown', +Qt.ExtraButton1:'unknown', +Qt.ForwardButton:'unknown', +Qt.XButton2:'unknown', +Qt.ExtraButton2:'unknown', +Qt.TaskButton:'unknown', +Qt.ExtraButton3:'unknown', +Qt.ExtraButton4:'unknown', +Qt.ExtraButton5:'unknown', +Qt.ExtraButton6:'unknown', +Qt.ExtraButton7:'unknown', +Qt.ExtraButton8:'unknown', +Qt.ExtraButton9:'unknown', +Qt.ExtraButton10:'unknown', +Qt.ExtraButton11:'unknown', +Qt.ExtraButton12:'unknown', +Qt.ExtraButton13:'unknown', +Qt.ExtraButton14:'unknown', +Qt.ExtraButton15:'unknown', +Qt.ExtraButton16:'unknown', +Qt.ExtraButton17:'unknown', +Qt.ExtraButton18:'unknown', +Qt.ExtraButton19:'unknown', +Qt.ExtraButton20:'unknown', +Qt.ExtraButton21:'unknown', +Qt.ExtraButton22:'unknown', +Qt.ExtraButton23:'unknown', +Qt.ExtraButton24:'unknown', +} \ No newline at end of file diff --git a/QPanda3D/QPanda3D_Keys_Translation.py b/QPanda3D/QPanda3D_Keys_Translation.py new file mode 100644 index 00000000..97d510b7 --- /dev/null +++ b/QPanda3D/QPanda3D_Keys_Translation.py @@ -0,0 +1,486 @@ +# -*- coding: utf-8-*- +""" +Module : QPanda3D_Translation_Keys +Author : Saifeddine ALOUI +Description : + Contains a dictionary that translates QT keyboard events to panda3d + keyboard events. +""" +# PyQt imports +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +import sys +__all__ = ["QPanda3D_Keys_Translation"] + +QPanda3D_Key_translation ={ +Qt.Key_0:'0', +Qt.Key_1:'1', +Qt.Key_2:'2', +Qt.Key_3:'3', +Qt.Key_4:'4', +Qt.Key_5:'5', +Qt.Key_6:'6', +Qt.Key_7:'7', +Qt.Key_8:'8', +Qt.Key_9:'9', +Qt.Key_A:'a', +Qt.Key_AE:'ae', +Qt.Key_Aacute:'unknown', +Qt.Key_Acircumflex:'unknown', +Qt.Key_AddFavorite:'unknown', +Qt.Key_Adiaeresis:'unknown', +Qt.Key_Agrave:'unknown', +Qt.Key_Alt:'lalt', +Qt.Key_AltGr:'unknown', +Qt.Key_Ampersand:'unknown', +Qt.Key_Any:'unknown', +Qt.Key_Apostrophe:'unknown', +Qt.Key_ApplicationLeft:'unknown', +Qt.Key_ApplicationRight:'unknown', +Qt.Key_Aring:'unknown', +Qt.Key_AsciiCircum:'unknown', +Qt.Key_AsciiTilde:'unknown', +Qt.Key_Asterisk:'unknown', +Qt.Key_At:'unknown', +Qt.Key_Atilde:'unknown', +Qt.Key_AudioCycleTrack:'unknown', +Qt.Key_AudioForward:'unknown', +Qt.Key_AudioRandomPlay:'unknown', +Qt.Key_AudioRepeat:'unknown', +Qt.Key_AudioRewind:'unknown', +Qt.Key_Away:'unknown', +Qt.Key_B:'b', +Qt.Key_Back:'unknown', +Qt.Key_BackForward:'unknown', +Qt.Key_Backslash:'unknown', +Qt.Key_Backspace:'unknown', +Qt.Key_Backtab:'unknown', +Qt.Key_Bar:'unknown', +Qt.Key_BassBoost:'unknown', +Qt.Key_BassDown:'unknown', +Qt.Key_BassUp:'unknown', +Qt.Key_Battery:'unknown', +Qt.Key_Blue:'unknown', +Qt.Key_Bluetooth:'unknown', +Qt.Key_Book:'unknown', +Qt.Key_BraceLeft:'unknown', +Qt.Key_BraceRight:'unknown', +Qt.Key_BracketLeft:'unknown', +Qt.Key_BracketRight:'unknown', +Qt.Key_BrightnessAdjust:'unknown', +Qt.Key_C:'c', +Qt.Key_CD:'unknown', +Qt.Key_Calculator:'unknown', +Qt.Key_Calendar:'unknown', +Qt.Key_Call:'unknown', +Qt.Key_Camera:'unknown', +Qt.Key_CameraFocus:'unknown', +Qt.Key_Cancel:'unknown', +Qt.Key_CapsLock:'unknown', +Qt.Key_Ccedilla:'unknown', +Qt.Key_ChannelDown:'unknown', +Qt.Key_ChannelUp:'unknown', +Qt.Key_Clear:'unknown', +Qt.Key_ClearGrab:'unknown', +Qt.Key_Close:'unknown', +Qt.Key_Codeinput:'unknown', +Qt.Key_Colon:'unknown', +Qt.Key_Comma:'unknown', +Qt.Key_Community:'unknown', +Qt.Key_Context1:'unknown', +Qt.Key_Context2:'unknown', +Qt.Key_Context3:'unknown', +Qt.Key_Context4:'unknown', +Qt.Key_ContrastAdjust:'unknown', +Qt.Key_Control:'control', +Qt.Key_Copy:'unknown', +Qt.Key_Cut:'unknown', +Qt.Key_D:'d', +Qt.Key_DOS:'unknown', +Qt.Key_Dead_A:'unknown', +Qt.Key_Dead_Abovecomma:'unknown', +Qt.Key_Dead_Abovedot:'unknown', +Qt.Key_Dead_Abovereversedcomma:'unknown', +Qt.Key_Dead_Abovering:'unknown', +Qt.Key_Dead_Aboveverticalline:'unknown', +Qt.Key_Dead_Acute:'unknown', +Qt.Key_Dead_Belowbreve:'unknown', +Qt.Key_Dead_Belowcircumflex:'unknown', +Qt.Key_Dead_Belowcomma:'unknown', +Qt.Key_Dead_Belowdiaeresis:'unknown', +Qt.Key_Dead_Belowdot:'unknown', +Qt.Key_Dead_Belowmacron:'unknown', +Qt.Key_Dead_Belowring:'unknown', +Qt.Key_Dead_Belowtilde:'unknown', +Qt.Key_Dead_Belowverticalline:'unknown', +Qt.Key_Dead_Breve:'unknown', +Qt.Key_Dead_Capital_Schwa:'unknown', +Qt.Key_Dead_Caron:'unknown', +Qt.Key_Dead_Cedilla:'unknown', +Qt.Key_Dead_Circumflex:'unknown', +Qt.Key_Dead_Currency:'unknown', +Qt.Key_Dead_Diaeresis:'unknown', +Qt.Key_Dead_Doubleacute:'unknown', +Qt.Key_Dead_Doublegrave:'unknown', +Qt.Key_Dead_E:'unknown', +Qt.Key_Dead_Grave:'unknown', +Qt.Key_Dead_Greek:'unknown', +Qt.Key_Dead_Hook:'unknown', +Qt.Key_Dead_Horn:'unknown', +Qt.Key_Dead_I:'unknown', +Qt.Key_Dead_Invertedbreve:'unknown', +Qt.Key_Dead_Iota:'unknown', +Qt.Key_Dead_Longsolidusoverlay:'unknown', +Qt.Key_Dead_Lowline:'unknown', +Qt.Key_Dead_Macron:'unknown', +Qt.Key_Dead_O:'unknown', +Qt.Key_Dead_Ogonek:'unknown', +Qt.Key_Dead_Semivoiced_Sound:'unknown', +Qt.Key_Dead_Small_Schwa:'unknown', +Qt.Key_Dead_Stroke:'unknown', +Qt.Key_Dead_Tilde:'unknown', +Qt.Key_Dead_U:'unknown', +Qt.Key_Dead_Voiced_Sound:'unknown', +Qt.Key_Dead_a:'unknown', +Qt.Key_Dead_e:'unknown', +Qt.Key_Dead_i:'unknown', +Qt.Key_Dead_o:'unknown', +Qt.Key_Dead_u:'unknown', +Qt.Key_Delete:'delete', +Qt.Key_Direction_L:'unknown', +Qt.Key_Direction_R:'unknown', +Qt.Key_Display:'unknown', +Qt.Key_Documents:'unknown', +Qt.Key_Dollar:'unknown', +Qt.Key_Down:'arrow_down', +Qt.Key_E:'e', +Qt.Key_ETH:'unknown', +Qt.Key_Eacute:'unknown', +Qt.Key_Ecircumflex:'unknown', +Qt.Key_Ediaeresis:'unknown', +Qt.Key_Egrave:'unknown', +Qt.Key_Eisu_Shift:'unknown', +Qt.Key_Eisu_toggle:'unknown', +Qt.Key_Eject:'unknown', +Qt.Key_End:'unknown', +Qt.Key_Enter:'unknown', +Qt.Key_Equal:'unknown', +Qt.Key_Escape:'escape', +Qt.Key_Excel:'unknown', +Qt.Key_Exclam:'unknown', +Qt.Key_Execute:'unknown', +Qt.Key_Exit:'unknown', +Qt.Key_Explorer:'unknown', +Qt.Key_F:'f', +Qt.Key_F1:'f1', +Qt.Key_F10:'f10', +Qt.Key_F11:'f11', +Qt.Key_F12:'f12', +Qt.Key_F13:'f13', +Qt.Key_F14:'f14', +Qt.Key_F15:'f15', +Qt.Key_F16:'f16', +Qt.Key_F17:'f17', +Qt.Key_F18:'f18', +Qt.Key_F19:'unknown', +Qt.Key_F2:'unknown', +Qt.Key_F20:'unknown', +Qt.Key_F21:'unknown', +Qt.Key_F22:'unknown', +Qt.Key_F23:'unknown', +Qt.Key_F24:'unknown', +Qt.Key_F25:'unknown', +Qt.Key_F26:'unknown', +Qt.Key_F27:'unknown', +Qt.Key_F28:'unknown', +Qt.Key_F29:'unknown', +Qt.Key_F3:'f3', +Qt.Key_F30:'unknown', +Qt.Key_F31:'unknown', +Qt.Key_F32:'unknown', +Qt.Key_F33:'unknown', +Qt.Key_F34:'unknown', +Qt.Key_F35:'unknown', +Qt.Key_F4:'f4', +Qt.Key_F5:'f5', +Qt.Key_F6:'f6', +Qt.Key_F7:'f7', +Qt.Key_F8:'f8', +Qt.Key_F9:'f9', +Qt.Key_Favorites:'unknown', +Qt.Key_Finance:'unknown', +Qt.Key_Find:'unknown', +Qt.Key_Flip:'unknown', +Qt.Key_Forward:'unknown', +Qt.Key_G:'g', +Qt.Key_Game:'unknown', +Qt.Key_Go:'unknown', +Qt.Key_Greater:'unknown', +Qt.Key_Green:'unknown', +Qt.Key_Guide:'unknown', +Qt.Key_H:'h', +Qt.Key_Hangul:'unknown', +Qt.Key_Hangul_Banja:'unknown', +Qt.Key_Hangul_End:'unknown', +Qt.Key_Hangul_Hanja:'unknown', +Qt.Key_Hangul_Jamo:'unknown', +Qt.Key_Hangul_Jeonja:'unknown', +Qt.Key_Hangul_PostHanja:'unknown', +Qt.Key_Hangul_PreHanja:'unknown', +Qt.Key_Hangul_Romaja:'unknown', +Qt.Key_Hangul_Special:'unknown', +Qt.Key_Hangul_Start:'unknown', +Qt.Key_Hangup:'unknown', +Qt.Key_Hankaku:'unknown', +Qt.Key_Help:'unknown', +Qt.Key_Henkan:'unknown', +Qt.Key_Hibernate:'unknown', +Qt.Key_Hiragana:'unknown', +Qt.Key_Hiragana_Katakana:'unknown', +Qt.Key_History:'unknown', +Qt.Key_Home:'home', +Qt.Key_HomePage:'unknown', +Qt.Key_HotLinks:'unknown', +Qt.Key_Hyper_L:'unknown', +Qt.Key_Hyper_R:'unknown', +Qt.Key_I:'i', +Qt.Key_Iacute:'unknown', +Qt.Key_Icircumflex:'unknown', +Qt.Key_Idiaeresis:'unknown', +Qt.Key_Igrave:'unknown', +Qt.Key_Info:'unknown', +Qt.Key_Insert:'unknown', +Qt.Key_J:'j', +Qt.Key_K:'k', +Qt.Key_Kana_Lock:'unknown', +Qt.Key_Kana_Shift:'unknown', +Qt.Key_Kanji:'unknown', +Qt.Key_Katakana:'unknown', +Qt.Key_KeyboardBrightnessDown:'unknown', +Qt.Key_KeyboardBrightnessUp:'unknown', +Qt.Key_KeyboardLightOnOff:'unknown', +Qt.Key_L:'l', +Qt.Key_LastNumberRedial:'unknown', +Qt.Key_Launch0:'unknown', +Qt.Key_Launch1:'unknown', +Qt.Key_Launch2:'unknown', +Qt.Key_Launch3:'unknown', +Qt.Key_Launch4:'unknown', +Qt.Key_Launch5:'unknown', +Qt.Key_Launch6:'unknown', +Qt.Key_Launch7:'unknown', +Qt.Key_Launch8:'unknown', +Qt.Key_Launch9:'unknown', +Qt.Key_LaunchA:'unknown', +Qt.Key_LaunchB:'unknown', +Qt.Key_LaunchC:'unknown', +Qt.Key_LaunchD:'unknown', +Qt.Key_LaunchE:'unknown', +Qt.Key_LaunchF:'unknown', +Qt.Key_LaunchG:'unknown', +Qt.Key_LaunchH:'unknown', +Qt.Key_LaunchMail:'unknown', +Qt.Key_LaunchMedia:'unknown', +Qt.Key_Left:'arrow_left', +Qt.Key_Less:'unknown', +Qt.Key_LightBulb:'unknown', +Qt.Key_LogOff:'unknown', +Qt.Key_M:'m', +Qt.Key_MailForward:'unknown', +Qt.Key_Market:'unknown', +Qt.Key_Massyo:'unknown', +Qt.Key_MediaLast:'unknown', +Qt.Key_MediaNext:'unknown', +Qt.Key_MediaPause:'unknown', +Qt.Key_MediaPlay:'unknown', +Qt.Key_MediaPrevious:'unknown', +Qt.Key_MediaRecord:'unknown', +Qt.Key_MediaStop:'unknown', +Qt.Key_MediaTogglePlayPause:'unknown', +Qt.Key_Meeting:'unknown', +Qt.Key_Memo:'unknown', +Qt.Key_Menu:'unknown', +Qt.Key_MenuKB:'unknown', +Qt.Key_MenuPB:'unknown', +Qt.Key_Messenger:'unknown', +Qt.Key_Meta:'unknown', +Qt.Key_MicMute:'unknown', +Qt.Key_MicVolumeDown:'unknown', +Qt.Key_MicVolumeUp:'unknown', +Qt.Key_Minus:'unknown', +Qt.Key_Mode_switch:'unknown', +Qt.Key_MonBrightnessDown:'unknown', +Qt.Key_MonBrightnessUp:'unknown', +Qt.Key_Muhenkan:'unknown', +Qt.Key_Multi_key:'unknown', +Qt.Key_MultipleCandidate:'unknown', +Qt.Key_Music:'unknown', +Qt.Key_MySites:'unknown', +Qt.Key_N:'n', +Qt.Key_New:'unknown', +Qt.Key_News:'unknown', +Qt.Key_No:'unknown', +Qt.Key_Ntilde:'unknown', +Qt.Key_NumLock:'unknown', +Qt.Key_NumberSign:'unknown', +Qt.Key_O:'o', +Qt.Key_Oacute:'unknown', +Qt.Key_Ocircumflex:'unknown', +Qt.Key_Odiaeresis:'unknown', +Qt.Key_OfficeHome:'unknown', +Qt.Key_Ograve:'unknown', +Qt.Key_Ooblique:'unknown', +Qt.Key_Open:'unknown', +Qt.Key_OpenUrl:'unknown', +Qt.Key_Option:'unknown', +Qt.Key_Otilde:'unknown', +Qt.Key_P:'p', +Qt.Key_PageDown:'unknown', +Qt.Key_PageUp:'unknown', +Qt.Key_ParenLeft:'unknown', +Qt.Key_ParenRight:'unknown', +Qt.Key_Paste:'unknown', +Qt.Key_Pause:'unknown', +Qt.Key_Percent:'unknown', +Qt.Key_Period:'unknown', +Qt.Key_Phone:'unknown', +Qt.Key_Pictures:'unknown', +Qt.Key_Play:'unknown', +Qt.Key_Plus:'unknown', +Qt.Key_PowerDown:'unknown', +Qt.Key_PowerOff:'unknown', +Qt.Key_PreviousCandidate:'unknown', +Qt.Key_Print:'unknown', +Qt.Key_Printer:'unknown', +Qt.Key_Q:'q', +Qt.Key_Question:'unknown', +Qt.Key_QuoteDbl:'unknown', +Qt.Key_QuoteLeft:'unknown', +Qt.Key_R:'r', +Qt.Key_Red:'unknown', +Qt.Key_Redo:'unknown', +Qt.Key_Refresh:'unknown', +Qt.Key_Reload:'unknown', +Qt.Key_Reply:'unknown', +Qt.Key_Return:'unknown', +Qt.Key_Right:'arrow_right', +Qt.Key_Romaji:'unknown', +Qt.Key_RotateWindows:'unknown', +Qt.Key_RotationKB:'unknown', +Qt.Key_RotationPB:'unknown', +Qt.Key_S:'s', +Qt.Key_Save:'unknown', +Qt.Key_ScreenSaver:'unknown', +Qt.Key_ScrollLock:'unknown', +Qt.Key_Search:'unknown', +Qt.Key_Select:'unknown', +Qt.Key_Semicolon:'unknown', +Qt.Key_Send:'unknown', +Qt.Key_Settings:'unknown', +Qt.Key_Shift:'unknown', +Qt.Key_Shop:'unknown', +Qt.Key_SingleCandidate:'unknown', +Qt.Key_Slash:'unknown', +Qt.Key_Sleep:'unknown', +Qt.Key_Space:'space', +Qt.Key_Spell:'unknown', +Qt.Key_SplitScreen:'unknown', +Qt.Key_Standby:'unknown', +Qt.Key_Stop:'unknown', +Qt.Key_Subtitle:'unknown', +Qt.Key_Super_L:'unknown', +Qt.Key_Super_R:'unknown', +Qt.Key_Support:'unknown', +Qt.Key_Suspend:'unknown', +Qt.Key_SysReq:'unknown', +Qt.Key_T:'t', +Qt.Key_THORN:'unknown', +Qt.Key_Tab:'unknown', +Qt.Key_TaskPane:'unknown', +Qt.Key_Terminal:'unknown', +Qt.Key_Time:'unknown', +Qt.Key_ToDoList:'unknown', +Qt.Key_ToggleCallHangup:'unknown', +Qt.Key_Tools:'unknown', +Qt.Key_TopMenu:'unknown', +Qt.Key_TouchpadOff:'unknown', +Qt.Key_TouchpadOn:'unknown', +Qt.Key_TouchpadToggle:'unknown', +Qt.Key_Touroku:'unknown', +Qt.Key_Travel:'unknown', +Qt.Key_TrebleDown:'unknown', +Qt.Key_TrebleUp:'unknown', +Qt.Key_U:'u', +Qt.Key_UWB:'unknown', +Qt.Key_Uacute:'unknown', +Qt.Key_Ucircumflex:'unknown', +Qt.Key_Udiaeresis:'unknown', +Qt.Key_Ugrave:'unknown', +Qt.Key_Underscore:'unknown', +Qt.Key_Undo:'unknown', +Qt.Key_Up:'arrow_up', +Qt.Key_V:'v', +Qt.Key_Video:'unknown', +Qt.Key_View:'unknown', +Qt.Key_VoiceDial:'unknown', +Qt.Key_VolumeDown:'unknown', +Qt.Key_VolumeMute:'unknown', +Qt.Key_VolumeUp:'unknown', +Qt.Key_W:'w', +Qt.Key_WLAN:'unknown', +Qt.Key_WWW:'unknown', +Qt.Key_WakeUp:'unknown', +Qt.Key_WebCam:'unknown', +Qt.Key_Word:'unknown', +Qt.Key_X:'x', +Qt.Key_Xfer:'unknown', +Qt.Key_Y:'y', +Qt.Key_Yacute:'unknown', +Qt.Key_Yellow:'unknown', +Qt.Key_Yes:'unknown', +Qt.Key_Z:'z', +Qt.Key_Zenkaku:'unknown', +Qt.Key_Zenkaku_Hankaku:'unknown', +Qt.Key_Zoom:'unknown', +Qt.Key_ZoomIn:'unknown', +Qt.Key_ZoomOut:'unknown', +Qt.Key_acute:'unknown', +Qt.Key_brokenbar:'unknown', +Qt.Key_cedilla:'unknown', +Qt.Key_cent:'unknown', +Qt.Key_copyright:'unknown', +Qt.Key_currency:'unknown', +Qt.Key_degree:'unknown', +Qt.Key_diaeresis:'unknown', +Qt.Key_division:'unknown', +Qt.Key_exclamdown:'unknown', +Qt.Key_guillemotleft:'unknown', +Qt.Key_guillemotright:'unknown', +Qt.Key_hyphen:'unknown', +Qt.Key_iTouch:'unknown', +Qt.Key_macron:'unknown', +Qt.Key_masculine:'unknown', +Qt.Key_mu:'unknown', +Qt.Key_multiply:'unknown', +Qt.Key_nobreakspace:'unknown', +Qt.Key_notsign:'unknown', +Qt.Key_onehalf:'unknown', +Qt.Key_onequarter:'unknown', +Qt.Key_onesuperior:'unknown', +Qt.Key_ordfeminine:'unknown', +Qt.Key_paragraph:'unknown', +Qt.Key_periodcentered:'unknown', +Qt.Key_plusminus:'unknown', +Qt.Key_questiondown:'unknown', +Qt.Key_registered:'unknown', +Qt.Key_section:'unknown', +Qt.Key_ssharp:'unknown', +Qt.Key_sterling:'unknown', +Qt.Key_threequarters:'unknown', +Qt.Key_threesuperior:'unknown', +Qt.Key_twosuperior:'unknown', +Qt.Key_unknown:'unknown', +Qt.Key_ydiaeresis:'unknown', +Qt.Key_yen:'unknown', +} \ No newline at end of file diff --git a/QPanda3D/QPanda3D_Modifiers_Translation.py b/QPanda3D/QPanda3D_Modifiers_Translation.py new file mode 100644 index 00000000..ce32160b --- /dev/null +++ b/QPanda3D/QPanda3D_Modifiers_Translation.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8-*- +""" +Module : QPanda3D_Translation_Modifiers +Author : Niklas Mevenkamp +Description : + Contains a dictionary that translates QT keyboard events to panda3d + keyboard events. +""" +# PyQt imports +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +import sys +__all__ = ["QPanda3D_Modifiers_Translation"] + +QPanda3D_Modifier_translation ={ +Qt.NoModifier:None, +Qt.ShiftModifier:'shift', +Qt.ControlModifier:'control', +Qt.AltModifier:'alt', +Qt.MetaModifier:'unknown', +Qt.KeypadModifier:'unknown', +Qt.GroupSwitchModifier:'unknown', +} \ No newline at end of file diff --git a/QPanda3D/Tools/__init__.py b/QPanda3D/Tools/__init__.py new file mode 100644 index 00000000..03b1010f --- /dev/null +++ b/QPanda3D/Tools/__init__.py @@ -0,0 +1,2 @@ +name="QPanda3D" +__all__ = ["generate_qt_to_pd3d_translator"] \ No newline at end of file diff --git a/QPanda3D/Tools/__pycache__/__init__.cpython-312.pyc b/QPanda3D/Tools/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c5d492a369845783aaa8bb58a0e884906b884e5 GIT binary patch literal 277 zcmXw!Jx&8L5QXg|XhTpy;sEp!uoi3!RMcpZsM3tgdgL|uXR%GB?V#iYoPo2@AkjqI zasi}tsqmuY6*KR9#r%9urxTL&_HF9R)PH)|if+tmKbdzT$eai&>72HM*{~bmmfQ+n zTz5wjEqWdio+3mCjVJ^}&u!2=I)5`8bR)|Rb{PQI8sLMh`q692YG;r|CDF68t!nN~ z>D>cXF(i()vm0dj0_}onb2c_4vX# j@vQO6@20)|U*Ry7-yx-RxpVL`TJ9ZxO-^1jpQZQ@Ev!>1 literal 0 HcmV?d00001 diff --git a/QPanda3D/Tools/__pycache__/generate_qt_to_pd3d_translator.cpython-312.pyc b/QPanda3D/Tools/__pycache__/generate_qt_to_pd3d_translator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e67c53976fb62b0996b6167327317cbf16cd4240 GIT binary patch literal 808 zcmZ`&O=uHA6n?YWB-_MPRIKTbCbtsPX4NQ)RiPwQL68K5LZB>bc1$)+c9WfHYuW^= zAX*x*J=J6H;#s|U_mWtuambX&)- zoYESVfk$``7|$HSimO0S_vQJSMD-jg|yw;%PPZI_8!z!r9NinSWmsI66vq;Ygpwv(vV`^v3~Z7h`W9f!XQ z5G|4CeEI1?2=!p32g5x$zbDBr;!oqNsC)X%7vIFo>_%;?vDw(3**zD3R{QLmSoL&A zuD2olZD4SXY$Vs8tVi|%p)^{Z?#g5B=+&>$sZMn2ed;6nFtZa)b!0xqM3FSwgYfHA f2O=UIylvlwU5NbN4}yP^h;OkyG<`#UC-dbG7Khu| literal 0 HcmV?d00001 diff --git a/QPanda3D/Tools/generate_qt_to_pd3d_translator.py b/QPanda3D/Tools/generate_qt_to_pd3d_translator.py new file mode 100644 index 00000000..9b4b6c69 --- /dev/null +++ b/QPanda3D/Tools/generate_qt_to_pd3d_translator.py @@ -0,0 +1,11 @@ +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +H=Qt.__dict__ +lst = [a for a in H if a.startswith("Key_")] +QPanda3D_Key_translation ="QPanda3D_Key_translation ={" +for i in range(len(lst)): + QPanda3D_Key_translation +="Qt.{}:'unknown',\n".format(lst[i]) +QPanda3D_Key_translation += "}" +print(QPanda3D_Key_translation) \ No newline at end of file diff --git a/QPanda3D/__init__.py b/QPanda3D/__init__.py new file mode 100644 index 00000000..5cf0b25b --- /dev/null +++ b/QPanda3D/__init__.py @@ -0,0 +1,2 @@ +name="QPanda3D" +__all__ = ["QPanda3DWidget", "Panda3DWorld", "QPanda3D_Keys_Translation"] \ No newline at end of file diff --git a/QPanda3D/__pycache__/Panda3DWorld.cpython-310.pyc b/QPanda3D/__pycache__/Panda3DWorld.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f05ed99305b1c857ea746fb6d8719bfbe789564e GIT binary patch literal 3236 zcmZt|O>ZMfwX3_`Zrg3gah#8tWT4pZbzn?ZX(zzHt9Am@O@2nmVP-u5?e1Jwx$Mq+P>144TV?^WBAI725@e(%+* zSFhezy{ulZYViH#-yihN95vH0_1xz^8dg@HBY02>M`+%`qe$18lJ)QLvvD6 zv&G7%XfH4WG1zOy)uiUt0M-Ks@KRjgLwYH0On(=qzfJXP#fwSH zYpK2ExS1?@OG(>nC(GV)vf`~Mx*e}3Yu=iI_4tZ+1>{xYtI4{zu4vVGBe~{X1GsiT zyf47XUjz<4c0KowMjcvv3M*{w#PGgE>$LGy^IoC)BdxPA%B%M?I*gfn-Q5XN8oY7q zamHg>y)hL1j05#i5cL?PQOevK_a6M4Ee+CBEwny#m)Z zxfOAc{6NX?n6hz)2ZMeT<`0HqFch-9$KDe|&gAmVEbT=H?*=>y_G5NGNP`2$W%F^A z((Gu5X9LDX#Bz{nKk8>k-w$#;c5(N9Hq6=MK!k9e?TjMPDRkKj_yH5rxoDygZ*lRf zOp*MD05A;#NrNCFoeQss^GF^?tu8wU1j-;`hc%)xM3XRIU2tY&IGRpaqJEXzZS-K zlOT--!#F_yDH+jUO-+mbtZUlsgW?ANdYcn~rr6)!{tPkCelislmJ2pD+b~-&Zos`!MEmD8E@IPA3A=);3JV@9kht$|im|)y}eN=hD_&IS$_1-X!A;%a?-B-nE z85SXKH^uRQxmmAQtjPKk;b$uHeZk)AT$3yQL7eRev9FTMkJ4NOX~?8C2slfHT!^!P z?(h(^>{cKGY4tLm1cHO-HMsyhkc$3bnv34zfHNNz-iP!6X_4R<;L`RL;``Dn5?rp% z4!$IUV_fhiZmQ-?_{DLueB0*-`@y$m3yEQt46+pT^YMOiVb33?d32C6>hB*5CJnf~ zYz371Q|WM7%yN$98`5*{K8P3``(RYB@wbPoXw z0LBB)p;4}C1y+ELEzO+8Jy|-6sOU?p&!U6Ako73{&s_sN;8|GO&OU^3s60i-Kn!EFlHmp*|NO-# z&wu%A_u*VQcAx+8xBvL`XC2}-XU3mJM~Cn)!!~urVnVI?GE5)C$T6fWeY7#B*X8hN z0aJ*avkze$O2;+;P&G7P6J$(OChM4A&&YPi;JBCL`|dT9%T-%1bW<$ogL4IoI4ttv z6jpMme3}K;9Iei2ih)^hZNH=-ZZUB0b(qFb z1r)Fe6ueXNNaI_uy<@41$Wjk-Q}C|(2CM*MQ|2 zkrm%p<=*$tZ^++(wco+W(Z?;aK^%RwK6kl!nS~xTOlu5YNb9QaC#od?*zx@*!yuln zlzpFOA+p?imxcIjzS&c8s~j)OyN@FZ()sIfv{FRYrz(aJ{xda|OWs5l6*KsneFH|0 zg~HZM(l&KcJ+pg_(ux@ZZSI>34*?GiSl<@V>YR`dh`@k0hOfYmBA}oD^!LyI^plsu z`scrbu-+d1=u)`%gWOFs;qGJM#ex?FF{C(kkD2JYJCNr&n>97TT(<<=MX_~z5zj>z z90eUGmZxDVqJ+J}dB!g!i!uS;UM^uxx|A4yfQ1}m+tziW6Z6c}`CEW?Ugh7xJw|?< zOFhfI_N9#wvrw)~HJ53`RW&LH`?;ckhkH=^ecy8iJi{i<=UFDC1_^^0aXO*@4QXf|oigt0C?$l^PwRF6Ohd^LM zqXYrEh?u=UjA8*+QJt1D{r~ly{oNu@-omOrV*+m21pW-iSR)R= Pj^RLIH+7pd4QKQ}zxIHu literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/Panda3DWorld.cpython-312.pyc b/QPanda3D/__pycache__/Panda3DWorld.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1de4fd53743e54e0ae874fb167e7c141e832d29 GIT binary patch literal 5190 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 B!^{8x literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QMouseWatcherNode.cpython-310.pyc b/QPanda3D/__pycache__/QMouseWatcherNode.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c6644a9db74fe0b3ec3a2aaaad942b5bfa2d690 GIT binary patch literal 1325 zcmZux&2HQ_5GFA0Dz-<8MqC*Z<5qNUf1;h&Q<;NDA=_#Zz6PgvDP&xFck(dwe9LABB2bC}Kj#yAgDr*^VM;jR?gdI+?r|Ta z_X)Wu^#Q3s+P#^x5zWqRw+6KXgGT4*5-$-(3%o$o;pip0!qbEpPj#)3CZx2e3r(r< zhdL6+xJs07WB}W*u-T$C1E3Y9SLp8tlf0?KBo}4bOny6<%#HvU_VC%{MxA@@sq`Vj z4>l9aj|fN3$K9KL>+>@VPU~iO+D*ShSI00c&>v8Tb}q>hE%6z#;4H|cyF@#K&0C^- z=q@^QR~G+2OR%zd3vU~pc{*IU3-8qT$98BzEDh?@;vZn|7o~3(=ZWx3y!h*9U z?pUd~%nlUvvZ*XoJr8U%I767?S=6oOEihiuDHu|+_iQsyyi9zbXOqT0zU&X2NWf^P z+QyL%b8s1mFQASDgW+%*mj4z=NmEj*VNe2G;ng!(Z}v&*)pX};Xf3`8O$ z&V9<;!SB&D0}9VHjd6d9vhuQ^T5gG`o}DLDov#^|PD}IDEfB+Fz{7==JFJ?4+j^in z_JUdo_OE5$zp6rw$$J&uDC&8_)a*PITfcT&JyE+%rAB+e=hEm&Q5f_H$k{NU7b|Et zmRyTAV{iN#8{Hduvmri89Do2BnBxxcLZ;w5xCy%(sE!JuV!Ty99T1ivPs1Bfxe~fouu*WwGNS`9Hd+d*C%V1}8j7bt!?C zC2t^9tc!JNyVFO|mcrcrzX1DuC*9L-mt;w=d`#Wa9mieJ9Y31ARi(_Oz5t`;6`%E8YW7|FG5T|2E3uty^-VW~=Q0`?TF-6{ zJsEyH{LR^~KKpj^ha2DBcs4fK9Gh&7O*e<9oBh)b>9_vD*J({P$EI3iGtJ?dX8%k> z0&9b3*X4%vM`~ofx=C88@txQ>?Smjrv}7>K(;$IC?zSs5M|WsJ)PbW$Jh}?XTN36r zZZo?K4_4VA?dynkUa2$=ip#j|uxysjPAyv~dl&TC5FnVY)Va;^Cs!U{`F^pLQg>o% zkV!hqACR(MBJhC3HLVmpX-k4JrWe5ueH)OU>^v$4aU4y9;Ci_q9^8k) zod)k+fcR*$K|n87(P2c8F8mcwNbmeJilvFb|6DreM>WlK4eoQkmi4AGS?`uhiJu6$ zJ5}3Hg-rX^W`1uacy`Q;!F9oe&O`BgU;XO{BG^KKqad!Au@Bk_-lQtT!~lM#lt~_&+nphyXeB94CG$o;!ganmFS^-22X7E{*7P>?EMFOHpW{3 literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QPanda3DWidget.cpython-310.pyc b/QPanda3D/__pycache__/QPanda3DWidget.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cab2e09d32441ac124c15f86cdb7aad9cca2e87 GIT binary patch literal 5998 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 A8UO$Q literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QPanda3DWidget.cpython-312.pyc b/QPanda3D/__pycache__/QPanda3DWidget.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa547dbc1761d6a1545c032e2814ac73df38555c GIT binary patch literal 10344 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 R>9Mjc=a2oK!Cxws{{ft^oZSEb literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QPanda3D_Buttons_Translation.cpython-310.pyc b/QPanda3D/__pycache__/QPanda3D_Buttons_Translation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6ded1501db11185fcef331ce94edfcfbd97dcb GIT binary patch literal 1451 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 literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-312.pyc b/QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9db426cba0d8714a94fbc0bf7ed602aeabd3d05 GIT binary patch literal 29279 zcmaK!4{RJ)oyT|WG)A};>)duIMMqDN*U zdQ@+*qW|6!#Z^oFs#RRITDxX<>AP~#+560hv3vQTpIPHmzwck7%skj2{*}I)%ppJA z_|)$wbGSkLD}4`{BYwE?sqZCov_bqUy^YLqKiv4#_mO$LLHsLyKba@}aN|=yK&HJx z{44z+nWy}4<5Pct%+n3xU+E8$dBzVnKJ|ylJli1tl`zly;l`&hFEogMCCmvw-1y{% z#_m*u`B(ZOsso!3_x=(2oxPVwBEp;xH5Wt8i=pPFQ1f!A=?pd9p(Y+`dP7Zrs2L13 ziBK~VYLda`ix|D}V9QosI@C-Cn1^Y^rvnV;<7}vz3pMkhW--)cLX943mO@QF)GUV@ zE7TN2O)1nk!A6Xp7i`(+t%aJ6P_r3owgSvy8u9G_gAsov)Z7R)uZ5ZqhnkzA=A)tJ zW1;5bq2^Yo`9!GsWUvvV_o-mZM(=j0`E;oHOsM&6sQFx|`FyDPLa6ytsQGfJc|Fv; z5nvvnIro(SgE{xrQ1i6_bA)pHdVoQ0-v~Bh^u8Hv+30;M)Ok+q;Q87?uf!24RDY0J(cy@@c>7=DsztqJB%&! zPX>F+w_V|$Qn;rB+)+{2X9Ch?!Uha@ExL!zYlPJ8~>niHHF(z zxIZi0Uli`I3inQcJ0sfnw*cq2@9&|mW%=F8e>QAUJR7zso()@;cfUJRaV}|D-lK4B z!A`8-mgW7yo~_@Oz;Dvf{+7V+(tLMFk>_EBJECw$74EpgJ+5$1DqOq5J*99@E8H^y z?kvrhw4g&PTW_3=#xds@Ha3YS*6NrjtMxLJjpQ@DABTU5A=!s!aPq;PqK z3)tA}d$1Ld?z~uM#Q^88vr@3DkFOK#X?#6}TT{3Vh1(2p7eqU@0-WEDZH0S9;ch70 zYYO*ag}bS6A62-IDcr{u?pA=iDEjOZ0gm-qeSAL|>}h;IrEs?u?$ZkQ8HM|-!hKHR zKCf_JP`EEC+?N&Zb%lFF;l849UsbrTDcsis+$CvzzY*a5HS$j?KZ!6p{6z-P__bY|_wZi>I;eM-dzf-v1E8HIxt`^`vD8^zZ!1?py&kFY!h5Ku; ztMAY61bZ6azbV|`LtX3gyOsZZ*s6FwY*joTwgx^QzD)hrs(3zZU2c1KWyG1LRq<@t zs(3bRRXiKEE+0~qcUa+$DBMwnJ09%B__l_9f5^tSRq@?n>vDT=zLf4Mg?n1zo>91G z1Kfwi_&y)tur6AcUr@Lc3U^B3Iu!1#!kt&Rivg}vwC}|L*CpIb0j{w>w=TaN>}i}j z6|P(1;tJQRaQy+UTeM>^!1-gCP`D9=ODf#B!leUTOw@BS!1?u@4sdaiZZ^RA>E;w} zKG@aQ?_z-O5oKlqoL{D{a7zl8SGa(Uy}p-PigZPVD=D0#aGt`gDcpv_Z7STB!fh+u zE5WWlzBhtBt>4!a?!yXqQ{g_Ua352+k1O0Qh5LlUeNy2*rEs?u?$ZkQ8HM|-!hKHR zJ|FD9$p2+%0=BuIRYoX@rq2?Pw#%%jy^j38C?Mmx& zy_>JM4cmIzGTL8kA4_UQT{{zBNIP25wKUJPiwi?W#ck^*8gBbox_!l{WNgjR z+l@7&=(+8l-Cm*!=kB%M8#SuCS$nmTQH?HDTb52&TbE9s;=kysgI}HDzs~Ys=lHMl{MQBk z>mo~VhW(snKj+xbdG>RG{cz5zm8(Yc)m?eJ!16Y$(dBA%r5d&T;w@u|RkBcxvP#(1 zXsH@qtwx>dK2**zb9tuS>V0lW%d!kupj_PpS!R*fs?qgobfX%rRHK{E{!cU#souZ9 z+LT>bsP0cz#=LVU#=MyA7}b4#sIP2RAMgWHrk*oAx7zAfT%J<1ES9om%&XqVx_{vm zK2GDK10QGbaTXuv@Npg=7w~ZrAD8gaRo%@q>*}et(WjOzv;Kd8uCu0-Ef~n>EcC)mdcALE5x*qq?7Ra6Q8@-4)Sf zPgL5Y7$~@`n|7>{wG6fzvn$mHDH(^owzJNbji?_dFG*POGb?%J3)x z^%#%90HV;~b<=7o8m`-=FPB*jsT*P#iC7%t71OM2neBkKg9fm$!S+T6)nOsFGI{G` zTETEMbR4dG?QB`h!I)Oe8kV0y$xYa-k7@X0SwlB1%TJisibcbs4x%290kA%zi50U9 zzhCLH&td&7jO~gZi`lwi7E5I@)nm407eyqyP|(nOF?LxlnqEazgKc-lhIhIt)X@|= z(-b;eJw&bM+oa}tq629l`L@ruPMTgZyHvr9h_MP$2gebPkEYObaYNG=x-f}xow3)9 zEY%o>#+#U?;{Dzlt;p@iy`xdwMD>w+?vrxPjVPM5 z(AYVq9^I6#ZRxt~U(>k!5 z+-M`{!A8)N?nkU1=|0~htuh+>p2j+&2J~Rgz?p7&A(c1TU70G|!^57P%UK3CzMf@P zc~KhcbJ{U`*pBCj%hj?bw(%Yu>JVdtZ`vqrBWq~|G_+^Kph-;oThE3m?rc39C5xS# z9BgvExQq0jMyb8*a7ZVRUUonf7ajh^8UNy}e{s&gIPYIv@Gma<7nei{el{I`2_1e3 z9d+fG(BYTR;g`_im(byt(BYTR;g{g2KI4~g#xLQFU&5Js9KVD!=S2O^icdd$UW6}* z&x_*o5@wEnm~+wDy=IZ$J8?5%0dZ>SwM=nr@DC_7qxul9kKK!rYoCp5*ruV?hnw#p z;*QA9w(KBAX~iV$*NVBag%yu$cCaZfi+xg%9##+96GWJOuoyJ=1R2x{c9r%>9~d@| zL(5&DBs&!$CGD_2bqqi`^|)QoSZca4h|gh}0RFkD2p_nR5RDY8DoUB2IRw47Gdu($Z3g(1z;SP~7L+Hbn-SR_tt{rq`_ zjx_u#spaY+FJTr}#Blak*kPM(A#_kcU>w~)fI1CGd%(cGd%(awd%ytp0BY7iaY<}p z14Wl@^T>4&A46#55UctEoxNz=pdhvlTJJ2pY@!YIhSD9DbsIgOHV%xmiP5>>-HsjB z=$_-71b;9XEsicNp)v_ff&@D@jg$+l+sD~`mJKBJNkS_Zv-wkU;Itg*kOODrz*#wP zP7a)x0~h4LMLBRu4s^+ZZaEN>193UfBL{lrK%X4w$IToq9o9?>3rB=`Utprr(VfON z!H(z{LF&uyvX#MXN!Yo1w+yCa~*dw_k$m8pRyD=ZFOC9D^Lq>@a_1MqSP9q;0X= zF-=<3)kpq=#jshdw}U-CEV%2Ym(64K58K6iCO&OfO_=3FYk#<$mo}B*vgMfzD@H|R z#DgWvU{6E3sq?*tmfdjKHM64Ll@xo9XKydq+F2OEoo>WfNAuW)i(P$0tn?9_f~m=D zDK%C$)>X>P6_M2_`fgO(Tt@HRTt*w43+)bUVzFZyZEG}-MzPsYGe_-=Wv;SEROY|lD&m1vsWXiHoYaF1|%&u_$b<5Hyo-JwKK_se1*{w zGb!f#J>!>T&nF(*PnZ4?Xbgppl?|7_`}0G#XT&oWiW@7l5Ve$gW*j5V_CwT=U5NYl zxUt0Qok#1&*`t{zS~qT#tcs6Waq3J z6lQCT>XbrNQv4x=)=nzRj}JWTAO!>LcuSLy3QVzQbhdWHwZ%`K)VKWTpQVR!>hu(Q zjetH$86IE%E|vpsNQjbWn+Gkn6!Y&|I4OD+Lu)8y8HRXAkfJv-pe2L7oX!JG~%gp#xp&3Zl?L1DoeL(1jK2d1xhx%%Zg|&oA|nDa>X4tR?&HB zG%4LbIxbdon!T`~g3_A1!rn5AnVB}60z2u6mj-FmKTD+TxSe3f4BRrYd-8WK;⪙ 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 literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-312.pyc b/QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e177eb3d1f3229e4bbd81f38861eb35ddf5d5a91 GIT binary patch literal 999 zcmZ`%&u`N(6n2uX-Lmz^1{#cM$k+0t5lkGI5Yn_sJD^RiHVLUhioDosyryxm-Bsa4 zPaC)1_!~IDKf;BI15?-mi4(V?aoPzdG}#2jQj+ic-t&9UU;MFHG=W-gK6l&~Iso5e zlCIJioPSf`Ex@1&u!eO{d#`JMke(r9j0`W=%;8*1Yfh2;VOk-rsJ_@xdgY2RhB(e& zn4ssCetm*oQ2OEoeOl=^|D)fUq|-vP6dKi;S0Bu6hPxhtYp_vAK1QpX_8v#R@Q|d; zw^fuLP{M_|-jy!nDsP9jJtW{ZIU;@=bpmsf2#3=k&WCFzRBMCz5>a131Tl5u0OBE( zE|O4=ixUAGd$3KyeTF!OaWN^NWH3mkz)79I!Zq_pe3+^hX?J#_+u6X`kXJ{Kri4om zWK?j}Fr0ajfjq^!e%og~zgmt8wvCx%+tFM-Y{*BohTLGBM6)T|>e8s3lIIk+h!l|_ zLJ{voo~L%|4H=m`EbSi^cjJ~BEyq5n)|oK7?p;RbwuwYpsPv440m2!-w#8XD*zHm2 zxS6=}&ynraPv!ADa30%p(X(9EA(o^q!mWDfxQKV^oE;KJ3dPlL^vBeyDcg@MkM3JR zqOaB-JhTLrFnK4=DpX2Q66ZX%Ns iF(~)TgP9~aKLqoGY62IBU~v$R%F|FEf)&1`y8Z^6nI4n? literal 0 HcmV?d00001 diff --git a/QPanda3D/__pycache__/__init__.cpython-310.pyc b/QPanda3D/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de84fbe689e852a62906cc73bd30e52a3a7ff0b4 GIT binary patch literal 223 zcmd1j<>g`kg3imi8Bsv`F^GcB}x(|8}FT3SsWiyl$ckXlUS0OpXaB^bc-b~ zF*o%VdwhIiPELIMN`@jk$ zsMXn@&4>YkEA1;<4E3!AUP?Cpzk!NZ89H(@iGG~ zU~v`sQO{RWl<31@7p;s{BAoOozroh=I}6$=@Y3kpc@l;iY78UJK`G8Z$Y$5O1y-3F znU^J6mbFC%w$7}1z{0zzePwhfS-M8OW=h_(=HFkWXXngGkEab3k5Hmx{R511sio&U mZQAYlqBi15;iWx@jWmv%#q~R&lz#8co`+#_{W7xq(fb3023dFj literal 0 HcmV?d00001 diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc index a63b5c2a1fbe6bc7af537c5e5607c8ed8183d512..c8e668c0e2a6cf8ad86085893dfbc8626cb3e1c7 100644 GIT binary patch literal 25562 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 aJWtC1G6uUt{Fehoxu)FWwpFCE|O27)+(fLwBT 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 Y8nI6t632MzPWRO5I!-JQQIy8Ce>l5yasU7T delta 420 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 KcyE19Iq?<|Ph2?w delta 82 zcmbOxc8QlSpO=@50SL~?WM@2PnaJnI=rJ+YlO>ozQ*h#;3rwl$o2M|&WMTHx;2P+2`2MY-DuuOiyWd;CVkrD*} diff --git a/core/__pycache__/vr_input_handler.cpython-310.pyc b/core/__pycache__/vr_input_handler.cpython-310.pyc index 6c092eb27029912f8f8d3b211fbfaa424a39ae66..0da2e4cab5668b04e0fb6c03a7058c552dafb77b 100644 GIT binary patch delta 28 icmcZkv9N(%sXrw6hC delta 28 icmcZkv9N(%sb^9U6H diff --git a/core/__pycache__/vr_manager.cpython-310.pyc b/core/__pycache__/vr_manager.cpython-310.pyc index a105979b1a4b582075eada4038b469b79d8fefad..25a3cebab470c260b9f28f6e501efc913b5b06c7 100644 GIT binary patch delta 104 zcmX?@e=wgrpO=@50SL67H*MtRU}bW3-z>^1s3{f2UQ(2qo}OA1#gbl>SrElhl3$vf uQIMDtwb?;WlAUql<|tEXM)_8t)}js&(Fr2@LBs?QF$qLW-8{uimk|K;7aRrv delta 104 zcmX?@e=wgrpO=@50SJ;)OEz+Iurj5lZx&@0)Rel#UQ(2qo}OBCizU4%v)~p-Nq%W^ uMnPiAt<4U4lI)CAH%FODGs<@YwHEb&h+Yse8AMD05z|1#%*|8GbQu9^?;Z~T diff --git a/core/__pycache__/world.cpython-310.pyc b/core/__pycache__/world.cpython-310.pyc index 23fbf357d06dce6644f05b305fb98c0fc57cb09c..485744ac6ba9a4454d0b7750f024bd601ffcc319 100644 GIT binary patch literal 12349 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 diff --git a/gui/__pycache__/__init__.cpython-310.pyc b/gui/__pycache__/__init__.cpython-310.pyc index 87fdb57f9aef5e41f93b87797cd2a389f84eba34..3c56f75cb3f8044222803aee3105485ec29d5328 100644 GIT binary patch delta 25 fcmZ3%w1SB{pO=@50SL67H%;XJ#N_He@xLYjPj&}e delta 25 fcmZ3%w1SB{pO=@50SJUACr{-5#FUyo@xLYjO0WkJ diff --git a/gui/__pycache__/gui_manager.cpython-310.pyc b/gui/__pycache__/gui_manager.cpython-310.pyc index 0cc545c8b3760b2d5c4f7ff2cfe0cc32c89304df..9f8f64295c92307b997935b64a0eea9a957146ac 100644 GIT binary patch delta 1696 zcmZ{ke{54#6vunsd+pk>!Nlo)FgKWv(%}Zf2^+A7q#vnzCa&E1l(0g7HB^gcn$@iXn z&bjB@_ul!sAAanIWIZ`K(IS5N7dAIX`;wVFcfMF{fDIO}C1?=@lTv^zazGMPOj=Fa zj0EhJcRXZ|SvzzV4#bjz?IEug)>^byqfMP04h5SHY*2Kmsv3usTziVhZnN2B{;T4a zVGb{|_e$X57ZQ(4(28aDOg^0KkYOtyO-WH;AHS5^FTp9^m39%}3g42k+6IaIVor|) zG2EJ41kdn;xtC>7ao+P`WuM?+NgA%5^&n_`^Q=Muj(x6OFo@6Q z7r=hpoPQ1m`Rdt2knx3Ri)G%yG*SlyhWHZ&4@344ttaw1C^kmwO~7>@%OHIe|19pY9ue{q-~IS$2}W>zNrm8GNxJp0Fu#Ve zl935Z`cmv}$HS!~))PW?^KA=h>RS|J-eN|a- z0f(!yVE`{zJvrrP%4%NOd7*CdB~RTCnelYA^WVwov^h{}qlTQ!stWCx8+6VBMyHL7r!5i-E$>bRlp5u}bS=d#ZCOq;> zZ;6#lX4@#Pi|{VNJnC;!cd9dw(&;D*2<#DOluNfP_(N^#ynDH~-*NAyTzd&?2=AK} zF7h}Q+-{P&gxLl0I_}lzrg)ztQdsuZkzU zy;9>VWu5RaADo)hCemp2kq}KKb&_8X>ujkxrDAe(gsDn%oo=W~#3U1pU#j_rO|#(k z`b==~kLx1^nk?@DqW)Zgzz*Srovi3U&>rH$Lh}Pn?mME&kK7 Np>Yvp;Tw$u{{T9X-HHGJ delta 1680 zcmaKsdr(w$6vy}67q49md6ePP7SV?E3cK^eq0L4#-WM+ zDThDKOjArnJ`0;_Zn?(+sq(2z0Rh=ugXp zwY)bi3*ZABa&Ln#(Vw0P1K68>7Czw}3l2lVkhl;_{1>yyIwEk0S7*+Hq!C(AmvdAE zPVv{Wev{#A?0)z-oWhDn#%<2Rs>RhXitjJ>#vCJkyny>2mO%C>#$@kOhlP28@6SFh z!5PHdf}}GPdx3DG1*wT~gH^S=U1CJgC^|UZ|;PcC_r+zOi zHYVV4hp`x1oF)7~SWbA6uoe6A=BwWda}bZ_U4?^u-|`Vjvs2GuPr*~_c@Z1tmkX8v zOz^bAbV<7+JU1k)DGI_q94eXv6ZlI}5*$Ev<>NCiQ&qc@7lri)uUQ!jH_JU;919n* zyLcJI^UsT)RkUrCydCpPy5UFss^me)#_^I0xPW=3b#M*eERBa!+*`Wgp}$0;Tk=@Y z$^Isd0|c&-Ww*@UPZB<_EL<{Rg-6$RPGt~j+7A`l0&UCjfJQwPM(7uOQ{^Y&WG^z{b3OzG|E(n&=W|*t&d-X%8 zNw>CU3)PE4tXQyc2HpEVvhq+nqVH@6hC~z7h$`6%a0}V~O&%e2@!-|-)>pCr^qdd@NDV;>8PdD3r{+dw1 zsnwd$O4%qf><4E#+e8_|8*HK}Wku-$e}Jv9rSEkHTo0=BWR*>=DUvl9>-Ff

mzmL4TEfOM>qbNYM&#H7{Gkz+yE$SyD)q}l63v1~l!R&$a?vU* z7u2MCu}rEP0;1A3SP-y66$%>J4S&ny!!A*pAJ$)LH3^MwX8j~hEk>0*oYL^^7R>G%n)V3+36Jaq8YWvwWM;1Ax#B60+5>PUiS7vTcBrL^dC>={3 zro9o#u2Y{Tl3;S$(u3h}N0%IuR4W{e^sunoO1hPYjtoM2m6yd{vnxqP+Ru;wo6o@i zf6;ixxV@0GN7-Fz(~tosS9wT)y{x*;)oymxlOyboYZakv)>W`FF)(7vM5p6_1o7&6 zmRjx9Q55DEwFi~v>aS$g0ID%`Mtl209lWN&R(0@YYz%PtXoMZE>EJiMtyw=3g?k7X z295&9fFr2;mc+1rnV$&!v2HDxGPu$82&k~}m#)-@9ZLNb;D&K3hgj{96>I%tq3@@wj=8&pWKUhJC7Y z-aCfNr1%2m+@8@ztt?#efOm z25=L&4Or0z_Pp^`-We>*~fJc0yE@IaJS|f W-&qZfe^5ocB=){3O5Ci`=lczvWmYEu delta 1551 zcmai!Urf_i6vua4sI*;cp;Q_sBL;D)!vb!ggV9keh1y#F>SBqhjQ&Kn!mqh)`C~R2 zE;6zu{yP#7B}Nk;mTXJrFKSFQ#J7dSS0DPYC;x;eAB|f~yx-f#8rQ@=d~(jY_nv#t z_niJ#R@urbGpiPh=>zc_)hmCQON(^MsP=Kuke)@f6Pq5ea<^E@e3(>H{i>P@OvIFF zUQa#7yKI+cG`aPxj`mvI)w{$lUJJN@od8bqdZ2+$TdG+j-LS;XpCeEWG|^UTWlIap zR)I`WTpf;a8+;FZBm998WkTV55ZnuV0ki{OQo`yS^1<{1^12RK^3Hv*Isre>1#}Cz zjJzCn00;tMpa&=eWGNwGQM;#Hdttq=V*_-n^fOWEMrklSh&?-iPk@hrZ9pLj8pJ}{ zA+T}n?z78(K3-dW^2hSig>z4Sx%&Lx+#qkHQ)S(=^7&@uI0U?<5Zr?T83R|w)k%fh z5s?LI>VoCHudu zbO6gk0)AczvyQGiYFPvQ?f6Y}o^RQ){rzR~X1cef`O`vOD=GXis;Y33*JIbZD@s^n zowztGYRD@ni-dx_Ss-Ib9#5yn;*sJJH8HbWOyHce$u^8-ISJX;(|Na@MYW7`kDm2w zWm`RE-h9F)Y=+L6;we6sQe1}Y!(!;i8mxSKE-u+Ca%ibE6pfzvp zw*1J*Ig`E4{SoBL16176SdY_8qgrpr3sw_HJ*IEcWARv2RFxde4*s|Z^L~La z=k%>FD(+kN)y*amP626P5|{#1U>cYKP5`)ye-Hcsym?iAxLvuHXWxfSv%rr4PDhLi z=PHkmCr3GElR7;%c2b+~v@#Z=MSnH(X}A2FnZb(_3$)(lW^LNbE+~8{7yi+VcI8LzG>37&O!G`~ML-{~C1XGCT~<_4VOw1ULeW08u~z zjsZu3lYsnYwZS?M5O5J#1eO2?28M2i?o`deJtYw4KMA_@{4^pMH9n7BZAkZ@PPjiK kCX+7<%T>v*ARz0I9g$yI9nXDEWxHbZ=s=qJC=?FA2J=9.0.1 - python-dotenv>=1.0.1 - pyassimp>=5.2.5 + - six diff --git a/scene/__pycache__/__init__.cpython-310.pyc b/scene/__pycache__/__init__.cpython-310.pyc index cc8d1f69055c350e145a3581ad3a06f3364d4fd6..4484bdae311b015304a7519345c1286130820a5f 100644 GIT binary patch delta 27 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 diff --git a/ui/__pycache__/__init__.cpython-310.pyc b/ui/__pycache__/__init__.cpython-310.pyc index 448074469a8d2163f2f49d7a7d84a6c000061023..c9f021c7bff75bacdf89e0162d6ef023c2344a9b 100644 GIT binary patch delta 27 hcmaFL{FIqHpO=@50SL67H*Mrz$H?UBK6y8z764|I2Xp`c delta 27 hcmaFL{FIqHpO=@50SF$>O5Vu5j*%%fee!NbEdXqq2mb&7 diff --git a/ui/__pycache__/interface_manager.cpython-310.pyc b/ui/__pycache__/interface_manager.cpython-310.pyc index ee60e0bcb6028a615e123bb8c8e2de44b273f801..cd7684752db205ffd413a668576509a7975eee9a 100644 GIT binary patch delta 1027 zcmZuwO=uHA6yCR+&1N^d+hmh!YE5h7Un3Q<+Ex({{#7eh3l+qQXmQuHB~8-l1}p4Z zH2xy$VL;I$q(>DI3DT=K#ghj?Tn~Ej_uyHm2j5Km1G~d~`}WQE-uGtb&D)L_Yt5oz zXaYWKKAju6)$-W<4C1ccweRp6;5dCL9iv-92SB4&LnBm?dy_GwhQtt<5>C;SQlcf* zPRJhtTIpWpnzbC)$qIz5L{w(4q+gWgrq#^U85j)O5w6^oCj_ng{5lWqoThuukNiVKP99C5O1D2Zjqyp3do+FxO4fcX~5)(0To! zX=2(iP6_Aab9&UcJ?%;!*wGwRL|?unoCI69jq{N!f+vhAW7t>eYkL?_N3t^Krh`F?~?bT_XfQfKNW66i)5%|ooPxC*4d;PA&~iT5q1b<2fbr; zb*^J3V+ZPBsp#fMb0cn`4HQQUb({3#+K}o@m4*xUwtPNo(y!L~RYNLg_PNe@Adh3$ z<%4LhJbDbfaNH@lB*W6~quq(jMuRhduMBB9QY;s27FqAfK1SvDA%WH;n>(qWSlS}$ zAw6k<4!V?r6y7r(VmNese3Hs@)#!Ei|MP2Vr delta 941 zcma)4&ubG=5Pq|p-DEeL&F|P+TWVTMB1V+9)*pCiw5?H5q_&5GNajmo!p{euuC9?AK>gIX?|Vpa9^SlumRt*!lp@f8qg0I= zStrk=G5~o%9L15#5|G6)SLsLPv65O0I4U*E61(ZBRg(s5PyiY#d3W>o+X(W@S+6qUT{s5Kb~HW78S-wiD0u_U%gV|dsb^Z|{# zKELDN^@%G4cf1MFHabW(R3mP+Jt9M4l%!jh#mqN(d+=TTd+-Us5WgGlS8|xF@Yms6 zY7!ai;scR8tzjnin6)7^lquVqWK8@)mgOHK{cT4Cb=4P5Ndy&l-zVv~|Arg`9~g3CCpg67 zyd(AlMtEyHWx9(ufQ|;t;JvmnnPZxTxk={Ywva+Up`{PJ{Qz}NM0`Ic zdgdc$&Mt9r&gs-I+2Y(5B{5mDfP1KOUv$|YDiV`rbBW0ov+SPxwN+7Et#cYe9Wkr?)KN_6D1}y+Kc?drHSDYG)do z+%J?6Vwbzr5;36% zPf(8pE28R{uZO8MKlol$wC2>hdNP5xR+9oNfs$+4;8&o}T&o)*68A}y@9!kbl%CC(Z zF_7P2e(ojmKu({yjMUpAhRwR=#FOUHZ7^aHTXeoGU(B2ShPS5;jr%*}8r zI{c1kKjztuzy}DBGFi0t;5mp8Lg+wP0X>s#LV4r({W-_@}gV!bS`+w2D%LJ0Q|cNN+~ig8mGsEzhvfZRj|~z>%PC z(OC#Pi^x&=J!c!KMpj8`>7-N)N(&`1Ku^Z>ytzsu%f6(AdOM^rl~HUEgYIU(=%Htz zw(PA;^w9w%OkNh=B#A2}g?Q;jxLj5we8q?XnUvoo`ZXv#33n?p$yyLx6?&|R?u2Sr z0g<8Eld3k+)|rDnxYTG?83(^c^VAO`jh1zsC4Oh zSAT`SEAwVxVkN;Z2Gx#@Dp}p3WyxW6C7SSsY!`0utQ%Np9(b!poF|y2?oW!kE-!?n zS9m)fP9(OE1JE;jyl|XF6vN@!$AwRrRRJ$m-^u2^j88D8zlgbIcHuZOQ*NK*A%@SH zr-Ak5YE4~iJh^ilYra4sUxjmMJ)9B$P_8haVsd*P8xZa*U5aoXPS4FO9QFF>s(g)t zQ3DgUGUpuGSbKn&qxGO_gzbzKF3hvW3cEh9vFDkE@o)7!#^KX(g94#0@zD)>Sm0fh zjjGR}t}?HWZ`HRbdZbc3y5QBSWMKz0m%_mO59i~5Aa&MGwD=9{(8ATHxQ7(ih2nH6 zj)~%g=z0WvG~EHm>Pm7f%nVOqVASY{S!+x-nvAu^g~nONZeuC@QFq98gpo=@cvV=@ zxoK+`orJ-6;K*||`CVETY{p=%kt7mCqn6%h4##BrJL>L%u;4Pe56Xh+Nm@;h`fG0e E7jOw}H~;_u delta 2015 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 PeF^_cxZ1VDT=f3|LnE&0 delta 2677 zcmaJDTWl0nbY>s3v%7ulw%cy{-qIHvO3R}KDYObLk3wm;51?HXS$D>E=|1Y+S%GGy zAt0K7(Q-ghL!>{(Mx)05lmrNV`QanzmzkL82eu(5YBVNBe>~?--?mILXU;wEdmi`B z=dYN4>c~oDW;z6Xo>-q48s0XZRot})SBjvBQ6VM<#h58*ikXAvm?db5S%cP?6qI7N zpiLwhQ&f)GgLYBaFDPcka#2t$7feBiV(k_D(jzkKw~gOBvd%B+rfw}vgr$!O7f<1v z3<%IE1|-zV)ji;Ldajzsi=4=r6j&C1{;8-RO2pLqAvGFJ)T@K=k-1E?Pkm+nLM+Qb zzAlY~m>Spg?7-P>t+B3KI~Gv}RV~Tf@R@b%lbKv58akUuY0Qm_pgo+3YoSP7W!!-Q zvPsOHRJ8z0jHpaI+rc%mpi=rqB0sDM{+258xj9QjQ)5e&VYAIERzSP$xaki8-nUI2 z&PYq_WLmhDot7pKToh;B9+RhM5zTkQQQgxNrALl|;yg9}Dv#(-Dv;c;pLU9$7s)Cj7n^P3NZ;%amQiX+Pdrk?pJPX6w9byWmvo~(qMuOWBU~5<~;{$95QFanoP-VMt zsS>Ff@?4w8Rw@P8R2t?=2vQWn?7P!He{%cb-PdOCe(Vc2^>O0E={IMuUzsEJH~pVB zu#zTm?FfA7+Ol;?=m&TdlOp4rUmpA=^!_KcxkE_7CU;H4Zp4@FJ78>~mB`CguMnvX zK?*LfqS&*h;?+gP8FxtB4hM3o>v(oo@$wD|^8ibQlpXQeJCifl?m?i$1E1#9w(xCQ z*g-OR2!U?Fsp@BkX}y-o31W64NI_xl!LgMlSQqg-9%tc$1q+KIVck0Y9^H=q1IDaN zgeH>Ag3`K-J=7D552_qH8j7Y=?nsA5k2jCc%=!htJbWjFJWZLjDZh*Hq1XanduqKw z`{@LWD*b4B4jmvATzL(JMu~WnQeUx+2>S3%UW9nw%a$B*v<}XqyxpW?W(s~7pMmEIYlrfp z=4`*IQy0%nnwgVm5r`Fe3wSx=v|cdE=jS`PS#-LNA%km;GL2-`lK!5UFT$Q;MQR|l z5x#YK;C^v)i{XlBrwH%@@(IlQDQa(KIrwhd?g@YGI?GhX^}P zfKGYc7LG>3!>WSU4lgR!SQc0n@x$Qq)r%wWl&?^Fng}Q0q|YZkL+ClURqiWor$uc2TwOe|N$T#3l)m|gm zYqaLU)*)t}%B!vyoo^8FbpltQtH#%LgHR6vuFliTL$MpBj3nahJ!I<+jj5{fAEGLq@#@;+d2 r@IuyJJ!Agosx`q>Mn^N(T+OL2?}{aqR8(!j+6hT=Unyjma?Jk$*t|yi diff --git a/ui/__pycache__/widgets.cpython-310.pyc b/ui/__pycache__/widgets.cpython-310.pyc index 19bed79edb3a61f02bf69bbfcb2119bcdb845299..eb6846b355016c3bec402d7bbfd2e237a4035142 100644 GIT binary patch delta 1653 zcmZ`(U2Icj820PB(zSFe+s-z+pSE^PI&@%^28B!}j4{W$1^JPpjKg}`o#gaq-#H!A z!2FF&AV%^c5>zh4zhR7#Mol#FVmBrxUKqVPH%7xG@dhF$-ugXXFLo?jFP^^V{r}$Y zdA~bjcgFmMK)`pO`1Rg;$O|snW&lL;Y8ZD$XV>uCj zt~$fQx*ymGO*clB0hmry*~_0aHZZ2sH%*a<%-fVJluT`$Yo<9kqvfrATE^l9MCtTz z)4r9n&@;`aYI35z^G$7ZyE)LG7XiumT3$q85HJmp6%<)vzh-Evsa4m2mr0K+9jru$ zmCjYly`i*wW`*ku8|deTX8K-vzOGWSmXFZRmgeqC!$`K`sbM%xvn|_C>=I(Up6`Zc z5U>X@1PB412B?5ZKo(#CP6AE=P6PG=mT#`YAn1lkX^pvug-EO>M2A}c7S}P{b|g3s ztAj`78*QJl|B+=XG|UdrjZjR%)!W{TZfN7!i6aP2(O;qW1;ysu!`oozhv8JK=hNCO zKQ82yJI&Q>%2U*5b869EQ&jc5rEy1>3Hq)5t|;+K$M(<}q?iX(vO|)5&(Oxsc()|D zq~`@#r1x=1juTL+bMJ0BQ19vkB?P?#SaoD`#JXDDbHYcCEYWp)(~IImtbl^J0AM{p z-jHnaC443UFVlFq_1@v046kQQqYIH(U&^CfT5iDN7vYcfv)yUcQYBAq??F@J`wND~ zAA@;>{)p^gSqewnJ(U^I&gfv!acX#F%Wp@wvM1!zfUtONWuHHQ@frZ8R6rETYLi-RxxGGKWPrIet>2m1a4U@32j delta 1674 zcmZ{kNo-q17{@b?<2p7@LXwxH&SD#iV(E`2_z1=AR%!;aC#R6YCz)BiXw4k{^NsR-Nc8VXXe}H z&HTT)J$ZZ5TlD!nb@I3S`#mg#Eq zSA)lp;5hIM@T|m&qf#J&1-t)iEx%6B$i<0>M^xiZ!0jXu2TlRlo8`^sOGROh7gIb} z%`TpUgFWra{Xei6&9#QKLog+4?B(mN&5WI)Z`y)EmA5TloHzKC;D#}>zzb%Kr%h2p z)EWA(Ew*tMI??`OeW9+7-fZilTkXDmMHw&=xlha?umuo+s-UR~(>%v@gV)x8mq~lH z9=1Towcbt2o!7cuXQk^4+vw-!cKTjB+gPdCAYyc&qrJbfVI*&qxmRR`wWFkUhMh;{kXXH+j&=ScuVbw1 zWXn^q+Qe19(e*jIOFxH#%iV!TlwKeet07xR z@kOD_aom{_`fS`)$}Z;hQhZBE&lXHBY`cuoZ{2rfiC=p5`j@et^T6Fg6SK6vH`1?E zuQdBEe3Une*uQ}0dq)qe19fkHpoE|gfK89=9I?Jm=Q-)4j%-)ot-+V&MD~S-I3KVT zP&cGH^%YDffmdlN(0T9SJ|Ec1Seo7mhKDRy*5vtvrg#tj=t;|&(oJ3I)N;=lTuc{p zT1ExZC855rtWD~tU-xICI_7Eg!di#R8Av~`BwS2e(m+Y-hSiHi