ToolsTransformPrefGroupUI.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. from PyQt5 import QtWidgets
  2. from PyQt5.QtCore import QSettings
  3. from AppGUI.GUIElements import FCDoubleSpinner, FCCheckBox, FCEntry
  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 FlatCAM 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. # ## Rotate Angle
  33. rotate_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Rotate"))
  34. grid0.addWidget(rotate_title_lbl, 0, 0, 1, 2)
  35. self.rotate_entry = FCDoubleSpinner()
  36. self.rotate_entry.set_range(-360.0, 360.0)
  37. self.rotate_entry.set_precision(self.decimals)
  38. self.rotate_entry.setSingleStep(15)
  39. self.rotate_label = QtWidgets.QLabel('%s:' % _("Angle"))
  40. self.rotate_label.setToolTip(
  41. _("Angle for Rotation action, in degrees.\n"
  42. "Float number between -360 and 359.\n"
  43. "Positive numbers for CW motion.\n"
  44. "Negative numbers for CCW motion.")
  45. )
  46. grid0.addWidget(self.rotate_label, 1, 0)
  47. grid0.addWidget(self.rotate_entry, 1, 1)
  48. # ## Skew/Shear Angle on X axis
  49. skew_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Skew"))
  50. grid0.addWidget(skew_title_lbl, 2, 0, 1, 2)
  51. self.skewx_entry = FCDoubleSpinner()
  52. self.skewx_entry.set_range(-360.0, 360.0)
  53. self.skewx_entry.set_precision(self.decimals)
  54. self.skewx_entry.setSingleStep(0.1)
  55. self.skewx_label = QtWidgets.QLabel('%s:' % _("X angle"))
  56. self.skewx_label.setToolTip(
  57. _("Angle for Skew action, in degrees.\n"
  58. "Float number between -360 and 359.")
  59. )
  60. grid0.addWidget(self.skewx_label, 3, 0)
  61. grid0.addWidget(self.skewx_entry, 3, 1)
  62. # ## Skew/Shear Angle on Y axis
  63. self.skewy_entry = FCDoubleSpinner()
  64. self.skewy_entry.set_range(-360.0, 360.0)
  65. self.skewy_entry.set_precision(self.decimals)
  66. self.skewy_entry.setSingleStep(0.1)
  67. self.skewy_label = QtWidgets.QLabel('%s:' % _("Y angle"))
  68. self.skewy_label.setToolTip(
  69. _("Angle for Skew action, in degrees.\n"
  70. "Float number between -360 and 359.")
  71. )
  72. grid0.addWidget(self.skewy_label, 4, 0)
  73. grid0.addWidget(self.skewy_entry, 4, 1)
  74. # ## Scale
  75. scale_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Scale"))
  76. grid0.addWidget(scale_title_lbl, 5, 0, 1, 2)
  77. self.scalex_entry = FCDoubleSpinner()
  78. self.scalex_entry.set_range(0, 9999.9999)
  79. self.scalex_entry.set_precision(self.decimals)
  80. self.scalex_entry.setSingleStep(0.1)
  81. self.scalex_label = QtWidgets.QLabel('%s:' % _("X factor"))
  82. self.scalex_label.setToolTip(
  83. _("Factor for scaling on X axis.")
  84. )
  85. grid0.addWidget(self.scalex_label, 6, 0)
  86. grid0.addWidget(self.scalex_entry, 6, 1)
  87. # ## Scale factor on X axis
  88. self.scaley_entry = FCDoubleSpinner()
  89. self.scaley_entry.set_range(0, 9999.9999)
  90. self.scaley_entry.set_precision(self.decimals)
  91. self.scaley_entry.setSingleStep(0.1)
  92. self.scaley_label = QtWidgets.QLabel('%s:' % _("Y factor"))
  93. self.scaley_label.setToolTip(
  94. _("Factor for scaling on Y axis.")
  95. )
  96. grid0.addWidget(self.scaley_label, 7, 0)
  97. grid0.addWidget(self.scaley_entry, 7, 1)
  98. # ## Link Scale factors
  99. self.link_cb = FCCheckBox(_("Link"))
  100. self.link_cb.setToolTip(
  101. _("Scale the selected object(s)\n"
  102. "using the Scale_X factor for both axis.")
  103. )
  104. grid0.addWidget(self.link_cb, 8, 0)
  105. # ## Scale Reference
  106. self.reference_cb = FCCheckBox('%s' % _("Scale Reference"))
  107. self.reference_cb.setToolTip(
  108. _("Scale the selected object(s)\n"
  109. "using the origin reference when checked,\n"
  110. "and the center of the biggest bounding box\n"
  111. "of the selected objects when unchecked.")
  112. )
  113. grid0.addWidget(self.reference_cb, 8, 1)
  114. # ## Offset
  115. offset_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Offset"))
  116. grid0.addWidget(offset_title_lbl, 9, 0, 1, 2)
  117. self.offx_entry = FCDoubleSpinner()
  118. self.offx_entry.set_range(-9999.9999, 9999.9999)
  119. self.offx_entry.set_precision(self.decimals)
  120. self.offx_entry.setSingleStep(0.1)
  121. self.offx_label = QtWidgets.QLabel('%s:' % _("X val"))
  122. self.offx_label.setToolTip(
  123. _("Distance to offset on X axis. In current units.")
  124. )
  125. grid0.addWidget(self.offx_label, 10, 0)
  126. grid0.addWidget(self.offx_entry, 10, 1)
  127. # ## Offset distance on Y axis
  128. self.offy_entry = FCDoubleSpinner()
  129. self.offy_entry.set_range(-9999.9999, 9999.9999)
  130. self.offy_entry.set_precision(self.decimals)
  131. self.offy_entry.setSingleStep(0.1)
  132. self.offy_label = QtWidgets.QLabel('%s:' % _("Y val"))
  133. self.offy_label.setToolTip(
  134. _("Distance to offset on Y axis. In current units.")
  135. )
  136. grid0.addWidget(self.offy_label, 11, 0)
  137. grid0.addWidget(self.offy_entry, 11, 1)
  138. # ## Mirror
  139. mirror_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Mirror"))
  140. grid0.addWidget(mirror_title_lbl, 12, 0, 1, 2)
  141. # ## Mirror (Flip) Reference Point
  142. self.mirror_reference_cb = FCCheckBox('%s' % _("Mirror Reference"))
  143. self.mirror_reference_cb.setToolTip(
  144. _("Flip the selected object(s)\n"
  145. "around the point in Point Entry Field.\n"
  146. "\n"
  147. "The point coordinates can be captured by\n"
  148. "left click on canvas together with pressing\n"
  149. "SHIFT key. \n"
  150. "Then click Add button to insert coordinates.\n"
  151. "Or enter the coords in format (x, y) in the\n"
  152. "Point Entry field and click Flip on X(Y)"))
  153. grid0.addWidget(self.mirror_reference_cb, 13, 0, 1, 2)
  154. self.flip_ref_label = QtWidgets.QLabel('%s' % _("Mirror Reference point"))
  155. self.flip_ref_label.setToolTip(
  156. _("Coordinates in format (x, y) used as reference for mirroring.\n"
  157. "The 'x' in (x, y) will be used when using Flip on X and\n"
  158. "the 'y' in (x, y) will be used when using Flip on Y and")
  159. )
  160. self.flip_ref_entry = FCEntry()
  161. grid0.addWidget(self.flip_ref_label, 14, 0, 1, 2)
  162. grid0.addWidget(self.flip_ref_entry, 15, 0, 1, 2)
  163. # ## Buffer
  164. buffer_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _("Buffer"))
  165. grid0.addWidget(buffer_title_lbl, 16, 0, 1, 2)
  166. self.buffer_label = QtWidgets.QLabel('%s:' % _("Distance"))
  167. self.buffer_label.setToolTip(
  168. _("A positive value will create the effect of dilation,\n"
  169. "while a negative value will create the effect of erosion.\n"
  170. "Each geometry element of the object will be increased\n"
  171. "or decreased with the 'distance'.")
  172. )
  173. self.buffer_entry = FCDoubleSpinner()
  174. self.buffer_entry.set_precision(self.decimals)
  175. self.buffer_entry.setSingleStep(0.1)
  176. self.buffer_entry.setWrapping(True)
  177. self.buffer_entry.set_range(-9999.9999, 9999.9999)
  178. grid0.addWidget(self.buffer_label, 17, 0)
  179. grid0.addWidget(self.buffer_entry, 17, 1)
  180. self.buffer_factor_label = QtWidgets.QLabel('%s:' % _("Value"))
  181. self.buffer_factor_label.setToolTip(
  182. _("A positive value will create the effect of dilation,\n"
  183. "while a negative value will create the effect of erosion.\n"
  184. "Each geometry element of the object will be increased\n"
  185. "or decreased to fit the 'Value'. Value is a percentage\n"
  186. "of the initial dimension.")
  187. )
  188. self.buffer_factor_entry = FCDoubleSpinner(suffix='%')
  189. self.buffer_factor_entry.set_range(-100.0000, 1000.0000)
  190. self.buffer_factor_entry.set_precision(self.decimals)
  191. self.buffer_factor_entry.setWrapping(True)
  192. self.buffer_factor_entry.setSingleStep(1)
  193. grid0.addWidget(self.buffer_factor_label, 18, 0)
  194. grid0.addWidget(self.buffer_factor_entry, 18, 1)
  195. self.buffer_rounded_cb = FCCheckBox()
  196. self.buffer_rounded_cb.setText('%s' % _("Rounded"))
  197. self.buffer_rounded_cb.setToolTip(
  198. _("If checked then the buffer will surround the buffered shape,\n"
  199. "every corner will be rounded.\n"
  200. "If not checked then the buffer will follow the exact geometry\n"
  201. "of the buffered shape.")
  202. )
  203. grid0.addWidget(self.buffer_rounded_cb, 19, 0, 1, 2)
  204. self.layout.addStretch()