Created class CNCjob
This commit is contained in:
121
camlib.py
121
camlib.py
@@ -106,7 +106,7 @@ class Gerber():
|
|||||||
"width":float(gline[indexO+2:indexX]),
|
"width":float(gline[indexO+2:indexX]),
|
||||||
"height":float(gline[indexX+1:indexstar])}
|
"height":float(gline[indexX+1:indexstar])}
|
||||||
return apid
|
return apid
|
||||||
print "Aperture not implemented:", gline
|
print "WARNING: Aperture not implemented:", gline
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def parse_file(self, filename):
|
def parse_file(self, filename):
|
||||||
@@ -119,7 +119,6 @@ class Gerber():
|
|||||||
'''
|
'''
|
||||||
Main Gerber parser.
|
Main Gerber parser.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
path = [] # Coordinates of the current path
|
path = [] # Coordinates of the current path
|
||||||
last_path_aperture = None
|
last_path_aperture = None
|
||||||
current_aperture = None
|
current_aperture = None
|
||||||
@@ -171,6 +170,8 @@ class Gerber():
|
|||||||
indexX = gline.find("X")
|
indexX = gline.find("X")
|
||||||
self.digits = int(gline[indexX + 1])
|
self.digits = int(gline[indexX + 1])
|
||||||
self.fraction = int(gline[indexX + 2])
|
self.fraction = int(gline[indexX + 2])
|
||||||
|
continue
|
||||||
|
print "WARNING: Line ignored:", gline
|
||||||
|
|
||||||
def create_geometry(self):
|
def create_geometry(self):
|
||||||
if len(self.buffered_paths) == 0:
|
if len(self.buffered_paths) == 0:
|
||||||
@@ -193,12 +194,128 @@ class Gerber():
|
|||||||
maxy = loc[1] + height/2
|
maxy = loc[1] + height/2
|
||||||
rectangle = shply_box(minx, miny, maxx, maxy)
|
rectangle = shply_box(minx, miny, maxx, maxy)
|
||||||
flash_polys.append(rectangle)
|
flash_polys.append(rectangle)
|
||||||
|
continue
|
||||||
|
print "WARNING: Aperture type %s not implemented"%(aperture['type'])
|
||||||
#TODO: Add support for type='O'
|
#TODO: Add support for type='O'
|
||||||
self.solid_geometry = cascaded_union(
|
self.solid_geometry = cascaded_union(
|
||||||
self.buffered_paths +
|
self.buffered_paths +
|
||||||
[poly['polygon'] for poly in self.regions] +
|
[poly['polygon'] for poly in self.regions] +
|
||||||
flash_polys)
|
flash_polys)
|
||||||
|
|
||||||
|
class CNCjob():
|
||||||
|
def __init__(self, units="in", kind="generic", z_move = 0.1,
|
||||||
|
feedrate = 3.0, z_cut = -0.002):
|
||||||
|
# Options
|
||||||
|
self.kind = kind
|
||||||
|
self.units = units
|
||||||
|
self.z_cut = z_cut
|
||||||
|
self.z_move = z_move
|
||||||
|
self.feedrate = feedrate
|
||||||
|
|
||||||
|
# Constants
|
||||||
|
self.unitcode = {"in": "G20", "mm": "G21"}
|
||||||
|
self.pausecode = "G04 P1"
|
||||||
|
self.feedminutecode = "G94"
|
||||||
|
self.absolutecode = "G90"
|
||||||
|
|
||||||
|
# Output G-Code
|
||||||
|
self.gcode = ""
|
||||||
|
|
||||||
|
def generate_from_geometry(self, geometry, append=True):
|
||||||
|
if append == False:
|
||||||
|
self.gcode = ""
|
||||||
|
t = "G0%d X%.4fY%.4f\n"
|
||||||
|
self.gcode = self.unitcode[self.units] + "\n"
|
||||||
|
self.gcode += self.absolutecode + "\n"
|
||||||
|
self.gcode += self.feedminutecode + "\n"
|
||||||
|
self.gcode += "F%.2f\n"%self.feedrate
|
||||||
|
self.gcode += "G00 Z%.4f\n"%self.z_move # Move to travel height
|
||||||
|
self.gcode += "M03\n" # Spindle start
|
||||||
|
self.gcode += self.pausecode + "\n"
|
||||||
|
for geo in geometry:
|
||||||
|
|
||||||
|
if type(geo) == Polygon:
|
||||||
|
path = list(geo.exterior.coords) # Polygon exterior
|
||||||
|
self.gcode += t%(0, path[0][0], path[0][1]) # Move to first point
|
||||||
|
self.gcode += "G01 Z%.4f\n"%self.z_cut # Start cutting
|
||||||
|
for pt in path[1:]:
|
||||||
|
self.gcode += t%(1, pt[0], pt[1]) # Linear motion to point
|
||||||
|
self.gcode += "G00 Z%.4f\n"%self.z_move # Stop cutting
|
||||||
|
for ints in geo.interiors: # Polygon interiors
|
||||||
|
path = list(ints.coords)
|
||||||
|
self.gcode += t%(0, path[0][0], path[0][1]) # Move to first point
|
||||||
|
self.gcode += "G01 Z%.4f\n"%self.z_cut # Start cutting
|
||||||
|
for pt in path[1:]:
|
||||||
|
self.gcode += t%(1, pt[0], pt[1]) # Linear motion to point
|
||||||
|
self.gcode += "G00 Z%.4f\n"%self.z_move # Stop cutting
|
||||||
|
continue
|
||||||
|
|
||||||
|
if type(geo) == LineString or type(geo) == LineRing:
|
||||||
|
path = list(geo.coords)
|
||||||
|
self.gcode += t%(0, path[0][0], path[0][1]) # Move to first point
|
||||||
|
self.gcode += "G01 Z%.4f\n"%self.z_cut # Start cutting
|
||||||
|
for pt in path[1:]:
|
||||||
|
self.gcode += t%(1, pt[0], pt[1]) # Linear motion to point
|
||||||
|
self.gcode += "G00 Z%.4f\n"%self.z_move # Stop cutting
|
||||||
|
continue
|
||||||
|
|
||||||
|
if type(geo) == Point:
|
||||||
|
path = list(geo.coords)
|
||||||
|
self.gcode += t%(0, path[0][0], path[0][1]) # Move to first point
|
||||||
|
self.gcode += "G01 Z%.4f\n"%self.z_cut # Start cutting
|
||||||
|
self.gcode += "G00 Z%.4f\n"%self.z_move # Stop cutting
|
||||||
|
continue
|
||||||
|
|
||||||
|
print "WARNING: G-code generation not implemented for %s"%(str(type(geo)))
|
||||||
|
|
||||||
|
self.gcode += "M05\n" # Spindle stop
|
||||||
|
|
||||||
|
def create_gcode_geometry(self):
|
||||||
|
geometry = []
|
||||||
|
|
||||||
|
gobjs = gparse1b(self.gcode)
|
||||||
|
|
||||||
|
# Last known instruction
|
||||||
|
current = {'X': 0.0, 'Y': 0.0, 'Z': 0.0, 'G': 0}
|
||||||
|
|
||||||
|
# Process every instruction
|
||||||
|
for gobj in gobjs:
|
||||||
|
if 'Z' in gobj:
|
||||||
|
if ('X' in gobj or 'Y' in gobj) and gobj['Z'] != current['Z']:
|
||||||
|
print "WARNING: No orthogonal motion: From", current
|
||||||
|
print " To:", gobj
|
||||||
|
current['Z'] = gobj['Z']
|
||||||
|
|
||||||
|
if 'G' in gobj:
|
||||||
|
current['G'] = gobj['G']
|
||||||
|
|
||||||
|
if 'X' in gobj or 'Y' in gobj:
|
||||||
|
x = 0
|
||||||
|
y = 0
|
||||||
|
kind = ["C","F"] # T=travel, C=cut, F=fast, S=slow
|
||||||
|
if 'X' in gobj:
|
||||||
|
x = gobj['X']
|
||||||
|
else:
|
||||||
|
x = current['X']
|
||||||
|
if 'Y' in gobj:
|
||||||
|
y = gobj['Y']
|
||||||
|
else:
|
||||||
|
y = current['Y']
|
||||||
|
if current['Z'] > 0:
|
||||||
|
kind[0] = 'T'
|
||||||
|
if current['G'] == 1:
|
||||||
|
kind[1] = 'S'
|
||||||
|
geometry.append({'geom':LineString([(current['X'],current['Y']),
|
||||||
|
(x,y)]), 'kind':kind})
|
||||||
|
|
||||||
|
# Update current instruction
|
||||||
|
for code in gobj:
|
||||||
|
current[code] = gobj[code]
|
||||||
|
|
||||||
|
return geometry
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def fix_poly(poly):
|
def fix_poly(poly):
|
||||||
'''
|
'''
|
||||||
Fixes polygons with internal cutouts by identifying
|
Fixes polygons with internal cutouts by identifying
|
||||||
|
|||||||
BIN
camlib.pyc
BIN
camlib.pyc
Binary file not shown.
Reference in New Issue
Block a user