Update app.py
Browse files
app.py
CHANGED
|
@@ -1,43 +1,77 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
import
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
# Function to generate G-code based on user input
|
| 5 |
def generate_gcode(length, diameter, feed_rate):
|
| 6 |
-
"""
|
| 7 |
-
Generates a simple G-code string based on user inputs.
|
| 8 |
-
"""
|
| 9 |
gcode = []
|
| 10 |
gcode.append(f"(Generated G-code for length={length}, diameter={diameter}, feed_rate={feed_rate})")
|
| 11 |
gcode.append("G21 ; Set units to millimeters")
|
| 12 |
gcode.append("G90 ; Absolute positioning mode")
|
| 13 |
-
gcode.append("G17 ; Select XY plane")
|
| 14 |
gcode.append("M03 S1000 ; Start spindle at 1000 RPM")
|
| 15 |
gcode.append("G00 Z5.0 ; Move to safe height")
|
| 16 |
-
gcode.append(f"
|
| 17 |
-
gcode.append(f"G01
|
| 18 |
-
gcode.append(f"G01 X{length} F{feed_rate} ; Linear move along X-axis")
|
| 19 |
-
gcode.append(f"G01 Y{diameter} F{feed_rate} ; Linear move along Y-axis")
|
| 20 |
gcode.append("G00 Z5.0 ; Retract to safe height")
|
| 21 |
gcode.append("M05 ; Stop spindle")
|
| 22 |
-
gcode.append("M30 ; End
|
| 23 |
return "\n".join(gcode)
|
| 24 |
|
| 25 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
def main_interface(length, diameter, feed_rate):
|
| 27 |
gcode = generate_gcode(length, diameter, feed_rate)
|
| 28 |
-
|
|
|
|
|
|
|
| 29 |
|
| 30 |
-
#
|
| 31 |
inputs = [
|
| 32 |
gr.Number(label="Length (mm)", value=50),
|
| 33 |
gr.Number(label="Diameter (mm)", value=20),
|
| 34 |
gr.Number(label="Feed Rate (mm/min)", value=100)
|
| 35 |
]
|
| 36 |
|
| 37 |
-
outputs =
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
|
| 39 |
-
title = "CNC G-code Generator"
|
| 40 |
-
description = "
|
| 41 |
|
| 42 |
demo = gr.Interface(
|
| 43 |
fn=main_interface,
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
import numpy as np
|
| 3 |
+
import matplotlib.pyplot as plt
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
import io
|
| 6 |
|
| 7 |
# Function to generate G-code based on user input
|
| 8 |
def generate_gcode(length, diameter, feed_rate):
|
|
|
|
|
|
|
|
|
|
| 9 |
gcode = []
|
| 10 |
gcode.append(f"(Generated G-code for length={length}, diameter={diameter}, feed_rate={feed_rate})")
|
| 11 |
gcode.append("G21 ; Set units to millimeters")
|
| 12 |
gcode.append("G90 ; Absolute positioning mode")
|
|
|
|
| 13 |
gcode.append("M03 S1000 ; Start spindle at 1000 RPM")
|
| 14 |
gcode.append("G00 Z5.0 ; Move to safe height")
|
| 15 |
+
gcode.append(f"G01 X{length} Y0 F{feed_rate} ; Linear move to length")
|
| 16 |
+
gcode.append(f"G01 X{length} Y{diameter} F{feed_rate} ; Move to diameter")
|
|
|
|
|
|
|
| 17 |
gcode.append("G00 Z5.0 ; Retract to safe height")
|
| 18 |
gcode.append("M05 ; Stop spindle")
|
| 19 |
+
gcode.append("M30 ; End program")
|
| 20 |
return "\n".join(gcode)
|
| 21 |
|
| 22 |
+
# Function to generate 2D visualization
|
| 23 |
+
def generate_2d_plot(length, diameter):
|
| 24 |
+
fig, ax = plt.subplots()
|
| 25 |
+
ax.plot([0, length, length, 0, 0], [0, 0, diameter, diameter, 0], color='blue')
|
| 26 |
+
ax.set_title("2D Visualization of Toolpath")
|
| 27 |
+
ax.set_xlabel("Length (mm)")
|
| 28 |
+
ax.set_ylabel("Diameter (mm)")
|
| 29 |
+
ax.set_aspect('equal')
|
| 30 |
+
buf = io.BytesIO()
|
| 31 |
+
plt.savefig(buf, format='png')
|
| 32 |
+
buf.seek(0)
|
| 33 |
+
return buf
|
| 34 |
+
|
| 35 |
+
# Function to generate 3D visualization
|
| 36 |
+
def generate_3d_plot(length, diameter):
|
| 37 |
+
X = np.linspace(0, length, 50)
|
| 38 |
+
Y = np.linspace(0, diameter, 50)
|
| 39 |
+
X, Y = np.meshgrid(X, Y)
|
| 40 |
+
Z = np.zeros_like(X)
|
| 41 |
+
|
| 42 |
+
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y, colorscale="Blues")])
|
| 43 |
+
fig.update_layout(
|
| 44 |
+
title="3D Visualization of Toolpath",
|
| 45 |
+
scene=dict(
|
| 46 |
+
xaxis_title="Length (mm)",
|
| 47 |
+
yaxis_title="Diameter (mm)",
|
| 48 |
+
zaxis_title="Height"
|
| 49 |
+
)
|
| 50 |
+
)
|
| 51 |
+
return fig
|
| 52 |
+
|
| 53 |
+
# Main interface function
|
| 54 |
def main_interface(length, diameter, feed_rate):
|
| 55 |
gcode = generate_gcode(length, diameter, feed_rate)
|
| 56 |
+
plot_2d = generate_2d_plot(length, diameter)
|
| 57 |
+
plot_3d = generate_3d_plot(length, diameter)
|
| 58 |
+
return gcode, plot_2d, plot_3d
|
| 59 |
|
| 60 |
+
# Gradio Interface
|
| 61 |
inputs = [
|
| 62 |
gr.Number(label="Length (mm)", value=50),
|
| 63 |
gr.Number(label="Diameter (mm)", value=20),
|
| 64 |
gr.Number(label="Feed Rate (mm/min)", value=100)
|
| 65 |
]
|
| 66 |
|
| 67 |
+
outputs = [
|
| 68 |
+
gr.Textbox(label="Generated G-code", lines=15),
|
| 69 |
+
gr.Image(label="2D Visualization"),
|
| 70 |
+
gr.Plot(label="3D Visualization")
|
| 71 |
+
]
|
| 72 |
|
| 73 |
+
title = "CNC G-code Generator with Visualization"
|
| 74 |
+
description = "Generate CNC G-code with 2D and 3D visualizations. Input the length, diameter, and feed rate to preview the toolpath."
|
| 75 |
|
| 76 |
demo = gr.Interface(
|
| 77 |
fn=main_interface,
|