You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
### based on https://github.com/dsdanielko/cura-ringing-tower-script/
|
|
### created for E3S1PROFORKBYTT by Thomas Toka for Cura Slicer
|
|
|
|
import json
|
|
import re
|
|
|
|
from ..Script import Script
|
|
|
|
class E3S1PROFORKBYTT_InputShaping(Script):
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
def getSettingDataString(self):
|
|
return json.dumps({
|
|
'name': 'E3S1PROFORKBYTT InputShaping',
|
|
'key': 'E3S1PROFORKBYTT InputShaping',
|
|
'metadata': {},
|
|
'version': 2,
|
|
'settings': {
|
|
"gcode": {
|
|
"label": "Motion planning type",
|
|
"description": "Use either M593 (ZV input shaping) or M493 (Fixed-time motion)",
|
|
"type": "enum",
|
|
"options": {
|
|
"is": "M593 (ZV Input Shaping)",
|
|
"ftm": "M493 (Fixed-Time Motion)"
|
|
},
|
|
"default_value": "is"
|
|
},
|
|
'start_f': {
|
|
'label': 'Start frequency',
|
|
'description': 'Ringing compensation frequency sweep start value',
|
|
'unit': 'Hz',
|
|
'type': 'int',
|
|
'default_value': 20
|
|
},
|
|
'end_f': {
|
|
'label': 'End frequency',
|
|
'description': 'Ringing compensation frequency sweep end value',
|
|
'unit': 'Hz',
|
|
'type': 'int',
|
|
'default_value': 60
|
|
},
|
|
'linear_advance_k': {
|
|
'label': 'Reenable LA after Test with K',
|
|
'description': 'Reenable LA after Test with K',
|
|
'unit': '',
|
|
'type': 'float',
|
|
'default_value': 0.03
|
|
}
|
|
}
|
|
})
|
|
|
|
def execute(self, data):
|
|
gc = self.getSettingValueByKey('gcode')
|
|
start_hz = self.getSettingValueByKey('start_f')
|
|
end_hz = self.getSettingValueByKey('end_f')
|
|
linear_advance_k = self.getSettingValueByKey('linear_advance_k')
|
|
linear_advance_disabled = False
|
|
|
|
for i, layer in enumerate(data):
|
|
lines = layer.split('\n')
|
|
for j, line in enumerate(lines):
|
|
if line.startswith(";LAYER_COUNT:"):
|
|
max_layer = float(line.strip(';LAYER_COUNT:'))
|
|
elif line.startswith(';LAYER:'):
|
|
layer = float(line.strip(';LAYER:'))
|
|
hz = 0 if layer < 2 else start_hz + (end_hz - start_hz) * (layer - 2) / (max_layer - 3)
|
|
if gc == 'ftm':
|
|
if layer == 0:
|
|
lines[j] += '\n;TYPE:INPUTSHAPING\nM493 S11 D0 ;Enable ZVD Input Shaping'
|
|
lines[j] += '\n;TYPE:INPUTSHAPING\nM493 A%f ;(Hz) X Input Shaping Test' % hz
|
|
lines[j] += '\nM493 B%f ;(Hz) Y Input Shaping Test' % hz
|
|
if gc == 'is':
|
|
if not linear_advance_disabled:
|
|
lines[j] = 'M900 K0 ;disable Linear Advance\n' + lines[j]
|
|
linear_advance_disabled = True
|
|
lines[j] += '\n;TYPE:INPUTSHAPING\nM593 F%f ;(Hz) Input Shaping Test' % hz
|
|
data[i] = '\n'.join(lines)
|
|
|
|
# Re-enable Linear Advance with the specified K-factor after the last line
|
|
data[-1] += '\nM900 K%f ;re-enable Linear Advance with specified K-factor\n' % linear_advance_k
|
|
|
|
return data |