913 lines
47 KiB
Python
913 lines
47 KiB
Python
|
|
import json
|
|||
|
|
import os
|
|||
|
|
import base64
|
|||
|
|
import uuid
|
|||
|
|
from PyQt6 import *
|
|||
|
|
from PyQt6.QtCore import *
|
|||
|
|
from PyQt6.QtGui import *
|
|||
|
|
from PyQt6.QtWidgets import *
|
|||
|
|
from PyQt6.QtQuick import *
|
|||
|
|
from PyQt6.QtQml import *
|
|||
|
|
from createModelDlg import CreateModelDlg
|
|||
|
|
from createInstructionDlg import CreateInstructionDlg
|
|||
|
|
from ui.Ui_devModelForm import Ui_devModelForm
|
|||
|
|
from show_editor import CodeDialog
|
|||
|
|
from interfaceSession.interfaceManager import interfaceManager
|
|||
|
|
from instructionModel.instructionManager import instructionManager
|
|||
|
|
from dmGroupModel.dmGroupManager import dmGroupManager
|
|||
|
|
from common import common
|
|||
|
|
from common import DragDropInfo
|
|||
|
|
from common import AlignDelegate
|
|||
|
|
from common import AlignNoDelegate
|
|||
|
|
from devmodelModel.devModelManager import devModelManager
|
|||
|
|
class CustomHeader(QHeaderView):
|
|||
|
|
def __init__(self, parent=None):
|
|||
|
|
super().__init__(Qt.Orientation.Horizontal, parent)
|
|||
|
|
self.config = None
|
|||
|
|
self.combo = QComboBox(self)
|
|||
|
|
self.combo.currentIndexChanged.connect(self.handleComboChange)
|
|||
|
|
|
|||
|
|
def setConfig(self, config):
|
|||
|
|
self.config = config
|
|||
|
|
self.combo.addItems(self.config["type"])
|
|||
|
|
def paintSection(self, painter, rect, logicalIndex):
|
|||
|
|
painter.save()
|
|||
|
|
super().paintSection(painter, rect, logicalIndex)
|
|||
|
|
if logicalIndex == 0:
|
|||
|
|
comboRect = rect.adjusted(4, 4, -4, -4)
|
|||
|
|
self.combo.setGeometry(comboRect)
|
|||
|
|
self.combo.show()
|
|||
|
|
painter.restore()
|
|||
|
|
|
|||
|
|
def handleComboChange(self, index):
|
|||
|
|
print("Selected:", self.combo.currentText())
|
|||
|
|
|
|||
|
|
class DevModelForm(QWidget):
|
|||
|
|
|
|||
|
|
def __init__(self, parent=None):
|
|||
|
|
super().__init__(parent)
|
|||
|
|
self.ui = Ui_devModelForm()
|
|||
|
|
self.ui.setupUi(self)
|
|||
|
|
self.devModelModel = QStandardItemModel()
|
|||
|
|
self.createModelDlg = CreateModelDlg()
|
|||
|
|
self.codeDialog = CodeDialog("脚本编辑")
|
|||
|
|
self.supportedTypes = instructionManager.getSupportedType()
|
|||
|
|
self.createInstructionDlg = CreateInstructionDlg()
|
|||
|
|
self.instructionModel = QStandardItemModel()
|
|||
|
|
self.interFaceTypeModel = QStandardItemModel()
|
|||
|
|
self.interfaceTypeCombModel = QStandardItemModel()
|
|||
|
|
self.propertyModel = QStandardItemModel()
|
|||
|
|
self.dmGroupModel = QStandardItemModel()
|
|||
|
|
self.ui.tableViewCmd.setModel(self.instructionModel)
|
|||
|
|
self.ui.tableViewModel.setModel(self.devModelModel)
|
|||
|
|
self.ui.tableViewInterFaceType.setModel(self.interFaceTypeModel)
|
|||
|
|
self.ui.tableViewProperty.setModel(self.propertyModel)
|
|||
|
|
self.ui.tableViewDmGroup.setModel(self.dmGroupModel)
|
|||
|
|
self.current_groupId = None
|
|||
|
|
self.topWidget = None
|
|||
|
|
self.interfaceTypes = []
|
|||
|
|
self.createInstructionDlg.createFinished.connect(self.handleDevModelSelection)
|
|||
|
|
self.createInstructionDlg.editFinished.connect(self.handleDevModelSelection)
|
|||
|
|
self.createModelDlg.editFinished.connect(self.editDeviceFinished)
|
|||
|
|
self.createModelDlg.createFinished.connect(self.createDeviceFinished)
|
|||
|
|
self.ui.tableViewCmd.selectionModel().selectionChanged.connect(self.handleCmdSelection)
|
|||
|
|
self.ui.tableViewDmGroup.selectionModel().selectionChanged.connect(self.handleGroupSelection)
|
|||
|
|
self.ui.tableViewDmGroup.dropEvent = self.dmGroupDropEvent
|
|||
|
|
self.ui.tableViewModel.dropEvent = self.dropEvent
|
|||
|
|
self.ui.pbDeleteModel.clicked.connect(self.deleteModelBtnClick)
|
|||
|
|
# self.ui.pbImportModel.clicked.connect(self.overWriteModelBtnClick)
|
|||
|
|
self.ui.pbExportModel.clicked.connect(self.exportModel)
|
|||
|
|
self.ui.pbCreateModel.clicked.connect(self.showCreateModelDlg)
|
|||
|
|
self.ui.tableViewModel.doubleClicked.connect(self.editModel)
|
|||
|
|
self.ui.pbEditModel.clicked.connect(self.editModel)
|
|||
|
|
self.ui.pbCreateCmd.clicked.connect(self.createInstruction)
|
|||
|
|
self.ui.pbDeleteCmd.clicked.connect(self.deleteInstruction)
|
|||
|
|
self.ui.tableViewCmd.doubleClicked.connect(self.editInstruction)
|
|||
|
|
self.ui.pbCreateModelGroup.clicked.connect(self.createGroup)
|
|||
|
|
self.ui.pbDeleteModelGroup.clicked.connect(self.deleteGroup)
|
|||
|
|
self.ui.pbEditCmd.clicked.connect(self.editInstruction)
|
|||
|
|
self.ui.pbEditScript.clicked.connect(self.editScript)
|
|||
|
|
self.ui.pbAddInterfaceType.clicked.connect(self.addInterfaceType)
|
|||
|
|
self.ui.pbDeleteInterfaceType.clicked.connect(self.deleteInterfaceType)
|
|||
|
|
self.ui.pbAddProperty.clicked.connect(self.addProperty)
|
|||
|
|
self.ui.pbDeleteProperty.clicked.connect(self.deleteProperty)
|
|||
|
|
self.ui.tableViewModel.selectionModel().selectionChanged.connect(self.handleDevModelSelection)
|
|||
|
|
self.ui.pbCopyInstruction.clicked.connect(self.copyInstruction)
|
|||
|
|
self.ui.pbEditDescription.clicked.connect(self.onEditDescription)
|
|||
|
|
self.ui.pbSaveDescription.clicked.connect(self.saveDescription)
|
|||
|
|
self.ui.pbCopyModel.clicked.connect(self.copyModel)
|
|||
|
|
self.ui.lbDevModelImage.mouseDoubleClickEvent = self.handleImageClick
|
|||
|
|
# 关联信号和槽函数
|
|||
|
|
self.dmGroupModel.itemChanged.connect(self.updateDmGroup)
|
|||
|
|
self.interFaceTypeModel.itemChanged.connect(self.updateProperty)
|
|||
|
|
self.propertyModel.itemChanged.connect(self.updateProperty)
|
|||
|
|
self.batchSetItemDelegate()
|
|||
|
|
self.setSplitterStretchFactor()
|
|||
|
|
self.loadInterFaceTypes()
|
|||
|
|
|
|||
|
|
def onEditDescription(self):
|
|||
|
|
self.ui.textEditDescription.setEnabled(True)
|
|||
|
|
self.ui.textEditDescription.setFocus()
|
|||
|
|
|
|||
|
|
def saveDescription(self):
|
|||
|
|
self.ui.textEditDescription.setEnabled(False)
|
|||
|
|
|
|||
|
|
if len(self.ui.tableViewCmd.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewCmd.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
row_description =self.instructionModel.index(row, 5, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instruction = instructionManager.getInfo(instructionId)
|
|||
|
|
if "attr" in instruction.keys():
|
|||
|
|
attr = instruction["attr"]
|
|||
|
|
attr["description"] = self.ui.textEditDescription.toPlainText()
|
|||
|
|
if instructionManager.update(instructionId, instruction):
|
|||
|
|
self.instructionModel.setData(row_description, attr["description"])
|
|||
|
|
|
|||
|
|
def batchSetItemDelegate(self):
|
|||
|
|
self.ui.tableViewModel.verticalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewCmd.verticalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignHCenter|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewModel.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewCmd.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewInterFaceType.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewProperty.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
|||
|
|
self.ui.tableViewModel.setItemDelegate(AlignNoDelegate(self.ui.tableViewModel))
|
|||
|
|
self.ui.tableViewInterFaceType.setItemDelegate(AlignDelegate(self.ui.tableViewInterFaceType))
|
|||
|
|
self.ui.tableViewProperty.setItemDelegate(AlignDelegate(self.ui.tableViewProperty))
|
|||
|
|
self.ui.tableViewCmd.setItemDelegate(AlignNoDelegate(self.ui.tableViewCmd))
|
|||
|
|
self.ui.tableViewDmGroup.setItemDelegate(AlignDelegate(self.ui.tableViewDmGroup))
|
|||
|
|
|
|||
|
|
def dmGroupDropEvent(self, event: QDropEvent):
|
|||
|
|
if event.source() != self:
|
|||
|
|
mime_data = event.mimeData()
|
|||
|
|
source_index = mime_data.data('application/x-qabstractitemmodeldatalist')
|
|||
|
|
target_index = self.ui.tableViewDmGroup.indexAt(event.position().toPoint())
|
|||
|
|
drag_drop_info = DragDropInfo(source_index, target_index)
|
|||
|
|
self.handleGroupDrop(drag_drop_info)
|
|||
|
|
event.accept()
|
|||
|
|
else:
|
|||
|
|
event.ignore()
|
|||
|
|
|
|||
|
|
def dropEvent(self, event: QDropEvent):
|
|||
|
|
if event.source() != self:
|
|||
|
|
mime_data = event.mimeData()
|
|||
|
|
source_index = mime_data.data('application/x-qabstractitemmodeldatalist')
|
|||
|
|
target_index = self.ui.tableViewModel.indexAt(event.position().toPoint())
|
|||
|
|
drag_drop_info = DragDropInfo(source_index, target_index)
|
|||
|
|
self.handleDrop(drag_drop_info)
|
|||
|
|
event.accept()
|
|||
|
|
else:
|
|||
|
|
event.ignore()
|
|||
|
|
|
|||
|
|
def handleGroupDrop(self, drag_drop_info):
|
|||
|
|
target_row = drag_drop_info.target_index.row()
|
|||
|
|
if target_row > -1:
|
|||
|
|
row_id_index = self.dmGroupModel.index(target_row, 0, QModelIndex())
|
|||
|
|
groupId = self.dmGroupModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
rows = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
for row in rows:
|
|||
|
|
row_id_index = self.devModelModel.index(row.row(), 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
# devModelManager.createCopy(devModelId, groupId)
|
|||
|
|
param = {
|
|||
|
|
"group_id": groupId
|
|||
|
|
}
|
|||
|
|
result = devModelManager.update(devModelId, param)
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
def handleDrop(self, drag_drop_info):
|
|||
|
|
target_row = drag_drop_info.target_index.row()
|
|||
|
|
if target_row > -1:
|
|||
|
|
row_id_index = self.devModelModel.index(target_row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
rows = self.ui.tableViewCmd.selectionModel().selectedRows()
|
|||
|
|
for row in rows:
|
|||
|
|
row_id_index = self.instructionModel.index(row.row(), 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instructionManager.createCrossCopy(instructionId, devModelId)
|
|||
|
|
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
def editDeviceFinished(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewModel.selectionModel().selectedRows()[0].row()
|
|||
|
|
self.loadDevModel()
|
|||
|
|
if self.devModelModel.rowCount() > 0:
|
|||
|
|
self.ui.tableViewModel.selectRow(row)
|
|||
|
|
|
|||
|
|
def createDeviceFinished(self):
|
|||
|
|
self.loadDevModel()
|
|||
|
|
if self.devModelModel.rowCount() > 0:
|
|||
|
|
self.ui.tableViewModel.selectRow(self.devModelModel.rowCount()-1)
|
|||
|
|
|
|||
|
|
def clearChildrenModel(self):
|
|||
|
|
self.instructionModel.clear()
|
|||
|
|
self.propertyModel.clear()
|
|||
|
|
self.interFaceTypeModel.clear()
|
|||
|
|
self.ui.lbDevModelImage.clear()
|
|||
|
|
self.ui.lbDevModelImage.setText("封面")
|
|||
|
|
|
|||
|
|
def showCreateModelDlg(self):
|
|||
|
|
if self.current_groupId != None:
|
|||
|
|
self.createModelDlg.showCreateDlg(self.current_groupId)
|
|||
|
|
|
|||
|
|
def handleImageClick(self, event):
|
|||
|
|
if event.button() == Qt.MouseButton.LeftButton:
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewModel.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
data = devModelManager.getInfo(devModelId)
|
|||
|
|
modelnumber = ""
|
|||
|
|
extendedProperty = ""
|
|||
|
|
interfaceType = ""
|
|||
|
|
file_dialog = QFileDialog(self)
|
|||
|
|
file_dialog.setWindowTitle('选择图片')
|
|||
|
|
file_dialog.setNameFilter('Supported file formats (*.png *.jpg)') # 设置文件过滤器
|
|||
|
|
if file_dialog.exec():
|
|||
|
|
file_path = file_dialog.selectedFiles()[0]
|
|||
|
|
pixmap = QPixmap(file_path)
|
|||
|
|
self.ui.lbDevModelImage.setPixmap(pixmap)
|
|||
|
|
self.ui.lbDevModelImage.setScaledContents(True)
|
|||
|
|
self.ui.lbDevModelImage.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|||
|
|
base64_data = common.base64Data(pixmap.toImage())
|
|||
|
|
|
|||
|
|
if 'attr' in data:
|
|||
|
|
attr_json_dict = data['attr']
|
|||
|
|
if 'modelnumber' in attr_json_dict:
|
|||
|
|
modelnumber = attr_json_dict['modelnumber']
|
|||
|
|
if 'extendedProperty' in attr_json_dict:
|
|||
|
|
extendedProperty = attr_json_dict['extendedProperty']
|
|||
|
|
if 'interfaceType' in attr_json_dict:
|
|||
|
|
interfaceType = attr_json_dict['interfaceType']
|
|||
|
|
attr = {
|
|||
|
|
"modelnumber": modelnumber,
|
|||
|
|
"image": base64_data,
|
|||
|
|
"extendedProperty" : extendedProperty,
|
|||
|
|
"interfaceType" : interfaceType
|
|||
|
|
}
|
|||
|
|
param = {
|
|||
|
|
"attr" : attr
|
|||
|
|
}
|
|||
|
|
result = devModelManager.update(devModelId, param)
|
|||
|
|
|
|||
|
|
def copyModel(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index)
|
|||
|
|
if devModelManager.createCopy(devModelId):
|
|||
|
|
self.createDeviceFinished()
|
|||
|
|
|
|||
|
|
def copyInstruction(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instructionIndexs = self.ui.tableViewCmd.selectionModel().selectedRows()
|
|||
|
|
for instructionIndex in instructionIndexs:
|
|||
|
|
row = instructionIndex.row()
|
|||
|
|
row_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instructionManager.createCopy(instructionId)
|
|||
|
|
self.loadInstruction(devModelId)
|
|||
|
|
|
|||
|
|
#加载接口类型
|
|||
|
|
def loadInterFaceTypes(self):
|
|||
|
|
self.interfaceTypes = []
|
|||
|
|
supportedType = interfaceManager.getSupportedType()
|
|||
|
|
for type in supportedType:
|
|||
|
|
self.interfaceTypes.append(supportedType[type])
|
|||
|
|
self.interfaceTypeCombModel.clear()
|
|||
|
|
for interfaceType in self.interfaceTypes:
|
|||
|
|
index = self.interfaceTypeCombModel.rowCount()
|
|||
|
|
self.interfaceTypeCombModel.setItem(index, 0 , QStandardItem(interfaceType))
|
|||
|
|
self.batchOperation()
|
|||
|
|
|
|||
|
|
#添加接口类型
|
|||
|
|
def addInterfaceType(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
# 列表末位名称为空不允许创建
|
|||
|
|
if self.interFaceTypeModel.rowCount() > 0:
|
|||
|
|
lastIndex = self.interFaceTypeModel.rowCount() - 1
|
|||
|
|
if self.interFaceTypeModel.item(lastIndex, 0).text().strip() == "":
|
|||
|
|
self.ui.tableViewInterFaceType.edit(self.interFaceTypeModel.index(lastIndex, 0))
|
|||
|
|
return
|
|||
|
|
index = self.interFaceTypeModel.rowCount()
|
|||
|
|
if len(self.interfaceTypes) > 0:
|
|||
|
|
self.interFaceTypeModel.appendRow([QStandardItem(), QStandardItem(self.interfaceTypes[0])]) # 赋默认值
|
|||
|
|
cmb = QComboBox()
|
|||
|
|
cmb.setModel(self.interfaceTypeCombModel)
|
|||
|
|
cmb.currentIndexChanged.connect(self.changeInterfaceType)
|
|||
|
|
self.ui.tableViewInterFaceType.setIndexWidget(self.interFaceTypeModel.index(index, 1), cmb)
|
|||
|
|
self.ui.tableViewInterFaceType.setCurrentIndex(self.interFaceTypeModel.index(index, 0) )
|
|||
|
|
self.ui.tableViewInterFaceType.edit(self.interFaceTypeModel.index(index, 0))
|
|||
|
|
|
|||
|
|
#接口类型切换
|
|||
|
|
def changeInterfaceType(self, index):
|
|||
|
|
if len(self.ui.tableViewInterFaceType.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewInterFaceType.selectionModel().selectedRows()[0].row()
|
|||
|
|
self.interFaceTypeModel.setItem(row, 1, QStandardItem(self.interfaceTypes[index]))
|
|||
|
|
|
|||
|
|
#删除接口类型
|
|||
|
|
def deleteInterfaceType(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
if len(self.ui.tableViewInterFaceType.selectionModel().selectedRows()) == 1:
|
|||
|
|
row = self.ui.tableViewInterFaceType.selectionModel().selectedRows()[0].row()
|
|||
|
|
self.interFaceTypeModel.removeRow(row)
|
|||
|
|
self.updateProperty()
|
|||
|
|
#编辑模型
|
|||
|
|
def editModel(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewModel.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
data = devModelManager.getInfo(devModelId)
|
|||
|
|
if data:
|
|||
|
|
self.createModelDlg.showEditDlg(data)
|
|||
|
|
|
|||
|
|
def setSplitterStretchFactor(self):
|
|||
|
|
self.ui.splitter.setStretchFactor(0, 30)
|
|||
|
|
self.ui.splitter.setStretchFactor(1, 30)
|
|||
|
|
self.ui.splitter.setStretchFactor(2, 40)
|
|||
|
|
|
|||
|
|
def updateCmdBtnState(self):
|
|||
|
|
if len(self.ui.tableViewCmd.selectionModel().selectedRows())== 1:
|
|||
|
|
self.ui.pbEditCmd.setEnabled(True)
|
|||
|
|
self.ui.pbEditScript.setEnabled(True)
|
|||
|
|
else:
|
|||
|
|
self.ui.pbEditCmd.setEnabled(False)
|
|||
|
|
self.ui.pbEditScript.setEnabled(False)
|
|||
|
|
|
|||
|
|
# 指令列表选中
|
|||
|
|
def handleCmdSelection(self):
|
|||
|
|
indexs = self.ui.tableViewCmd.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_index = self.instructionModel.index(row, 5, QModelIndex())
|
|||
|
|
description = self.instructionModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
self.ui.textEditDescription.setEnabled(False)
|
|||
|
|
if description:
|
|||
|
|
self.ui.textEditDescription.setText(description)
|
|||
|
|
else:
|
|||
|
|
self.ui.textEditDescription.clear()
|
|||
|
|
self.updateCmdBtnState()
|
|||
|
|
# 创建指令
|
|||
|
|
def createInstruction(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
self.createInstructionDlg.showCreateDlg(devModelId)
|
|||
|
|
|
|||
|
|
def deleteInstruction(self):
|
|||
|
|
indexs = self.ui.tableViewCmd.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_id_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
row_name_index = self.instructionModel.index(row, 2, QModelIndex())
|
|||
|
|
instructionName = self.instructionModel.data(row_name_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None:#必须这样写,不能写else
|
|||
|
|
if self.topWidget.removeDialog(instructionName):
|
|||
|
|
row_id_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if instructionManager.delete(instructionId):
|
|||
|
|
self.instructionModel.removeRow(row)
|
|||
|
|
elif len(indexs) > 1:
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None: #必须这样写,不能写else
|
|||
|
|
if self.topWidget.removeDialog(f"{len(indexs)}个模型指令"):
|
|||
|
|
for index in indexs:
|
|||
|
|
row = index.row()
|
|||
|
|
row_id_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instructionManager.delete(instructionId)
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
def findTopLevelParent(self, widget):
|
|||
|
|
parent = widget.parent()
|
|||
|
|
while parent and not isinstance(parent, QMainWindow): # 假设顶层窗口是 QMainWindow
|
|||
|
|
widget = parent
|
|||
|
|
parent = widget.parent()
|
|||
|
|
return parent
|
|||
|
|
|
|||
|
|
#编辑指令
|
|||
|
|
def editInstruction(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if len(self.ui.tableViewCmd.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewCmd.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instruction = instructionManager.getInfo(instructionId)
|
|||
|
|
if instruction != None:
|
|||
|
|
self.createInstructionDlg.showEditDlg(devModelId, instruction)
|
|||
|
|
|
|||
|
|
def editScript(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
if len(self.ui.tableViewCmd.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewCmd.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.instructionModel.index(row, 0, QModelIndex())
|
|||
|
|
instructionId = self.instructionModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
instruction = instructionManager.getInfo(instructionId)
|
|||
|
|
if instruction != None:
|
|||
|
|
dataAttr = instruction.get('attr')
|
|||
|
|
if dataAttr != None:
|
|||
|
|
if dataAttr.get('script') != None:
|
|||
|
|
base64_encoded_str = dataAttr.get('script')
|
|||
|
|
result = self.codeDialog.showEditDlg(str(base64.b64decode(base64_encoded_str).decode('utf-8')))
|
|||
|
|
if result == "":
|
|||
|
|
return
|
|||
|
|
script = base64.b64encode(result.encode("utf-8")).decode('utf-8')
|
|||
|
|
dataAttr['script'] = script
|
|||
|
|
instructionManager.update(instructionId, {"attr": dataAttr})
|
|||
|
|
script = base64.b64encode(result.encode("utf-8")).decode('utf-8')
|
|||
|
|
dataAttr['script'] = script
|
|||
|
|
instructionManager.update(instructionId, {"attr": dataAttr})
|
|||
|
|
|
|||
|
|
# 导入设备模型
|
|||
|
|
def importModelBtnClick(self):
|
|||
|
|
file_dialog = QFileDialog(self)
|
|||
|
|
file_dialog.setWindowTitle("选择JSON")
|
|||
|
|
file_dialog.setNameFilter("Supported file formats (*.json)")
|
|||
|
|
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
|
|||
|
|
if file_dialog.exec():
|
|||
|
|
file_path = file_dialog.selectedFiles()[0]
|
|||
|
|
with open(file_path, "r", encoding="utf-8") as f: # 指定以utf-8编码打开文件
|
|||
|
|
devModelInfo = json.load(f)
|
|||
|
|
devModels = devModelInfo.get("devModels",[])
|
|||
|
|
instructions = devModelInfo.get("instructions",[])
|
|||
|
|
for devModel in devModels:
|
|||
|
|
devModelId = devModelManager.create_from_json(devModel)
|
|||
|
|
for instruction in instructions:
|
|||
|
|
devModelOldId = devModel["id"]
|
|||
|
|
if instruction["dev_model_id"] == devModelOldId:
|
|||
|
|
instruction["dev_model_id"] = devModelId
|
|||
|
|
instructionManager.create_from_json(instruction)
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
# 覆盖方式导入设备模型
|
|||
|
|
def overWriteModelBtnClick(self):
|
|||
|
|
file_dialog = QFileDialog(self)
|
|||
|
|
file_dialog.setWindowTitle("选择JSON")
|
|||
|
|
file_dialog.setNameFilter("Supported file formats (*.json)")
|
|||
|
|
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
|
|||
|
|
if file_dialog.exec():
|
|||
|
|
file_path = file_dialog.selectedFiles()[0]
|
|||
|
|
with open(file_path, "r", encoding="utf-8") as f: # 指定以utf-8编码打开文件
|
|||
|
|
devModelInfo = json.load(f)
|
|||
|
|
devModels = devModelInfo.get("devModels",[])
|
|||
|
|
instructions = devModelInfo.get("instructions",[])
|
|||
|
|
for devModel in devModels:
|
|||
|
|
devModelId = devModel['id']
|
|||
|
|
if devModelManager.getInfo(devModelId) != None:
|
|||
|
|
devModelManager.update(devModelId, devModel)
|
|||
|
|
else:
|
|||
|
|
devModelId = devModelManager.create_from_json(devModel)
|
|||
|
|
|
|||
|
|
for instruction in instructions:
|
|||
|
|
instructionId = instruction['id']
|
|||
|
|
if instruction["dev_model_id"] == devModelId:
|
|||
|
|
if instructionManager.getInfo(instructionId) != None:
|
|||
|
|
instructionManager.update(instructionId, instruction)
|
|||
|
|
else:
|
|||
|
|
instructionManager.create_from_json(instruction)
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
def exportModel(self):
|
|||
|
|
try:
|
|||
|
|
filename = "data.zip"
|
|||
|
|
packeagePath = filename
|
|||
|
|
fname = QFileDialog.getSaveFileName(self, '保存文件', packeagePath, 'JSON files (*.zip)')
|
|||
|
|
if fname[0]:
|
|||
|
|
packeagePath = fname[0]
|
|||
|
|
exportPath = os.path.join(os.path.dirname(__file__),"export")
|
|||
|
|
#清空exportPath目录
|
|||
|
|
common.clearDir(exportPath)
|
|||
|
|
#创建exportPath目录
|
|||
|
|
common.createDir(exportPath)
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
for index in indexs:
|
|||
|
|
row = index.row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
devmodelInfo = devModelManager.getOriginalInfo(devModelId)
|
|||
|
|
|
|||
|
|
#判断modelInfo 中的Id 长度是否小于10,如果是则改为uuid
|
|||
|
|
newdevModelId = str(uuid.uuid4())
|
|||
|
|
if len(str(devModelId)) < 10:
|
|||
|
|
devmodelInfo["id"] = newdevModelId
|
|||
|
|
common.writeJson(os.path.join(os.path.dirname(__file__),"export"),"dev_model", devmodelInfo)
|
|||
|
|
groupInfo = dmGroupManager.getInfo(devmodelInfo["group_id"])
|
|||
|
|
common.writeJson(os.path.join(os.path.dirname(__file__),"export"),"device_model_group", groupInfo)
|
|||
|
|
instructionInfos = instructionManager.getOriginalDevmodelInstructions(devModelId)
|
|||
|
|
for instructionInfo in instructionInfos:
|
|||
|
|
if len(str(instructionInfo["id"])) < 10:
|
|||
|
|
instructionInfo["id"] = str(uuid.uuid4())
|
|||
|
|
if len(devModelId) < 10:
|
|||
|
|
instructionInfo["dev_model_id"] = newdevModelId
|
|||
|
|
common.writeJson(os.path.join(os.path.dirname(__file__),"export"),"instruction", instructionInfo)
|
|||
|
|
common.writeZip(packeagePath, exportPath)
|
|||
|
|
except Exception as e:
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None:
|
|||
|
|
self.topWidget.alertDialog(e,"导出文件异常")
|
|||
|
|
|
|||
|
|
def exportModelBtnClick(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
modelInfos = []
|
|||
|
|
instructionInfos = []
|
|||
|
|
for index in indexs:
|
|||
|
|
row = index.row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
modelInfo = devModelManager.getOriginalInfo(devModelId)
|
|||
|
|
|
|||
|
|
#判断modelInfo 中的Id 长度是否小于10,如果是则改为uuid
|
|||
|
|
newdevModelId = str(uuid.uuid4())
|
|||
|
|
if len(str(devModelId)) < 10:
|
|||
|
|
modelInfo["id"] = newdevModelId
|
|||
|
|
modelInfos.append(modelInfo)
|
|||
|
|
instructionInfo = instructionManager.getOriginalDevmodelInstructions(devModelId)
|
|||
|
|
for info in instructionInfo:
|
|||
|
|
if len(str(info["id"])) < 10:
|
|||
|
|
info["id"] = str(uuid.uuid4())
|
|||
|
|
if len(devModelId) < 10:
|
|||
|
|
info["dev_model_id"] = newdevModelId
|
|||
|
|
instructionInfos = instructionInfos + instructionInfo
|
|||
|
|
devModelInfo = {
|
|||
|
|
"devModels": modelInfos,
|
|||
|
|
"instructions": instructionInfos
|
|||
|
|
}
|
|||
|
|
filename = "devModelInfo.json"
|
|||
|
|
packeagePath = filename
|
|||
|
|
fname = QFileDialog.getSaveFileName(self, '保存文件', packeagePath, 'JSON files (*.json)')
|
|||
|
|
if fname[0]:
|
|||
|
|
packeagePath = fname[0]
|
|||
|
|
with open(packeagePath, "w") as f:
|
|||
|
|
f.write(json.dumps(devModelInfo))
|
|||
|
|
|
|||
|
|
def exportAllModelBtnClick(self):
|
|||
|
|
modelInfo = devModelManager.getInfo()
|
|||
|
|
instructionInfo = instructionManager.getInfo("all")
|
|||
|
|
devModelInfo = {
|
|||
|
|
"devModels": modelInfo,
|
|||
|
|
"instructions": instructionInfo
|
|||
|
|
}
|
|||
|
|
filename = "devModelInfo.json"
|
|||
|
|
packeagePath = filename
|
|||
|
|
fname = QFileDialog.getSaveFileName(self, '保存文件', packeagePath, 'JSON files (*.json)')
|
|||
|
|
if fname[0]:
|
|||
|
|
packeagePath = fname[0]
|
|||
|
|
with open(packeagePath, "w") as f:
|
|||
|
|
f.write(json.dumps(devModelInfo))
|
|||
|
|
|
|||
|
|
# 删除设备模型
|
|||
|
|
def deleteModelBtnClick(self):
|
|||
|
|
indexs = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
if len(indexs) == 1:
|
|||
|
|
row = indexs[0].row()
|
|||
|
|
row_devModelName_index = self.devModelModel.index(row, 2, QModelIndex())
|
|||
|
|
devModelName = self.devModelModel.data(row_devModelName_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None: #必须这样写,不能写else
|
|||
|
|
if self.topWidget.removeDialog(devModelName):
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if devModelManager.delete(devModelId):
|
|||
|
|
self.clearChildrenModel()
|
|||
|
|
self.devModelModel.removeRow(row)
|
|||
|
|
elif len(indexs) > 1:
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None: #必须这样写,不能写else
|
|||
|
|
if self.topWidget.removeDialog(f"{len(indexs)}个设备模型"):
|
|||
|
|
for index in indexs:
|
|||
|
|
row = index.row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
devModelManager.delete(devModelId)
|
|||
|
|
self.refreshSelect()
|
|||
|
|
|
|||
|
|
# def resizeEvent(self, event):
|
|||
|
|
# # 在窗口或控件的尺寸发生变化时调用
|
|||
|
|
# super().resizeEvent(event)
|
|||
|
|
# self.setAllColumnWidth()
|
|||
|
|
|
|||
|
|
# 批量操作
|
|||
|
|
def batchOperation(self):
|
|||
|
|
self.setAllHorizontalHeaderLabels()
|
|||
|
|
self.hideAllColumn()
|
|||
|
|
self.setAllColumnWidth()
|
|||
|
|
|
|||
|
|
# 批量隐藏指定列
|
|||
|
|
def hideAllColumn(self):
|
|||
|
|
self.ui.tableViewModel.setColumnHidden(0, True)
|
|||
|
|
self.ui.tableViewCmd.setColumnHidden(0, True)
|
|||
|
|
self.ui.tableViewDmGroup.setColumnHidden(0, True)
|
|||
|
|
self.ui.tableViewModel.setColumnHidden(1, True)
|
|||
|
|
self.ui.tableViewCmd.setColumnHidden(1, True)
|
|||
|
|
self.ui.tableViewCmd.setColumnHidden(5, True)
|
|||
|
|
|
|||
|
|
# 批量设置列宽
|
|||
|
|
def setAllColumnWidth(self):
|
|||
|
|
try:
|
|||
|
|
if self.devModelModel.rowCount() > 0:
|
|||
|
|
# 对水平表头的所有行设置为自动调整大小以适应内容
|
|||
|
|
self.ui.tableViewModel.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Stretch)
|
|||
|
|
self.ui.tableViewModel.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.Stretch)
|
|||
|
|
|
|||
|
|
self.ui.tableViewProperty.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
|||
|
|
self.ui.tableViewInterFaceType.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
|||
|
|
if self.instructionModel.rowCount() > 0:
|
|||
|
|
self.ui.tableViewCmd.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.ResizeToContents)
|
|||
|
|
self.ui.tableViewCmd.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.Stretch)
|
|||
|
|
self.ui.tableViewCmd.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.Stretch)
|
|||
|
|
if self.dmGroupModel.rowCount() > 0:
|
|||
|
|
self.ui.tableViewDmGroup.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.Stretch)
|
|||
|
|
except Exception as e:
|
|||
|
|
print(e)
|
|||
|
|
# common.resizeNumberTableView(self.ui.tableViewModel, [2,3])
|
|||
|
|
# common.resizeNumberTableView(self.ui.tableViewCmd, [2,3,4])
|
|||
|
|
# common.resizeTableView(self.ui.tableViewProperty, [0,1])
|
|||
|
|
# common.resizeTableView(self.ui.tableViewInterFaceType, [0,1])
|
|||
|
|
|
|||
|
|
# 批量设置标题
|
|||
|
|
def setAllHorizontalHeaderLabels(self):
|
|||
|
|
self.dmGroupModel.setHorizontalHeaderLabels(["ID", "名称"])
|
|||
|
|
self.propertyModel.setHorizontalHeaderLabels([" 属性", " 值"])
|
|||
|
|
self.interFaceTypeModel.setHorizontalHeaderLabels([" 名称","类型"])
|
|||
|
|
self.devModelModel.setHorizontalHeaderLabels(["ID", "", "名称", "分类"])
|
|||
|
|
self.instructionModel.setHorizontalHeaderLabels(["ID", "", "名称", "摘要", "备注", "描述"])
|
|||
|
|
|
|||
|
|
# def refreshSelect(self):
|
|||
|
|
# selectedRows = self.ui.tableViewModel.selectionModel().selectedRows()
|
|||
|
|
# self.loadDevModel()
|
|||
|
|
# if len(selectedRows) < 1:
|
|||
|
|
# self.ui.tableViewModel.selectRow(0)
|
|||
|
|
# if len(selectedRows)== 1:
|
|||
|
|
# row = selectedRows[0].row()
|
|||
|
|
# self.ui.tableViewModel.selectRow(row)
|
|||
|
|
|
|||
|
|
def refreshSelect(self):
|
|||
|
|
selectedRows = self.ui.tableViewDmGroup.selectionModel().selectedRows()
|
|||
|
|
self.loadDmGroup()
|
|||
|
|
if len(selectedRows) < 1:
|
|||
|
|
self.ui.tableViewDmGroup.selectRow(0)
|
|||
|
|
if len(selectedRows) == 1:
|
|||
|
|
row = selectedRows[0].row()
|
|||
|
|
self.ui.tableViewDmGroup.selectRow(row)
|
|||
|
|
|
|||
|
|
def updateDevModelBtnState(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
self.ui.pbEditModel.setEnabled(True)
|
|||
|
|
self.ui.pbCopyModel.setEnabled(True)
|
|||
|
|
else:
|
|||
|
|
self.ui.pbEditModel.setEnabled(False)
|
|||
|
|
self.ui.pbCopyModel.setEnabled(False)
|
|||
|
|
|
|||
|
|
# 设备模型列表选中
|
|||
|
|
def handleDevModelSelection(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewModel.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
self.loadDevModelProperty(devModelId)
|
|||
|
|
self.loadInstruction(devModelId)
|
|||
|
|
self.updateDevModelBtnState()
|
|||
|
|
|
|||
|
|
# 任务分组选中
|
|||
|
|
def handleGroupSelection(self, index):
|
|||
|
|
if len(self.ui.tableViewDmGroup.selectionModel().selectedRows()) == 1:
|
|||
|
|
row = self.ui.tableViewDmGroup.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_id_index = self.dmGroupModel.index(row, 0, QModelIndex())
|
|||
|
|
group_id = self.dmGroupModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
self.current_groupId = group_id
|
|||
|
|
self.loadDevModel()
|
|||
|
|
self.clearChildrenModel()
|
|||
|
|
|
|||
|
|
# 加载队列组
|
|||
|
|
def loadDmGroup(self):
|
|||
|
|
self.dmGroupModel.clear()
|
|||
|
|
self.ui.textEditDescription.clear()
|
|||
|
|
groups = dmGroupManager.getInfo()
|
|||
|
|
self.dmGroupModelBlockSignals = True
|
|||
|
|
if len(groups) > 0:
|
|||
|
|
for group in groups:
|
|||
|
|
index = self.dmGroupModel.rowCount()
|
|||
|
|
self.dmGroupModel.setItem(index, 0, QStandardItem(str(group["id"])))
|
|||
|
|
self.dmGroupModel.setItem(index, 1, QStandardItem(group["name"]))
|
|||
|
|
self.dmGroupModelBlockSignals = False
|
|||
|
|
self.batchOperation()
|
|||
|
|
|
|||
|
|
# 加载设备模型
|
|||
|
|
def loadDevModel(self):
|
|||
|
|
devModels = devModelManager.getGroupDm(self.current_groupId)
|
|||
|
|
self.devModelModel.clear()
|
|||
|
|
self.ui.textEditDescription.clear()
|
|||
|
|
if len(devModels) > 0:
|
|||
|
|
for data in devModels:
|
|||
|
|
index = self.devModelModel.rowCount()
|
|||
|
|
self.devModelModel.setItem(index, 0, QStandardItem(str(data["id"])))
|
|||
|
|
self.devModelModel.setItem(index, 1, QStandardItem(str(index+1)))
|
|||
|
|
self.devModelModel.setItem(index, 2, QStandardItem(data["name"]))
|
|||
|
|
self.devModelModel.setItem(index, 3, QStandardItem(data["category"]))
|
|||
|
|
self.ui.tableViewModel.sortByColumn(2, Qt.SortOrder.AscendingOrder)
|
|||
|
|
self.batchOperation()
|
|||
|
|
|
|||
|
|
# 更新属性
|
|||
|
|
def updateProperty(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewModel.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_id_index = self.devModelModel.index(row, 0, QModelIndex())
|
|||
|
|
devModelId = self.devModelModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
#固定属性
|
|||
|
|
interfaceType = {}
|
|||
|
|
extendedProperty = {}
|
|||
|
|
modelnumber = ""
|
|||
|
|
for row in range(self.interFaceTypeModel.rowCount()):
|
|||
|
|
keyIndex = self.interFaceTypeModel.index(row, 0)
|
|||
|
|
valueIndex = self.interFaceTypeModel.index(row, 1)
|
|||
|
|
key = self.interFaceTypeModel.data(keyIndex)
|
|||
|
|
value = self.interFaceTypeModel.data(valueIndex)
|
|||
|
|
self.interFaceTypeModel.item(row, 1)
|
|||
|
|
interfaceType[key] = value
|
|||
|
|
|
|||
|
|
for row in range(self.propertyModel.rowCount()):
|
|||
|
|
if self.propertyModel.item(row, 0).text() == "设备型号":
|
|||
|
|
modelnumber = self.propertyModel.item(row, 1).text()
|
|||
|
|
else:
|
|||
|
|
if self.propertyModel.item(row, 0).text() != "":
|
|||
|
|
extendedProperty[self.propertyModel.item(row, 0).text()] = self.propertyModel.item(row, 1).text()
|
|||
|
|
|
|||
|
|
image = common.base64Data(self.ui.lbDevModelImage.pixmap().toImage())
|
|||
|
|
attr = {
|
|||
|
|
"modelnumber": modelnumber,
|
|||
|
|
"image": image,
|
|||
|
|
"extendedProperty" : extendedProperty,
|
|||
|
|
"interfaceType" : interfaceType
|
|||
|
|
}
|
|||
|
|
param = {
|
|||
|
|
"attr": attr
|
|||
|
|
}
|
|||
|
|
devModelManager.update(devModelId, param)
|
|||
|
|
|
|||
|
|
# 添加属性
|
|||
|
|
def addProperty(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
# 列表末位名称为空不允许创建
|
|||
|
|
if self.propertyModel.rowCount() > 0:
|
|||
|
|
lastIndex = self.propertyModel.rowCount() - 1
|
|||
|
|
if self.propertyModel.item(lastIndex, 0).text().strip() == "":
|
|||
|
|
self.ui.tableViewProperty.edit(self.propertyModel.index(lastIndex, 0))
|
|||
|
|
return
|
|||
|
|
index = self.propertyModel.rowCount()
|
|||
|
|
self.propertyModel.appendRow([QStandardItem(), QStandardItem()])
|
|||
|
|
self.ui.tableViewProperty.setCurrentIndex(self.propertyModel.index(index, 0) )
|
|||
|
|
self.ui.tableViewProperty.edit(self.propertyModel.index(index, 0))
|
|||
|
|
|
|||
|
|
# 删除属性
|
|||
|
|
def deleteProperty(self):
|
|||
|
|
if len(self.ui.tableViewModel.selectionModel().selectedRows())== 1:
|
|||
|
|
if len(self.ui.tableViewProperty.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewProperty.selectionModel().selectedRows()[0].row()
|
|||
|
|
if row > 0:
|
|||
|
|
self.propertyModel.removeRow(row)
|
|||
|
|
self.updateProperty()
|
|||
|
|
|
|||
|
|
#加载模型属性
|
|||
|
|
def loadDevModelProperty(self,devModelId):
|
|||
|
|
if devModelId:
|
|||
|
|
data = devModelManager.getInfo(devModelId)
|
|||
|
|
if data:
|
|||
|
|
pixmap = QPixmap()
|
|||
|
|
if "attr" in data:
|
|||
|
|
#加载属性参数
|
|||
|
|
attr_json_dict = data["attr"]
|
|||
|
|
modelnumber = ""
|
|||
|
|
if "modelnumber" in attr_json_dict:
|
|||
|
|
modelnumber = attr_json_dict["modelnumber"]
|
|||
|
|
if "image" in attr_json_dict:
|
|||
|
|
pixmap = common.base64ToPixmap(attr_json_dict["image"])
|
|||
|
|
devmodelInterfacetype = {}
|
|||
|
|
devmodelextendedProperty= {}
|
|||
|
|
if "interfaceType" in attr_json_dict:
|
|||
|
|
devmodelInterfacetype = attr_json_dict["interfaceType"]
|
|||
|
|
if "extendedProperty" in attr_json_dict:
|
|||
|
|
devmodelextendedProperty = attr_json_dict["extendedProperty"]
|
|||
|
|
|
|||
|
|
#阻塞propertyModel信号
|
|||
|
|
self.propertyModel.blockSignals(True)
|
|||
|
|
self.propertyModel.clear()
|
|||
|
|
#设备型号设置
|
|||
|
|
self.propertyModel.setItem(0, 0, QStandardItem("设备型号"))
|
|||
|
|
self.propertyModel.item(0, 0).setEditable(False)
|
|||
|
|
self.propertyModel.setItem(0, 1, QStandardItem(modelnumber))
|
|||
|
|
#扩展属性添加
|
|||
|
|
for key in devmodelextendedProperty:
|
|||
|
|
index = self.propertyModel.rowCount()
|
|||
|
|
self.propertyModel.setItem(index, 0, QStandardItem(key))
|
|||
|
|
self.propertyModel.setItem(index, 1, QStandardItem(devmodelextendedProperty[key]))
|
|||
|
|
#解除propertyModel阻塞
|
|||
|
|
self.propertyModel.blockSignals(False)
|
|||
|
|
#阻塞interFaceTypeModel信号
|
|||
|
|
self.interFaceTypeModel.blockSignals(True)
|
|||
|
|
self.interFaceTypeModel.clear()
|
|||
|
|
for interFaceType in devmodelInterfacetype:
|
|||
|
|
index = self.interFaceTypeModel.rowCount()
|
|||
|
|
self.interFaceTypeModel.setItem(index, 0, QStandardItem(interFaceType))
|
|||
|
|
self.interFaceTypeModel.setItem(index, 1,QStandardItem(devmodelInterfacetype[interFaceType]))
|
|||
|
|
cmb = QComboBox()
|
|||
|
|
cmb.setModel(self.interfaceTypeCombModel)
|
|||
|
|
cmb.setCurrentIndex(cmb.findText(devmodelInterfacetype[interFaceType]))
|
|||
|
|
cmb.currentIndexChanged.connect(self.changeInterfaceType)
|
|||
|
|
self.ui.tableViewInterFaceType.setIndexWidget(self.interFaceTypeModel.index(index, 1), cmb)
|
|||
|
|
#解除interFaceTypeModel阻塞
|
|||
|
|
self.interFaceTypeModel.blockSignals(False)
|
|||
|
|
|
|||
|
|
#设置封面
|
|||
|
|
self.ui.lbDevModelImage.setPixmap(pixmap)
|
|||
|
|
self.ui.lbDevModelImage.setScaledContents(True)
|
|||
|
|
self.ui.lbDevModelImage.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|||
|
|
self.batchOperation()
|
|||
|
|
|
|||
|
|
# 加载指令
|
|||
|
|
def loadInstruction(self,devModelId):
|
|||
|
|
try:
|
|||
|
|
result = instructionManager.getDevmodelInstructions(devModelId)
|
|||
|
|
self.instructionModel.clear()
|
|||
|
|
self.ui.textEditDescription.setText("")
|
|||
|
|
instructions = result
|
|||
|
|
for data in instructions:
|
|||
|
|
index = self.instructionModel.rowCount()
|
|||
|
|
self.instructionModel.setItem(index, 0, QStandardItem(str(data["id"])))
|
|||
|
|
self.instructionModel.setItem(index, 1, QStandardItem(str(index+1)))
|
|||
|
|
self.instructionModel.setItem(index, 2, QStandardItem(data["name"]))
|
|||
|
|
attr = data["attr"]
|
|||
|
|
if data["type"] is not None and data["type"] in self.supportedTypes:
|
|||
|
|
self.instructionModel.setItem(index, 3, QStandardItem(attr[self.supportedTypes[data["type"]]["digestAttr"]]))
|
|||
|
|
else:
|
|||
|
|
self.instructionModel.setItem(index, 3, QStandardItem(""))
|
|||
|
|
if "remark" not in attr:
|
|||
|
|
attr["remark"] = ""
|
|||
|
|
self.instructionModel.setItem(index, 4, QStandardItem(attr["remark"]))
|
|||
|
|
if "description" not in attr:
|
|||
|
|
attr["description"] = ""
|
|||
|
|
self.instructionModel.setItem(index, 5, QStandardItem(attr["description"]))
|
|||
|
|
self.ui.tableViewCmd.sortByColumn(2, Qt.SortOrder.AscendingOrder)
|
|||
|
|
self.batchOperation()
|
|||
|
|
except Exception as e:
|
|||
|
|
print(e)
|
|||
|
|
|
|||
|
|
def createGroup(self):
|
|||
|
|
index = self.dmGroupModel.rowCount()
|
|||
|
|
self.dmGroupModel.appendRow([ QStandardItem(), QStandardItem()])
|
|||
|
|
self.ui.tableViewDmGroup.setCurrentIndex(self.dmGroupModel.index(index, 0) )
|
|||
|
|
self.ui.tableViewDmGroup.edit(self.dmGroupModel.index(index, 1))
|
|||
|
|
|
|||
|
|
def deleteGroup(self):
|
|||
|
|
if len(self.ui.tableViewDmGroup.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewDmGroup.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_id_index = self.dmGroupModel.index(row, 0, QModelIndex())
|
|||
|
|
groupId = self.dmGroupModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if groupId == common.defaultGroupId:
|
|||
|
|
return
|
|||
|
|
row_groupName_index = self.dmGroupModel.index(row, 1, QModelIndex())
|
|||
|
|
groupName = self.dmGroupModel.data(row_groupName_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if self.topWidget == None:
|
|||
|
|
self.topWidget = self.findTopLevelParent(self)
|
|||
|
|
if self.topWidget != None:
|
|||
|
|
if self.devModelModel.rowCount() > 0:
|
|||
|
|
self.topWidget.alertDialog("分组下存在设备模型,不能删除分组", "警告")
|
|||
|
|
return
|
|||
|
|
if self.topWidget.removeDialog(groupName,"删除分组"):
|
|||
|
|
result = dmGroupManager.delete(groupId)
|
|||
|
|
if result == True:
|
|||
|
|
self.clearChildrenModel()
|
|||
|
|
self.dmGroupModel.removeRow(row)
|
|||
|
|
|
|||
|
|
def updateDmGroup(self):
|
|||
|
|
if len(self.ui.tableViewDmGroup.selectionModel().selectedRows())== 1:
|
|||
|
|
row = self.ui.tableViewDmGroup.selectionModel().selectedRows()[0].row()
|
|||
|
|
row_id_index = self.dmGroupModel.index(row, 0, QModelIndex())
|
|||
|
|
groupId = self.dmGroupModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
row_nane_index = self.dmGroupModel.index(row, 1, QModelIndex())
|
|||
|
|
groupName = self.dmGroupModel.data(row_nane_index, Qt.ItemDataRole.DisplayRole)
|
|||
|
|
if groupId == None and groupName.strip() != "":
|
|||
|
|
groupId = dmGroupManager.create({"name":groupName})
|
|||
|
|
self.dmGroupModel.setData(row_id_index, groupId)
|
|||
|
|
else:
|
|||
|
|
if groupName.strip() != "":
|
|||
|
|
dmGroupManager.update(groupId, {"name":groupName})
|