I just got my MPCNC up and running but I had a hard time getting CAM software that I both liked and could afford. I started with ESTLCam but the interface didn’t make sense to me and it seemed to crash on me often creating a big annoyance when the demo period timeout increased quickly due to the repeated crashes. Maybe worth the $50 in the long run, but my problems with it drove me to keep looking. Other options gave me difficulty as well. Either overly complicated, too expensive or just didn’t work for me (CamBam, Fusion, MasterCam, etc).
I ended up settling on HeeksCNC for now. The interface just seemed to click with me. But I had a problem getting usable gcode from it b/c there were no suitable post processors. The resulting code seemed close but it wasn’t right. I looked into it and tweaked an included post processor to support Marlin firmware.
If anyone’s interested, I created a file called marlin.py in C:\Program Files (x86)\HeeksCNC 1.1\HeeksCNC\nc and modified machines.xml in the same directory to add the marlin post processor. This works with the demo and the full software.
I realized it’s somewhat limited but IMHO well worth the $15!
Chris
marlin.py:
#marlin.py based on emc2b.py
import nc
import iso_modal
import math
import datetime
import time
now = datetime.datetime.now()
class Creator(iso_modal.Creator):
def __init__(self):
iso_modal.Creator.__init__(self)
self.output_block_numbers = False
self.output_tool_definitions = False
self.output_g43_on_tool_change_line = True
self.g0123_modal = False
self.drill_modal = False
self.up_z = 20
def SPACE(self):
if self.start_of_line == True:
self.start_of_line = False
return ''
else:
return ' '
# Marlin doesn't support these M commands
# so override the defines to not use them
def SPINDLE_CW(self): return('')
def SPINDLE_CCW(self): return('')
def COOLANT_OFF(self): return('')
def COOLANT_MIST(self): return('')
def COOLANT_FLOOD(self): return('')
def INTERNAL_COOLANT_ON(self): return('')
def INTERNAL_COOLANT_OFF(self): return('')
def PROGRAM(self): return None
def PROGRAM_END(self): return( 'T0' + self.SPACE() + 'M06' + self.SPACE() + 'M02')
############################################################################
## Begin Program
def program_begin(self, id, comment):
if (self.useCrc == False):
self.write( ('(Created with Marlin post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') )
else:
self.write( ('(Created with emc2b Cutter Radius Compensation post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') )
# ADD CUSTOM START CODES HERE
self.write('(--- Start Custom Startup Code ---)\n')
self.rapid(0,0,15,0,0,0) # Set the start point
self.write('(--- End Custom Startup Code ---)\n')
iso_modal.Creator.program_begin(self, id, comment)
nc.creator = Creator()
machines.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<Machine post="emc2b" reader="iso_read" suffix=".ngc" description="LinuxCNC"/>
<Machine post="siegkx1" reader="iso_read" suffix=".tap" description="Mach3 Machine Controller"/>
<Machine post="DeckelFP4Ma" reader="iso_read" suffix=".ngc" description="Deckel FP4Ma"/>
<Machine post="marlin" reader="iso_read" suffix=".ngc" description="RepRap Marlin"/>