ToolsTransformPrefGroupUI.py 9.2 KB

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