2017-10-17 157 views
0

因为我需要开发一个桌面应用程序来开发切片机,因此我们正在面对初学者的Python语言。切片机的结果必须在图像中,当然我需要一个3d环境我可以移动或缩放我的stl文件。在一个3d环境中的Python导入一个STL文件

我尝试了几种方法来做到这一点,如基维或pygame,但我仍然不知道这是最好的选择。 Kivy具有良好的图形用户界面,你可以上传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复杂,但我对此很无知。

有什么建议吗?

感谢

回答

0

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

通常,您还应该能够通过手动提取网格信息(至少是顶点和索引)并将它们转换为kivy3网格,将您的STL文件转换为kivy3可以使用的对象。

相关问题