From 5ba9ac7846aa06340481f69fad16fb2a4909b9b8 Mon Sep 17 00:00:00 2001 From: Mario Voigt Date: Thu, 29 Apr 2021 15:53:03 +0200 Subject: [PATCH] added output pro extension. not working yet. working on ... --- .../fablabchemnitz/output_pro/outputpro.inx | 16 + .../fablabchemnitz/output_pro/outputpro.py | 1034 +++++++++++++++++ .../output_pro/outputpro/__init__.py | 0 .../output_pro/outputpro/alpha.png | Bin 0 -> 170 bytes .../output_pro/outputpro/cmyk.py | 115 ++ .../output_pro/outputpro/cutmarks.py | 82 ++ .../output_pro/outputpro/preview_mask.png | Bin 0 -> 2029 bytes .../output_pro/outputpro/top.png | Bin 0 -> 70828 bytes 8 files changed, 1247 insertions(+) create mode 100644 extensions/fablabchemnitz/output_pro/outputpro.inx create mode 100644 extensions/fablabchemnitz/output_pro/outputpro.py create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/__init__.py create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/alpha.png create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/cmyk.py create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/cutmarks.py create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/preview_mask.png create mode 100644 extensions/fablabchemnitz/output_pro/outputpro/top.png diff --git a/extensions/fablabchemnitz/output_pro/outputpro.inx b/extensions/fablabchemnitz/output_pro/outputpro.inx new file mode 100644 index 00000000..a75e515e --- /dev/null +++ b/extensions/fablabchemnitz/output_pro/outputpro.inx @@ -0,0 +1,16 @@ + + + Inkscape Output Pro + fablabchemnitz.de.output_pro + + all + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/output_pro/outputpro.py b/extensions/fablabchemnitz/output_pro/outputpro.py new file mode 100644 index 00000000..16a2ce08 --- /dev/null +++ b/extensions/fablabchemnitz/output_pro/outputpro.py @@ -0,0 +1,1034 @@ +#!/usr/bin/env python3 + +import inkex, re, os, random, sys, subprocess, shutil + +from outputpro import cmyk, cutmarks + +from PyQt5 import QtGui, QtCore, uic, QtWidgets +from PyQt5.QtWidgets import QMainWindow, QApplication +from PyQt5.QtCore import * + +import gettext +_ = gettext.gettext + +#reload(sys) +#sys.setdefaultencoding("utf-8") + +dirpathTempFolder = '/tmp/output-' +for i in range(5): + dirpathTempFolder += str(random.randint(0,9)) +os.mkdir(dirpathTempFolder) + +null_dir = " > /dev/null" + +dirpathSoftware = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'outputpro') + +with open(os.getenv("HOME") + '/.config/inkscape/preferences.xml', 'r') as f: + inkscape_config = f.read() + +list_of_export_formats = ['JPEG'] +list_of_format_tips = {'JPEG':'The JPEG format always has some loss of quality. Although it supports CMYK, it is not recommended for use in printed graphics.'} +list_of_color_modes_jpeg = ['CMYK','RGB','Gray','CMY','HSB','HSL','HWB','Lab','Log', 'OHTA','Rec601Luma','Rec601YCbCr','Rec709Luma','Rec709YCbCr','sRGB','XYZ','YCbCr','YCC','YIQ','YPbPr','YUV'] +list_of_interlacing_jpeg = {u'None':'none', u'Line':'line', u'Plane':'plane', u'Partition':'partition'} +list_of_noise_jpeg = {u'Gaussian':'Gaussian-noise', u'Impulse':'Impulse-noise', u'Laplacian':'Laplacian-noise', u'Multiplicative':'Multiplicative-noise', u'Poisson':'Poisson-noise', u'Uniform':'Uniform-noise'} +list_of_subsampling_jpeg = ['1x1, 1x1, 1x1', '2x1, 1x1, 1x1', '1x2, 1x1, 1x1', '2x2, 1x1, 1x1'] +list_of_dct_jpeg = {u'Integer':'int', u'Integer (fast)':'fast', u'Floating point':'float'} +list_of_area_to_export = [_(u"Page"), _(u"Drawing"), _(u"Object")]#, _(u"Área definida")] +list_of_profiles = os.listdir('/usr/share/color/icc/') +uuconv = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'pc':15.0} + +selected_screen_profile = inkscape_config.split('id="displayprofile"')[1].split('uri="')[1].split('" />')[0].split('/')[-1] +selected_print_profile = inkscape_config.split('id="softproof"')[1].split('uri="')[1].split('" />')[0].split('/')[-1] + +rgb_profile = '"' + inkscape_config.split('id="displayprofile"')[1].split('uri="')[1].split('" />')[0] + '"' +#cmyk_profile = '"' + inkscape_config.split('id="softproof"')[1].split('uri="')[1].split('" />')[0] + '"' + +def unittouu(string): + '''Returns userunits given a string representation of units in another system''' + unit = re.compile('(%s)$' % '|'.join(uuconv.keys())) + param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)') + + p = param.match(string) + u = unit.search(string) + if p: + retval = float(p.string[p.start():p.end()]) + else: + retval = 0.0 + if u: + try: + return retval * uuconv[u.string[u.start():u.end()]] + except KeyError: + pass + return retval + +class OutputProBitmap(inkex.EffectExtension): + + def add_arguments(self, pars): + pars.add_argument("--title") + #pars.add_argument("-n", "--noffset",type=float, default=0.0, help="normal offset") + #pars.add_argument("-t", "--toffset", type=float, default=0.0, help="tangential offset") + #pars.add_argument("-k", "--kind", default=True, help="choose between wave or snake effect") + #pars.add_argument("-c", "--copymode", default=True, help="repeat the path to fit deformer's length") + #pars.add_argument("-p", "--space", type=float, default=0.0) + #pars.add_argument("-v", "--vertical", type=inkex.Boolean, default=False, help="reference path is vertical") + #pars.add_argument("-d", "--duplicate", type=inkex.Boolean, default=False, help="duplicate pattern before deformation") + + def effect(self): + list_of_selected_objects = [] + for id, node in self.svg.selected.items(): + list_of_selected_objects.append(node.get('id')) + if len(list_of_selected_objects) >= 1: + selected_object = list_of_selected_objects[0] + else: + selected_object = 'layer1' + + resolution = '90' + + with open(self.options.input_file, 'r') as f: + self.code = f.read() + + with open(dirpathTempFolder + "/original.svg", 'w') as f: + self.code = f.write(self.code) + + svg = self.document.getroot() + page_width = unittouu(svg.get('width')) + page_height = unittouu(svg.attrib['height']) + + class mainWindow(QtWidgets.QWidget): + def __init__(self, parent=None): + QtWidgets.QWidget.__init__(self, parent) + self.resize(950, 600) + self.setMaximumSize(QtCore.QSize(950, 600)) + self.setMinimumSize(QtCore.QSize(950, 600)) + self.setWindowTitle(_(u'Inkscape Output Pro Bitmap')) + self.setWindowIcon(QtGui.QIcon('/usr/share/pixmaps/inkscape-outputpro.png')) + self.move(int((QtWidgets.QDesktopWidget().screenGeometry().width()-self.geometry().width())/2), int((QtWidgets.QDesktopWidget().screenGeometry().height()-self.geometry().height())/2)) + + self.preview_zoom = 1.0 + + self.top_title_bitmap = QtWidgets.QLabel(parent=self) + self.top_title_bitmap.setGeometry(0, 0, 950, 60) + self.top_title_bitmap.setPixmap(QtGui.QPixmap(os.path.join(dirpathSoftware, 'top.png'))) + + self.preview_panel = QtWidgets.QWidget(parent=self) + self.preview_panel.setGeometry(0, 0, 320, 600) + + self.preview_bitmap = QtWidgets.QLabel(parent=self.preview_panel) + self.preview_bitmap.setGeometry(10, 70, 300, 300) + self.preview_bitmap.setPixmap(QtGui.QPixmap(os.path.join(dirpathTempFolder, 'preview.png'))) + #self.preview_bitmap.setStyleSheet("QWidget { background: url(alpha.png)}") + #self.preview_bitmap.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignCenter) + + self.preview_original_title = QtWidgets.QLabel(parent=self.preview_panel) + self.preview_original_title.setText(_(u"Original").upper()) + self.preview_original_title.setGeometry(255, 355, 50, 10) + self.preview_original_title.setAlignment(QtCore.Qt.AlignCenter) + self.preview_original_title.setStyleSheet('QFrame{font:6pt;border-radius: 2px;padding: 2px;background-color:rgba(0,0,0,128);color:white}') + + self.preview_result_title = QtWidgets.QLabel(parent=self.preview_panel) + self.preview_result_title.setText(_(u"Result").upper()) + self.preview_result_title.setGeometry(15, 75, 50, 10) + self.preview_result_title.setAlignment(QtCore.Qt.AlignCenter) + self.preview_result_title.setStyleSheet('QFrame{font:6pt;border-radius: 2px;padding: 2px;background-color:rgba(0,0,0,128);color:white}') + + self.zoom_out_button = QtWidgets.QPushButton(QtGui.QIcon.fromTheme("zoom-out"), '', parent=self.preview_panel) + self.zoom_out_button.setGeometry(10, 371, 16, 16) + self.zoom_out_button.setIconSize(QtCore.QSize(12,12)) + self.zoom_out_button.setFlat(True) + self.zoom_out_button.clicked.connect(self.zoom_out) + + self.zoom_in_button = QtWidgets.QPushButton(QtGui.QIcon.fromTheme("zoom-in"), '', parent=self.preview_panel) + self.zoom_in_button.setGeometry(26, 371, 16, 16) + self.zoom_in_button.setIconSize(QtCore.QSize(12,12)) + self.zoom_in_button.setFlat(True) + self.zoom_in_button.clicked.connect(self.zoom_in) + + self.preview_zoom_title = QtWidgets.QLabel(parent=self.preview_panel) + self.preview_zoom_title.setGeometry(44, 371, 256, 16) + self.preview_zoom_title.setText('100%') + self.preview_zoom_title.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft) + self.preview_zoom_title.setFont(QtGui.QFont('Ubuntu', 8)) + #self.preview_result_title.setStyleSheet('QFrame{font:7pt;border-radius: 2px;padding: 2px;background-color:rgba(0,0,0,128);color:white}') + + self.view_c_button = QtWidgets.QPushButton('C', parent=self.preview_panel) + self.view_c_button.setGeometry(246, 371, 16, 16) + self.view_c_button.setIconSize(QtCore.QSize(12,12)) + self.view_c_button.setFlat(True) + self.view_c_button.setCheckable(True) + self.view_c_button.setChecked(True) + self.view_c_button.setVisible(False) + self.view_c_button.clicked.connect(self.cmyk_advanced_manipulation_view_separations) + + self.view_m_button = QtWidgets.QPushButton('M', parent=self.preview_panel) + self.view_m_button.setGeometry(262, 371, 16, 16) + self.view_m_button.setIconSize(QtCore.QSize(12,12)) + self.view_m_button.setFlat(True) + self.view_m_button.setCheckable(True) + self.view_m_button.setChecked(True) + self.view_m_button.setVisible(False) + self.view_m_button.clicked.connect(self.cmyk_advanced_manipulation_view_separations) + + self.view_y_button = QtWidgets.QPushButton('Y', parent=self.preview_panel) + self.view_y_button.setGeometry(278, 371, 16, 16) + self.view_y_button.setIconSize(QtCore.QSize(12,12)) + self.view_y_button.setFlat(True) + self.view_y_button.setCheckable(True) + self.view_y_button.setChecked(True) + self.view_y_button.setVisible(False) + self.view_y_button.clicked.connect(self.cmyk_advanced_manipulation_view_separations) + + self.view_k_button = QtWidgets.QPushButton('K', parent=self.preview_panel) + self.view_k_button.setGeometry(294, 371, 16, 16) + self.view_k_button.setIconSize(QtCore.QSize(12,12)) + self.view_k_button.setFlat(True) + self.view_k_button.setCheckable(True) + self.view_k_button.setChecked(True) + self.view_k_button.setVisible(False) + self.view_k_button.clicked.connect(self.cmyk_advanced_manipulation_view_separations) + + self.view_image_info = QtWidgets.QLabel(parent=self.preview_panel) + self.view_image_info.setGeometry(10, 400, 300, 190) + self.view_image_info.setFont(QtGui.QFont('Ubuntu', 8)) + self.view_image_info.setWordWrap(True) + self.view_image_info.setAlignment(QtCore.Qt.AlignTop) + + #self.main_title = QtWidgets.QLabel(parent=self) + #self.main_title.setText(_(u"BITMAPS").upper()) + #self.main_title.setGeometry(640, 30, 150, 30) + #self.main_title.setFont(QtWidgets.QFont('Ubuntu', 16, 75)) + #self.main_title.setAlignment(QtCore.Qt.AlignRight) + #self.main_title.setForegroundRole(QtWidgets.QPalette.ColorRole(2)) + + self.format_title = QtWidgets.QLabel(parent=self) + self.format_title.setText(_(u"Format").upper()) + self.format_title.setGeometry(320, 70, 200, 15) + self.format_title.setFont(QtGui.QFont('Ubuntu', 8, 75)) + + self.format_choice = QtWidgets.QComboBox(parent=self) + self.format_choice.setGeometry(320, 85, 200, 25) + self.format_choice.addItems(list_of_export_formats) + self.format_choice.activated.connect(self.change_format) + + self.format_preview_check = QtWidgets.QCheckBox(parent=self) + self.format_preview_check.setGeometry(540, 85, 200, 25) + self.format_preview_check.setText(_(u"Preview")) + self.format_preview_check.setChecked(True) + self.format_preview_check.clicked.connect(self.format_preview_change) + + self.option_box = QtWidgets.QTabWidget(parent=self) + self.option_box.setGeometry(320, 120, 620, 435) + + self.general_options_panel = QtWidgets.QWidget(parent=self) + self.general_geometry_panel = QtWidgets.QWidget(parent=self) + self.general_prepress_panel = QtWidgets.QWidget(parent=self) + self.general_imposition_panel = QtWidgets.QWidget(parent=self) + self.option_box.addTab(self.general_options_panel, _(u"Options")) + self.option_box.addTab(self.general_geometry_panel, _(u"Size")) + self.option_box.addTab(self.general_prepress_panel, _(u"Prepress")) + self.option_box.addTab(self.general_imposition_panel, _(u"Imposition")) + + self.option_box.currentChanged.connect(self.generate_preview) + + self.general_options_panel_jpeg = QtWidgets.QWidget(parent=self.general_options_panel) + self.general_options_panel_jpeg.setVisible(False) + + self.color_mode_title_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.color_mode_title_jpeg.setText(_(u"Color mode").upper()) + self.color_mode_title_jpeg.setGeometry(10, 10, 260, 15) + self.color_mode_title_jpeg.setFont(QtGui.QFont('Ubuntu', 8)) + + self.color_mode_choice_jpeg = QtWidgets.QComboBox(parent=self.general_options_panel_jpeg) + self.color_mode_choice_jpeg.setGeometry(10, 25, 260, 25) + self.color_mode_choice_jpeg.addItems(list_of_color_modes_jpeg) + self.color_mode_choice_jpeg.activated.connect(self.change_color_mode_jpeg) + + self.color_mode_title_tip_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.color_mode_title_tip_jpeg.setGeometry(10, 50, 260, 15) + self.color_mode_title_tip_jpeg.setFont(QtGui.QFont('Ubuntu', 7)) + #self.color_mode_title_tip.setAlignment(QtCore.Qt.AlignLeft) + + self.quality_title_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.quality_title_jpeg.setText(_(u"Quality").upper()) + self.quality_title_jpeg.setGeometry(285, 10, 100, 15) + self.quality_title_jpeg.setFont(QtGui.QFont('Ubuntu', 8)) + + self.quality_percent_title_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.quality_percent_title_jpeg.setText('50%') + self.quality_percent_title_jpeg.setGeometry(505, 10, 100, 40) + self.quality_percent_title_jpeg.setFont(QtGui.QFont('Ubuntu', 12, 75)) + self.quality_percent_title_jpeg.setAlignment(QtCore.Qt.AlignRight) + + self.quality_percent_title_left_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.quality_percent_title_left_jpeg.setText('Lower quality\nSmaller file') + self.quality_percent_title_left_jpeg.setGeometry(285, 40, 160, 25) + self.quality_percent_title_left_jpeg.setFont(QtGui.QFont('Ubuntu', 7)) + self.quality_percent_title_left_jpeg.setAlignment(QtCore.Qt.AlignLeft) + + self.quality_percent_title_right_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.quality_percent_title_right_jpeg.setText('Higher quality
Larger file') + self.quality_percent_title_right_jpeg.setGeometry(445, 40, 160, 25) + self.quality_percent_title_right_jpeg.setFont(QtGui.QFont('Ubuntu', 7)) + self.quality_percent_title_right_jpeg.setAlignment(QtCore.Qt.AlignRight) + + self.quality_choice_dial_jpeg = QtWidgets.QDial(parent=self.general_options_panel_jpeg) + self.quality_choice_dial_jpeg.setRange(1,100) + self.quality_choice_dial_jpeg.setGeometry(415, 10, 60, 60) + self.quality_choice_dial_jpeg.setNotchesVisible(True) + self.quality_choice_dial_jpeg.setValue(50) + self.quality_choice_dial_jpeg.sliderReleased.connect(self.generate_preview) + self.quality_choice_dial_jpeg.valueChanged.connect(self.change_quality_live_jpeg) + + self.color_profile_choice_jpeg = QtWidgets.QCheckBox(_(u"Use Inkscape color profile"), parent=self.general_options_panel_jpeg) + self.color_profile_choice_jpeg.setChecked(False) + self.color_profile_choice_jpeg.setGeometry(283, 150, 325, 25) + self.color_profile_choice_jpeg.clicked.connect(self.generate_preview) + + self.document_color_profile_title_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.document_color_profile_title_jpeg.setGeometry(290, 175, 320, 30) + self.document_color_profile_title_jpeg.setWordWrap(True) + self.document_color_profile_title_jpeg.setFont(QtGui.QFont('Ubuntu', 7)) + self.document_color_profile_title_jpeg.setAlignment(QtCore.Qt.AlignLeft) + + if selected_print_profile == '': + self.document_color_profile_title_jpeg.setEnabled(False) + self.color_profile_choice_jpeg.setEnabled(False) + self.document_color_profile_title_jpeg.setText(_(u"This document is not using a color profile.")) + else: + self.document_color_profile_title_jpeg.setText(_(u"The profile used by Inkscape is") + ' ' + selected_print_profile[:-4]) + + self.jpeg_interlace_option_jpeg = QtWidgets.QCheckBox(_(u"Interlace"), parent=self.general_options_panel_jpeg) + self.jpeg_interlace_option_jpeg.setGeometry(10, 80, 120, 25) + self.jpeg_interlace_option_jpeg.toggled.connect(self.jpeg_interlace_click_jpeg) + + self.jpeg_interlace_choice_jpeg = QtWidgets.QComboBox(parent=self.general_options_panel_jpeg) + self.jpeg_interlace_choice_jpeg.setGeometry(130, 80, 140, 25) + self.jpeg_interlace_choice_jpeg.addItems(list_of_interlacing_jpeg.keys()) + self.jpeg_interlace_choice_jpeg.setCurrentIndex(1) + self.jpeg_interlace_choice_jpeg.setEnabled(False) + self.jpeg_interlace_choice_jpeg.activated.connect(self.generate_preview) + + self.jpeg_optimize_option_jpeg = QtWidgets.QCheckBox(_(u"Optimize"), parent=self.general_options_panel_jpeg) + self.jpeg_optimize_option_jpeg.setGeometry(10, 115, 260, 25) + self.jpeg_optimize_option_jpeg.setChecked(True) + + self.jpeg_noise_option_jpeg = QtWidgets.QCheckBox(_(u"Noise"), parent=self.general_options_panel_jpeg) + self.jpeg_noise_option_jpeg.setGeometry(10, 150, 120, 25) + self.jpeg_noise_option_jpeg.toggled.connect(self.jpeg_noise_click_jpeg) + + self.jpeg_noise_choice_jpeg = QtWidgets.QComboBox(parent=self.general_options_panel_jpeg) + self.jpeg_noise_choice_jpeg.setGeometry(130, 150, 140, 25) + self.jpeg_noise_choice_jpeg.addItems(list_of_noise_jpeg.keys()) + self.jpeg_noise_choice_jpeg.setCurrentIndex(1) + self.jpeg_noise_choice_jpeg.setEnabled(False) + self.jpeg_noise_choice_jpeg.activated.connect(self.generate_preview) + + self.jpeg_noise_ammount_jpeg = QtWidgets.QSlider(QtCore.Qt.Horizontal, parent=self.general_options_panel_jpeg) + self.jpeg_noise_ammount_jpeg.setGeometry(15, 175, 260, 25) + self.jpeg_noise_ammount_jpeg.setRange(0,100) + self.jpeg_noise_ammount_jpeg.setEnabled(False) + self.jpeg_noise_ammount_jpeg.setValue(0) + self.jpeg_noise_ammount_jpeg.sliderReleased.connect(self.generate_preview) + + self.jpeg_subsampling_option_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.jpeg_subsampling_option_jpeg.setText(_(u"Sub-sampling")) + self.jpeg_subsampling_option_jpeg.setGeometry(10, 210, 140, 25) + + self.jpeg_subsampling_choice_jpeg = QtWidgets.QComboBox(parent=self.general_options_panel_jpeg) + self.jpeg_subsampling_choice_jpeg.setGeometry(150, 210, 120, 25) + self.jpeg_subsampling_choice_jpeg.addItems(list_of_subsampling_jpeg) + self.jpeg_subsampling_choice_jpeg.setCurrentIndex(0) + self.jpeg_subsampling_choice_jpeg.activated.connect(self.generate_preview) + + self.jpeg_dct_option_jpeg = QtWidgets.QLabel(parent=self.general_options_panel_jpeg) + self.jpeg_dct_option_jpeg.setText(_(u"DCT Method")) + self.jpeg_dct_option_jpeg.setGeometry(10, 245, 120, 25) + + self.jpeg_dct_choice_jpeg = QtWidgets.QComboBox(parent=self.general_options_panel_jpeg) + self.jpeg_dct_choice_jpeg.setGeometry(130, 245, 140, 25) + self.jpeg_dct_choice_jpeg.addItems(list_of_dct_jpeg.keys()) + self.jpeg_dct_choice_jpeg.activated.connect(self.generate_preview) + + self.cmyk_advanced_manipulation_option_jpeg = QtWidgets.QCheckBox(_(u"Accurate color handling"), parent=self.general_options_panel_jpeg) + self.cmyk_advanced_manipulation_option_jpeg.setGeometry(283, 80, 325, 25) + self.cmyk_advanced_manipulation_option_jpeg.clicked.connect(self.cmyk_advanced_manipulation_click_jpeg) + + self.cmyk_overblack_jpeg = QtWidgets.QCheckBox(_(u"Black overlay"), parent=self.general_options_panel_jpeg) + self.cmyk_overblack_jpeg.setGeometry(283, 115, 325, 25) + self.cmyk_overblack_jpeg.setEnabled(False) + self.cmyk_overblack_jpeg.clicked.connect(self.cmyk_advanced_manipulation_click_jpeg) + + self.area_to_export_title = QtWidgets.QLabel(parent=self.general_geometry_panel) + self.area_to_export_title.setText(_(u"Area to export").upper()) + self.area_to_export_title.setGeometry(10, 20, 250, 15) + self.area_to_export_title.setFont(QtGui.QFont('Ubuntu', 8)) + + self.area_to_export_choice = QtWidgets.QComboBox(parent=self.general_geometry_panel) + self.area_to_export_choice.setGeometry(10, 35, 250, 25) + self.area_to_export_choice.addItems(list_of_area_to_export) + self.area_to_export_choice.activated.connect(self.change_area_to_export) + + self.dpi_title = QtWidgets.QLabel(parent=self.general_geometry_panel) + self.dpi_title.setText(_(u"Dots per inch").upper()) + self.dpi_title.setGeometry(270, 20, 200, 15) + self.dpi_title.setFont(QtGui.QFont('Ubuntu', 8)) + + self.dpi_choice = QtWidgets.QSpinBox(parent=self.general_geometry_panel) + self.dpi_choice.setValue(90) + self.dpi_choice.setGeometry(270, 35, 100, 25) + self.dpi_choice.setRange(1, 99999) + self.dpi_choice.editingFinished.connect(self.change_area_to_export) + + self.dpi_text_title = QtWidgets.QLabel(parent=self.general_geometry_panel) + self.dpi_text_title.setText('dpi') + self.dpi_text_title.setGeometry(380, 35, 80, 25) + self.dpi_text_title.setFont(QtGui.QFont('Ubuntu', 8)) + + self.x0_value = QtWidgets.QSpinBox(parent=self.general_geometry_panel) + self.x0_value.setGeometry(10, 100, 80, 25) + self.x0_value.setRange(1, 2147483647) + self.x0_value.editingFinished.connect(self.change_area_to_export) + + self.y0_value = QtWidgets.QSpinBox(parent=self.general_geometry_panel) + self.y0_value.setGeometry(100, 130, 80, 25) + self.y0_value.setRange(1, 2147483647) + self.y0_value.editingFinished.connect(self.change_area_to_export) + + self.x1_value = QtWidgets.QSpinBox(parent=self.general_geometry_panel) + self.x1_value.setGeometry(100, 70, 80, 25) + self.x1_value.setRange(1, 2147483647) + self.x1_value.editingFinished.connect(self.change_area_to_export) + + self.y1_value = QtWidgets.QSpinBox(parent=self.general_geometry_panel) + self.y1_value.setGeometry(190, 100, 80, 25) + self.y1_value.setRange(1, 2147483647) + self.y1_value.editingFinished.connect(self.change_area_to_export) + + self.area_to_export_id_title = QtWidgets.QLabel(parent=self.general_geometry_panel) + self.area_to_export_id_title.setText(_(u"Object to be exported").upper()) + self.area_to_export_id_title.setGeometry(10, 70, 300, 15) + self.area_to_export_id_title.setFont(QtGui.QFont('Ubuntu', 8)) + + self.area_to_export_id_name = QtWidgets.QLineEdit(parent=self.general_geometry_panel) + self.area_to_export_id_name.setGeometry(10, 85, 300, 25) + + self.area_to_export_idonly_check = QtWidgets.QCheckBox(parent=self.general_geometry_panel) + self.area_to_export_idonly_check.setGeometry(10, 120, 400, 25) + self.area_to_export_idonly_check.setText(_(u"Export only object")) + + self.prepress_paper_settings_label = QtWidgets.QLabel(parent=self.general_prepress_panel) + self.prepress_paper_settings_label.setGeometry(10, 10, 300, 15) + self.prepress_paper_settings_label.setText(_(u"Paper or film setting").upper()) + self.prepress_paper_settings_label.setFont(QtGui.QFont('Ubuntu', 8)) + + self.prepress_paper_settings_invert = QtWidgets.QCheckBox(parent=self.general_prepress_panel) + self.prepress_paper_settings_invert.setGeometry(10, 25, 300, 25) + self.prepress_paper_settings_invert.setText(_(u"Invert")) + self.prepress_paper_settings_invert.setChecked(False) + self.prepress_paper_settings_invert.clicked.connect(self.generate_preview) + + self.prepress_paper_settings_mirror = QtWidgets.QCheckBox(parent=self.general_prepress_panel) + self.prepress_paper_settings_mirror.setGeometry(10, 50, 300, 25) + self.prepress_paper_settings_mirror.setText(_(u"Mirror")) + self.prepress_paper_settings_mirror.setChecked(False) + self.prepress_paper_settings_mirror.clicked.connect(self.generate_preview) + + self.prepress_paper_cutmarks_label = QtWidgets.QLabel(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_label.setGeometry(10, 85, 300, 15) + self.prepress_paper_cutmarks_label.setText(_(u"Crop marks").upper()) + self.prepress_paper_cutmarks_label.setFont(QtGui.QFont('Ubuntu', 8)) + + self.prepress_paper_cutmarks_check = QtWidgets.QCheckBox(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_check.setGeometry(10, 100, 300, 25) + self.prepress_paper_cutmarks_check.setText(_(u"Insert crop marks")) + self.prepress_paper_cutmarks_check.setChecked(False) + self.prepress_paper_cutmarks_check.clicked.connect(self.cut_marks_insert_change) + + self.prepress_paper_cutmarks_strokewidth_label = QtWidgets.QLabel(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_strokewidth_label.setGeometry(10, 125, 200, 25) + self.prepress_paper_cutmarks_strokewidth_label.setText(_(u"Mark thickness:")) + self.prepress_paper_cutmarks_strokewidth_label.setEnabled(False) + + self.prepress_paper_cutmarks_strokewidth_value = QtWidgets.QLineEdit(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_strokewidth_value.setGeometry(210, 125, 50, 25) + self.prepress_paper_cutmarks_strokewidth_value.setText('1') + self.prepress_paper_cutmarks_strokewidth_value.setEnabled(False) + self.prepress_paper_cutmarks_strokewidth_value.editingFinished.connect(self.generate_preview) + + self.prepress_paper_cutmarks_strokewidth_choice = QtWidgets.QComboBox(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_strokewidth_choice.setGeometry(260,125,50,25) + self.prepress_paper_cutmarks_strokewidth_choice.addItems(uuconv.keys()) + self.prepress_paper_cutmarks_strokewidth_choice.setCurrentIndex(5) + self.prepress_paper_cutmarks_strokewidth_choice.activated.connect(self.generate_preview) + self.prepress_paper_cutmarks_strokewidth_choice.setEnabled(False) + + self.prepress_paper_cutmarks_bleedsize_label = QtWidgets.QLabel(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_bleedsize_label.setGeometry(10, 150, 200, 25) + self.prepress_paper_cutmarks_bleedsize_label.setText(_(u"Bleed:")) + self.prepress_paper_cutmarks_bleedsize_label.setEnabled(False) + + self.prepress_paper_cutmarks_bleedsize_value = QtWidgets.QLineEdit(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_bleedsize_value.setGeometry(210, 150, 50, 25) + self.prepress_paper_cutmarks_bleedsize_value.setText('5') + self.prepress_paper_cutmarks_bleedsize_value.setEnabled(False) + self.prepress_paper_cutmarks_bleedsize_value.editingFinished.connect(self.generate_preview) + + self.prepress_paper_cutmarks_bleedsize_choice = QtWidgets.QComboBox(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_bleedsize_choice.setGeometry(260,150,50,25) + self.prepress_paper_cutmarks_bleedsize_choice.addItems(uuconv.keys()) + self.prepress_paper_cutmarks_bleedsize_choice.setCurrentIndex(5) + self.prepress_paper_cutmarks_bleedsize_choice.activated.connect(self.generate_preview) + self.prepress_paper_cutmarks_bleedsize_choice.setEnabled(False) + + self.prepress_paper_cutmarks_marksize_label = QtWidgets.QLabel(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_marksize_label.setGeometry(10, 175, 200, 25) + self.prepress_paper_cutmarks_marksize_label.setText(_(u"Mark size:")) + self.prepress_paper_cutmarks_marksize_label.setEnabled(False) + + self.prepress_paper_cutmarks_marksize_value = QtWidgets.QLineEdit(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_marksize_value.setGeometry(210, 175, 50, 25) + self.prepress_paper_cutmarks_marksize_value.setText('5') + self.prepress_paper_cutmarks_marksize_value.setEnabled(False) + self.prepress_paper_cutmarks_marksize_value.editingFinished.connect(self.generate_preview) + + self.prepress_paper_cutmarks_marksize_choice = QtWidgets.QComboBox(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_marksize_choice.setGeometry(260,175,50,25) + self.prepress_paper_cutmarks_marksize_choice.addItems(uuconv.keys()) + self.prepress_paper_cutmarks_marksize_choice.setCurrentIndex(5) + self.prepress_paper_cutmarks_marksize_choice.activated.connect(self.generate_preview) + self.prepress_paper_cutmarks_marksize_choice.setEnabled(False) + + self.prepress_paper_cutmarks_inside_check = QtWidgets.QCheckBox(parent=self.general_prepress_panel) + self.prepress_paper_cutmarks_inside_check.setGeometry(10, 200, 300, 25) + self.prepress_paper_cutmarks_inside_check.setText(_(u"No internal marks")) + self.prepress_paper_cutmarks_inside_check.setChecked(False) + self.prepress_paper_cutmarks_inside_check.setEnabled(False) + self.prepress_paper_cutmarks_inside_check.clicked.connect(self.generate_preview) + + self.imposition_label = QtWidgets.QLabel(parent=self.general_imposition_panel) + self.imposition_label.setGeometry(10, 10, 300, 15) + self.imposition_label.setText(_(u"Amount of impositions").upper()) + self.imposition_label.setFont(QtGui.QFont('Ubuntu', 8)) + + self.imposition_vertical_number_label = QtWidgets.QLabel(parent=self.general_imposition_panel) + self.imposition_vertical_number_label.setGeometry(10, 25, 200, 25) + self.imposition_vertical_number_label.setText(_(u"Lines:")) + + self.imposition_vertical_number_value = QtWidgets.QSpinBox(parent=self.general_imposition_panel) + self.imposition_vertical_number_value.setGeometry(210, 25, 50, 25) + self.imposition_vertical_number_value.setValue(1) + self.imposition_vertical_number_value.setRange(1, 999) + self.imposition_vertical_number_value.editingFinished.connect(self.generate_preview) + + self.imposition_horizontal_number_label = QtWidgets.QLabel(parent=self.general_imposition_panel) + self.imposition_horizontal_number_label.setGeometry(10, 60, 200, 25) + self.imposition_horizontal_number_label.setText(_(u"Columns:")) + + self.imposition_horizontal_number_value = QtWidgets.QSpinBox(parent=self.general_imposition_panel) + self.imposition_horizontal_number_value.setGeometry(210, 60, 50, 25) + self.imposition_horizontal_number_value.setValue(1) + self.imposition_horizontal_number_value.setRange(1, 999) + self.imposition_horizontal_number_value.editingFinished.connect(self.generate_preview) + + self.imposition_space_label = QtWidgets.QLabel(parent=self.general_imposition_panel) + self.imposition_space_label.setGeometry(10, 90, 200, 25) + self.imposition_space_label.setText(_(u"Space between marks:")) + + self.imposition_space_value = QtWidgets.QLineEdit(parent=self.general_imposition_panel) + self.imposition_space_value.setGeometry(210, 90, 50, 25) + self.imposition_space_value.setText('5') + self.imposition_space_value.editingFinished.connect(self.generate_preview) + + self.imposition_space_choice = QtWidgets.QComboBox(parent=self.general_imposition_panel) + self.imposition_space_choice.setGeometry(260,90,50,25) + self.imposition_space_choice.addItems(uuconv.keys()) + self.imposition_space_choice.setCurrentIndex(5) + self.imposition_space_choice.activated.connect(self.generate_preview) + + self.export_button = QtWidgets.QPushButton(QtGui.QIcon.fromTheme("document-export"), _("Export"), parent=self) + self.export_button.setGeometry(740, 560, 200, 30) + self.export_button.setIconSize(QtCore.QSize(20,20)) + self.export_button.clicked.connect(self.export) + + self.change_area_to_export() + self.change_format() + + def generate_preview(self): + if self.format_preview_check.isChecked(): + self.generate_final_file() + + if self.option_box.currentIndex() == 0: + self.preview_original_title.setVisible(True) + self.preview_result_title.setVisible(True) + + final_command = ['convert'] + final_command.append(dirpathTempFolder + '/result-imp.' + list_of_export_formats[self.format_choice.currentIndex()].lower()) + + if self.color_profile_choice_jpeg.isChecked(): + final_command.append('-profile') + final_command.append('/usr/share/color/icc/' + selected_screen_profile) + + final_command.append(dirpathTempFolder + '/result.png') + + subprocess.Popen(final_command).wait() + + file_info = subprocess.Popen(['identify', dirpathTempFolder + '/source.png'], stdout=subprocess.PIPE).communicate()[0] + + image_width = int(file_info.split(' ')[2].split('x')[0]) + image_height = int(file_info.split(' ')[2].split('x')[1]) + + marksize = (self.dpi_choice.value() / 90) * unittouu(str(self.prepress_paper_cutmarks_marksize_value.text()) + str(self.prepress_paper_cutmarks_marksize_choice.currentText())) + imposition_space = (self.dpi_choice.value() / 90) * unittouu(str(self.imposition_space_value.text()) + str(self.imposition_space_choice.currentText())) + + file_info = subprocess.Popen(['identify', '-verbose',dirpathTempFolder + '/result-imp.' + list_of_export_formats[self.format_choice.currentIndex()].lower()], stdout=subprocess.PIPE).communicate()[0] + + file_info_final = '' + for line in file_info.split('\n'): + if ' Format: ' in line: + file_info_final += 'Image Format: ' + line.replace(' Format: ', '') + '
' + if ' Geometry: ' in line: + file_info_final += 'Width and height: ' + line.replace(' Geometry: ', '').split('+')[0] + '
' + if ' Resolution: ' in line: + file_info_final += 'Resolution: ' + line.replace(' Resolution: ', '') + if ' Units: ' in line: + file_info_final += ' ' + line.replace(' Units: ', '').replace('Per', ' per ').replace('Pixels', 'pixels').replace('Centimeter', 'centimeter').replace('Inch', 'inch') + '
' + if ' Colorspace: ' in line: + file_info_final += 'Colorspace: ' + line.replace(' Colorspace: ', '') + '
' + if ' Depth: ' in line: + file_info_final += 'Depth: ' + line.replace(' Depth: ', '') + '
' + if ' Quality: ' in line: + file_info_final += 'Quality: ' + line.replace(' Quality: ', '') + '%
' + if ' Filesize: ' in line: + file_info_final += 'Filesize: ' + line.replace(' Filesize: ', '') + '
' + if ' jpeg:sampling-factor: ' in line: + file_info_final += 'Sampling: ' + line.replace(' jpeg:sampling-factor: ', '') + '
' + + if self.prepress_paper_cutmarks_check.isChecked(): + margin = marksize + else: + margin = imposition_space + + if image_width < 300 or image_height < 300: + what_show = '-extent ' + str(int(300 * self.preview_zoom)) + 'x' + str(int(300 * self.preview_zoom)) + '-' + str(int(150 * self.preview_zoom) - int(image_width / 2)) + '-' + str(int(150 * self.preview_zoom) - int(image_height / 2)) + else: + what_show = '-crop ' + str(int(300 * self.preview_zoom)) + 'x' + str(int(300 * self.preview_zoom)) + '+' + str(int(image_width / 2) - int(150 * self.preview_zoom)) + '+' + str(int(image_height / 2) - int(150 * self.preview_zoom)) + + os.system('convert "' + dirpathTempFolder + '/source.png" ' + what_show + ' "' + dirpathTempFolder + '/original.png"' ) + + if image_width < 300 or image_height < 300: + what_show = '-extent ' + str(int(300 * self.preview_zoom)) + 'x' + str(int(300 * self.preview_zoom)) + '-' + str(int(150 * self.preview_zoom) - int(image_width / 2) - margin) + '-' + str(int(150 * self.preview_zoom) - int(image_height / 2) - margin) + else: + what_show = '-crop ' + str(int(300 * self.preview_zoom)) + 'x' + str(int(300 * self.preview_zoom)) + '+' + str(int(image_width / 2) - int(150 * self.preview_zoom) + margin) + '+' + str(int(image_height / 2) - int(150 * self.preview_zoom) + margin) + + os.system('convert "' + dirpathTempFolder + '/result.png" ' + what_show + ' "' + dirpathTempFolder + '/result.png"' ) + + if not self.preview_zoom == 1: + os.system('convert "' + dirpathTempFolder + '/original.png" -filter box -resize 300x300 "' + dirpathTempFolder + '/original.png"' ) + os.system('convert "' + dirpathTempFolder + '/result.png" -filter box -resize 300x300 "' + dirpathTempFolder + '/result.png"' ) + + os.system('convert "' + dirpathTempFolder + '/original.png" "' + dirpathTempFolder + '/result.png" "' + dirpathSoftware + '/preview_mask.png" -composite "' + dirpathTempFolder + '/preview.png"' ) + + self.view_image_info.setText(unicode(file_info_final + '
' + list_of_format_tips[list_of_export_formats[self.format_choice.currentIndex()]] + '', 'utf-8')) + + elif self.option_box.currentIndex() == 1: + self.preview_original_title.setVisible(False) + self.preview_result_title.setVisible(False) + + subprocess.Popen(['convert', dirpathTempFolder + '/result-imp.' + list_of_export_formats[self.format_choice.currentIndex()].lower(), '-resize', '300x300', os.path.join(dirpathTempFolder, 'preview.png')]).wait() + + elif self.option_box.currentIndex() == 2: + None + + elif self.option_box.currentIndex() == 3: + None + + self.preview_bitmap.setPixmap(QtGui.QPixmap(os.path.join(dirpathTempFolder, 'preview.png'))) + + def generate_final_file(self): + if list_of_export_formats[self.format_choice.currentIndex()] == 'JPEG': + jpeg_command = ['convert'] + + if not self.cmyk_advanced_manipulation_option_jpeg.isChecked(): + pre_command = ['convert'] + pre_command.append(dirpathTempFolder + '/source.tiff') + + if list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'CMYK' or list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'RGB': + if self.color_profile_choice_jpeg.isChecked(): + pre_command.append('-profile') + pre_command.append('/usr/share/color/icc/' + selected_screen_profile) + pre_command.append('-profile') + pre_command.append('/usr/share/color/icc/' + selected_print_profile) + + if list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'RGB': + pre_command.append(dirpathTempFolder + '/result.tiff') + subprocess.Popen(pre_command).wait() + del pre_command[:] + pre_command.append('convert') + pre_command.append(dirpathTempFolder + '/result.tiff') + pre_command.append('-profile') + pre_command.append('/usr/share/color/icc/' + selected_screen_profile) + + pre_command.append(dirpathTempFolder + '/result.tiff') + subprocess.Popen(pre_command).wait() + + else: + if self.color_profile_choice_jpeg.isChecked(): + pre_command = ['convert'] + pre_command.append(dirpathTempFolder + '/result.tiff') + pre_command.append('-profile') + pre_command.append('/usr/share/color/icc/' + selected_print_profile) + pre_command.append(dirpathTempFolder + '/result.tiff') + subprocess.Popen(pre_command).wait() + + file_info = subprocess.Popen(['identify', dirpathTempFolder + '/source.png'], stdout=subprocess.PIPE).communicate()[0] + + if self.prepress_paper_cutmarks_check.isChecked(): + bleedsize = (self.dpi_choice.value() / 90) * unittouu(str(self.prepress_paper_cutmarks_bleedsize_value.text()) + str(self.prepress_paper_cutmarks_bleedsize_choice.currentText())) + marksize = (self.dpi_choice.value() / 90) * unittouu(str(self.prepress_paper_cutmarks_marksize_value.text()) + str(self.prepress_paper_cutmarks_marksize_choice.currentText())) + else: + bleedsize = 0 + marksize = 0 + + imposition_space = (self.dpi_choice.value() / 90) *unittouu(str(self.imposition_space_value.text()) + str(self.imposition_space_choice.currentText())) + + image_width = [] + for i in range(self.imposition_vertical_number_value.value()): + image_width.append(int(file_info.split(' ')[2].split('x')[0])) + + image_height = [] + for i in range(self.imposition_horizontal_number_value.value()): + image_height.append(int(file_info.split(' ')[2].split('x')[1])) + + imposition_command = ['convert'] + imposition_command.append(dirpathTempFolder + '/result.tiff') + imposition_command.append('-extent') + imposition_command.append(str(sum(image_width) + (marksize*2) + (imposition_space * (len(image_width) -1))) + 'x' + str(sum(image_height) + (marksize*2) + (imposition_space * (len(image_height) -1))) + '-' + str(marksize) + '-' + str(marksize)) + imposition_command.append(dirpathTempFolder + '/result-imp.tiff') + subprocess.Popen(imposition_command).wait() + + last_width = 0 + last_height = 0 + last_marksize = marksize + for width in image_width: + for height in image_height: + if not (last_width == 0 and last_height == 0): + imposition_command = ['composite'] + imposition_command.append('-geometry') + imposition_command.append('+' + str(last_width + marksize) + '+' + str(last_height + marksize)) + imposition_command.append(dirpathTempFolder + '/result.tiff') + imposition_command.append(dirpathTempFolder + '/result-imp.tiff') + imposition_command.append(dirpathTempFolder + '/result-imp.tiff') + subprocess.Popen(imposition_command).wait() + + last_height += height + imposition_space + last_marksize = 0 + last_width += width + imposition_space + last_height = 0 + + if self.prepress_paper_cutmarks_check.isChecked(): + cutmarks.generate_final_file(False, self.prepress_paper_cutmarks_inside_check.isChecked(),list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()], image_width, image_height, imposition_space,unittouu(str(self.prepress_paper_cutmarks_strokewidth_value.text()) + str(self.prepress_paper_cutmarks_strokewidth_choice.currentText())), bleedsize, marksize, dirpathTempFolder) + + cut_marks_command = ['composite'] + cut_marks_command.append('-compose') + cut_marks_command.append('Multiply') + cut_marks_command.append('-gravity') + cut_marks_command.append('center') + cut_marks_command.append(dirpathTempFolder + '/cut_mark.tiff') + cut_marks_command.append(dirpathTempFolder + '/result-imp.tiff') + cut_marks_command.append(dirpathTempFolder + '/result-imp.tiff') + subprocess.Popen(cut_marks_command).wait() + + jpeg_command.append(dirpathTempFolder + '/result-imp.tiff') + + if self.prepress_paper_settings_invert.isChecked(): + jpeg_command.append('-negate') + + if self.prepress_paper_settings_mirror.isChecked(): + jpeg_command.append('-flop') + + jpeg_command.append('-quality') + jpeg_command.append(str(self.quality_choice_dial_jpeg.value())) + + jpeg_command.append('-colorspace') + jpeg_command.append(list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()]) + + if self.jpeg_interlace_option_jpeg.isChecked(): + jpeg_command.append('-interlace') + jpeg_command.append(list_of_interlacing_jpeg[unicode(self.jpeg_interlace_choice_jpeg.currentText(), 'utf-8')]) + + if self.jpeg_optimize_option_jpeg.isChecked(): + jpeg_command.append('-type') + jpeg_command.append('optimize') + + if self.jpeg_noise_option_jpeg.isChecked(): + jpeg_command.append('-evaluate') + jpeg_command.append(list_of_noise_jpeg[unicode(self.jpeg_noise_choice_jpeg.currentText(), 'utf-8')]) + jpeg_command.append(str(self.jpeg_noise_ammount_jpeg.value())) + + jpeg_command.append('-sampling-factor') + jpeg_command.append(self.jpeg_subsampling_choice_jpeg.currentText()) + + jpeg_command.append('-define') + jpeg_command.append('jpeg:dct-method=' + list_of_dct_jpeg[unicode(self.jpeg_dct_choice_jpeg.currentText(), 'utf-8')]) + + jpeg_command.append(dirpathTempFolder + '/result-imp.jpeg') + + subprocess.Popen(jpeg_command).wait() + + def change_format(self): + self.general_options_panel_jpeg.setVisible(False) + + if list_of_export_formats[self.format_choice.currentIndex()] == 'JPEG': + self.general_options_panel_jpeg.setVisible(True) + + self.generate_preview() + + def change_color_mode_jpeg(self): + if list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'CMYK': + self.color_mode_title_tip_jpeg.setText(u'Recommended for graphic printing') + self.cmyk_advanced_manipulation_option_jpeg.setChecked(False) + self.cmyk_advanced_manipulation_option_jpeg.setEnabled(True) + self.cmyk_overblack_jpeg.setEnabled(False) + self.cmyk_overblack_jpeg.setChecked(False) + self.color_profile_choice_jpeg.setEnabled(True) + self.color_profile_choice_jpeg.setChecked(False) + self.document_color_profile_title_jpeg.setEnabled(True) + self.general_prepress_panel.setEnabled(True) + else: + self.cmyk_advanced_manipulation_option_jpeg.setEnabled(False) + self.cmyk_overblack_jpeg.setEnabled(False) + self.cmyk_overblack_jpeg.setChecked(False) + #self.color_profile_choice_jpeg.setEnabled(False) + self.color_profile_choice_jpeg.setChecked(False) + self.document_color_profile_title_jpeg.setEnabled(False) + self.general_prepress_panel.setEnabled(False) + if list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'CMY': + self.color_mode_title_tip_jpeg.setText(u'Recommended for specific print cases') + elif list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'RGB': + self.color_mode_title_tip_jpeg.setText(u'Recommended for use on screens') + elif list_of_color_modes_jpeg[self.color_mode_choice_jpeg.currentIndex()] == 'Gray': + self.color_mode_title_tip_jpeg.setText(u'Grayscale image') + + self.generate_preview() + + def change_quality_live_jpeg(self): + self.quality_percent_title_jpeg.setText(str(self.quality_choice_dial_jpeg.value()) + '%') + + def jpeg_interlace_click_jpeg(self): + if self.jpeg_interlace_option_jpeg.isChecked(): + self.jpeg_interlace_choice_jpeg.setEnabled(True) + else: + self.jpeg_interlace_choice_jpeg.setEnabled(False) + self.generate_preview() + + def jpeg_noise_click_jpeg(self): + if self.jpeg_noise_option_jpeg.isChecked(): + self.jpeg_noise_choice_jpeg.setEnabled(True) + self.jpeg_noise_ammount_jpeg.setEnabled(True) + else: + self.jpeg_noise_choice_jpeg.setEnabled(False) + self.jpeg_noise_ammount_jpeg.setEnabled(False) + self.generate_preview() + + def cmyk_advanced_manipulation_click_jpeg(self): + if self.cmyk_advanced_manipulation_option_jpeg.isChecked(): + self.cmyk_overblack_jpeg.setEnabled(True) + self.view_c_button.setVisible(True) + self.view_m_button.setVisible(True) + self.view_y_button.setVisible(True) + self.view_k_button.setVisible(True) + self.cmyk_overprint_black() + self.cmyk_advanced_manipulation() + + else: + self.cmyk_overblack_jpeg.setEnabled(False) + self.cmyk_overblack_jpeg.setChecked(False) + self.view_c_button.setVisible(False) + self.view_m_button.setVisible(False) + self.view_y_button.setVisible(False) + self.view_k_button.setVisible(False) + self.generate_preview() + + def cmyk_overprint_black(self): + if self.cmyk_overblack_jpeg.isChecked(): + cmyk.generate_svg_separations(dirpathTempFolder + '/', open(dirpathTempFolder + '/original.svg').read(), True) + else: + cmyk.generate_svg_separations(dirpathTempFolder + '/', open(dirpathTempFolder + '/original.svg').read(), False) + + def cmyk_advanced_manipulation(self): + area_to_export = self.area_to_export() + cmyk.generate_png_separations(dirpathTempFolder + '/', self.area_to_export(), self.dpi_choice.value(), False) + + for color in ['C', 'M', 'Y', 'K']: + subprocess.Popen(['convert', dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + color + ".png", '-colorspace', 'CMYK', '-channel', color, '-separate', dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + color + ".png"]).wait() + + self.cmyk_advanced_manipulation_view_separations() + + def cmyk_advanced_manipulation_view_separations(self): + area_to_export = self.area_to_export() + + file_info = subprocess.Popen(['identify', dirpathTempFolder + '/source.png'], stdout=subprocess.PIPE).communicate()[0] + + image_size = file_info.split(' ')[2] + + subprocess.Popen(['convert', '-size', image_size, 'xc:black', dirpathTempFolder + '/empty.png']).wait() + + final_command = ['convert'] + + if self.view_c_button.isChecked(): + final_command.append(dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + 'C' + ".png") + else: + final_command.append(dirpathTempFolder + '/' + "empty.png") + + if self.view_m_button.isChecked(): + final_command.append(dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + 'M' + ".png") + else: + final_command.append(dirpathTempFolder + '/' + "empty.png") + + if self.view_y_button.isChecked(): + final_command.append(dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + 'Y' + ".png") + else: + final_command.append(dirpathTempFolder + '/' + "empty.png") + + if self.view_k_button.isChecked(): + final_command.append(dirpathTempFolder + '/' + "separated" + area_to_export.replace(' ', '') + 'K' + ".png") + else: + final_command.append(dirpathTempFolder + '/' + "empty.png") + + final_command.extend(['-set', 'colorspace', 'cmyk']) + final_command.extend(['-combine', dirpathTempFolder + '/' + 'result.tiff']) + subprocess.Popen(final_command).wait() + + self.generate_preview() + + def area_to_export(self): + if self.area_to_export_choice.currentIndex() == 1: + return ' -D ' + + elif self.area_to_export_choice.currentIndex() == 2: + if self.area_to_export_idonly_check.isChecked(): + return ' --export-id=' + str(self.area_to_export_id_name.text()) + ' --export-id-only ' + else: + return ' --export-id=' + str(self.area_to_export_id_name.text()) + + elif self.area_to_export_choice.currentIndex() == 3: + return ' --export-area=' + str(self.x0_value.value()) + ':' + str(self.y0_value.value()) + ':' + str(self.x1_value.value()) + ':' + str(self.y1_value.value()) + + else: + return ' -C ' + + def change_area_to_export(self): + self.x0_value.setVisible(False) + self.y0_value.setVisible(False) + self.x1_value.setVisible(False) + self.y1_value.setVisible(False) + self.area_to_export_id_title.setVisible(False) + self.area_to_export_id_name.setVisible(False) + self.area_to_export_idonly_check.setVisible(False) + + if self.area_to_export_choice.currentIndex() == 2: + self.area_to_export_id_name.setText(selected_object) + self.area_to_export_id_title.setVisible(True) + self.area_to_export_id_name.setVisible(True) + self.area_to_export_idonly_check.setVisible(True) + + elif self.area_to_export_choice.currentIndex() == 3: + self.x0_value.setVisible(True) + self.y0_value.setVisible(True) + self.x1_value.setVisible(True) + self.y1_value.setVisible(True) + + os.system('inkscape' + ' -z "' + dirpathTempFolder + '/original.svg" ' + self.area_to_export() + ' --export-dpi=' + str(self.dpi_choice.value()) + ' --export-background-opacity=1 --export-png="' + dirpathTempFolder + '/source.png"' + null_dir) + subprocess.Popen(['convert', dirpathTempFolder + '/source.png', dirpathTempFolder + '/source.tiff']).wait() + + self.generate_preview() + + def zoom_out(self): + self.preview_zoom += 0.1 + self.generate_preview() + + if int(self.preview_zoom * 100) == 200: + self.zoom_out_button.setEnabled(False) + self.zoom_in_button.setEnabled(True) + + self.preview_zoom_title.setText(str(int(self.preview_zoom * 100)) + '%') + + def zoom_in(self): + self.preview_zoom -= 0.1 + self.generate_preview() + + if int(self.preview_zoom * 100) == 10: + self.zoom_in_button.setEnabled(False) + self.zoom_out_button.setEnabled(True) + + self.preview_zoom_title.setText(str(int(self.preview_zoom * 100)) + '%') + + def cut_marks_insert_change(self): + if self.prepress_paper_cutmarks_check.isChecked(): + self.prepress_paper_cutmarks_strokewidth_label.setEnabled(True) + self.prepress_paper_cutmarks_strokewidth_value.setEnabled(True) + self.prepress_paper_cutmarks_strokewidth_choice.setEnabled(True) + self.prepress_paper_cutmarks_bleedsize_label.setEnabled(True) + self.prepress_paper_cutmarks_bleedsize_value.setEnabled(True) + self.prepress_paper_cutmarks_bleedsize_choice.setEnabled(True) + self.prepress_paper_cutmarks_marksize_label.setEnabled(True) + self.prepress_paper_cutmarks_marksize_value.setEnabled(True) + self.prepress_paper_cutmarks_marksize_choice.setEnabled(True) + self.prepress_paper_cutmarks_inside_check.setEnabled(True) + + else: + self.prepress_paper_cutmarks_strokewidth_label.setEnabled(False) + self.prepress_paper_cutmarks_strokewidth_value.setEnabled(False) + self.prepress_paper_cutmarks_strokewidth_choice.setEnabled(False) + self.prepress_paper_cutmarks_bleedsize_label.setEnabled(False) + self.prepress_paper_cutmarks_bleedsize_value.setEnabled(False) + self.prepress_paper_cutmarks_bleedsize_choice.setEnabled(False) + self.prepress_paper_cutmarks_marksize_label.setEnabled(False) + self.prepress_paper_cutmarks_marksize_value.setEnabled(False) + self.prepress_paper_cutmarks_marksize_choice.setEnabled(False) + self.prepress_paper_cutmarks_inside_check.setEnabled(False) + + self.generate_preview() + + def format_preview_change(self): + if self.format_preview_check.isChecked(): + self.resize(950, 600) + self.setMaximumSize(QtCore.QSize(950, 600)) + self.setMinimumSize(QtCore.QSize(950, 600)) + self.preview_panel.setVisible(True) + self.option_box.setGeometry(320, 120, 620, 435) + self.format_title.setGeometry(320, 70, 200, 15) + self.format_choice.setGeometry(320, 85, 200, 25) + self.export_button.setGeometry(740, 560, 200, 30) + self.format_preview_check.setGeometry(540, 85, 200, 25) + else: + self.resize(640, 600) + self.setMaximumSize(QtCore.QSize(640, 600)) + self.setMinimumSize(QtCore.QSize(640, 600)) + self.preview_panel.setVisible(False) + self.option_box.setGeometry(10, 120, 620, 435) + self.format_title.setGeometry(10, 70, 200, 15) + self.format_choice.setGeometry(10, 85, 200, 25) + self.export_button.setGeometry(430, 560, 200, 30) + self.format_preview_check.setGeometry(230, 85, 200, 25) + + self.move((QtGui.QDesktopWidget().screenGeometry().width()-self.geometry().width())/2, (QtGui.QDesktopWidget().screenGeometry().height()-self.geometry().height())/2) + + def export(self): + self.location_path = QtGui.QFileDialog.getSaveFileName(self, _(u"Save image"), os.environ.get('HOME', None), list_of_export_formats[self.format_choice.currentIndex()]).toUtf8() + + if not self.format_preview_check.isChecked(): + self.generate_final_file() + + if not str(self.location_path) == '': + shutil.copy2(dirpathTempFolder + '/result-imp.' + list_of_export_formats[self.format_choice.currentIndex()].lower(), self.location_path) + + + + app = QtWidgets.QApplication(sys.argv) + app.main = mainWindow() + app.main.show() + + sys.exit(app.exec_()) + +if __name__ == '__main__': + OutputProBitmap().run() diff --git a/extensions/fablabchemnitz/output_pro/outputpro/__init__.py b/extensions/fablabchemnitz/output_pro/outputpro/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/extensions/fablabchemnitz/output_pro/outputpro/alpha.png b/extensions/fablabchemnitz/output_pro/outputpro/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c30c1c2a24256937a7a9de7bff6724c2f9f5aa41 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5m^jW ze;tGwoit`w00kvWTq8!`#nk{)H%gF2GvhuU! z^YZGQVh! zJY1Q#^_7x_i;1Zn&GZg~G5CXh`#xE{;US0l+L7XGPZs>t`}O^WFLoHV|7T%g;hVCr zmNnJq=H^~|?!Py*rpw=Sm$sWtR&>+9i&|lxx-CBAHd1pF=&{g}ec;c{VGv)~lmo`f0lm8Fg{oq19IEu+=~ePBz4~<#RQ>&b zfolD_&9IeHsaM)ws51KRK$Y?fy;`yts@W?%RD+lQ3RPyMUadHxS3f%dRrck-LA7#T zua<6C;X%LGryHlwyWTOI?hRLf*kB)q^PObp!Ou-=g!8@BmJ82;Swj1pe%Ok|cZ2@h ztQq1pZ-{0?mE#|WY7FZY`#-%xR;U`iuqDKILDl&|9I9u0`qm~dYzbpydUbVCufEi` zP7J}88ZUtA$_M(r)+O|<7lvR<9UIrHtNOjxsnb8ERwN(hKT0!E7(FN#tQr2r3sSHN z&$FTCpgLXSHZEnow}~Y2UlA#QJS;=LA`i#Rji7OohtW960W`oe6&MY0OvMPgOY$(f zOL72>S($!}##p9*1dZ94{$Vu6G5rBFZ)GwtnrE4e5j1aOGKSGS$7BRh+{z4&qBzS8 z22tF`433~U#|#G0qLs-WMT;zx9Yl*ZCVK=ea!hsrUAGJO++tfun>G5=6)E@~SJv84 z^TW7ux7&D7ogSoCJ}wocM$EQl;tY@k=gVr zXUXLlx065V6sS?uFszw9;zFy$KJNdV4mr%OaE?3t2$r9sl)G5&qm%(GbChxn%YI79 z#Il7_?qJzVDOa$ZLn$sS4^hgqSbmIB=CNEvDZj*WJEc@&`Hz&c9?R*J@;R3GQp)>S z?xqw6mgAK2B$iE-GJ|EFQp&L0NhuL5-=dU!EU%@MNh}|rlwvIRP)Z2PpHa%ISbo%O zs_LTqtjqzMWxGRo(aE=7*BVBU`Mk97UB9Em9ex7K=hIBza+d9fg{N7|9lM~?lU5Y% zqB$0|bcTFYJ*@ z$^48&lleJ`Ci8bCn#_A8+RlIMmOd@#KlVtUlH4inC%H%3Px2Y*63OSJOC-N5ts%Kr zT4U#}$)OV=WMA$6ce5B2sJ}1wH!qlPEp-_W+0gSi<+@YoRq58K_Lj|J?v=vGZkkyY zLH4y}z|5JIgt=wFf|*pp17*NtGZf)lWx&)3m}~NZ8zNwC&Ij&^fVn>(_<97)Q~AJE zlVCnk419hP%$JIRKb!>fU@@?2l9)~F$Z!5-TTsI(_nmW67k%$fTF7RZ^?v`1lMg%< zB4X2FcY3Fo^ec*E{7XJda|kZu>WNdp={mxT6R!iOorL=)P6DTE2|t;54LDs+*ii_6 zM-liPCE$1P;7=8TKUD<&R0;S~Jovw_{I^!e^s9V9*5pn=)`_IV%>>F3X0nR>vNAFua1k#t^LjC)y7BQ*j{?31Fb{Tii9!&WWw`t?X Tibu&`vmtL=!PbE-_U8Ws)lrPV literal 0 HcmV?d00001 diff --git a/extensions/fablabchemnitz/output_pro/outputpro/top.png b/extensions/fablabchemnitz/output_pro/outputpro/top.png new file mode 100644 index 0000000000000000000000000000000000000000..25dce7449645643d2d83af4d51350a1cfce9ba4b GIT binary patch literal 70828 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