mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-19 20:29:40 +08:00
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
import re
|
|
import sys
|
|
|
|
def getValue(line: str, key: str, default = None):
|
|
"""Convenience function that finds the value in a line of g-code.
|
|
When requesting key = x from line "G1 X100" the value 100 is returned.
|
|
"""
|
|
if not key in line or (';' in line and line.find(key) > line.find(';')):
|
|
return default
|
|
sub_part = line[line.find(key) + 1:]
|
|
m = re.search('^-?[0-9]+\.?[0-9]*', sub_part)
|
|
if m is None:
|
|
return default
|
|
try:
|
|
return int(m.group(0))
|
|
except ValueError: #Not an integer.
|
|
try:
|
|
return float(m.group(0))
|
|
except ValueError: #Not a number at all.
|
|
return default
|
|
|
|
def analyse(gcode, distance_to_report, print_layers = False):
|
|
lines_found = 0
|
|
previous_x = 0
|
|
previous_y = 0
|
|
dist_squared = distance_to_report * distance_to_report
|
|
current_layer = 0
|
|
for line in gcode.split("\n"):
|
|
if not line.startswith("G1"):
|
|
if line.startswith(";LAYER:"):
|
|
previous_x = 0
|
|
previous_y = 0
|
|
current_layer += 1
|
|
continue
|
|
current_x = getValue(line, "X")
|
|
current_y = getValue(line, "Y")
|
|
if current_x is None or current_y is None:
|
|
continue
|
|
diff_x = current_x - previous_x
|
|
diff_y = current_y - previous_y
|
|
if diff_x * diff_x + diff_y * diff_y < dist_squared:
|
|
lines_found += 1
|
|
if print_layers:
|
|
print("[!] ", distance_to_report, " layer ", current_layer, " ", previous_x, previous_y)
|
|
previous_y = current_y
|
|
previous_x = current_x
|
|
return lines_found
|
|
|
|
def loadAndPrettyPrint(file_name):
|
|
print(file_name.replace(".gcode",""))
|
|
with open(file_name) as f:
|
|
data = f.read()
|
|
print("| Line length | Num segments |")
|
|
print("| ------------- | ------------- |")
|
|
print("| 1 |", analyse(data, 1), "|")
|
|
print("| 0.5 |", analyse(data, 0.5), "|")
|
|
print("| 0.1 |", analyse(data, 0.1), "|")
|
|
print("| 0.05 |", analyse(data, 0.05), "|")
|
|
print("| 0.01 |", analyse(data, 0.01), "|")
|
|
print("| 0.005 |", analyse(data, 0.005), "|")
|
|
print("| 0.001 |", analyse(data, 0.001), "|")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 2 :
|
|
print("Usage: <input g-code>")
|
|
sys.exit(1)
|
|
|
|
in_filename = sys.argv[1]
|
|
loadAndPrettyPrint(sys.argv[1])
|