|
|
|
|
|
|
|
|
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) |