python PYQT框体中显示obj模型文件

本文介绍了如何在Python的PyQT GUI中显示OBJ模型,借助vtk库简化了OBJ文件的读取和显示过程。作者分享了学习Python、GUI开发、数据处理及3D模型显示的历程,以及遇到的挑战和解决方案。

在这里插入图片描述

from PyQt5.QtGui import *  
from PyQt5.QtWidgets import *  
from PyQt5.QtCore import *  
from PyQt5.QtOpenGL import QGLWidget  
import sys
from vtk import * 
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor  

class vtkMW(QMainWindow):  
    """docstring for Mainwindow"""  
    def __init__(self, parent = None):  
        super(vtkMW,self).__init__(parent)  
        self.basic()  
        vll = self.kuangti()  
        self.setCentralWidget(vll)
      #窗口基础属性  
    def basic(self):  
        #设置标题,大小,图标  
        self.setWindowTitle("GT1")  
        self.resize(1100,650)  
        self.setWindowIcon(QIcon("./image/Gt1.png"))    
    def kuangti(self):  

        frame = QFrame()
        vl = QVBoxLayout() 
        vtkWidget = QVTKRenderWindowInteractor()
        vl.addWidget(vtkWidget)
        #vl.setContentsMargins(0,0,0,0)
        ren = vtk.vtkRenderer()
        ren.SetBackground(0.01, 0.2, 0.01)
        #renderer.GetActiveCamera().SetPosition() #设置视点位置
#renderer.GetActiveCamera().SetViewUp(0, 1, 0)  #设置视点方向
        vtkWidget.GetRenderWindow().AddRenderer(ren)
        self.iren = vtkWidget.GetRenderWindow().GetInteractor()
        self.Creatobj(ren)
        self.iren.Initialize()
        frame.setLayout(vl)  
        return frame
    def Creatobj(self,ren):  
        # Create source  
        filename = "F:\DvPYcode\pyqtgl\\0PENGL\\1.obj"
        reader = vtk.vtkOBJReader()
        reader.SetFileName(filename)
        reader.Update() 
   
        # Create a mapper  
        mapper = vtk.vtkPolyDataMapper()  
        mapper.SetInputConnection(reader.GetOutputPort())  
   
        # Create an actor  
        actor = vtk.vtkActor()  
        actor.SetMapper(mapper)  
          
        ren.AddActor(actor)  
        ren.ResetCamera() 
  
if __name__ == "__main__":  
    app = QApplication(sys.argv)  
    win = vtkMW()  
    win.show()  
    #win.iren.Initialize()
    sys.exit(app.exec_()) 

引用:
vtk对obj文件的读取
https://www.cnblogs.com/flyuz/p/9497120.html
感谢feifei97

https://blog.csdn.net/ydsf521/article/details/80689038
特别感谢ydsf521。
在这次任务中想把obj模型显示镶嵌进PYQT GUI的过程当中,两个思路都是看他的文章,一个是qopengl 一个是vtk。qopengl那篇也给了我想当大的启发。
结合其他文章运用qopenglwidget和pygame协同,查询大量的资料应该是不行,pygame会占用进程,pyqt就没办法工作了。至于怎么解决我暂时是因为工作需要没办法深究了。这方面资料也显得比较少。
对我来说在opengl的弯路上一意孤行了好几周。今天的vtk真是豁然开朗。
特别是obj的读取。vtk自己居然有一个类直接读。免去了opengl对obj文件写入的代码段。
(当然了具体适用性还没有继续发掘,今天才干到在PYQT里显示obj模型)

从去年9月份开始学习python基础语法
面向对象的方法、文件的打开读取等等
然后研究GUI 从tkinter wxpython 到 pyqt
数据从csv文件到sqlite
再研究 数据的二维图表表达 matlib matplotlib
到后来obj模型的显示

外行人也算经历了好几个瓶颈。真的感谢网上得来的各种资料。
弯路实在是走了太多,我也不知道为什么,可能是因为就我自己一个人操作没得讨论,再加上跨专业了,没有专业知识基础。
在网上找资料的过程中发现这个事情用C++应该更合适一些。有更多的资料支持。
当初选了python学习可能首先就不太合适,相比C++,py的资料真的太少了。
好多东西baidu bing查都查不到。
带上过年和疫情,obj显示的问题卡了有月把了,今天好歹显示成功了obj模型。长舒口气。
————————————————————————————
好多人问主程序,主程序里太乱了许多其他功能就不发了。
我大概说一下有用的部分。

from vtk1 import vtkMW as vtkmw
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.gridlayout_1 = QGridLayout(self.groupBox)  # 继承容器groupBox
        self.myvtk=vtkmw()
        self.gridlayout_1.addWidget(self.myvtk,0,1)

虽然是一些片段,应该就说清楚了如何调用并嵌入。
希望对大家有所帮助。

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值