kopia lustrzana https://github.com/adliechty/realWorldGcodeSender
intermediate commit
rodzic
5bc08b7570
commit
d0098724bc
|
@ -11,6 +11,10 @@ from svgpathtools import svg2paths, wsvg, svg2paths2, polyline
|
||||||
from matplotlib import pyplot as plt
|
from matplotlib import pyplot as plt
|
||||||
from matplotlib.widgets import TextBox
|
from matplotlib.widgets import TextBox
|
||||||
from matplotlib.backend_bases import MouseButton
|
from matplotlib.backend_bases import MouseButton
|
||||||
|
from copy import deepcopy
|
||||||
|
from pygcode import Machine, GCodeRapidMove, GCodeFeedRate, GCodeLinearMove, GCodeUseMillimeters
|
||||||
|
import pygcode
|
||||||
|
from pygcode.gcodes import MODAL_GROUP_MAP
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
@ -180,15 +184,16 @@ class OverlayGcode:
|
||||||
self.rotation = 0
|
self.rotation = 0
|
||||||
self.cv2Overhead = cv2Overhead
|
self.cv2Overhead = cv2Overhead
|
||||||
self.move = False
|
self.move = False
|
||||||
#Generate matplotlib plot from opencv image
|
|
||||||
|
|
||||||
#return
|
|
||||||
fig, ax = plt.subplots()
|
fig, ax = plt.subplots()
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
plt.subplots_adjust(bottom=0.01, right = 0.99)
|
plt.subplots_adjust(bottom=0.01, right = 0.99)
|
||||||
plt.axis([self.bedViewSizePixels,0, self.bedViewSizePixels, 0])
|
plt.axis([self.bedViewSizePixels,0, self.bedViewSizePixels, 0])
|
||||||
|
#Generate matplotlib plot from opencv image
|
||||||
self.matPlotImage = plt.imshow(cv2.cvtColor(self.cv2Overhead, cv2.COLOR_BGR2RGB))
|
self.matPlotImage = plt.imshow(cv2.cvtColor(self.cv2Overhead, cv2.COLOR_BGR2RGB))
|
||||||
|
###############################################
|
||||||
|
# Generate controls for plot
|
||||||
|
###############################################
|
||||||
xAxes = plt.axes([0.01, 0.8, 0.2, 0.04])
|
xAxes = plt.axes([0.01, 0.8, 0.2, 0.04])
|
||||||
self.xBox = TextBox(xAxes, "xOffset (in)", initial="0")
|
self.xBox = TextBox(xAxes, "xOffset (in)", initial="0")
|
||||||
label = self.xBox.ax.get_children()[1] # label is a child of the TextBox axis
|
label = self.xBox.ax.get_children()[1] # label is a child of the TextBox axis
|
||||||
|
@ -217,7 +222,54 @@ class OverlayGcode:
|
||||||
cid = fig.canvas.mpl_connect('button_release_event', self.onrelease)
|
cid = fig.canvas.mpl_connect('button_release_event', self.onrelease)
|
||||||
cid = fig.canvas.mpl_connect('motion_notify_event', self.onmove)
|
cid = fig.canvas.mpl_connect('motion_notify_event', self.onmove)
|
||||||
|
|
||||||
self.paths, attributes, svg_attributes = svg2paths2("C:\\Git\\svgToGCode\\project_StorageBox\\0p5in_BoxBacks_x4_35by32.svg")
|
self.points = []
|
||||||
|
self.laserPowers = []
|
||||||
|
self.machine = Machine()
|
||||||
|
|
||||||
|
with open('test.nc', 'r') as fh:
|
||||||
|
for line_text in fh.readlines():
|
||||||
|
line = pygcode.Line(line_text)
|
||||||
|
self.machine.process_block(line.block)
|
||||||
|
|
||||||
|
######################################
|
||||||
|
# First determine machine motion mode and power
|
||||||
|
######################################
|
||||||
|
motion = str(self.machine.mode.modal_groups[MODAL_GROUP_MAP['motion']])
|
||||||
|
sCode = str(self.machine.mode.modal_groups[MODAL_GROUP_MAP['spindle_speed']])
|
||||||
|
power = sCode.split('S')[1]
|
||||||
|
#Make rapid movements 0 laser power
|
||||||
|
if motion == "G00" or motion == "G0":
|
||||||
|
self.laserPowers.append(0.0)
|
||||||
|
else:
|
||||||
|
self.laserPowers.append(float(power) / 100.0)
|
||||||
|
|
||||||
|
######################################
|
||||||
|
# Determine machine current unit, convert to inches
|
||||||
|
######################################
|
||||||
|
unit = str(self.machine.mode.modal_groups[MODAL_GROUP_MAP['units']])
|
||||||
|
if unit == "G20":
|
||||||
|
if motion == "G02" or motion == "G2" or motion == "G03" or motion == "G3":
|
||||||
|
print(line_text)
|
||||||
|
else:
|
||||||
|
self.points.append(Point3D(self.machine.pos.X, self.machine.pos.Y, self.machine.pos.Z))
|
||||||
|
else:
|
||||||
|
if motion == "G02" or motion == "G2" or motion == "G03" or motion == "G3":
|
||||||
|
print(line_text)
|
||||||
|
else:
|
||||||
|
self.points.append(Point3D(self.machine.pos.X / 25.4, self.machine.pos.Y / 25.4, self.machine.pos.Z / 25.4))
|
||||||
|
|
||||||
|
|
||||||
|
#scale mm to inches
|
||||||
|
#self.scalePoints(self.points, 1 / 25.4, 1 / 25.4)
|
||||||
|
#self.paths, attributes, svg_attributes = svg2paths2("C:\\Git\\svgToGCode\\project_StorageBox\\0p5in_BoxBacks_x4_35by32.svg")
|
||||||
|
#Generate a list of all points up front, non transformed
|
||||||
|
#self.points = []
|
||||||
|
#for path in self.paths:
|
||||||
|
# newPoints = pathToPoints3D(path, 10)
|
||||||
|
# self.points.extend(newPoints)
|
||||||
|
|
||||||
|
#scale mm to inches
|
||||||
|
#self.scalePoints(self.points, 1 / 25.4, 1 / 25.4)
|
||||||
self.updateOverlay()
|
self.updateOverlay()
|
||||||
|
|
||||||
def scalePoints(self, points, scaleX, scaleY):
|
def scalePoints(self, points, scaleX, scaleY):
|
||||||
|
@ -258,22 +310,20 @@ class OverlayGcode:
|
||||||
rotation = rotation * math.pi / 180
|
rotation = rotation * math.pi / 180
|
||||||
overlay = image.copy()
|
overlay = image.copy()
|
||||||
|
|
||||||
for path in self.paths:
|
#Make copy of points before transforming them
|
||||||
points = pathToPoints3D(path, 10)
|
transformedPoints = deepcopy(self.points)
|
||||||
#First scale mm to inches
|
#Apply an offset in inches
|
||||||
self.scalePoints(points, 1 / 25.4, 1 / 25.4)
|
self.offsetPoints(transformedPoints, xOff, yOff)
|
||||||
#Then apply an offset in inches
|
#Then rotate
|
||||||
self.offsetPoints(points, xOff, yOff)
|
self.rotatePoints(transformedPoints, [xOff, yOff], rotation)
|
||||||
#Then rotate
|
#Then convert to pixel location
|
||||||
self.rotatePoints(points, [xOff, yOff], rotation)
|
self.scalePoints(transformedPoints, self.bedViewSizePixels / self.bedSize.X, self.bedViewSizePixels / self.bedSize.Y)
|
||||||
#Then convert to pixel location
|
prevPoint = None
|
||||||
self.scalePoints(points, self.bedViewSizePixels / self.bedSize.X, self.bedViewSizePixels / self.bedSize.Y)
|
for point, laserPower in zip(transformedPoints, self.laserPowers):
|
||||||
prevPoint = None
|
newPoint = (int(point.X), int(point.Y))
|
||||||
for point in points:
|
if prevPoint is not None:
|
||||||
newPoint = (int(point.X), int(point.Y))
|
cv2.line(overlay, prevPoint, newPoint, (int(laserPower * 255), 0, 0), 1)
|
||||||
if prevPoint is not None:
|
prevPoint = newPoint
|
||||||
cv2.line(overlay, prevPoint, newPoint, (255, 0, 0), 1)
|
|
||||||
prevPoint = newPoint
|
|
||||||
return overlay
|
return overlay
|
||||||
|
|
||||||
def updateOverlay(self):
|
def updateOverlay(self):
|
||||||
|
|
Plik diff jest za duży
Load Diff
Ładowanie…
Reference in New Issue