ToolsDrillPrefGroupUI.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. from PyQt5 import QtWidgets
  2. from PyQt5.QtCore import QSettings, Qt
  3. from appGUI.GUIElements import RadioSet, FCDoubleSpinner, FCComboBox, FCCheckBox, FCSpinner, NumericalEvalTupleEntry, \
  4. OptionalInputSection
  5. from appGUI.preferences.OptionsGroupUI import OptionsGroupUI
  6. import gettext
  7. import appTranslation as fcTranslate
  8. import builtins
  9. fcTranslate.apply_language('strings')
  10. if '_' not in builtins.__dict__:
  11. _ = gettext.gettext
  12. settings = QSettings("Open Source", "FlatCAM")
  13. if settings.contains("machinist"):
  14. machinist_setting = settings.value('machinist', type=int)
  15. else:
  16. machinist_setting = 0
  17. class ToolsDrillPrefGroupUI(OptionsGroupUI):
  18. def __init__(self, decimals=4, parent=None):
  19. super(ToolsDrillPrefGroupUI, self).__init__(self, parent=parent)
  20. self.setTitle(str(_("Drilling Tool Options")))
  21. self.decimals = decimals
  22. # ## Clear non-copper regions
  23. self.drill_label = QtWidgets.QLabel("<b>%s:</b>" % _("Parameters"))
  24. self.drill_label.setToolTip(
  25. _("Create CNCJob with toolpaths for drilling or milling holes.")
  26. )
  27. self.layout.addWidget(self.drill_label)
  28. grid0 = QtWidgets.QGridLayout()
  29. self.layout.addLayout(grid0)
  30. # Tool order Radio Button
  31. self.order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
  32. self.order_label.setToolTip(_("This set the way that the tools in the tools table are used.\n"
  33. "'No' --> means that the used order is the one in the tool table\n"
  34. "'Forward' --> means that the tools will be ordered from small to big\n"
  35. "'Reverse' --> means that the tools will ordered from big to small\n\n"
  36. "WARNING: using rest machining will automatically set the order\n"
  37. "in reverse and disable this control."))
  38. self.order_radio = RadioSet([{'label': _('No'), 'value': 'no'},
  39. {'label': _('Forward'), 'value': 'fwd'},
  40. {'label': _('Reverse'), 'value': 'rev'}])
  41. grid0.addWidget(self.order_label, 1, 0)
  42. grid0.addWidget(self.order_radio, 1, 1, 1, 2)
  43. # Cut Z
  44. cutzlabel = QtWidgets.QLabel('%s:' % _('Cut Z'))
  45. cutzlabel.setToolTip(
  46. _("Drill depth (negative)\n"
  47. "below the copper surface.")
  48. )
  49. self.cutz_entry = FCDoubleSpinner()
  50. if machinist_setting == 0:
  51. self.cutz_entry.set_range(-9999.9999, 0.0000)
  52. else:
  53. self.cutz_entry.set_range(-9999.9999, 9999.9999)
  54. self.cutz_entry.setSingleStep(0.1)
  55. self.cutz_entry.set_precision(self.decimals)
  56. grid0.addWidget(cutzlabel, 3, 0)
  57. grid0.addWidget(self.cutz_entry, 3, 1, 1, 2)
  58. # Multi-Depth
  59. self.mpass_cb = FCCheckBox('%s:' % _("Multi-Depth"))
  60. self.mpass_cb.setToolTip(
  61. _(
  62. "Use multiple passes to limit\n"
  63. "the cut depth in each pass. Will\n"
  64. "cut multiple times until Cut Z is\n"
  65. "reached."
  66. )
  67. )
  68. self.maxdepth_entry = FCDoubleSpinner()
  69. self.maxdepth_entry.set_precision(self.decimals)
  70. self.maxdepth_entry.set_range(0, 9999.9999)
  71. self.maxdepth_entry.setSingleStep(0.1)
  72. self.maxdepth_entry.setToolTip(_("Depth of each pass (positive)."))
  73. grid0.addWidget(self.mpass_cb, 4, 0)
  74. grid0.addWidget(self.maxdepth_entry, 4, 1, 1, 2)
  75. # Travel Z
  76. travelzlabel = QtWidgets.QLabel('%s:' % _('Travel Z'))
  77. travelzlabel.setToolTip(
  78. _("Tool height when travelling\n"
  79. "across the XY plane.")
  80. )
  81. self.travelz_entry = FCDoubleSpinner()
  82. self.travelz_entry.set_precision(self.decimals)
  83. if machinist_setting == 0:
  84. self.travelz_entry.set_range(0.0001, 9999.9999)
  85. else:
  86. self.travelz_entry.set_range(-9999.9999, 9999.9999)
  87. grid0.addWidget(travelzlabel, 5, 0)
  88. grid0.addWidget(self.travelz_entry, 5, 1, 1, 2)
  89. # Tool change:
  90. self.toolchange_cb = FCCheckBox('%s' % _("Tool change"))
  91. self.toolchange_cb.setToolTip(
  92. _("Include tool-change sequence\n"
  93. "in G-Code (Pause for tool change).")
  94. )
  95. grid0.addWidget(self.toolchange_cb, 6, 0, 1, 3)
  96. # Tool Change Z
  97. toolchangezlabel = QtWidgets.QLabel('%s:' % _('Toolchange Z'))
  98. toolchangezlabel.setToolTip(
  99. _("Z-axis position (height) for\n"
  100. "tool change.")
  101. )
  102. self.toolchangez_entry = FCDoubleSpinner()
  103. self.toolchangez_entry.set_precision(self.decimals)
  104. if machinist_setting == 0:
  105. self.toolchangez_entry.set_range(0.0001, 9999.9999)
  106. else:
  107. self.toolchangez_entry.set_range(-9999.9999, 9999.9999)
  108. grid0.addWidget(toolchangezlabel, 7, 0)
  109. grid0.addWidget(self.toolchangez_entry, 7, 1, 1, 2)
  110. # End Move Z
  111. endz_label = QtWidgets.QLabel('%s:' % _('End move Z'))
  112. endz_label.setToolTip(
  113. _("Height of the tool after\n"
  114. "the last move at the end of the job.")
  115. )
  116. self.endz_entry = FCDoubleSpinner()
  117. self.endz_entry.set_precision(self.decimals)
  118. if machinist_setting == 0:
  119. self.endz_entry.set_range(0.0000, 9999.9999)
  120. else:
  121. self.endz_entry.set_range(-9999.9999, 9999.9999)
  122. grid0.addWidget(endz_label, 8, 0)
  123. grid0.addWidget(self.endz_entry, 8, 1, 1, 2)
  124. # End Move X,Y
  125. endmove_xy_label = QtWidgets.QLabel('%s:' % _('End move X,Y'))
  126. endmove_xy_label.setToolTip(
  127. _("End move X,Y position. In format (x,y).\n"
  128. "If no value is entered then there is no move\n"
  129. "on X,Y plane at the end of the job.")
  130. )
  131. self.endxy_entry = NumericalEvalTupleEntry(border_color='#0069A9')
  132. grid0.addWidget(endmove_xy_label, 9, 0)
  133. grid0.addWidget(self.endxy_entry, 9, 1, 1, 2)
  134. # Feedrate Z
  135. frlabel = QtWidgets.QLabel('%s:' % _('Feedrate Z'))
  136. frlabel.setToolTip(
  137. _("Tool speed while drilling\n"
  138. "(in units per minute).\n"
  139. "So called 'Plunge' feedrate.\n"
  140. "This is for linear move G01.")
  141. )
  142. self.feedrate_z_entry = FCDoubleSpinner()
  143. self.feedrate_z_entry.set_precision(self.decimals)
  144. self.feedrate_z_entry.set_range(0, 99999.9999)
  145. grid0.addWidget(frlabel, 10, 0)
  146. grid0.addWidget(self.feedrate_z_entry, 10, 1, 1, 2)
  147. # Spindle speed
  148. spdlabel = QtWidgets.QLabel('%s:' % _('Spindle Speed'))
  149. spdlabel.setToolTip(
  150. _("Speed of the spindle\n"
  151. "in RPM (optional)")
  152. )
  153. self.spindlespeed_entry = FCSpinner()
  154. self.spindlespeed_entry.set_range(0, 1000000)
  155. self.spindlespeed_entry.set_step(100)
  156. grid0.addWidget(spdlabel, 11, 0)
  157. grid0.addWidget(self.spindlespeed_entry, 11, 1, 1, 2)
  158. # Dwell
  159. self.dwell_cb = FCCheckBox('%s' % _('Enable Dwell'))
  160. self.dwell_cb.setToolTip(
  161. _("Pause to allow the spindle to reach its\n"
  162. "speed before cutting.")
  163. )
  164. grid0.addWidget(self.dwell_cb, 12, 0, 1, 3)
  165. # Dwell Time
  166. dwelltime = QtWidgets.QLabel('%s:' % _('Duration'))
  167. dwelltime.setToolTip(_("Number of time units for spindle to dwell."))
  168. self.dwelltime_entry = FCDoubleSpinner()
  169. self.dwelltime_entry.set_precision(self.decimals)
  170. self.dwelltime_entry.set_range(0, 99999.9999)
  171. grid0.addWidget(dwelltime, 13, 0)
  172. grid0.addWidget(self.dwelltime_entry, 13, 1, 1, 2)
  173. self.ois_dwell_exc = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry])
  174. # preprocessor selection
  175. pp_excellon_label = QtWidgets.QLabel('%s:' % _("Preprocessor"))
  176. pp_excellon_label.setToolTip(
  177. _("The preprocessor JSON file that dictates\n"
  178. "Gcode output.")
  179. )
  180. self.pp_excellon_name_cb = FCComboBox()
  181. self.pp_excellon_name_cb.setFocusPolicy(Qt.StrongFocus)
  182. grid0.addWidget(pp_excellon_label, 14, 0)
  183. grid0.addWidget(self.pp_excellon_name_cb, 14, 1, 1, 2)
  184. separator_line = QtWidgets.QFrame()
  185. separator_line.setFrameShape(QtWidgets.QFrame.HLine)
  186. separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
  187. grid0.addWidget(separator_line, 16, 0, 1, 3)
  188. # DRILL SLOTS LABEL
  189. self.dslots_label = QtWidgets.QLabel('<b>%s:</b>' % _('Drilling Slots'))
  190. grid0.addWidget(self.dslots_label, 18, 0, 1, 3)
  191. # Drill slots
  192. self.drill_slots_cb = FCCheckBox('%s' % _('Drill slots'))
  193. self.drill_slots_cb.setToolTip(
  194. _("If the selected tool has slots then they will be drilled.")
  195. )
  196. grid0.addWidget(self.drill_slots_cb, 20, 0, 1, 3)
  197. # Drill Overlap
  198. self.drill_overlap_label = QtWidgets.QLabel('%s:' % _('Overlap'))
  199. self.drill_overlap_label.setToolTip(
  200. _("How much (percentage) of the tool diameter to overlap previous drill hole.")
  201. )
  202. self.drill_overlap_entry = FCDoubleSpinner()
  203. self.drill_overlap_entry.set_precision(self.decimals)
  204. self.drill_overlap_entry.set_range(0.0, 9999.9999)
  205. self.drill_overlap_entry.setSingleStep(0.1)
  206. grid0.addWidget(self.drill_overlap_label, 22, 0)
  207. grid0.addWidget(self.drill_overlap_entry, 22, 1, 1, 2)
  208. # Last drill in slot
  209. self.last_drill_cb = FCCheckBox('%s' % _('Last drill'))
  210. self.last_drill_cb.setToolTip(
  211. _("If the slot length is not completely covered by drill holes,\n"
  212. "add a drill hole on the slot end point.")
  213. )
  214. grid0.addWidget(self.last_drill_cb, 24, 0, 1, 3)
  215. self.layout.addStretch()