ToolsTransformPrefGroupUI.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. from PyQt5 import QtWidgets, QtGui
  2. from PyQt5.QtCore import QSettings
  3. from appGUI.GUIElements import FCDoubleSpinner, FCCheckBox, NumericalEvalTupleEntry, FCComboBox
  4. from appGUI.preferences.OptionsGroupUI import OptionsGroupUI
  5. import gettext
  6. import appTranslation as fcTranslate
  7. import builtins
  8. fcTranslate.apply_language('strings')
  9. if '_' not in builtins.__dict__:
  10. _ = gettext.gettext
  11. settings = QSettings("Open Source", "FlatCAM")
  12. if settings.contains("machinist"):
  13. machinist_setting = settings.value('machinist', type=int)
  14. else:
  15. machinist_setting = 0
  16. class ToolsTransformPrefGroupUI(OptionsGroupUI):
  17. def __init__(self, decimals=4, parent=None):
  18. super(ToolsTransformPrefGroupUI, self).__init__(self, parent=parent)
  19. self.setTitle(str(_("Transform Tool Options")))
  20. self.decimals = decimals
  21. # ## Transformations
  22. self.transform_label = QtWidgets.QLabel("<b>%s:</b>" % _("Parameters"))
  23. self.transform_label.setToolTip(
  24. _("Various transformations that can be applied\n"
  25. "on a application object.")
  26. )
  27. self.layout.addWidget(self.transform_label)
  28. grid0 = QtWidgets.QGridLayout()
  29. self.layout.addLayout(grid0)
  30. grid0.setColumnStretch(0, 0)
  31. grid0.setColumnStretch(1, 1)
  32. # Reference Type
  33. ref_label = QtWidgets.QLabel('%s:' % _("Reference"))
  34. ref_label.setToolTip(
  35. _("The reference point for Rotate, Skew, Scale, Mirror.\n"
  36. "Can be:\n"
  37. "- Origin -> it is the 0, 0 point\n"
  38. "- Selection -> the center of the bounding box of the selected objects\n"
  39. "- Point -> a custom point defined by X,Y coordinates\n"
  40. "- Object -> the center of the bounding box of a specific object")
  41. )
  42. self.ref_combo = FCComboBox()
  43. self.ref_items = [_("Origin"), _("Selection"), _("Point"), _("Object")]
  44. self.ref_combo.addItems(self.ref_items)
  45. grid0.addWidget(ref_label, 0, 0)
  46. grid0.addWidget(self.ref_combo, 0, 1)
  47. self.point_label = QtWidgets.QLabel('%s:' % _("Point"))
  48. self.point_label.setToolTip(
  49. _("A point of reference in format X,Y.")
  50. )
  51. self.point_entry = NumericalEvalTupleEntry()
  52. grid0.addWidget(self.point_label, 1, 0)
  53. grid0.addWidget(self.point_entry, 1, 1)
  54. # Type of object to be used as reference
  55. self.type_object_label = QtWidgets.QLabel('%s:' % _("Object"))
  56. self.type_object_label.setToolTip(
  57. _("The type of object used as reference.")
  58. )
  59. self.type_obj_combo = FCComboBox()
  60. self.type_obj_combo.addItem(_("Gerber"))
  61. self.type_obj_combo.addItem(_("Excellon"))
  62. self.type_obj_combo.addItem(_("Geometry"))
  63. self.type_obj_combo.setItemIcon(0, QtGui.QIcon(self.app.resource_location + "/flatcam_icon16.png"))
  64. self.type_obj_combo.setItemIcon(1, QtGui.QIcon(self.app.resource_location + "/drill16.png"))
  65. self.type_obj_combo.setItemIcon(2, QtGui.QIcon(self.app.resource_location + "/geometry16.png"))
  66. grid0.addWidget(self.type_object_label, 3, 0)
  67. grid0.addWidget(self.type_obj_combo, 3, 1)
  68. # ## Rotate Angle
  69. rotate_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Rotate"))
  70. grid0.addWidget(rotate_title_lbl, 4, 0, 1, 2)
  71. self.rotate_entry = FCDoubleSpinner()
  72. self.rotate_entry.set_range(-360.0, 360.0)
  73. self.rotate_entry.set_precision(self.decimals)
  74. self.rotate_entry.setSingleStep(15)
  75. self.rotate_label = QtWidgets.QLabel('%s:' % _("Angle"))
  76. self.rotate_label.setToolTip(
  77. _("Angle, in degrees.\n"
  78. "Float number between -360 and 359.\n"
  79. "Positive numbers for CW motion.\n"
  80. "Negative numbers for CCW motion.")
  81. )
  82. grid0.addWidget(self.rotate_label, 6, 0)
  83. grid0.addWidget(self.rotate_entry, 6, 1)
  84. # ## Skew/Shear Angle on X axis
  85. skew_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Skew"))
  86. grid0.addWidget(skew_title_lbl, 8, 0)
  87. # ## Link Skew factors
  88. self.skew_link_cb = FCCheckBox()
  89. self.skew_link_cb.setText(_("Link"))
  90. self.skew_link_cb.setToolTip(
  91. _("Link the Y entry to X entry and copy its content.")
  92. )
  93. grid0.addWidget(self.skew_link_cb, 8, 1)
  94. self.skewx_entry = FCDoubleSpinner()
  95. self.skewx_entry.set_range(-360.0, 360.0)
  96. self.skewx_entry.set_precision(self.decimals)
  97. self.skewx_entry.setSingleStep(0.1)
  98. self.skewx_label = QtWidgets.QLabel('%s:' % _("X angle"))
  99. self.skewx_label.setToolTip(
  100. _("Angle, in degrees.\n"
  101. "Float number between -360 and 359.")
  102. )
  103. grid0.addWidget(self.skewx_label, 9, 0)
  104. grid0.addWidget(self.skewx_entry, 9, 1)
  105. # ## Skew/Shear Angle on Y axis
  106. self.skewy_entry = FCDoubleSpinner()
  107. self.skewy_entry.set_range(-360.0, 360.0)
  108. self.skewy_entry.set_precision(self.decimals)
  109. self.skewy_entry.setSingleStep(0.1)
  110. self.skewy_label = QtWidgets.QLabel('%s:' % _("Y angle"))
  111. self.skewy_label.setToolTip(
  112. _("Angle, in degrees.\n"
  113. "Float number between -360 and 359.")
  114. )
  115. grid0.addWidget(self.skewy_label, 10, 0)
  116. grid0.addWidget(self.skewy_entry, 10, 1)
  117. # ## Scale
  118. scale_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Scale"))
  119. grid0.addWidget(scale_title_lbl, 12, 0)
  120. # ## Link Scale factors
  121. self.scale_link_cb = FCCheckBox(_("Link"))
  122. self.scale_link_cb.setToolTip(
  123. _("Link the Y entry to X entry and copy its content.")
  124. )
  125. grid0.addWidget(self.scale_link_cb, 12, 1)
  126. self.scalex_entry = FCDoubleSpinner()
  127. self.scalex_entry.set_range(0, 10000.0000)
  128. self.scalex_entry.set_precision(self.decimals)
  129. self.scalex_entry.setSingleStep(0.1)
  130. self.scalex_label = QtWidgets.QLabel('%s:' % _("X factor"))
  131. self.scalex_label.setToolTip(
  132. _("Factor for scaling on X axis.")
  133. )
  134. grid0.addWidget(self.scalex_label, 14, 0)
  135. grid0.addWidget(self.scalex_entry, 14, 1)
  136. # ## Scale factor on X axis
  137. self.scaley_entry = FCDoubleSpinner()
  138. self.scaley_entry.set_range(0, 10000.0000)
  139. self.scaley_entry.set_precision(self.decimals)
  140. self.scaley_entry.setSingleStep(0.1)
  141. self.scaley_label = QtWidgets.QLabel('%s:' % _("Y factor"))
  142. self.scaley_label.setToolTip(
  143. _("Factor for scaling on Y axis.")
  144. )
  145. grid0.addWidget(self.scaley_label, 16, 0)
  146. grid0.addWidget(self.scaley_entry, 16, 1)
  147. # ## Offset
  148. offset_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Offset"))
  149. grid0.addWidget(offset_title_lbl, 20, 0, 1, 2)
  150. self.offx_entry = FCDoubleSpinner()
  151. self.offx_entry.set_range(-10000.0000, 10000.0000)
  152. self.offx_entry.set_precision(self.decimals)
  153. self.offx_entry.setSingleStep(0.1)
  154. self.offx_label = QtWidgets.QLabel('%s:' % _("X val"))
  155. self.offx_label.setToolTip(
  156. _("Distance to offset on X axis. In current units.")
  157. )
  158. grid0.addWidget(self.offx_label, 22, 0)
  159. grid0.addWidget(self.offx_entry, 22, 1)
  160. # ## Offset distance on Y axis
  161. self.offy_entry = FCDoubleSpinner()
  162. self.offy_entry.set_range(-10000.0000, 10000.0000)
  163. self.offy_entry.set_precision(self.decimals)
  164. self.offy_entry.setSingleStep(0.1)
  165. self.offy_label = QtWidgets.QLabel('%s:' % _("Y val"))
  166. self.offy_label.setToolTip(
  167. _("Distance to offset on Y axis. In current units.")
  168. )
  169. grid0.addWidget(self.offy_label, 24, 0)
  170. grid0.addWidget(self.offy_entry, 24, 1)
  171. # ## Buffer
  172. buffer_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Buffer"))
  173. grid0.addWidget(buffer_title_lbl, 26, 0)
  174. self.buffer_rounded_cb = FCCheckBox()
  175. self.buffer_rounded_cb.setText('%s' % _("Rounded"))
  176. self.buffer_rounded_cb.setToolTip(
  177. _("If checked then the buffer will surround the buffered shape,\n"
  178. "every corner will be rounded.\n"
  179. "If not checked then the buffer will follow the exact geometry\n"
  180. "of the buffered shape.")
  181. )
  182. grid0.addWidget(self.buffer_rounded_cb, 26, 1)
  183. self.buffer_label = QtWidgets.QLabel('%s:' % _("Distance"))
  184. self.buffer_label.setToolTip(
  185. _("A positive value will create the effect of dilation,\n"
  186. "while a negative value will create the effect of erosion.\n"
  187. "Each geometry element of the object will be increased\n"
  188. "or decreased with the 'distance'.")
  189. )
  190. self.buffer_entry = FCDoubleSpinner()
  191. self.buffer_entry.set_precision(self.decimals)
  192. self.buffer_entry.setSingleStep(0.1)
  193. self.buffer_entry.setWrapping(True)
  194. self.buffer_entry.set_range(-10000.0000, 10000.0000)
  195. grid0.addWidget(self.buffer_label, 28, 0)
  196. grid0.addWidget(self.buffer_entry, 28, 1)
  197. self.buffer_factor_label = QtWidgets.QLabel('%s:' % _("Value"))
  198. self.buffer_factor_label.setToolTip(
  199. _("A positive value will create the effect of dilation,\n"
  200. "while a negative value will create the effect of erosion.\n"
  201. "Each geometry element of the object will be increased\n"
  202. "or decreased to fit the 'Value'. Value is a percentage\n"
  203. "of the initial dimension.")
  204. )
  205. self.buffer_factor_entry = FCDoubleSpinner(suffix='%')
  206. self.buffer_factor_entry.set_range(-100.0000, 1000.0000)
  207. self.buffer_factor_entry.set_precision(self.decimals)
  208. self.buffer_factor_entry.setWrapping(True)
  209. self.buffer_factor_entry.setSingleStep(1)
  210. grid0.addWidget(self.buffer_factor_label, 30, 0)
  211. grid0.addWidget(self.buffer_factor_entry, 30, 1)
  212. self.layout.addStretch()