From 0ddc6e1c58ef8119e31047b3c5472a8b47795114 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 18 May 2021 11:37:16 +0200 Subject: Add line length checker script --- scripts/line_length_checker.py | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 scripts/line_length_checker.py (limited to 'scripts') diff --git a/scripts/line_length_checker.py b/scripts/line_length_checker.py new file mode 100644 index 0000000000..88cafab3e9 --- /dev/null +++ b/scripts/line_length_checker.py @@ -0,0 +1,70 @@ +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: ") + sys.exit(1) + + in_filename = sys.argv[1] + loadAndPrettyPrint(sys.argv[1]) -- cgit v1.2.3