FlatCAMDocument.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. # ##########################################################
  2. # FlatCAM: 2D Post-processing for Manufacturing #
  3. # http://flatcam.org #
  4. # Author: Juan Pablo Caram (c) #
  5. # Date: 2/5/2014 #
  6. # MIT Licence #
  7. # ##########################################################
  8. # ##########################################################
  9. # File modified by: Marius Stanciu #
  10. # ##########################################################
  11. from appEditors.AppTextEditor import AppTextEditor
  12. from appObjects.FlatCAMObj import *
  13. import gettext
  14. import appTranslation as fcTranslate
  15. import builtins
  16. fcTranslate.apply_language('strings')
  17. if '_' not in builtins.__dict__:
  18. _ = gettext.gettext
  19. class DocumentObject(FlatCAMObj):
  20. """
  21. Represents a Document object.
  22. """
  23. optionChanged = QtCore.pyqtSignal(str)
  24. ui_type = DocumentObjectUI
  25. def __init__(self, name):
  26. self.decimals = self.app.decimals
  27. log.debug("Creating a Document object...")
  28. FlatCAMObj.__init__(self, name)
  29. self.kind = "document"
  30. self.units = ''
  31. self.ser_attrs = ['options', 'kind', 'source_file']
  32. self.source_file = ''
  33. self.doc_code = ''
  34. self.font_name = None
  35. self.font_italic = None
  36. self.font_bold = None
  37. self.font_underline = None
  38. self.document_editor_tab = None
  39. self._read_only = False
  40. self.units_found = self.app.defaults['units']
  41. def set_ui(self, ui):
  42. FlatCAMObj.set_ui(self, ui)
  43. log.debug("DocumentObject.set_ui()")
  44. assert isinstance(self.ui, DocumentObjectUI), \
  45. "Expected a DocumentObjectUI, got %s" % type(self.ui)
  46. self.units = self.app.defaults['units'].upper()
  47. self.units_found = self.app.defaults['units']
  48. # Fill form fields only on object create
  49. self.to_form()
  50. # Show/Hide Advanced Options
  51. if self.app.defaults["global_app_level"] == 'b':
  52. self.ui.level.setText(_(
  53. '<span style="color:green;"><b>Basic</b></span>'
  54. ))
  55. else:
  56. self.ui.level.setText(_(
  57. '<span style="color:red;"><b>Advanced</b></span>'
  58. ))
  59. self.document_editor_tab = AppTextEditor(app=self.app)
  60. stylesheet = """
  61. QTextEdit {selection-background-color:%s;
  62. selection-color:white;
  63. }
  64. """ % self.app.defaults["document_sel_color"]
  65. self.document_editor_tab.code_editor.setStyleSheet(stylesheet)
  66. self.document_editor_tab.buttonRun.hide()
  67. self.ui.autocomplete_cb.set_value(self.app.defaults['document_autocompleter'])
  68. self.on_autocomplete_changed(state=self.app.defaults['document_autocompleter'])
  69. self.on_tab_size_change(val=self.app.defaults['document_tab_size'])
  70. flt = "FlatCAM Docs (*.FlatDoc);;All Files (*.*)"
  71. # ######################################################################
  72. # ######################## SIGNALS #####################################
  73. # ######################################################################
  74. self.document_editor_tab.buttonOpen.clicked.disconnect()
  75. self.document_editor_tab.buttonOpen.clicked.connect(lambda: self.document_editor_tab.handleOpen(filt=flt))
  76. self.document_editor_tab.buttonSave.clicked.disconnect()
  77. self.document_editor_tab.buttonSave.clicked.connect(lambda: self.document_editor_tab.handleSaveGCode(filt=flt))
  78. self.document_editor_tab.code_editor.textChanged.connect(self.on_text_changed)
  79. self.ui.font_type_cb.currentFontChanged.connect(self.font_family)
  80. self.ui.font_size_cb.activated.connect(self.font_size)
  81. self.ui.font_bold_tb.clicked.connect(self.on_bold_button)
  82. self.ui.font_italic_tb.clicked.connect(self.on_italic_button)
  83. self.ui.font_under_tb.clicked.connect(self.on_underline_button)
  84. self.ui.font_color_entry.editingFinished.connect(self.on_font_color_entry)
  85. self.ui.font_color_button.clicked.connect(self.on_font_color_button)
  86. self.ui.sel_color_entry.editingFinished.connect(self.on_selection_color_entry)
  87. self.ui.sel_color_button.clicked.connect(self.on_selection_color_button)
  88. self.ui.al_left_tb.clicked.connect(lambda: self.document_editor_tab.code_editor.setAlignment(Qt.AlignLeft))
  89. self.ui.al_center_tb.clicked.connect(lambda: self.document_editor_tab.code_editor.setAlignment(Qt.AlignCenter))
  90. self.ui.al_right_tb.clicked.connect(lambda: self.document_editor_tab.code_editor.setAlignment(Qt.AlignRight))
  91. self.ui.al_justify_tb.clicked.connect(
  92. lambda: self.document_editor_tab.code_editor.setAlignment(Qt.AlignJustify)
  93. )
  94. self.ui.autocomplete_cb.stateChanged.connect(self.on_autocomplete_changed)
  95. self.ui.tab_size_spinner.returnPressed.connect(self.on_tab_size_change)
  96. # #######################################################################
  97. self.ui.font_color_entry.set_value(self.app.defaults['document_font_color'])
  98. self.ui.font_color_button.setStyleSheet(
  99. "background-color:%s" % str(self.app.defaults['document_font_color']))
  100. self.ui.sel_color_entry.set_value(self.app.defaults['document_sel_color'])
  101. self.ui.sel_color_button.setStyleSheet(
  102. "background-color:%s" % self.app.defaults['document_sel_color'])
  103. self.ui.font_size_cb.setCurrentIndex(int(self.app.defaults['document_font_size']))
  104. # self.document_editor_tab.handleTextChanged()
  105. self.ser_attrs = ['options', 'kind', 'source_file']
  106. if Qt.mightBeRichText(self.source_file):
  107. # self.document_editor_tab.code_editor.setHtml(self.source_file)
  108. self.document_editor_tab.load_text(self.source_file, move_to_start=True, clear_text=True, as_html=True)
  109. else:
  110. # for line in self.source_file.splitlines():
  111. # self.document_editor_tab.code_editor.append(line)
  112. self.document_editor_tab.load_text(self.source_file, move_to_start=True, clear_text=True, as_html=False)
  113. self.build_ui()
  114. @property
  115. def read_only(self):
  116. return self._read_only
  117. @read_only.setter
  118. def read_only(self, val):
  119. if val:
  120. self._read_only = True
  121. else:
  122. self._read_only = False
  123. def build_ui(self):
  124. FlatCAMObj.build_ui(self)
  125. tab_here = False
  126. # try to not add too many times a tab that it is already installed
  127. for idx in range(self.app.ui.plot_tab_area.count()):
  128. if self.app.ui.plot_tab_area.widget(idx).objectName() == self.options['name']:
  129. tab_here = True
  130. break
  131. # add the tab if it is not already added
  132. if tab_here is False:
  133. self.app.ui.plot_tab_area.addTab(self.document_editor_tab, '%s' % _("Document Editor"))
  134. self.document_editor_tab.setObjectName(self.options['name'])
  135. # Switch plot_area to CNCJob tab
  136. self.app.ui.plot_tab_area.setCurrentWidget(self.document_editor_tab)
  137. def on_autocomplete_changed(self, state):
  138. if state:
  139. self.document_editor_tab.code_editor.completer_enable = True
  140. else:
  141. self.document_editor_tab.code_editor.completer_enable = False
  142. def on_tab_size_change(self, val=None):
  143. try:
  144. self.ui.tab_size_spinner.returnPressed.disconnect(self.on_tab_size_change)
  145. except TypeError:
  146. pass
  147. if val:
  148. self.ui.tab_size_spinner.set_value(val)
  149. tab_balue = int(self.ui.tab_size_spinner.get_value())
  150. self.document_editor_tab.code_editor.setTabStopWidth(tab_balue)
  151. self.app.defaults['document_tab_size'] = tab_balue
  152. self.ui.tab_size_spinner.returnPressed.connect(self.on_tab_size_change)
  153. def on_text_changed(self):
  154. self.source_file = self.document_editor_tab.code_editor.toHtml()
  155. # print(self.source_file)
  156. def font_family(self, font):
  157. # self.document_editor_tab.code_editor.selectAll()
  158. font.setPointSize(float(self.ui.font_size_cb.get_value()))
  159. self.document_editor_tab.code_editor.setCurrentFont(font)
  160. self.font_name = self.ui.font_type_cb.currentFont().family()
  161. def font_size(self):
  162. # self.document_editor_tab.code_editor.selectAll()
  163. self.document_editor_tab.code_editor.setFontPointSize(float(self.ui.font_size_cb.get_value()))
  164. def on_bold_button(self):
  165. if self.ui.font_bold_tb.isChecked():
  166. self.document_editor_tab.code_editor.setFontWeight(QtGui.QFont.Bold)
  167. self.font_bold = True
  168. else:
  169. self.document_editor_tab.code_editor.setFontWeight(QtGui.QFont.Normal)
  170. self.font_bold = False
  171. def on_italic_button(self):
  172. if self.ui.font_italic_tb.isChecked():
  173. self.document_editor_tab.code_editor.setFontItalic(True)
  174. self.font_italic = True
  175. else:
  176. self.document_editor_tab.code_editor.setFontItalic(False)
  177. self.font_italic = False
  178. def on_underline_button(self):
  179. if self.ui.font_under_tb.isChecked():
  180. self.document_editor_tab.code_editor.setFontUnderline(True)
  181. self.font_underline = True
  182. else:
  183. self.document_editor_tab.code_editor.setFontUnderline(False)
  184. self.font_underline = False
  185. # Setting font colors handlers
  186. def on_font_color_entry(self):
  187. self.app.defaults['document_font_color'] = self.ui.font_color_entry.get_value()
  188. self.ui.font_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['document_font_color']))
  189. def on_font_color_button(self):
  190. current_color = QtGui.QColor(self.app.defaults['document_font_color'])
  191. c_dialog = QtWidgets.QColorDialog()
  192. font_color = c_dialog.getColor(initial=current_color)
  193. if font_color.isValid() is False:
  194. return
  195. self.document_editor_tab.code_editor.setTextColor(font_color)
  196. self.ui.font_color_button.setStyleSheet("background-color:%s" % str(font_color.name()))
  197. new_val = str(font_color.name())
  198. self.ui.font_color_entry.set_value(new_val)
  199. self.app.defaults['document_font_color'] = new_val
  200. # Setting selection colors handlers
  201. def on_selection_color_entry(self):
  202. self.app.defaults['document_sel_color'] = self.ui.sel_color_entry.get_value()
  203. self.ui.sel_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['document_sel_color']))
  204. def on_selection_color_button(self):
  205. current_color = QtGui.QColor(self.app.defaults['document_sel_color'])
  206. c_dialog = QtWidgets.QColorDialog()
  207. sel_color = c_dialog.getColor(initial=current_color)
  208. if sel_color.isValid() is False:
  209. return
  210. p = QtGui.QPalette()
  211. p.setColor(QtGui.QPalette.Highlight, sel_color)
  212. p.setColor(QtGui.QPalette.HighlightedText, QtGui.QColor('white'))
  213. self.document_editor_tab.code_editor.setPalette(p)
  214. self.ui.sel_color_button.setStyleSheet("background-color:%s" % str(sel_color.name()))
  215. new_val = str(sel_color.name())
  216. self.ui.sel_color_entry.set_value(new_val)
  217. self.app.defaults['document_sel_color'] = new_val
  218. def mirror(self, axis, point):
  219. pass
  220. def offset(self, vect):
  221. pass
  222. def rotate(self, angle, point):
  223. pass
  224. def scale(self, xfactor, yfactor=None, point=None):
  225. pass
  226. def skew(self, angle_x, angle_y, point):
  227. pass
  228. def buffer(self, distance, join, factor=None):
  229. pass
  230. def bounds(self, flatten=False):
  231. return None, None, None, None
  232. def to_dict(self):
  233. """
  234. Returns a representation of the object as a dictionary.
  235. Attributes to include are listed in ``self.ser_attrs``.
  236. :return: A dictionary-encoded copy of the object.
  237. :rtype: dict
  238. """
  239. d = {}
  240. for attr in self.ser_attrs:
  241. d[attr] = getattr(self, attr)
  242. return d
  243. def from_dict(self, d):
  244. """
  245. Sets object's attributes from a dictionary.
  246. Attributes to include are listed in ``self.ser_attrs``.
  247. This method will look only for only and all the
  248. attributes in ``self.ser_attrs``. They must all
  249. be present. Use only for deserializing saved
  250. objects.
  251. :param d: Dictionary of attributes to set in the object.
  252. :type d: dict
  253. :return: None
  254. """
  255. for attr in self.ser_attrs:
  256. setattr(self, attr, d[attr])