259 lines
11 KiB
Python
259 lines
11 KiB
Python
'''
|
|
conv_line.py
|
|
|
|
Copyright (C) 2020, 2021, 2022 Phillip A Carter
|
|
Copyright (C) 2020, 2021, 2022 Gregory D Carl
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the
|
|
Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
'''
|
|
|
|
import os, sys
|
|
import gettext
|
|
from importlib import reload
|
|
from plasmac import line as LINE
|
|
|
|
for f in sys.path:
|
|
if '/lib/python' in f:
|
|
if '/usr' in f:
|
|
localeDir = 'usr/share/locale'
|
|
else:
|
|
localeDir = os.path.join(f"{f.split('/lib')[0]}",'share','locale')
|
|
break
|
|
gettext.install('linuxcnc', localedir=localeDir)
|
|
|
|
def preview(self):
|
|
if self.convLine['xLineEnd'] != self.conv_is_float(self.l1Value.get()) or \
|
|
self.convLine['yLineEnd'] != self.conv_is_float(self.l2Value.get()):
|
|
self.convLine['addSegment'] = 0
|
|
if self.lineCombo.get() == _('LINE POINT ~ POINT'):
|
|
error = LINE.do_line_point_to_point(self, self.l1Value.get(), self.l2Value.get(), \
|
|
self.l3Value.get(), self.l4Value.get())
|
|
if not error[0]:
|
|
self.convLine['xLineEnd'] = error[1]
|
|
self.convLine['yLineEnd'] = error[2]
|
|
self.convLine['gcodeLine'] = error[3]
|
|
else:
|
|
error_set(self, f'{error[1]}\n')
|
|
return
|
|
elif self.lineCombo.get() == _('LINE BY ANGLE'):
|
|
error = LINE.do_line_by_angle(self, self.l1Value.get(), self.l2Value.get(), \
|
|
self.l3Value.get(), self.l4Value.get())
|
|
if not error[0]:
|
|
self.convLine['xLineEnd'] = error[1]
|
|
self.convLine['yLineEnd'] = error[2]
|
|
self.convLine['gcodeLine'] = error[3]
|
|
else:
|
|
error_set(self, f'{error[1]}\n')
|
|
return
|
|
elif self.lineCombo.get() == _('ARC 3P'):
|
|
error = LINE.do_arc_3_points(self, self.l1Value.get(), self.l2Value.get(), \
|
|
self.l3Value.get(), self.l4Value.get(), \
|
|
self.l5Value.get(), self.l6Value.get())
|
|
if not error[0]:
|
|
self.convLine['xLineEnd'] = error[1]
|
|
self.convLine['yLineEnd'] = error[2]
|
|
self.convLine['gcodeLine'] = error[3]
|
|
else:
|
|
error_set(self, f'{error[1]}\n')
|
|
return
|
|
elif self.lineCombo.get() == _('ARC 2P +RADIUS'):
|
|
arcType = '3' if 'CCW' in self.g23bValue.get() else '2'
|
|
error = LINE.do_arc_2_points_radius(self, self.l1Value.get(), self.l2Value.get(), self.l3Value.get(), \
|
|
self.l4Value.get(), self.l5Value.get(), arcType)
|
|
if not error[0]:
|
|
self.convLine['xLineEnd'] = error[1]
|
|
self.convLine['yLineEnd'] = error[2]
|
|
self.convLine['gcodeLine'] = error[3]
|
|
else:
|
|
error_set(self, f'{error[1]}\n')
|
|
return
|
|
elif self.lineCombo.get() == _('ARC ANGLE +RADIUS'):
|
|
arcType = '3' if 'CCW' in self.g23bValue.get() else '2'
|
|
error = LINE.do_arc_by_angle_radius(self, self.l1Value.get(), self.l2Value.get(), self.l3Value.get(),
|
|
self.l4Value.get(), self.l5Value.get(), arcType)
|
|
if not error[0]:
|
|
self.convLine['xLineEnd'] = error[1]
|
|
self.convLine['yLineEnd'] = error[2]
|
|
self.convLine['gcodeLine'] = error[3]
|
|
else:
|
|
error_set(self, f'{error[1]}\n')
|
|
return
|
|
if self.convLine['addSegment'] == 1:
|
|
LINE.next_segment(self.fTmp, self.fNgc)
|
|
else:
|
|
valid, self.convLine['xLineStart'] = self.conv_is_float(self.l1Value.get())
|
|
valid, self.convLine['yLineStart'] = self.conv_is_float(self.l2Value.get())
|
|
LINE.first_segment(self.fTmp, self.fNgc, self.fNgcBkp, self.preAmble, \
|
|
self.lineCombo.get(), self.convLine['xLineStart'], self.convLine['yLineStart'], \
|
|
int(self.matCombo.get().split(':')[0]), \
|
|
self.matCombo.get().split(':')[1].strip())
|
|
LINE.last_segment(self.fTmp, self.fNgc, self.convLine['gcodeLine'], self.postAmble)
|
|
self.fileOpener(self.fNgc, True, False)
|
|
self.addC['state'] = 'normal'
|
|
self.undoC['state'] = 'normal'
|
|
self.preview_button_pressed(True)
|
|
if self.convLine['addSegment'] == 1:
|
|
self.convLine['addSegment'] = 2
|
|
self.previewActive = True
|
|
|
|
def auto_preview(self):
|
|
if self.l1Value.get() and self.l2Value.get() and self.l3Value.get() and self.l4Value.get():
|
|
if self.lineCombo.get() == _('LINE POINT ~ POINT') or \
|
|
self.lineCombo.get() == _('LINE BY ANGLE') or \
|
|
(self.lineCombo.get() == _('ARC 3P') and self.l5Value.get() and self.l6Value.get()) or \
|
|
(self.lineCombo.get() == _('ARC 2P +RADIUS') and self.l5Value.get()) or \
|
|
(self.lineCombo.get() == _('ARC ANGLE +RADIUS') and self.l5Value.get()):
|
|
preview(self)
|
|
|
|
def arc_type_changed(self):
|
|
text = 'CW - G2' if 'CCW' in self.g23bValue.get() else 'CCW - G3'
|
|
self.g23bValue.set(text)
|
|
auto_preview(self)
|
|
|
|
def line_type_changed(self, refresh):
|
|
# self.lineCombo.selection_clear()
|
|
if self.lineCombo.get() == _('LINE POINT ~ POINT'):
|
|
if not refresh:
|
|
set_line_point_to_point(self)
|
|
elif self.lineCombo.get() == _('LINE BY ANGLE'):
|
|
if not refresh:
|
|
set_line_by_angle(self)
|
|
elif self.lineCombo.get() == _('ARC 3P'):
|
|
if not refresh:
|
|
set_arc_3_points(self)
|
|
elif self.lineCombo.get() == _('ARC 2P +RADIUS'):
|
|
if not refresh:
|
|
set_arc_2_points_radius(self)
|
|
elif self.lineCombo.get() == _('ARC ANGLE +RADIUS'):
|
|
if not refresh:
|
|
set_arc_by_angle_radius(self)
|
|
self.l3Entry.focus()
|
|
|
|
def clear_widgets(self):
|
|
set_start_point(self)
|
|
for w in [self.l3Label, self.l4Label, self.l5Label, self.l6Label, ]:
|
|
w['text'] = ''
|
|
for w in [self.l3Entry, self.l4Entry, self.l5Entry, self.l6Entry, ]:
|
|
w.grid_remove()
|
|
self.g23Arc.grid_remove()
|
|
|
|
def set_start_point(self):
|
|
text = _('START')
|
|
self.l1Label['text'] = _('X START')
|
|
self.l1Value.set(f'{self.convLine["xLineStart"]:0.3f}')
|
|
self.l2Label['text'] = _('Y START')
|
|
self.l2Value.set(f'{self.convLine["yLineStart"]:0.3f}')
|
|
|
|
def set_line_point_to_point(self):
|
|
clear_widgets(self)
|
|
self.l3Label['text'] = _('X END')
|
|
self.l4Label['text'] = _('Y END')
|
|
for w in [self.l3Value, self.l4Value]:
|
|
w.set('')
|
|
self.l3Entry.grid(column=1, row=4, pady=(24,0))
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
|
|
def set_line_by_angle(self):
|
|
clear_widgets(self)
|
|
self.l3Label['text'] = _('LENGTH')
|
|
self.l4Label['text'] = _('ANGLE')
|
|
self.l4Value.set('0.000')
|
|
for w in [self.l3Value, self.l4Value]:
|
|
w.set('')
|
|
self.l3Entry.grid(column=1, row=4, pady=(24,0))
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
|
|
def set_arc_3_points(self):
|
|
clear_widgets(self)
|
|
self.l3Label['text'] = _('X NEXT')
|
|
self.l4Label['text'] = _('Y NEXT')
|
|
self.l5Label['text'] = _('X END')
|
|
self.l6Label['text'] = _('Y END')
|
|
for w in [self.l3Value, self.l4Value, self.l5Value, self.l6Value]:
|
|
w.set('')
|
|
self.l3Entry.grid(column=1, row=4, pady=(24,0))
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
self.l5Entry.grid(column=1, row=6, pady=(24,0))
|
|
self.l6Entry.grid(column=1, row=7, pady=(4,0))
|
|
|
|
def set_arc_2_points_radius(self):
|
|
clear_widgets(self)
|
|
self.l3Label['text'] = _('X END')
|
|
self.l4Label['text'] = _('Y END')
|
|
self.l5Label['text'] = _('RADIUS')
|
|
self.l5Value.set('0.000')
|
|
self.l6Label['text'] = _('DIRECTION')
|
|
for w in [self.l3Value, self.l4Value, self.l5Value]:
|
|
w.set('')
|
|
self.l3Entry.grid(column=1, row=4, pady=(24,0))
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
self.l5Entry.grid(column=1, row=6, pady=(24,0))
|
|
self.g23Arc.grid(column=1, row=7, pady=(4,0))
|
|
|
|
def set_arc_by_angle_radius(self):
|
|
clear_widgets(self)
|
|
self.l3Label['text'] = _('LENGTH')
|
|
self.l4Label['text'] = _('ANGLE')
|
|
self.l4Value.set('0.000')
|
|
self.l5Label['text'] = _('RADIUS')
|
|
self.l6Label['text'] = _('DIRECTION')
|
|
for w in [self.l3Value, self.l4Value, self.l5Value]:
|
|
w.set('')
|
|
self.l3Entry.grid(column=1, row=4, pady=(24,0))
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
self.l5Entry.grid(column=1, row=6, pady=(24,0))
|
|
self.g23Arc.grid(column=1, row=7, pady=(4,0))
|
|
|
|
def error_set(self, error):
|
|
self.dialog_show_ok(_('Line Error'), error)
|
|
|
|
def widgets(self):
|
|
if self.comp['development']:
|
|
reload(LINE)
|
|
# start settings
|
|
self.previewActive = False
|
|
if not self.settingsExited:
|
|
self.dValue.set('')
|
|
self.convLine['xLineStart'] = 0.0
|
|
self.convLine['yLineStart'] = 0.0
|
|
self.convLine['addSegment'] = 0
|
|
self.convLine['gcodeSave'] = ''
|
|
self.dLabel['text'] = _('DIAMETER')
|
|
#connections
|
|
self.previewC['command'] = lambda:preview(self)
|
|
self.g23Arc['command'] = lambda:arc_type_changed(self)
|
|
self.lineCombo['modifycmd'] = lambda:line_type_changed(self, False)
|
|
#add to layout
|
|
self.matLabel.grid(column=0, row=0, pady=(4,0), sticky='e')
|
|
self.matCombo.grid(column=1, row=0, padx=(4,0), pady=(4,0), columnspan=3, sticky='ew')
|
|
self.lnLabel.grid(column=0, row=1, pady=(4,0), sticky='e')
|
|
self.lineCombo.grid(column=1, row=1, padx=(4,0), pady=(4,0), columnspan=2, sticky='ew')
|
|
self.l1Label.grid(column=0, row=2, pady=(4,0), sticky='e')
|
|
self.l1Entry.grid(column=1, row=2, pady=(4,0))
|
|
self.l2Label.grid(column=0, row=3, pady=(4,0), sticky='e')
|
|
self.l2Entry.grid(column=1, row=3, pady=(4,0))
|
|
self.l3Label.grid(column=0, row=4, pady=(24,0), sticky='e')
|
|
self.l3Entry.grid(column=1, row=4, pady=(4,0))
|
|
self.l4Label.grid(column=0, row=5, pady=(4,0), sticky='e')
|
|
self.l4Entry.grid(column=1, row=5, pady=(4,0))
|
|
self.l5Label.grid(column=0, row=6, pady=(24,0), sticky='e')
|
|
self.l5Entry.grid(column=1, row=6, pady=(4,0))
|
|
self.l6Label.grid(column=0, row=7, pady=(4,0), sticky='e')
|
|
self.l6Entry.grid(column=1, row=7, pady=(4,0))
|
|
# finish setup
|
|
if not self.settingsExited:
|
|
line_type_changed(self, False)
|
|
self.settingsExited = False
|