class Tab(LibTab): def __init__(self): super().__init__() self.rows = [] self.initData() self.initUI() def initData(self): self.rows = [] self.main_title = None def initUI(self): self.text_panel_code = QTextEdit(objectName="text3") self.text_panel_code.setToolTip('Код для всавки в <b>проект</b>') button_generat = widj_tab1.button_setting("Сгенерировать", self.generat) button_view = widj_tab1.button_setting("Отобразить", self.view_code) self.w_screen = widj_tab1.lile_label("Ширина", '1920') self.indent_w = widj_tab1.lile_label("Отступ w", '50') self.indent_h = widj_tab1.lile_label("Отступ h", '50') self.name_wind = widj_tab1.lile_label_name("Имя", "PRG_TEST") self.table = TableSimple(name=["Блок"]) self.status = QLabel('') self.set_status(status="ОК", color='#0b5506') self.main_layout.addWidget(self.text_panel_code, 0, 0, 27, 1) self.main_layout.addWidget(self.table, 0, 1, 27, 1) self.main_layout.addWidget(self.w_screen, 12, 3, 1, 2) self.main_layout.addWidget(self.status, 6, 3, 1, 2) self.main_layout.addWidget(self.indent_w, 14, 3, 1, 2) self.main_layout.addWidget(self.indent_h, 15, 3, 1, 2) self.main_layout.addWidget(self.name_wind, 11, 3, 1, 2) self.main_layout.addWidget(widj_tab1.line_btn_simple(self), 0, 3, 1, 2) self.main_layout.addWidget(button_view, 17, 3, 1, 2) self.main_layout.addWidget(button_generat, 18, 3, 1, 2) def set_status(self, color, status): self.status.setText(f""" Статус: <b style="color: {color};">{status}</b> """) def reverce_code(self): try: self.cur = self.con.cursor() new_str = "" rows_str = self.text_panel_code.toPlainText().split('\n') for string_some in rows_str: if string_some == '': break slovo_pos = re.search(r'__EXVAR_\d+', string_some) if slovo_pos is None: new_str += '\n' continue slovo = string_some[slovo_pos.start():slovo_pos.end()] result = re.sub(r'__EXVAR_\d+', f"Э{self.get_card_from_exvar(slovo)}У", string_some) new_str += result + '\n' self.text_panel_view.setText(new_str) except Exception as e: self.text_panel_view.setText("Упс, ошибочка вышла :(") QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def get_count_of_in_out(self, type_id): count = [0, 0] for direction in [1, 2]: select = f"select count(*) from ISAOBJFIELDS where ISAOBJID in (select id from ISAOBJ where id = {type_id}) and direction = {direction}" self.cur.execute(select) try: count[direction - 1] = [count[0] for count in self.cur][0] except: pass return 20 + max(count) * 20 def get_type_from_marka(self, marka): select = f"select tid from ISACARDS where CARDSID in (select id from CARDS where marka = '{marka}')" self.cur.execute(select) return [id[0] for id in self.cur][0] def get_type_name(self, type_id): select = f"select name from ISAOBJ where id = {type_id}" self.cur.execute(select) return [id[0] for id in self.cur][0] def get_temp(self, marka): type_id = self.get_type_from_marka(marka) height = self.get_count_of_in_out(type_id) type_name = self.get_type_name(type_id) weight = 100 + len(type_name) * 10 return height, weight, type_name # def generat(self): # try: # self.cur = self.con.cursor() # # template_num = [] # env1 = Environment(loader=FileSystemLoader('.')) # template_num.append(env1.get_template('templates/fbd_xml/block_xml.html')) # env = Environment(loader=FileSystemLoader('.')) # template = env.get_template('templates/fbd_xml/temp_xml.html') # page = [] # x0 = 50 # y0 = 50 # dx0 = int(self.indent_w.line_edit.text()) # dy = int(self.indent_h.line_edit.text()) # dx = dx0 # y = y0 # x = x0 # ymax = int(self.heigh_screen.line_edit.text()) # marks = self.data_row # # for marka in marks: # height, weight, type_name = self.get_temp(marka) # con = dict(x=x, y=y, WIDTH=weight, HEIGHT=height, type=type_name, marka=marka) # page.append(str(template_num[0].render(name_page=self.name_wind.line_edit.text(), con=con))) # y += height + dy # if weight + dx0 > dx: # dx = weight + dx0 # if y >= ymax: # y = y0 # x += dx # dx = dx0 # # options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog # fileName, _ = QFileDialog.getSaveFileName(self, "Сохранить xml", "", "xml (*.xml)", options=options) # # if fileName == '': # return # # if fileName.find('.xml') == -1: # fileName += '.xml' # with open(fileName, "w", encoding='utf8') as f: # f.write(template.render(blocks=page)) # # # except Exception as e: # self.text_panel_code.setText("Упс, ошибочка вышла :(") # QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) # return def generat(self): try: self.cur = self.con.cursor() marks = [self.table.item(row, 0).text() for row in range(self.table.rowCount())] x0 = int(self.indent_w.line_edit.text()) y0 = int(self.indent_h.line_edit.text()) xmax = int(self.w_screen.line_edit.text()) self.thread_bd = CloneThread(self.con, marks, x0, y0, xmax) # This is the thread object self.thread_bd.signal.connect(self.thread_finished) self.thread_bd.bad_signal.connect(self.bad_finished) self.thread_bd.start() self.set_status(status="Перевдим ...", color='#0e385e') except Exception as e: QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) self.set_status(status="Ошибка", color='#780d04') return def bad_finished(self, error): QMessageBox().warning(self, "Ошибка", str(error), QMessageBox.Ok, QMessageBox.Ok) self.set_status(status="Ошибка", color='#780d04') def thread_finished(self, list_bloks, list_links, brack): ''' Сигналы из потока ''' self.set_status(status="OK", color='#0b5506') env = Environment(loader=FileSystemLoader('.')) main = env.get_template('templates/tab5/MAIN.html') options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self, "Сохранить xml", "", "xml (*.xml)", options=options) if fileName == '': return if fileName.find('.xml') == -1: fileName += '.xml' with open(fileName, "w", encoding='utf8') as f: f.write(main.render(bloks=list_bloks, links=list_links, name=self.name_wind.line_edit.text())) if len(brack) != 0: QMessageBox().warning(self, "Не удалось найти", 'Следующие блоки отсутствуют: \n' + str(', '.join(brack)), QMessageBox.Ok, QMessageBox.Ok) self.set_status(status="Готово", color='#0b5506') def view_code(self): data_row = [] text_code = self.text_panel_code.toPlainText().split('\n') self.table.setRowCount(0) for text in text_code: block = text.split('.') if len(block) > 1 and block[0] not in data_row: index = self.table.rowCount() self.table.setRowCount(index + 1) # и одну строку в таблице self.table.setItem(index, 0, QTableWidgetItem(block[0])) data_row.append(block[0])
class Tab(LibTab): def __init__(self): super().__init__() self.new_templates = Template() self.rows = [] self.initData() self.initUI() def initData(self): self.rows = [] self.main_title = None def initUI(self): self.table = TableSimple(name=["MARKA"]) # self.table.setSelectionBehavior(QAbstractItemView.SelectItems) # Выделяет всю строку self.table_for_test = TableSimple(name=["SOMETHING"]) # self.table_for_test.setSelectionBehavior(QAbstractItemView.SelectItems) # Выделяет всю строку # self.table_for_test.setMaximumWidth(500) button_open = SimpleBtn(label="Открыть исх. файл", click_func=self.open_xml) self.count_element = LineLabel( label="Кол-во в ряду/строке", number='20') self.dx = LineLabel(label="dx", number='100') self.dy = LineLabel(label="dy ", number='100') button_generat = SimpleBtn(label="Сгенерировать", click_func=self.gerait_xml) button_open_teml = SimpleBtn(label="Открыть шаблон", click_func=self.get_tempalte) button_save_teml = SimpleBtn(label="Сохранить шаблон", click_func=self.save_template) self.xml_template = SimpleLabel(text="None", WordWrap=True) self.table.setMaximumWidth(1700) self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.text_panel = TextEditor( objectName="text1", tooltip='Правила вставки', text= """[f"2/PLC_GP_21_1BR/1/{str(item1).rjust(2,'0')}/DI_DIG_3A" for item1 in range(1, 3)]""" ) self.offset = CheckBox(label='Смещение по оси x', value=True) button_generat_tab2 = SimpleBtn(label="get_table2", click_func=self.generate_table2) self.xml_template = SimpleLabel(text="None", WordWrap=True) splitter_v = QSplitter(Qt.Vertical) splitter_v.addWidget(self.table_for_test) splitter_v.addWidget(self.text_panel) splitter = QSplitter(Qt.Horizontal) splitter.addWidget(self.table) splitter.addWidget(splitter_v) self.main_layout.addWidget(splitter, 0, 0, 27, 2) self.main_layout.addWidget(button_generat, 23, 2, 1, 2) self.main_layout.addWidget(button_generat_tab2, 5, 2, 1, 2) self.main_layout.addWidget(self.xml_template, 1, 2, 1, 2) self.main_layout.addWidget(button_open, 14, 2, 1, 2) self.main_layout.addWidget(button_open_teml, 16, 2, 1, 2) self.main_layout.addWidget(button_save_teml, 15, 2, 1, 2) self.main_layout.addWidget(self.count_element, 9, 2, 1, 2) self.main_layout.addWidget(self.dx, 11, 2, 1, 2) self.main_layout.addWidget(self.dy, 12, 2, 1, 2) self.main_layout.addWidget(self.offset, 8, 2, 1, 2) def get_tempalte(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog path, _ = QFileDialog.getOpenFileName(self, 'Открыть xml', "", "Xml (*.xml)", options=options) if path == '': return try: self.new_templates.get_tempalte(path) self.table_view_set() self.watch_path(path) except Exception as e: self.error_message() QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def save_template(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self, "Сохранить xml", "", "xml (*.xml)", options=options) if fileName == '': return if fileName.find('.xml') == -1: fileName += '.xml' try: self.new_templates.save_to_file(fileName) except Exception as e: self.error_message() QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def table_clean(self): self.table.setRowCount(0) def tab_view(self): # exec(f'connection = {self.text_panel.toPlainText()}') # connection = eval('[dict(MARKA=f"GP0011_SPPV_{item1}_P", NAME=f"{item2}",OBJSIGN=f"P",KLASSNAME="[ВСЕ]\Водоснабжение\ГП0011 СППВ",EVKLASSNAME="[Все технологические]\Водоснабжение\ГП0011 СППВ", PLCNAME="ICore_2") for item1, item2 in [["TO_K1", "Давление на входе насоса K1"],["FROM_K1", "Рабочее давление K1"],["TO_K8", "Давление на входе насоса K8"],["FROM_K8", "Рабочее давление K8"],["TO_K10", "Давление на входе насоса K10"],["FROM_K10", "Рабочее давление K10"],["TO_K14", "Давление на входе насоса K14"],["FROM_K14","Рабочее давление K14"]]]') # connection = eval(self.text_panel.toPlainText()) pass def open_xml(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog path, _ = QFileDialog.getOpenFileName(self, 'Открыть xml', "", "Xml (*.xml)", options=options) if path == '': return try: with open(path, "r", encoding='UTF-8') as f: self.new_templates.open_xml(path) self.table_view_set() self.watch_path(path) self.dx.line_edit.setText( str(roundUpToMultiple(self.new_templates.maximum_x, 50))) self.dy.line_edit.setText( str(roundUpToMultiple(self.new_templates.maximum_y, 50))) except Exception as e: self.error_message() QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def table_view_set(self): self.table.setColumnCount( len(self.new_templates.atr_dict.keys()) + 1) # Устанавливаем три колонки labels_list = ['№'] labels_list.extend(list(self.new_templates.atr_dict.keys())) self.table.setHorizontalHeaderLabels(labels_list) self.table.setRowCount(1) # и одну строку в таблице header = self.table.horizontalHeader() self.table.setItem(0, 0, QTableWidgetItem('1')) for in_col, key in enumerate(list(self.new_templates.atr_dict.keys())): self.table.setItem( 0, in_col + 1, QTableWidgetItem(str(self.new_templates.atr_dict[key]))) header.setSectionResizeMode(in_col + 1, QHeaderView.Stretch) # Stretch) self.table.setWordWrap(True) def gerait_xml(self): try: bloks_templ = Environment(loader=BaseLoader).from_string( self.new_templates.bloks_data) links_templ = Environment(loader=BaseLoader).from_string( self.new_templates.links_data) env = Environment(loader=FileSystemLoader('.')) template = env.get_template('templates/tab11/main.html') options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self, "Сохранить xml", "", "xml (*.xml)", options=options) if fileName == '': return if fileName.find('.xml') == -1: fileName += '.xml' with open(fileName, "w", encoding='utf8') as f: count_element_max = int(self.count_element.line_edit.text()) x0 = 0 y0 = 0 x = x0 y = y0 dx = int(self.dx.line_edit.text()) dy = int(self.dy.line_edit.text()) list_atrib = ['X', 'Y', 'index'] list_atrib.extend(list(self.new_templates.atr_dict.keys())) dicr_atr = collections.namedtuple('dicr_atr', list_atrib) links = [] count = self.table.rowCount() index_of_element = 0 bloks = [] index_row = 1 for index in range(count): at = [ self.table.item(index, col).text() for col in range(1, self.table.columnCount()) ] my_dict = dicr_atr(x, y, index_of_element, *at) links.append(str(links_templ.render(dict=my_dict))) bloks.append(str(bloks_templ.render(dict=my_dict))) if self.offset.isChecked(): x += dx if index_row >= count_element_max: x = x0 y += dy index_row = 0 else: y += dy if index_row >= count_element_max: y = y0 x += dx index_row = 0 index_row += 1 index_of_element += self.new_templates.delta + 1 f.write(template.render(bloks=bloks, links=links)) except Exception as e: self.text_panel.setText('Что-то пошло не так') QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) @staticmethod def check_type(data): return '' if isinstance(data, type(None)) else data.text() def generate_table2(self): self.table_for_test.setRowCount(0) try: connection = eval(self.text_panel.toPlainText()) for conn in connection: index = self.table_for_test.rowCount() self.table_for_test.setRowCount( index + 1) # и одну строку в таблице self.table_for_test.setRowHeight(index, 50) self.table_for_test.setItem(index, 0, QTableWidgetItem(conn)) self.table_for_test.resizeRowsToContents() except Exception as e: self.table_for_test.setRowCount(1) self.table_for_test.setItem(0, 0, "Что-то не так") QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def watch_path(self, path): now = datetime.now() self.xml_template.setText(path + '\n' + str(now.hour) + ':' + str(now.minute) + ':' + str(now.second)) def error_message(self): self.xml_template.setText("Ошибка! :(")
class Tab(LibTab): def __init__(self): super().__init__() self.rows = [] self.initData() self.initUI() def initData(self): self.rows = [] self.main_title = None def initUI(self): self.table = TableSimple(name=[ "MARKA", "NAME", "KLASSNAME", "EVKLASSNAME", "PLCNAME", "PLC_ADRESS", "OBJSIGN" ]) button_open = SimpleBtn(label="Открыть xml", click_func=self.open_xml) button_except = SimpleBtn(label="Добавить", click_func=self.tab_view) button_clean = SimpleBtn(label="Очистить", click_func=self.table_clean) button_generat = SimpleBtn(label="Сгенерировать", click_func=self.gerait_xml) button_open_example = SimpleBtn( label="Отобразить пример", click_func=self.open_example_xml) self.xml_template = QLabel("None") self.xml_template.setWordWrap(True) self.text_panel = TextEditor( text= """[dict(MARKA=f"GP0011_SPPV_{item1}", NAME=f"{item2}", OBJSIGN=f"P", KLASSNAME="[ВСЕ]\Водоснабжение\ГП0011 СППВ", EVKLASSNAME="[Все технологические]\Водоснабжение\ГП0011 СППВ", PLCNAME="ICore_2") for item1, item2 in [["K12_WORK", "Работа"], ["K12_ALARM", "Авария"],["K13_WORK", "Работа"], ["K13_ALARM", "Авария"]]]""", height=200) self.main_layout.addWidget(self.table, 0, 0, 27, 1) self.main_layout.addWidget(self.text_panel, 27, 0, 1, 1) self.main_layout.addWidget(self.xml_template, 12, 2, 1, 2) self.main_layout.addWidget(button_clean, 15, 3, 1, 1) self.main_layout.addWidget(button_except, 15, 2, 1, 1) self.main_layout.addWidget(button_open, 14, 2, 1, 2) self.main_layout.addWidget(button_open_example, 6, 2, 1, 2) self.main_layout.addWidget(button_generat, 27, 2, 1, 2) def table_clean(self): self.table.setRowCount(1) def tab_view(self): connection = eval(self.text_panel.toPlainText()) for conn in connection: index = self.table.rowCount() self.table.setRowCount( index + 1) # и одну строку в таблице self.table.setRowHeight(index, 50) # self.table.setCellWidget(index, 0, widj_tab1.lineWap(conn.get('MARKA', ''))) self.table.setItem(index, 0, QTableWidgetItem(conn.get('MARKA', ''))) self.table.setItem(index, 1, QTableWidgetItem(conn.get('NAME', ''))) self.table.setItem(index, 2, QTableWidgetItem(conn.get('KLASSNAME', ''))) self.table.setItem(index, 3, QTableWidgetItem(conn.get('EVKLASSNAME', ''))) self.table.setItem(index, 4, QTableWidgetItem(conn.get('PLCNAME', ''))) self.table.setItem(index, 5, QTableWidgetItem(conn.get('PLC_ADRESS', ''))) self.table.setItem(index, 6, QTableWidgetItem(conn.get('OBJSIGN', ''))) self.table.resizeRowsToContents() def open_xml(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog path, _ = QFileDialog.getOpenFileName(self, 'Открыть xml', "", "Xml (*.xml)", options=options) if path == '': return with open(path, "r", encoding='UTF-8') as f: # contents = f.read()#.encode().decode('utf-8') dom = xml.dom.minidom.parse(path) dom.normalize() itemlist = dom.getElementsByTagName('TEHOBJ') for item in itemlist: item.attributes['MARKA'].value = "{{MARKA}}" item.attributes['EVKLASSNAME'].value = "{{EVKLASSNAME}}" item.attributes['KLASSNAME'].value = "{{KLASSNAME}}" item.attributes['NAME'].value = "{{NAME}}" item.attributes['PLCNAME'].value = "{{PLCNAME}}" item.attributes['OBJSIGN'].value = "{{OBJSIGN}}" item.attributes['PLC_ADRESS'].value = "{{PLC_ADRESS}}" now = datetime.now() self.xml_template.setText(path + '\n' + str(now.hour) + ':' + str(now.minute) + ':' + str(now.second)) self.template_t = dom.toxml() self.template_t = self.template_t.replace( '<?xml version="1.0" ?><root>', '') self.template_t = self.template_t.replace('</root>', '') def open_example_xml(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog path, _ = QFileDialog.getOpenFileName(self, 'Открыть xml', "", "Xml (*.xml)", options=options) if path == '': return with open(path, "r", encoding='UTF-8') as f: # contents = f.read()#.encode().decode('utf-8') dom = xml.dom.minidom.parse(path) dom.normalize() itemlist = dom.getElementsByTagName('TEHOBJ') self.table.setRowCount( 0) # и одну строку в таблице for item in itemlist: index = self.table.rowCount() self.table.setRowCount( index + 1) # и одну строку в таблице self.table.setRowHeight(index, 50) # self.table.setCellWidget(index, 0, widj_tab1.lineWap(conn.get('MARKA', ''))) self.table.setItem( index, 0, QTableWidgetItem(item.attributes['MARKA'].value)) self.table.setItem( index, 1, QTableWidgetItem(item.attributes['NAME'].value)) self.table.setItem( index, 2, QTableWidgetItem(item.attributes['KLASSNAME'].value)) self.table.setItem( index, 3, QTableWidgetItem(item.attributes['EVKLASSNAME'].value)) self.table.setItem( index, 4, QTableWidgetItem(item.attributes['PLCNAME'].value)) self.table.setItem( index, 5, QTableWidgetItem(item.attributes['PLC_ADRESS'].value)) self.table.setItem( index, 6, QTableWidgetItem(item.attributes['OBJSIGN'].value)) self.table.resizeRowsToContents() def gerait_xml(self): try: template1 = Environment(loader=BaseLoader).from_string( self.template_t) env = Environment(loader=FileSystemLoader('.')) template = env.get_template('templates/tab2/main_.html') contents = [] # connection = eval(self.text_panel.toPlainText()) options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self, "Сохранить xml", "", "xml (*.xml)", options=options) if fileName == '': return if fileName.find('.xml') == -1: fileName += '.xml' with open(fileName, "w", encoding='utf8') as f: count = self.table.rowCount() for index in range(count): contents.append( str( template1.render(MARKA=self.check_type( self.table.item(index, 0)), NAME=self.check_type( self.table.item(index, 1)), OBJSIGN=self.check_type( self.table.item(index, 6)), KLASSNAME=self.check_type( self.table.item(index, 2)), EVKLASSNAME=self.check_type( self.table.item(index, 3)), PLCNAME=self.check_type( self.table.item(index, 4)), PLC_ADRESS=self.check_type( self.table.item(index, 5))))) f.write(template.render(vars=contents)) except Exception as e: self.text_panel.setText('Error') QMessageBox().warning(self, "Ошибка", str(e), QMessageBox.Ok, QMessageBox.Ok) def check_type(self, data): return '' if type(data) == type(None) else data.text()