ToolImage.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from FlatCAMTool import FlatCAMTool
  2. from GUIElements import RadioSet, FloatEntry, FCComboBox, IntEntry
  3. from PyQt5 import QtGui, QtCore, QtWidgets
  4. import gettext
  5. import FlatCAMTranslation as fcTranslate
  6. fcTranslate.apply_language('ToolImage')
  7. def _tr(text):
  8. try:
  9. return _(text)
  10. except:
  11. return text
  12. class ToolImage(FlatCAMTool):
  13. toolName = _tr("Image as Object")
  14. def __init__(self, app):
  15. FlatCAMTool.__init__(self, app)
  16. # Title
  17. title_label = QtWidgets.QLabel("%s" % _tr('Image to PCB'))
  18. title_label.setStyleSheet("""
  19. QLabel
  20. {
  21. font-size: 16px;
  22. font-weight: bold;
  23. }
  24. """)
  25. self.layout.addWidget(title_label)
  26. # Form Layout
  27. ti_form_layout = QtWidgets.QFormLayout()
  28. self.layout.addLayout(ti_form_layout)
  29. # Type of object to create for the image
  30. self.tf_type_obj_combo = FCComboBox()
  31. self.tf_type_obj_combo.addItem("Gerber")
  32. self.tf_type_obj_combo.addItem("Geometry")
  33. self.tf_type_obj_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png"))
  34. self.tf_type_obj_combo.setItemIcon(1, QtGui.QIcon("share/geometry16.png"))
  35. self.tf_type_obj_combo_label = QtWidgets.QLabel(_tr("Object Type:"))
  36. self.tf_type_obj_combo_label.setToolTip(
  37. _tr( "Specify the type of object to create from the image.\n"
  38. "It can be of type: Gerber or Geometry.")
  39. )
  40. ti_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo)
  41. # DPI value of the imported image
  42. self.dpi_entry = IntEntry()
  43. self.dpi_label = QtWidgets.QLabel(_tr("DPI value:"))
  44. self.dpi_label.setToolTip(
  45. _tr( "Specify a DPI value for the image.")
  46. )
  47. ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
  48. self.emty_lbl = QtWidgets.QLabel("")
  49. self.layout.addWidget(self.emty_lbl)
  50. self.detail_label = QtWidgets.QLabel("<font size=4><b>%s:</b>" % _tr('Level of detail'))
  51. self.layout.addWidget(self.detail_label)
  52. ti2_form_layout = QtWidgets.QFormLayout()
  53. self.layout.addLayout(ti2_form_layout)
  54. # Type of image interpretation
  55. self.image_type = RadioSet([{'label': 'B/W', 'value': 'black'},
  56. {'label': 'Color', 'value': 'color'}])
  57. self.image_type_label = QtWidgets.QLabel("<b>%s:</b>" % _tr('Image type'))
  58. self.image_type_label.setToolTip(
  59. _tr("Choose a method for the image interpretation.\n"
  60. "B/W means a black & white image. Color means a colored image.")
  61. )
  62. ti2_form_layout.addRow(self.image_type_label, self.image_type)
  63. # Mask value of the imported image when image monochrome
  64. self.mask_bw_entry = IntEntry()
  65. self.mask_bw_label = QtWidgets.QLabel("%s <b>B/W</b>:" % _tr('Mask value'))
  66. self.mask_bw_label.setToolTip(
  67. _tr("Mask for monochrome image.\n"
  68. "Takes values between [0 ... 255].\n"
  69. "Decides the level of details to include\n"
  70. "in the resulting geometry.\n"
  71. "0 means no detail and 255 means everything \n"
  72. "(which is totally black).")
  73. )
  74. ti2_form_layout.addRow(self.mask_bw_label, self.mask_bw_entry)
  75. # Mask value of the imported image for RED color when image color
  76. self.mask_r_entry = IntEntry()
  77. self.mask_r_label = QtWidgets.QLabel("%s <b>R:</b>" % _tr('Mask value'))
  78. self.mask_r_label.setToolTip(
  79. _tr("Mask for RED color.\n"
  80. "Takes values between [0 ... 255].\n"
  81. "Decides the level of details to include\n"
  82. "in the resulting geometry.")
  83. )
  84. ti2_form_layout.addRow(self.mask_r_label, self.mask_r_entry)
  85. # Mask value of the imported image for GREEN color when image color
  86. self.mask_g_entry = IntEntry()
  87. self.mask_g_label = QtWidgets.QLabel("%s <b>G:</b>" % _tr('Mask value'))
  88. self.mask_g_label.setToolTip(
  89. _tr("Mask for GREEN color.\n"
  90. "Takes values between [0 ... 255].\n"
  91. "Decides the level of details to include\n"
  92. "in the resulting geometry.")
  93. )
  94. ti2_form_layout.addRow(self.mask_g_label, self.mask_g_entry)
  95. # Mask value of the imported image for BLUE color when image color
  96. self.mask_b_entry = IntEntry()
  97. self.mask_b_label = QtWidgets.QLabel("%s <b>B:</b>" % _tr('Mask value'))
  98. self.mask_b_label.setToolTip(
  99. _tr("Mask for BLUE color.\n"
  100. "Takes values between [0 ... 255].\n"
  101. "Decides the level of details to include\n"
  102. "in the resulting geometry.")
  103. )
  104. ti2_form_layout.addRow(self.mask_b_label, self.mask_b_entry)
  105. # Buttons
  106. hlay = QtWidgets.QHBoxLayout()
  107. self.layout.addLayout(hlay)
  108. hlay.addStretch()
  109. self.import_button = QtWidgets.QPushButton(_tr("Import image"))
  110. self.import_button.setToolTip(
  111. _tr("Open a image of raster type and then import it in FlatCAM.")
  112. )
  113. hlay.addWidget(self.import_button)
  114. self.layout.addStretch()
  115. ## Signals
  116. self.import_button.clicked.connect(self.on_file_importimage)
  117. def run(self, toggle=False):
  118. self.app.report_usage("ToolImage()")
  119. if toggle:
  120. # if the splitter is hidden, display it, else hide it but only if the current widget is the same
  121. if self.app.ui.splitter.sizes()[0] == 0:
  122. self.app.ui.splitter.setSizes([1, 1])
  123. else:
  124. try:
  125. if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName:
  126. self.app.ui.splitter.setSizes([0, 1])
  127. except AttributeError:
  128. pass
  129. FlatCAMTool.run(self)
  130. self.set_tool_ui()
  131. self.app.ui.notebook.setTabText(2, _tr("Image Tool"))
  132. def install(self, icon=None, separator=None, **kwargs):
  133. FlatCAMTool.install(self, icon, separator, **kwargs)
  134. def set_tool_ui(self):
  135. ## Initialize form
  136. self.dpi_entry.set_value(96)
  137. self.image_type.set_value('black')
  138. self.mask_bw_entry.set_value(250)
  139. self.mask_r_entry.set_value(250)
  140. self.mask_g_entry.set_value(250)
  141. self.mask_b_entry.set_value(250)
  142. def on_file_importimage(self):
  143. """
  144. Callback for menu item File->Import IMAGE.
  145. :param type_of_obj: to import the IMAGE as Geometry or as Gerber
  146. :type type_of_obj: str
  147. :return: None
  148. """
  149. mask = []
  150. self.app.log.debug("on_file_importimage()")
  151. filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
  152. "Bitmap File (*.BMP);;" \
  153. "PNG File (*.PNG);;" \
  154. "Jpeg File (*.JPG);;" \
  155. "All Files (*.*)"
  156. try:
  157. filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption=_tr("Import IMAGE"),
  158. directory=self.app.get_last_folder(), filter=filter)
  159. except TypeError:
  160. filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption=_tr("Import IMAGE"), filter=filter)
  161. filename = str(filename)
  162. type = self.tf_type_obj_combo.get_value().lower()
  163. dpi = self.dpi_entry.get_value()
  164. mode = self.image_type.get_value()
  165. mask = [self.mask_bw_entry.get_value(), self.mask_r_entry.get_value(),self.mask_g_entry.get_value(),
  166. self.mask_b_entry.get_value()]
  167. if filename == "":
  168. self.app.inform.emit(_tr("Open cancelled."))
  169. else:
  170. self.app.worker_task.emit({'fcn': self.app.import_image,
  171. 'params': [filename, type, dpi, mode, mask]})
  172. # self.import_svg(filename, "geometry")