Author:Gary Li
Date:2019-5-2
1. 简介
现在有一部分3D打印机带有激光雕刻功能,自己组装一台专用的激光雕刻机也并不复杂成本也很低。但是当我们使用激光雕刻机时,激光雕刻下位机只能接受路径指令,所以我们需要把位图——也就是我们平时最常见的jpg、png图片转换为控制板能理解的G-Code代码。根据需求以及复杂程度,转换有以下几种方法可以选择。下述方法所需的工具包均已打包上传,且均为绿色免安装版,下载地址。
https://download.csdn.net/download/m0_37340681/11156631
2. 位图->G-Code (使用JediMaster)
绝地大师(JediMaster)这个软件可以一键实现上述的目的,优点是使用简单,但是有一些致命的缺点,比如配置选项少导致最后效果不可控;只能支持简单的线条图形,复杂图形会转换失败等等。如果雕刻的原图片是一些logo之类的可以考虑使用此软件。
使用方法:解压后直接双击打开软件,左上角加号选择图片后等待转换完成就可以在主界面看到结果。双击主界面可以修改图片大小等等。使用方法很简单这里不详细说明了。解析完毕后图片就已经保存到了C:\Users<UserName>\.jedimaster中,将后缀为.nc的文件打开复制到上位机控制软件即可。
3. 位图->SVG->GCode (VectorMagic,JediMaster)
VectorMagic是一款位图转矢量图的小工具,具有很多功能比如去除背景,控制精细度等等功能并且支持较复杂的图形。弥补了JediMaster的缺点,将VectorMagic生成的SVG文件输入到JediMaster中即可。不过这个方法有个致命的缺点,那就是如下图所示,会生成很多移动路径,并且移动的时候激光头是打开状态的,所以会产生许多的杂线条。并且我观察了很久生成的GCode,并无法通过程序的方式将这些杂线条区分出来,所以这个致命问题导致了该方法不可用。
4. 位图 / 矢量图 -> GCode(InkScape) (推荐)
InkScape是个免费开源的矢量图作图软件,也支持大量的插件,功能选项很多,可以直接转换位图或者矢量图为GCode。这个软件还有个最大的优点是生成的路径是优化过的最短路径,效率很高;并且生成的路径原点在中间,方便定位。网上使用方法也很多,但是我折腾了大半天,原因是inkscape是个开源软件版本很多兼容性也控制得不是很好,下了很多版本要不就是功能残缺或者缺个库,或者就是运行时报很多错误。在我上传的资源包里有我测试完成的绿色版inkscape以及转换成GCode的插件。将资源包里的inkscape-unicorn-master的src文件夹里的内容解压到inkscape\share\extensions打开inkscape即可。使用方法参考这个视频:
https://www.bilibili.com/video/av10491675
不过转换出来的GCode不能直接使用,需要将里面的指令进行替换以及过滤。过滤脚本如下:
# AccLaser.py
# Usage:python3 AccLaser.py -f <gcode file> [-m <move speed> -c <crave speed>]import sys, getoptmove_speed = 3000
crave_speed = 300if __name__ == '__main__':opts, args = getopt.getopt(sys.argv[1:], "f:m:c:")input_file=""#获取参数for op, value in opts:if op == "-f":input_file = valueelif op == "-m":move_speed = valueelif op == "-c":crave_speed = valueprint(input_file,move_speed,crave_speed)if input_file == "":print("Please input file name")sys.exit()lines = []#设置初始参数lines.append('G21')lines.append('G90')lines.append('G92')lines.append('M05')# 记录激光状态,用于判断移动速度state = Falsewith open(input_file,'r') as ifd:for index,line in enumerate(ifd):#去除换行,避免换行混乱line = line.replace("\n", "")line = line.replace("\r", "")#跳过前面几行生成的测试语句if index <= 14:continueelif 'pen down' in line:lines.append('M03')state = Trueelif 'pen up' in line:lines.append('M05')state = False#如果读到了移动指令elif line.startswith('G1'):#判断激光状态,如果激光关了,则可以快速移动if state == False:lines.append(line.replace('F3500.00','F'+str(move_speed)))#如果激光是关着的else:lines.append(line.replace('F3500.00', 'F' + str(crave_speed)))#输出文件output_file = input_file + '.acc'with open(output_file,'w') as ofd:for line in lines[:-3]:#跳过最后三行回家的指令ofd.write(line+'\n')print("文件生成成功:",output_file)