
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)
虽然是一些片段,应该就说清楚了如何调用并嵌入。
希望对大家有所帮助。
本文介绍了如何在Python的PyQT GUI中显示OBJ模型,借助vtk库简化了OBJ文件的读取和显示过程。作者分享了学习Python、GUI开发、数据处理及3D模型显示的历程,以及遇到的挑战和解决方案。

819

被折叠的 条评论
为什么被折叠?



