124 lines
2.9 KiB
Python
124 lines
2.9 KiB
Python
|
#! python3
|
||
|
|
||
|
import sys
|
||
|
import os
|
||
|
import random
|
||
|
import math
|
||
|
|
||
|
inputFilename = sys.argv[1]
|
||
|
outputFilename = os.path.splitext(inputFilename)[0] + "-Gradient" + os.path.splitext(inputFilename)[1]
|
||
|
|
||
|
toolsToUse=[0,1]
|
||
|
|
||
|
dithering = [
|
||
|
[0,0,0,0,0,0,0,0],
|
||
|
[0,0,0,0,1,0,0,0],
|
||
|
[1,0,0,0,1,0,0,0],
|
||
|
[1,0,0,1,0,0,1,0],
|
||
|
[1,0,1,0,1,0,1,0],
|
||
|
[1,0,1,0,1,0,1,1],
|
||
|
[0,1,1,1,0,1,1,1],
|
||
|
[1,1,1,1,0,1,1,1],
|
||
|
[1,1,1,1,1,1,1,1]
|
||
|
]
|
||
|
|
||
|
weighting = 0
|
||
|
|
||
|
def openFiles():
|
||
|
print('Reading input gcode… ', end='')
|
||
|
global inputFile
|
||
|
inputFile = open(inputFilename, "r")
|
||
|
print('done.')
|
||
|
|
||
|
|
||
|
def countLayers():
|
||
|
totalLayers = 0
|
||
|
print('Finding layer changes… ', end='')
|
||
|
for line in inputFile:
|
||
|
if 'LAYER_CHANGE' in line:
|
||
|
totalLayers+=1
|
||
|
print(totalLayers, "found.")
|
||
|
return totalLayers
|
||
|
|
||
|
|
||
|
# def generateGradient(totalLayers): # TABLED
|
||
|
# layerGroups = totalLayers / len(dithering[0])
|
||
|
# layerGroupsFloor = math.floor(layerGroups)
|
||
|
# print('Generating gradient… ', end='')
|
||
|
# gradientColour = []
|
||
|
# for layerGroup in range(layerGroupsFloor):
|
||
|
# chanceOfSecondary = layerGroup / layerGroups
|
||
|
# ditheredIndex = math.floor(chanceOfSecondary * len(dithering))
|
||
|
# for bit in dithering[ditheredIndex]:
|
||
|
# gradientColour.append(bit)
|
||
|
# print(len(gradientColour), 'gradient steps generated.')
|
||
|
# return gradientColour
|
||
|
|
||
|
|
||
|
|
||
|
# def generateGradient(totalLayers): # RANDOMISED
|
||
|
# weighting = 0
|
||
|
# gradientColour = []
|
||
|
# for layer in range(totalLayers):
|
||
|
# chanceOfSecondary = layer / totalLayers
|
||
|
# if random.random() > chanceOfSecondary:
|
||
|
# gradientColour.append(0)
|
||
|
# else:
|
||
|
# gradientColour.append(1)
|
||
|
# return gradientColour
|
||
|
|
||
|
|
||
|
def generateGradient(totalLayers): # WEIGHTED
|
||
|
print('Generating gradient steps… ', end='')
|
||
|
global weighting
|
||
|
changeThreshold = 1
|
||
|
gradientColour = []
|
||
|
for layer in range(totalLayers):
|
||
|
chanceOfSecondary = layer / totalLayers
|
||
|
weighting += chanceOfSecondary
|
||
|
if weighting >= changeThreshold:
|
||
|
gradientColour.append(1)
|
||
|
weighting -= changeThreshold
|
||
|
else:
|
||
|
gradientColour.append(0)
|
||
|
print(len(gradientColour), 'generated.')
|
||
|
return gradientColour
|
||
|
|
||
|
|
||
|
def previewGradient(gradient, totalLayers):
|
||
|
print('Gradient Preview:')
|
||
|
for bit in gradient:
|
||
|
if bit:
|
||
|
print('◻︎', end='')
|
||
|
else:
|
||
|
print('◼︎', end='')
|
||
|
print('')
|
||
|
|
||
|
|
||
|
def generateGcode(gradient):
|
||
|
toolchangeCount = 0
|
||
|
outputFile = open(outputFilename, "wb")
|
||
|
inputFile.seek(0)
|
||
|
print('Writing', outputFilename, '…')
|
||
|
for line in inputFile:
|
||
|
outputFile.write(line.encode('utf-8'))
|
||
|
if 'Layer: ' in line:
|
||
|
if toolchangeCount < len(gradient):
|
||
|
toolchange = "G10 ; retract\nT{0} ; toolchange\nG11 ; unretract\n".format(toolsToUse[gradient[toolchangeCount]])
|
||
|
outputFile.write(toolchange.encode('utf-8'))
|
||
|
toolchangeCount +=1
|
||
|
outputFile.close()
|
||
|
|
||
|
|
||
|
def closeFiles():
|
||
|
inputFile.close()
|
||
|
|
||
|
print('\n\n=======================\n LAYDIENT!\n=======================')
|
||
|
openFiles()
|
||
|
totalLayers = countLayers()
|
||
|
gradient = generateGradient(totalLayers)
|
||
|
previewGradient(gradient, totalLayers)
|
||
|
generateGcode(gradient)
|
||
|
closeFiles()
|
||
|
print('Done!')
|