def __init__(self): self.i = linuxcnc.ini(os.environ['INI_FILE_NAME']) self.s = linuxcnc.stat() self.c = linuxcnc.command() try: # we need this to connect to hal if not hal.component_exists('dummy'): self.h = hal.component('dummy') self.h.ready() except: print('Error connecting to HAL instance') self.exit() # no point in continuing if not paused if not hal.get_value('halui.program.is-paused'): print('Cannot load cut recovery because program is not paused') self.exit() self.clear_offsets() self.xOrig = hal.get_value('axis.x.eoffset-counts') self.yOrig = hal.get_value('axis.y.eoffset-counts') self.zOrig = hal.get_value('axis.z.eoffset-counts') self.oScale = hal.get_value('plasmac.offset-scale') self.xMin = float(self.i.find('AXIS_X', 'MIN_LIMIT')) self.xMax = float(self.i.find('AXIS_X', 'MAX_LIMIT')) self.yMin = float(self.i.find('AXIS_Y', 'MIN_LIMIT')) self.yMax = float(self.i.find('AXIS_Y', 'MAX_LIMIT')) self.zMin = float(self.i.find('AXIS_Z', 'MIN_LIMIT')) self.zMax = float(self.i.find('AXIS_Z', 'MAX_LIMIT')) self.cancelWait = False self.resumeWait = False gobject.timeout_add(200, self.periodic)
def __init__(self, halcomp,builder,useropts): self.plasmacVersion = 'PlasmaC v0.174' self.W = gtk.Window() self.halcomp = halcomp self.builder = builder self.i = linuxcnc.ini(os.environ['INI_FILE_NAME']) hal_glib.GPin(halcomp.newpin('config-disable', hal.HAL_BIT, hal.HAL_IN)) configDisable = self.i.find('PLASMAC', 'CONFIG_DISABLE') or '0' hal.set_p('plasmac_config.config-disable',configDisable) self.idlePin = hal_glib.GPin(halcomp.newpin('program-is-idle', hal.HAL_BIT, hal.HAL_IN)) hal.connect('plasmac_config.program-is-idle', 'plasmac:program-is-idle') self.idlePin.connect('value-changed', self.idle_changed) self.thcFeedRate = (float(self.i.find('AXIS_Z', 'MAX_VELOCITY')) * \ float(self.i.find('AXIS_Z', 'OFFSET_AV_RATIO'))) * 60 self.configFile = self.i.find('EMC', 'MACHINE').lower() + '_config.cfg' self.prefFile = self.i.find('EMC', 'MACHINE') + '.pref' self.configDict = {} self.oldMode = 9 self.materialsUpdate = False self.maxHeight = hal.get_value('ini.z.max_limit') - hal.get_value('ini.z.min_limit') self.configure_widgets() self.builder.get_object('probe-feed-rate-adj').set_upper(self.builder.get_object('setup-feed-rate').get_value()) self.load_settings() self.set_theme() gobject.timeout_add(100, self.periodic)
def coords(self): #print(self.comp["tooldiameter"]) try: leng = hal.get_value('motion.tooloffset.z') * self.MODEL_SCALING except: leng = 0 try: xleng = hal.get_value('motion.tooloffset.x') * self.MODEL_SCALING except: xleng = 0 x1 = leng z1 = -xleng x2 = 1 #self.comp["tool-x-offset"]+10 z2 = -leng / 2 x3 = 2 #self.comp["tooldiameter"] z3 = 0 if self.comp["millkins"]: x1 = 0 z1 = -leng x2 = -2 #-self.comp["tooldiameter"]/2-0.01 z2 = 0 x3 = 2 #self.comp["tooldiameter"]/2+0.01 z3 = 0 return (x1, z1, x2, z2, x3, z3, 0, 1)
def cut_length_changed(self, halpin): if halpin.get(): self.thisCutLength = halpin.get() if hal.get_value('halui.machine.units-per-mm') == 1: self.builder.get_object('cut-lengthT').set_label( '{:.2f} M'.format( (self.CUT_LENGTH + self.thisCutLength) * 0.001)) self.builder.get_object('cut-length').set_label( '{:.2f} M'.format( (self.cut_length + self.thisCutLength) * 0.001)) else: self.builder.get_object('cut-lengthT').set_label( '{:.2f}\"'.format(self.CUT_LENGTH + self.thisCutLength)) self.builder.get_object('cut-length').set_label( '{:.2f}\"'.format(self.cut_length + self.thisCutLength)) else: self.CUT_LENGTH += self.thisCutLength self.cut_length += self.thisCutLength if hal.get_value('halui.machine.units-per-mm') == 1: self.builder.get_object('cut-lengthT').set_label( '{:.2f} M'.format(self.CUT_LENGTH * 0.001)) else: self.builder.get_object('cut-lengthT').set_label( '{:.2f}\"'.format(self.CUT_LENGTH)) self.thisCutLength = 0
def periodic(self): self.s.poll() isIdleHomed = True isIdleOn = True if hal.get_value('halui.program.is-idle') and hal.get_value('halui.machine.is-on'): if hal.get_value('plasmac.arc-ok-out'): isIdleOn = False for joint in range(0,int(self.i.find('KINS','JOINTS'))): if not self.s.homed[joint]: isIdleHomed = False break else: isIdleHomed = False isIdleOn = False for n in range(1,5): if 'ohmic-test' in self.iniButtonCode[n]: # or 'probe-test' in self.iniButtonCode[n]: if isIdleOn or hal.get_value('halui.program.is-paused'): self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) # elif not self.iniButtonCode[n] in ['ohmic-test'] and not self.iniButtonCode[n].startswith('%'): elif not self.iniButtonCode[n].startswith('%'): if isIdleHomed: self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) if self.probeTimer: if time.time() >= self.probeTimer: self.probeTimer = 0 if not self.probePressed: hal.set_p('plasmac.probe-test','0') return True
def periodic(self): units = hal.get_value('halui.machine.units-per-mm') maxPidP = self.thcFeedRate / units * 0.1 self.builder.get_object('config').set_sensitive( not hal.get_value('plasmac_config.config-disable')) mode = hal.get_value('plasmac.mode') if mode != self.oldMode: if mode == 0: self.builder.get_object('arc-ok-high').show() self.builder.get_object('arc-ok-high-label').set_text( 'OK High Volts') self.builder.get_object('arc-ok-low').show() self.builder.get_object('arc-ok-low-label').set_text( 'OK Low Volts') self.builder.get_object('arc-voltage-scale').show() self.builder.get_object('arc-voltage-scale-label').set_text( 'Voltage Scale') self.builder.get_object('arc-voltage-offset').show() self.builder.get_object('arc-voltage-offset-label').set_text( 'Voltage Offset') self.builder.get_object('height-per-volt-box').show() self.builder.get_object('pid-i-gain').show() self.builder.get_object('pid-i-label').set_text('PID I GAIN') self.builder.get_object('pid-d-gain').show() self.builder.get_object('pid-d-label').set_text('PID D GAIN') elif mode == 1: self.builder.get_object('arc-ok-high').hide() self.builder.get_object('arc-ok-high-label').set_text('') self.builder.get_object('arc-ok-low').hide() self.builder.get_object('arc-ok-low-label').set_text('') self.builder.get_object('arc-voltage-scale').show() self.builder.get_object('arc-voltage-scale-label').set_text( 'Voltage -scale') self.builder.get_object('arc-voltage-offset').show() self.builder.get_object('arc-voltage-offset-label').set_text( 'Voltage -offset') self.builder.get_object('height-per-volt-box').show() self.builder.get_object('pid-i-gain').show() self.builder.get_object('pid-i-label').set_text('PID I GAIN') self.builder.get_object('pid-d-gain').show() self.builder.get_object('pid-d-label').set_text('PID D GAIN') elif mode == 2: self.builder.get_object('arc-ok-high').hide() self.builder.get_object('arc-ok-high-label').set_text('') self.builder.get_object('arc-ok-low').hide() self.builder.get_object('arc-ok-low-label').set_text('') self.builder.get_object('arc-voltage-scale').hide() self.builder.get_object('arc-voltage-scale-label').set_text('') self.builder.get_object('arc-voltage-offset').hide() self.builder.get_object('arc-voltage-offset-label').set_text( '') self.builder.get_object('height-per-volt-box').hide() self.builder.get_object('pid-i-gain').hide() self.builder.get_object('pid-i-label').set_text('') self.builder.get_object('pid-d-gain').hide() self.builder.get_object('pid-d-label').set_text('') else: pass self.oldMode = mode return True
def periodic(self): self.s.poll() isIdleHomed = True isIdleOn = True if hal.get_value('halui.program.is-idle') and hal.get_value('halui.machine.is-on'): if hal.get_value('plasmac.arc-ok-out'): isIdleOn = False for joint in range(0,int(self.i.find('KINS','JOINTS'))): if not self.s.homed[joint]: isIdleHomed = False break else: isIdleHomed = False isIdleOn = False for n in range(1,5): if 'change-consumables' in self.iniButtonCode[n]: if hal.get_value('halui.program.is-paused') and \ hal.get_value('plasmac.stop-type-out') > 1 and not \ hal.get_value('plasmac.cut-recovering'): self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) elif 'ohmic-test' in self.iniButtonCode[n]: if isIdleOn or hal.get_value('halui.program.is-paused'): self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) elif not 'cut-type' in self.iniButtonCode[n] and not self.iniButtonCode[n].startswith('%'): if isIdleHomed: self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) if self.probeTimer: if hal.get_value('plasmac.probe-test-error') and not self.probePressed: self.probeTimer = 0 elif time.time() >= self.probeStart + 1: self.probeStart += 1 self.probeTimer -= 1 self.probeButton.set_label(str(int(self.probeTimer))) self.probeButton.set_style(self.buttonRed) if not self.probeTimer and not self.probePressed: hal.set_p('plasmac.probe-test','0') self.probeButton.set_label(self.probeText) self.probeButton.set_style(self.buttonPlain) if self.inFile and self.inFile != self.s.file: if not 'PlaSmaC' in self.s.file or 'PlaSmaC0' in self.s.file: self.builder.get_object(self.cutButton).set_style(self.buttonPlain) self.builder.get_object(self.cutButton).set_label('Pierce & Cut') self.cutType = 0 elif 'PlaSmaC1' in self.s.file: self.builder.get_object(self.cutButton).set_style(self.buttonOrange) self.builder.get_object(self.cutButton).set_label('Pierce Only') self.cutType = 1 if (hal.get_value('axis.x.eoffset') or hal.get_value('axis.y.eoffset')) and not hal.get_value('halui.program.is-paused'): hal.set_p('plasmac.consumable-change', '0') hal.set_p('plasmac.x-offset', '0') hal.set_p('plasmac.y-offset', '0') hal.set_p('plasmac.xy-feed-rate', '0') return True
def consumable_change_setup(self, ccParm): self.ccX = self.ccY = ccF = '' X = Y = F = '' ccAxis = [X, Y, F] ccName = ['x', 'y', 'f'] for loop in range(3): count = 0 if ccName[loop] in ccParm: while 1: if not ccParm[count]: break if ccParm[count] == ccName[loop]: count += 1 break count += 1 while 1: if count == len(ccParm): break if ccParm[count].isdigit() or ccParm[count] in '.-': ccAxis[loop] += ccParm[count] else: break count += 1 if ccName[loop] == 'x' and ccAxis[loop]: self.ccX = float(ccAxis[loop]) elif ccName[loop] == 'y' and ccAxis[loop]: self.ccY = float(ccAxis[loop]) elif ccName[loop] == 'f' and ccAxis[loop]: ccF = float(ccAxis[loop]) if self.ccX and \ (self.ccX < round(float(self.i.find('AXIS_X', 'MIN_LIMIT')), 6) or \ self.ccX > round(float(self.i.find('AXIS_X', 'MAX_LIMIT')), 6)): self.dialog_error( 'X out of limits for consumable change\n\nCheck .ini file settings\n' ) print('x out of bounds for consumable change\n') raise SystemExit() if self.ccY and \ (self.ccY < round(float(self.i.find('AXIS_Y', 'MIN_LIMIT')), 6) or \ self.ccY > round(float(self.i.find('AXIS_Y', 'MAX_LIMIT')), 6)): self.dialog_error( 'Y out of limits for consumable change\n\nCheck .ini file settings\n' ) print('y out of bounds for consumable change\n') raise SystemExit() if not ccF: self.dialog_error( 'invalid feed rate for consumable change\n\nCheck .ini file settings\n' ) print('invalid consumable change feed rate\n') raise SystemExit() self.ccScale = round(hal.get_value('plasmac.offset-scale'), 3) / 100 ccVel = int(1 / hal.get_value('halui.machine.units-per-mm') / 60 * ccF * 100) hal.set_p('axis.x.eoffset-scale', str(self.ccScale)) hal.set_p('axis.y.eoffset-scale', str(self.ccScale)) hal.set_p('plasmac.x-y-velocity', str(ccVel)) hal.set_p('axis.x.eoffset-enable', '1') hal.set_p('axis.y.eoffset-enable', '1')
def Yminus_pressed(self, widget): if hal.get_value('plasmac.axis-y-position') + \ hal.get_value('axis.y.eoffset-counts') * self.oScale - \ hal.get_value('plasmac_run.kerf-width-f') < self.yMin: msg = 'Y axis motion would trip Y minimum limit' self.dialog_error(msg) return move = int(hal.get_value('plasmac_run.kerf-width-f') / self.oScale * -1) hal.set_p('plasmac.y-offset', '{}'.format(str(hal.get_value('axis.y.eoffset-counts') + move))) hal.set_p('plasmac.cut-recovery', '1')
def Xplus_pressed(self, widget): if hal.get_value('plasmac.axis-x-position') + \ hal.get_value('axis.x.eoffset-counts') * self.oScale + \ hal.get_value('plasmac_run.kerf-width-f') > self.xMax: msg = 'X axis motion would trip X maximum limit' self.dialog_error(msg) return move = int(hal.get_value('plasmac_run.kerf-width-f') / self.oScale * 1) hal.set_p('plasmac.x-offset', '{}'.format(str(hal.get_value('axis.x.eoffset-counts') + move))) hal.set_p('plasmac.cut-recovery', '1')
def periodic(self): if self.builder.get_object('thc-auto').get_active(): self.halcomp['thc-enable-out'] = self.builder.get_object( 'thc-enable').get_active() mode = hal.get_value('plasmac.mode') units = hal.get_value('halui.machine.units-per-mm') maxPidP = self.thcFeedRate / units * 0.1 if mode != self.oldMode: if mode == 0: self.builder.get_object('auto-box').show() self.builder.get_object('kerf-box').show() self.builder.get_object('kerf-label').show() self.builder.get_object('kerf-frame').set_shadow_type( gtk.SHADOW_OUT) self.builder.get_object('pid-p-gain-adj').configure( self.builder.get_object('pid-p-gain-adj').get_value(), 1, maxPidP, 1, 0, 0) self.builder.get_object('pid-p-label').set_text( 'Speed (PID P)') self.builder.get_object('delay-box').show() self.builder.get_object('threshold-box').show() self.builder.get_object('volts-box').show() elif mode == 1: self.builder.get_object('auto-box').show() self.builder.get_object('kerf-box').show() self.builder.get_object('kerf-label').show() self.builder.get_object('kerf-frame').set_shadow_type( gtk.SHADOW_OUT) self.builder.get_object('pid-p-gain-adj').configure( self.builder.get_object('pid-p-gain-adj').get_value(), 1, maxPidP, 1, 0, 0) self.builder.get_object('pid-p-label').set_text( 'Speed (PID P)') self.builder.get_object('delay-box').show() self.builder.get_object('threshold-box').show() self.builder.get_object('volts-box').show() elif mode == 2: self.builder.get_object('auto-box').hide() self.builder.get_object('kerf-box').hide() self.builder.get_object('kerf-label').hide() self.builder.get_object('kerf-frame').set_shadow_type( gtk.SHADOW_NONE) self.builder.get_object('pid-p-gain-adj').configure( self.builder.get_object('pid-p-gain-adj').get_value(), 1, 100, 1, 0, 0) self.builder.get_object('pid-p-label').set_text('Speed (%)') self.builder.get_object('delay-box').hide() self.builder.get_object('threshold-box').hide() self.builder.get_object('volts-box').hide() else: pass self.oldMode = mode return True
def torch_changed(self, halpin): if halpin: if (hal.get_value('plasmac.mode') == 1 or hal.get_value('plasmac.mode') == 2) and not self.w.arc_ok.isChecked(): self.w.arc_ok.toggle() self.w.arc_ok_clicked() else: if self.w.arc_ok.isChecked(): self.w.arc_ok.toggle() self.w.arc_ok_clicked()
def initialized__(self): self.w.setWindowTitle('QtPlasmaC Sim') self.IMAGES = os.path.join(self.PATHS.IMAGEDIR, 'qtplasmac/images/') self.w.setWindowIcon( QIcon(os.path.join(self.IMAGES, 'linuxcncicon.png'))) self.breakPin = self.hal.newpin('sensor_breakaway', hal.HAL_BIT, hal.HAL_OUT) self.floatPin = self.hal.newpin('sensor_float', hal.HAL_BIT, hal.HAL_OUT) self.ohmicPin = self.hal.newpin('sensor_ohmic', hal.HAL_BIT, hal.HAL_OUT) self.torchPin = self.hal.newpin('torch_on', hal.HAL_BIT, hal.HAL_IN) self.statePin = self.hal.newpin('state', hal.HAL_S32, hal.HAL_IN) self.zPosPin = self.hal.newpin('z_position', hal.HAL_FLOAT, hal.HAL_IN) self.arcVoltsPin = self.hal.newpin('arc_voltage_out-f', hal.HAL_FLOAT, hal.HAL_OUT) CALL([ 'halcmd', 'net', 'plasmac:axis-position', 'qtplasmac_sim.z_position' ]) CALL(['halcmd', 'net', 'plasmac:state', 'qtplasmac_sim.state']) self.torchPin.value_changed.connect(self.torch_changed) self.zPosPin.value_changed.connect( lambda v: self.z_position_changed(v)) self.w.arc_voltage_out.valueChanged.connect( lambda v: self.arc_volts_changed(v)) self.w.sensor_flt.pressed.connect(self.float_pressed) self.w.sensor_ohm.pressed.connect(self.ohmic_pressed) self.w.sensor_brk.pressed.connect(self.break_pressed) self.w.arc_ok.clicked.connect(self.arc_ok_clicked) self.w.estop.pressed.connect(self.estop_pressed) self.w.auto_flt.pressed.connect(self.auto_float_pressed) self.w.auto_flt.setChecked(True) self.w.auto_ohm.pressed.connect(self.auto_ohmic_pressed) self.fTimer = QtCore.QTimer() self.fTimer.setInterval(500) self.fTimer.setSingleShot(True) self.fTimer.timeout.connect(self.float_timer_done) self.oTimer = QtCore.QTimer() self.oTimer.setInterval(500) self.oTimer.setSingleShot(True) self.oTimer.timeout.connect(self.ohmic_timer_done) self.bTimer = QtCore.QTimer() self.bTimer.setInterval(500) self.bTimer.setSingleShot(True) self.bTimer.timeout.connect(self.break_timer_done) self.w.help.pressed.connect(self.help_pressed) mode = hal.get_value('plasmac.mode') self.set_mode(mode) hal.set_p('estop_or.in0', '1') zMin = hal.get_value('ini.z.min_limit') self.zProbe = zMin + (10 * hal.get_value('halui.machine.units-per-mm')) self.w.estop.setStyleSheet('color: {}; background: {}'.format( self.foreColor, self.estopColor))
def consumable_change_setup(self): ccParm = self.i.find('PLASMAC','BUTTON_1_CODE').replace('change-consumables','').replace(' ','').lower() or None if ccParm: self.ccX = self.ccY = ccF = '' X = Y = F = '' ccAxis = [X, Y, F] ccName = ['x', 'y', 'f'] for loop in range(3): count = 0 if ccName[loop] in ccParm: while 1: if not ccParm[count]: break if ccParm[count] == ccName[loop]: count += 1 break count += 1 while 1: if count == len(ccParm): break if ccParm[count].isdigit() or ccParm[count] in '.-': ccAxis[loop] += ccParm[count] else: break count += 1 if ccName[loop] == 'x': self.ccX = float(ccAxis[loop]) elif ccName[loop] == 'y': self.ccY = float(ccAxis[loop]) elif ccName[loop] == 'f': ccF = float(ccAxis[loop]) if self.ccX and \ (self.ccX < round(float(self.i.find('AXIS_X', 'MIN_LIMIT')), 6) or \ self.ccX > round(float(self.i.find('AXIS_X', 'MAX_LIMIT')), 6)): print('x out of bounds for consumable change\n') raise SystemExit() if self.ccY and \ (self.ccY < round(float(self.i.find('AXIS_Y', 'MIN_LIMIT')), 6) or \ self.ccY > round(float(self.i.find('AXIS_Y', 'MAX_LIMIT')), 6)): print('y out of bounds for consumable change\n') raise SystemExit() if not ccF: print('invalid consumable change feed rate\n') raise SystemExit() self.ccScale = round(hal.get_value('plasmac.offset-scale'), 3) / 100 ccVel = int(1 / hal.get_value('halui.machine.units-per-mm') / 60 * ccF * 100) hal.set_p('axis.x.eoffset-scale', str(self.ccScale)) hal.set_p('axis.y.eoffset-scale', str(self.ccScale)) hal.set_p('plasmac.x-y-velocity', str(ccVel)) hal.set_p('axis.x.eoffset-enable', '1') hal.set_p('axis.y.eoffset-enable', '1') else: print('consumable change parameters required\n')
def periodic(self): self.s.poll() isIdleHomed = True isIdleOn = True if hal.get_value('halui.program.is-idle') and hal.get_value( 'halui.machine.is-on'): if hal.get_value('plasmac.arc-ok-out'): isIdleOn = False for joint in range(0, int(self.i.find('KINS', 'JOINTS'))): if not self.s.homed[joint]: isIdleHomed = False break else: isIdleHomed = False isIdleOn = False for n in range(1, 5): if 'ohmic-test' in self.iniButtonCode[n]: if isIdleOn or hal.get_value('halui.program.is-paused'): self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) elif not 'cut-type' in self.iniButtonCode[ n] and not self.iniButtonCode[n].startswith('%'): if isIdleHomed: self.builder.get_object('button' + str(n)).set_sensitive(True) else: self.builder.get_object('button' + str(n)).set_sensitive(False) if self.probeTimer: if time.time() >= self.probeTimer: self.probeTimer = 0 if not self.probePressed: hal.set_p('plasmac.probe-test', '0') if self.inFile and self.inFile != self.s.file: if not 'PlaSmaC' in self.s.file or 'PlaSmaC0' in self.s.file: self.builder.get_object(self.cutButton).set_style( self.buttonPlain) self.builder.get_object( self.cutButton).set_label('Pierce & Cut') self.cutType = 0 elif 'PlaSmaC1' in self.s.file: self.builder.get_object(self.cutButton).set_style( self.buttonOrange) self.builder.get_object( self.cutButton).set_label('Pierce Only') self.cutType = 1 return True
def torch_changed(self, halpin): if halpin: time.sleep(0.1) if hal.get_value('plasmac.mode') == 0 or hal.get_value('plasmac.mode') == 1: self.w.arc_voltage_out.setValue(100.0) self.w.arc_voltage_out.setMinimum(90.0) self.w.arc_voltage_out.setMaximum(110.0) if (hal.get_value('plasmac.mode') == 1 or hal.get_value('plasmac.mode') == 2) and not self.w.arc_ok.isChecked(): self.w.arc_ok.toggle() else: self.w.arc_voltage_out.setMinimum(0.0) self.w.arc_voltage_out.setMaximum(300.0) self.w.arc_voltage_out.setValue(0.0) if self.w.arc_ok.isChecked(): self.w.arc_ok.toggle()
def initialized__(self): self.w.torch_on.hal_pin_changed.connect(self.torch_changed) self.w.sensor_flt.pressed.connect(self.float_pressed) self.w.sensor_ohm.pressed.connect(self.ohmic_pressed) self.w.sensor_brk.pressed.connect(self.break_pressed) self.w.arc_ok.pressed.connect(self.arc_ok_pressed) self.w.estop.pressed.connect(self.estop_pressed) self.fTimer = QtCore.QTimer() self.fTimer.setInterval(500) self.fTimer.setSingleShot(True) self.fTimer.timeout.connect(self.float_timer_done) self.oTimer = QtCore.QTimer() self.oTimer.setInterval(500) self.oTimer.setSingleShot(True) self.oTimer.timeout.connect(self.ohmic_timer_done) self.bTimer = QtCore.QTimer() self.bTimer.setInterval(500) self.bTimer.setSingleShot(True) self.bTimer.timeout.connect(self.break_timer_done) self.backColor = QColor(self.w.sensor_flt.palette().color( QPalette.Background)).name() mode = hal.get_value('plasmac.mode') self.set_mode(mode) hal.set_p('estop_or.in0', '1') self.w.estop.setStyleSheet('background: red')
def estop_pressed(self): if hal.get_value('estop_or.in0') == 0: hal.set_p('estop_or.in0', '1') self.w.estop.setStyleSheet('background: red') else: hal.set_p('estop_or.in0', '0') self.w.estop.setStyleSheet('background: {}'.format(self.backColor))
def torch_changed(self, halpin): if halpin.get(): if hal.get_value('plasmac.mode') == 0 or hal.get_value( 'plasmac.mode') == 1: self.B.get_object('arcVoltage').set_value(100.0) self.B.get_object('arcVoltageAdj').set_lower(90.0) if hal.get_value('plasmac.mode') == 1 or hal.get_value( 'plasmac.mode') == 2: self.B.get_object('arcOk').set_active(True) else: self.B.get_object('arcVoltage').set_sensitive(0) self.B.get_object('arcVoltageAdj').set_lower(0.0) self.B.get_object('arcVoltage').set_value(0.0) time.sleep(.1) self.B.get_object('arcVoltage').set_sensitive(1) self.B.get_object('arcOk').set_active(False)
def write_temp_default_material(data): with open(tmpMaterialFile, 'w') as fWrite: fWrite.write('#plasmac temporary material file\n') fWrite.write('\nnumber={}\n'.format(tmpMatNum)) fWrite.write('name={}\n'.format(tmpMatNam)) fWrite.write('kerf-width={}\n'.format(data[3])) fWrite.write('thc-enable={}\n'.format(data[4])) fWrite.write('pierce-height={}\n'.format(data[5])) fWrite.write('pierce-delay={}\n'.format(data[6])) fWrite.write('puddle-jump-height={}\n'.format(data[7])) fWrite.write('puddle-jump-delay={}\n'.format(data[8])) fWrite.write('cut-height={}\n'.format(data[9])) fWrite.write('cut-feed-rate={}\n'.format(data[10])) fWrite.write('cut-amps={}\n'.format(data[11])) fWrite.write('cut-volts={}\n'.format(data[12])) fWrite.write('pause-at-end={}\n'.format(data[13])) fWrite.write('gas-pressure={}\n'.format(data[14])) fWrite.write('cut-mode={}\n'.format(data[15])) fWrite.write('\n') hal.set_p('qtplasmac.material_temp', '{}'.format(tmpMatNum)) matDelay = time.time() while 1: if time.time() > matDelay + 3: codeWarn = True dlg = '\nTemporary materials was not loaded in a timely manner:\n' dlg += '\nTry to reload the G-Code file.\n' dialog_box('WARNING', dlg) break if not hal.get_value('qtplasmac.material_temp'): break
def _coord(self, v): if isinstance(v, str): if self.comp is None: return hal.get_value(v) else: return self.comp[v] return v
def state_changed(self,halpin): if hal.get_value('plasmac.torch-enable') == 1: if halpin.get() != self.CUTTING and self.oldState == self.CUTTING: self.CUT_DISTANCE = self.CUT_DISTANCE + hal.get_value('plasmac.cut-length') if hal.get_value('halui.machine.units-per-mm') == 1: self.builder.get_object('cut-distance').set_label('%0.2f M' %(self.CUT_DISTANCE * 0.001)) else: self.builder.get_object('cut-distance').set_label('%0.2f\"' %(self.CUT_DISTANCE)) self.CUT_TIME = self.CUT_TIME + hal.get_value('plasmac.cut-time') self.display_time('cut-time', self.CUT_TIME) elif halpin.get() == self.PROBE_HEIGHT and self.oldState == self.IDLE: self.probeStart = time.time() elif halpin.get() > self.ZERO_HEIGHT and (self.oldState >= self.PROBE_HEIGHT and self.oldState <= self.PROBE_UP): self.PROBE_TIME = self.PROBE_TIME + (time.time() - self.probeStart) self.display_time('probe-time', self.PROBE_TIME) self.oldState = halpin.get()
def periodic(self): if self.builder.get_object('thc-auto').get_active(): self.halcomp['thc-enable-out'] = self.builder.get_object('thc-enable').get_active() mode = hal.get_value('plasmac.mode') if mode != self.oldMode: if mode == 0: self.builder.get_object('kerfcross-enable').show() self.builder.get_object('kerfcross-enable-label').show() self.builder.get_object('volts-box').show() elif mode == 1: self.builder.get_object('kerfcross-enable').show() self.builder.get_object('kerfcross-enable-label').show() self.builder.get_object('volts-box').show() elif mode == 2: self.builder.get_object('kerfcross-enable').hide() self.builder.get_object('kerfcross-enable-label').hide() self.builder.get_object('volts-box').hide() else: pass self.oldMode = mode self.s.poll() homed = True for n in range(self.s.joints): if not self.s.homed[n]: homed = False hal.set_p('plasmac.homed', str(homed)) if homed and self.s.interp_state == linuxcnc.INTERP_IDLE: self.builder.get_object('single-cut').set_sensitive(True) else: self.builder.get_object('single-cut').set_sensitive(False) return True
def write_temp_default_material(data): global lineNum, warnMatLoad try: with open(tmpMaterialFile, 'w') as fWrite: fWrite.write('#plasmac temporary material file\n') fWrite.write('\nnumber={}\n'.format(tmpMatNum)) fWrite.write('name={}\n'.format(tmpMatNam)) fWrite.write('kerf-width={}\n'.format(data[3])) fWrite.write('thc-enable={}\n'.format(data[4])) fWrite.write('pierce-height={}\n'.format(data[5])) fWrite.write('pierce-delay={}\n'.format(data[6])) fWrite.write('puddle-jump-height={}\n'.format(data[7])) fWrite.write('puddle-jump-delay={}\n'.format(data[8])) fWrite.write('cut-height={}\n'.format(data[9])) fWrite.write('cut-feed-rate={}\n'.format(data[10])) fWrite.write('cut-amps={}\n'.format(data[11])) fWrite.write('cut-volts={}\n'.format(data[12])) fWrite.write('pause-at-end={}\n'.format(data[13])) fWrite.write('gas-pressure={}\n'.format(data[14])) fWrite.write('cut-mode={}\n'.format(data[15])) fWrite.write('\n') except: codeError = True errorTempMat.append(lineNum) hal.set_p('qtplasmac.material_temp', '{}'.format(tmpMatNum)) matDelay = time.time() while 1: if time.time() > matDelay + 3: codeWarn = True warnMatLoad.append(lineNum) break if not hal.get_value('qtplasmac.material_temp'): break
def refresh(self, line): line = " ".join(line.split()) h = line.split(' ') try: return str(hal.get_value(h[1])) except: return ''
def initialized__(self): self.w.setWindowTitle('QtPlasmaC Sim') self.w.torch_on.hal_pin_changed.connect(self.torch_changed) self.w.sensor_flt.pressed.connect(self.float_pressed) self.w.sensor_ohm.pressed.connect(self.ohmic_pressed) self.w.sensor_brk.pressed.connect(self.break_pressed) self.w.arc_ok.clicked.connect(self.arc_ok_clicked) self.w.estop.pressed.connect(self.estop_pressed) self.fTimer = QtCore.QTimer() self.fTimer.setInterval(500) self.fTimer.setSingleShot(True) self.fTimer.timeout.connect(self.float_timer_done) self.oTimer = QtCore.QTimer() self.oTimer.setInterval(500) self.oTimer.setSingleShot(True) self.oTimer.timeout.connect(self.ohmic_timer_done) self.bTimer = QtCore.QTimer() self.bTimer.setInterval(500) self.bTimer.setSingleShot(True) self.bTimer.timeout.connect(self.break_timer_done) mode = hal.get_value('plasmac.mode') self.set_mode(mode) hal.set_p('estop_or.in0', '1') self.w.estop.setStyleSheet('color: {}; background: {}'.format( self.foreColor, self.estopColor))
def user_button_pressed(self, button, commands): if not commands: return if commands.lower() == 'ohmic-test': hal.set_p('plasmac.ohmic-test', '1') elif 'probe-test' in commands.lower(): self.probePressed = True self.probeButton = button if commands.lower().replace('probe-test', '').strip(): self.probeTimer = float(commands.lower().replace( 'probe-test', '').strip()) + time.time() hal.set_p('plasmac.probe-test', '1') elif 'cut-type' in commands.lower( ) and not hal.get_value('halui.program.is-running'): self.cutType ^= 1 if self.cutType: hal.set_p('plasmac_run.cut-type', '1') self.builder.get_object(button).set_style(self.buttonOrange) self.builder.get_object(button).set_label('Pierce Only') else: hal.set_p('plasmac_run.cut-type', '0') self.builder.get_object(button).set_style(self.buttonPlain) self.builder.get_object(button).set_label('Pierce & Cut') self.message( '\nSwitching between cut types requires re-opening of the program.\n\n' 'Reload is NOT sufficient.\n\n') else: for command in commands.split('\\'): if command.strip()[0] == '%': command = command.strip().strip('%') + '&' Popen(command, stdout=PIPE, stderr=PIPE, shell=True) else: if '{' in command: newCommand = subCommand = '' for char in command: if char == '{': subCommand = ':' elif char == '}': f1, f2 = subCommand.replace(':', "").split() newCommand += self.i.find(f1, f2) subCommand = '' elif subCommand.startswith(':'): subCommand += char else: newCommand += char command = newCommand self.s.poll() if not self.s.estop and self.s.enabled and self.s.homed and ( self.s.interp_state == linuxcnc.INTERP_IDLE): mode = self.s.task_mode if mode != linuxcnc.MODE_MDI: mode = self.s.task_mode self.c.mode(linuxcnc.MODE_MDI) self.c.wait_complete() self.c.mdi(command) self.s.poll() while self.s.interp_state != linuxcnc.INTERP_IDLE: self.s.poll() self.c.mode(mode) self.c.wait_complete()
def coords(self): try: leng = hal.get_value('motion.tooloffset.z') * self.MODEL_SCALING except: leng = 0 try: xleng = hal.get_value('motion.tooloffset.x') * self.MODEL_SCALING except: xleng = 0 x1 = leng z1 = -xleng x2 = 1 #self.comp["tool-x-offset"]+10 z2 = -leng / 2 x3 = 2 #self.comp["tooldiameter"] z3 = 0 return (x1, z1, x2, z2, x3, z3, 0, 1)
def motion_type_changed(self,halpin): if hal.get_value('plasmac.torch-enable') == 1: if halpin.get() == 1 and self.oldMotionType != 1: self.rapidStart = time.time() elif halpin.get() != 1 and self.oldMotionType == 1: self.RAPID_TIME = self.RAPID_TIME + (time.time() - self.rapidStart) self.display_time('rapid-time', self.RAPID_TIME) self.oldMotionType = halpin.get()
def pierce_count_changed(self, halpin): if hal.get_value('plasmac_stats.state') >= self.TORCH_ON: self.PIERCE_COUNT += 1 self.pierce_count += 1 self.builder.get_object('pierce-countT').set_label('{:d}'.format( self.PIERCE_COUNT)) self.builder.get_object('pierce-count').set_label('{:d}'.format( self.pierce_count))
def merge(self): self.old['state'] = self.stat.task_state self.old['mode'] = self.stat.task_mode self.old['interp']= self.stat.interp_state # Only update file if call level is 0, which # means we are not executing a subroutine/remap # This avoids emiting signals for bogus file names below if self.stat.call_level == 0: self.old['file'] = self.stat.file self.old['paused']= self.stat.paused self.old['line'] = self.stat.motion_line self.old['homed'] = self.stat.homed self.old['tool-in-spindle'] = self.stat.tool_in_spindle self.old['motion-mode'] = self.stat.motion_mode self.old['spindle-or'] = self.stat.spindle[0]['override'] self.old['feed-or'] = self.stat.feedrate self.old['rapid-or'] = self.stat.rapidrate self.old['feed-hold'] = self.stat.feed_hold_enabled self.old['g5x-index'] = self.stat.g5x_index self.old['spindle-enabled'] = self.stat.spindle[0]['enabled'] self.old['spindle-direction'] = self.stat.spindle[0]['direction'] self.old['block-delete']= self.stat.block_delete self.old['optional-stop']= self.stat.optional_stop self.old['spindle-speed']= self.stat.spindle[0]['speed'] try: self.old['actual-spindle-speed']= hal.get_value('spindle.0.speed-in') * 60 except RuntimeError: self.old['actual-spindle-speed'] = 0 self.old['flood']= self.stat.flood self.old['mist']= self.stat.mist # override limits / hard limits or_limit_list=[] hard_limit = False for j in range(0, self.stat.joints): or_limit_list.append( self.stat.joint[j]['override_limits']) min_hard_limit = self.stat.joint[j]['min_hard_limit'] max_hard_limit = self.stat.joint[j]['max_hard_limit'] hard_limit = hard_limit or min_hard_limit or max_hard_limit self.old['override-limits'] = or_limit_list self.old['hard-limits-tripped'] = bool(hard_limit) # active G codes active_gcodes = [] codes ='' for i in sorted(self.stat.gcodes[1:]): if i == -1: continue if i % 10 == 0: active_gcodes.append("G%d" % (i/10)) else: active_gcodes.append("G%d.%d" % (i/10, i%10)) for i in active_gcodes: codes = codes +('%s '%i) self.old['g-code'] = codes # extract specific G code modes itime = fpm = fpr = css = rpm = metric = False radius = diameter = False for num,i in enumerate(active_gcodes): if i == 'G93': itime = True elif i == 'G94': fpm = True elif i == 'G95': fpr = True elif i == 'G96': css = True elif i == 'G97': rpm = True elif i == 'G21': metric = True elif i == 'G7': diameter = True elif i == 'G8': radius = True self.old['itime'] = itime self.old['fpm'] = fpm self.old['fpr'] = fpr self.old['css'] = css self.old['rpm'] = rpm self.old['metric'] = metric self.old['radius'] = radius self.old['diameter'] = diameter # active M codes active_mcodes = [] mcodes = '' for i in sorted(self.stat.mcodes[1:]): if i == -1: continue active_mcodes.append("M%d"%i ) for i in active_mcodes: mcodes = mcodes + ("%s "%i) #active_mcodes.append("M%s "%i) self.old['m-code'] = mcodes self.old['tool-info'] = self.stat.tool_table[0]