前言
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(