ToolImage.py 7.8 KB

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