TG-PlatformPlus/devModelForm.py

913 lines
47 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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})