#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import re
import datetime
import sys
#import os #раскоментиоовать при желании удалять исходный файл

__doc__ = '''
Скрипт добавляет в g-code код M117 для вывода
на LCD принтера текущего слоя.
1. Установить python 2.x. Для удобства при установке включаем опцию добавления в переменную Path.
2. В настроках slic3r Print Settings - Output options - Post-processing scripts
указать путь к этому скрипту.
'''

def usage(docs):
	'''
	Выводит строку об аргументах запуска скрипта
	'''
	print docs
	print "\nUsage:"
	print sys.argv[0], "Input_file [Output_file]\n"
		
def layers(args):
	'''
	Основная функция
	'''
	
	infile = open(sys.argv[1])
	
	if len(sys.argv) < 3:
		filename = str(sys.argv[1])
		if filename.rfind(".") != -1:
			outfilename = filename[:filename.rfind(".")] + "_M117.gcode" #меняем имя выходного файла, если не указано в аргументах
	else:
		outfilename = sys.argv[2]
	outfile = open(outfilename, mode = 'w')
	
	layer = re.compile(r'(G1\s*Z\d+.\d+.*)') #регулярка для поиска g-кода изменения слоя
	allLayer = 0
	curLayer = 0
	lines = infile.readlines() #читаем файл в строки
	
	for line in lines: #считаем общее количество слоев
		m1 = layer.match ( line )
		if m1:
			allLayer = allLayer + 1
		
	outfile.write('; added M117 g-code by python script on '+str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))+'\n') #пишем первую строчку о том, что файл изменен  
		
	for line in lines: #добавляем строку с кодом M117
		outfile.write(line)
		m = layer.match	( line )
		if m and curLayer < allLayer:
			curLayer = curLayer + 1
			outfile.write('M117 Layer '+str(curLayer)+'/'+str(allLayer)+'; info on LCD\n')
			
	infile.close()
	outfile.close()
#	os.remove(sys.argv[1]) #раскоментиоовать при желании удалять исходный файл

if __name__ == '__main__':
	try:
		layers(sys.argv[:1])
	except IndexError:
		usage(__doc__)
