Python 在 3d 环境中导入 STL 文件

问题描述 投票:0回答:1

我面对的是初学者 Python 语言,因为我需要开发一个桌面应用程序来为我们的活页夹喷射 3d 打印机开发一个 slicer。切片器的结果必须是图像,当然我需要一个 3d 环境,我可以在其中移动或缩放我的 stl 文件。

我尝试了几种方法来做到这一点,比如 kivy 或 pygame,但我仍然不知道哪个是最好的选择。 Kivy有一个很好的GUI,你可以上传obj,但是我找不到连接numpy-stl的方法,现场添加stl文件时出现这个错误:

 <stl.mesh.Mesh object at 0x0C524570>
 Traceback (most recent call last):
   File "C:\Users\Nadia\Desktop\cube.py", line 56, in <module>
     My3DApp().run()
   File "C:\Users\Nadia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\kivy\app.py", line 802, in run
     root = self.build()
   File "C:\Users\Nadia\Desktop\cube.py", line 48, in build
     self.renderer.render(scene, self.camera)
   File "C:\Users\Nadia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\kivy3\renderer.py", line 101, in render
     self._instructions.add(scene.as_instructions())
   File "C:\Users\Nadia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\kivy3\scenes\scene.py", line 36, in as_instructions
     for child in self.get_children_instructions():
   File "C:\Users\Nadia\AppData\Local\Programs\Python\Python35-32\lib\site-packages\kivy3\core\object3d.py", line 154, in get_children_instructions
     yield child.as_instructions()
 **AttributeError: 'Mesh' object has no attribute 'as_instructions'**
>>> 

这是我的代码:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy3 import Renderer, Scene
from kivy3 import PerspectiveCamera
from kivy3.extras.geometries import BoxGeometry
from kivy3.core.geometry import Geometry
from kivy3 import Material, Mesh
import numpy
from stl import mesh


class My3DApp(App):
def _adjust_aspect(self, *args):
   rsize = self.renderer.size
   aspect = rsize[0] / float(rsize[1])
   self.renderer.camera.aspect = aspect

def rotate_cube(self, *dt):
    self.cube.rotation.y += 1


def build(self):
    layout = FloatLayout()
    self.renderer = Renderer()
    scene = Scene()

    cube_geo = BoxGeometry(1,1,1) 
    cube_mat = Material()
    self.cube = Mesh(
        geometry = cube_geo,
        material=cube_mat
        )
    self.cube.pos.z = -5

    self.stlfile = mesh.Mesh.from_file('exStl/test01.STL')
    print(self.stlfile)

    self.camera = PerspectiveCamera(
        fov=75,
        aspect = 0,
        near=1,
        far=10
        )

    scene.add(self.stlfile)

    scene.add(self.cube)
    self.renderer.render(scene, self.camera)
    self.renderer.bind(size=self._adjust_aspect)
    layout.add_widget(self.renderer)
    Clock.schedule_interval(self.rotate_cube, .01)
    #layout.add_widget(Builder.load_string(kv))
    return layout

if __name__=="__main__":
    My3DApp().run()

使用 Pygame 我也没有取得很多成功,因为它在 stl 上的工作相当复杂,但我对此一无所知。

有什么建议吗?

谢谢

python 3d kivy
1个回答
0
投票

Kivy 本身可以做你想做的事,但它不是直接支持的功能,你需要自己管理它的某些部分。看起来你正在尝试 Kivy3,它应该完成大部分工作,但我不知道它是否直接支持 STL 文件 - 你需要为此阅读它的代码。

一般来说,你也应该能够通过手动提取网格信息(至少是顶点和索引)并将它们变成一个kivy3 Mesh,将你的STL文件变成一个kivy3可以使用的对象。

© www.soinside.com 2019 - 2024. All rights reserved.