利用python的pyqt5和vtk库实现对gcode模型的全彩预览

本文介绍了如何利用Python的PyQt5和VTK库来实现GCode模型的全彩预览,详细阐述了从安装库到解析GCode文件、将分层信息转化为面片并渲染的步骤。通过解析Marlin固件的M165指令完成颜色信息处理,提供了一个3D打印切片控制一体化流程的解决方案。
摘要由CSDN通过智能技术生成

前言

 3D打印切片控制一体化流程中涉及到的文件格式主要有stl以及gcode文件。stl文件为三维实体模型,其预览功能的实现较为成熟,对于java和python而言,通常可以运用openGL库实现预览,而gcode文件为切片处理后生成的文件,本质上与txt等文本文件类似,不包含stl文件中的面片信息,因此实现gcode文件的预览需要对其文件进行解析,实现过程较为复杂,相关资料较少,本文在实现gcode基本预览的基础上,基于marlin固件的M165指令完成gcode模型的全彩预览,主要涉及到的编程语言为python,涉及到的第三方库主要有pyqt5和vtk。

一、pyqt5和vtk是什么?

 在进行开发时,后台实现业务逻辑,前台负责界面展示,网络编程通常使用html+css+JavaScript的方式完成前端界面的展示,利用AS进行过Android开发的人通常使用xml文件完成前端界面。如果不想使用类似flask这样的web框架进行网络编程,只希望做一个简单的exe文件方便自己的日常使用,当然也可以用纯python进行界面制作,PyQt5 就是这样一种具有强大功能的GUI库之一。
 vtk是一种图形库,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核采用C++构建,但同样可以运用在python以及Java中,stl预览以及gcode预览都可以基于此库实现。

二、基本原理

三、实现步骤

1.在pycharm上安装所需库

python解释器安装库(画圈为预览所必须的库):

2.随意写一个pyqt5界面类并定义预览控件的初始化方法

代码如下(记得先import相关库):

    def init3dWidget(self):
        widget3d = QVTKRenderWindowInteractor()
        widget3d.Initialize()
        widget3d.Start()
        self.render = vtk.vtkRenderer()
        self.render.SetBackground(params.BackgroundColor)#设置背景颜色
        widget3d.GetRenderWindow().AddRenderer(self.render)
        self.interactor = widget3d.GetRenderWindow().GetInteractor()
        self.interactor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
        self.axesWidget = gui_utils.createAxes(self.interactor)#创建坐标轴
        return widget3d

初始化方法的意义在于规定预览窗口的背景颜色以及坐标轴等基础元素,至于预览窗口的大小可以先利用pyqt5的相关布局确定大小,再利用addWidget方法将上述初始化方法传入完成基础预览窗口的创建。

 self.main_grid.addWidget(self.init3dWidget())

3.在窗口中加入预览台

代码如下(示例):

 self.planeActor = gui_utils.createPlaneActorCircle(params.PlaneCenter)#以圆柱体为例
 self.planeTransform = vtk.vtkTransform()
 self.render.AddActor(self.planeActor)
 self.render.ResetCamera()

下面两个函数在gui_utils.py中,此文件主要定义共有函数:

def createPlaneActorCircle(x):
    return createPlaneActorCircleByCenter(x)

def createPlaneActorCircleByCenter(center):
    cylinder = vtk.vtkCylinderSource()#形状
    cylinder.SetResolution(50)
    cylinder.SetRadius(params.PlaneDiameter / 2)#大小
    cylinder.SetHeight(0.1)#高度
    cylinder.SetCenter(center[0], center[2] - 0.1, center[1])#中心
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(cylinder.GetOutputPort())
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().SetColor(params.PlaneColor)#颜色
    actor.RotateX(90)
    return actor

完成以上两步就能看到初始化界面窗口和预览台,如下图所示

4.解析gcode文件

 完成显示窗口之后,可以进一步完善gcode的全彩预览后台,为此首先需要设置一个按钮控件并利用pyqt5提供的QFileDialog.getOpenFileName方法创建一个gcode文件的选择窗口,将gcode路径传入解析函数。
解析代码如下(示例):

def readGCode(filename):
    with open(filename) as f:
        lines = [line.strip() for line in f]
    return parseGCode(lines)
    
def parseGCode(lines):
    path = []
    layer = []
    layers = []#位置信息和旋转信息
    rotations = []
    lays2rots = []
    color = []#颜色信息
    floor = 0#层数
    divide = []#分层信息
    center = None#模型中心位置
    plane = []#只有xyz坐标值
    stop = False


    rotations.append(Rotation(0, 0))
    x, y, z = 0, 0, 0
    w,e,r = 0,0,0
    abs_pos = True  # absolute positioning

    def finishLayer():
        nonlocal path, layer
        if len(path) > 1:
            layer.append(path)
        path = [[x, y, z]]
        if len(
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值