GerberGenPrefGroupUI.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from PyQt5 import QtWidgets, QtCore, QtGui
  2. from flatcamGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCEntry
  3. from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
  4. class GerberGenPrefGroupUI(OptionsGroupUI):
  5. def __init__(self, decimals=4, parent=None):
  6. # OptionsGroupUI.__init__(self, "Gerber General Preferences", parent=parent)
  7. super(GerberGenPrefGroupUI, self).__init__(self)
  8. self.parent = parent
  9. self.setTitle(str(_("Gerber General")))
  10. self.decimals = decimals
  11. # ## Plot options
  12. self.plot_options_label = QtWidgets.QLabel("<b>%s:</b>" % _("Plot Options"))
  13. self.layout.addWidget(self.plot_options_label)
  14. grid0 = QtWidgets.QGridLayout()
  15. self.layout.addLayout(grid0)
  16. # Solid CB
  17. self.solid_cb = FCCheckBox(label='%s' % _('Solid'))
  18. self.solid_cb.setToolTip(
  19. _("Solid color polygons.")
  20. )
  21. grid0.addWidget(self.solid_cb, 0, 0)
  22. # Multicolored CB
  23. self.multicolored_cb = FCCheckBox(label='%s' % _('M-Color'))
  24. self.multicolored_cb.setToolTip(
  25. _("Draw polygons in different colors.")
  26. )
  27. grid0.addWidget(self.multicolored_cb, 0, 1)
  28. # Plot CB
  29. self.plot_cb = FCCheckBox(label='%s' % _('Plot'))
  30. self.plot_options_label.setToolTip(
  31. _("Plot (show) this object.")
  32. )
  33. grid0.addWidget(self.plot_cb, 0, 2)
  34. # Number of circle steps for circular aperture linear approximation
  35. self.circle_steps_label = QtWidgets.QLabel('%s:' % _("Circle Steps"))
  36. self.circle_steps_label.setToolTip(
  37. _("The number of circle steps for Gerber \n"
  38. "circular aperture linear approximation.")
  39. )
  40. self.circle_steps_entry = FCSpinner()
  41. self.circle_steps_entry.set_range(0, 9999)
  42. grid0.addWidget(self.circle_steps_label, 1, 0)
  43. grid0.addWidget(self.circle_steps_entry, 1, 1, 1, 2)
  44. grid0.addWidget(QtWidgets.QLabel(''), 2, 0, 1, 3)
  45. # Default format for Gerber
  46. self.gerber_default_label = QtWidgets.QLabel('<b>%s:</b>' % _('Default Values'))
  47. self.gerber_default_label.setToolTip(
  48. _("Those values will be used as fallback values\n"
  49. "in case that they are not found in the Gerber file.")
  50. )
  51. grid0.addWidget(self.gerber_default_label, 3, 0, 1, 3)
  52. # Gerber Units
  53. self.gerber_units_label = QtWidgets.QLabel('%s:' % _('Units'))
  54. self.gerber_units_label.setToolTip(
  55. _("The units used in the Gerber file.")
  56. )
  57. self.gerber_units_radio = RadioSet([{'label': _('INCH'), 'value': 'IN'},
  58. {'label': _('MM'), 'value': 'MM'}])
  59. self.gerber_units_radio.setToolTip(
  60. _("The units used in the Gerber file.")
  61. )
  62. grid0.addWidget(self.gerber_units_label, 4, 0)
  63. grid0.addWidget(self.gerber_units_radio, 4, 1, 1, 2)
  64. # Gerber Zeros
  65. self.gerber_zeros_label = QtWidgets.QLabel('%s:' % _('Zeros'))
  66. self.gerber_zeros_label.setAlignment(QtCore.Qt.AlignLeft)
  67. self.gerber_zeros_label.setToolTip(
  68. _("This sets the type of Gerber zeros.\n"
  69. "If LZ then Leading Zeros are removed and\n"
  70. "Trailing Zeros are kept.\n"
  71. "If TZ is checked then Trailing Zeros are removed\n"
  72. "and Leading Zeros are kept.")
  73. )
  74. self.gerber_zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'L'},
  75. {'label': _('TZ'), 'value': 'T'}])
  76. self.gerber_zeros_radio.setToolTip(
  77. _("This sets the type of Gerber zeros.\n"
  78. "If LZ then Leading Zeros are removed and\n"
  79. "Trailing Zeros are kept.\n"
  80. "If TZ is checked then Trailing Zeros are removed\n"
  81. "and Leading Zeros are kept.")
  82. )
  83. grid0.addWidget(self.gerber_zeros_label, 5, 0)
  84. grid0.addWidget(self.gerber_zeros_radio, 5, 1, 1, 2)
  85. separator_line = QtWidgets.QFrame()
  86. separator_line.setFrameShape(QtWidgets.QFrame.HLine)
  87. separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
  88. grid0.addWidget(separator_line, 6, 0, 1, 3)
  89. # Apertures Cleaning
  90. self.gerber_clean_cb = FCCheckBox(label='%s' % _('Clean Apertures'))
  91. self.gerber_clean_cb.setToolTip(
  92. _("Will remove apertures that do not have geometry\n"
  93. "thus lowering the number of apertures in the Gerber object.")
  94. )
  95. grid0.addWidget(self.gerber_clean_cb, 7, 0, 1, 3)
  96. # Apply Extra Buffering
  97. self.gerber_extra_buffering = FCCheckBox(label='%s' % _('Polarity change buffer'))
  98. self.gerber_extra_buffering.setToolTip(
  99. _("Will apply extra buffering for the\n"
  100. "solid geometry when we have polarity changes.\n"
  101. "May help loading Gerber files that otherwise\n"
  102. "do not load correctly.")
  103. )
  104. grid0.addWidget(self.gerber_extra_buffering, 8, 0, 1, 3)
  105. separator_line = QtWidgets.QFrame()
  106. separator_line.setFrameShape(QtWidgets.QFrame.HLine)
  107. separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
  108. grid0.addWidget(separator_line, 9, 0, 1, 3)
  109. # Gerber Object Color
  110. self.gerber_color_label = QtWidgets.QLabel('<b>%s</b>' % _('Gerber Object Color'))
  111. grid0.addWidget(self.gerber_color_label, 10, 0, 1, 3)
  112. # Plot Line Color
  113. self.pl_color_label = QtWidgets.QLabel('%s:' % _('Outline'))
  114. self.pl_color_label.setToolTip(
  115. _("Set the line color for plotted objects.")
  116. )
  117. self.pl_color_entry = FCEntry()
  118. self.pl_color_button = QtWidgets.QPushButton()
  119. self.pl_color_button.setFixedSize(15, 15)
  120. self.form_box_child_2 = QtWidgets.QHBoxLayout()
  121. self.form_box_child_2.addWidget(self.pl_color_entry)
  122. self.form_box_child_2.addWidget(self.pl_color_button)
  123. self.form_box_child_2.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
  124. grid0.addWidget(self.pl_color_label, 11, 0)
  125. grid0.addLayout(self.form_box_child_2, 11, 1, 1, 2)
  126. # Plot Fill Color
  127. self.pf_color_label = QtWidgets.QLabel('%s:' % _('Fill'))
  128. self.pf_color_label.setToolTip(
  129. _("Set the fill color for plotted objects.\n"
  130. "First 6 digits are the color and the last 2\n"
  131. "digits are for alpha (transparency) level.")
  132. )
  133. self.pf_color_entry = FCEntry()
  134. self.pf_color_button = QtWidgets.QPushButton()
  135. self.pf_color_button.setFixedSize(15, 15)
  136. self.form_box_child_1 = QtWidgets.QHBoxLayout()
  137. self.form_box_child_1.addWidget(self.pf_color_entry)
  138. self.form_box_child_1.addWidget(self.pf_color_button)
  139. self.form_box_child_1.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
  140. grid0.addWidget(self.pf_color_label, 12, 0)
  141. grid0.addLayout(self.form_box_child_1, 12, 1, 1, 2)
  142. # Plot Fill Transparency Level
  143. self.pf_alpha_label = QtWidgets.QLabel('%s:' % _('Alpha'))
  144. self.pf_alpha_label.setToolTip(
  145. _("Set the fill transparency for plotted objects.")
  146. )
  147. self.pf_color_alpha_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
  148. self.pf_color_alpha_slider.setMinimum(0)
  149. self.pf_color_alpha_slider.setMaximum(255)
  150. self.pf_color_alpha_slider.setSingleStep(1)
  151. self.pf_color_alpha_spinner = FCSpinner()
  152. self.pf_color_alpha_spinner.setMinimumWidth(70)
  153. self.pf_color_alpha_spinner.set_range(0, 255)
  154. self.form_box_child_3 = QtWidgets.QHBoxLayout()
  155. self.form_box_child_3.addWidget(self.pf_color_alpha_slider)
  156. self.form_box_child_3.addWidget(self.pf_color_alpha_spinner)
  157. grid0.addWidget(self.pf_alpha_label, 13, 0)
  158. grid0.addLayout(self.form_box_child_3, 13, 1, 1, 2)
  159. self.layout.addStretch()
  160. # Setting plot colors signals
  161. self.pl_color_entry.editingFinished.connect(self.on_pl_color_entry)
  162. self.pl_color_button.clicked.connect(self.on_pl_color_button)
  163. self.pf_color_entry.editingFinished.connect(self.on_pf_color_entry)
  164. self.pf_color_button.clicked.connect(self.on_pf_color_button)
  165. self.pf_color_alpha_spinner.valueChanged.connect(self.on_pf_color_spinner)
  166. self.pf_color_alpha_slider.valueChanged.connect(self.on_pf_color_slider)
  167. # Setting plot colors handlers
  168. def on_pf_color_entry(self):
  169. self.app.defaults['gerber_plot_fill'] = self.pf_color_entry.get_value()[:7] + \
  170. self.app.defaults['gerber_plot_fill'][7:9]
  171. self.pf_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['gerber_plot_fill'])[:7])
  172. def on_pf_color_button(self):
  173. current_color = QtGui.QColor(self.app.defaults['gerber_plot_fill'][:7])
  174. c_dialog = QtWidgets.QColorDialog()
  175. plot_fill_color = c_dialog.getColor(initial=current_color)
  176. if plot_fill_color.isValid() is False:
  177. return
  178. self.pf_color_button.setStyleSheet("background-color:%s" % str(plot_fill_color.name()))
  179. new_val = str(plot_fill_color.name()) + str(self.app.defaults['gerber_plot_fill'][7:9])
  180. self.pf_color_entry.set_value(new_val)
  181. self.app.defaults['gerber_plot_fill'] = new_val
  182. def on_pf_color_spinner(self):
  183. spinner_value = self.pf_color_alpha_spinner.value()
  184. self.pf_color_alpha_slider.setValue(spinner_value)
  185. self.app.defaults['gerber_plot_fill'] = \
  186. self.app.defaults['gerber_plot_fill'][:7] + \
  187. (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
  188. self.app.defaults['gerber_plot_line'] = \
  189. self.app.defaults['gerber_plot_line'][:7] + \
  190. (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
  191. def on_pf_color_slider(self):
  192. slider_value = self.pf_color_alpha_slider.value()
  193. self.pf_color_alpha_spinner.setValue(slider_value)
  194. def on_pl_color_entry(self):
  195. self.app.defaults['gerber_plot_line'] = self.pl_color_entry.get_value()[:7] + \
  196. self.app.defaults['gerber_plot_line'][7:9]
  197. self.pl_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['gerber_plot_line'])[:7])
  198. def on_pl_color_button(self):
  199. current_color = QtGui.QColor(self.app.defaults['gerber_plot_line'][:7])
  200. # print(current_color)
  201. c_dialog = QtWidgets.QColorDialog()
  202. plot_line_color = c_dialog.getColor(initial=current_color)
  203. if plot_line_color.isValid() is False:
  204. return
  205. self.pl_color_button.setStyleSheet("background-color:%s" % str(plot_line_color.name()))
  206. new_val_line = str(plot_line_color.name()) + str(self.app.defaults['gerber_plot_line'][7:9])
  207. self.pl_color_entry.set_value(new_val_line)
  208. self.app.defaults['gerber_plot_line'] = new_val_line