| |
|
|
| import re |
| from decimal import Decimal |
|
|
| def analyze_settings(gcode): |
| |
| settings = { |
| "Unit System": set(), |
| "Mode": set(), |
| "Selected Plane": set(), |
| "Work Coordinates": set(), |
| "Spindle Speed": set(), |
| "Spindle Rotation": set(), |
| "Feed Rate": set(), |
| "Maximum Depth": None, |
| } |
|
|
| lines = gcode.splitlines() |
| max_depth = None |
| unit_system = "mm/min" |
|
|
| for line in lines: |
| if "G20" in line: |
| settings["Unit System"].add("Imperial Units") |
| unit_system = "in/min" |
| elif "G21" in line: |
| settings["Unit System"].add("Metric Units") |
| unit_system = "mm/min" |
| |
| if "G90" in line: |
| settings["Mode"].add("Absolute Programming") |
| elif "G91" in line: |
| settings["Mode"].add("Incremental Programming") |
| |
| if "G17" in line: |
| settings["Selected Plane"].add("X-Y Plane") |
| elif "G18" in line: |
| settings["Selected Plane"].add("Z-X Plane") |
| elif "G19" in line: |
| settings["Selected Plane"].add("Z-Y Plane") |
| |
| work_coords = {"G54", "G55", "G56", "G57", "G58", "G59"} |
| for coord in work_coords: |
| if coord in line: |
| settings["Work Coordinates"].add(coord) |
| |
| if "M03" in line: |
| settings["Spindle Rotation"].add("Clockwise") |
| elif "M04" in line: |
| settings["Spindle Rotation"].add("Counterclockwise") |
| |
| |
| spindle_speed = re.search(r"S(\d+)", line) |
| if spindle_speed: |
| settings["Spindle Speed"].add(spindle_speed.group(1) + " RPM") |
| |
| feed_rate = re.search(r"F(\d+\.?\d*)", line) |
| if feed_rate: |
| settings["Feed Rate"].add(feed_rate.group(1) + f" {unit_system}") |
| |
| z_value = re.search(r"Z(-?\d+\.?\d*)", line) |
| if z_value: |
| try: |
| depth = Decimal(z_value.group(1)) |
| if max_depth is None or depth < max_depth: |
| max_depth = depth |
| except Exception as e: |
| print(f"Error processing Z depth in line: {line}, error: {e}") |
|
|
| |
| if max_depth is not None: |
| unit = "mm" if "Metric Units" in settings["Unit System"] else "in" |
| settings["Maximum Depth"] = f"{abs(max_depth)} {unit}" |
| |
| |
| for key, value in settings.items(): |
| if isinstance(value, set): |
| settings[key] = sorted(value) |
|
|
| return settings |
|
|
| def generate_detailed_report(gcode): |
| settings = analyze_settings(gcode) |
| report = [] |
| for key in ["Unit System", "Mode", "Selected Plane", "Work Coordinates", "Spindle Speed", "Spindle Rotation", "Feed Rate", "Maximum Depth"]: |
| if isinstance(settings[key], list): |
| |
| report.append(f"{key}: {', '.join(settings[key])}") |
| else: |
| report.append(f"{key}: {settings[key]}") |
| return "\n".join(report) |
|
|
| |
| if __name__ == "__main__": |
| |
| gcode_sample = """ |
| G21 G90 G54 G17 |
| G0 X0 Y0 Z5.0 |
| M03 S1000 |
| G1 Z-0.1 F100 |
| G1 X10 Y10 Z-0.1 |
| M04 S1200 |
| G91 |
| G1 X20 Y20 F150 |
| G1 Z-0.2 |
| G90 |
| G1 Z5.0 |
| M05 |
| M30 |
| % |
| """ |
|
|
| |
| report = generate_detailed_report(gcode_sample) |
| print("G-code Detailed Report") |
| print("=" * 40) |
| print(report) |