diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..f980ab9
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,7 @@
+{
+ // 使用 IntelliSense 了解相关属性。
+ // 悬停以查看现有属性的描述。
+ // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": []
+}
\ No newline at end of file
diff --git a/common/allTypesEnum.py b/common/allTypesEnum.py
new file mode 100644
index 0000000..af2e35b
--- /dev/null
+++ b/common/allTypesEnum.py
@@ -0,0 +1,18 @@
+# 该文件声明了所有和类型相关的枚举,用于选择
+
+from enum import Enum
+
+# os平台类型
+class EOSType(Enum):
+ WINDOW = 0,
+ MACOS = 1,
+ LINUX = 2,
+
+# 功能子页面枚举
+class ESubPageType(Enum):
+ AUTOPROC = 0,
+ DEVDEBUG = 1,
+ PARASETTING = 2,
+ DATAQUERY = 3,
+ RECIPEMANAGE = 4,
+ USERMANAGE = 5,
\ No newline at end of file
diff --git a/common/dbORMType.py b/common/dbORMType.py
new file mode 100644
index 0000000..0984f41
--- /dev/null
+++ b/common/dbORMType.py
@@ -0,0 +1,17 @@
+# 该文件定义了和db各个表字段对应的结构体类型
+
+# 配方管理信息表
+stuTbRecipe = {
+ 'f_proc_name' : 'none',
+ 'f_create_time' : 'none',
+ 'f_update_time' : 'none',
+ 'f_created_by' : 'none',
+}
+
+# 用户管理信息表
+stuTbUser = {
+ 'f_user_id' : 'None',
+ 'f_user_type' : 0,
+ 'f_password' : 'None',
+ 'f_create_time' : 'None',
+}
\ No newline at end of file
diff --git a/common/generalFunc.py b/common/generalFunc.py
new file mode 100644
index 0000000..0a7c859
--- /dev/null
+++ b/common/generalFunc.py
@@ -0,0 +1,49 @@
+# 该模块定义了一些通用的功能接口
+
+# 声明全局功能类
+class CCommon:
+ # 获取屏幕的分辨率
+ @staticmethod
+ def fnGetScreenRate() -> tuple[int, int]:
+ import pyautogui
+ nScreenWidth, nScreenHeight = pyautogui.size()
+ return nScreenWidth, nScreenHeight
+
+ # 获取当前时间,'xxxx/xx/xx xx:xx:xx'
+ @staticmethod
+ def fnGetCurrentTime() -> str:
+ from datetime import datetime
+ # 获取当前本地时间(datetime对象)
+ local_time = datetime.now()
+ # 格式化输出为字符串
+ return local_time.strftime("%Y-%m-%d %H:%M:%S")
+
+ # 判断内容是否符合限制要求
+ @staticmethod
+ def fnCheckInputValid(key, modifier, key_char) -> bool:
+ # 允许的控制键:退格、删除、方向键、Ctrl+A/C/V/X(全选/粘贴/剪切)
+ allowed_control_keys = (
+ 0x01000003, # 退格
+ 0x01000007, # 删除
+ 0x01000012, # 左方向键
+ 0x01000014, # 右方向键
+ 0x01000013, # 上方向键
+ 0x01000015, # 下方向键
+ 0x01000010, # 首页键
+ 0x01000011, # 尾页键
+ )
+ # 允许的功能快捷键(Ctrl+A/C/V/X)
+ if modifier == 0x04000000: # Qt.ControlModifier
+ if key in (0x41, 0x43, 0x56, 0x58): # [Qt.Key_A, Qt.Key_C, Qt.Key_V, Qt.Key_X]:
+ return True
+ # 放行控制键
+ if key in allowed_control_keys:
+ return True
+ # 允许的可打印字符:大小写字母、数字、下划线
+ # 获取按键对应的字符
+ if key_char:
+ # 判断字符是否符合规则:字母(大小写)、数字、下划线
+ if key_char.isalnum() or key_char == "_":
+ return True
+ # 其他按键一律拦截(返回True表示不处理该事件)
+ return False
diff --git a/database/._sysData.db b/database/._sysData.db
new file mode 100644
index 0000000..f45568a
Binary files /dev/null and b/database/._sysData.db differ
diff --git a/database/sysData.db b/database/sysData.db
new file mode 100644
index 0000000..b378b5c
Binary files /dev/null and b/database/sysData.db differ
diff --git a/dbCtrl/clsRecipeTb.py b/dbCtrl/clsRecipeTb.py
new file mode 100644
index 0000000..23c702d
--- /dev/null
+++ b/dbCtrl/clsRecipeTb.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+# @Time : 2026/3/6 16:28
+# @Author : reenrr
+# @File : clsRecipeTb.py
+# @Desc : 配方数据库控制器
+"""
+import copy
+
+from common.dbORMType import stuTbRecipe
+from common.generalFunc import CCommon
+from sqliteModule.sqlite_db import g_dbInst
+
+class CTbRecipeMgt:
+ # public
+ def __init__(self):
+ self._m_tbName = 't_proc_info'
+ self._m_record = [] # 存储表中记录,每条记录是一个stuTbRecipe类型
+ self._m_error: str = '' # 存储反馈的错误信息
+ self._getAllRecipeInfo() # 读取配方所有信息
+
+ pass
+
+ # 创建配方
+ def addNewRecipe(self, recipeName: str, creator: str) -> bool:
+ """
+ 创建新配方
+ :param recipeName: 配方名称
+ :param creator: 创建人
+ :return: 是否创建成功,操作成功返回True,失败返回False
+ """
+ key_list = list(stuTbRecipe.keys())
+ strTime = CCommon.fnGetCurrentTime()
+ update_time = strTime
+ strSqlCmd = ('INSERT INTO ' + self._m_tbName + '(' + key_list[0] + ',' +
+ key_list[1] + ',' + key_list[2] + ',' + key_list[3] + ') VALUES (?, ?, ?, ?)')
+ bRes = g_dbInst.execute_sql(strSqlCmd, (recipeName, strTime, update_time, creator))
+ if bRes:
+ # 更新缓存
+ stuTbRecipe[key_list[0]] = recipeName
+ stuTbRecipe[key_list[1]] = strTime
+ stuTbRecipe[key_list[2]] = update_time
+ stuTbRecipe[key_list[3]] = creator
+ other = copy.deepcopy(stuTbRecipe)
+ self._m_record.append(other)
+ return bRes
+
+ # 删除配方
+ def delRecipe(self, recipeNames: list[str]) -> bool:
+ """
+ 删除配方
+ :param recipeName: 配方名称列表
+ :return: 是否删除成功,操作成功返回True,失败返回False
+ """
+ if not recipeNames:
+ return False
+
+ # 支持批量删除
+ key_list = list(stuTbRecipe.keys())
+ placeholders = ','.join(['?'] * len(recipeNames))
+ strSqlCmd = ('DELETE FROM ' + self._m_tbName + ' WHERE ' + key_list[0] + ' IN (' + placeholders + ')')
+ bRes = g_dbInst.execute_sql(strSqlCmd, tuple(recipeNames))
+ if bRes and self._m_record:
+ # 更新缓存
+ nTotal = len(self._m_record)
+ nScan = 0
+ while nScan < nTotal:
+ recipe_name = list(self._m_record[nScan].items())[0][1]
+ if recipe_name in recipeNames:
+ self._m_record.pop(nScan)
+ nTotal -= 1
+ continue
+ nScan += 1
+
+ return bRes
+
+ # 读取所有配方名称、创建时间、更新时间、创建者
+ def readRecipeID_time_creator(self) -> list[tuple[str, str, str, str]]:
+ lstRet = []
+ if self._m_record:
+ for item in self._m_record:
+ lstSingle = list(item.items())
+ singleItem = (lstSingle[0][1], lstSingle[1][1], lstSingle[2][1], lstSingle[3][1])
+ lstRet.append(singleItem)
+ return lstRet
+
+ # 读取所有配方名称
+ def readAllRecipeNames(self) -> list:
+ lstRet = []
+ if self._m_record:
+ for item in self._m_record:
+ lstRet.append(list(item.items())[0][1])
+ return lstRet
+
+ # 更新配方
+ def updateRecipe(self) -> bool:
+ pass
+
+ # -------------------------------------------
+ # 获取错误信息
+ def getLastError(self) -> str:
+ return self._m_error
+
+ # private
+ # 读取所有配方信息到缓存
+ def _getAllRecipeInfo(self) -> None:
+ strSqlCmd = 'SELECT * FROM ' + self._m_tbName
+ allRecipes = g_dbInst.fetch_all(strSqlCmd)
+ if allRecipes:
+ theField = list(stuTbRecipe.keys())
+ for recipe in allRecipes:
+ stuTbRecipe[theField[0]] = recipe[0]
+ stuTbRecipe[theField[1]] = recipe[1]
+ stuTbRecipe[theField[2]] = recipe[2]
+ stuTbRecipe[theField[3]] = recipe[3]
+ other = copy.deepcopy(stuTbRecipe)
+ self._m_record.append(other)
+
+
+# **************************************************************
+g_recipeCtrl = CTbRecipeMgt() # 全局对象实例
+
diff --git a/dbCtrl/clsUserTb.py b/dbCtrl/clsUserTb.py
new file mode 100644
index 0000000..af713ac
--- /dev/null
+++ b/dbCtrl/clsUserTb.py
@@ -0,0 +1,145 @@
+# 文件声明了封装用户信息表相关的数据表操作
+import copy
+from common.dbORMType import stuTbUser
+from common.generalFunc import CCommon
+from sqliteModule.sqlite_db import g_dbInst
+
+# 用户类别 int ---> string
+def _int2str_usertype(userType: int) -> str:
+ from msg_dict import g_uiCtrlScript
+ if 0 == userType:
+ strRet = g_uiCtrlScript['CTRL_USER_TYPE_ADMIN']
+ elif 1 == userType:
+ strRet = g_uiCtrlScript['CTRL_USER_TYPE_TECH']
+ else:
+ strRet = g_uiCtrlScript['CTRL_USER_TYPE_OP']
+ return strRet
+
+class CTbUserMgt:
+ # public:
+ def __init__(self):
+ self._m_tbName = 't_user'
+ self._m_record = [] # 存储表中记录,每条记录是一个stuTbUser类型
+ self._m_error: str = '' # 存储反馈的错误信息
+ self._getAllUserInfo() # 读取所有用户信息
+
+ # 创建用户
+ def addNewUser(self, userID: str, userType: int) -> bool:
+ key_list = list(stuTbUser.keys())
+ strSqlCmd = ('INSERT INTO ' + self._m_tbName + '(' + key_list[0] + ',' +
+ key_list[1] + ',' + key_list[3] + ') VALUES (?, ?, ?)')
+ strTime = CCommon.fnGetCurrentTime() # 获取当前时间用于记录用户创建
+ bRes = g_dbInst.execute_sql(strSqlCmd, (userID, userType, strTime))
+ if bRes: # 更新到用户信息缓存
+ stuTbUser[key_list[0]] = userID
+ stuTbUser[key_list[1]] = userType
+ stuTbUser[key_list[3]] = strTime
+ other = copy.deepcopy(stuTbUser)
+ self._m_record.append(other)
+ return bRes
+
+ # 修改密码
+ def changePasswd(self, userID: str, userPasswd: str) -> bool:
+ keys_list = list(stuTbUser.keys()) # 转换为列表
+ strSqlCmd = 'UPDATE ' + self._m_tbName + ' SET ' + keys_list[2] + ' = ? WHERE ' + keys_list[0] + ' = ?'
+ bRes = g_dbInst.execute_sql(strSqlCmd, (userPasswd, userID))
+ if bRes and self._m_record:
+ for user in self._m_record:
+ if userID == user[keys_list[0]]:
+ user[keys_list[2]] = userPasswd
+ break
+ return bRes
+
+
+ # 删除用户
+ def delUser(self, userID: list[str]) -> bool:
+ if not userID:
+ return False
+
+ # 使用 IN 语句支持批量删除
+ keys_list = list(stuTbUser.keys())
+ placeholders = ','.join(['?'] * len(userID))
+ strSqlCmd = f'DELETE FROM {self._m_tbName} WHERE {keys_list[0]} IN ({placeholders})'
+
+ bRes = g_dbInst.execute_sql(strSqlCmd, tuple(userID))
+
+ # 删除成功了,要同步更新到缓存
+ if bRes and self._m_record:
+ nTotal = len(self._m_record)
+ nScan = 0
+ while nScan < nTotal:
+ user_id = list(self._m_record[nScan].items())[0][1]
+ if user_id in userID:
+ del self._m_record[nScan]
+ nTotal -= 1
+ continue
+ nScan += 1
+
+ return bRes
+
+ # 读取指定用户密码
+ def getPasswdByUserID(self, userID: str) -> str:
+ strRes = None
+ if self._m_record:
+ for user in self._m_record:
+ lstSingle = list(user.items())
+ if userID == lstSingle[0][1]:
+ strRes = lstSingle[2][1]
+ break
+ return strRes
+
+ # 读取所有用户id
+ def readAllUserIDs(self) -> list:
+ lstRet = []
+ if self._m_record:
+ for item in self._m_record:
+ lstRet.append(list(item.items())[0][1])
+ return lstRet
+
+ # 读取除管理员以外其他用户的id, 类别和创建日期
+ def readUserId_type_date(self) -> list[tuple[str, str, str]]:
+ lstRet = []
+ if self._m_record:
+ for user in self._m_record:
+ lstSingle = list(user.items())
+ # 只添加非管理员用户(用户类型不等于0)
+ if lstSingle[1][1] != 0:
+ # 使用_int2str_usertype转换用户类别为字符串
+ user_type_str = _int2str_usertype(lstSingle[1][1])
+ singleItem = (lstSingle[0][1], user_type_str, lstSingle[3][1])
+ lstRet.append(singleItem)
+ return lstRet
+
+ # 根据用户id获取其用户类别
+ def getUserTypeById(self, userID: str) -> str:
+ strRet = None
+ if self._m_record:
+ for item in self._m_record:
+ lstSingle = list(item.items())
+ if userID == lstSingle[0][1]:
+ strRet = _int2str_usertype(lstSingle[1][1])
+ break
+ return strRet
+
+ # -------------------------------------------
+ # 获取错误信息
+ def getLastError(self) -> str:
+ return self._m_error
+
+ # private:
+ # 一次读取所有用户信息,包括id, 类别,密码,创建日期
+ def _getAllUserInfo(self) -> None:
+ strSqlCmd = 'SELECT * FROM ' + self._m_tbName
+ allUsers = g_dbInst.fetch_all(strSqlCmd)
+ if allUsers:
+ theField = list(stuTbUser.keys())
+ for user in allUsers:
+ stuTbUser[theField[0]] = user[0]
+ stuTbUser[theField[1]] = user[1]
+ stuTbUser[theField[2]] = user[2]
+ stuTbUser[theField[3]] = user[3]
+ other = copy.deepcopy(stuTbUser)
+ self._m_record.append(other)
+
+# **************************************************************
+g_userCtrl = CTbUserMgt() # 全局对象实例
\ No newline at end of file
diff --git a/hikvision_sdk_img_get.zip b/hikvision_sdk_img_get.zip
new file mode 100644
index 0000000..38bcd82
Binary files /dev/null and b/hikvision_sdk_img_get.zip differ
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..2972808
--- /dev/null
+++ b/main.py
@@ -0,0 +1,14 @@
+# 该文件是应用程序的入口
+# main.py 程序主文件
+import sys
+
+from PySide6.QtWidgets import QApplication
+# 导入pyside6-uic生成的UI类(根据实际生成的py文件名和类名调整)
+from wndLogin.sub_uiLogin import CSubUiLogin
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ mainUI = CSubUiLogin()
+ mainUI.uiInit()
+ mainUI.show()
+ sys.exit(app.exec())
\ No newline at end of file
diff --git a/msg_dict.py b/msg_dict.py
new file mode 100644
index 0000000..9334407
--- /dev/null
+++ b/msg_dict.py
@@ -0,0 +1,78 @@
+# 该文件声明了一系列字典变量,包含界面中需要设置的文字,尺寸等相关数值,通过关键字形式给出
+# 界面文字
+g_uiCtrlScript = {
+ 'WND_TITLE_LOGIN' : '用户登录',
+ 'WND_TITLE_MAIN' : '某某控制系统',
+ 'MSG_TITLE_TIPS' : '提示',
+ 'MSG_SCRIPT_CONFIRM' : '确认要执行此项操作吗?',
+ # 状态栏标签栏文字
+ 'WND_STATUSBAR_0' : '当前时间:',
+ 'WND_STATUSBAR_1' : '当前用户:',
+ 'WND_STATUSBAR_2' : '用户类别:',
+ 'WND_STATUSBAR_3' : '作业状态:',
+ 'WND_STATUSBAR_4' : '所选配方:',
+ # 自动作业页面
+ 'PAGE_AUTOPROC_TAB_0' : '作业信息0',
+ 'PAGE_AUTOPROC_TAB_1' : '作业信息1',
+
+ # 用户类别
+ 'CTRL_USER_TYPE_ADMIN' : '管理员',
+ 'CTRL_USER_TYPE_TECH' : '技术员',
+ 'CTRL_USER_TYPE_OP' : '操作员',
+
+ # 配方管理界面
+ 'MSG_SCRIPT_INPUT_RECIPE' : '请输入配方名称',
+ 'MSG_SCRIPT_RECIPE_EXIST' : '配方名称已存在',
+ 'MSG_SCRIPT_ADD_RECIPE_SUCCESS' : '配方添加成功',
+ 'MSG_SCRIPT_ADD_RECIPE_FAIL' : '配方添加失败',
+ 'MSG_SCRIPT_DEL_RECIPE_SELECT' : '请选择要删除的配方',
+ 'MSG_SCRIPT_DEL_RECIPE_CONFIRM' : '确定要删除选中的 {} 个配方吗?',
+ 'MSG_SCRIPT_DEL_RECIPE_SUCCESS' : '配方删除成功',
+ 'MSG_SCRIPT_DEL_RECIPE_FAIL' : '配方删除失败',
+
+ # 用户管理界面
+ 'MSG_SCRIPT_INPUT_USER' : '请输入用户名',
+ 'MSG_SCRIPT_USER_EXIST' : '用户名已存在',
+ 'MSG_SCRIPT_ADD_USER_SUCCESS' : '用户添加成功',
+ 'MSG_SCRIPT_ADD_USER_FAIL' : '用户添加失败',
+ 'MSG_SCRIPT_DEL_USER_SELECT' : '请选择要删除的用户',
+ 'MSG_SCRIPT_DEL_USER_CONFIRM' : '确定要删除选中的 {} 个用户吗?',
+ 'MSG_SCRIPT_DEL_USER_SUCCESS' : '用户删除成功',
+ 'MSG_SCRIPT_DEL_USER_FAIL' : '用户删除失败',
+
+
+}
+
+# 其他
+g_otherScripts = {
+ 'OTHER_DB_PATH' : './database/sysData.db',
+ 'OTHER_SEPARATOR' : '|',
+ 'OTHER_PROC_STATE_0' : '待机中',
+ 'OTHER_PROC_STATE_1' : '运行中',
+ 'OTHER_PROC_STATE_2' : '暂停中',
+}
+
+# 错误信息
+g_errMsgText = {
+ 'ERR_INPUT_EMPTY' : '关键内容输入为空',
+ 'ERR_INPUT_INVALID' : '输入内容不正确',
+ 'ERR_AUTOPROC_BUSY' : '正在运行自动作业',
+ # --------------------------------------------------------------
+ 'ERR_DB_DISCONNECT' : '数据库连接失败: {}',
+ 'ERR_DB_CONNECT' : '数据库连接成功,文件: {}',
+ 'ERR_DB_ERROR' : '错误:数据库未连接或参数列表为空',
+ 'ERR_DB_TABLE' : '创建表失败: {}, SQL: {}',
+ 'ERR_DB_SQLCMD' : '执行SQL失败: {}, SQL: {}, 参数: {}',
+ 'ERR_DB_BATCHCMD' : '批量执行失败: {}, SQL: {}',
+ 'ERR_DB_QUERY_SINGLE': '查询单条数据失败:{},SQL:{},参数:{}',
+ 'ERR_DB_QUERY_ALL' : '查询所有数据失败: {}, SQL: {}, 参数: {}',
+
+}
+
+# 尺寸大小
+g_uiGeometrySize = {
+ 'WND_MARGIN_HORI' : 5,
+ 'WND_MARGIN_VERT' : 5,
+ 'WND_SIZE_LOGIN' : (360, 200),
+ # ......
+}
\ No newline at end of file
diff --git a/sqliteModule/sqlite_db.py b/sqliteModule/sqlite_db.py
new file mode 100644
index 0000000..e66d34c
--- /dev/null
+++ b/sqliteModule/sqlite_db.py
@@ -0,0 +1,171 @@
+# sqlite_db.py - SQLite通用操作模块,可直接导入使用
+import sqlite3
+from typing import List, Tuple, Optional, Any, Union
+from msg_dict import g_errMsgText, g_otherScripts
+
+class CSQLiteDB:
+ # private:
+ # 单例实例存储
+ _instance: Optional['CSQLiteDB'] = None
+ # 数据库连接对象
+ _conn: Optional[sqlite3.Connection] = None
+ # 错误信息
+ _errMsg: str = ''
+
+ def __new__(cls, db_file: str):
+ """单例模式:确保全局只有一个数据库连接实例"""
+ if cls._instance is None:
+ cls._instance = super().__new__(cls)
+ # 初始化数据库连接
+ cls._instance._init_connection(db_file)
+ return cls._instance
+
+ def _init_connection(self, db_file: str) -> None:
+ """初始化数据库连接,设置行工厂(可选,方便按列名取值)"""
+ try:
+ self._conn = sqlite3.connect(
+ database=db_file,
+ check_same_thread=False # 允许多线程调用(按需开启,单线程可删除)
+ )
+ # 可选:设置行工厂,查询结果可通过 列名/索引 双方式取值(如row['name']/row[1])
+ self._conn.row_factory = sqlite3.Row
+ print(g_errMsgText['ERR_DB_CONNECT'].format(db_file))
+ except sqlite3.Error as e:
+ raise ConnectionError(g_errMsgText['ERR_DB_DISCONNECT'].format(str(e)))
+
+ # public:
+ def create_table(self, create_sql: str) -> bool:
+ """
+ 创建数据表
+ :param create_sql: 创建表的SQL语句(建议带IF NOT EXISTS)
+ :return: 操作成功返回True,失败False
+ """
+ if not self._conn:
+ self._errMsg = g_errMsgText['ERR_DB_ERROR']
+ print(self._errMsg)
+ return False
+ try:
+ cursor = self._conn.cursor()
+ cursor.execute(create_sql)
+ cursor.close()
+ self._conn.commit()
+ return True
+ except sqlite3.Error as e:
+ self._conn.rollback()
+ self._errMsg = g_errMsgText['ERR_DB_TABLE'].format(str(e), create_sql)
+ print(self._errMsg)
+ return False
+
+ def execute_sql(self, sql: str, params: Tuple[Any, ...] = ()) -> bool:
+ """
+ 执行单条增/删/改SQL(自动提交事务)
+ :param sql: 增/删/改SQL语句(使用?占位符)
+ :param params: SQL参数,元组类型(无参数传空元组())
+ :return: 操作成功返回True,失败False
+ """
+ if not self._conn:
+ self._errMsg = g_errMsgText['ERR_DB_ERROR']
+ print(self._errMsg)
+ return False
+ try:
+ cursor = self._conn.cursor()
+ cursor.execute(sql, params)
+ cursor.close()
+ self._conn.commit()
+ return True
+ except sqlite3.Error as e:
+ self._conn.rollback()
+ self._errMsg = g_errMsgText['ERR_DB_SQLCMD'].format(str(e), sql, params)
+ print(self._errMsg)
+ return False
+
+ def batch_execute(self, sql: str, params_list: List[Tuple[Any, ...]]) -> bool:
+ """
+ 批量执行增/删/改SQL(效率高于单条循环,自动提交)
+ :param sql: 增/删/改SQL语句(使用?占位符)
+ :param params_list: 参数列表,每个元素为一个参数元组
+ :return: 操作成功返回True,失败False
+ """
+ if not self._conn or not params_list:
+ self._errMsg = g_errMsgText['ERR_DB_ERROR']
+ print(self._errMsg)
+ return False
+ try:
+ cursor = self._conn.cursor()
+ cursor.executemany(sql, params_list)
+ cursor.close()
+ self._conn.commit()
+ return True
+ except sqlite3.Error as e:
+ self._conn.rollback()
+ self._errMsg = g_errMsgText['ERR_DB_BATCHCMD'].format(str(e), sql)
+ print(self._errMsg)
+ return False
+
+ def fetch_one(self, sql: str, params: Tuple[Any, ...] = ()) -> Optional[Union[sqlite3.Row, Tuple]]:
+ """
+ 查询单条数据
+ :param sql: 查询SQL语句(使用?占位符)
+ :param params: SQL参数,元组类型
+ :return: 成功返回单条数据(Row对象/元组),无结果/失败返回None
+ """
+ if not self._conn:
+ self._errMsg = g_errMsgText['ERR_DB_ERROR']
+ print(self._errMsg)
+ return None
+ try:
+ cursor = self._conn.cursor()
+ cursor.execute(sql, params)
+ result = cursor.fetchone()
+ cursor.close()
+ return result
+ except sqlite3.Error as e:
+ print(g_errMsgText['ERR_DB_QUERY_SINGLE'].format(str(e), sql, params))
+ return None
+
+ def fetch_all(self, sql: str, params: Tuple[Any, ...] = ()) -> List[Union[sqlite3.Row, Tuple]]:
+ """
+ 查询所有数据
+ :param sql: 查询SQL语句(使用?占位符)
+ :param params: SQL参数,元组类型
+ :return: 成功返回数据列表(元素为Row对象/元组),失败返回空列表
+ """
+ if not self._conn:
+ self._errMsg = g_errMsgText['ERR_DB_ERROR']
+ print(self._errMsg)
+ return []
+ try:
+ cursor = self._conn.cursor()
+ cursor.execute(sql, params)
+ result = cursor.fetchall()
+ cursor.close()
+ return result
+ except sqlite3.Error as e:
+ self._errMsg = g_errMsgText['ERR_DB_QUERY_ALL'].format(str(e), sql, params)
+ print(self._errMsg)
+ return []
+
+ def fetch_scalar(self, sql: str, params: Tuple[Any, ...] = ()) -> Optional[Any]:
+ """
+ 查询单个值(如计数、求和、最大值,适合SELECT COUNT(*)等场景)
+ :param params:
+ :param sql: 查询SQL语句(使用?占位符)
+ :return: 成功返回单个值,无结果/失败返回None
+ """
+ result = self.fetch_one(sql, params)
+ return result[0] if result else None
+
+ def close(self):
+ """关闭数据库连接(程序退出时调用)"""
+ if self._conn:
+ self._conn.close()
+ self._conn = None
+ self._instance = None # 重置单例,下次调用重新初始化
+
+
+# 初始化全局通用实例
+g_dbInst = CSQLiteDB(db_file=g_otherScripts['OTHER_DB_PATH'])
+
+# 程序退出时自动关闭连接(可选)
+import atexit
+atexit.register(g_dbInst.close)
\ No newline at end of file
diff --git a/testSqlite.py b/testSqlite.py
new file mode 100644
index 0000000..06c54d7
--- /dev/null
+++ b/testSqlite.py
@@ -0,0 +1,66 @@
+# test_usage.py - 测试SQLite通用模块的使用
+from sqliteModule.sqlite_db import g_dbInst # 导入封装好的全局实例
+'''
+def test_all_operations():
+ # 1. 创建数据表(带IF NOT EXISTS,重复执行不报错)
+ create_sql = """
+ CREATE TABLE IF NOT EXISTS user (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ username TEXT NOT NULL UNIQUE,
+ age INTEGER DEFAULT 0,
+ create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ )
+ """
+ db.create_table(create_sql)
+
+ # 2. 单条插入数据(参数化,防注入)
+ insert_sql = 'INSERT INTO user (username, age) VALUES (?, ?)'
+ db.execute_sql(insert_sql, ("zhangsan", 20))
+ db.execute_sql(insert_sql, ("lisi", 25))
+
+ # 3. 批量插入数据(效率更高,适合大量数据)
+ batch_params = [("wangwu", 18), ("zhaoliu", 30), ("sunqi", 22)]
+ db.batch_execute(insert_sql, batch_params)
+
+ # 4. 更新数据(按条件更新,避免全表修改)
+ update_sql = "UPDATE user SET age = ? WHERE username = ?"
+ db.execute_sql(update_sql, (26, "lisi"))
+
+ # 5. 删除数据(按条件删除)
+ delete_sql = "DELETE FROM user WHERE username = ?"
+ db.execute_sql(delete_sql, ("zhaoliu",))
+
+ # 6. 查询单条数据(支持按列名取值,因设置了row_factory)
+ one_user = db.fetch_one("SELECT * FROM user WHERE username = ?", ("zhangsan",))
+ if one_user:
+ print("【单条查询】ID:{},用户名:{},年龄:{}".format(
+ one_user["id"], one_user["username"], one_user["age"]
+ # 也可按索引:one_user[0], one_user[1], one_user[2]
+ ))
+
+ # 7. 查询所有数据(遍历结果)
+ all_users = db.fetch_all("SELECT * FROM user ORDER BY id")
+ print("\n【所有数据查询】共{}条记录:".format(len(all_users)))
+ for user in all_users:
+ print(f"ID:{user['id']},用户名:{user['username']},年龄:{user['age']}")
+
+ # 8. 查询单个值(如统计总记录数、最大年龄)
+ total = db.fetch_scalar("SELECT COUNT(*) FROM user")
+ max_age = db.fetch_scalar("SELECT MAX(age) FROM user")
+ print(f"\n【单个值查询】总记录数:{total},最大年龄:{max_age}")
+
+ # 9. 条件查询(带参数)
+ young_users = db.fetch_all("SELECT * FROM user WHERE age < ?", (25,))
+ print("\n【条件查询】年龄小于25的用户:")
+ for user in young_users:
+ print(f"用户名:{user['username']},年龄:{user['age']}")
+'''
+
+if __name__ == "__main__":
+ # 6. 查询单条数据(支持按列名取值,因设置了row_factory)
+ one_user = g_dbInst.fetch_one("SELECT * FROM t_user WHERE f_user_id = ?", ("adm_001",))
+ if one_user:
+ print("【单条查询】ID:{},用户type:{},date:{}".format(
+ one_user[0], one_user[1], one_user[3]
+ # 也可按索引:one_user[0], one_user[1], one_user[3]
+ ))
\ No newline at end of file
diff --git a/ui/._uiPasswdChange.ui b/ui/._uiPasswdChange.ui
new file mode 100644
index 0000000..c3424d7
Binary files /dev/null and b/ui/._uiPasswdChange.ui differ
diff --git a/ui/res/wndLogin.ico b/ui/res/wndLogin.ico
new file mode 100644
index 0000000..595187d
Binary files /dev/null and b/ui/res/wndLogin.ico differ
diff --git a/ui/uiLogin.ui b/ui/uiLogin.ui
new file mode 100644
index 0000000..a1952d5
--- /dev/null
+++ b/ui/uiLogin.ui
@@ -0,0 +1,128 @@
+
+
+ dlgLogin
+
+
+
+ 0
+ 0
+ 360
+ 196
+
+
+
+ 用户登录
+
+
+
+
+ 52
+ 30
+ 67
+ 17
+
+
+
+ 用户名:
+
+
+
+
+
+ 115
+ 30
+ 201
+ 20
+
+
+
+ 10000
+
+
+
+
+
+ 37
+ 70
+ 71
+ 17
+
+
+
+ 用户类别:
+
+
+
+
+ false
+
+
+
+ 115
+ 70
+ 201
+ 20
+
+
+
+ 5
+
+
+ true
+
+
+
+
+
+ 37
+ 110
+ 71
+ 20
+
+
+
+ 用户密码:
+
+
+
+
+
+ 115
+ 110
+ 201
+ 20
+
+
+
+
+
+
+ 30
+
+
+ QLineEdit::EchoMode::Password
+
+
+ 长度30,仅限英文、数字和下划线
+
+
+
+
+
+ 190
+ 147
+ 70
+ 35
+
+
+
+ PointingHandCursor
+
+
+ 登录
+
+
+
+
+
+
diff --git a/ui/uiMain.ui b/ui/uiMain.ui
new file mode 100644
index 0000000..4a8d304
--- /dev/null
+++ b/ui/uiMain.ui
@@ -0,0 +1,298 @@
+
+
+ dlgMain
+
+
+
+ 0
+ 0
+ 1024
+ 768
+
+
+
+ XXXX控制系统
+
+
+
+
+ 10
+ 10
+ 400
+ 140
+
+
+
+
+
+
+
+
+ 20
+ 40
+ 31
+ 16
+
+
+
+ 总量:
+
+
+
+
+
+ 69
+ 37
+ 60
+ 21
+
+
+
+ 5
+
+
+ QLineEdit::EchoMode::Normal
+
+
+ Qt::AlignmentFlag::AlignCenter
+
+
+ true
+
+
+
+
+
+ 190
+ 40
+ 41
+ 16
+
+
+
+ NG量:
+
+
+
+
+
+ 250
+ 40
+ 60
+ 21
+
+
+
+ 3
+
+
+ Qt::AlignmentFlag::AlignCenter
+
+
+ true
+
+
+
+
+
+ 30
+ 90
+ 51
+ 16
+
+
+
+ 通过率:
+
+
+
+
+
+ 100
+ 90
+ 60
+ 21
+
+
+
+ 5
+
+
+ Qt::AlignmentFlag::AlignCenter
+
+
+ true
+
+
+
+
+
+
+ 419
+ 10
+ 440
+ 140
+
+
+
+
+
+
+
+
+
+ 870
+ 10
+ 140
+ 140
+
+
+
+
+
+
+
+
+ 30
+ 20
+ 95
+ 25
+
+
+
+ PointingHandCursor
+
+
+ 切换用户
+
+
+
+
+
+ 30
+ 70
+ 95
+ 25
+
+
+
+ PointingHandCursor
+
+
+ 密码修改
+
+
+
+
+
+
+ 10
+ 159
+ 131
+ 580
+
+
+
+
+
+
+
+
+ 20
+ 20
+ 90
+ 24
+
+
+
+ 自动作业
+
+
+ true
+
+
+
+
+
+ 20
+ 100
+ 90
+ 24
+
+
+
+ 设备调试
+
+
+
+
+
+ 20
+ 180
+ 90
+ 24
+
+
+
+ 参数设置
+
+
+
+
+
+ 20
+ 250
+ 90
+ 24
+
+
+
+ 数据查询
+
+
+
+
+
+ 20
+ 330
+ 90
+ 24
+
+
+
+ 配方管理
+
+
+
+
+
+ 20
+ 400
+ 90
+ 24
+
+
+
+ 用户管理
+
+
+
+
+
+
+ 389
+ 339
+ 121
+ 81
+
+
+
+ 1
+
+
+
+
+
+
+
+
diff --git a/ui/uiPasswdChange.ui b/ui/uiPasswdChange.ui
new file mode 100644
index 0000000..42e9b72
--- /dev/null
+++ b/ui/uiPasswdChange.ui
@@ -0,0 +1,154 @@
+
+
+ dlgChangePasswd
+
+
+
+ 0
+ 0
+ 375
+ 293
+
+
+
+ 登录密码修改
+
+
+
+
+ 170
+ 220
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 确 定
+
+
+
+
+
+ 131
+ 79
+ 200
+ 21
+
+
+
+ 30
+
+
+ QLineEdit::EchoMode::Password
+
+
+
+
+
+ 131
+ 178
+ 200
+ 21
+
+
+
+ 30
+
+
+ QLineEdit::EchoMode::Password
+
+
+
+
+
+ 50
+ 180
+ 60
+ 16
+
+
+
+ 密码确认:
+
+
+
+
+
+ 50
+ 35
+ 60
+ 16
+
+
+
+ 当前用户:
+
+
+
+
+
+ 131
+ 128
+ 200
+ 21
+
+
+
+ 30
+
+
+ QLineEdit::EchoMode::Password
+
+
+
+
+ false
+
+
+
+ 131
+ 33
+ 200
+ 21
+
+
+
+ 30
+
+
+ true
+
+
+
+
+
+ 62
+ 131
+ 51
+ 16
+
+
+
+ 新密码:
+
+
+
+
+
+ 62
+ 82
+ 51
+ 16
+
+
+
+ 原密码:
+
+
+
+
+
+
diff --git a/ui/uiSub_AutoPage.ui b/ui/uiSub_AutoPage.ui
new file mode 100644
index 0000000..4d08b19
--- /dev/null
+++ b/ui/uiSub_AutoPage.ui
@@ -0,0 +1,281 @@
+
+
+ pageAutoProc
+
+
+
+ 0
+ 0
+ 1696
+ 1262
+
+
+
+
+
+
+
+
+ 10
+ 10
+ 1041
+ 691
+
+
+
+ 0
+
+
+
+ 作业信息0
+
+
+
+
+ 30
+ 50
+ 951
+ 571
+
+
+
+ -
+
+
-
+
+
+ 相机0
+
+
+
+
+ 20
+ 40
+ 421
+ 231
+
+
+
+ QFrame::Shape::StyledPanel
+
+
+ QFrame::Shadow::Raised
+
+
+
+
+ -
+
+
+ 相机1
+
+
+
+
+ 20
+ 40
+ 441
+ 231
+
+
+
+ QFrame::Shape::StyledPanel
+
+
+ QFrame::Shadow::Raised
+
+
+
+
+
+
+ -
+
+
-
+
+
+ 操作作业
+
+
+
+
+ 60
+ 41
+ 110
+ 50
+
+
+
+ PointingHandCursor
+
+
+ 启动码垛作业
+
+
+
+
+ false
+
+
+
+ 60
+ 110
+ 110
+ 50
+
+
+
+ PointingHandCursor
+
+
+ 停止码垛作业
+
+
+
+
+
+ 60
+ 180
+ 110
+ 50
+
+
+
+ PointingHandCursor
+
+
+ 设备复位
+
+
+
+
+ -
+
+
+ 废料区状态
+
+
+
+
+ 20
+ 60
+ 81
+ 16
+
+
+
+ 当前废料个数:
+
+
+
+
+
+ 110
+ 50
+ 81
+ 31
+
+
+
+
+
+
+ 20
+ 120
+ 111
+ 51
+
+
+
+ 废料区清零
+
+
+
+
+
+ 110
+ 150
+ 151
+ 91
+
+
+
+ Qt::LayoutDirection::LeftToRight
+
+
+ 24
+
+
+ Qt::Orientation::Vertical
+
+
+
+
+ -
+
+
+ 作业信息
+
+
+
+
+ 20
+ 30
+ 191
+ 211
+
+
+
+ 0
+
+
+
+ 流程信息
+
+
+
+
+ 报警信息
+
+
+
+
+
+ -
+
+
+ 线条类型
+
+
+
+
+ 20
+ 30
+ 191
+ 201
+
+
+
+ QFrame::Shape::StyledPanel
+
+
+ QFrame::Shadow::Raised
+
+
+
+
+
+
+
+
+
+
+
+ 作业信息1
+
+
+
+
+
+
+
diff --git a/ui/uiSub_DevDebug.ui b/ui/uiSub_DevDebug.ui
new file mode 100644
index 0000000..9cedc47
--- /dev/null
+++ b/ui/uiSub_DevDebug.ui
@@ -0,0 +1,1015 @@
+
+
+ pageDebug
+
+
+
+ 0
+ 0
+ 653
+ 411
+
+
+
+ Form
+
+
+
+
+ -10
+ 10
+ 651
+ 421
+
+
+
+ 3
+
+
+
+ 传送带调试页面
+
+
+
+
+ 30
+ 20
+ 411
+ 291
+
+
+
+
+
+ 50
+ 120
+ 53
+ 20
+
+
+
+ 速度
+
+
+
+
+
+ 50
+ 30
+ 98
+ 19
+
+
+
+ 传送带电机1
+
+
+
+
+
+ 270
+ 30
+ 98
+ 19
+
+
+
+ 传送带电机2
+
+
+
+
+
+ 110
+ 120
+ 160
+ 22
+
+
+
+ -50
+
+
+ 50
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 290
+ 110
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-30</p></body></html>
+
+
+
+
+
+ 290
+ 150
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">50</p></body></html>
+
+
+
+
+
+ 110
+ 160
+ 160
+ 22
+
+
+
+ 0
+
+
+ 100
+
+
+ 10
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 160
+ 53
+ 20
+
+
+
+ 加速度
+
+
+
+
+
+ 290
+ 190
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">50</p></body></html>
+
+
+
+
+
+ 110
+ 200
+ 160
+ 22
+
+
+
+ 0
+
+
+ 100
+
+
+ 10
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 200
+ 53
+ 20
+
+
+
+ 减速度
+
+
+
+
+
+ 50
+ 80
+ 53
+ 20
+
+
+
+ 从机地址
+
+
+
+
+
+ 110
+ 80
+ 160
+ 22
+
+
+
+ 1
+
+
+ 10
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 290
+ 70
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1</p></body></html>
+
+
+
+
+
+ 80
+ 250
+ 75
+ 23
+
+
+
+ 同步启动
+
+
+
+
+
+ 240
+ 250
+ 75
+ 23
+
+
+
+ 同步停止
+
+
+
+
+
+
+ 舵机调试页面
+
+
+
+
+ 60
+ 30
+ 411
+ 291
+
+
+
+
+
+ 50
+ 40
+ 53
+ 20
+
+
+
+ 速度
+
+
+
+
+
+ 110
+ 40
+ 160
+ 22
+
+
+
+ -50
+
+
+ 50
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 290
+ 30
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1500</p></body></html>
+
+
+
+
+
+ 290
+ 70
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">50</p></body></html>
+
+
+
+
+
+ 110
+ 80
+ 160
+ 22
+
+
+
+ 0
+
+
+ 100
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 80
+ 53
+ 20
+
+
+
+ 加速度
+
+
+
+
+
+ 290
+ 110
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0</p></body></html>
+
+
+
+
+
+ 110
+ 120
+ 160
+ 22
+
+
+
+ 0
+
+
+ 180
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 120
+ 53
+ 20
+
+
+
+ 原点位置
+
+
+
+
+
+ 70
+ 210
+ 101
+ 23
+
+
+
+ 旋转到翻转位置
+
+
+
+
+
+ 230
+ 210
+ 75
+ 23
+
+
+
+ 旋转到原点
+
+
+
+
+
+ 50
+ 160
+ 53
+ 20
+
+
+
+ 旋转位置
+
+
+
+
+
+ 290
+ 150
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">180</p></body></html>
+
+
+
+
+
+ 110
+ 160
+ 160
+ 22
+
+
+
+ 0
+
+
+ 180
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+
+ 达妙电机调试页面
+
+
+
+
+ 80
+ 30
+ 411
+ 291
+
+
+
+
+
+ 50
+ 40
+ 53
+ 20
+
+
+
+ 速度
+
+
+
+
+
+ 110
+ 40
+ 160
+ 22
+
+
+
+ 1
+
+
+ 30
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 290
+ 30
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">30</p></body></html>
+
+
+
+
+
+ 290
+ 70
+ 51
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-282.6</p></body></html>
+
+
+
+
+
+ 110
+ 80
+ 160
+ 22
+
+
+
+ 0
+
+
+ 180
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 80
+ 53
+ 20
+
+
+
+ 吸附位置
+
+
+
+
+
+ 60
+ 210
+ 101
+ 23
+
+
+
+ 运动到吸附位置
+
+
+
+
+
+ 210
+ 210
+ 101
+ 23
+
+
+
+ 运动到放置位置
+
+
+
+
+
+ 50
+ 120
+ 53
+ 20
+
+
+
+ 放置位置
+
+
+
+
+
+ 290
+ 110
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">282.6</p></body></html>
+
+
+
+
+
+ 110
+ 120
+ 160
+ 22
+
+
+
+ 0
+
+
+ 180
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 60
+ 170
+ 101
+ 23
+
+
+
+ 设置零位
+
+
+
+
+
+ 210
+ 170
+ 101
+ 23
+
+
+
+ 复位电机
+
+
+
+
+
+
+ 挡板电机调试页面
+
+
+
+
+ 70
+ 30
+ 411
+ 291
+
+
+
+
+
+ 50
+ 40
+ 53
+ 20
+
+
+
+ 速度
+
+
+
+
+
+ 110
+ 40
+ 160
+ 22
+
+
+
+ 1
+
+
+ 3000
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 290
+ 30
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2500</p></body></html>
+
+
+
+
+
+ 290
+ 70
+ 41
+ 31
+
+
+
+ true
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">10</p></body></html>
+
+
+
+
+
+ 110
+ 80
+ 160
+ 22
+
+
+
+ 0
+
+
+ 20
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+ 50
+ 80
+ 53
+ 20
+
+
+
+ 运动圈数
+
+
+
+
+
+ 50
+ 120
+ 53
+ 20
+
+
+
+ 运动方向
+
+
+
+
+
+ 260
+ 170
+ 71
+ 23
+
+
+
+ 线条对齐
+
+
+
+
+
+ 110
+ 120
+ 151
+ 23
+
+
+ -
+
+ 正向
+
+
+ -
+
+ 反向
+
+
+
+
+
+
+ 50
+ 170
+ 71
+ 23
+
+
+
+ 开启
+
+
+
+
+
+ 150
+ 170
+ 71
+ 23
+
+
+
+ 停止
+
+
+
+
+
+
+
+
+
diff --git a/ui/uiSub_ParaSet.ui b/ui/uiSub_ParaSet.ui
new file mode 100644
index 0000000..ed44e2a
--- /dev/null
+++ b/ui/uiSub_ParaSet.ui
@@ -0,0 +1,45 @@
+
+
+ pageParaSet
+
+
+
+ 0
+ 0
+ 655
+ 398
+
+
+
+ Form
+
+
+
+
+ 10
+ 0
+ 631
+ 381
+
+
+
+ QTabWidget::TabPosition::North
+
+
+ 0
+
+
+
+ 参数页面0
+
+
+
+
+ 参数页面1
+
+
+
+
+
+
+
diff --git a/ui/uiSub_Query.ui b/ui/uiSub_Query.ui
new file mode 100644
index 0000000..0afd3a4
--- /dev/null
+++ b/ui/uiSub_Query.ui
@@ -0,0 +1,19 @@
+
+
+ pageDataQuery
+
+
+
+ 0
+ 0
+ 758
+ 516
+
+
+
+ Form
+
+
+
+
+
diff --git a/ui/uiSub_Recipe.ui b/ui/uiSub_Recipe.ui
new file mode 100644
index 0000000..f2169eb
--- /dev/null
+++ b/ui/uiSub_Recipe.ui
@@ -0,0 +1,199 @@
+
+
+ pageRecipe
+
+
+
+ 0
+ 0
+ 1024
+ 768
+
+
+
+ Form
+
+
+
+
+ 10
+ 10
+ 501
+ 121
+
+
+
+
+
+
+
+
+ 20
+ 20
+ 91
+ 16
+
+
+
+ 新建配方名称:
+
+
+
+
+
+ 121
+ 18
+ 361
+ 21
+
+
+
+ 30
+
+
+ 长度30,仅限英文、数字和下划线
+
+
+
+
+
+ 30
+ 60
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 新建配方
+
+
+
+
+
+ 160
+ 60
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 删除配方
+
+
+
+
+
+ 300
+ 60
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 更新配方
+
+
+
+
+
+
+ 520
+ 10
+ 491
+ 751
+
+
+
+
+
+
+
+
+ 20
+ 20
+ 91
+ 16
+
+
+
+ 配方详细参数:
+
+
+
+
+
+ 20
+ 50
+ 451
+ 691
+
+
+
+
+
+
+ true
+
+
+
+ 10
+ 140
+ 501
+ 621
+
+
+
+ QAbstractItemView::EditTrigger::NoEditTriggers
+
+
+ QAbstractItemView::SelectionMode::MultiSelection
+
+
+ QAbstractItemView::SelectionBehavior::SelectRows
+
+
+ 4
+
+
+ 22
+
+
+ true
+
+
+ false
+
+
+
+ 配方名称
+
+
+
+
+ 创建时间
+
+
+
+
+ 更新时间
+
+
+
+
+ 创建者
+
+
+
+
+
+
+
diff --git a/ui/uiSub_User.ui b/ui/uiSub_User.ui
new file mode 100644
index 0000000..878b51e
--- /dev/null
+++ b/ui/uiSub_User.ui
@@ -0,0 +1,229 @@
+
+
+ pageUser
+
+
+ true
+
+
+
+ 0
+ 0
+ 856
+ 493
+
+
+
+ Form
+
+
+
+
+ 10
+ 10
+ 341
+ 101
+
+
+
+
+
+
+
+
+ 20
+ 19
+ 81
+ 16
+
+
+
+ 新增用户名:
+
+
+
+
+
+ 118
+ 16
+ 201
+ 21
+
+
+
+ 30
+
+
+ 长度30,仅限英文、数字和下划线
+
+
+
+
+
+ 20
+ 60
+ 91
+ 16
+
+
+
+ 新增用户类别:
+
+
+
+
+
+ 134
+ 59
+ 61
+ 20
+
+
+
+ 技术员
+
+
+ true
+
+
+
+
+
+ 214
+ 59
+ 61
+ 20
+
+
+
+ 操作员
+
+
+
+
+
+
+ 10
+ 120
+ 341
+ 71
+
+
+
+
+
+
+
+
+ 40
+ 20
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 新增用户
+
+
+
+
+
+ 190
+ 20
+ 100
+ 41
+
+
+
+ PointingHandCursor
+
+
+ 删除用户
+
+
+
+
+
+
+ 360
+ 10
+ 411
+ 461
+
+
+
+
+
+
+
+
+ 20
+ 20
+ 61
+ 16
+
+
+
+ 用户列表:
+
+
+
+
+ true
+
+
+
+ 20
+ 40
+ 371
+ 411
+
+
+
+ QAbstractItemView::EditTrigger::NoEditTriggers
+
+
+ QAbstractItemView::SelectionMode::MultiSelection
+
+
+ QAbstractItemView::SelectionBehavior::SelectRows
+
+
+ 3
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+
+ 用户名
+
+
+
+
+ 用户类型
+
+
+
+
+ 创建时间
+
+
+
+
+
+
+
+
diff --git a/wndCtrl/stateCtrl/clsSysState_autoproc.py b/wndCtrl/stateCtrl/clsSysState_autoproc.py
new file mode 100644
index 0000000..6ca41ba
--- /dev/null
+++ b/wndCtrl/stateCtrl/clsSysState_autoproc.py
@@ -0,0 +1,22 @@
+# 该类描述和自动作业相关的状态
+
+class CStateAutoProc:
+ # private:
+ _m_bRunProc: bool = False # 标志自动作业正在运行
+ _m_bNotifyStacking: bool = False # 通知码垛作业开始
+ # public:
+ @classmethod
+ def setProcState(cls, set_state: bool) -> None:
+ cls._m_bRunProc = set_state
+
+ @classmethod
+ def getProcState(cls) -> bool:
+ return cls._m_bRunProc
+
+ @classmethod
+ def setNotifyStacking(cls, set_state: bool) -> None:
+ cls._m_bNotifyStacking = set_state
+
+ @classmethod
+ def getNotifyStacking(cls) -> bool:
+ return cls._m_bNotifyStacking
\ No newline at end of file
diff --git a/wndLogin/sub_uiLogin.py b/wndLogin/sub_uiLogin.py
new file mode 100644
index 0000000..8ebd763
--- /dev/null
+++ b/wndLogin/sub_uiLogin.py
@@ -0,0 +1,127 @@
+# 用户登录界面子类,包含和登录相关的业务逻辑
+from PySide6.QtCore import Slot, Qt, QObject, QEvent
+from PySide6.QtGui import QKeyEvent, QHideEvent
+from PySide6.QtWidgets import QMainWindow, QMessageBox
+
+from .uiLogin import Ui_dlgLogin
+from wndMain.sub_uiMain import CSubUiMain
+from dbCtrl.clsUserTb import g_userCtrl
+from common.generalFunc import CCommon
+from msg_dict import g_uiCtrlScript, g_uiGeometrySize, g_errMsgText
+
+class CSubUiLogin(QMainWindow):
+ # public:
+ def __init__(self):
+ super().__init__()
+ # 挂载UI界面:将当前业务类实例传入setupUi,UI组件成为实例属性
+ self.ui = Ui_dlgLogin()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.main = None # 主界面对象
+ pass
+
+ # 界面初始化
+ def uiInit(self):
+ # 添加其他和界面或控件初始化相关的操作
+ # 需要设置窗体固定大小
+ self.setFixedSize(g_uiGeometrySize['WND_SIZE_LOGIN'][0], g_uiGeometrySize['WND_SIZE_LOGIN'][1])
+ self.setWindowTitle(g_uiCtrlScript['WND_TITLE_LOGIN']) #设置窗口标题
+ self._changeLine_edit() # 设置密码输入框掩码和输入限制
+ self._changeWndStyle() # 修改窗体属性
+ self._centerWidget() # 居中显示
+ self._initUserCombox() # 加载所有用户id
+
+ self.ui.editPasswd_login.setText('000')
+ #---------------------------------------------------------------
+ self._setupSignalSlotMapping()
+ pass
+
+ #-----------------------------------------
+ # private:
+ # 窗口居中显示
+ def _centerWidget(self):
+ self.centralWidget()
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self):
+ self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.CustomizeWindowHint | Qt.WindowType.WindowCloseButtonHint)
+
+ # 设置密码输入框属性
+ def _changeLine_edit(self):
+ self.ui.editPasswd_login.installEventFilter(self) # 建立事件触发
+
+ # -----------业务逻辑--------------
+ # 初始化用户信息下拉列表框
+ def _initUserCombox(self):
+ if 0 < self.ui.cmbUserID_login.count():
+ self.ui.cmbUserID_login.clear()
+ lstUserIds = g_userCtrl.readAllUserIDs()
+ if lstUserIds: self.ui.cmbUserID_login.addItems(lstUserIds)
+ self.ui.cmbUserID_login.setCurrentIndex(-1)
+
+ # 界面控件刷新
+ def _refreshCtrls(self):
+ # 该函数用于当用户注销,登录界面重现时,将原先登录所做出的选项从控件上清空
+ self.ui.cmbUserID_login.setCurrentIndex(-1)
+ self.ui.edtUserType_login.clear()
+ self.ui.editPasswd_login.clear()
+
+ # 检测登录相关选项是否符合要求
+ def _checkLoginReqeust(self) -> tuple[bool, str, str]:
+ nIndex = self.ui.cmbUserID_login.currentIndex() # 获取当前索引以定位文本
+ strPasswd = [self.ui.editPasswd_login.text(), '']
+ # 检测是否选择了要登录的用户名和输入了密码
+ if -1 == nIndex or not strPasswd[0]:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_errMsgText['ERR_INPUT_EMPTY'])
+ return False, '', ''
+ # 检测密码是否正确
+ strUser = self.ui.cmbUserID_login.itemText(nIndex)
+ strUserType = self.ui.edtUserType_login.text()
+ strPasswd[1] = g_userCtrl.getPasswdByUserID(strUser)
+ if strPasswd[0] != strPasswd[1]:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_errMsgText['ERR_INPUT_INVALID'])
+ return False, '', ''
+ else:
+ return True, strUser, strUserType
+
+ # -------------------------------------------
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self):
+ self.ui.btnDoLogin_login.clicked.connect(self._onBtnMainDoLogin) #系统登录
+ self.ui.cmbUserID_login.currentIndexChanged.connect(self._onCmbBoxIndexChanged)
+ pass
+
+ # ----------槽函数----------
+ @Slot()
+ def _onBtnMainDoLogin(self):
+ checkRet = self._checkLoginReqeust() # 先检测是否符合登录要求
+ if checkRet[0]:
+ self.hide() # 先隐藏当前窗口,效果平滑
+ self.main = CSubUiMain(checkRet[1], checkRet[2], self)
+ self.main.uiInit()
+ self.main.show()
+
+ @Slot()
+ def _onCmbBoxIndexChanged(self, nIndex: int):
+ self.ui.edtUserType_login.setText(g_userCtrl.getUserTypeById(self.ui.cmbUserID_login.itemText(nIndex)))
+
+ # ---------事件重载---------
+ def eventFilter(self, obj: QObject, event):
+ # 处理对应输入框的键盘事件
+ if obj == self.ui.editPasswd_login and QEvent.Type.KeyPress == event.type():
+ clsKeyEvent = QKeyEvent(event)
+ key = clsKeyEvent.key()
+ modifier = clsKeyEvent.modifiers()
+ key_char = clsKeyEvent.text()
+ return super().eventFilter(obj, event) if CCommon.fnCheckInputValid(key, modifier, key_char) else True
+ elif QEvent.Type.Show == event.type():
+ self._initUserCombox()
+ return super().eventFilter(obj, event)
+ # 非输入框/非键盘按下事件,按默认逻辑处理
+ return super().eventFilter(obj, event)
+
+ def hideEvent(self, event: QHideEvent):
+ super().hideEvent(event)
+ self._refreshCtrls()
+ pass
\ No newline at end of file
diff --git a/wndLogin/uiLogin.py b/wndLogin/uiLogin.py
new file mode 100644
index 0000000..8320682
--- /dev/null
+++ b/wndLogin/uiLogin.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiLogin.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.3
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QComboBox, QLabel, QLineEdit,
+ QPushButton, QSizePolicy, QWidget)
+
+class Ui_dlgLogin(object):
+ def setupUi(self, dlgLogin):
+ if not dlgLogin.objectName():
+ dlgLogin.setObjectName(u"dlgLogin")
+ dlgLogin.resize(360, 196)
+ self.lblUserID_login = QLabel(dlgLogin)
+ self.lblUserID_login.setObjectName(u"lblUserID_login")
+ self.lblUserID_login.setGeometry(QRect(52, 30, 67, 17))
+ self.cmbUserID_login = QComboBox(dlgLogin)
+ self.cmbUserID_login.setObjectName(u"cmbUserID_login")
+ self.cmbUserID_login.setGeometry(QRect(115, 30, 201, 20))
+ self.cmbUserID_login.setMaxCount(10000)
+ self.lblUserType_login = QLabel(dlgLogin)
+ self.lblUserType_login.setObjectName(u"lblUserType_login")
+ self.lblUserType_login.setGeometry(QRect(37, 70, 71, 17))
+ self.edtUserType_login = QLineEdit(dlgLogin)
+ self.edtUserType_login.setObjectName(u"edtUserType_login")
+ self.edtUserType_login.setEnabled(False)
+ self.edtUserType_login.setGeometry(QRect(115, 70, 201, 20))
+ self.edtUserType_login.setMaxLength(5)
+ self.edtUserType_login.setReadOnly(True)
+ self.lblPassword_login = QLabel(dlgLogin)
+ self.lblPassword_login.setObjectName(u"lblPassword_login")
+ self.lblPassword_login.setGeometry(QRect(37, 110, 71, 20))
+ self.editPasswd_login = QLineEdit(dlgLogin)
+ self.editPasswd_login.setObjectName(u"editPasswd_login")
+ self.editPasswd_login.setGeometry(QRect(115, 110, 201, 20))
+ self.editPasswd_login.setMaxLength(30)
+ self.editPasswd_login.setEchoMode(QLineEdit.EchoMode.Password)
+ self.btnDoLogin_login = QPushButton(dlgLogin)
+ self.btnDoLogin_login.setObjectName(u"btnDoLogin_login")
+ self.btnDoLogin_login.setGeometry(QRect(190, 147, 70, 35))
+ self.btnDoLogin_login.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+
+ self.retranslateUi(dlgLogin)
+
+ QMetaObject.connectSlotsByName(dlgLogin)
+ # setupUi
+
+ def retranslateUi(self, dlgLogin):
+ dlgLogin.setWindowTitle(QCoreApplication.translate("dlgLogin", u"\u7528\u6237\u767b\u5f55", None))
+ self.lblUserID_login.setText(QCoreApplication.translate("dlgLogin", u"\u7528\u6237\u540d\uff1a", None))
+ self.lblUserType_login.setText(QCoreApplication.translate("dlgLogin", u"\u7528\u6237\u7c7b\u522b\uff1a", None))
+ self.lblPassword_login.setText(QCoreApplication.translate("dlgLogin", u"\u7528\u6237\u5bc6\u7801\uff1a", None))
+ self.editPasswd_login.setInputMask("")
+ self.editPasswd_login.setPlaceholderText(QCoreApplication.translate("dlgLogin", u"\u957f\u5ea630\uff0c\u4ec5\u9650\u82f1\u6587\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf", None))
+ self.btnDoLogin_login.setText(QCoreApplication.translate("dlgLogin", u"\u767b\u5f55", None))
+ # retranslateUi
+
diff --git a/wndMain/MvImport/CameraParams_const.py b/wndMain/MvImport/CameraParams_const.py
new file mode 100644
index 0000000..f63294e
--- /dev/null
+++ b/wndMain/MvImport/CameraParams_const.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+## @~chinese 设备类型定义 @~english Device Type Definition
+MV_UNKNOW_DEVICE = 0x00000000 ## @~chinese 未知设备类型,保留意义 @~english Unknown Device Type, Reserved
+MV_GIGE_DEVICE = 0x00000001 ## @~chinese GigE设备 @~english GigE Device
+MV_1394_DEVICE = 0x00000002 ## @~chinese 1394-a/b 设备 @~english 1394-a/b Device
+MV_USB_DEVICE = 0x00000004 ## @~chinese USB 设备 @~english USB Device
+MV_CAMERALINK_DEVICE = 0x00000008 ## @~chinese CameraLink设备 @~english CameraLink Device
+MV_VIR_GIGE_DEVICE = 0x00000010 ## @~chinese 虚拟GigE设备 @~english Virtual GigE Device
+MV_VIR_USB_DEVICE = 0x00000020 ## @~chinese 虚拟USB设备 @~english Virtual USB Device
+MV_GENTL_GIGE_DEVICE = 0x00000040 ## @~chinese 自研网卡下GigE设备 @~english GenTL GigE Device
+MV_GENTL_CAMERALINK_DEVICE = 0x00000080 ## @~chinese CameraLink设备 @~english GenTL CameraLink Device
+MV_GENTL_CXP_DEVICE = 0x00000100 ## @~chinese CoaXPress设备 @~english GenTL CoaXPress Device
+MV_GENTL_XOF_DEVICE = 0x00000200 ## @~chinese XoF设备 @~english GenTL XoF Device
+MV_GENTL_VIR_DEVICE = 0x00000800 ## @~chinese 虚拟采集卡下的设备,不支持虚拟GEV采集卡下的设备 @~english GenTL Virtual Device,not supports GenTL virtual GigE device
+
+## @~chinese 采集卡类型 @~english Interface type
+MV_GIGE_INTERFACE = 0x00000001 ## @~chinese GigE Vision采集卡 @~english GigE Vision interface
+MV_CAMERALINK_INTERFACE = 0x00000004 ## @~chinese Camera Link采集卡 @~english Camera Link interface
+MV_CXP_INTERFACE = 0x00000008 ## @~chinese CoaXPress采集卡 @~english CoaXPress interface
+MV_XOF_INTERFACE = 0x00000010 ## @~chinese XoFLink采集卡 @~english XoFLink interface
+MV_VIR_INTERFACE = 0x00000020 ## @~chinese 虚拟采集卡 @~english Virtual interface
+MV_LC_INTERFACE = 0x00000040 ## @~chinese 光源控制卡 @~english Light Controller interface
+
+
+
+INFO_MAX_BUFFER_SIZE = 64 ## @~chinese 最大的数据信息大小 @~english Maximum data information size
+
+MV_MAX_TLS_NUM = 8 ## @~chinese 最多支持的传输层实例个数 @~english The maximum number of supported transport layer instances
+MV_MAX_DEVICE_NUM = 256 ## @~chinese 最大支持的设备个数 @~english The maximum number of supported devices
+
+MV_MAX_INTERFACE_NUM = 64 #< \~chinese 最大支持的采集卡数量 @~english The maximum number of Frame Grabber interface supported
+
+MV_MAX_SERIAL_PORT_NUM = 64 ## @~chinese 最大支持的串口数量 @~english The maximum number of serial port supported
+
+MV_MAX_GENTL_IF_NUM = 256 ## @~chinese 最大支持的GenTL数量 @~english The maximum number of GenTL supported
+MV_MAX_GENTL_DEV_NUM = 256 ## @~chinese 最大支持的GenTL设备数量 @~english The maximum number of GenTL devices supported
+
+## @~chinese 设备的访问模式 @~english Device Access Mode
+## @~chinese 独占权限,其他APP只允许读CCP寄存器 @~english Exclusive authority, other APP is only allowed to read the CCP register
+MV_ACCESS_Exclusive = 1
+## @~chinese 可以从5模式下抢占权限,然后以独占权限打开 @~english You can seize the authority from the 5 mode, and then open with exclusive authority
+MV_ACCESS_ExclusiveWithSwitch = 2
+## @~chinese 控制权限,其他APP允许读所有寄存器 @~english Control authority, allows other APP reading all registers
+MV_ACCESS_Control = 3
+## @~chinese 可以从5的模式下抢占权限,然后以控制权限打开 @~english You can seize the authority from the 5 mode, and then open with control authority
+MV_ACCESS_ControlWithSwitch = 4
+## @~chinese 以可被抢占的控制权限打开 @~english Open with seized control authority
+MV_ACCESS_ControlSwitchEnable = 5
+## @~chinese 可以从5的模式下抢占权限,然后以可被抢占的控制权限打开 @~english You can seize the authority from the 5 mode, and then open with seized control authority
+MV_ACCESS_ControlSwitchEnableWithKey = 6
+## @~chinese 读模式打开设备,适用于控制权限下 @~english Open with read mode and is available under control authority
+MV_ACCESS_Monitor = 7
+
+## @~chinese 信息类型 @~english Information Type
+MV_MATCH_TYPE_NET_DETECT = 0x00000001 ## @~chinese 网络流量和丢包信息 @~english Network traffic and packet loss information
+MV_MATCH_TYPE_USB_DETECT = 0x00000002 ## @~chinese host接收到来自U3V设备的字节总数 @~english The total number of bytes host received from U3V device
+
+## @~chinese GigEVision IP配置 @~english GigEVision IP Configuration
+MV_IP_CFG_STATIC = 0x05000000 ## @~chinese 静态 @~english Static
+MV_IP_CFG_DHCP = 0x06000000 ## @~chinese DHCP @~english DHCP
+MV_IP_CFG_LLA = 0x04000000 ## @~chinese LLA @~english LLA
+
+## @~chinese GigEVision网络传输模式 @~english GigEVision Net Transfer Mode
+MV_NET_TRANS_DRIVER = 0x00000001 ## @~chinese 驱动 @~english Driver
+MV_NET_TRANS_SOCKET = 0x00000002 ## @~chinese Socket @~english Socket
+
+## @~chinese CameraLink波特率 @~english CameraLink Baud Rates (CLUINT32)
+MV_CAML_BAUDRATE_9600 = 0x00000001 ## @~chinese 9600 @~english 9600
+MV_CAML_BAUDRATE_19200 = 0x00000002 ## @~chinese 19200 @~english 19200
+MV_CAML_BAUDRATE_38400 = 0x00000004 ## @~chinese 38400 @~english 38400
+MV_CAML_BAUDRATE_57600 = 0x00000008 ## @~chinese 57600 @~english 57600
+MV_CAML_BAUDRATE_115200 = 0x00000010 ## @~chinese 115200 @~english 115200
+MV_CAML_BAUDRATE_230400 = 0x00000020 ## @~chinese 230400 @~english 230400
+MV_CAML_BAUDRATE_460800 = 0x00000040 ## @~chinese 460800 @~english 460800
+MV_CAML_BAUDRATE_921600 = 0x00000080 ## @~chinese 921600 @~english 921600
+MV_CAML_BAUDRATE_AUTOMAX = 0x40000000 ## @~chinese 最大值 @~english Auto Max
+
+## @~chinese 异常消息类型 @~english Exception message type
+MV_EXCEPTION_DEV_DISCONNECT = 0x00008001 ## @~chinese 设备断开连接 @~english The device is disconnected
+MV_EXCEPTION_VERSION_CHECK = 0x00008002 ## @~chinese SDK与驱动版本不匹配 @~english SDK does not match the driver version
+
+
+MAX_EVENT_NAME_SIZE = 128 ## @~chinese 设备Event事件名称最大长度 @~english Max length of event name
+MV_MAX_NODE_NUM = 1024 ## @~chinese 最大节点个数 @~english Max Number of Nodes
+MV_MAX_NODE_NAME_LEN = 64 ## @~chinese 节点名称的最大长度 @~english Max Length of a Node Name
+MV_MAX_NODE_ERROR_NUM = 64 ## @~chinese 最大错误个数 @~english Max Number of Error
+
+
+MV_MAX_XML_SYMBOLIC_NUM = 64 ## @~chinese 最大XML符号数 @~english Max XML Symbolic Number
+MV_MAX_ENUM_SYMBOLIC_NUM = 256 ## @~chinese 最大枚举条目对应的符号数量 @~english Max Enum Entry Symbolic Number
+MV_MAX_SYMBOLIC_LEN = 64 ## @~chinese 最大枚举条目对应的符号长度 @~english Max Enum Entry Symbolic Number
+
+MV_MAX_SPLIT_NUM = 8 ## @~chinese 分时曝光时最多将源图像拆分的个数 @~english The maximum number of source image to be split in time-division exposure
+
diff --git a/wndMain/MvImport/CameraParams_header.py b/wndMain/MvImport/CameraParams_header.py
new file mode 100644
index 0000000..1caf207
--- /dev/null
+++ b/wndMain/MvImport/CameraParams_header.py
@@ -0,0 +1,1700 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import platform
+
+from ctypes import *
+from CameraParams_const import *
+from PixelType_header import *
+
+from CameraParams_const import *
+from PixelType_header import *
+
+STRING = c_char_p
+
+## @~chinese 设备排序方式 @~english The Method of Sorting
+SortMethod_SerialNumber = 0 ## @~chinese 按序列号排序 @~english Sorting by SerialNumber
+SortMethod_UserID = 1 ## @~chinese 按用户自定义名字排序 @~english Sorting by UserID
+SortMethod_CurrentIP_ASC = 2 ## @~chinese 按当前IP地址排序(升序) @~english Sorting by current IP(Ascending)
+SortMethod_CurrentIP_DESC = 3 ## @~chinese 按当前IP地址排序(降序) @~english Sorting by current IP(Descending)
+
+
+## @~chinese 取流策略 @~english The strategy of Grabbing
+MV_GrabStrategy_OneByOne = 0 ## @~chinese 从旧到新一帧一帧的获取图像 @~english Frame by frame from old to new
+MV_GrabStrategy_LatestImagesOnly = 1 ## @~chinese 获取列表中最新的一帧图像(同时清除列表中的其余图像) @~english Gets the most recent image in the list (while clearing the rest of the images in the list)
+MV_GrabStrategy_LatestImages = 2 ## @~chinese 获取列表中最新的图像 @~english Gets the latest image in the list
+MV_GrabStrategy_UpcomingImage = 3 ## @~chinese 等待下一帧图像 @~english Wait for the next image
+
+
+## @~chinese 保存的3D数据格式 @~english The saved format for 3D data
+MV_PointCloudFile_Undefined = 0 ## @~chinese 未定义的点云格式 @~english Undefined point cloud format
+MV_PointCloudFile_PLY = 1 ## @~chinese PLY点云格式 @~english The point cloud format named PLY
+MV_PointCloudFile_CSV = 2 ## @~chinese CSV点云格式 @~english The point cloud format named CSV
+MV_PointCloudFile_OBJ = 3 ## @~chinese OBJ点云格式 @~english The point cloud format named OBJ
+
+## @~chinese 保存图片格式 @~english Save image type
+MV_Image_Undefined = 0 ## @~chinese 未定义的图像类型 @~english Image undefined
+MV_Image_Bmp = 1 ## @~chinese Bmp格式 @~english Bmp image file
+MV_Image_Jpeg = 2 ## @~chinese Jpeg格式 @~english Jpeg image file
+MV_Image_Png = 3 ## @~chinese Png格式 @~english Png image file
+MV_Image_Tif = 4 ## @~chinese Tif格式 @~english Tif image file
+
+
+## @~chinese 旋转角度 @~english Rotation angle
+MV_IMAGE_ROTATE_90 = 1 ## @~chinese 旋转90度 @~english Rotate 90 degrees
+MV_IMAGE_ROTATE_180 = 2 ## @~chinese 旋转180度 @~english Rotate 180 degrees
+MV_IMAGE_ROTATE_270 = 3 ## @~chinese 旋转270度 @~english Rotate 270 degrees
+
+## @~chinese 翻转类型 @~english Flip type
+MV_FLIP_VERTICAL = 1 ## @~chinese 垂直翻转 @~english flip vertical
+MV_FLIP_HORIZONTAL = 2 ## @~chinese 水平翻转 @~english flip horizontal
+
+## @~chinese Gamma类型 @~english Gamma type
+MV_CC_GAMMA_TYPE_NONE = 0 ## @~chinese 不启用 @~english Disable
+MV_CC_GAMMA_TYPE_VALUE = 1 ## @~chinese Gamma值 @~english Gamma value
+MV_CC_GAMMA_TYPE_USER_CURVE = 2 ## @~chinese Gamma曲线 @~english Gamma curve
+MV_CC_GAMMA_TYPE_LRGB2SRGB = 3 ## @~chinese linear RGB to sRGB @~english linear RGB to sRGB
+MV_CC_GAMMA_TYPE_SRGB2LRGB = 4 ## @~chinese sRGB to linear RGB(仅色彩插值时支持,色彩校正时无效) @~english sRGB to linear RGB
+
+## @~chinese 录像格式定义 @~english Record Format Type
+MV_FormatType_Undefined = 0 ## @~chinese 未定义的格式类型 @~english Undefined format type
+MV_FormatType_AVI = 1 ## @~chinese AVI视频格式 @~english AVI format type
+
+
+## @~chinese 采集模式 @~english Acquisition mode
+MV_ACQ_MODE_SINGLE = 0 ## @~chinese 单帧模式 @~english Single Mode
+MV_ACQ_MODE_MUTLI = 1 ## @~chinese 多帧模式 @~english Multi Mode
+MV_ACQ_MODE_CONTINUOUS = 2 ## @~chinese 持续采集模式 @~english Continuous Mode
+
+## @~chinese 增益模式 @~english Gain Mode
+MV_GAIN_MODE_OFF = 0 ## @~chinese 关闭增益模式 @~english Gain mode off
+MV_GAIN_MODE_ONCE = 1 ## @~chinese 单次 @~english Gain Mode Once
+MV_GAIN_MODE_CONTINUOUS = 2 ## @~chinese 连续 @~english Gain Mode Continuous
+
+
+## @~chinese 曝光模式 @~english Exposure Mode
+MV_EXPOSURE_MODE_TIMED = 0 ## @~chinese 曝光超时模式 @~english exposure mode timed
+MV_EXPOSURE_MODE_TRIGGER_WIDTH = 1 ## @~chinese 曝光模式触发宽 @~english Trigger width
+
+
+
+## @~chinese 自动曝光模式 @~english Auto Exposure Mode
+MV_EXPOSURE_AUTO_MODE_OFF = 0 ## @~chinese 关闭自动曝光模式 @~english Exposure auto mode off
+MV_EXPOSURE_AUTO_MODE_ONCE = 1 ## @~chinese 单次自动曝光模式 @~english Exposure auto mode once
+MV_EXPOSURE_AUTO_MODE_CONTINUOUS = 2 ## @~chinese 自动连续曝光模式 @~english Exposure auto mode continuous
+
+## @~chinese 触发模式 @~english Trigger Mode
+MV_TRIGGER_MODE_OFF = 0 ## @~chinese 关闭 @~english Off
+MV_TRIGGER_MODE_ON = 1 ## @~chinese 打开 @~english On
+
+
+
+## @~chinese Gamma选择器 @~english Gamma Selector
+MV_GAMMA_SELECTOR_USER = 1 ## @~chinese gamma选择项User @~english This enumeration selects the type of gamma to apply
+MV_GAMMA_SELECTOR_SRGB = 2 ## @~chinese gamma选择项SRGB @~english This enumeration selects the type of gamma to apply
+
+
+## @~chinese 白平衡 @~english White Balance
+MV_BALANCEWHITE_AUTO_OFF = 0 ## @~chinese 白平衡自动关闭 @~english Balance white auto off
+MV_BALANCEWHITE_AUTO_CONTINUOUS = 1 ## @~chinese 白平衡自动连续 @~english Balance white auto continuous
+MV_BALANCEWHITE_AUTO_ONCE = 2 ## @~chinese 单次自动白平衡 @~english Balance white auto once
+
+
+## @~chinese 触发源 @~english Trigger Source
+MV_TRIGGER_SOURCE_LINE0 = 0 ## @~chinese LINE0 触发源 @~english Trigger source line0
+MV_TRIGGER_SOURCE_LINE1 = 1 ## @~chinese LINE1 触发源 @~english Trigger source line1
+MV_TRIGGER_SOURCE_LINE2 = 2 ## @~chinese LINE2 触发源 @~english Trigger source line2
+MV_TRIGGER_SOURCE_LINE3 = 3 ## @~chinese LINE3 触发源 @~english Trigger source line3
+MV_TRIGGER_SOURCE_COUNTER0 = 4 ## @~chinese 触发源计数器 @~english Trigger source conuter
+MV_TRIGGER_SOURCE_SOFTWARE = 7 ## @~chinese 软触发 @~english Trigger source software
+MV_TRIGGER_SOURCE_FrequencyConverter = 8 ## @~chinese 触发源变频器 @~english Trigger source frequency converter
+
+
+## @~chinese 图像扩展信息的类型 MV_FRAME_EXTRA_INFO_TYPE @~english Image Extended Information Type: MV_FRAME_EXTRA_INFO_TYPE
+MV_FRAME_EXTRA_NO_INFO = 0x0000 ## @~chinese 没有扩展信息
+MV_FRAME_EXTRA_SUBIMAGES = 0x0001 ## @~chinese 子图
+MV_FRAME_EXTRA_MULTIPARTS = 0x0002 ## @~chinese 多部分
+
+## @~chinese ZONE方向(自上而下或者自下而上) MV_GIGE_ZONE_DIRECTION @~english Zone Direction (Top to Bottom or Bottom to Top) - MV_GIGE_ZONE_DIRECTION (system variable)
+MV_GIGE_PART_ZONE_TOP_DOWN = 0
+MV_GIGE_PART_ZONE_BOTTOM_UP = 1
+
+## @~chinese 数据类型 MV_MULTI_PART_DATA_TYPE @~english Data Type: MV_MULTI_PART_DATA_TYPE
+MV_GIGE_DT_2D_IMAGE_1_PLANAR = 0x0001
+MV_GIGE_DT_2D_IMAGE_2_PLANAR = 0x0002
+MV_GIGE_DT_2D_IMAGE_3_PLANAR = 0x0003
+MV_GIGE_DT_2D_IMAGE_4_PLANAR = 0x0004
+MV_GIGE_DT_3D_IMAGE_1_PLANAR = 0x0005
+MV_GIGE_DT_3D_IMAGE_2_PLANAR = 0x0006
+MV_GIGE_DT_3D_IMAGE_3_PLANAR = 0x0007
+MV_GIGE_DT_3D_IMAGE_4_PLANAR = 0x0008
+MV_GIGE_DT_CONFIDENCE_MAP = 0x0009
+MV_GIGE_DT_CHUNK_DATA = 0x000A
+MV_GIGE_DT_JPEG_IMAGE = 0x000B
+MV_GIGE_DT_JPEG2000_IMAGE = 0x000C
+
+## @~chinese 流异常类型 @~english Stream Anomaly Type
+MV_CC_STREAM_EXCEPTION_ABNORMAL_IMAGE = 0x4001 ## @~chinese 图像异常(图像长度不正确、数据包内容解析异常和校验失败等),丢弃该帧(可能原因:链路传输异常和设备发包异常等) @~english Image anomaly (incorrect image length, data packet content parsing error, checksum failure, etc.): discard the frame. Possible causes: link transmission anomalies, device packet transmission anomalies, etc.
+MV_CC_STREAM_EXCEPTION_LIST_OVERFLOW = 0x4002 ## @~chinese 缓存列表已满(没有及时取走图像),采集卡下相机和单USB口相机不支持 @~english The cache list is full (due to images not being retrieved in time). Cameras under the capture card and single USB port cameras are not supported.
+MV_CC_STREAM_EXCEPTION_LIST_EMPTY = 0x4003 ## @~chinese 缓存列表为空(取走图像后未及时将图像缓存归还) @~english The cache list is empty (the image was taken from the cache but not returned in time).
+MV_CC_STREAM_EXCEPTION_RECONNECTION = 0x4004 ## @~chinese 触发一次断流恢复(仅U3V支持) @~english Trigger a stream recovery (supported only by U3V)
+MV_CC_STREAM_EXCEPTION_DISCONNECTED = 0x4005 ## @~chinese 断流恢复失败,取流被中止(仅U3V支持) @~english Failed to recover from stream interruption: Stream retrieval terminated (Supported only by U3V).
+MV_CC_STREAM_EXCEPTION_DEVICE = 0x4006 ## @~chinese 设备异常,取流被中止(仅U3V支持) @~english Streaming interrupted due to device error (only supported by U3V)
+MV_CC_STREAM_EXCEPTION_PARTIAL_IMAGE = 0x4007 ## @~chinese 行高不足,丢弃残帧(线阵相机或者采集卡配置了残帧丢弃模式,出图行高不足时被SDK丢弃) @~english Insufficient line height (discard residual frames): Incomplete frames are discarded by the SDK when the line height is insufficient if line-scan cameras or frame grabbers are configured with residual frame discard mode.
+MV_CC_STREAM_EXCEPTION_IMAGE_BUFFER_OVERFLOW = 0x4008 ## @~chinese 设备发送的图像数据大小超过了图像缓冲区容量(该帧丢弃) @~english The size of the image data sent by the device exceeds the image buffer capacity (this frame is dropped).
+
+
+## @~chinese Gige的传输类型 @~english The transmission type of Gige
+MV_GIGE_TRANSTYPE_UNICAST = 0 ## @~chinese 表示单播(默认) @~english Unicast mode(default)
+MV_GIGE_TRANSTYPE_MULTICAST = 1 ## @~chinese 表示组播 @~english Multicast mode
+MV_GIGE_TRANSTYPE_LIMITEDBROADCAST = 2 ## @~chinese 表示局域网内广播,暂不支持 @~english Limited broadcast mode,not support
+MV_GIGE_TRANSTYPE_SUBNETBROADCAST = 3 ## @~chinese 表示子网内广播,暂不支持 @~english Subnet broadcast mode,not support
+MV_GIGE_TRANSTYPE_CAMERADEFINED = 4 ## @~chinese 表示从相机获取,暂不支持 @~english Transtype from camera,not support
+MV_GIGE_TRANSTYPE_UNICAST_DEFINED_PORT = 5 ## @~chinese 表示用户自定义应用端接收图像数据Port号 @~english User Defined Receive Data Port
+MV_GIGE_TRANSTYPE_UNICAST_WITHOUT_RECV = 65536 ## @~chinese 表示设置了单播,但本实例不接收图像数据 @~english Unicast without receive data
+MV_GIGE_TRANSTYPE_MULTICAST_WITHOUT_RECV = 65537 ## @~chinese 表示组播模式,但本实例不接收图像数据 @~english Multicast without receive data
+
+
+## @~chinese 每个节点对应的接口类型 @~english Interface type corresponds to each node
+IFT_IValue = 0 ## @~chinese IValue接口类型 @~english IValue interface
+IFT_IBase = 1 ## @~chinese IBase接口类型 @~english IBase interface
+IFT_IInteger = 2 ## @~chinese IInteger接口类型 @~english IInteger interface
+IFT_IBoolean = 3 ## @~chinese IBoolean接口类型 @~english IBoolean interface
+IFT_ICommand = 4 ## @~chinese ICommand接口类型 @~english ICommand interface
+IFT_IFloat = 5 ## @~chinese IFloat接口类型 @~english IFloat interface
+IFT_IString = 6 ## @~chinese IString接口类型 @~english IString interface
+IFT_IRegister = 7 ## @~chinese IRegister接口类型 @~english IRegister interface
+IFT_ICategory = 8 ## @~chinese ICategory接口类型 @~english ICategory interface
+IFT_IEnumeration = 9 ## @~chinese IEnumeration接口类型 @~english IEnumeration interface
+IFT_IEnumEntry = 10 ## @~chinese IEnumEntry接口类型 @~english IEnumEntry interface
+IFT_IPort = 11 ## @~chinese IPort接口类型 @~english IPort interface
+
+## @~chinese 节点的访问模式 @~english Node Access Mode
+AM_NI = 0 ## @~chinese 没有实现 @~english Not implemented
+AM_NA = 1 ## @~chinese 不可用 @~english Not available
+AM_WO = 2 ## @~chinese 只写 @~english Write Only
+AM_RO = 3 ## @~chinese 只读 @~english Read Only
+AM_RW = 4 ## @~chinese 读和写 @~english Read and Write
+AM_Undefined = 5 ## @~chinese 对象未被初始化 @~english Object is not yet initialized
+AM_CycleDetect = 6 ## @~chinese 内部用于AccessMode循环检测 @~english used internally for AccessMode cycle detection
+
+
+## @~chinese 导入参数报错时的原因,错误码 @~english Reasons for importing parameter errors code
+MVCC_NODE_ERR_NODE_INVALID = 1 ## @~chinese 节点不存在 @~english Usually, the operating node does not exist in the device
+MVCC_NODE_ERR_ACCESS = 2, ## @~chinese 访问条件错误,通常是节点不可读写 @~english Access condition error, usually due to nodes not being readable or writable
+MVCC_NODE_ERR_OUT_RANGE = 3, ## @~chinese 写入越界,超出该节点支持的范围 @~english Write out of bounds, beyond the supported range of this node
+MVCC_NODE_ERR_VERIFY_FAILD = 4, ## @~chinese 校验失败,通常是写入的值与文件中的值不匹配 @~english Verification failed, usually due to a mismatch between the written value and the value in the file
+MVCC_NODE_ERR_OTHER = 100 ## @~chinese 其它错误,可查阅日志 @~english Other errors, can view logs
+
+
+## @~chinese 图像重构的方式 @~english Image reconstruction method
+MV_SPLIT_BY_LINE = 1 #< \~chinese 源图像按行拆分成多张图像 @~english Source image split into multiple images by line
+
+int8_t = c_int8
+int16_t = c_int16
+int32_t = c_int32
+int64_t = c_int64
+uint8_t = c_uint8
+uint16_t = c_uint16
+uint32_t = c_uint32
+uint64_t = c_uint64
+int_least8_t = c_byte
+int_least16_t = c_short
+int_least32_t = c_int
+int_least64_t = c_long
+uint_least8_t = c_ubyte
+uint_least16_t = c_ushort
+uint_least32_t = c_uint
+uint_least64_t = c_ulong
+int_fast8_t = c_byte
+int_fast16_t = c_long
+int_fast32_t = c_long
+int_fast64_t = c_long
+uint_fast8_t = c_ubyte
+uint_fast16_t = c_ulong
+uint_fast32_t = c_ulong
+uint_fast64_t = c_ulong
+intptr_t = c_long
+uintptr_t = c_ulong
+intmax_t = c_long
+uintmax_t = c_ulong
+
+MvGvspPixelType = c_int # enum
+
+def check_sys_and_update_PixelType():
+ currentsystem = platform.system()
+ global MvGvspPixelType
+ if currentsystem == 'Windows':
+ # values for enumeration 'MvGvspPixelType'
+ MvGvspPixelType = c_uint # enum
+ else:
+ # values for enumeration 'MvGvspPixelType'
+ MvGvspPixelType = int64_t # enum
+
+#检测系统,并更新
+check_sys_and_update_PixelType()
+
+# GigE设备信息 @~english GigE device info
+class _MV_GIGE_DEVICE_INFO_(Structure):
+ pass
+_MV_GIGE_DEVICE_INFO_._fields_ = [
+ ('nIpCfgOption', c_uint), ## @~chinese IP配置选项 @~english Ip config option
+ ('nIpCfgCurrent', c_uint), ## @~chinese 当前IP地址配置 @~english IP configuration:bit31-static bit30-dhcp bit29-lla
+ ('nCurrentIp', c_uint), ## @~chinese 当前主机IP地址 @~english Current host Ip
+ ('nCurrentSubNetMask', c_uint), ## @~chinese 当前子网掩码 @~english curtent subnet mask
+ ('nDefultGateWay', c_uint), ## @~chinese 默认网关 @~english Default gate way
+ ('chManufacturerName', c_ubyte * 32), ## @~chinese 厂商名称 @~english Manufacturer Name
+ ('chModelName', c_ubyte * 32), ## @~chinese 型号名称 @~english Mode name
+ ('chDeviceVersion', c_ubyte * 32), ## @~chinese 设备固件版本 @~english Device Version
+ ('chManufacturerSpecificInfo', c_ubyte * 48), ## @~chinese 厂商特殊信息 @~english Manufacturer Specific Infomation
+ ('chSerialNumber', c_ubyte * 16), ## @~chinese 序列号 @~english serial number
+ ('chUserDefinedName', c_ubyte * 16), ## @~chinese 用户定义名称 @~english User Defined Name
+ ('nNetExport', c_uint), ## @~chinese 网口Ip地址 @~english NetWork Ip address
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_GIGE_DEVICE_INFO = _MV_GIGE_DEVICE_INFO_
+
+# USB设备信息 @~english USB device info
+class _MV_USB3_DEVICE_INFO_(Structure):
+ pass
+_MV_USB3_DEVICE_INFO_._fields_ = [
+ ('CrtlInEndPoint', c_ubyte), ## @~chinese 控制输入端点 @~english Control input endpoint
+ ('CrtlOutEndPoint', c_ubyte), ## @~chinese 控制输出端点 @~english Control output endpoint
+ ('StreamEndPoint', c_ubyte), ## @~chinese 流端点 @~english Flow endpoint
+ ('EventEndPoint', c_ubyte), ## @~chinese 事件端点 @~english Event endpoint
+ ('idVendor', c_ushort), ## @~chinese 供应商ID号 @~english Vendor ID Number
+ ('idProduct', c_ushort), ## @~chinese 产品ID号 @~english Device ID Number
+ ('nDeviceNumber', c_uint), ## @~chinese 设备序列号 @~english Device Serial Number
+ ('chDeviceGUID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备GUID号 @~english Device GUID Number
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor Name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model Name
+ ('chFamilyName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 家族名字 @~english Family Name
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备版本号 @~english Device Version
+ ('chManufacturerName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 制造商名字 @~english Manufacturer Name
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字 @~english User Defined Name
+ ('nbcdUSB', c_uint), ## @~chinese 支持的USB协议 @~english Support USB Protocol
+ ('nDeviceAddress', c_uint), ## @~chinese 设备地址 @~english Device Address
+ ('nReserved', c_uint * 2), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_USB3_DEVICE_INFO = _MV_USB3_DEVICE_INFO_
+
+# CameraLink设备信息 @~english CameraLink device info
+class _MV_CamL_DEV_INFO_(Structure):
+ pass
+_MV_CamL_DEV_INFO_._fields_ = [
+ ('chPortID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 端口号 @~english Port ID
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备型号 @~english Model name
+ ('chFamilyName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 家族名字 @~english Family Name
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备版本号 @~english Device Version
+ ('chManufacturerName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 制造商名字 @~english Manufacturer Name
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('nReserved', c_uint * 38), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CamL_DEV_INFO = _MV_CamL_DEV_INFO_
+
+# CoaXPress相机信息 @~english CoaXPress device information
+class _MV_CXP_DEVICE_INFO_(Structure):
+ pass
+_MV_CXP_DEVICE_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 采集卡ID @~english Interface ID of Frame Grabber
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model name
+ ('chManufacturerInfo', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 厂商信息 @~english Manufacturer information
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机版本 @~english Device version
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字 @~english User defined name
+ ('chDeviceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机ID @~english Device ID
+ ('nReserved', c_uint * 7), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CXP_DEVICE_INFO = _MV_CXP_DEVICE_INFO_
+
+
+# 采集卡Camera Link相机信息 @~english Camera Link device information on frame grabber
+class _MV_CML_DEVICE_INFO_(Structure):
+ pass
+_MV_CML_DEVICE_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 采集卡ID @~english Interface ID of Frame Grabber
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model name
+ ('chManufacturerInfo', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 厂商信息 @~english Manufacturer information
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机版本 @~english Device version
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字@~english User defined name
+ ('chDeviceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机ID @~english Device ID
+ ('nReserved', c_uint * 7), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CML_DEVICE_INFO = _MV_CML_DEVICE_INFO_
+
+# XoFLink相机信息 @~english XoFLink device information
+class _MV_XOF_DEVICE_INFO_(Structure):
+ pass
+_MV_XOF_DEVICE_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 采集卡ID @~english Interface ID of Frame Grabber
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model name
+ ('chManufacturerInfo', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 厂商信息 @~english Manufacturer information
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机版本 @~english Device version
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字@~english User defined name
+ ('chDeviceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机ID @~english Device ID
+ ('nReserved', c_uint * 7), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_XOF_DEVICE_INFO = _MV_XOF_DEVICE_INFO_
+
+# \~chinese 虚拟相机信息 @~english Virtual device information
+class _MV_GENTL_VIR_DEVICE_INFO_(Structure):
+ pass
+_MV_GENTL_VIR_DEVICE_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 采集卡ID @~english Interface ID of Frame Grabber
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model name
+ ('chManufacturerInfo', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 厂商信息 @~english Manufacturer information
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机版本 @~english Device version
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial Number
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字 @~english User defined name
+ ('chDeviceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 相机ID @~english Device ID
+ ('chTLType', c_ubyte * INFO_MAX_BUFFER_SIZE), #< \~chinese 传输层类型 @~english GenTL Type
+ ('nReserved', c_uint * 7), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_GENTL_VIR_DEVICE_INFO = _MV_GENTL_VIR_DEVICE_INFO_
+
+
+
+# \~chinese 设备信息 @~english Device info
+class _MV_CC_DEVICE_INFO_(Structure):
+ pass
+class N19_MV_CC_DEVICE_INFO_3DOT_0E(Union):
+ pass
+N19_MV_CC_DEVICE_INFO_3DOT_0E._fields_ = [
+ ('stGigEInfo', MV_GIGE_DEVICE_INFO), ## @~chinese Gige设备信息 @~english Gige device infomation
+ ('stUsb3VInfo', MV_USB3_DEVICE_INFO), ## @~chinese U3V设备信息 @~english u3V device information
+ ('stCamLInfo', MV_CamL_DEV_INFO), ## @~chinese CamLink设备信息 @~english CamLink device information
+ ('stCMLInfo', MV_CML_DEVICE_INFO), ## @~chinese 采集卡CameraLink设备信息 @~english CameraLink Device Info On Frame Grabber
+ ('stCXPInfo', MV_CXP_DEVICE_INFO), ## @~chinese 采集卡CoaXPress设备信息 @~english CoaXPress Device Info On Frame Grabber
+ ('stXoFInfo', MV_XOF_DEVICE_INFO), ## @~chinese 采集卡XoF设备信息 @~english XoF Device Info On Frame Grabber
+ ('stVirInfo', MV_GENTL_VIR_DEVICE_INFO), ## @~chinese 虚拟相机信息 @~english Virtual device information
+]
+
+_MV_CC_DEVICE_INFO_._fields_ = [
+ ('nMajorVer', c_ushort), ## @~chinese 规范的主要版本 @~english Major version of the specification.
+ ('nMinorVer', c_ushort), ## @~chinese 规范的次要版本 @~english Minor version of the specification
+ ('nMacAddrHigh', c_uint), ## @~chinese MAC地址高位 @~english Mac address high
+ ('nMacAddrLow', c_uint), ## @~chinese MAC地址低位 @~english Mac address low
+ ('nTLayerType', c_uint), ## @~chinese 设备传输层协议类型 @~english Device Transport Layer Protocol Type, e.g. MV_GIGE_DEVICE
+ ('nDevTypeInfo', c_uint), ## @~chinese 设备类型信息 @~english Device Type Info
+ ('nReserved', c_uint * 3), ## @~chinese 保留字节 @~english Reserved bytes
+ ('SpecialInfo', N19_MV_CC_DEVICE_INFO_3DOT_0E), ## @~chinese 不同设备特有信息 @~english Special information
+]
+MV_CC_DEVICE_INFO = _MV_CC_DEVICE_INFO_
+
+# 设备信息列表 @~english Device Information List
+class _MV_CC_DEVICE_INFO_LIST_(Structure):
+ pass
+_MV_CC_DEVICE_INFO_LIST_._fields_ = [
+ ('nDeviceNum', c_uint), ## @~chinese 在线设备数量 @~english Online Device Number
+ ('pDeviceInfo', POINTER(MV_CC_DEVICE_INFO) * MV_MAX_DEVICE_NUM), ## @~chinese 支持最多256个设备 @~english Support up to 256 devices
+]
+MV_CC_DEVICE_INFO_LIST = _MV_CC_DEVICE_INFO_LIST_
+
+
+# 采集卡信息 @~english Interface information
+class _MV_INTERFACE_INFO_(Structure):
+ pass
+_MV_INTERFACE_INFO_._fields_ = [
+ ('nTLayerType', c_uint), ## @~chinese 采集卡类型 @~english Interface type
+ ('nPCIEInfo', c_uint), ## @~chinese 采集卡的PCIE插槽信息 @~english PCIe slot information of interface
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 采集卡ID @~english Interface ID
+ ('chDisplayName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 显示名称 @~english Display name
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial number
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号 @~english model name
+ ('chManufacturer', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 厂商 @~english manufacturer name
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 版本号 @~english device version
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 自定义名称 @~english user defined name
+ ('nReserved', c_uint * 64), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_INTERFACE_INFO = _MV_INTERFACE_INFO_
+
+# 采集卡信息列表 @~english Interface Information List
+class _MV_INTERFACE_INFO_LIST_(Structure):
+ pass
+_MV_INTERFACE_INFO_LIST_._fields_ = [
+ ('nInterfaceNum', c_uint), ## @~chinese 在线设备数量 @~english Online Device Number
+ ('pInterfaceInfos', POINTER(MV_INTERFACE_INFO) * MV_MAX_INTERFACE_NUM), ## @~chinese 支持最多256个设备 @~english Support up to 256 devices
+]
+MV_INTERFACE_INFO_LIST = _MV_INTERFACE_INFO_LIST_
+
+
+# 通过GenTL枚举到的Interface信息 @~english Interface Information with GenTL
+class _MV_GENTL_IF_INFO_(Structure):
+ pass
+_MV_GENTL_IF_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese GenTL接口ID @~english Interface ID of GenTL
+ ('chTLType', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 传输层类型 @~english Transport Layer type
+ ('chDisplayName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备显示名称 @~english Display name
+ ('nCtiIndex', c_uint), ## @~chinese GenTL的cti文件索引 @~english Cti file index of GenTL
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_GENTL_IF_INFO = _MV_GENTL_IF_INFO_
+
+# 通过GenTL枚举到的设备信息列表 @~english Device Information List with GenTL
+class _MV_GENTL_IF_INFO_LIST_(Structure):
+ pass
+_MV_GENTL_IF_INFO_LIST_._fields_ = [
+ ('nInterfaceNum', c_uint), ## @~chinese 在线设备数量 @~english Online Device Number
+ ('pIFInfo', POINTER(MV_GENTL_IF_INFO) * MV_MAX_GENTL_IF_NUM), ## @~chinese 支持最多256个设备 @~english Support up to 256 devices
+]
+MV_GENTL_IF_INFO_LIST = _MV_GENTL_IF_INFO_LIST_
+
+# 通过GenTL枚举到的设备信息 @~english Device Information with GenTL
+class _MV_GENTL_DEV_INFO_(Structure):
+ pass
+_MV_GENTL_DEV_INFO_._fields_ = [
+ ('chInterfaceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese GenTL接口ID @~english Interface ID of GenTL
+ ('chDeviceID', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备ID @~english Device ID
+ ('chVendorName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 供应商名字 @~english Vendor Name
+ ('chModelName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 型号名字 @~english Model name
+ ('chTLType', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 传输层类型 @~english Transport Layer type
+ ('chDisplayName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 显示名称 @~english Display name
+ ('chUserDefinedName', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 用户自定义名字 @~english User defined name
+ ('chSerialNumber', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 序列号 @~english Serial number
+ ('chDeviceVersion', c_ubyte * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备版本号 @~english Device version
+ ('nCtiIndex', c_uint), ## @~chinese cti索引 @~english Cti Index
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_GENTL_DEV_INFO = _MV_GENTL_DEV_INFO_
+
+# 通过GenTL枚举到的设备信息列表 @~english Device Information List with GenTL
+class _MV_GENTL_DEV_INFO_LIST_(Structure):
+ pass
+_MV_GENTL_DEV_INFO_LIST_._fields_ = [
+ ('nDeviceNum', c_uint), ## @~chinese 在线设备数量 @~english Online Device Number
+ ('pDeviceInfo', POINTER(MV_GENTL_DEV_INFO) * MV_MAX_GENTL_DEV_NUM), ## @~chinese GenTL设备信息 @~english device infomation of GenTL device
+]
+MV_GENTL_DEV_INFO_LIST = _MV_GENTL_DEV_INFO_LIST_
+
+# Chunk内容 @~english The content of ChunkData
+class _MV_CHUNK_DATA_CONTENT_(Structure):
+ pass
+_MV_CHUNK_DATA_CONTENT_._fields_ = [
+ ('pChunkData', POINTER(c_ubyte)), ## @~chinese 块数据 @~english Chunk data
+ ('nChunkID', c_uint), ## @~chinese 块数据ID @~english Chunk id
+ ('nChunkLen', c_uint), ## @~chinese 块数据长度 @~english Chunk len
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CHUNK_DATA_CONTENT = _MV_CHUNK_DATA_CONTENT_
+
+
+# 图像信息 @~english Image information
+class _MV_CC_IMAGE_(Structure):
+ pass
+_MV_CC_IMAGE_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english Pixel type
+ ('pImageBuf', POINTER(c_ubyte)), ## @~chinese 图像缓存 @~english Image buffer
+ ('nImageBufSize', uint64_t), ## @~chinese 图像缓存大小 @~english Image buffer size
+ ('nImageLen', uint64_t), ## @~chinese 图像长度 @~english Image length
+ ('nReserved', c_uint * 4), ## @~chinese 预留字段 @~english Reserved
+]
+MV_CC_IMAGE = _MV_CC_IMAGE_
+
+
+
+
+# values for enumeration '_MV_FRAME_EXTRA_INFO_TYPE_'
+_MV_FRAME_EXTRA_INFO_TYPE_ = c_int # enum
+MV_FRAME_EXTRA_INFO_TYPE = _MV_FRAME_EXTRA_INFO_TYPE_
+
+# values for enumeration '_MV_GIGE_ZONE_DIRECTION_'
+_MV_GIGE_ZONE_DIRECTION_ = c_int # enum
+MV_GIGE_ZONE_DIRECTION = _MV_GIGE_ZONE_DIRECTION_
+class _MV_GIGE_ZONE_INFO_(Structure):
+ pass
+class N19_MV_GIGE_ZONE_INFO_3DOT_1E(Union):
+ pass
+N19_MV_GIGE_ZONE_INFO_3DOT_1E._fields_ = [
+ ('pZoneAddr', POINTER(c_ubyte)),
+ ('nAlign', uint64_t),
+]
+_MV_GIGE_ZONE_INFO_._fields_ = [
+ ('enDirection', MV_GIGE_ZONE_DIRECTION),
+ ('stZone', N19_MV_GIGE_ZONE_INFO_3DOT_1E),
+ ('nLength', uint64_t),
+ ('nReserved', c_uint * 6),
+]
+MV_GIGE_ZONE_INFO = _MV_GIGE_ZONE_INFO_
+class _MV_GIGE_MULRI_PART_DATA_INFO_(Union):
+ pass
+class N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_2E(Structure):
+ pass
+N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_2E._fields_ = [
+ ('nSizeX', c_uint),
+ ('nSizeY', c_uint),
+ ('nOffsetX', c_uint),
+ ('nOffsetY', c_uint),
+ ('nPaddingX', c_ushort),
+]
+
+class N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_3E(Structure):
+ pass
+N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_3E._fields_ = [
+ ('nJpegFlag', c_ubyte),
+ ('nTimestampTickFrequencyHigh', c_uint),
+ ('nTimestampTickFrequencyLow', c_uint),
+ ('nJpegDataFormat', c_uint),
+]
+_MV_GIGE_MULRI_PART_DATA_INFO_._fields_ = [
+ ('stGeneral', N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_2E),
+ ('stJpeg', N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_3E),
+ ('pDataTypeSpecific', c_ubyte * 24),
+]
+MV_GIGE_PART_DATA_INFO = _MV_GIGE_MULRI_PART_DATA_INFO_
+
+# values for enumeration '_MV_GIGE_MULTI_PART_DATA_TYPE_'
+_MV_GIGE_MULTI_PART_DATA_TYPE_ = c_int # enum
+MV_GIGE_MULTI_PART_DATA_TYPE = _MV_GIGE_MULTI_PART_DATA_TYPE_
+
+class _MV_GIGE_MULTI_PART_INFO_(Structure):
+ pass
+_MV_GIGE_MULTI_PART_INFO_._fields_ = [
+ ('enDataType', MV_GIGE_MULTI_PART_DATA_TYPE),
+ ('nDataFormat', c_uint),
+ ('nSourceID', c_uint),
+ ('nRegionID', c_uint),
+ ('nDataPurposeID', c_uint),
+ ('nZones', c_uint),
+ ('pZoneInfo', POINTER(MV_GIGE_ZONE_INFO)),
+ ('nLength', uint64_t),
+ ('pPartAddr', POINTER(c_ubyte)),
+ ('stDataTypeSpecific', MV_GIGE_PART_DATA_INFO),
+ ('nReserved', c_uint * 8),
+]
+MV_GIGE_MULTI_PART_INFO = _MV_GIGE_MULTI_PART_INFO_
+
+
+
+# 输出帧的信息 @~english Output Frame Information
+class _MV_FRAME_OUT_INFO_EX_(Structure):
+ pass
+# values for enumeration 'MvGvspPixelType'
+
+class N22_MV_FRAME_OUT_INFO_EX_3DOT_1E(Union):
+ pass
+N22_MV_FRAME_OUT_INFO_EX_3DOT_1E._fields_ = [
+ ('pUnparsedChunkContent', POINTER(MV_CHUNK_DATA_CONTENT)), ## @~chinese Chunk内容 @~english Chunk Content
+ ('nAligning', int64_t), ## @~chinese 校准字段 @~english Aligning
+]
+
+class N22_MV_FRAME_OUT_INFO_EX_3DOT_2E(Union):
+ pass
+N22_MV_FRAME_OUT_INFO_EX_3DOT_2E._fields_ = [
+ ('pstSubImage', POINTER(MV_CC_IMAGE)),
+ ('pstPartInfo', POINTER(MV_GIGE_MULTI_PART_INFO)),
+ ('nAligning', int64_t),
+]
+
+class N22_MV_FRAME_OUT_INFO_EX_3DOT_3E(Union):
+ pass
+N22_MV_FRAME_OUT_INFO_EX_3DOT_3E._fields_ = [
+ ('pUser', c_void_p),
+ ('nAligning', int64_t),
+]
+
+_MV_FRAME_OUT_INFO_EX_._fields_ = [
+ ('nWidth', c_ushort),
+ ## @~chinese 图像宽(最大65535,超出请用nExtendWidth) @~english Image Width (over 65535, use nExtendWidth)
+ ('nHeight', c_ushort),
+ ## @~chinese 图像高(最大65535,超出请用nExtendHeight) @~english Image Height(over 65535, use nExtendHeight)
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english Pixel Type
+ ('nFrameNum', c_uint), ## @~chinese 帧号 @~english Frame Number
+ ('nDevTimeStampHigh', c_uint), ## @~chinese 时间戳高32位 @~english Timestamp high 32 bits
+ ('nDevTimeStampLow', c_uint), ## @~chinese 时间戳低32位 @~english Timestamp low 32 bits
+ ('nReserved0', c_uint), ## @~chinese 保留,8字节对齐 @~english Reserved, 8-byte aligned
+ ('nHostTimeStamp', int64_t), ## @~chinese 主机生成的时间戳 @~english Host-generated timestamp
+ ('nFrameLen', c_uint), ## @~chinese 帧的长度 @~english Frame length
+ ## @~chinese 以下为chunk新增水印信息 @~english The followings are chunk add frame-specific information
+ ## @~chinese 设备水印时标 @~english Device frame-specific time scale
+ ('nSecondCount', c_uint), ## @~chinese 秒数 @~english The Seconds
+ ('nCycleCount', c_uint), ## @~chinese 周期数 @~english The Count of Cycle
+ ('nCycleOffset', c_uint), ## @~chinese 周期偏移量 @~english The Offset of Cycle
+ ('fGain', c_float), ## @~chinese 增益 @~english Gain
+ ('fExposureTime', c_float), ## @~chinese 曝光时间 @~english Exposure Time
+ ('nAverageBrightness', c_uint), ## @~chinese 平均亮度 @~english Average brightness
+ ## @~chinese:白平衡相关 @~english White balance
+ ('nRed', c_uint), ## @~chinese 红色 @~english Red
+ ('nGreen', c_uint), ## @~chinese 绿色 @~english Green
+ ('nBlue', c_uint), ## @~chinese 蓝色 @~english Blue
+ ('nFrameCounter', c_uint), ## @~chinese 帧计数 @~english Frame counter
+ ('nTriggerIndex', c_uint), ## @~chinese 触发计数 @~english Trigger index
+ ## @~chinese 输入/输出 @~english Line Input/Output
+ ('nInput', c_uint), ## @~chinese 输入 @~english input
+ ('nOutput', c_uint), ## @~chinese 输出 @~english output
+ ## @~chinese ROI区域 @~english ROI Region
+ ('nOffsetX', c_ushort), ## @~chinese 水平偏移量 @~english OffsetX
+ ('nOffsetY', c_ushort), ## @~chinese 垂直偏移量 @~english OffsetY
+ ('nChunkWidth', c_ushort), ## @~chinese chunk 宽 @~english The Width of Chunk
+ ('nChunkHeight', c_ushort), ## @~chinese chunk 高 @~english The Height of Chunk
+ ('nLostPacket', c_uint), ## @~chinese 本帧丢包数 @~english Lost Pacekt Number In This Frame
+ ('nUnparsedChunkNum', c_uint), ## @~chinese 未解析的Chunkdata个数 @~english Unparsed chunk number
+ ('UnparsedChunkList', N22_MV_FRAME_OUT_INFO_EX_3DOT_1E), ## @~chinese 未解析的Chunk数据 @~english Unparsed chunk list
+ ('nExtendWidth', c_uint), ## @~chinese 图像宽(扩展变量) @~english Image Width
+ ('nExtendHeight', c_uint), ## @~chinese 图像高(扩展变量) @~english Image Height
+ ('nFrameLenEx', uint64_t), ## @~chinese 帧的长度 @~english The Length of Frame
+ ('nExtraType', c_uint), ## @~chinese判断携带的额外信息的类型:子图(SubImageList)还是多图(MultiPartArray) MV_FRAME_EXTRA_INFO_TYPE类型 @~english Reserved Identify the type of additional information: SubImageList or MultiPartArray of type MV_FRAME_EXTRA_INFO_TYPE.
+ ('nSubImageNum', c_uint), ## @~chinese 图像缓存中的子图个数 @~english Number of sub-images in the image cache
+ ('SubImageList', N22_MV_FRAME_OUT_INFO_EX_3DOT_2E), ## @~chinese 子图信息 @~english Sub image info
+ ('UserPtr', N22_MV_FRAME_OUT_INFO_EX_3DOT_3E), ## @~chinese 自定义指针(外部注册缓存时,内存地址对应的用户自定义指针) @~english Custom pointer (user-defined pointer corresponding to memory address when registering external cache)
+ ('nFirstLineEncoderCount', c_uint), ## @~chinese 首行编码器计数 @~english First line encoder count
+ ('nLastLineEncoderCount', c_uint), ## @~chinese 尾行编码器计数 @~english Last line encoder count
+ ('nReserved', c_uint * 24), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_FRAME_OUT_INFO_EX = _MV_FRAME_OUT_INFO_EX_
+
+# 图像结构体,输出图像指针地址及图像信息 @~english Image Struct, output the pointer of Image and the information of the specific image
+class _MV_FRAME_OUT_(Structure):
+ pass
+_MV_FRAME_OUT_._fields_ = [
+ ('pBufAddr', POINTER(c_ubyte)), ## @~chinese 图像指针地址 @~english pointer of image
+ ('stFrameInfo', MV_FRAME_OUT_INFO_EX), ## @~chinese 图像信息 @~english information of the specific image
+ ('nRes', c_uint * 16), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_FRAME_OUT = _MV_FRAME_OUT_
+
+# values for enumeration '_MV_GRAB_STRATEGY_'
+_MV_GRAB_STRATEGY_ = c_int # enum
+MV_GRAB_STRATEGY = _MV_GRAB_STRATEGY_
+
+# 网络传输的相关信息 @~english Network transmission information
+class _MV_NETTRANS_INFO_(Structure):
+ pass
+_MV_NETTRANS_INFO_._fields_ = [
+ ('nReceiveDataSize', int64_t), ## @~chinese 已接收数据大小 [统计StartGrabbing和StopGrabbing之间的数据量] @~english Received Data Size [Calculate the Data Size between StartGrabbing and StopGrabbing]
+ ('nThrowFrameCount', c_int), ## @~chinese 丢帧数量 @~english Throw frame number
+ ('nNetRecvFrameCount', c_uint), ## @~chinese 收到帧计数 @~english Receive Frame count
+ ('nRequestResendPacketCount', int64_t), ## @~chinese 请求重发包数 @~english Request Resend Packet Count
+ ('nResendPacketCount', int64_t), ## @~chinese 重发包数 @~english Resend Packet Count
+]
+MV_NETTRANS_INFO = _MV_NETTRANS_INFO_
+
+# 全匹配的一种信息结构体 @~english A fully matched information structure
+class _MV_ALL_MATCH_INFO_(Structure):
+ pass
+_MV_ALL_MATCH_INFO_._fields_ = [
+ ('nType', c_uint), ## @~chinese 需要输出的信息类型 @~english Information type need to output
+ ('pInfo', c_void_p), ## @~chinese 输出的信息缓存,由调用者分配 @~englishOutput information cache, which is allocated by the caller
+ ('nInfoSize', c_uint), ## @~chinese 信息缓存的大小 @~english Information cache size
+]
+MV_ALL_MATCH_INFO = _MV_ALL_MATCH_INFO_
+
+# 网络流量和丢包信息反馈结构体,对应类型为 MV_MATCH_TYPE_NET_DETECT @~english Network traffic and packet loss feedback structure, the corresponding type is MV_MATCH_TYPE_NET_DETECT
+class _MV_MATCH_INFO_NET_DETECT_(Structure):
+ pass
+_MV_MATCH_INFO_NET_DETECT_._fields_ = [
+ ('nReceiveDataSize', int64_t), ## @~chinese 已接收数据大小 @~english Received data size
+ ('nLostPacketCount', int64_t), ## @~chinese 丢失的包数量 @~english Number of packets lost
+ ('nLostFrameCount', c_uint), ## @~chinese 丢帧数量 @~english Number of frames lost
+ ('nNetRecvFrameCount', c_uint), ## @~chinese 收到帧计数 @~english Receive Frame count
+ ('nRequestResendPacketCount', int64_t), ## @~chinese 请求重发包数 @~english Request Resend Packet Count
+ ('nResendPacketCount', int64_t), ## @~chinese 重发包数 @~english Resend Packet Count
+]
+MV_MATCH_INFO_NET_DETECT = _MV_MATCH_INFO_NET_DETECT_
+
+# \~chinese host收到从u3v设备端的总字节数,对应类型为 MV_MATCH_TYPE_USB_DETECT @~english The total number of bytes host received from the u3v device side, the corresponding type is MV_MATCH_TYPE_USB_DETECT
+class _MV_MATCH_INFO_USB_DETECT_(Structure):
+ pass
+_MV_MATCH_INFO_USB_DETECT_._fields_ = [
+ ('nReceiveDataSize', int64_t), ## @~chinese 已接收数据大小 @~english Received data size
+ ('nReceivedFrameCount', c_uint), ## @~chinese 已收到的帧数 @~english Number of frames received
+ ('nErrorFrameCount', c_uint), ## @~chinese 错误帧数 @~english Number of error frames
+ ('nReserved', c_uint * 2), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_MATCH_INFO_USB_DETECT = _MV_MATCH_INFO_USB_DETECT_
+
+# \~chinese 显示帧信息 @~english Display frame information
+class _MV_DISPLAY_FRAME_INFO_EX_(Structure):
+ pass
+_MV_DISPLAY_FRAME_INFO_EX_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english Pixel Type
+ ('pImageBuf', POINTER(c_ubyte)), ## @~chinese 输入图像缓存 @~english Input image buffer
+ ('nImageBufLen', c_uint), ## @~chinese 输入图像长度 @~english Input image length
+ ('enRenderMode', c_uint), ## @~chinese 图像渲染方式 0-GDI(默认), 1-D3D, 2-OPENGL @~english Render mode 0-GDI(default), 1-D3D, 2-OPENGL
+ ('nRes', c_uint * 3), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_DISPLAY_FRAME_INFO_EX = _MV_DISPLAY_FRAME_INFO_EX_
+
+
+# values for enumeration 'MV_SAVE_IAMGE_TYPE'
+MV_SAVE_IAMGE_TYPE = c_int # enum
+
+class _MV_SAVE_IMAGE_PARAM_EX3_(Structure):
+ pass
+_MV_SAVE_IMAGE_PARAM_EX3_._fields_ = [
+ ('pData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input Data Size
+ ('enPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english Input Data Pixel Format
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('pImageBuffer', POINTER(c_ubyte)), ## @~chinese 输出图片缓存 @~english Output Image Buffer
+ ('nImageLen', c_uint), ## @~chinese 输出图片大小 @~english Output Image Size
+ ('nBufferSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Output buffer size provided
+ ('enImageType', MV_SAVE_IAMGE_TYPE), ## @~chinese 输出图片格式 @~english Output Image Format
+ ('nJpgQuality', c_uint), ## @~chinese 编码质量, (50-99] @~english Encoding quality, (50-99]
+ ## @~chinese ch:Bayer格式转为RGB24的插值方法 0-快速 1-均衡 2-最优 3-最优+ , RBGG/BRGG/GGRB/GGBR相关像素格式不支持0和3
+ # < @~english en:Interpolation method of convert Bayer to RGB24 0-Fast 1-Equilibrium 2-Optimal 3-Optimal plus , RBGG/BRGG/GGRB/GGBR pixel formats do not support 0 and 3.
+ ('iMethodValue', c_uint),
+ ('nReserved', c_uint * 3), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_SAVE_IMAGE_PARAM_EX3 = _MV_SAVE_IMAGE_PARAM_EX3_
+
+# \~chinese 保存图片到文件参数
+class _MV_SAVE_IMAGE_TO_FILE_PARAM_EX_(Structure):
+ pass
+_MV_SAVE_IMAGE_TO_FILE_PARAM_EX_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english The pixel format of the input data
+ ('pData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input Data Size
+ ('enImageType', MV_SAVE_IAMGE_TYPE), ## @~chinese 输入图片格式 @~english Input Image Format
+ ('pcImagePath', POINTER(c_char)), ## @~chinese 输入文件路径,Windows平台路径长度不超过260字节, Linux平台不超过255字节 @~english Input file path, The path length should not exceed 260 bytes on the Windows platform and 255 bytes on the Linux platform
+ ('nQuality', c_uint), ## @~chinese JPG编码质量(50-99],其他格式无效 @~english JPG Encoding quality(50-99]
+ ('iMethodValue', c_int), ## @~chinese ch:Bayer格式转为RGB24的插值方法 0-快速 1-均衡 2-最优 3-最优+ , RBGG/BRGG/GGRB/GGBR相关像素格式不支持0和3 @~english en:Interpolation method of convert Bayer to RGB24 0-Fast 1-Equilibrium 2-Optimal 3-Optimal plus , RBGG/BRGG/GGRB/GGBR pixel formats do not support 0 and 3.
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_SAVE_IMAGE_TO_FILE_PARAM_EX = _MV_SAVE_IMAGE_TO_FILE_PARAM_EX_
+
+# \~chinese 保存图片到文件参数
+class _MV_CC_SAVE_IMAGE_PARAM_(Structure):
+ pass
+_MV_CC_SAVE_IMAGE_PARAM_._fields_ = [
+ ('enImageType', MV_SAVE_IAMGE_TYPE), ## @~chinese 输入图片格式 @~english Enter image format.
+ ('nQuality', c_uint), ## @~chinese JPG编码质量(50-99],其它格式无效 @~english JPEG Encoding Quality (50–99), Other Formats Are Invalid.
+ ('iMethodValue', c_int), ## @~chinese ch:Bayer格式转为RGB24的插值方法 0-快速 1-均衡 2-最优 3-最优+ , RBGG/BRGG/GGRB/GGBR相关像素格式不支持0和3 @~english en:Interpolation method of convert Bayer to RGB24 0-Fast 1-Equilibrium 2-Optimal 3-Optimal plus , RBGG/BRGG/GGRB/GGBR pixel formats do not support 0 and 3.
+ ('nReserved', c_uint * 8),
+]
+MV_CC_SAVE_IMAGE_PARAM = _MV_CC_SAVE_IMAGE_PARAM_
+
+
+
+# values for enumeration '_MV_SORT_METHOD_'
+_MV_SORT_METHOD_ = c_int # enum
+MV_SORT_METHOD = _MV_SORT_METHOD_
+
+# values for enumeration '_MV_IMG_ROTATION_ANGLE_'
+_MV_IMG_ROTATION_ANGLE_ = c_int # enum
+MV_IMG_ROTATION_ANGLE = _MV_IMG_ROTATION_ANGLE_
+
+# values for enumeration '_MV_IMG_FLIP_TYPE_'
+_MV_IMG_FLIP_TYPE_ = c_int # enum
+MV_IMG_FLIP_TYPE = _MV_IMG_FLIP_TYPE_
+
+# values for enumeration '_MV_CC_GAMMA_TYPE_'
+_MV_CC_GAMMA_TYPE_ = c_int # enum
+MV_CC_GAMMA_TYPE = _MV_CC_GAMMA_TYPE_
+
+
+# values for enumeration '_MV_IMAGE_RECONSTRUCTION_METHOD_'
+_MV_IMAGE_RECONSTRUCTION_METHOD_ = c_int # enum
+MV_IMAGE_RECONSTRUCTION_METHOD = _MV_IMAGE_RECONSTRUCTION_METHOD_
+
+
+# \~chinese 图像旋转结构体 @~english Rotate image structure
+class _MV_CC_ROTATE_IMAGE_PARAM_T_(Structure):
+ pass
+_MV_CC_ROTATE_IMAGE_PARAM_T_._fields_ = [
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english pixel format
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input data length
+ ('pDstBuf', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstBufLen', c_uint), ## @~chinese输出数据长度 @~english Output data length
+ ('nDstBufSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided output buffer size
+ ('enRotationAngle', MV_IMG_ROTATION_ANGLE), ## @~chinese 旋转角度 @~english Rotation angle
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_ROTATE_IMAGE_PARAM = _MV_CC_ROTATE_IMAGE_PARAM_T_
+
+# \~chinese 图像翻转结构体 @~english Flip image structure
+class _MV_CC_FLIP_IMAGE_PARAM_T_(Structure):
+ pass
+_MV_CC_FLIP_IMAGE_PARAM_T_._fields_ = [
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english pixel format
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input data length
+ ('pDstBuf', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstBufLen', c_uint), ## @~chinese输出数据长度 @~english Output data length
+ ('nDstBufSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided output buffer size
+ ('enFlipType', MV_IMG_FLIP_TYPE), ## @~chinese 翻转类型 @~english Flip type
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_FLIP_IMAGE_PARAM = _MV_CC_FLIP_IMAGE_PARAM_T_
+
+class _MV_PIXEL_CONVERT_PARAM_EX_T_(Structure):
+ pass
+_MV_PIXEL_CONVERT_PARAM_EX_T_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('enSrcPixelType', MvGvspPixelType), ## @~chinese 源像素格式 @~english Source pixel format
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input data size
+ ('enDstPixelType', MvGvspPixelType), ## @~chinese 目标像素格式 @~english Destination pixel format
+ ('pDstBuffer', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstLen', c_uint), ## @~chinese 输出数据大小 @~english Output data size
+ ('nDstBufferSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided outbut buffer size
+ ('nRes', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_PIXEL_CONVERT_PARAM_EX = _MV_PIXEL_CONVERT_PARAM_EX_T_
+
+
+
+# \~chinese Gamma信息结构体 @~english Gamma info structure
+class _MV_CC_GAMMA_PARAM_T_(Structure):
+ pass
+_MV_CC_GAMMA_PARAM_T_._fields_ = [
+ ('enGammaType', MV_CC_GAMMA_TYPE), ## @~chinese Gamma类型 @~english Gamma type
+ ('fGammaValue', c_float), ## @~chinese Gamma值[0.1,4.0] @~english Gamma value[0.1,4.0]
+ ('pGammaCurveBuf', POINTER(c_ubyte)), ## @~chinese Gamma曲线缓存 @~english Gamma curve buffer
+ ('nGammaCurveBufLen', c_uint), ## @~chinese Gamma曲线缓存长度 @~english Gamma curve buffer size
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_GAMMA_PARAM = _MV_CC_GAMMA_PARAM_T_
+
+# \~chinese CCM参数 @~english CCM param
+class _MV_CC_CCM_PARAM_T_(Structure):
+ pass
+_MV_CC_CCM_PARAM_T_._fields_ = [
+ ('bCCMEnable', c_bool), ## @~chinese 是否启用CCM @~english CCM enable
+ ('nCCMat', c_int * 9), ## @~chinese CCM矩阵[-8192~8192] @~english Color correction matrix[-8192~8192]
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_CCM_PARAM = _MV_CC_CCM_PARAM_T_
+
+# \~chinese CCM参数 @~english CCM param
+class _MV_CC_CCM_PARAM_EX_T_(Structure):
+ pass
+_MV_CC_CCM_PARAM_EX_T_._fields_ = [
+ ('bCCMEnable', c_bool), ## @~chinese 是否启用CCM @~english CCM enable
+ ('nCCMat', c_int * 9), ## @~chinese CCM矩阵[-65536~65536] @~english Color correction matrix[-65536~65536]
+ ('nCCMScale', c_uint), ## @~chinese 量化系数(2的整数幂,最大65536) @~english Quantitative scale(Integer power of 2, <= 65536)
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_CCM_PARAM_EX = _MV_CC_CCM_PARAM_EX_T_
+
+# \~chinese 对比度调节结构体 @~english Contrast structure
+class _MV_CC_CONTRAST_PARAM_T_(Structure):
+ pass
+_MV_CC_CONTRAST_PARAM_T_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽(最小8) @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高(最小8) @~english Image Height
+ ('pSrcBuf', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcBufLen', c_uint), ## @~chinese 输入数据大小 @~english Input data length
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english pixel format
+ ('pDstBuf', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstBufSize', c_uint), ## @~chinese提供的输出缓冲区大小 @~english Provided output buffer size
+ ('nDstBufLen', c_uint), ## @~chinese 输出数据长度 @~english Output data length
+ ('nContrastFactor', c_uint), ## @~chinese 对比度值,[1,10000] @~english Contrast factor,[1,10000]
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_CONTRAST_PARAM = _MV_CC_CONTRAST_PARAM_T_
+
+
+# \~chinese 水印信息 @~english Frame-specific information
+class _MV_CC_FRAME_SPEC_INFO_(Structure):
+ pass
+_MV_CC_FRAME_SPEC_INFO_._fields_ = [
+ ## @~chinese 设备水印时标 @~english Device frame-specific time scale
+ ('nSecondCount', c_uint), ## @~chinese 秒数 @~english The Seconds
+ ('nCycleCount', c_uint), ## @~chinese 周期数 @~english The Count of Cycle
+ ('nCycleOffset', c_uint), ## @~chinese 周期偏移量 @~english The Offset of Cycle
+ ('fGain', c_float), ## @~chinese 增益 @~english Gain
+ ('fExposureTime', c_float), ## @~chinese 曝光时间 @~english Exposure Time
+ ('nAverageBrightness', c_uint), ## @~chinese 平均亮度 @~english Average brightness
+ ## @~chinese 白平衡相关 @~english White balance
+ ('nRed', c_uint), ## @~chinese 红色 @~english Red
+ ('nGreen', c_uint), ## @~chinese 绿色 @~english Green
+ ('nBlue', c_uint), ## @~chinese 蓝色 @~english Blue
+ ('nFrameCounter', c_uint), ## @~chinese 总帧数 @~english Frame Counter
+ ('nTriggerIndex', c_uint), ## @~chinese 触发计数 @~english Trigger Counting
+ ('nInput', c_uint), ## @~chinese 输入 @~english Input
+ ('nOutput', c_uint), ## @~chinese 输出 @~english Output
+ ## @~chinese ROI区域 @~english ROI Region
+ ('nOffsetX', c_ushort), ## @~chinese 水平偏移量 @~english OffsetX
+ ('nOffsetY', c_ushort), ## @~chinese 垂直偏移量 @~english OffsetY
+ ('nFrameWidth', c_ushort), ## @~chinese 水印宽 @~english The Width of Chunk
+ ('nFrameHeight', c_ushort), ## @~chinese 水印高 @~english The Height of Chunk
+ ('nReserved', c_uint * 16), ## @~chinese 预留 @~english Reserved bytes
+]
+MV_CC_FRAME_SPEC_INFO = _MV_CC_FRAME_SPEC_INFO_
+
+
+
+# \~chinese 去紫边结构体 @~english PurpleFringing structure
+class _MV_CC_PURPLE_FRINGING_PARAM_T_(Structure):
+ pass
+_MV_CC_PURPLE_FRINGING_PARAM_T_._fields_ = [
+ ('nWidth', c_uint), #/< [IN] \~chinese 图像宽度(最小4) @~english Image Width
+ ('nHeight', c_uint), #/< [IN] \~chinese 图像高度(最小4) @~english Image Height
+ ('pSrcBuf', POINTER(c_ubyte)), #/< [IN] \~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcBufLen', c_uint), #/< [IN] \~chinese 输入数据大小 @~english Input data length
+ ('enPixelType', MvGvspPixelType), #/< [IN] \~chinese 像素格式 @~english Pixel format
+ ('pDstBuf', POINTER(c_ubyte)), #/< [OUT] \~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstBufSize', c_uint), #/< [IN] \~chinese 提供的输出缓冲区大小 @~english Provided output buffer size
+ ('nDstBufLen', c_uint), #/< [OUT] \~chinese 输出数据长度 @~english Output data length
+ ('nKernelSize', c_uint), #/< [IN] \~chinese 滤波核尺寸,仅支持3,5,7,9 @~english Filter Kernel Size, only supports 3,5,7,9
+ ('nEdgeThreshold', c_uint), #/< [IN] \~chinese 边缘阈值[0,2040] @~english EdgeThreshold
+ ('nRes', c_uint * 8), #/< \~chinese 预留 @~english Reserved
+]
+MV_CC_PURPLE_FRINGING_PARAM = _MV_CC_PURPLE_FRINGING_PARAM_T_
+
+
+# \~chinese ISP配置结构体 @~english ISP configuration structure
+class _MV_CC_ISP_CONFIG_PARAM_T_(Structure):
+ pass
+_MV_CC_ISP_CONFIG_PARAM_T_._fields_ = [
+ ('pcConfigPath', STRING), #/< [IN] \~chinese 配置文件路径(路径修改后会重新创建算法句柄) @~english Config file path (The algorithm handle will be reinitialized if the path is modified.)
+ ('nRes', c_uint * 16), #/< \~chinese 预留 @~english Reserved
+]
+MV_CC_ISP_CONFIG_PARAM = _MV_CC_ISP_CONFIG_PARAM_T_
+
+
+
+# \~chinese 无损解码参数 @~english High Bandwidth decode structure
+class _MV_CC_HB_DECODE_PARAM_T_(Structure):
+ pass
+_MV_CC_HB_DECODE_PARAM_T_._fields_ = [
+ ('pSrcBuf', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcLen', c_uint), ## @~chinese 输入数据大小 @~english Input data size
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('pDstBuf', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstBufSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided output buffer size
+ ('nDstBufLen', c_uint), ## @~chinese 输出数据大小 @~english Output data size
+ ('enDstPixelType', MvGvspPixelType), ## @~chinese 输出的像素格式 @~english Output pixel format
+ ('stFrameSpecInfo', MV_CC_FRAME_SPEC_INFO), ## @~chinese 水印信息 @~english Frame Spec Info
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_HB_DECODE_PARAM = _MV_CC_HB_DECODE_PARAM_T_
+
+
+
+# values for enumeration '_MV_RECORD_FORMAT_TYPE_'
+_MV_RECORD_FORMAT_TYPE_ = c_int # enum
+MV_RECORD_FORMAT_TYPE = _MV_RECORD_FORMAT_TYPE_
+
+# \~chinese 录像参数 @~english Record Parameters
+class _MV_CC_RECORD_PARAM_T_(Structure):
+ pass
+_MV_CC_RECORD_PARAM_T_._fields_ = [
+ ('enPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english Pixel format of the input data
+ ('nWidth', c_ushort), ## @~chinese 图像宽(指定目标参数时需为2的倍数) @~english Image width (must be a multiple of 2 when specifying target parameters)
+ ('nHeight', c_ushort), ## @~chinese 图像高(指定目标参数时需为2的倍数) @~english Image height (must be a multiple of 2 when specifying target parameters)
+ ('fFrameRate', c_float), ## @~chinese 帧率fps [1/16-1000] @~english Frame rate fps [1/16-1000]
+ ('nBitRate', c_uint), ## @~chinese 码率kbps [128-16*1024]kbps @~english Bit rate kbps [128-16*1024]kbps
+ ('enRecordFmtType', MV_RECORD_FORMAT_TYPE), ## @~chinese 录像格式 @~english Video format
+ ('strFilePath', STRING), ## @~chinese 录像文件存放路径(如果路径中存在中文,需转成utf-8) @~english Video file storage path (if there is Chinese in the path, it needs to be converted to utf-8)
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_RECORD_PARAM = _MV_CC_RECORD_PARAM_T_
+
+# \~chinese 录像数据 @~english Record Data
+class _MV_CC_INPUT_FRAME_INFO_T_(Structure):
+ pass
+_MV_CC_INPUT_FRAME_INFO_T_._fields_ = [
+ ('pData', POINTER(c_ubyte)), ## @~chinese 图像数据指针 @~english Input Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input Data Size
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_INPUT_FRAME_INFO = _MV_CC_INPUT_FRAME_INFO_T_
+
+# values for enumeration '_MV_CAM_ACQUISITION_MODE_'
+_MV_CAM_ACQUISITION_MODE_ = c_int # enum
+MV_CAM_ACQUISITION_MODE = _MV_CAM_ACQUISITION_MODE_
+
+# values for enumeration '_MV_CAM_GAIN_MODE_'
+_MV_CAM_GAIN_MODE_ = c_int # enum
+MV_CAM_GAIN_MODE = _MV_CAM_GAIN_MODE_
+
+# values for enumeration '_MV_CAM_EXPOSURE_MODE_'
+_MV_CAM_EXPOSURE_MODE_ = c_int # enum
+MV_CAM_EXPOSURE_MODE = _MV_CAM_EXPOSURE_MODE_
+
+# values for enumeration '_MV_CAM_EXPOSURE_AUTO_MODE_'
+_MV_CAM_EXPOSURE_AUTO_MODE_ = c_int # enum
+MV_CAM_EXPOSURE_AUTO_MODE = _MV_CAM_EXPOSURE_AUTO_MODE_
+
+# values for enumeration '_MV_CAM_TRIGGER_MODE_'
+_MV_CAM_TRIGGER_MODE_ = c_int # enum
+MV_CAM_TRIGGER_MODE = _MV_CAM_TRIGGER_MODE_
+
+# values for enumeration '_MV_CAM_GAMMA_SELECTOR_'
+_MV_CAM_GAMMA_SELECTOR_ = c_int # enum
+MV_CAM_GAMMA_SELECTOR = _MV_CAM_GAMMA_SELECTOR_
+
+# values for enumeration '_MV_CAM_BALANCEWHITE_AUTO_'
+_MV_CAM_BALANCEWHITE_AUTO_ = c_int # enum
+MV_CAM_BALANCEWHITE_AUTO = _MV_CAM_BALANCEWHITE_AUTO_
+
+# values for enumeration '_MV_CAM_TRIGGER_SOURCE_'
+_MV_CAM_TRIGGER_SOURCE_ = c_int # enum
+MV_CAM_TRIGGER_SOURCE = _MV_CAM_TRIGGER_SOURCE_
+
+
+# values for enumeration '_MV_CC_STREAM_EXCEPTION_TYPE_'
+_MV_CC_STREAM_EXCEPTION_TYPE_ = c_int # enum
+MV_CC_STREAM_EXCEPTION_TYPE = _MV_CC_STREAM_EXCEPTION_TYPE_
+
+# \~chinese 流异常回调信息 @~english Stream exception callback infomation
+class _MV_CC_STREAM_EXCEPTION_INFO_T_(Structure):
+ pass
+_MV_CC_STREAM_EXCEPTION_INFO_T_._fields_ = [
+ ('chSerialNumber', c_char * INFO_MAX_BUFFER_SIZE), ## @~chinese 设备序列号 @~english Device serial number
+ ('nStreamIndex', c_uint), ## @~chinese 流通道序号 @~english Stream index
+ ('enExceptionType', MV_CC_STREAM_EXCEPTION_TYPE), ## @~chinese 流异常类型 @~english Exception type
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_STREAM_EXCEPTION_INFO = _MV_CC_STREAM_EXCEPTION_INFO_T_
+
+
+# \~chinese Event事件回调信息\ @~english Event callback infomation
+class _MV_EVENT_OUT_INFO_(Structure):
+ pass
+_MV_EVENT_OUT_INFO_._fields_ = [
+ ('EventName', c_char * MAX_EVENT_NAME_SIZE), ## @~chinese Event名称 @~english Event name
+ ('nEventID', c_ushort), ## @~chinese Event号 @~english Event ID
+ ('nStreamChannel', c_ushort), ## @~chinese 流通道序号 @~english Circulation number
+ ('nBlockIdHigh', c_uint), ## @~chinese 帧号高位 (暂无固件支持) @~english BlockId high, not support
+ ('nBlockIdLow', c_uint), ## @~chinese 帧号低位 (暂无固件支持) @~english BlockId low, not support
+ ('nTimestampHigh', c_uint), ## @~chinese 时间戳高位 @~english Timestramp high
+ ('nTimestampLow', c_uint), ## @~chinese 时间戳低位 @~english Timestramp low
+ ('pEventData', c_void_p), ## @~chinese Event数据 (暂无固件支持) @~english Event data, not support
+ ('nEventDataSize', c_uint), ## @~chinese Event数据长度 (暂无固件支持) @~english Event data len, not support
+ ('nReserved', c_uint * 16), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_EVENT_OUT_INFO = _MV_EVENT_OUT_INFO_
+
+# \~chinese 文件存取 @~english File Access
+class _MV_CC_FILE_ACCESS_T(Structure):
+ pass
+_MV_CC_FILE_ACCESS_T._fields_ = [
+ ('pUserFileName', c_char_p), ## @~chinese 用户文件名 @~english User file name
+ ('pDevFileName', c_char_p), ## @~chinese 设备文件名 @~english Device file name
+ ('nReserved', c_uint * 32), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_FILE_ACCESS = _MV_CC_FILE_ACCESS_T
+
+# \~chinese 文件存取进度 @~english File Access Progress
+class _MV_CC_FILE_ACCESS_PROGRESS_T(Structure):
+ pass
+_MV_CC_FILE_ACCESS_PROGRESS_T._fields_ = [
+ ('nCompleted', int64_t), ## @~chinese 已完成的长度 @~english Completed Length
+ ('nTotal', int64_t), ## @~chinese 总长度 @~english Total Length
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_FILE_ACCESS_PROGRESS = _MV_CC_FILE_ACCESS_PROGRESS_T
+
+
+# \~chinese 文件存取 @~english File Access
+class _MV_CC_FILE_ACCESS_E(Structure):
+ pass
+_MV_CC_FILE_ACCESS_E._fields_ = [
+ ('pUserFileBuf', POINTER(c_char)), ## @~chinese 用户文件数据 @~english User file data
+ ('pFileBufSize', c_uint), ## @~chinese 用户数据缓存大小 @~english data buffer size
+ ('pFileBufLen', c_uint), ## @~chinese 用户数据缓存长度 @~english data buffer len
+ ('pDevFileName', c_char_p), ## @~chinese 设备文件名 @~english Device file name
+ ('nReserved', c_uint * 32), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_FILE_ACCESS_EX = _MV_CC_FILE_ACCESS_E
+
+# values for enumeration '_MV_GIGE_TRANSMISSION_TYPE_'
+_MV_GIGE_TRANSMISSION_TYPE_ = c_int # enum
+MV_GIGE_TRANSMISSION_TYPE = _MV_GIGE_TRANSMISSION_TYPE_
+
+# 传输模式,可以为单播模式、组播模式等 @~english Transmission type
+class _MV_TRANSMISSION_TYPE_T(Structure):
+ pass
+_MV_TRANSMISSION_TYPE_T._fields_ = [
+ ('enTransmissionType', MV_GIGE_TRANSMISSION_TYPE), ## @~chinese 传输模式 @~english Transmission type
+ ('nDestIp', c_uint), ## @~chinese 目标IP,组播模式下有意义 @~english Destination IP
+ ('nDestPort', c_ushort), ## @~chinese 目标Port,组播模式下有意义 @~english Destination port
+ ('nReserved', c_uint * 32), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_TRANSMISSION_TYPE = _MV_TRANSMISSION_TYPE_T
+
+# \~chinese 动作命令信息 @~english Action Command
+class _MV_ACTION_CMD_INFO_T(Structure):
+ pass
+_MV_ACTION_CMD_INFO_T._fields_ = [
+ ('nDeviceKey', c_uint), ## @~chinese 设备密钥 @~english Device key
+ ('nGroupKey', c_uint), ## @~chinese 组键 @~english Group key
+ ('nGroupMask', c_uint), ## @~chinese 组掩码 @~english Group mask
+ ('bActionTimeEnable', c_uint), ## @~chinese 只有设置成1时Action Time才有效,非1时无效 @~english Action time enable
+ ('nActionTime', int64_t), ## @~chinese 预定的时间,和主频有关 @~english Action time
+ ('pBroadcastAddress', STRING), ## @~chinese 广播包地址 @~english Broadcast address
+ ('nTimeOut', c_uint), ## @~chinese 等待ACK的超时时间,如果为0表示不需要ACK @~english Timeout
+ ('bSpecialNetEnable', c_uint), ## @~chinese只有设置成1时指定的网卡IP才有效,非1时无效 @~english Special IP Enable
+ ('nSpecialNetIP', c_uint), ## @~chinese 指定的网卡IP @~english Special Net IP address
+ ('nReserved', c_uint * 14), ## @~chinese 预留 @~english Reserved bytes
+]
+MV_ACTION_CMD_INFO = _MV_ACTION_CMD_INFO_T
+
+# \~chinese 动作命令返回信息 @~english Action Command Result
+class _MV_ACTION_CMD_RESULT_T(Structure):
+ pass
+_MV_ACTION_CMD_RESULT_T._fields_ = [
+ ('strDeviceAddress', c_ubyte * 16), ## @~chinese IP配置选项 @~english IP address of the device
+ #1.0x0000:success.
+ #2.0x8001:Command is not supported by the device.
+ #3.0x8013:The device is not synchronized to a master clock to be used as time reference.
+ #4.0x8015:A device queue or packet data has overflowed.
+ #5.0x8016:The requested scheduled action command was requested at a time that is already past.
+ ('nStatus', c_int), ## @~chinese 状态码 @~english status
+ ('nReserved', c_uint * 4), ## @~chinese 预留 @~english Reserved bytes
+]
+MV_ACTION_CMD_RESULT = _MV_ACTION_CMD_RESULT_T
+
+# \~chinese 动作命令返回信息列表 @~english Action Command Result List
+class _MV_ACTION_CMD_RESULT_LIST_T(Structure):
+ pass
+_MV_ACTION_CMD_RESULT_LIST_T._fields_ = [
+ ('nNumResults', c_uint), ## @~chinese 返回值个数 @~english Num Results
+ ('pResults', POINTER(MV_ACTION_CMD_RESULT)), ## @~chinese 动作命令返回信息 @~english action command result list
+]
+MV_ACTION_CMD_RESULT_LIST = _MV_ACTION_CMD_RESULT_LIST_T
+
+# values for enumeration 'MV_XML_InterfaceType'
+MV_XML_InterfaceType = c_int # enum
+
+# values for enumeration 'MV_XML_AccessMode'
+MV_XML_AccessMode = c_int # enum
+
+
+#/ \~chinese 节点名称 @~english Node Name
+class _MVCC_NODE_NAME_T(Structure):
+ pass
+_MVCC_NODE_NAME_T._fields_ = [
+ ('strName', c_char * MV_MAX_NODE_NAME_LEN), #/< \~chinese 节点名称 @~english Nodes Name
+ ('nReserved', c_uint * 4), #/< \~chinese 预留 @~english Reserved
+]
+MVCC_NODE_NAME = _MVCC_NODE_NAME_T
+
+#/ \~chinese 节点列表 @~english Node List
+class _MVCC_NODE_NAME_LIST_T(Structure):
+ pass
+_MVCC_NODE_NAME_LIST_T._fields_ = [
+ ('nNodeNum', c_uint), #/< \~chinese 节点个数 @~english Number of Node
+ ('stNodeName', MVCC_NODE_NAME * MV_MAX_NODE_NUM), #/< \~chinese 节点名称 @~english Node Name
+ ('nReserved', c_uint * 4), #< \~chinese 预留 @~english Reserved
+]
+MVCC_NODE_NAME_LIST = _MVCC_NODE_NAME_LIST_T
+
+# values for enumeration '_MVCC_NODE_ERR_TYPE_'
+_MVCC_NODE_ERR_TYPE_ = c_int # enum
+MVCC_NODE_ERR_TYPE = _MVCC_NODE_ERR_TYPE_
+
+#/ \~chinese 错误信息 @~english Error Name
+class _MVCC_NODE_ERROR_T(Structure):
+ pass
+_MVCC_NODE_ERROR_T._fields_ = [
+ ('strName', c_char * 64), #/< \~chinese 节点名称 @~english Nodes Name
+ ('enErrType', MVCC_NODE_ERR_TYPE), #/< \~chinese 错误类型 @~english Error Type
+ ('nReserved', c_uint * 4), #< \~chinese 预留 @~english Reserved
+]
+MVCC_NODE_ERROR = _MVCC_NODE_ERROR_T
+
+
+#/ \~chinese 错误信息列表 @~english Error List
+class _MVCC_NODE_ERROR_LIST_T(Structure):
+ pass
+_MVCC_NODE_ERROR_LIST_T._fields_ = [
+ ('nErrorNum', c_uint), #/< \~chinese 错误个数 @~english Number of Error
+ ('stNodeError', MVCC_NODE_ERROR * 64), #/< \~chinese 错误信息 @~english Error Name
+ ('nReserved', c_uint * 4), #/< \~chinese 预留 @~english Reserved
+]
+MVCC_NODE_ERROR_LIST = _MVCC_NODE_ERROR_LIST_T
+
+
+# \~chinese 枚举类型值 @~english Enumeration Value
+class _MVCC_ENUMVALUE_T(Structure):
+ pass
+_MVCC_ENUMVALUE_T._fields_ = [
+ ('nCurValue', c_uint), ## @~chinese 当前值 @~english Current Value
+ ('nSupportedNum', c_uint), ## @~chinese 数据的有效数据个数 @~english Number of valid data
+ ('nSupportValue', c_uint * MV_MAX_XML_SYMBOLIC_NUM), ## @~chinese 支持值列表 @~english Support value list
+ ('nReserved', c_uint * 4), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_ENUMVALUE = _MVCC_ENUMVALUE_T
+
+#/ \~chinese 枚举类型值 @~english Enumeration Value
+class _MVCC_ENUMVALUE_EX_T(Structure):
+ pass
+_MVCC_ENUMVALUE_EX_T._fields_ = [
+ ('nCurValue', c_uint), #\~chinese 当前值 @~english Current Value
+ ('nSupportedNum', c_uint), #\~chinese 数据的有效数据个数 @~english Number of valid data
+ ('nSupportValue', c_uint * 256), #\~chinese 支持的枚举值 @~english Support Value
+ ('nReserved', c_uint * 4), #\~chinese 预留 @~english Reserved
+]
+MVCC_ENUMVALUE_EX = _MVCC_ENUMVALUE_EX_T
+
+
+# \~chinese 枚举类型条目 @~english Enumeration Entry
+class _MVCC_ENUMENTRY_T(Structure):
+ pass
+_MVCC_ENUMENTRY_T._fields_ = [
+ ('nValue', c_uint), ## @~chinese 指定值 @~english Value
+ ('chSymbolic', c_char * MV_MAX_SYMBOLIC_LEN), ## @~chinese 指定值对应的符号 @~english Symbolic
+
+ ('nReserved', c_uint * 4), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_ENUMENTRY = _MVCC_ENUMENTRY_T
+
+
+
+# \~chinese Int类型值 @~english Int Value
+class _MVCC_INTVALUE_T(Structure):
+ pass
+_MVCC_INTVALUE_T._fields_ = [
+ ('nCurValue', c_uint), ## @~chinese 当前值 @~english Current Value
+ ('nMax', c_uint), ## @~chinese 最大值 @~english Max Value
+ ('nMin', c_uint), ## @~chinese 最小值 @~english Min Value
+ ('nInc', c_uint), ## @~chinese 步径 @~english Step size
+ ('nReserved', c_uint * 4), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_INTVALUE = _MVCC_INTVALUE_T
+
+# \~chinese Int类型值Ex @~english Int Value Ex
+class _MVCC_INTVALUE_EX_T(Structure):
+ pass
+_MVCC_INTVALUE_EX_T._fields_ = [
+ ('nCurValue', int64_t), ## @~chinese 当前值 @~english Current Value
+ ('nMax', int64_t), ## @~chinese 最大值 @~english Max Value
+ ('nMin', int64_t), ## @~chinese 最小值 @~english Min Value
+ ('nInc', int64_t), ## @~chinese 步径 @~english Step size
+ ('nReserved', c_uint * 16), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_INTVALUE_EX = _MVCC_INTVALUE_EX_T
+
+# \~chinese Float类型值 @~english Float Value
+class _MVCC_FLOATVALUE_T(Structure):
+ pass
+_MVCC_FLOATVALUE_T._fields_ = [
+ ('fCurValue', c_float), ## @~chinese 当前值 @~english Current Value
+ ('fMax', c_float), ## @~chinese 最大值 @~english Max Value
+ ('fMin', c_float), ## @~chinese 最小值 @~english Min Value
+ ('nReserved', c_uint * 4), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_FLOATVALUE = _MVCC_FLOATVALUE_T
+
+# \~chinese String类型值 @~english String Value
+class _MVCC_STRINGVALUE_T(Structure):
+ pass
+_MVCC_STRINGVALUE_T._fields_ = [
+ ('chCurValue', c_char * 256), ## @~chinese 当前值 @~english Current Value
+ ('nMaxLength', int64_t), ## @~chinese 最大长度 @~english Max length
+ ('nReserved', c_uint * 2), ## @~chinese 预留 @~english Reserved bytes
+]
+MVCC_STRINGVALUE = _MVCC_STRINGVALUE_T
+
+
+# \~chinese 辅助线颜色 @~english Color of Auxiliary Line
+class _MVCC_COLORF(Structure):
+ pass
+_MVCC_COLORF._fields_ = [
+ ('fR', c_float),
+ ## @~chinese 红色,根据像素颜色的相对深度,范围为[0.0 , 1.0],代表着[0, 255]的颜色深度 @~english Red,Range[0.0, 1.0]
+ ('fG', c_float),
+ ## @~chinese 绿色,根据像素颜色的相对深度,范围为[0.0 , 1.0],代表着[0, 255]的颜色深度 @~english Green,Range[0.0, 1.0]
+ ('fB', c_float),
+ ## @~chinese 蓝色,根据像素颜色的相对深度,范围为[0.0 , 1.0],代表着[0, 255]的颜色深度 @~english Blue,Range[0.0, 1.0]
+ ('fAlpha', c_float),
+ ## @~chinese 透明度,根据像素颜色的相对透明度,范围为[0.0 , 1.0] (此参数功能暂不支持) @~english Alpha,Range[0.0, 1.0](Not Support)
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MVCC_COLORF = _MVCC_COLORF
+
+# \~chinese 自定义点 @~english Point defined
+class _MVCC_POINTF(Structure):
+ pass
+_MVCC_POINTF._fields_ = [
+ ('fX', c_float),
+ ## @~chinese 该点距离图像左边缘距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Left,Range[0.0, 1.0]
+ ('fY', c_float),
+ ## @~chinese 该点距离图像上边缘距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Top,Range[0.0, 1.0]
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MVCC_POINTF = _MVCC_POINTF
+
+# \~chinese 矩形框区域信息 @~english Rect Area Info
+class _MVCC_RECT_INFO(Structure):
+ pass
+_MVCC_RECT_INFO._fields_ = [
+ ('fTop', c_float),
+ ## @~chinese 矩形上边缘距离图像上边缘的距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Top,Range[0, 1.0]
+ ('fBottom', c_float),
+ ## @~chinese 矩形下边缘距离图像下边缘的距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Bottom,Range[0, 1.0]
+ ('fLeft', c_float),
+ ## @~chinese 矩形左边缘距离图像左边缘的距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Left,Range[0, 1.0]
+ ('fRight', c_float),
+ ## @~chinese 矩形右边缘距离图像右边缘的距离,根据图像的相对位置,范围为[0.0 , 1.0] @~english Distance From Right,Range[0, 1.0]
+ ('stColor', MVCC_COLORF), ## @~chinese 辅助线颜色信息 @~english Color of Auxiliary Line
+ ('nLineWidth', c_uint), ## @~chinese 辅助线宽度,宽度只能是1或2 @~english Width of Auxiliary Line, width is 1 or 2
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MVCC_RECT_INFO = _MVCC_RECT_INFO
+
+# \~chinese 圆形框区域信息 @~english Circle Area Info
+class _MVCC_CIRCLE_INFO(Structure):
+ pass
+_MVCC_CIRCLE_INFO._fields_ = [
+ ('stCenterPoint', MVCC_POINTF), ## @~chinese 圆心信息 @~english Circle Point Info
+ ('fR1', c_float),
+ ## @~chinese 宽向半径,根据图像的相对位置[0, 1.0],半径与圆心的位置有关,需保证画出的圆在显示框范围之内,否则报错 @~english Width Radius, Range[0, 1.0]
+ ('fR2', c_float),
+ ## @~chinese高向半径,根据图像的相对位置[0, 1.0],半径与圆心的位置有关,需保证画出的圆在显示框范围之内,否则报错 @~english Height Radius, Range[0, 1.0]
+ ('stColor', MVCC_COLORF), ## @~chinese 辅助线颜色信息 @~english Color of Auxiliary Line
+ ('nLineWidth', c_uint), ## @~chinese 辅助线宽度,宽度只能是1或2 @~english Width of Auxiliary Line, width is 1 or 2
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MVCC_CIRCLE_INFO = _MVCC_CIRCLE_INFO
+
+# \~chinese 线条辅助线信息 @~english Linear Auxiliary Line Info
+class _MVCC_LINES_INFO(Structure):
+ pass
+_MVCC_LINES_INFO._fields_ = [
+ ('stStartPoint', MVCC_POINTF), ## @~chinese 线条辅助线的起始点坐标 @~english The Start Point of Auxiliary Line
+ ('stEndPoint', MVCC_POINTF), ## @~chinese线条辅助线的终点坐标 @~english The End Point of Auxiliary Line
+ ('stColor', MVCC_COLORF), ## @~chinese 辅助线颜色信息 @~english Color of Auxiliary Line
+ ('nLineWidth', c_uint), ## @~chinese 辅助线宽度,宽度只能是1或2 @~english Width of Auxiliary Line, width is 1 or 2
+ ('nReserved', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MVCC_LINES_INFO = _MVCC_LINES_INFO
+
+# \~chinese 图像重构后的图像列表 @~english List of images after image reconstruction
+class _MV_OUTPUT_IMAGE_INFO_(Structure):
+ pass
+_MV_OUTPUT_IMAGE_INFO_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english pixel format
+ ('pBuf', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nBufLen', c_uint), ## @~chinese 输出数据长度 @~english Output data length
+ ('nBufSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided output buffer size
+ ('nRes', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_OUTPUT_IMAGE_INFO = _MV_OUTPUT_IMAGE_INFO_
+
+# \~chinese 重构图像参数信息 @~english Restructure image parameters
+class _MV_RECONSTRUCT_IMAGE_PARAM_(Structure):
+ pass
+_MV_RECONSTRUCT_IMAGE_PARAM_._fields_ = [
+ ('nWidth', c_uint), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_uint), ## @~chinese 图像高 @~english Image Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english pixel format
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english input data size
+ ('nExposureNum', c_uint), ## @~chinese 曝光个数(1-8] @~english Exposure number
+ ('enReconstructMethod', MV_IMAGE_RECONSTRUCTION_METHOD), ## @~chinese 图像重构方式 @~english Image restructuring method
+ ('stDstBufList', MV_OUTPUT_IMAGE_INFO * MV_MAX_SPLIT_NUM), ## @~chinese 输出数据缓存信息 @~english Output data info
+ ('nRes', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_RECONSTRUCT_IMAGE_PARAM = _MV_RECONSTRUCT_IMAGE_PARAM_
+
+
+# 串口信息 @~english Serial Port Info
+class _MV_CAML_SERIAL_PORT_(Structure):
+ pass
+_MV_CAML_SERIAL_PORT_._fields_ = [
+ ('chSerialPort', c_char * INFO_MAX_BUFFER_SIZE), ## @~chinese 串口号 @~english Serial Port
+ ('nRes', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CAML_SERIAL_PORT = _MV_CAML_SERIAL_PORT_
+
+# 本机串口列表 @~english serial port list
+class _MV_CAML_SERIAL_PORT_LIST_(Structure):
+ pass
+_MV_CAML_SERIAL_PORT_LIST_._fields_ = [
+ ('nSerialPortNum', c_uint), ## @~chinese 串口数量 @~english Serial Port Num
+ ('stSerialPort', MV_CAML_SERIAL_PORT * MV_MAX_SERIAL_PORT_NUM), ## @~chinese 串口信息 @~english Serial Port Information
+ ('nRes', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CAML_SERIAL_PORT_LIST = _MV_CAML_SERIAL_PORT_LIST_
+
+
+
+#下面为不推荐使用的 定义
+
+
+# \~chinese 显示帧信息 @~english Display frame information
+class _MV_DISPLAY_FRAME_INFO_(Structure):
+ pass
+_MV_DISPLAY_FRAME_INFO_._fields_ = [
+ ('hWnd', c_void_p), ## @~chinese 窗口句柄 @~english Windows handle
+ ('pData', POINTER(c_ubyte)), ## @~chinese 显示的数据 @~english Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 数据长度 @~english Data Size
+ ('nWidth', c_ushort), ## @~chinese 图像宽 @~english Width
+ ('nHeight', c_ushort), ## @~chinese 图像高 @~english Height
+ ('enPixelType', MvGvspPixelType), ## @~chinese 像素格式 @~english Pixel format
+ ('enRenderMode', c_uint), ## @~chinese 图像渲染方式 0-GDI(默认), 1-D3D, 2-OPENGL @~english Render mode 0-GDI(default), 1-D3D, 2-OPENGL
+ ('nRes', c_uint * 3), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_DISPLAY_FRAME_INFO = _MV_DISPLAY_FRAME_INFO_
+
+
+
+# values for enumeration 'MV_SAVE_POINT_CLOUD_FILE_TYPE'
+MV_SAVE_POINT_CLOUD_FILE_TYPE = c_int # enum
+
+# \~chinese 保存3D数据到缓存 @~english Save 3D data to buffer
+class _MV_SAVE_POINT_CLOUD_PARAM_(Structure):
+ pass
+_MV_SAVE_POINT_CLOUD_PARAM_._fields_ = [
+ ('nLinePntNum', c_uint), ## @~chinese 每一行点的数量,即图像宽 @~english The number of points in each row,which is the width of the image
+ ('nLineNum', c_uint), ## @~chinese 行数,即图像高 @~english The number of rows,which is the height of the image
+ ('enSrcPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english The pixel format of the input data
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input data size
+ ('pDstBuf', POINTER(c_ubyte)), ## @~chinese 输出像素数据缓存 @~english Output pixel data buffer
+ ('nDstBufSize', c_uint), ## @~chinese 提供的输出缓冲区大小(nLinePntNum * nLineNum * (16*3 + 4) + 2048) @~english Output buffer size provided (nLinePntNum * nLineNum * (16*3 + 4) + 2048)
+ ('nDstBufLen', c_uint), ## @~chinese 输出像素数据缓存长度 @~english Output pixel data buffer size
+ ('enPointCloudFileType', MV_SAVE_POINT_CLOUD_FILE_TYPE), ## @~chinese 提供输出的点云文件类型 @~english Output point data file type provided
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_SAVE_POINT_CLOUD_PARAM = _MV_SAVE_POINT_CLOUD_PARAM_
+
+
+
+# \~chinese 图片保存参数 @~english Save Image Parameters
+class _MV_SAVE_IMAGE_PARAM_T_EX_(Structure):
+ pass
+_MV_SAVE_IMAGE_PARAM_T_EX_._fields_ = [
+ ('pData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input Data Size
+ ('enPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english Input Data Pixel Format
+ ('nWidth', c_ushort), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_ushort), ## @~chinese 图像高 @~english Image Height
+ ('pImageBuffer', POINTER(c_ubyte)), ## @~chinese 输出图片缓存 @~english Output Image Buffer
+ ('nImageLen', c_uint), ## @~chinese 输出图片大小 @~english Output Image Size
+ ('nBufferSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Output buffer size provided
+ ('enImageType', MV_SAVE_IAMGE_TYPE), ## @~chinese 输出图片格式 @~english Output Image Format
+ ('nJpgQuality', c_uint), ## @~chinese 编码质量, (50-99] @~english Encoding quality, (50-99]
+ ## @~chinese ch:Bayer格式转为RGB24的插值方法 0-快速 1-均衡 2-最优 3-最优+ , RBGG/BRGG/GGRB/GGBR相关像素格式不支持0和3
+ ## @~english en:Interpolation method of convert Bayer to RGB24 0-Fast 1-Equilibrium 2-Optimal 3-Optimal plus , RBGG/BRGG/GGRB/GGBR pixel formats do not support 0 and 3.
+ ('iMethodValue', c_uint),
+ ('nReserved', c_uint * 3), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_SAVE_IMAGE_PARAM_EX = _MV_SAVE_IMAGE_PARAM_T_EX_
+
+
+# \~chinese 保存BMP、JPEG、PNG、TIFF图片文件的参数 @~english Save BMP、JPEG、PNG、TIFF image file parameters
+class _MV_SAVE_IMG_TO_FILE_PARAM_(Structure):
+ pass
+_MV_SAVE_IMG_TO_FILE_PARAM_._fields_ = [
+ ('enPixelType', MvGvspPixelType), ## @~chinese 输入数据的像素格式 @~english The pixel format of the input data
+ ('pData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input Data Buffer
+ ('nDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input Data Size
+ ('nWidth', c_ushort), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_ushort), ## @~chinese 图像高 @~english Image Height
+ ('enImageType', MV_SAVE_IAMGE_TYPE), ## @~chinese 输入图片格式 @~english Input Image Format
+ ('nQuality', c_uint), ## @~chinese JPG编码质量(50-99] @~english JPG Encoding quality(50-99]
+ ('pImagePath', c_char * 256), ## @~chinese 输入文件路径 @~english Input file path
+ ## @~chinese ch:Bayer格式转为RGB24的插值方法 0-快速 1-均衡 2-最优 3-最优+ , RBGG/BRGG/GGRB/GGBR相关像素格式不支持0和3
+ ## @~english en:Interpolation method of convert Bayer to RGB24 0-Fast 1-Equilibrium 2-Optimal 3-Optimal plus , RBGG/BRGG/GGRB/GGBR pixel formats do not support 0 and 3.
+ ('iMethodValue', c_int),
+ ('nReserved', c_uint * 8), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_SAVE_IMG_TO_FILE_PARAM = _MV_SAVE_IMG_TO_FILE_PARAM_
+
+
+# \~chinese 图像转换结构体 @~english Pixel convert structure
+class _MV_CC_PIXEL_CONVERT_PARAM_T_(Structure):
+ pass
+_MV_CC_PIXEL_CONVERT_PARAM_T_._fields_ = [
+ ('nWidth', c_ushort), ## @~chinese 图像宽 @~english Image Width
+ ('nHeight', c_ushort), ## @~chinese 图像高 @~english Image Height
+ ('enSrcPixelType', MvGvspPixelType), ## @~chinese 源像素格式 @~english Source pixel format
+ ('pSrcData', POINTER(c_ubyte)), ## @~chinese 输入数据缓存 @~english Input data buffer
+ ('nSrcDataLen', c_uint), ## @~chinese 输入数据大小 @~english Input data size
+ ('enDstPixelType', MvGvspPixelType), ## @~chinese 目标像素格式 @~english Destination pixel format
+ ('pDstBuffer', POINTER(c_ubyte)), ## @~chinese 输出数据缓存 @~english Output data buffer
+ ('nDstLen', c_uint), ## @~chinese 输出数据大小 @~english Output data size
+ ('nDstBufferSize', c_uint), ## @~chinese 提供的输出缓冲区大小 @~english Provided outbut buffer size
+ ('nRes', c_uint * 4), ## @~chinese 保留字节 @~english Reserved bytes
+]
+MV_CC_PIXEL_CONVERT_PARAM = _MV_CC_PIXEL_CONVERT_PARAM_T_
+
+
+__all__ = ['_MV_ALL_MATCH_INFO_', 'MV_CC_FILE_ACCESS_PROGRESS',
+ 'N19_MV_CC_DEVICE_INFO_3DOT_0E', 'MV_FRAME_OUT',
+ 'MV_CAM_GAIN_MODE',
+ 'MV_ALL_MATCH_INFO',
+ 'MV_GIGE_TRANSTYPE_UNICAST_WITHOUT_RECV',
+ 'MV_TRIGGER_SOURCE_LINE0', 'MV_PointCloudFile_Undefined',
+ 'MV_TRIGGER_SOURCE_LINE2', 'MV_TRIGGER_SOURCE_LINE3',
+ 'AM_CycleDetect',
+ 'MV_GrabStrategy_UpcomingImage', 'IFT_IFloat',
+ 'MV_EVENT_OUT_INFO', 'MV_TRANSMISSION_TYPE',
+ 'uint_fast16_t', 'MV_CHUNK_DATA_CONTENT','MV_ACTION_CMD_RESULT',
+ 'MV_CC_INPUT_FRAME_INFO',
+ '_MV_ACTION_CMD_RESULT_T',
+ 'AM_RO', 'IFT_IPort', 'uint_least16_t',
+ '_MV_FRAME_OUT_INFO_EX_', '_MV_TRANSMISSION_TYPE_T',
+ 'MV_SAVE_IMAGE_PARAM_EX', 'MV_SAVE_IMAGE_PARAM_EX3', 'AM_RW', 'MV_XML_InterfaceType',
+ 'int32_t', '_MV_ACTION_CMD_INFO_T', 'intptr_t',
+ 'uint_least64_t', '_MV_NETTRANS_INFO_',
+ '_MV_CAM_TRIGGER_MODE_', 'int_least32_t',
+ 'MV_GIGE_TRANSTYPE_SUBNETBROADCAST',
+ 'MV_SAVE_POINT_CLOUD_FILE_TYPE',
+ 'MV_ACTION_CMD_RESULT_LIST',
+ 'MV_BALANCEWHITE_AUTO_CONTINUOUS',
+ '_MV_CHUNK_DATA_CONTENT_', 'MV_FormatType_AVI',
+ '_MV_CC_PIXEL_CONVERT_PARAM_T_','_MV_PIXEL_CONVERT_PARAM_EX_T_',
+ 'MV_GENTL_IF_INFO',
+ 'MV_ACQ_MODE_SINGLE',
+ 'MV_TRIGGER_MODE_ON',
+ 'int_least16_t', 'N22_MV_FRAME_OUT_INFO_EX_3DOT_1E',
+ 'N22_MV_FRAME_OUT_INFO_EX_3DOT_2E','N22_MV_FRAME_OUT_INFO_EX_3DOT_3E',
+ 'MV_GIGE_TRANSTYPE_LIMITEDBROADCAST', 'int_fast32_t',
+ '_MV_CAM_GAIN_MODE_',
+ 'MV_RECORD_FORMAT_TYPE', 'MV_CC_DEVICE_INFO',
+ 'IFT_ICommand', '_MV_RECORD_FORMAT_TYPE_',
+ '_MV_CAM_ACQUISITION_MODE_',
+ '_MVCC_STRINGVALUE_T',
+ 'MV_GIGE_TRANSTYPE_MULTICAST_WITHOUT_RECV',
+ '_MV_MATCH_INFO_NET_DETECT_', 'MVCC_INTVALUE',
+ 'MV_PointCloudFile_OBJ', '_MV_GIGE_TRANSMISSION_TYPE_',
+ '_MV_CC_RECORD_PARAM_T_',
+ '_MV_GENTL_IF_INFO_', 'MV_EXPOSURE_MODE_TIMED', 'intmax_t',
+ 'int16_t',
+ 'MV_DISPLAY_FRAME_INFO', '_MV_CC_FILE_ACCESS_PROGRESS_T',
+ '_MV_GRAB_STRATEGY_', '_MV_SAVE_IMG_TO_FILE_PARAM_', '_MV_SAVE_IMAGE_TO_FILE_PARAM_EX_',
+ 'int_fast64_t',
+ 'MV_XML_AccessMode',
+ 'MV_GAIN_MODE_ONCE', 'IFT_IInteger',
+ 'MV_CAM_BALANCEWHITE_AUTO', 'int_least8_t',
+ 'MV_PointCloudFile_CSV', 'IFT_IBase',
+ 'MV_TRIGGER_MODE_OFF', 'MV_Image_Bmp',
+ '_MV_GENTL_DEV_INFO_', 'MV_CC_FILE_ACCESS',
+ '_MV_CAM_EXPOSURE_AUTO_MODE_',
+ 'uint_least8_t',
+ 'MV_ACTION_CMD_INFO',
+ '_MV_CC_INPUT_FRAME_INFO_T_',
+ 'MV_GENTL_DEV_INFO_LIST', '_MV_CAM_TRIGGER_SOURCE_',
+ 'MV_GRAB_STRATEGY',
+ 'IFT_IEnumeration', 'uint64_t', 'uint8_t',
+ '_MV_GENTL_DEV_INFO_LIST_',
+ 'MV_CAM_GAMMA_SELECTOR',
+ 'MV_CamL_DEV_INFO', 'MV_GENTL_IF_INFO_LIST',
+ 'MV_CAM_TRIGGER_MODE', 'MV_GIGE_TRANSTYPE_MULTICAST',
+ 'uint16_t', 'uint_fast8_t',
+ '_MV_ACTION_CMD_RESULT_LIST_T',
+ '_MV_MATCH_INFO_USB_DETECT_',
+ '_MVCC_ENUMVALUE_T',
+ 'MV_SAVE_POINT_CLOUD_PARAM', '_MV_CC_DEVICE_INFO_',
+ 'IFT_IBoolean',
+ 'MV_MATCH_INFO_USB_DETECT', 'MV_PointCloudFile_PLY',
+ 'MVCC_ENUMVALUE',
+ 'IFT_IString',
+ 'MV_ACQ_MODE_CONTINUOUS',
+ 'MV_TRIGGER_SOURCE_FrequencyConverter',
+ 'MV_FRAME_EXTRA_NO_INFO','MV_FRAME_EXTRA_SUBIMAGES','MV_FRAME_EXTRA_MULTIPARTS',
+ 'MV_GIGE_PART_ZONE_TOP_DOWN','MV_GIGE_PART_ZONE_BOTTOM_UP',
+ 'MV_GIGE_DT_2D_IMAGE_1_PLANAR','MV_GIGE_DT_2D_IMAGE_2_PLANAR','MV_GIGE_DT_2D_IMAGE_3_PLANAR','MV_GIGE_DT_2D_IMAGE_4_PLANAR',
+ 'MV_GIGE_DT_3D_IMAGE_1_PLANAR','MV_GIGE_DT_3D_IMAGE_2_PLANAR','MV_GIGE_DT_3D_IMAGE_3_PLANAR','MV_GIGE_DT_3D_IMAGE_4_PLANAR',
+ 'MV_GIGE_DT_CONFIDENCE_MAP','MV_GIGE_DT_CHUNK_DATA','MV_GIGE_DT_JPEG_IMAGE','MV_GIGE_DT_JPEG2000_IMAGE',
+ 'MV_TRIGGER_SOURCE_COUNTER0',
+ 'MV_GAIN_MODE_OFF', '_MV_CC_DEVICE_INFO_LIST_',
+ 'MV_GIGE_DEVICE_INFO', '_MV_SAVE_IMAGE_PARAM_T_EX_', '_MV_SAVE_IMAGE_PARAM_EX3_',
+ 'AM_NA', 'uint_least32_t',
+ 'MV_CC_PIXEL_CONVERT_PARAM', 'MV_CC_PIXEL_CONVERT_PARAM_EX','AM_NI',
+ '_MVCC_INTVALUE_EX_T', 'uintptr_t', 'MV_Image_Tif',
+ 'MVCC_FLOATVALUE', 'MV_GIGE_TRANSTYPE_CAMERADEFINED',
+ '_MV_GENTL_IF_INFO_LIST_', 'MV_NETTRANS_INFO',
+ 'IFT_IRegister', 'MV_GIGE_TRANSMISSION_TYPE',
+ 'MV_EXPOSURE_AUTO_MODE_ONCE', 'MV_GIGE_TRANSTYPE_UNICAST',
+ 'int8_t', '_MV_GIGE_DEVICE_INFO_', 'IFT_IValue', 'AM_WO',
+ 'int_fast8_t',
+ 'MV_GAMMA_SELECTOR_SRGB','int_least64_t',
+ 'MV_GrabStrategy_LatestImagesOnly',
+ 'MV_EXPOSURE_AUTO_MODE_OFF', 'MV_CAM_EXPOSURE_AUTO_MODE',
+ 'MV_EXPOSURE_AUTO_MODE_CONTINUOUS',
+ 'MV_CAM_ACQUISITION_MODE', 'AM_Undefined',
+ 'MV_MATCH_INFO_NET_DETECT',
+ '_MV_CC_FILE_ACCESS_T',
+ '_MV_DISPLAY_FRAME_INFO_','MV_GrabStrategy_OneByOne',
+ 'MV_TRIGGER_SOURCE_SOFTWARE', 'MV_FormatType_Undefined',
+ 'MV_BALANCEWHITE_AUTO_ONCE',
+ 'uintmax_t', 'int_fast16_t',
+ '_MV_CAM_EXPOSURE_MODE_','MV_BALANCEWHITE_AUTO_OFF',
+ 'int64_t', 'MV_Image_Undefined', 'MV_GAIN_MODE_CONTINUOUS',
+ 'uint_fast32_t',
+ 'MV_CAM_TRIGGER_SOURCE', 'MV_GrabStrategy_LatestImages',
+ 'MV_Image_Png',
+ 'MV_Image_Jpeg', '_MV_CamL_DEV_INFO_',
+ '_MVCC_FLOATVALUE_T',
+ 'MV_FRAME_OUT_INFO_EX', '_MV_SAVE_POINT_CLOUD_PARAM_',
+ '_MV_CAM_BALANCEWHITE_AUTO_', 'MV_CC_RECORD_PARAM',
+ '_MV_USB3_DEVICE_INFO_',
+ 'MVCC_INTVALUE_EX', 'MV_EXPOSURE_MODE_TRIGGER_WIDTH',
+ 'MV_GIGE_TRANSTYPE_UNICAST_DEFINED_PORT',
+ 'MV_SAVE_IAMGE_TYPE','MV_GENTL_DEV_INFO',
+ 'MV_CAM_EXPOSURE_MODE',
+ 'MVCC_STRINGVALUE',
+ 'MvGvspPixelType',
+ 'MV_CC_DEVICE_INFO_LIST',
+ 'MV_TRIGGER_SOURCE_LINE1',
+ 'uint_fast64_t','_MVCC_INTVALUE_T',
+ 'IFT_ICategory',
+ 'MV_SAVE_IMG_TO_FILE_PARAM', 'MV_SAVE_IMAGE_TO_FILE_PARAM_EX', '_MV_FRAME_OUT_',
+ 'MV_GAMMA_SELECTOR_USER',
+ 'uint32_t', '_MV_CAM_GAMMA_SELECTOR_', 'MV_ACQ_MODE_MUTLI',
+ 'MV_CC_ISP_CONFIG_PARAM','_MV_CC_ISP_CONFIG_PARAM_T_',
+ 'MV_USB3_DEVICE_INFO', '_MV_EVENT_OUT_INFO_', 'MV_CC_FRAME_SPEC_INFO', 'MV_CC_HB_DECODE_PARAM','_MV_CC_HB_DECODE_PARAM_T_',
+ 'MV_SORT_METHOD', '_MV_SORT_METHOD_',
+ 'SortMethod_SerialNumber', 'SortMethod_UserID', 'SortMethod_CurrentIP_ASC', 'SortMethod_CurrentIP_DESC',
+ '_MV_IMG_ROTATION_ANGLE_', 'MV_IMG_ROTATION_ANGLE',
+ 'MV_IMAGE_ROTATE_90', 'MV_IMAGE_ROTATE_180', 'MV_IMAGE_ROTATE_270',
+ '_MV_IMG_FLIP_TYPE_', 'MV_IMG_FLIP_TYPE', 'MV_FLIP_VERTICAL', 'MV_FLIP_HORIZONTAL',
+ '_MV_CC_GAMMA_TYPE_', 'MV_CC_GAMMA_TYPE', 'MV_CC_GAMMA_TYPE_NONE', 'MV_CC_GAMMA_TYPE_VALUE',
+ 'MV_CC_GAMMA_TYPE_USER_CURVE', 'MV_CC_GAMMA_TYPE_LRGB2SRGB', 'MV_CC_GAMMA_TYPE_SRGB2LRGB',
+ 'MV_CC_STREAM_EXCEPTION_TYPE', '_MV_CC_STREAM_EXCEPTION_TYPE_',
+ 'MV_CC_STREAM_EXCEPTION_ABNORMAL_IMAGE', 'MV_CC_STREAM_EXCEPTION_LIST_OVERFLOW',
+ 'MV_CC_STREAM_EXCEPTION_LIST_EMPTY', 'MV_CC_STREAM_EXCEPTION_RECONNECTION',
+ 'MV_CC_STREAM_EXCEPTION_DISCONNECTED', 'MV_CC_STREAM_EXCEPTION_DEVICE',
+ 'MV_CC_STREAM_EXCEPTION_PARTIAL_IMAGE', 'MV_CC_STREAM_EXCEPTION_IMAGE_BUFFER_OVERFLOW',
+ '_MV_IMAGE_RECONSTRUCTION_METHOD_', 'MV_IMAGE_RECONSTRUCTION_METHOD', 'MV_SPLIT_BY_LINE',
+ 'MVCC_COLORF', '_MVCC_COLORF', '_MVCC_POINTF', 'MVCC_POINTF', '_MVCC_RECT_INFO', 'MVCC_RECT_INFO',
+ '_MVCC_CIRCLE_INFO', 'MVCC_CIRCLE_INFO', '_MVCC_LINES_INFO', 'MVCC_LINES_INFO', '_MV_OUTPUT_IMAGE_INFO_',
+ 'MV_OUTPUT_IMAGE_INFO', 'MV_RECONSTRUCT_IMAGE_PARAM', '_MV_RECONSTRUCT_IMAGE_PARAM_',
+ '_MVCC_ENUMENTRY_T', 'MVCC_ENUMENTRY','_MV_CC_CONTRAST_PARAM_T_', 'MV_CC_CONTRAST_PARAM',
+ '_MV_CC_CCM_PARAM_EX_T_', 'MV_CC_CCM_PARAM_EX', 'MV_CC_CCM_PARAM', '_MV_CC_CCM_PARAM_T_',
+ 'MV_CC_GAMMA_PARAM', '_MV_CC_GAMMA_PARAM_T_', 'MV_CC_FLIP_IMAGE_PARAM', '_MV_CC_FLIP_IMAGE_PARAM_T_',
+ '_MV_CC_ROTATE_IMAGE_PARAM_T_', 'MV_CC_ROTATE_IMAGE_PARAM', 'MV_CC_FILE_ACCESS_EX', '_MV_CC_FILE_ACCESS_E',
+ '_MV_DISPLAY_FRAME_INFO_EX_', 'MV_DISPLAY_FRAME_INFO_EX', 'MV_CML_DEVICE_INFO', '_MV_CML_DEVICE_INFO_',
+ 'MV_CXP_DEVICE_INFO', '_MV_CXP_DEVICE_INFO_', '_MV_XOF_DEVICE_INFO_', 'MV_XOF_DEVICE_INFO',
+ '_MV_INTERFACE_INFO_LIST_', 'MV_INTERFACE_INFO_LIST', '_MV_INTERFACE_INFO_', 'MV_INTERFACE_INFO',
+ '_MV_CAML_SERIAL_PORT_LIST_', 'MV_CAML_SERIAL_PORT_LIST', '_MV_CAML_SERIAL_PORT_', 'MV_CAML_SERIAL_PORT',
+ 'MVCC_NODE_ERR_NODE_INVALID','MVCC_NODE_ERR_ACCESS','MVCC_NODE_ERR_OUT_RANGE','MVCC_NODE_ERR_VERIFY_FAILD','MVCC_NODE_ERR_OTHER',
+ '_MV_GENTL_VIR_DEVICE_INFO_','MV_GENTL_VIR_DEVICE_INFO',
+ '_MV_CC_IMAGE_','MV_CC_IMAGE',
+ '_MV_CC_SAVE_IMAGE_PARAM_','MV_CC_SAVE_IMAGE_PARAM',
+ '_MV_CC_PURPLE_FRINGING_PARAM_T_','MV_CC_PURPLE_FRINGING_PARAM',
+ '_MVCC_NODE_NAME_T', 'MVCC_NODE_NAME',
+ '_MVCC_NODE_NAME_LIST_T','MVCC_NODE_NAME_LIST',
+ '_MVCC_NODE_ERROR_T', 'MVCC_NODE_ERROR',
+ '_MVCC_NODE_ERROR_LIST_T','MVCC_NODE_ERROR_LIST',
+ '_MVCC_ENUMVALUE_EX_T', 'MVCC_ENUMVALUE_EX',
+ '_MV_FRAME_EXTRA_INFO_TYPE_', 'MV_FRAME_EXTRA_INFO_TYPE',
+ '_MV_GIGE_ZONE_DIRECTION_', 'MV_GIGE_ZONE_DIRECTION',
+ '_MV_GIGE_ZONE_INFO_', 'MV_GIGE_ZONE_INFO',
+ 'N19_MV_GIGE_ZONE_INFO_3DOT_1E',
+ 'N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_2E',
+ 'N30_MV_GIGE_MULRI_PART_DATA_INFO_3DOT_3E',
+ 'MV_GIGE_PART_DATA_INFO',
+ '_MV_GIGE_MULTI_PART_DATA_TYPE_', 'MV_GIGE_MULTI_PART_DATA_TYPE',
+ '_MV_GIGE_MULTI_PART_INFO_', 'MV_GIGE_MULTI_PART_INFO',
+ '_MV_CC_STREAM_EXCEPTION_INFO_T_','MV_CC_STREAM_EXCEPTION_INFO']
diff --git a/wndMain/MvImport/MvCameraControl_class.py b/wndMain/MvImport/MvCameraControl_class.py
new file mode 100644
index 0000000..773ba25
--- /dev/null
+++ b/wndMain/MvImport/MvCameraControl_class.py
@@ -0,0 +1,3221 @@
+# -*- coding: utf-8 -*-
+
+import sys
+import platform
+import os
+import copy
+import ctypes
+
+from ctypes import *
+
+from PixelType_header import *
+from CameraParams_const import *
+from CameraParams_header import *
+from MvErrorDefine_const import *
+
+
+# 根据平台设置调用约定
+def get_platform_functype():
+ if platform.system() == 'Windows':
+ # 32位Windows使用WINFUNCTYPE,64位使用CFUNCTYPE
+ if sys.maxsize <= 2**32:
+ return WINFUNCTYPE
+ else:
+ return CFUNCTYPE
+ else:
+ return CFUNCTYPE
+
+
+def check_sys_and_update_dll():
+
+ global MvCamCtrldll
+ max_size = sys.maxsize
+ bit_info =""
+ if max_size > 2**32:
+ bit_info = "64"
+ else:
+ bit_info = "32"
+
+ MvCamCtrldllPath = ""
+ currentsystem = platform.system()
+
+ if currentsystem == 'Windows':
+ #print(" current is windows system .")
+ MvCamCtrldllPath = "C:\Program Files (x86)\Common Files\MVS\Runtime\Win64_x64\MvCameraControl.dll"
+ # if "winmode" in ctypes.WinDLL.__init__.__code__.co_varnames:
+ # MvCamCtrldll = WinDLL(MvCamCtrldllPath, winmode=0)
+ # else:
+ # MvCamCtrldll = WinDLL(MvCamCtrldllPath)
+
+ MvCamCtrldll = ctypes.cdll.LoadLibrary(MvCamCtrldllPath)
+ else:
+ architecture = platform.machine()
+ if architecture == 'aarch64':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/aarch64/libMvCameraControl.so"
+ elif architecture == 'x86_64':
+ if bit_info == "32":
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/32/libMvCameraControl.so"
+ else:
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/64/libMvCameraControl.so"
+ elif architecture == 'arm-none':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/arm-none/libMvCameraControl.so"
+ elif architecture == 'armhf':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/armhf/libMvCameraControl.so"
+ elif architecture == 'armv6l':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/armhf/libMvCameraControl.so"
+ elif architecture == 'armv7l':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/armhf/libMvCameraControl.so"
+ elif architecture == 'i386':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/32/libMvCameraControl.so"
+ elif architecture == 'i686':
+ MvCamCtrldllPath = os.getenv('MVCAM_COMMON_RUNENV') + "/32/libMvCameraControl.so"
+ else:
+ print ("machine: %s, not support." % architecture)
+
+ MvCamCtrldll = ctypes.cdll.LoadLibrary(MvCamCtrldllPath)
+
+
+#检测系统,并加载sdk库
+check_sys_and_update_dll()
+
+
+
+# 用于回调函数传入相机实例
+class _MV_PY_OBJECT_(Structure):
+ pass
+
+
+_MV_PY_OBJECT_._fields_ = [
+ ('PyObject', py_object),
+]
+MV_PY_OBJECT = _MV_PY_OBJECT_
+
+
+class MvCamera():
+
+ def __init__(self):
+ self._handle = c_void_p() # 记录当前连接设备的句柄
+ self.handle = pointer(self._handle) # 创建句柄指针
+
+
+ ## @addtogroup SDK 初始化 | en: SDK Initialization
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 初始化SDK
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Initialize SDK
+ # @return Success, return MV_OK. Failure, return error code
+ @staticmethod
+ def MV_CC_Initialize():
+ MvCamCtrldll.MV_CC_Initialize.restype = c_int
+ return MvCamCtrldll.MV_CC_Initialize()
+
+ ##
+ # @~chinese
+ # @brief 反初始化SDK,释放资源
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks main函数退出前调用
+
+ # @~english
+ # @brief Terminate SDK
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Called before the main function exits
+ @staticmethod
+ def MV_CC_Finalize():
+ MvCamCtrldll.MV_CC_Finalize.restype = c_int
+ return MvCamCtrldll.MV_CC_Finalize()
+
+ ##
+ # @~chinese
+ # @brief 获取SDK版本号
+ # @return 返回4字节版本号
+ # |主 |次 |修正 | 测试|
+ # 8bits 8bits 8bits 8bits
+ # @remarks 比如返回值为0x01000001,即SDK版本号为V1.0.0.1。
+
+ # @~english
+ # @brief Get SDK Version
+ # @return Always return 4 Bytes of version number
+ # |Main |Sub |Rev | Test|
+ # 8bits 8bits 8bits 8bits
+ # @remarks For example, if the return value is 0x01000001, the SDK version is V1.0.0.1.
+ @staticmethod
+ def MV_CC_GetSDKVersion():
+ MvCamCtrldll.MV_CC_GetSDKVersion.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetSDKVersion()
+ ## @}
+
+
+
+ ## @addtogroup ch: 相机的控制和取流接口 | en: Camera control and streaming
+ ## @{
+
+
+ ##
+ # @~chinese
+ # @brief 枚举设备
+ # @param nTLayerType [IN] 枚举传输层, 参数定义参见CameraParams.h定义, 如: #define MV_GIGE_DEVICE 0x00000001 GigE设备
+ # @param pstDevList [IN][OUT] 设备列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请,建议尽量避免多线程枚举操作。
+ # @remarks 参数枚举传输层,适配传入MV_GIGE_DEVICE、MV_1394_DEVICE、MV_USB_DEVICE、MV_CAMERALINK_DEVICE;MV_GIGE_DEVICE该参数
+ # 传出所有GiGE相关的设备信息(包含虚拟GiGE和GenTL下的GiGE设备),MV_USB_DEVICE该参数传出所有USB设备,包含虚拟USB设备。
+
+ # @~english
+ # @brief Enumerate Device
+ # @param nTLayerType [IN] Enumerate TLs, Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_GIGE_DEVICE 0x00000001
+ # @param pstDevList [IN][OUT] Device List
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The memory of the device list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+ # @remarks Transmission layer of enumeration, param only include MV_GIGE_DEVICE、MV_1394_DEVICE、MV_USB_DEVICE、MV_CAMERALINK_DEVICE;
+ # MV_GIGE_DEVICE can output virtual and GenTL GiGE devices, MV_USB_DEVICE can output all USB devices, include virtual usb devices.
+ @staticmethod
+ def MV_CC_EnumDevices(nTLayerType, stDevList):
+ MvCamCtrldll.MV_CC_EnumDevices.argtype = (c_uint, c_void_p)
+ MvCamCtrldll.MV_CC_EnumDevices.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumDevices(c_uint(nTLayerType), byref(stDevList))
+
+ ##
+ # @~chinese
+ # @brief 根据厂商名字枚举设备
+ # @param nTLayerType [IN] 枚举传输层, 参数定义参见CameraParams.h定义, 如: #define MV_GIGE_DEVICE 0x00000001 GigE设备
+ # @param pstDevList [IN][OUT] 设备列表
+ # @param strManufacturerName [IN] 厂商名字
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 参数枚举传输层,适配传入MV_GIGE_DEVICE、MV_1394_DEVICE、MV_USB_DEVICE、MV_CAMERALINK_DEVICE;MV_GIGE_DEVICE该参数
+ # 传出所有GiGE相关的设备信息(包含虚拟GiGE和GenTL下的GiGE设备),MV_USB_DEVICE该参数传出所有USB设备,包含虚拟USB设备。
+ # @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请,建议尽量避免多线程枚举操作。
+
+ # @~english
+ # @brief Enumerate device according to manufacture name
+ # @param nTLayerType [IN] Transmission layer of enumeration, , Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_GIGE_DEVICE 0x00000001
+ # @param pstDevList [IN][OUT] Device list
+ # @param strManufacturerName [IN] Manufacture Name
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Transmission layer of enumeration, param only include MV_GIGE_DEVICE、MV_1394_DEVICE、MV_USB_DEVICE、MV_CAMERALINK_DEVICE;
+ # MV_GIGE_DEVICE can output virtual and GenTL GiGE devices, MV_USB_DEVICE can output all USB devices, include virtual usb devices.
+ # @remarks The memory of the device list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied.
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+
+ @staticmethod
+ def MV_CC_EnumDevicesEx(nTLayerType, stDevList, strManufacturerName):
+ MvCamCtrldll.MV_CC_EnumDevicesEx.argtype = (c_uint, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EnumDevicesEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumDevicesEx(c_uint(nTLayerType), byref(stDevList),
+ strManufacturerName.encode('ascii'))
+
+
+ ##
+ # @~chinese
+ # @brief 枚举设备扩展(可指定排序方式枚举、根据厂商名字过滤)
+ # @param nTLayerType [IN] 枚举传输层(区分每一种传输层类型,不耦合), 参数定义参见CameraParams.h定义, 如: #define MV_GIGE_DEVICE 0x00000001 GigE设备
+ # @param pstDevList [IN][OUT] 设备列表
+ # @param strManufacturerName [IN] 厂商名字(可传NULL,即不过滤)
+ # @param enSortMethod [IN] 排序方式
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请,建议尽量避免多线程枚举操作
+ # strManufacturerName可传入NULL,若传入NULL则返回排好序的所有设备列表,若不为NULL则只返回排好序的指定厂商设备列表。
+
+ # @~english
+ # @brief Enumerate device according to the specified ordering
+ # @param nTLayerType [IN] Transmission layer of enumeration(All layer protocol type can input), Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_GIGE_DEVICE 0x00000001
+ # @param pstDevList [IN][OUT] Device list
+ # @param strManufacturerName [IN] Manufacture Name
+ # @param enSortMethod [IN] Sorting Method
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The memory of the device list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied.
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+ # strManufacturerName can be passed in NULL,if NULL is passed in, it will return the sorted list of all devices.
+ # If it is not NULL,it will only return the sorted list of the specified manufacturer's devices.
+ @staticmethod
+ def MV_CC_EnumDevicesEx2(nTLayerType, stDevList, strManufacturerName, enSortMethod):
+ MvCamCtrldll.MV_CC_EnumDevicesEx2.argtype = (c_uint, c_void_p, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_EnumDevicesEx2.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumDevicesEx2(c_uint(nTLayerType), byref(stDevList),
+ strManufacturerName.encode('ascii'), c_uint(enSortMethod))
+
+ ##
+ # @~chinese
+ # @brief 设备是否可连接
+ # @param pstDevInfo [IN] 设备信息结构体
+ # @param nAccessMode [IN] 访问权限,参数定义参见CameraParams.h定义, 如:#define MV_ACCESS_Exclusive 1 (该参数:仅对 MV_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE 类型的设备有效)
+ # @remarks GIGE相机: 读取设备CCP寄存器的值,判断当前状态是否具有某种访问权限
+ # 如果设备(MV_GENTL_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE)不支持 MV_ACCESS_ExclusiveWithSwitch、MV_ACCESS_ControlWithSwitch、MV_ACCESS_ControlSwitchEnable 、MV_ACCESS_ControlSwitchEnableWithKey这四种模式,接口返回false。
+ # (目前设备不支持这3种抢占模式,国际上主流的厂商的设备也都暂不支持这3种模式。)
+ # MV_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE 类型设备:按照nAccessMode,返回当前是否可以被连接;
+ # 该接口支持 虚拟相机,U3V相机,cxp, xof, cameralink采集卡相机, nAccessMode无效,如果相机没有被连接返回true, 如果设备被第三方连接,则返回false
+ # 该接口不支持CameraLink设备(返回false)
+ # @~english
+ # @brief Is the device accessible
+ # @param pstDevInfo [IN] Device Information Structure
+ # @param nAccessMode [IN] Access Right, Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_ACCESS_Exclusive 1 (This parameter is only valid for devices of type MV_GIGE-DEVICE/MV_GENTL_GIGE-DEVICE)
+ # @return Access, return true. Not access, return false
+ # @remarks Read device CCP register value and determine current access permission.
+ # If the device (MV_GENTL_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE) does not support the MV_ACCESS_ExclusiveWithSwitch, MV_ACCESS_ControlWithSwitch, MV_ACCESS_ControlSwitchEnable, and MV_ACCESS_ControlSwitchEnableWithKey modes, the interface returns false. (At present, the device does not support these three preemptive modes, and the devices of mainstream international manufacturers do not currently support these three modes.)
+ # MV_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE type device: returns whether it can be connected according to nAccessMode;
+ # This interface supports virtual cameras, U3V cameras, cxp, xof, cameralink capture card cameras, nAccessMode is invalid. If the camera is not connected, it returns true. If the device is connected by a third party, it returns false
+ # This interface does not support CameraLink devices (returns false)
+ @staticmethod
+ def MV_CC_IsDeviceAccessible(stDevInfo, nAccessMode):
+ MvCamCtrldll.MV_CC_IsDeviceAccessible.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_IsDeviceAccessible.restype = c_uint
+ return MvCamCtrldll.MV_CC_IsDeviceAccessible(byref(stDevInfo), nAccessMode)
+
+
+
+ ##
+ # @~chinese
+ # @brief 创建设备句柄
+ # @param handle [IN][OUT] 设备句柄
+ # @param pstDevInfo [IN] 设备信息结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 根据输入的设备信息,创建库内部必须的资源和初始化内部模块
+ # 通过该接口创建句柄,调用SDK接口,会默认生成SDK日志文件,如果不需要生成日志文件,可以将日志配置文件中的日志等级改成off
+
+ # @~english
+ # @brief Create Device Handle
+ # @param handle [IN][OUT] Device handle
+ # @param pstDevInfo [IN] Device Information Structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Create required resources within library and initialize internal module according to input device information.
+ # By creating a handle through this interface and calling the SDK interface, SDK log files will be generated by default. If no log file needs to be generated, the log level in the log configuration file can be changed to off
+ def MV_CC_CreateHandle(self, stDevInfo):
+ MvCamCtrldll.MV_CC_CreateHandle.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_CreateHandle.restype = c_uint
+ return MvCamCtrldll.MV_CC_CreateHandle(byref(self.handle), byref(stDevInfo))
+
+ ##
+ # @~chinese
+ # @brief 销毁设备句柄
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks MV_CC_DestroyHandle 如果传入采集卡句柄,其效果和 MV_CC_DestroyInterface 相同;
+
+ # @~english
+ # @brief Destroy Device Handle
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks If MV_CC_DestroyHandle passes in "Frame grabber handle", the effect is the same as the MV_CC_DestroyInterface
+ def MV_CC_DestroyHandle(self):
+ MvCamCtrldll.MV_CC_DestroyHandle.argtype = c_void_p
+ MvCamCtrldll.MV_CC_DestroyHandle.restype = c_uint
+ return MvCamCtrldll.MV_CC_DestroyHandle(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 打开设备
+ # @param handle [IN] 设备句柄
+ # @param nAccessMode [IN] 访问权限, 参数定义参见CameraParams.h定义, 如:#define MV_ACCESS_Exclusive 1 (仅对 MV_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE 类型的设备有效)
+ # @param nSwitchoverKey [IN] 切换访问权限时的密钥 (仅对 MV_GIGE_DEVICE 类型的设备有效)
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 根据设置的设备参数,找到对应的设备,连接设备, 调用接口时可不传入nAccessMode和nSwitchoverKey,此时默认设备访问模式为独占权限。
+ # MV_GIGE_DEVICE 类型设备,目前相机固件暂不支持MV_ACCESS_ExclusiveWithSwitch、MV_ACCESS_ControlWithSwitch、MV_ACCESS_ControlSwitchEnable、MV_ACCESS_ControlSwitchEnableWithKey这四种抢占模式, SDK接口支持设置
+ # MV_GENTL_GIGE_DEVICE 设备只支持 nAccessMode 是 MV_ACCESS_Exclusive 、MV_ACCESS_Control 、MV_ACCESS_Monitor权限
+ # 对于U3V设备,CXP,Cameralink(MV_CAMERALINK_DEVICE、MV_GENTL_CAMERALINK_DEVICE), Xof设备, 虚拟GEV, 虚拟U3V设备:nAccessMode、nSwitchoverKey这两个参数无效; 默认以控制权限打开设备;
+ # 该接口支持网口设备不枚举直接打开,不支持U口和GenTL设备不枚举打开设备
+
+ # @~english
+ # @brief Open Device
+ # @param handle [IN] Device handle
+ # @param nAccessMode [IN] Access Right, Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_ACCESS_Exclusive 1 (Effective only for the device type of MV_GIGE_DEVICE/MV_GENTL_GIGE_DEVICE)
+ # @param nSwitchoverKey [IN] Switch key of access right (Effective only for the device type of MV_GIGE_DEVICE)
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Find specific device and connect according to set device parameters.When calling the interface, the input of nAccessMode and nSwitchoverKey is optional,
+ # and the device access mode is exclusive. The device type of MV_GIGE_DEVICE, Currently the device firmware does not support the following preemption modes:
+ # MV_ACCESS_ExclusiveWithSwitch, MV_ACCESS_ControlWithSwitch, MV_ACCESS_ControlSwitchEnable, MV_ACCESS_ControlSwitchEnableWithKey; SDK Interface will return MV_OK.
+ # The device type of MV_GENTL_GIGE_DEVICE, only support nAccessMode as MV_ACCESS_Exclusive, MV_ACCESS_Control, MV_ACCESS_Monitor;
+ # For USB3Vision device, CXP device, Cameralink device(MV_CAMERALINK_DEVICE、MV_GENTL_CAMERALINK_DEVICE), Xof device, virtual GEV devoce, virtual U3V device,
+ # nAccessMode, nSwitchoverKey are invalid. Open device with MV_ACCESS_Control in default.
+ # This Interface support open without enumeration by GEV device,USB device and GenTL device don't support .
+ def MV_CC_OpenDevice(self, nAccessMode=MV_ACCESS_Exclusive, nSwitchoverKey=0):
+ MvCamCtrldll.MV_CC_OpenDevice.argtype = (c_void_p, c_uint32, c_uint16)
+ MvCamCtrldll.MV_CC_OpenDevice.restype = c_uint
+ return MvCamCtrldll.MV_CC_OpenDevice(self.handle, nAccessMode, nSwitchoverKey)
+
+ ##
+ # @~chinese
+ # @brief 关闭设备
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过MV_CC_OpenDevice连接设备后,可以通过该接口断开设备连接,释放资源
+
+ # @~english
+ # @brief Close Device
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After connecting to device through MV_CC_OpenDevice, use this interface to disconnect and release resources.
+ def MV_CC_CloseDevice(self):
+ MvCamCtrldll.MV_CC_CloseDevice.argtype = c_void_p
+ MvCamCtrldll.MV_CC_CloseDevice.restype = c_uint
+ return MvCamCtrldll.MV_CC_CloseDevice(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 判断设备是否处于连接状态
+ # @param handle [IN] 设备句柄
+ # @return 设备处于连接状态,返回true;没连接或失去连接,返回false
+
+ # @~english
+ # @brief Is The Device Connected
+ # @param handle [IN] Device handle
+ # @return Connected, return true. Not Connected or DIsconnected, return false
+ def MV_CC_IsDeviceConnected(self):
+ MvCamCtrldll.MV_CC_IsDeviceConnected.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_IsDeviceConnected.restype = c_bool
+ return MvCamCtrldll.MV_CC_IsDeviceConnected(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 注册图像数据回调
+ # @param handle [IN] 设备句柄
+ # @param cbOutput [IN] 回调函数指针
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过该接口可以设置图像数据回调函数,在MV_CC_CreateHandle之后即可调用, 图像数据采集有两种方式,两种方式不能复用:
+ # 方式一:调用MV_CC_RegisterImageCallBackEx设置图像数据回调函数,然后调用MV_CC_StartGrabbing开始采集,采集的图像数据在设置的回调函数中返回
+ # 方式二:调用MV_CC_StartGrabbing开始采集,然后在应用层循环调用MV_CC_GetOneFrameTimeout获取指定像素格式的帧数据,
+ # 获取帧数据时上层应用程序需要根据帧率控制好调用该接口的频率。
+ # 该接口不支持MV_CAMERALINK_DEVICE 类型的设备。
+
+ # @~english
+ # @brief Register the image callback function
+ # @param handle [IN] Device handle
+ # @param cbOutput [IN] Callback function pointer
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After MV_CC_CreateHandle, call this interface to set image data callback function.There are two available image data acquisition modes, and cannot be used together:
+ # Mode 1: Call MV_CC_RegisterImageCallBack to set image data callback function, and then callMV_CC_StartGrabbing to start acquiring. The acquired image data will return in the set callback function.
+ # Mode 2: Call MV_CC_StartGrabbing to start acquiring, and then call MV_CC_GetOneFrameTimeout repeatedly in application layer to get frame data of specified pixel format. When getting frame data,
+ # the frequency of calling this interface should be controlled by upper layer application according to frame rate.
+ # This interface does not support devices of type MV_CAMERALINK_DEVICE
+ def MV_CC_RegisterImageCallBackEx(self, CallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterImageCallBackEx.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterImageCallBackEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterImageCallBackEx(self.handle, CallBackFun, pUser)
+
+ ##
+ # @~chinese
+ # @brief 注册图像数据回调,回调函数结束后,需要调用MV_CC_FreeImageBuffer才能回收图像缓存
+ # @param handle [IN] 设备句柄
+ # @param cbOutput [IN] 回调函数指针
+ # @param bAutoFree [IN] 图像缓存自动回收标记(true:回调结束后,图像缓存会被SDK回收;false:回调结束后,需要调用MV_CC_FreeImageBuffer接口才能回收图像缓存)
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过该接口可以设置图像数据回调函数,在MV_CC_CreateHandle之后即可调用。
+ # 获取帧数据时上层应用程序需要根据帧率控制好调用该接口的频率。
+ # 该接口不支持MV_CAMERALINK_DEVICE 类型的设备。
+ # 回调函数中的pstFrame参数为SDK内部临时变量,其内容需拷贝后才能在图像回调外使用。
+
+ # @~english
+ # @brief Register the image callback function, Call MV_CC_FreeImageBuffer() to release the buffer after the callback function ends.
+ # @param handle [IN] Device handle
+ # @param cbOutput [IN] Callback function pointer
+ # @param bAutoFree [IN] It refers to the mark for automatic releasing of image buffer. (true:The image buffer will be released and reused by SDK after callback. false:After callback, it is required to call MV_CC_FreeImageBuffer() to release and reuse the image buffer.)
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After MV_CC_CreateHandle, call this interface to set image data callback function.
+ # the frequency of calling this interface should be controlled by upper layer application according to frame rate.
+ # This interface does not support devices of type MV_CAMERALINK_DEVICE
+ # The pstFrame parameter in the callback function is an internal temporary variable of the SDK, and its content must be copied before it can be used outside the callback.
+ def MV_CC_RegisterImageCallBackEx2(self, CallBackFun, pUser, bAutoFree):
+ MvCamCtrldll.MV_CC_RegisterImageCallBackEx2.argtype = (c_void_p, c_void_p, c_void_p, ctypes.c_bool)
+ MvCamCtrldll.MV_CC_RegisterImageCallBackEx2.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterImageCallBackEx2(self.handle, CallBackFun, pUser, ctypes.c_bool(bAutoFree))
+
+
+ ##
+ # @~chinese
+ # @brief 注册流异常消息回调
+ # @param handle [IN] 设备句柄
+ # @param cbException [IN] 异常回调函数指针
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK,失败,返回错误码
+
+ # @~english
+ # @brief Register exception stream callBack
+ # @param handle [IN] Device handle
+ # @param cbException [IN] Exception callback function pointer
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_RegisterStreamExceptionCallBack(self, CallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterStreamExceptionCallBack.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterStreamExceptionCallBack.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterStreamExceptionCallBack(self.handle, CallBackFun, pUser)
+
+
+ ##
+ # @~chinese
+ # @brief 开始取流
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持MV_CAMERALINK_DEVICE 类型的设备。
+
+ # @~english
+ # @brief Start Grabbing
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface does not support devices of type MV_CAMERALINK_DEVICE
+ def MV_CC_StartGrabbing(self):
+ MvCamCtrldll.MV_CC_StartGrabbing.argtype = c_void_p
+ MvCamCtrldll.MV_CC_StartGrabbing.restype = c_uint
+ return MvCamCtrldll.MV_CC_StartGrabbing(self.handle)
+
+
+ ##
+ # @~chinese
+ # @brief 停止取流
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持MV_CAMERALINK_DEVICE 类型的设备。
+
+ # @~english
+ # @brief Stop Grabbing
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface does not support devices of type MV_CAMERALINK_DEVICE
+ def MV_CC_StopGrabbing(self):
+ MvCamCtrldll.MV_CC_StopGrabbing.argtype = c_void_p
+ MvCamCtrldll.MV_CC_StopGrabbing.restype = c_uint
+ return MvCamCtrldll.MV_CC_StopGrabbing(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 使用内部缓存获取一帧图片(与MV_CC_Display不能同时使用)
+ # @param handle [IN] 设备句柄
+ # @param pstFrame [IN][OUT] 图像数据和图像信息
+ # @param nMsec [IN] 等待超时时间,输入INFINITE时表示无限等待,直到收到一帧数据或者停止取流
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 调用该接口获取图像数据帧之前需要先调用MV_CC_StartGrabbing启动图像采集。该接口为主动式获取帧数据,上层应用程序需要根据帧率,控制好调用该接口的频率,
+ # 该接口支持设置超时时间,SDK内部等待直到有数据时返回,可以增加取流平稳性,适合用于对平稳性要求较高的场合。
+ # 该接口与MV_CC_FreeImageBuffer配套使用,当处理完取到的数据后,需要用MV_CC_FreeImageBuffer接口将pFrame内的数据指针权限进行释放。
+ # 该接口与MV_CC_GetOneFrameTimeout相比,有着更高的效率。且其取流缓存的分配是由sdk内部自动分配的,而MV_CC_GetOneFrameTimeout接口是需要客户自行分配。
+ # 该接口在调用MV_CC_Display后无法取流。
+ # 该接口对于U3V、GIGE设备均可支持。
+ # 该接口不支持CameraLink设备。
+
+ # @~english
+ # @brief Get a frame of an image using an internal cache
+ # @param handle [IN] Device handle
+ # @param pstFrame [IN][OUT] Image data and image information
+ # @param nMsec [IN] Waiting timeout
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Before calling this API to get image data frame, you should call MV_CC_StartGrabbing to start image acquisition.
+ # This API can get frame data actively, the upper layer program should control the frequency of calling this API according to the frame rate. This API support setting timeout, and SDK will wait to return until data appears. This function will increase the streaming stability, which can be used in the situation with high stability requirement.
+ # This API and MV_CC_FreeImageBuffer should be called in pairs, after processing the acquired data, you should call MV_CC_FreeImageBuffer to release the data pointer permission of pFrame.
+ # This interface is more efficient than MV_CC_GetOneFrameTimeout. The allocation of the stream cache is automatically allocated within the SDK.The MV_CC_GetOneFrameTimeout interface needs to be allocated by customers themselves.
+ # This API cannot be called to stream after calling MV_CC_Display.
+ # This API is not supported by CameraLink device.
+ # This API is supported by both USB3 vision camera and GigE camera.
+ def MV_CC_GetImageBuffer(self, stFrame, nMsec):
+ MvCamCtrldll.MV_CC_GetImageBuffer.argtype = (c_void_p, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_GetImageBuffer.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetImageBuffer(self.handle, byref(stFrame), nMsec)
+
+ ##
+ # @~chinese
+ # @brief 释放图像缓存(此接口用于释放不再使用的图像缓存,与MV_CC_GetImageBuffer配套使用)
+ # @param handle [IN] 设备句柄
+ # @param pstFrame [IN] 图像数据和图像数据
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口与MV_CC_GetImageBuffer配套使用,使用MV_CC_GetImageBuffer接口取到的图像数据pFrame,需要用MV_CC_FreeImageBuffer接口进行权限释放
+ # 该接口取流效率高于GetOneFrameTimeout接口
+ # 当GetImageBuffer不进行FreeImageBuffer时,最大输出图像个数为当前配置下SDK的缓存节点个数(用户可以调用SetImageNode接口,调节SDK的缓存个数)
+ # 该接口对于U3V、GIGE设备均可支持
+ # 该接口不支持CameraLink设备。
+
+ # @~english
+ # @brief Free image buffer(this interface can free image buffer, used with MV_CC_GetImageBuffer)
+ # @param handle [IN] Device handle
+ # @param pstFrame [IN] Image data and image information
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks MV_CC_FreeImageBuffer and MV_CC_GetImageBuffer API call in pairs, before calling MV_CC_GetImageBuffer to get image data pFrame, you should call MV_CC_FreeImageBuffer to release the permission.
+ # Compared with API MV_CC_GetOneFrameTimeout
+ # The API has higher efficiency of image acquisition. The max. number of nodes can be outputted is same as the "nNum" of the current configuration of the SDK's cache (users can call the SetImageNode interface to adjust the SDK's cache count)
+ # The API is not supported by CameraLink device.
+ # The API is supported by both USB3 vision camera and GigE camera.
+ def MV_CC_FreeImageBuffer(self, stFrame):
+ MvCamCtrldll.MV_CC_FreeImageBuffer.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FreeImageBuffer.restype = c_uint
+ return MvCamCtrldll.MV_CC_FreeImageBuffer(self.handle, byref(stFrame))
+
+
+ ##
+ # @~chinese
+ # @brief 采用超时机制获取一帧图片,SDK内部等待直到有数据时返回
+ # @param handle [IN] 设备句柄
+ # @param pData [IN][OUT] 图像数据接收指针
+ # @param nDataSize [IN] 接收缓存大小
+ # @param pstFrameInfo [IN][OUT] 图像信息结构体
+ # @param nMsec [IN] 等待超时时间
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 调用该接口获取图像数据帧之前需要先调用MV_CC_StartGrabbing启动图像采集
+ # 该接口为主动式获取帧数据,上层应用程序需要根据帧率,控制好调用该接口的频率
+ # 该接口支持设置超时时间,SDK内部等待直到有数据时返回,可以增加取流平稳性,适合用于对平稳性要求较高的场合
+ # 该接口对于U3V、GIGE设备均可支持
+ # 该接口不支持CameraLink设备。
+
+ # @~english
+ # @brief Timeout mechanism is used to get image, and the SDK waits inside until the data is returned
+ # @param handle [IN] Device handle
+ # @param pData [IN][OUT] Image data receiving buffer
+ # @param nDataSize [IN] Buffer size
+ # @param pstFrameInfo [IN][OUT] Image information structure
+ # @param nMsec [IN] Waiting timeout
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Before calling this API to get image data frame, call MV_CC_StartGrabbing to start image acquisition.
+ # This API can get frame data actively, the upper layer program should control the frequency of calling this API according to the frame rate.
+ # This API supports setting timeout, SDK will wait to return until data appears. This function will increase the streaming stability, which can be used in the situation with high stability requirement.
+ # Both the USB3Vision and GIGE camera can support this API.
+ # This API is not supported by CameraLink device.
+ def MV_CC_GetOneFrameTimeout(self, pData, nDataSize, stFrameInfo, nMsec=1000):
+ MvCamCtrldll.MV_CC_GetOneFrameTimeout.argtype = (c_void_p, c_void_p, c_uint, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_GetOneFrameTimeout.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetOneFrameTimeout(self.handle, pData, nDataSize, byref(stFrameInfo), nMsec)
+
+ ##
+ # @~chinese
+ # @brief 清除取流数据缓存
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口允许用户在不停止取流的时候,就能清除缓存中不需要的图像
+ # 该接口在连续模式切触发模式后,可以清除历史数据。
+ # 该接口目前只能清除SDK内部的图像缓存,采集卡内的缓存还无法清除。
+
+ # @~english
+ # @brief if Image buffers has retrieved the data,Clear them
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface allows user to clear the unnecessary images from the buffer memory without stopping acquisition.
+ # This interface allows user to clear previous data after switching from continuous mode to trigger mode.
+ # This interface can only clear the image cache inside the SDK, and the cache in the Frame grabber cannot be cleared.
+ def MV_CC_ClearImageBuffer(self):
+ MvCamCtrldll.MV_CC_ClearImageBuffer.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_ClearImageBuffer.restype = c_uint
+ return MvCamCtrldll.MV_CC_ClearImageBuffer(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 获取当前图像缓存区的有效图像个数
+ # @param handle [IN] 设备句柄
+ # @param pnValidImageNum [IN][OUT] 当前图像缓存区中有效图像个数的指针
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口只统计SDK内部的有效图像个数,不包括采集卡缓存内的有效图像个数
+
+ # @~english
+ # @brief Get the number of valid images in the current image buffer
+ # @param handle [IN] Device handle
+ # @param pnValidImageNum [IN][OUT] The number of valid images in the current image buffer
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface only counts the number of valid images inside the SDK, not including the number of valid images in the capture card cache.
+ def MV_CC_GetValidImageNum(self, nValidImageNum):
+ MvCamCtrldll.MV_CC_GetValidImageNum.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetValidImageNum.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetValidImageNum(self.handle, byref(nValidImageNum))
+
+ ##
+ # @~chinese
+ # @brief 显示一帧图像
+ # @param handle [IN] 设备句柄
+ # @param hWnd [IN] 窗口句柄
+ # @param pstDisplayInfo [IN] 图像信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口支持渲染宽高大小至int类型
+ # 渲染模式为D3D时,支持的最大分辨率为16384 # 163840
+
+ # @~english
+ # @brief Display one frame image
+ # @param handle [IN] Device handle
+ # @param hWnd [IN] HWND
+ # @param pstDisplayInfo [IN] Frame Info
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The rendering supports width and height to int type.
+ # When the render mode is D3D, the maximum resolution supported is 16384 # 163840.
+ def MV_CC_DisplayOneFrameEx(self, hWnd, pstDisplayInfo):
+ MvCamCtrldll.MV_CC_DisplayOneFrameEx.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_DisplayOneFrameEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_DisplayOneFrameEx(self.handle, hWnd, byref(pstDisplayInfo))
+
+
+ ##
+ # @~chinese
+ # @brief 显示一帧图像
+ # @param handle [IN] 设备句柄
+ # @param hWnd [IN] 窗口句柄
+ # @param pstImage [IN] 图像信息
+ # @param enRenderMode [IN] 渲染方式,Windows:0-GDI 1-D3D 2-OpenGL Linux:0-OpenGL
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 可选择OpenGL渲染模式,支持PixelType_Gvsp_RGB8_Packed,PixelType_Gvsp_BGR8_Packed,PixelType_Gvsp_Mono8三种像素格式图像大小超过4GB的渲染,其他渲染模式不支持。
+ # 若图像大小未超过4GB,支持宽高大小至int类型
+ # 调用时需要输入MV_CC_IMAGE结构体中nImageLen的值
+ # 渲染模式为D3D时,支持的最大分辨率为16384 # 163840
+
+ # @~english
+ # @brief Display one frame image
+ # @param handle [IN] Device handle
+ # @param hWnd [IN] HWND
+ # @param pstImage [IN] Frame Info
+ # @param enRenderMode [IN] Render mode, Windows:0-GDI 1-D3D 2-OpenGL Linux:0-OpenGL
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks OpenGL rendering mode can be selected, supporting three pixel formats: PixelType_Gvsp_RGB8_Packed,PixelType_Gvsp_BGR8_Packed,and PixelType_Gvsp_Mono8 for rendering images with a size exceeding 4GB.
+ # Note that, other rendering modes are not supported.
+ # If the image size does not exceed 4GB, the rendering supports width and height to int type.
+ # When the render mode is D3D, the maximum resolution supported is 16384 # 163840.
+ # When calling, the value of nImageLen in the MV_CC_IMAGE structure needs to be input.
+ def MV_CC_DisplayOneFrameEx2(self, hWnd, pstImage, enRenderMode):
+ MvCamCtrldll.MV_CC_DisplayOneFrameEx2.argtype = (c_void_p, c_void_p, c_void_p,c_uint)
+ MvCamCtrldll.MV_CC_DisplayOneFrameEx2.restype = c_uint
+ return MvCamCtrldll.MV_CC_DisplayOneFrameEx2(self.handle, hWnd, byref(pstImage), c_uint(enRenderMode))
+
+
+ ##
+ # @~chinese
+ # @brief 设置SDK内部图像缓存节点个数,大于等于1,在抓图前调用
+ # @param handle [IN] 设备句柄
+ # @param nNum [IN] 缓存节点个数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 调用该接口可以设置SDK内部图像缓存节点个数,在调用MV_CC_StartGrabbing开始抓图前调用。
+ # 不同相机因为取流方式不同,不调用MV_CC_SetImageNodeNum接口情况下,默认不同相机默认缓存节点个数不同
+ # SDK实际分配的节点个数 = SDK内部预分配的个数 + 用户分配的节点(MV_CC_SetImageNodeNum),其中SDK内部预分配的个数仅供内部使用,比如双U内部会多分配2个节点;若系统内存资源不够,SDK内部会重新计算, 以重新计算的节点个数为准
+ # 接口不支持MV_CAMERALINK_DEVICE 类型的设备。
+ # 该接口仅对SDK内部分配缓存模式有效,外部分配缓存模式(即调用MV_CC_RegisterBuffer)无效;
+
+ # @~english
+ # @brief Set the number of the internal image cache nodes in SDK, Greater than or equal to 1, to be called before the capture
+ # @param handle [IN] Device handle
+ # @param nNum [IN] Image Node Number
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this interface to set the number of SDK internal image buffer nodes. The interface should be called before calling MV_CC_StartGrabbing for capturing.
+
+ # Due to differing streaming methods among cameras, the default number of buffer nodes varies across different camera models when the MV_CC_SetImageNodeNum interface is not invoked.
+ # The actual number of nodes allocated by the SDK = the sum of the SDK's internal pre-allocated nodes + user-specified nodes (set via MV_CC_SetImageNodeNum). The internally pre-allocated nodes are reserved for internal use only, such as the dual-U configuration which allocates an additional 2 nodes internally.
+ # If the system memory resources are insufficient, the SDK will recalculate and use it as the actual number of nodes.
+ # This interface does not support devices of type MV_CAMERALINK_DEVICE
+ # This interface is only valid for the SDK's internal allocation cache mode, and the external allocation cache mode (i.e., calling MV_CC_RegisterBuffer) is invalid;
+ def MV_CC_SetImageNodeNum(self, nNum):
+ MvCamCtrldll.MV_CC_SetImageNodeNum.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_SetImageNodeNum.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetImageNodeNum(self.handle, c_uint(nNum))
+
+ ##
+ # @~chinese
+ # @brief 设置取流策略
+ # @param handle [IN] 设备句柄
+ # @param enGrabStrategy [IN] 策略枚举值
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口定义了四种取流策略,用户可以根据实际需求进行选择。具体描述如下:
+ # OneByOne: 从旧到新一帧一帧的从输出缓存列表中获取图像,打开设备后默认为该策略
+ # LatestImagesOnly: 仅从输出缓存列表中获取最新的一帧图像,同时清空输出缓存列表
+ # LatestImages: 从输出缓存列表中获取最新的OutputQueueSize帧图像,其中OutputQueueSize范围为1-ImageNodeNum,可用MV_CC_SetOutputQueueSize接口设置,ImageNodeNum默认为1,
+ # 可用MV_CC_SetImageNodeNum接口设置 OutputQueueSize设置成1等同于LatestImagesOnly策略,OutputQueueSize设置成ImageNodeNum等同于OneByOne策略
+ # UpcomingImage: 在调用取流接口时忽略输出缓存列表中所有图像,并等待设备即将生成的一帧图像。(该策略不支持MV_USB_DEVICE设备)
+ # 该接口在Windows平台仅支持MV_GIGE_DEVICE、MV_USB_DEVICE设备,在Linux平台仅支持MV_USB_DEVICE设备;
+
+ # @~english
+ # @brief Set Grab Strategy
+ # @param handle [IN] Device handle
+ # @param enGrabStrategy [IN] The value of Grab Strategy
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is set by four image acquisition approaches, the user may choose one as needed. Specific details are as followed:
+ # OneByOne:Obtain image from output cache list frame by frame in order, this function is default strategy when device is on.
+ # LatestImagesOnly:Obtain the latest image from output cache list only, meanwhile clear output cache list.
+ # LatestImages:Obtain the latest OutputQueueSize image from output cache list, the range of OutputQueueSize is 1-ImageNodeNum,
+ # the user may set the value of MV_CC_SetOutputQueueSizeinterface,the default value of ImageNodeNum is 1,
+ # If the user usesMV_CC_SetImageNodeNuminterface to set up OutputQueueSize,when the value of OutputQueueSize is set to be 1,
+ # the function will be same as LatestImagesOnly; if the value of OutputQueueSize is set to be ImageNodeNum, the function will be same as OneByOne.
+ # UpcomingImage:Ignore all images in output cache list when calling image acuiqisiotn interface, wait the next upcoming image generated.(This strategy does not support MV_USB_DEVICE device)
+ # This API only support MV_GIGE_DEVICE, MV_USB_DEVICE device on Windows, and only support MV_USB_DEVICE device on Linux.
+ def MV_CC_SetGrabStrategy(self, enGrabStrategy):
+ MvCamCtrldll.MV_CC_SetGrabStrategy.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_SetGrabStrategy.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetGrabStrategy(self.handle, c_uint(enGrabStrategy))
+
+
+ ##
+ # @~chinese
+ # @brief 设置输出缓存个数(只有在MV_GrabStrategy_LatestImages策略下才有效,范围:1-ImageNodeNum)
+ # @param handle [IN] 设备句柄
+ # @param nOutputQueueSize [IN] 输出缓存个数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口需与LatestImages取流策略配套调用,用于设置LatestImages策略下最多允许缓存图像的个数。可以在取流过程中动态调节输出缓存个数
+ # 该接口在Windows平台仅支持MV_GIGE_DEVICE、MV_USB_DEVICE设备,在Linux平台仅支持MV_USB_DEVICE设备;
+
+ # @~english
+ # @brief Set The Size of Output Queue(Only work under the strategy of MV_GrabStrategy_LatestImages,rang:1-ImageNodeNum)
+ # @param handle [IN] Device handle
+ # @param nOutputQueueSize [IN] The Size of Output Queue
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface must be used with LatestImages Grab strategy, it is used for setting the maximum allowance queue size of the image under the LatestImages strategy.
+ # The user may change the output queue size while grabbing images.
+ # This API only support MV_GIGE_DEVICE, MV_USB_DEVICE device on Windows, and only support MV_USB_DEVICE device on Linux.
+ def MV_CC_SetOutputQueueSize(self, nOutputQueueSize):
+ MvCamCtrldll.MV_CC_SetOutputQueueSize.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_SetOutputQueueSize.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetOutputQueueSize(self.handle, nOutputQueueSize)
+
+ ##
+ # @~chinese
+ # @brief 获取设备信息,取流之前调用
+ # @param handle [IN] 设备句柄
+ # @param pstDevInfo [IN][OUT] 返回给调用者有关设备信息结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 支持用户在打开设备后获取设备信息,不支持GenTL设备
+ # 若该设备是GigE设备,则调用该接口存在阻塞风险,因此不建议在取流过程中调用该接口。
+
+ # @~english
+ # @brief Get device information
+ # @param handle [IN] Device handle
+ # @param pstDevInfo [IN][OUT] Structure pointer of device information
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The API support users to access device information after opening the device,don't support GenTL Devices
+ # If the device is a GigE camera, there is a blocking risk in calling the interface, so it is not recommended to call the interface during the fetching process.
+ def MV_CC_GetDeviceInfo(self, stDevInfo):
+ MvCamCtrldll.MV_CC_GetDeviceInfo.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetDeviceInfo.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetDeviceInfo(self.handle, byref(stDevInfo))
+
+
+
+ ##
+ # @~chinese
+ # @brief 获取各种类型的信息
+ # @param handle [IN] 设备句柄
+ # @param pstInfo [IN][OUT] 返回给调用者有关设备各种类型的信息结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 接口里面输入需要获取的信息类型(指定MV_ALL_MATCH_INFO结构体中的nType类型),获取对应的信息(在MV_ALL_MATCH_INFO结构体中pInfo里返回)
+ # 该接口的调用前置条件取决于所获取的信息类型,获取GigE设备的MV_MATCH_TYPE_NET_DETECT信息需在开启抓图之后调用,获取U3V设备的MV_MATCH_TYPE_USB_DETECT信息需在打开设备之后调用
+ # 信息类型 MV_MATCH_TYPE_NET_DETECT 对应结构体MV_MATCH_INFO_NET_DETECT, 只支持MV_GIGE_DEVICE相机/MV_GENTL_GIGE_DEVICE相机
+ # 信息类型 MV_MATCH_TYPE_USB_DETECT 对应结构体MV_MATCH_INFO_USB_DETECT, 只支持MV_USB_DEVICE 类型相机
+ # 该接口不支持MV_CAMERALINK_DEVICE设备。
+
+ # @~english
+ # @brief Get various type of information
+ # @param handle [IN] Device handle
+ # @param pstInfo [IN][OUT] Structure pointer of various type of information
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Input required information type (specify nType in structure MV_ALL_MATCH_INFO) in the interface and get corresponding information (return in pInfo of structure MV_ALL_MATCH_INFO)
+ # The calling precondition of this interface is determined by obtained information type. Call after enabling capture to get MV_MATCH_TYPE_NET_DETECT information of GigE device,
+ # and call after starting device to get MV_MATCH_TYPE_USB_DETECT information of USB3Vision device.
+ # The information type MV_MATCH_TYPE_NET_DETECT corresponds to the structure MV_MATCH_INFO_NET_DETECT, which only supports cameras of MV_GIGE_DEVICE and MV_GENTL_GIGE_DEVICE types
+ # The information type MV_MATCH_TYPE_USB_DETECT corresponds to the structure MV_MATCH_INFO_USB_DETECT, which only supports cameras of MV_USB_DEVICE type
+ # This API is not supported by MV_CAMERALINK_DEVICE device.
+ def MV_CC_GetAllMatchInfo(self, stInfo):
+ MvCamCtrldll.MV_CC_GetAllMatchInfo.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetAllMatchInfo.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetAllMatchInfo(self.handle, byref(stInfo))
+
+ ## @}
+
+
+ ## @addtogroup ch: 采集卡的配置 | en: Frame grabber control
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 枚举采集卡
+ # @param nTLayerType [IN] 采集卡接口类型 eg: (MV_GIGE_INTERFACE | MV_CAMERALINK_INTERFACE | MV_CXP_INTERFACE| MV_XOF_INTERFACE | MV_VIR_INTERFACE | MV_LC_INTERFACE)
+ # @param pInterfaceInfoList [IN][OUT] 采集卡列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief enum Frame grabber
+ # @param nTLayerType [IN] Frame grabber Type eg: (MV_GIGE_INTERFACE | MV_CAMERALINK_INTERFACE | MV_CXP_INTERFACE| MV_XOF_INTERFACE | MV_VIR_INTERFACE | MV_LC_INTERFACE)
+ # @param pInterfaceInfoList [IN][OUT] Frame grabbe List
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API do not support arm and Linux32 platform.
+ @staticmethod
+ def MV_CC_EnumInterfaces(nTLayerType, stInterfaceInfoList):
+ MvCamCtrldll.MV_CC_EnumInterfaces.argtype = (c_uint, c_void_p)
+ MvCamCtrldll.MV_CC_EnumInterfaces.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumInterfaces(c_uint(nTLayerType), byref(stInterfaceInfoList))
+
+ ##
+ # @~chinese
+ # @brief 创建采集卡句柄
+ # @param handle [OUT] 采集卡句柄
+ # @param pInterfaceInfo [IN] 采集卡信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief create Frame grabber handle
+ # @param handle [OUT] Frame grabber handle
+ # @param pInterfaceInfo [IN] Frame grabber Info
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API do not support arm and Linux32 platform.
+ def MV_CC_CreateInterface(self, stInterfaceInfo):
+ MvCamCtrldll.MV_CC_CreateInterface.argtype = c_void_p
+ MvCamCtrldll.MV_CC_CreateInterface.restype = c_uint
+ return MvCamCtrldll.MV_CC_CreateInterface(byref(self.handle), byref(stInterfaceInfo))
+
+ ##
+ # @~chinese
+ # @brief 通过采集卡ID创建采集卡句柄
+ # @param handle [IN][OUT] 采集卡句柄
+ # @param pInterfaceID [IN] 采集卡ID
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief create Frame grabber handle by ID
+ # @param handle [IN][OUT] Frame grabber handle
+ # @param pInterfaceID [IN] Frame grabber ID
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API do not support arm and Linux32 platform.
+ def MV_CC_CreateInterfaceByID(self, InterfaceID):
+ MvCamCtrldll.MV_CC_CreateInterfaceByID.argtype = c_void_p
+ MvCamCtrldll.MV_CC_CreateInterfaceByID.restype = c_uint
+ return MvCamCtrldll.MV_CC_CreateInterfaceByID(byref(self.handle), InterfaceID.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 打开采集卡
+ # @param handle [IN] 采集卡句柄
+ # @param pReserved [IN] 预留,直接填NULL
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief open Frame grabber
+ # @param handle [IN] Frame grabber handle
+ # @param pReserved [IN] Reserved,default NULL
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API do not support arm and Linux32 platform.
+ def MV_CC_OpenInterface(self):
+ MvCamCtrldll.MV_CC_OpenInterface.argtype = c_void_p
+ MvCamCtrldll.MV_CC_OpenInterface.restype = c_uint
+ return MvCamCtrldll.MV_CC_OpenInterface(self.handle, 0)
+
+ ##
+ # @~chinese
+ # @brief 关闭采集卡
+ # @param handle [IN] 采集卡句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief close Frame grabber
+ # @param handle [IN] Frame grabber handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API do not support arm and Linux32 platform.
+ def MV_CC_CloseInterface(self):
+ MvCamCtrldll.MV_CC_CloseInterface.argtype = c_void_p
+ MvCamCtrldll.MV_CC_CloseInterface.restype = c_uint
+ return MvCamCtrldll.MV_CC_CloseInterface(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 销毁采集卡句柄
+ # @param handle [IN]采集卡句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks MV_CC_DestroyInterface 如果传入相机句柄,其效果和 MV_CC_DestroyHandle 相同; 该接口不支持arm和Linux32平台
+
+ # @~english
+ # @brief Destroy Frame grabber handle
+ # @param handle [IN] Frame grabber handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks If MV_CC_DestroyInterface passes in "Device handle", the effect is the same as the MV_CC_DestroyHandle. This API do not support arm and Linux32 platform.
+ def MV_CC_DestroyInterface(self):
+ MvCamCtrldll.MV_CC_DestroyInterface.argtype = c_void_p
+ MvCamCtrldll.MV_CC_DestroyInterface.restype = c_uint
+ return MvCamCtrldll.MV_CC_DestroyInterface(self.handle)
+
+
+ ##
+ # @~chinese
+ # @brief 通过采集卡句柄枚举设备
+ # @param handle [IN] 采集卡句柄
+ # @param pstDevList [OUT] 设备列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请
+ # 建议尽量避免多线程枚举操作。
+
+ # @~english
+ # @brief Enumerate Devices with interface handle
+ # @param handle [IN] Interface information
+ # @param pstDevList [OUT] Device List
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The memory of the list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+ def MV_CC_EnumDevicesByInterface(self, stDevList):
+ MvCamCtrldll.MV_CC_EnumDevicesByInterface.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EnumDevicesByInterface.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumDevicesByInterface(self.handle, byref(stDevList))
+ ## @}
+
+
+ ## @addtogroup ch: 相机/采集卡属性万能配置接口 | en: Camera /Frame grabber attribute nodes universal interface
+ ## @{
+
+
+ ##
+ # @~chinese
+ # @brief 获取Integer属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取宽度信息则为"Width"
+ # @param pstIntValue [IN][OUT] 返回给调用者有关设备属性结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取int类型的指定节点的值。
+
+ # @~english
+ # @brief Get Integer value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "Width" to get width
+ # @param pstIntValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks You can call this API to get the value of camera node with integer type after connecting the device.
+ def MV_CC_GetIntValueEx(self, strKey, stIntValue):
+ MvCamCtrldll.MV_CC_GetIntValueEx.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetIntValueEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetIntValueEx(self.handle, strKey.encode('ascii'), byref(stIntValue))
+
+ ##
+ # @~chinese
+ # @brief 设置Integer型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取宽度信息则为"Width"
+ # @param nValue [IN] 想要设置的设备的属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置int类型的指定节点的值。
+
+ # @~english
+ # @brief Set Integer value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "Width" to set width
+ # @param nValue [IN] Feature value to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks You can call this API to get the value of camera node with integer type after connecting the device.
+ def MV_CC_SetIntValueEx(self, strKey, nValue):
+ MvCamCtrldll.MV_CC_SetIntValueEx.argtype = (c_void_p, c_void_p, c_int64)
+ MvCamCtrldll.MV_CC_SetIntValueEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetIntValueEx(self.handle, strKey.encode('ascii'), c_int64(nValue))
+
+
+ ##
+ # @~chinese
+ # @brief 获取Enum属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取像素格式信息则为"PixelFormat"
+ # @param pstEnumValue [IN][OUT] 返回给调用者有关设备属性结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取Enum类型的指定节点的值。
+
+ # @~english
+ # @brief Get Enum value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "PixelFormat" to get pixel format
+ # @param pstEnumValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to get specified Enum nodes.
+ def MV_CC_GetEnumValue(self, strKey, stEnumValue):
+ MvCamCtrldll.MV_CC_GetEnumValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetEnumValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetEnumValue(self.handle, strKey.encode('ascii'), byref(stEnumValue))
+
+ ##
+ # @~chinese
+ # @brief 获取Enum属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取像素格式信息则为"PixelFormat"
+ # @param pstEnumValue [IN][OUT] 返回给调用者有关设备属性结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取Enum类型的指定节点的值,区别与MV_CC_GetEnumValue,此接口返回的枚举有效个数扩展到256个。
+
+ # @~english
+ # @brief Get Enum value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "PixelFormat" to get pixel format
+ # @param pstEnumValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to get specified Enum nodes.
+ # Comparing with the API MV_CC_GetEnumValue, this API expands the number of enumeration values up to 256.
+ def MV_CC_GetEnumValueEx(self, strKey, stEnumValue):
+ MvCamCtrldll.MV_CC_GetEnumValueEx.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetEnumValueEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetEnumValueEx(self.handle, strKey.encode('ascii'), byref(stEnumValue))
+
+
+ ##
+ # @~chinese
+ # @brief 设置Enum型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取像素格式信息则为"PixelFormat"
+ # @param nValue [IN] 想要设置的设备的属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置Enum类型的指定节点的值。
+
+ # @~english
+ # @brief Set Enum value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "PixelFormat" to set pixel format
+ # @param nValue [IN] Feature value to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified Enum nodes.
+ def MV_CC_SetEnumValue(self, strKey, nValue):
+ MvCamCtrldll.MV_CC_SetEnumValue.argtype = (c_void_p, c_void_p, c_uint32)
+ MvCamCtrldll.MV_CC_SetEnumValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetEnumValue(self.handle, strKey.encode('ascii'), c_uint32(nValue))
+
+ ##
+ # @~chinese
+ # @brief 获取Enum型节点指定值的符号
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取像素格式信息则为"PixelFormat"
+ # @param pstEnumEntry [IN][OUT] 想要获取的设备的属性符号
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取Enum类型的指定节点的值所对应的符号。
+
+ # @~english
+ # @brief Get the symbolic of the specified value of the Enum type node
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "PixelFormat" to set pixel format
+ # @param pstEnumEntry [IN][OUT] Symbolic to get
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this interface after connecting the device to obtain the symbol corresponding to the value of the specified node of Enum type.
+ def MV_CC_GetEnumEntrySymbolic(self, strKey, stEnumEntry):
+ MvCamCtrldll.MV_CC_GetEnumEntrySymbolic.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetEnumEntrySymbolic.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetEnumEntrySymbolic(self.handle, strKey.encode('ascii'), byref(stEnumEntry))
+
+ ##
+ # @~chinese
+ # @brief 设置Enum型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值,如获取像素格式信息则为"PixelFormat"
+ # @param strValue [IN] 想要设置的设备的属性字符串
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置Enum类型的指定节点的值。
+
+ # @~english
+ # @brief Set Enum value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value, for example, using "PixelFormat" to set pixel format
+ # @param strValue [IN] Feature String to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified Enum nodes.
+ def MV_CC_SetEnumValueByString(self, strKey, sValue):
+ MvCamCtrldll.MV_CC_SetEnumValueByString.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetEnumValueByString.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetEnumValueByString(self.handle, strKey.encode('ascii'), sValue.encode('ascii'))
+
+
+ ##
+ # @~chinese
+ # @brief 获取Float属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param pstFloatValue [IN][OUT] 返回给调用者有关设备属性结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取float类型的指定节点的值。
+
+ # @~english
+ # @brief Get Float value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param pstFloatValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to get specified float node.
+ def MV_CC_GetFloatValue(self, strKey, stFloatValue):
+ MvCamCtrldll.MV_CC_GetFloatValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetFloatValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetFloatValue(self.handle, strKey.encode('ascii'), byref(stFloatValue))
+
+ ##
+ # @~chinese
+ # @brief 设置float型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param fValue [IN] 想要设置的设备的属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置float类型的指定节点的值。
+
+ # @~english
+ # @brief Set float value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param fValue [IN] Feature value to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified float node.
+ def MV_CC_SetFloatValue(self, strKey, fValue):
+ MvCamCtrldll.MV_CC_SetFloatValue.argtype = (c_void_p, c_void_p, c_float)
+ MvCamCtrldll.MV_CC_SetFloatValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetFloatValue(self.handle, strKey.encode('ascii'), c_float(fValue))
+
+ ##
+ # @~chinese
+ # @brief 获取Boolean属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param pbValue [IN][OUT] 返回给调用者有关设备属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取bool类型的指定节点的值。
+
+ # @~english
+ # @brief Get Boolean value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param pbValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to get specified bool nodes.
+ def MV_CC_GetBoolValue(self, strKey, BoolValue):
+ MvCamCtrldll.MV_CC_GetBoolValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetBoolValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetBoolValue(self.handle, strKey.encode('ascii'), byref(BoolValue))
+
+ ##
+ # @~chinese
+ # @brief 设置Boolean型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param bValue [IN] 想要设置的设备的属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置bool类型的指定节点的值。
+
+ # @~english
+ # @brief Set Boolean value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param bValue [IN] Feature value to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified bool nodes.
+ def MV_CC_SetBoolValue(self, strKey, bValue):
+ MvCamCtrldll.MV_CC_SetBoolValue.argtype = (c_void_p, c_void_p, c_bool)
+ MvCamCtrldll.MV_CC_SetBoolValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBoolValue(self.handle, strKey.encode('ascii'), bValue)
+
+ ##
+ # @~chinese
+ # @brief 获取String属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param pstStringValue [IN][OUT] 返回给调用者有关设备属性结构体指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以获取string类型的指定节点的值。
+
+ # @~english
+ # @brief Get String value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param pstStringValue [IN][OUT] Structure pointer of camera features
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to get specified string nodes.
+ def MV_CC_GetStringValue(self, strKey, StringValue):
+ MvCamCtrldll.MV_CC_GetStringValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetStringValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetStringValue(self.handle, strKey.encode('ascii'), byref(StringValue))
+
+ ##
+ # @~chinese
+ # @brief 设置String型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @param strValue [IN] 想要设置的设备的属性值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置string类型的指定节点的值。
+
+ # @~english
+ # @brief Set String value
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @param strValue [IN] Feature value to set
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified string nodes.
+ def MV_CC_SetStringValue(self, strKey, sValue):
+ MvCamCtrldll.MV_CC_SetStringValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetStringValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetStringValue(self.handle, strKey.encode('ascii'), sValue.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 设置Command型属性值
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strKey [IN] 属性键值
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置指定的Command类型节点。
+
+ # @~english
+ # @brief Send Command
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strKey [IN] Key value
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set specified Command nodes.
+ def MV_CC_SetCommandValue(self, strKey):
+ MvCamCtrldll.MV_CC_SetCommandValue.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetCommandValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetCommandValue(self.handle, strKey.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 读内存
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pBuffer [IN][OUT] 作为返回值使用,保存读到的内存值(GEV设备内存值是按照大端模式存储的,采集卡设备和采集卡下相机按照大端存储,其它协议设备按照小端存储)
+ # @param nAddress [IN] 待读取的内存地址,该地址可以从设备的Camera.xml文件中获取,形如xxx_RegAddr的xml节点值
+ # @param nLength [IN] 待读取的内存长度
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 读取设备某段寄存器的数据
+
+ # @~english
+ # @brief Read Memory
+ # @param handle [IN] Device Handle/Frame grabber handle
+ # @param pBuffer [IN][OUT] Used as a return value, save the read-in memory value ( The memory value of GEV devices is stored in the big end mode, with the capture card device and the camera under the capture card stored in the big end mode, and other protocol devices stored in the small end mode)
+ # @param nAddress [IN] Memory address to be read, which can be obtained from the Camera.xml file of the device, the form xml node value of xxx_RegAddr
+ # @param nLength [IN] Length of the memory to be read
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Read the data of a certain segment of the device's registers.
+ def MV_CC_ReadMemory(self, pBuffer, nAddress, nLength):
+ MvCamCtrldll.MV_CC_ReadMemory.argtype = (c_void_p, c_void_p, c_int64, c_int64)
+ MvCamCtrldll.MV_CC_ReadMemory.restype = c_uint
+ return MvCamCtrldll.MV_CC_ReadMemory(self.handle, pBuffer, c_int64(nAddress), c_int64(nLength))
+
+ ##
+ # @~chinese
+ # @brief 写内存
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pBuffer [IN] 待写入的内存值(注意GEV设备内存值要按照大端模式存储,采集卡设备和采集卡下相机按照大端存储,其它协议设备按照小端存储)
+ # @param nAddress [IN] 待写入的内存地址,该地址可以从设备的Camera.xml文件中获取,形如xxx_RegAddr的xml节点值
+ # @param nLength [IN] 待写入的内存长度
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 访问设备,把一段数据写入某段寄存器。
+
+ # @~english
+ # @brief Write Memory
+ # @param handle [IN] Device Handle/Frame grabber handle
+ # @param pBuffer [IN] Memory value to be written ( Note The memory value of GEV devices is stored in the big end mode, with the capture card device and the camera under the capture card stored in the big end mode, and other protocol devices stored in the small end mode)
+ # @param nAddress [IN] Memory address to be written, which can be obtained from the Camera.xml file of the device, the form xml node value of xxx_RegAddr
+ # @param nLength [IN] Length of the memory to be written
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Access device, write a piece of data into a certain segment of register.
+ def MV_CC_WriteMemory(self, pBuffer, nAddress, nLength):
+ MvCamCtrldll.MV_CC_WriteMemory.argtype = (c_void_p, c_void_p, c_int64, c_int64)
+ MvCamCtrldll.MV_CC_WriteMemory.restype = c_uint
+ return MvCamCtrldll.MV_CC_WriteMemory(self.handle, pBuffer, c_int64(nAddress), c_int64(nLength))
+
+ ##
+ # @~chinese
+ # @brief 清除GenICam节点缓存
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Invalidate GenICam Nodes
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_InvalidateNodes(self):
+ MvCamCtrldll.MV_CC_InvalidateNodes.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_InvalidateNodes.restype = c_uint
+ return MvCamCtrldll.MV_CC_InvalidateNodes(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 获取设备属性树XML
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pData [IN][OUT] XML数据接收缓存
+ # @param nDataSize [IN] 接收缓存大小
+ # @param pnDataLen [IN][OUT] 实际数据大小
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 当pData为NULL或nDataSize比实际的xml文件小时,不拷贝数据,由pnDataLen返回xml文件大小
+ # 当pData为有效缓存地址,且缓存足够大时,拷贝完整数据保存在该缓存里面,并由pnDataLen返回xml文件实际大小。
+
+ # @~english
+ # @brief Get camera feature tree XML
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pData [IN][OUT] XML data receiving buffer
+ # @param nDataSize [IN] Buffer size
+ # @param pnDataLen [IN][OUT] Actual data length
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks When pData is NULL or nDataSize than the actual XML file hours, do not copy the data, returned by pnDataLen XML file size.
+ # When pData is a valid cache address and the cache is large enough, copy the full data into the cache, and pnDataLen returns the actual size of the XML file.
+ def MV_XML_GetGenICamXML(self, pData, nDataSize, pnDataLen):
+ MvCamCtrldll.MV_XML_GetGenICamXML.argtype = (c_void_p, c_void_p, c_uint, c_void_p)
+ MvCamCtrldll.MV_XML_GetGenICamXML.restype = c_uint
+ return MvCamCtrldll.MV_XML_GetGenICamXML(self.handle, pData, c_uint(nDataSize), byref(pnDataLen))
+
+ ##
+ # @~chinese
+ # @brief 获得当前节点的访问模式
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strName [IN] 节点名称
+ # @param penAccessMode [IN][OUT] 节点的访问模式
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Get Access mode of cur node
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strName [IN] Name of node
+ # @param penAccessMode [IN][OUT] Access mode of the node
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_XML_GetNodeAccessMode(self, strName, penAccessMode):
+ MvCamCtrldll.MV_XML_GetNodeAccessMode.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_XML_GetNodeAccessMode.restype = c_uint
+ return MvCamCtrldll.MV_XML_GetNodeAccessMode(self.handle, strName.encode('ascii'), byref(penAccessMode))
+
+ ##
+ # @~chinese
+ # @brief 获得当前节点的类型
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strName [IN] 节点名称
+ # @param penInterfaceType [IN][OUT] 节点的类型
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口可以在调用MV_CC_GetIntValueEx、MV_CC_SetIntValueEx 等万能接口之前,提前知道节点类型,方便用户选择合适的万能接口进行节点值的设置和获取。
+
+ # @~english
+ # @brief Get Interface Type of cur node
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strName [IN] Name of node
+ # @param penInterfaceType [IN][OUT] Interface Type of the node
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface can allow users to know the node type in advance before calling universal interfaces such as MV_CC_GetIntValueEx and MV_CC_SetIntValueEx, facilitating the selection of appropriate interfaces for setting and obtaining node values.
+ def MV_XML_GetNodeInterfaceType(self, strName, penInterfaceType):
+ MvCamCtrldll.MV_XML_GetNodeInterfaceType.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_XML_GetNodeInterfaceType.restype = c_uint
+ return MvCamCtrldll.MV_XML_GetNodeInterfaceType(self.handle, strName.encode('ascii'), byref(penInterfaceType))
+ ##
+ # @~chinese
+ # @brief 保存设备属性
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strFileName [IN] 属性文件名
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Save camera feature
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strFileName [IN] File name
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_FeatureSave(self, strFileName):
+ MvCamCtrldll.MV_CC_FeatureSave.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FeatureSave.restype = c_uint
+ return MvCamCtrldll.MV_CC_FeatureSave(self.handle, strFileName.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 导入设备属性
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strFileName [IN] 属性文件名
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Load camera feature
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strFileName [IN] File name
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_FeatureLoad(self, strFileName):
+ MvCamCtrldll.MV_CC_FeatureLoad.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FeatureLoad.restype = c_uint
+ return MvCamCtrldll.MV_CC_FeatureLoad(self.handle, strFileName.encode('ascii'))
+
+
+ ##
+ # @~chinese
+ # @brief 导入设备属性并保存错误信息列表
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param strFileName [IN] 属性文件名
+ # @param stNodeErrorList [IN OUT] 错误信息列表,由用户在外部申请并由内部填充数据,该参数允许填null代表用户不关心导入时的错误信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 部分节点导入失败时,接口返回MV_OK,通过错误信息列表中stNodeError获取出错节点及失败原因
+
+ # @~english
+ # @brief Load camera feature with error message list
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param strFileName [IN] File name
+ # @param pstNodeErrorList [IN OUT] Error message list, requested by the user externally and filled with data internally, \n
+ # this parameter allows null to indicate that the user is not concerned about error information during import.
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks When some nodes fail to load, the interface returns MV_OK. \n
+ # The error node and the reason for the failure are obtained through stNodeError in the error message list.
+ def MV_CC_FeatureLoadEx(self, strFileName, pstNodeErrorList):
+ MvCamCtrldll.MV_CC_FeatureLoadEx.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FeatureLoadEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_FeatureLoadEx(self.handle, strFileName.encode('ascii'), byref(pstNodeErrorList))
+
+ ##
+ # @~chinese
+ # @brief 从设备读取文件
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pstFileAccess [IN] 文件存取结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Read the file from the camera
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pstFileAccess [IN] File access structure
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_FileAccessRead(self, stFileAccess):
+ MvCamCtrldll.MV_CC_FileAccessRead.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FileAccessRead.restype = c_uint
+ return MvCamCtrldll.MV_CC_FileAccessRead(self.handle, byref(stFileAccess))
+
+ ##
+ # @~chinese
+ # @brief 从设备读取文件,文件是Data数据
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pstFileAccessEx [IN] 文件存取结构体
+ # @return 成功,返回MV_OK;错误,返回错误码 避免文件操作权限问题读失败
+
+ # @~english
+ # @brief Read the file data from the camera
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pstFileAccessEx [IN] File access structure
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_FileAccessReadEx(self, pstFileAccessEx):
+ MvCamCtrldll.MV_CC_FileAccessReadEx.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FileAccessReadEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_FileAccessReadEx(self.handle, byref(pstFileAccessEx))
+
+ ##
+ # @~chinese
+ # @brief 将文件写入设备
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pstFileAccess [IN] 文件存取结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Write the file to camera
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pstFileAccess [IN] File access structure
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_FileAccessWrite(self, stFileAccess):
+ MvCamCtrldll.MV_CC_FileAccessWrite.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FileAccessWrite.restype = c_uint
+ return MvCamCtrldll.MV_CC_FileAccessWrite(self.handle, byref(stFileAccess))
+
+ ##
+ # @~chinese
+ # @brief 将缓存(buffer)写入设备
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pstFileAccessEx [IN][OUT] 文件存取结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口直接使用缓存数据,进行读写操作,避免直接操作文件出现无权限的问题,是MV_CC_FileAccessWrite的扩展接口
+
+ # @~english
+ # @brief Write the data(buffer) to camera
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pstFileAccessEx [IN][OUT] File access structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface uses cached data for read and write,solve the problem of no permissions in direct operation files, it's an extended interface of MV_CC_FileAccessWrite.
+ def MV_CC_FileAccessWriteEx(self, pstFileAccessEx):
+ MvCamCtrldll.MV_CC_FileAccessWriteEx.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FileAccessWriteEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_FileAccessWriteEx(self.handle, byref(pstFileAccessEx))
+
+ ##
+ # @~chinese
+ # @brief 获取文件存取的进度
+ # @param handle [IN] 设备句柄/采集卡句柄
+ # @param pstFileAccessProgress [IN][OUT] 进度内容
+ # @return 成功,返回MV_OK;错误,返回错误码 (当前文件存取的状态)
+
+ # @~english
+ # @brief Get File Access Progress
+ # @param handle [IN] Device handle/Frame grabber handle
+ # @param pstFileAccessProgress [IN][OUT] File access Progress
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_GetFileAccessProgress(self, pstFileAccessProgress):
+ MvCamCtrldll.MV_CC_GetFileAccessProgress.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetFileAccessProgress.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetFileAccessProgress(self.handle, byref(pstFileAccessProgress))
+ ## @}
+
+
+ ## @addtogroup ch: 相机和采集卡 升级 | en: Camera /Frame grabber upgrade
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 设备本地升级
+ # @param handle [IN] 设备句柄
+ # @param strFilePathName [IN] 文件名
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 通过该接口可以将升级固件文件发送给设备进行升级。
+ # 该接口需要等待升级固件文件成功传给设备端之后再返回,响应时间可能较长。
+
+ # @~english
+ # @brief Device Local Upgrade
+ # @param handle [IN] Device handle
+ # @param strFilePathName [IN] File name
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this API to send the upgrade firmware to the device for upgrade.
+ # This API will wait for return until the upgrade firmware is sent to the device, this response may take a long time.
+ # For CameraLink device, it keeps sending upgrade firmware continuously.
+ def MV_CC_LocalUpgrade(self, strFilePathName):
+ MvCamCtrldll.MV_CC_LocalUpgrade.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_LocalUpgrade.restype = c_uint
+ return MvCamCtrldll.MV_CC_LocalUpgrade(self.handle, strFilePathName.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 获取升级进度
+ # @param handle [IN] 设备句柄
+ # @param pnProcess [IN][OUT] 进度接收地址
+ # @return 成功,返回MV_OK,失败,返回错误码
+
+ # @~english
+ # @brief Get Upgrade Progress
+ # @param handle [IN] Device handle
+ # @param pnProcess [IN][OUT] Progress receiving address
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_GetUpgradeProcess(self, nProcess):
+ MvCamCtrldll.MV_CC_GetUpgradeProcess.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetUpgradeProcess.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetUpgradeProcess(self.handle, byref(nProcess))
+ ## @}
+
+
+
+ ## @addtogroup ch: 相机和采集卡 注册异常回调和事件接口 | en: Camera /Frame Enrol abnormal callbacks and event interface
+ ## @{
+
+
+ ##
+ # @~chinese
+ # @brief 注册异常消息回调,在打开设备之后调用
+ # @param handle [IN] 设备句柄
+ # @param cbException [IN] 异常回调函数指针
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口需要在MV_CC_OpenDevice打开设备之后调用。
+ # 设备异常断开连接后可以在回调里面获取到异常消息,GigE设备掉线之后需要先调用MV_CC_CloseDevice接口关闭设备,再调用MV_CC_OpenDevice接口重新打开设备。
+
+ # @~english
+ # @brief Register Exception Message CallBack, call after open device
+ # @param handle [IN] Device handle
+ # @param cbException [IN] Exception Message CallBack Function Pointer
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this interface after the device is opened by MV_CC_OpenDevice.
+ # When device is exceptionally disconnected, the exception message can be obtained from callback function. For Disconnected GigE device,
+ # first call MV_CC_CloseDevice to shut device, and then call MV_CC_OpenDevice to reopen the device.
+ def MV_CC_RegisterExceptionCallBack(self, ExceptionCallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterExceptionCallBack.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterExceptionCallBack.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterExceptionCallBack(self.handle, ExceptionCallBackFun, pUser)
+
+ ##
+ # @~chinese
+ # @brief 注册全部事件回调,在打开设备之后调用
+ # @param handle [IN] 设备句柄
+ # @param cbEvent [IN] 事件回调函数指针
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 通过该接口设置事件回调,可以在回调函数里面获取采集、曝光等事件信息
+ # 该接口不支持CameraLink设备。
+
+ # @~english
+ # @brief Register event callback, which is called after the device is opened
+ # @param handle [IN] Device handle
+ # @param cbEvent [IN] Event CallBack Function Pointer
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this API to set the event callback function to get the event information, e.g., acquisition, exposure, and so on
+ # This API is not supported by CameraLink device.
+ def MV_CC_RegisterAllEventCallBack(self, EventCallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterAllEventCallBack.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterAllEventCallBack.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterAllEventCallBack(self.handle, EventCallBackFun, pUser)
+
+ ##
+ # @~chinese
+ # @brief 注册单个事件回调,在打开设备之后调用
+ # @param handle [IN] 设备句柄
+ # @param strEventName [IN] 事件名称
+ # @param cbEvent [IN] 事件回调函数指针
+ # @param pUser [IN] 用户自定义变量
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 通过该接口设置事件回调,可以在回调函数里面获取采集、曝光等事件信息。
+ # 该接口不支持CameraLink设备。
+
+ # @~english
+ # @brief Register single event callback, which is called after the device is opened
+ # @param handle [IN] Device handle
+ # @param strEventName [IN] Event name
+ # @param cbEvent [IN] Event CallBack Function Pointer
+ # @param pUser [IN] User defined variable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this API to set the event callback function to get the event information, e.g., acquisition, exposure, and so on.
+ # This API is not supported by CameraLink device .
+ def MV_CC_RegisterEventCallBackEx(self, pEventName, EventCallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterEventCallBackEx.argtype = (c_void_p, c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterEventCallBackEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_RegisterEventCallBackEx(self.handle, pEventName.encode('ascii'), EventCallBackFun,
+ pUser)
+
+ ##
+ # @~chinese
+ # @brief 开启设备指定事件
+ # @param handle [IN] 设备句柄
+ # @param strEventName [IN] 事件名称
+ # @return 成功,返回MV_OK,失败,返回错误码
+
+ # @~english
+ # @brief Enable specified event of device
+ # @param handle [IN] Device handle
+ # @param strEventName [IN] Event name
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_EventNotificationOn(self, strEventName):
+ MvCamCtrldll.MV_CC_EventNotificationOn.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EventNotificationOn.restype = c_uint
+ return MvCamCtrldll.MV_CC_EventNotificationOn(self.handle, strEventName.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 关闭设备指定事件
+ # @param handle [IN] 设备句柄
+ # @param strEventName [IN] 事件名称
+ # @return 成功,返回MV_OK,失败,返回错误码
+
+ # @~english
+ # @brief Disable specified event of device
+ # @param handle [IN] Device handle
+ # @param strEventName [IN] Event name
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_EventNotificationOff(self, strEventName):
+ MvCamCtrldll.MV_CC_EventNotificationOff.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EventNotificationOff.restype = c_uint
+ return MvCamCtrldll.MV_CC_EventNotificationOff(self.handle, strEventName.encode('ascii'))
+ ## @}
+
+
+ ## @addtogroup ch: 仅GigE设备支持的接口 | en: Only support GigE interface
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 设置枚举超时时间,仅支持GigE协议,范围:[1, UINT_MAX)
+ # @param nMilTimeout [IN] 超时时间,应为无符号整数,默认100ms
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 在调用MV_CC_EnumDevices等枚举接口前使用该接口,可设置枚举GIGE设备的网卡最大超时时间(默认100ms),可以减少最大超时时间,来加快枚举GIGE设备的速度
+ # @remarks 仅支持GigEVision设备。
+
+ # @~english
+ # @brief Set enumerate device timeout,only support GigE,range:[1, UINT_MAX)
+ # @param nMilTimeout [IN] time out,input of unsigned int,default 100ms
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Before calling enum device interfaces,call MV_GIGE_SetEnumDevTimeout to set max timeout,can reduce the maximum timeout to speed up the enumeration of GigE devices.
+ # @remarks This API only support GigE Vision Device.
+ def MV_GIGE_SetEnumDevTimeout(nMilTimeout):
+ MvCamCtrldll.MV_GIGE_SetEnumDevTimeout.argtype = (c_uint)
+ MvCamCtrldll.MV_GIGE_SetEnumDevTimeout.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetEnumDevTimeout(c_uint(nMilTimeout))
+
+ ##
+ # @~chinese
+ # @brief 强制IP
+ # @param handle [IN] 设备句柄
+ # @param nIP [IN] 设置的IP
+ # @param nSubNetMask [IN] 子网掩码
+ # @param nDefaultGateWay [IN] 默认网关
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 强制设置设备网络参数(包括IP、子网掩码、默认网关),强制设置之后将需要重新创建设备句柄,支持GigEVision(MV_GIGE_DEVICE)设备和GenTL(MV_GENTL_GIGE_DEVICE)设备
+ # 如果设备为DHCP的状态,调用该接口强制设置设备网络参数之后设备将会重启。
+
+ # @~english
+ # @brief Force IP
+ # @param handle [IN] Device handle
+ # @param nIP [IN] IP to set
+ # @param nSubNetMask [IN] Subnet mask
+ # @param nDefaultGateWay [IN] Default gateway
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Force setting camera network parameter (including IP address, subnet mask, default gateway). After forced setting, device handle should be created again.
+ # This API support GigEVision(MV_GIGE_DEVICE) and GenTL(MV_GENTL_GIGE_DEVICE) device.
+ # If device is in DHCP status, after calling this API to force setting camera network parameter, the device will restart.
+ def MV_GIGE_ForceIpEx(self, nIP, nSubNetMask, nDefaultGateWay):
+ MvCamCtrldll.MV_GIGE_ForceIpEx.argtype = (c_void_p, c_uint, c_uint, c_uint)
+ MvCamCtrldll.MV_GIGE_ForceIpEx.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_ForceIpEx(self.handle, c_uint(nIP), c_uint(nSubNetMask), c_uint(nDefaultGateWay))
+
+ ##
+ # @~chinese
+ # @brief 配置IP方式
+ # @param handle [IN] 设备句柄
+ # @param nType [IN] IP类型,见MV_IP_CFG_x
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 发送命令设置设备的IP方式,如DHCP、LLA等,仅支持GigEVision(MV_GIGE_DEVICE)和GenTl(MV_GENTL_GIGE_DEVICE)的设备。
+
+ # @~english
+ # @brief IP configuration method
+ # @param handle [IN] Device handle
+ # @param nType [IN] IP type, refer to MV_IP_CFG_x
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Send command to set camera IP mode, such as DHCP and LLA, only supported by GigEVision(MV_GIGE_DEVICE) and GenTL(MV_GENTL_GIGE_DEVICE) Device.
+ def MV_GIGE_SetIpConfig(self, nType):
+ MvCamCtrldll.MV_GIGE_SetIpConfig.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetIpConfig.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetIpConfig(self.handle, c_uint(nType))
+
+ ##
+ # @~chinese
+ # @brief 设置仅使用某种模式,type: MV_NET_TRANS_x,不设置时,默认优先使用driver
+ # @param handle [IN] 设备句柄
+ # @param nType [IN] 网络传输模式,见MV_NET_TRANS_x
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 通过该接口可以设置SDK内部优先使用的网络模式,默认优先使用驱动模式,仅GigEVision设备支持。
+
+ # @~english
+ # @brief Set to use only one mode,type: MV_NET_TRANS_x. When do not set, priority is to use driver by default
+ # @param handle [IN] Device handle
+ # @param nType [IN] Net transmission mode, refer to MV_NET_TRANS_x
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarksSet SDK internal priority network mode through this interface, drive mode by default, only supported by GigEVision camera.
+ def MV_GIGE_SetNetTransMode(self, nType):
+ MvCamCtrldll.MV_GIGE_SetNetTransMode.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetNetTransMode.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetNetTransMode(self.handle, c_uint(nType))
+
+ ##
+ # @~chinese
+ # @brief 获取网络传输信息
+ # @param handle [IN] 设备句柄
+ # @param pstInfo [IN][OUT] 信息结构体
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 通过该接口可以获取网络传输相关信息,包括已接收数据大小、丢帧数量等,在MV_CC_StartGrabbing开启采集之后调用。仅GigEVision设备支持。
+
+ # @~english
+ # @brief Get net transmission information
+ # @param handle [IN] Device handle
+ # @param pstInfo [IN][OUT] Information Structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Get network transmission information through this API, including received data size, number of lost frames.
+ # Call this API after starting image acquiring through MV_CC_StartGrabbing. This API is supported only by GigEVision Camera.
+ def MV_GIGE_GetNetTransInfo(self, pstInfo):
+ MvCamCtrldll.MV_GIGE_GetNetTransInfo.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetNetTransInfo.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetNetTransInfo(self.handle, byref(pstInfo))
+
+ ##
+ # @~chinese
+ # @brief 设置枚举命令的回复包类型
+ # @param nMode [IN] 回复包类型(默认广播),0-单播,1-广播
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口只对GigE相机有效。
+
+ # @~english
+ # @brief Setting the ACK mode of devices Discovery.
+ # @param nMode [IN] ACK mode(Default-Broadcast),0-Unicast,1-Broadcast.
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is ONLY effective on GigE cameras.
+ def MV_GIGE_SetDiscoveryMode(nMode):
+ MvCamCtrldll.MV_GIGE_SetDiscoveryMode.argtype = (c_uint)
+ MvCamCtrldll.MV_GIGE_SetDiscoveryMode.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetDiscoveryMode(c_uint(nMode))
+
+ ##
+ # @~chinese
+ # @brief 设置GVSP取流超时时间
+ # @param handle [IN] 设备句柄
+ # @param nMillisec [IN] 超时时间,默认300ms,范围:>10ms
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 连接设备之后,取流动作发生前,调用该接口可以设置GVSP取流超时时间。GVSP取流超时设置过短可能造成图像异常,设置过长可能造成取流时间变长。
+
+ # @~english
+ # @brief Set GVSP streaming timeout
+ # @param handle [IN] Device handle
+ # @param nMillisec [IN] It refers to timeout duration (unit:millisecond), range:>10ms. The default value is 300 ms.
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, and just before start streaming,
+ # call this interface to set GVSP streaming timeout value.
+ def MV_GIGE_SetGvspTimeout(self, nMillisec):
+ MvCamCtrldll.MV_GIGE_SetGvspTimeout.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetGvspTimeout.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetGvspTimeout(self.handle, c_uint(nMillisec))
+
+ ##
+ # @~chinese
+ # @brief 获取GVSP取流超时时间
+ # @param handle [IN] 设备句柄
+ # @param pnMillisec [IN][OUT] 超时时间指针,以毫秒为单位
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于获取当前的GVSP取流超时时间
+
+ # @~english
+ # @brief Get GVSP streaming timeout
+ # @param handle [IN] Device handle
+ # @param pnMillisec [IN][OUT] Timeout, ms as unit
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current GVSP streaming timeout.
+ def MV_GIGE_GetGvspTimeout(self, pnMillisec):
+ MvCamCtrldll.MV_GIGE_GetGvspTimeout.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetGvspTimeout.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetGvspTimeout(self.handle, byref(pnMillisec))
+
+ ##
+ # @~chinese
+ # @brief 设置GVCP命令超时时间
+ # @param handle [IN] 设备句柄
+ # @param nMillisec [IN] 超时时间(ms),默认500ms,范围:[0,10000]
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置GVCP命令超时时间。
+
+ # @~english
+ # @brief Set GVCP cammand timeout
+ # @param handle [IN] Device handle
+ # @param nMillisec [IN] Timeout(ms), default 500ms, range: [0,10000]
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The API can set GVCP command timeout(ms) after device is connected .
+ def MV_GIGE_SetGvcpTimeout(self, nMillisec):
+ MvCamCtrldll.MV_GIGE_SetGvcpTimeout.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetGvcpTimeout.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetGvcpTimeout(self.handle, c_uint(nMillisec))
+
+ ##
+ # @~chinese
+ # @brief 获取GVCP命令超时时间
+ # @param handle [IN] 设备句柄
+ # @param pnMillisec [IN][OUT] 超时时间指针,以毫秒为单位
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于获取当前的GVCP超时时间。
+
+ # @~english
+ # @brief Get GVCP cammand timeout
+ # @param handle [IN] Device handle
+ # @param pnMillisec [IN][OUT] Timeout, ms as unit
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current GVCP timeout.
+ def MV_GIGE_GetGvcpTimeout(self, pnMillisec):
+ MvCamCtrldll.MV_GIGE_GetGvcpTimeout.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetGvcpTimeout.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetGvcpTimeout(self.handle, byref(pnMillisec))
+
+ ##
+ # @~chinese
+ # @brief 设置重传GVCP命令次数
+ # @param handle [IN] 设备句柄
+ # @param nRetryGvcpTimes [IN] 重传次数,范围:0-100
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于在GVCP包传输异常时,增加重传的次数,在一定程度上可以避免设备掉线,范围为0-100。
+
+ # @~english
+ # @brief Set the number of retry GVCP cammand
+ # @param handle [IN] Device handle
+ # @param nRetryGvcpTimes [IN] The number of retries,rang:0-100
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to increase The Times of retransmission when GVCP packet transmission is abnormal,and to some extent,
+ # it can avoid dropping the camera, with a range of 0-100.
+ def MV_GIGE_SetRetryGvcpTimes(self, nRetryGvcpTimes):
+ MvCamCtrldll.MV_GIGE_SetRetryGvcpTimes.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetRetryGvcpTimes.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetRetryGvcpTimes(self.handle, c_uint(nRetryGvcpTimes))
+
+ ##
+ # @~chinese
+ # @brief 获取重传GVCP命令次数
+ # @param handle [IN] 设备句柄
+ # @param pnRetryGvcpTimes [IN][OUT] 重传次数指针
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于获取当前的GVCP重传次数,默认3次。
+
+ # @~english
+ # @brief Get the number of retry GVCP cammand
+ # @param handle [IN] Device handle
+ # @param pnRetryGvcpTimes [IN][OUT] The number of retries
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current number of GVCP retransmissions, which defaults to 3.
+ def MV_GIGE_GetRetryGvcpTimes(self, pnRetryGvcpTimes):
+ MvCamCtrldll.MV_GIGE_GetRetryGvcpTimes.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetRetryGvcpTimes.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetRetryGvcpTimes(self.handle, byref(pnRetryGvcpTimes))
+
+ ##
+ # @~chinese
+ # @brief 获取最佳的packet size,该接口目前只支持GigE设备
+ # @param handle [IN] 设备句柄
+ # @return 最佳packetsize
+ # @remarks 获取最佳的packet size,对应GigEVision设备是SCPS。
+ # 该接口需要在MV_CC_OpenDevice之后、MV_CC_StartGrabbing之前调用。
+ # 该接口不支持CameraLink设备、U3V设备。
+ # 该接口不支持GenTL设备(协议不支持),如果是GenTL方式添加的网口相机,建议根据网络实际情况配置GevSCPSPacketSize,或者配置1500。
+
+ # @~english
+ # @brief Get the optimal Packet Size, Only support GigE Camera
+ # @param handle [IN] Device handle
+ # @return Optimal packetsize
+ # @remarks To get optimized packet size, for GigEVision device is SCPS
+ # and it is the size of a packet transported on the network. The interface should be called after MV_CC_OpenDevice and before MV_CC_StartGrabbing.
+ # This API is not supported by CameraLink device and U3V device.
+ # This interface does not support GenTL devices (protocol not supported). If a network camera is added in GenTL mode, it is recommended to configure GevSCPSPacketSize according to the actual network situation,or 1500.
+ def MV_CC_GetOptimalPacketSize(self):
+ MvCamCtrldll.MV_CC_GetOptimalPacketSize.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_GetOptimalPacketSize.restype = c_uint
+ return MvCamCtrldll.MV_CC_GetOptimalPacketSize(self.handle)
+
+ ##
+ # @~chinese
+ # @brief 设置是否打开重发包支持,及重发包设置
+ # @param handle [IN] 设备句柄
+ # @param bEnable [IN] 是否支持重发包
+ # @param nMaxResendPercent [IN] 最大重发比
+ # @param nResendTimeout [IN] 重发超时时间,范围:0-10000ms
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 连接设备之后调用该接口可以设置重发包属性,仅GigEVision设备支持。
+
+ # @~english
+ # @brief Set whethe to enable resend, and set resend
+ # @param handle [IN] Device handle
+ # @param bEnable [IN] enable resend
+ # @param nMaxResendPercent [IN] Max resend persent
+ # @param nResendTimeout [IN] Resend timeout, rang:0-10000ms
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After the device is connected, call this interface to set resend packet properties, only supported by GigEVision camera.
+ def MV_GIGE_SetResend(self, bEnable, nMaxResendPercent=100, nResendTimeout=50):
+ MvCamCtrldll.MV_GIGE_SetResend.argtype = (c_void_p, c_uint, c_uint, c_uint)
+ MvCamCtrldll.MV_GIGE_SetResend.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetResend(self.handle, c_uint(bEnable), c_uint(nMaxResendPercent),
+ c_uint(nResendTimeout))
+
+ ##
+ # @~chinese
+ # @brief 设置重传命令最大尝试次数
+ # @param handle [IN] 设备句柄
+ # @param nRetryTimes [IN] 重传命令最大尝试次数,默认20
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口必须在调用MV_GIGE_SetResend开启重传包功能之后调用,否则失败且返回MV_E_CALLORDER
+
+ # @~english
+ # @brief set the max resend retry times
+ # @param handle [IN] Device handle
+ # @param nRetryTimes [IN] The max times to retry resending lost packets,default 20
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface MUST be called after enabling resending lost packets by calling MV_GIGE_SetResend,
+ # otherwise would fail and return MV_E_CALLORDER.
+ def MV_GIGE_SetResendMaxRetryTimes(self, nRetryTimes):
+ MvCamCtrldll.MV_GIGE_SetResendMaxRetryTimes.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetResendMaxRetryTimes.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetResendMaxRetryTimes(self.handle, c_uint(nRetryTimes))
+
+ ##
+ # @~chinese
+ # @brief 获取重传命令最大尝试次数
+ # @param handle [IN] 设备句柄
+ # @param pnRetryTimes [IN][OUT] 重传命令最大尝试次数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口必须在调用MV_GIGE_SetResend开启重传包功能之后调用,否则失败且返回MV_E_CALLORDER
+
+ # @~english
+ # @brief get the max resend retry times
+ # @param handle [IN] Device handle
+ # @param pnRetryTimes [IN][OUT] The max times to retry resending lost packets
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface MUST be called after enabling resending lost packets by calling MV_GIGE_SetResend,
+ # otherwise would fail and return MV_E_CALLORDER.
+ def MV_GIGE_GetResendMaxRetryTimes(self, nRetryTimes):
+ MvCamCtrldll.MV_GIGE_GetResendMaxRetryTimes.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetResendMaxRetryTimes.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetResendMaxRetryTimes(self.handle, byref(nRetryTimes))
+
+
+ ##
+ # @~chinese
+ # @brief 设置同一重传包多次请求之间的时间间隔
+ # @param handle [IN] 设备句柄
+ # @param nMillisec [IN] 同一重传包多次请求之间的时间间隔,默认10ms
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口必须在调用MV_GIGE_SetResend开启重传包功能之后调用,否则失败且返回MV_E_CALLORDER
+
+ # @~english
+ # @brief set time interval between same resend requests
+ # @param handle [IN] Device handle
+ # @param nMillisec [IN] The time interval between same resend requests,default 10ms
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface MUST be called after enabling resending lost packets by calling MV_GIGE_SetResend,
+ # otherwise would fail and return MV_E_CALLORDER.
+ def MV_GIGE_SetResendTimeInterval(self, nMillisec):
+ MvCamCtrldll.MV_GIGE_SetResendTimeInterval.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_GIGE_SetResendTimeInterval.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetResendTimeInterval(self.handle, c_uint(nMillisec))
+
+
+ ##
+ # @~chinese
+ # @brief 获取同一重传包多次请求之间的时间间隔
+ # @param handle [IN] 设备句柄
+ # @param pnMillisec [IN][OUT] 同一重传包多次请求之间的时间间隔
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口必须在调用MV_GIGE_SetResend开启重传包功能之后调用,否则失败且返回MV_E_CALLORDER
+
+ # @~english
+ # @brief get time interval between same resend requests
+ # @param handle [IN] Device handle
+ # @param pnMillisec [IN][OUT] The time interval between same resend requests
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface MUST be called after enabling resending lost packets by calling MV_GIGE_SetResend,
+ # otherwise would fail and return MV_E_CALLORDER.
+ def MV_GIGE_GetResendTimeInterval(self, nMillisec):
+ MvCamCtrldll.MV_GIGE_GetResendTimeInterval.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetResendTimeInterval.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetResendTimeInterval(self.handle, byref(nMillisec))
+
+ ##
+ # @~chinese
+ # @brief 设置传输模式,可以为单播模式、组播模式等
+ # @param handle [IN] 设备句柄
+ # @param stTransmissionType [IN] 传输模式结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过该接口可以设置传输模式为单播、组播等模式,仅GigEVision设备支持。
+
+ # @~english
+ # @brief Set transmission type,Unicast or Multicast
+ # @param handle [IN] Device handle
+ # @param stTransmissionType [IN] Struct of transmission type
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Call this API to set the transmission mode as single cast mode and multicast mode. And this API is only valid for GigEVision camera.
+ def MV_GIGE_SetTransmissionType(self, stTransmissionType):
+ MvCamCtrldll.MV_GIGE_SetTransmissionType.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_SetTransmissionType.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_SetTransmissionType(self.handle, byref(stTransmissionType))
+
+
+ ##
+ # @~chinese
+ # @brief 发出动作命令
+ # @param pstActionCmdInfo [IN] 动作命令信息
+ # @param pstActionCmdResults [IN][OUT] 动作命令返回信息列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 仅GigEVision设备支持。
+
+ # @~english
+ # @brief Issue Action Command
+ # @param pstActionCmdInfo [IN] Action Command
+ # @param pstActionCmdResults [IN][OUT] Action Command Result List
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API is supported only by GigEVision camera.
+ def MV_GIGE_IssueActionCommand(pstActionCmdInfo, pstActionCmdResults):
+ MvCamCtrldll.MV_GIGE_IssueActionCommand.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_IssueActionCommand.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_IssueActionCommand(byref(pstActionCmdInfo), byref(pstActionCmdResults))
+
+ ##
+ # @~chinese
+ # @brief 获取组播状态
+ # @param pstDevInfo [IN] 设备信息结构体
+ # @param pbStatus [IN][OUT] 组播状态,true:组播状态,false:非组播
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于判断设备当前是否处于组播状态,解决客户端枚举时需要打开设备判断组播的问题。
+ # 仅支持标准GigE Vision设备。
+
+ # @~english
+ # @brief Get Multicast Status
+ # @param pstDevInfo [IN] Device Information Structure
+ # @param pbStatus [IN][OUT] Status of Multicast
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to determine whether the camera is currently in multicast state,
+ # and to solve the problem that the client needs to turn on the camera to determine multicast when enumerating.
+ # This API only support GigE Vision Device.
+ def MV_GIGE_GetMulticastStatus(pstDevInfo, pbStatus):
+ MvCamCtrldll.MV_GIGE_GetMulticastStatus.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_GIGE_GetMulticastStatus.restype = c_uint
+ return MvCamCtrldll.MV_GIGE_GetMulticastStatus(byref(pstDevInfo), byref(pbStatus))
+ ## @}
+
+ ## @addtogroup ch: 仅CameraLink 设备支持的接口 | en: Only support camlink device interface
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 获取串口信息列表
+ # @param pstSerialPortList [IN][OUT] 串口信息列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于获取本地的串口信息。
+
+ # @~english
+ # @brief Get serial port information list
+ # @param pstSerialPortList [IN][OUT] serial port information list
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get local serial port information.
+ def MV_CAML_GetSerialPortList(stSerialPortList):
+ MvCamCtrldll.MV_CAML_GetSerialPortList.argtype = c_void_p
+ MvCamCtrldll.MV_CAML_GetSerialPortList.restype = c_uint
+ return MvCamCtrldll.MV_CAML_GetSerialPortList(byref(stSerialPortList))
+
+ ##
+ # @~chinese
+ # @brief 设置取指定枚举串口
+ # @param pstSerialPortList [IN][OUT] 串口信息列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口用于设置枚举CameraLink 设备的指定串口。
+
+ # @~english
+ # @brief Set the specified enumeration serial port
+ # @param pstSerialPortList [IN] serial port information list
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to set the specified enumeration serial port.
+ def MV_CAML_SetEnumSerialPorts(stSerialPortList):
+ MvCamCtrldll.MV_CAML_SetEnumSerialPorts.argtype = c_void_p
+ MvCamCtrldll.MV_CAML_SetEnumSerialPorts.restype = c_uint
+ return MvCamCtrldll.MV_CAML_SetEnumSerialPorts(byref(stSerialPortList))
+
+ ##
+ # @~chinese
+ # @brief 设置设备波特率
+ # @param handle [IN] 设备句柄
+ # @param nBaudrate [IN] 设置的波特率值,数值参考CameraParams.h中宏定义,如#define MV_CAML_BAUDRATE_9600 0x00000001
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口支持在设备未连接时调用. 通过GenTL协议访问设备时,需要先连接设备,才能调用该接口
+ # 因硬件/系统/外部干扰等因素,配置高波特率可能导致通信异常,建议配置波特率最大小于115200
+
+ # @~english
+ # @brief Set device baudrate using one of the CL_BAUDRATE_XXXX value
+ # @param handle [IN] Device handle
+ # @param nBaudrate [IN] baud rate to set. Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_CAML_BAUDRATE_9600 0x00000001
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API is supported only by CameraLink device.
+ # This API support calls when devices are not connected. But it is necessary to connect to the device first when accessing a CameraLink Device through the GenTL protocol.
+ # Due to hardware/system/external interference and other factors, configuring a high baud rate may cause abnormal communication.
+ # It is recommended to configure a baud rate of less than 115200
+
+ def MV_CAML_SetDeviceBaudrate(self, nBaudrate):
+ MvCamCtrldll.MV_CAML_SetDeviceBaudrate.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CAML_SetDeviceBaudrate.restype = c_uint
+ return MvCamCtrldll.MV_CAML_SetDeviceBaudrate(self.handle, c_uint(nBaudrate))
+
+ ##
+ # @~chinese
+ # @brief 获取设备波特率
+ # @param handle [IN] 设备句柄
+ # @param pnCurrentBaudrate [IN][OUT] 波特率信息指针,数值参考CameraParams.h中宏定义,如#define MV_CAML_BAUDRATE_9600 0x00000001
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口支持在设备未连接时调用。
+
+ # @~english
+ # @brief Returns the current device baudrate, using one of the CL_BAUDRATE_XXXX value
+ # @param handle [IN] Device handle
+ # @param pnCurrentBaudrate [IN][OUT] Return pointer of baud rate to user. Refer to the 'CameraParams.h' for parameter definitions, for example, #define MV_CAML_BAUDRATE_9600 0x00000001
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API is supported only by CameraLink device.
+ # This API support calls when devices are not connected.
+ def MV_CAML_GetDeviceBaudrate(self, pnCurrentBaudrate):
+ MvCamCtrldll.MV_CAML_GetDeviceBaudrate.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CAML_GetDeviceBaudrate.restype = c_uint
+ return MvCamCtrldll.MV_CAML_GetDeviceBaudrate(self.handle, byref(pnCurrentBaudrate))
+
+ ##
+ # @~chinese
+ # @brief 获取设备与主机间连接支持的波特率
+ # @param handle [IN] 设备句柄
+ # @param pnBaudrateAblity [IN][OUT] 支持的波特率信息的指针。所有支持的波特率的"或运算"结果,单个数值参考CameraParams.h中宏定义,如MV_CAML_BAUDRATE_9600 0x00000001
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口支持在设备未连接时调用。
+
+ # @~english
+ # @brief Returns supported baudrates of the combined device and host interface
+ # @param handle [IN] Device handle
+ # @param pnBaudrateAblity [IN][OUT] Return pointer of the supported baudrates to user. 'OR' operation results of the supported baudrates. Refer to the 'CameraParams.h' for single value definitions, for example, MV_CAML_BAUDRATE_9600 0x00000001
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API is supported only by CameraLink device.
+ # This API support calls when devices are not connected.
+ def MV_CAML_GetSupportBaudrates(self, pnBaudrateAblity):
+ MvCamCtrldll.MV_CAML_GetSupportBaudrates.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CAML_GetSupportBaudrates.restype = c_uint
+ return MvCamCtrldll.MV_CAML_GetSupportBaudrates(self.handle, byref(pnBaudrateAblity))
+
+ ##
+ # @~chinese
+ # @brief 设置串口操作等待时长
+ # @param handle [IN] 设备句柄
+ # @param nMillisec [IN] 串口操作的等待时长, 单位为ms
+ # @return 成功,返回MV_OK,失败,返回错误码
+
+ # @~english
+ # @brief Sets the timeout for operations on the serial port
+ # @param handle [IN] Device handle
+ # @param nMillisec [IN] Timeout in [ms] for operations on the serial port.
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CAML_SetGenCPTimeOut(self, nMillisec):
+ MvCamCtrldll.MV_CAML_SetGenCPTimeOut.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CAML_SetGenCPTimeOut.restype = c_uint
+ return MvCamCtrldll.MV_CAML_SetGenCPTimeOut(self.handle, c_uint(nMillisec))
+ ## @}
+
+
+ ## @addtogroup ch: 仅U3V设备支持的接口 | en: Only support U3V device interface
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 设置U3V的传输包大小
+ # @param handle [IN] 设备句柄
+ # @param nTransferSize [IN] 传输的包大小, Byte,默认为1M,rang:>=0x400,建议最大值:[windows] rang <= 0x400000;[Linux] rang <= 0x200000
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 增加传输包大小可以适当降低取流时的CPU占用率。但不同的PC和不同USB扩展卡存在不同的兼容性,如果该参数设置过大可能会出现取不到图像的风险。
+
+ # @~english
+ # @brief Set transfer size of U3V device
+ # @param handle [IN] Device handle
+ # @param nTransferSize [IN] Transfer size,Byte,default:1M,rang:>=0x400,Recommended maximum: [windows] rang <= 0x400000; [Linux] rang <= 0x200000
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Increasing the transmission packet size can reduce the CPU utilization at the time of fetching. However, different PCS and different USB extension CARDS have different compatibility, and if this parameter is set too large, there may be the risk of not getting the image.
+ def MV_USB_SetTransferSize(self, nTransferSize):
+ MvCamCtrldll.MV_USB_SetTransferSize.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_USB_SetTransferSize.restype = c_uint
+ return MvCamCtrldll.MV_USB_SetTransferSize(self.handle, c_uint(nTransferSize))
+
+ ##
+ # @~chinese
+ # @brief 获取U3V的传输包大小
+ # @param handle [IN] 设备句柄
+ # @param pnTransferSize [IN][OUT] 传输的包大小指针, Byte
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口用于获取当前的U3V传输包大小,默认1M。
+
+ # @~english
+ # @brief Get transfer size of U3V device
+ # @param handle [IN] Device handle
+ # @param pnTransferSize [IN][OUT] Transfer size,Byte
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current U3V transfer packet size, default 1M.
+ def MV_USB_GetTransferSize(self, pnTransferSize):
+ MvCamCtrldll.MV_USB_GetTransferSize.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_USB_GetTransferSize.restype = c_uint
+ return MvCamCtrldll.MV_USB_GetTransferSize(self.handle, byref(pnTransferSize))
+
+ ##
+ # @~chinese
+ # @brief 设置U3V的传输通道个数
+ # @param handle [IN] 设备句柄
+ # @param nTransferWays [IN] 传输通道个数,范围:1-10
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 用户可以根据PC的性能、设备出图帧率、图像大小和内存使用率等因素对该参数进行调节。但不同的PC和不同的USB扩展卡存在不同的兼容性。
+
+ # @~english
+ # @brief Set transfer ways of U3V device
+ # @param handle [IN] Device handle
+ # @param nTransferWays [IN] Transfer ways,rang:1-10
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Users can adjust this parameter according to PC performance, camera image frame rate, image size, memory utilization and other factors. But different PCS and different USB expansion CARDS have different compatibility.
+ def MV_USB_SetTransferWays(self, nTransferWays):
+ MvCamCtrldll.MV_USB_SetTransferWays.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_USB_SetTransferWays.restype = c_uint
+ return MvCamCtrldll.MV_USB_SetTransferWays(self.handle, c_uint(nTransferWays))
+
+
+ ##
+ # @~chinese
+ # @brief 获取U3V的传输通道个数
+ # @param handle [IN] 设备句柄
+ # @param pnTransferWays [IN][OUT] 传输通道个数指针
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口用于获取当前的U3V异步取流节点个数,U口相机传输通道个数和像素格式对应的负载包大小相关,通过最大异步注册长度 / 像素格式对应的负载包大小 计算得出。
+
+ # @~english
+ # @brief Get transfer ways of U3V device
+ # @param handle [IN] Device handle
+ # @param pnTransferWays [IN][OUT] Transfer ways
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current number of U3V asynchronous feed nodes.
+ # For U3V camera, The number of transmission channels is related to the size of the payload size corresponding to the pixel format, which is calculated by the maximum asynchronous registration length / the payload size corresponding to pixel format.
+ def MV_USB_GetTransferWays(self, pnTransferWays):
+ MvCamCtrldll.MV_USB_GetTransferWays.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_USB_GetTransferWays.restype = c_uint
+ return MvCamCtrldll.MV_USB_GetTransferWays(self.handle, byref(pnTransferWays))
+
+
+ ##
+ # @~chinese
+ # @brief 设置U3V的事件缓存节点个数
+ # @param handle [IN] 设备句柄
+ # @param nEventNodeNum [IN] 事件缓存节点个数,范围:1-64
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口用于设置当前的U3V事件缓存节点个数,默认情况下为5个。
+
+ # @~english
+ # @brief Set the number of U3V device event cache nodes
+ # @param handle [IN] Device handle
+ # @param nEventNodeNum [IN] Event Node Number
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to set the current number of U3V event nodes. default to 5 nodes.
+ def MV_USB_SetEventNodeNum(self, nEventNodeNum):
+ MvCamCtrldll.MV_USB_SetEventNodeNum.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_USB_SetEventNodeNum.restype = c_uint
+ return MvCamCtrldll.MV_USB_SetEventNodeNum(self.handle, c_uint(nEventNodeNum))
+
+
+ ##
+ # @~chinese
+ # @brief 设置U3V的同步读写超时时间,范围为:[1000, INT_MAX]
+ # @param handle [IN] 设备句柄
+ # @param nMills [IN] 设置同步读写超时时间,默认时间为1000ms
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 增加设置同步读取时间接口,兼容部分相机配置参数很慢,超过1000ms的情况
+
+ # @~english
+ # @brief Set U3V Synchronisation timeout,range:[1000, INT_MAX]
+ # @param handle [IN] Device handle
+ # @param nMills [IN] set synchronisation timeout(ms),default 1000ms
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Increasing the SetSyncTimeOut can compatible with some camera configuretion parameters very slow,more than 1000ms
+ def MV_USB_SetSyncTimeOut(self, nMills):
+ MvCamCtrldll.MV_USB_SetSyncTimeOut.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_USB_SetSyncTimeOut.restype = c_uint
+ return MvCamCtrldll.MV_USB_SetSyncTimeOut(self.handle, c_uint(nMills))
+
+ ##
+ # @~chinese
+ # @brief 获取U3V相机同步读写超时时间
+ # @param handle [IN] 设备句柄
+ # @param pnMills [IN][OUT] 获取的超时时间(ms)
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 该接口用于获取当前的U3V同步读写超时时间大小,默认1000ms。
+
+ # @~english
+ # @brief Get U3V Camera Synchronisation timeout
+ # @param handle [IN] Device handle
+ # @param pnMills [IN][OUT] Get Synchronisation time(ms)
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is used to get the current U3V timeout, default 1000ms.
+ def MV_USB_GetSyncTimeOut(self, nMills):
+ MvCamCtrldll.MV_USB_GetSyncTimeOut.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_USB_GetSyncTimeOut.restype = c_uint
+ return MvCamCtrldll.MV_USB_GetSyncTimeOut(self.handle, byref(nMills))
+ ## @}
+
+ ## @addtogroup ch: GenTL相关接口 | en: GenTL related interface
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 通过GenTL枚举Interfaces
+ # @param pstIFList [IN][OUT] Interfaces列表
+ # @param strGenTLPath [IN] GenTL的cti文件路径
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks Interfaces列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请
+ # 建议尽量避免多线程枚举操作。
+ # 暂不支持工业相机SDK直接调用MvProducerU3V.cti和MvProducerGEV.cti, 支持调用其他.cti
+
+ # @~english
+ # @brief Enumerate Interfaces with GenTL
+ # @param pstIFList [IN][OUT] Interfaces List
+ # @param strGenTLPath [IN] GenTL cti file path
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The memory of the Interfaces list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied.\n
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+ # Currently not supported for SDK to directly call MvProducerU3V. cti and MvProducerGEV. cti. supports calling other. cti
+ def MV_CC_EnumInterfacesByGenTL(stIFList, strGenTLPath):
+ MvCamCtrldll.MV_CC_EnumInterfacesByGenTL.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EnumInterfacesByGenTL.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumInterfacesByGenTL(byref(stIFList), strGenTLPath.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 通过GenTL Interface枚举设备
+ # @param pstIFInfo [IN] Interface信息
+ # @param pstDevList [IN][OUT] 设备列表
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请
+ # 建议尽量避免多线程枚举操作。
+
+ # @~english
+ # @brief Enumerate Devices with GenTL interface
+ # @param pstIFInfo [IN] Interface information
+ # @param pstDevList [IN][OUT] Device List
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The memory of the list is allocated within the SDK. When the interface is invoked by multiple threads, the memory of the device list will be released and applied.\n
+ # It is recommended to avoid multithreaded enumeration operations as much as possible.
+ def MV_CC_EnumDevicesByGenTL(stIFInfo, stDevList):
+ MvCamCtrldll.MV_CC_EnumDevicesByGenTL.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_EnumDevicesByGenTL.restype = c_uint
+ return MvCamCtrldll.MV_CC_EnumDevicesByGenTL(stIFInfo, byref(stDevList))
+
+ ##
+ # @~chinese
+ # @brief 卸载cti库
+ # @param pGenTLPath [IN] 枚举卡时加载的cti文件路径
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 卸载前需要保证通过该cti枚举出的相机已全部关闭,否则报错前置条件错误。
+
+ # @~english
+ # @brief Unload cti library
+ # @param pGenTLPath [IN] GenTL cti file path
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Make sure that all devices enumerated by this cti are already closed.
+ @staticmethod
+ def MV_CC_UnloadGenTLLibrary(GenTLPath):
+ MvCamCtrldll.MV_CC_UnloadGenTLLibrary.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_UnloadGenTLLibrary.restype = c_uint
+ return MvCamCtrldll.MV_CC_UnloadGenTLLibrary(GenTLPath.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 通过GenTL设备信息创建设备句柄
+ # @param handle [IN][OUT] 设备句柄
+ # @param pstDevInfo [IN] 设备信息结构体指针
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 根据输入的设备信息,创建库内部必须的资源和初始化内部模块。
+
+ # @~english
+ # @brief Create Device Handle with GenTL Device Info
+ # @param handle [IN][OUT] Device handle
+ # @param pstDevInfo [IN] Device Information
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Create required resources within library and initialize internal module according to input device information.
+ def MV_CC_CreateHandleByGenTL(self, stDevInfo):
+ MvCamCtrldll.MV_CC_CreateHandleByGenTL.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_CreateHandleByGenTL.restype = c_uint
+ return MvCamCtrldll.MV_CC_CreateHandleByGenTL(byref(self.handle), byref(stDevInfo))
+ ## @}
+
+
+ ## @addtogroup ch: 图像保存、格式转换等相关接口 | en: Related image save and format convert interface
+ ## @{
+
+ ##
+ # @~chinese
+ # @brief 保存图片,支持Bmp和Jpeg.
+ # @param handle [IN] 设备句柄
+ # @param pstSaveParam [IN][OUT] 保存图片参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过该接口可以将从设备采集到的原始图像数据转换成JPEG或者BMP等格式并存放在指定内存中,然后用户可以将转换之后的数据直接保存成图片文件。
+ # 该接口调用无接口顺序要求,有图像源数据就可以进行转换,可以先调用MV_CC_GetOneFrameTimeout或者MV_CC_RegisterImageCallBackEx设置回调函数,获取一帧图像数据,然后再通过该接口转换格式。
+ # 该接口支持图像 宽、高、总长最大至 UINT_MAX, 其中MV_CC_SaveImageEx2支持 宽、高、总长最大至 USHRT_MAX
+ # JPEG格式最大支持宽高为65500
+
+ # @~english
+ # @brief Save image, support Bmp and Jpeg.
+ # @param handle [IN] Device handle
+ # @param pstSaveParam [IN][OUT] Save image parameters structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Once there is image data, you can call this API to convert the data.
+ # You can also call MV_CC_GetOneFrameTimeout or MV_CC_RegisterImageCallBackEx or MV_CC_GetImageBuffer to get one image frame and set the callback function, and then call this API to convert the format.
+ # Comparing with the API MV_CC_SaveImageEx2, this API support the parameter nWidth/nHeight/nDataLen to UINT_MAX.
+ # JPEG format supports a maximum width and height of 65500
+ def MV_CC_SaveImageEx3(self, stSaveParam):
+ MvCamCtrldll.MV_CC_SaveImageEx3.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SaveImageEx3.restype = c_uint
+ return MvCamCtrldll.MV_CC_SaveImageEx3(self.handle, byref(stSaveParam))
+
+ ##
+ # @~chinese
+ # @brief 保存图像到文件
+ # @param handle [IN] 设备句柄
+ # @param pstSaveFileParam [IN][OUT] 保存图片文件参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口支持BMP/JPEG/PNG/TIFF。
+ # 该接口支持图像 宽、高、总长最大至 UINT_MAX
+ # JPEG格式最大支持宽高为65500
+ # Windows平台文件路径长度不超过260字节,Linux平台不超过255字节
+
+ # @~english
+ # @brief Save the image file.
+ # @param handle [IN] Device handle
+ # @param pstSaveFileParam [IN][OUT] Save the image file parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API support BMP/JPEG/PNG/TIFF.
+ # this API support the parameter nWidth/nHeight/nDataLen to UINT_MAX.
+ # JPEG format supports a maximum width and height of 65500
+ # The file path length on the Windows platform does not exceed 260 bytes, and on the Linux platform, it does not exceed 255 bytes.
+ def MV_CC_SaveImageToFileEx(self, pstSaveFileParam):
+ MvCamCtrldll.MV_CC_SaveImageToFileEx.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SaveImageToFileEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_SaveImageToFileEx(self.handle, byref(pstSaveFileParam))
+
+ ##
+ # @~chinese
+ # @brief 保存图像到文件
+ # @param handle [IN] 设备句柄
+ # @param pstImage [IN] 图像信息
+ # @param pSaveImageParam [IN] 存图参数
+ # @param pcImagePath [IN] 存图路径
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口支持4G以上超大图的PNG/TIFF存图,非超大图像支持BMP/JPEG/TIFF/PNG
+ # JPEG格式最大支持宽高为65500
+ # Windows平台文件路径长度不超过260字节,Linux平台不超过255字节
+
+ # @~english
+ # @brief Save the image file.
+ # @param handle [IN] Device handle
+ # @param pstImage [IN] Image information
+ # @param pSaveImageParam [IN] Save the image file parameter structure
+ # @param pcImagePath [IN] Image path
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks When the image size exceeds 4GB, only PNG and TIFF are supported. Otherwise, BMP,JPEG,TIFF and PNG are supported.
+ # JPEG format supports a maximum width and height of 65500
+ # The file path length on the Windows platform does not exceed 260 bytes, and on the Linux platform, it does not exceed 255 bytes.
+ def MV_CC_SaveImageToFileEx2(self, pstImage, pSaveImageParam, pcImagePath):
+ MvCamCtrldll.MV_CC_SaveImageToFileEx2.argtype = (c_void_p, c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SaveImageToFileEx2.restype = c_uint
+ return MvCamCtrldll.MV_CC_SaveImageToFileEx2(self.handle, byref(pstImage), byref(pSaveImageParam), pcImagePath.encode('ascii'))
+
+ ##
+ # @~chinese
+ # @brief 图像旋转
+ # @param handle [IN] 设备句柄
+ # @param pstRotateParam [IN][OUT] 图像旋转参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口只支持MONO8/RGB24/BGR24格式数据的90/180/270度旋转。
+
+ # @~english
+ # @brief Rotate Image
+ # @param handle [IN] Device handle
+ # @param pstRotateParam [IN][OUT] Rotate image parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API only support 90/180/270 rotation of data in the MONO8/RGB24/BGR24 format.
+ def MV_CC_RotateImage(self, stRotateParam):
+ MvCamCtrldll.MV_CC_RotateImage.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RotateImage.restype = c_uint
+ return MvCamCtrldll.MV_CC_RotateImage(self.handle, byref(stRotateParam))
+
+ ##
+ # @~chinese
+ # @brief 图像翻转
+ # @param handle [IN] 设备句柄
+ # @param pstFlipParam [IN][OUT] 图像翻转参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口只支持MONO8/RGB24/BGR24格式数据的垂直和水平翻转。
+
+ # @~english
+ # @brief Flip Image
+ # @param handle [IN] Device handle
+ # @param pstFlipParam [IN][OUT] Flip image parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API only support vertical and horizontal reverse of data in the MONO8/RGB24/BGR24 format.
+ def MV_CC_FlipImage(self, pstFlipParam):
+ MvCamCtrldll.MV_CC_FlipImage.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_FlipImage.restype = c_uint
+ return MvCamCtrldll.MV_CC_FlipImage(self.handle, byref(pstFlipParam))
+
+ ##
+ # @~chinese
+ # @brief 像素格式转换
+ # @param handle [IN] 设备句柄
+ # @param pstCvtParam [IN][OUT] 像素格式转换参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 通过将接口可以将从设备采集到的原始图像数据转换成用户所需的像素格式并存放在指定内存中。
+ # 该接口调用无接口顺序要求,有图像源数据就可以进行转换,可以先调用MV_CC_GetOneFrameTimeout或者MV_CC_RegisterImageCallBackEx设置回调函数,
+ # 获取一帧图像数据,然后再通过该接口转换格式。如果设备当前采集图像是JPEG压缩的格式,则不支持调用该接口进行转换。
+ # 该接口支持图像 宽、高、总长最大至 UINT_MAX, 其中MV_CC_ConvertPixelType支持 宽、高、总长最大至 USHRT_MAX
+
+ # @~english
+ # @brief Pixel format conversion
+ # @param handle [IN] Device handle
+ # @param pstCvtParam [IN][OUT] Convert Pixel Type parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This API is used to transform the collected original data to pixel format and save to specified memory.
+ # There is no order requirement to call this API, the transformation will execute when there is image data.
+ # First call MV_CC_GetOneFrameTimeout or MV_CC_RegisterImageCallBackEx to set callback function, and get a frame of image data,
+ # then call this API to transform the format.
+ # Comparing with the API MV_CC_ConvertPixelType, this API support the parameter nWidth/nHeight/nSrcDataLen to UINT_MAX.
+ def MV_CC_ConvertPixelTypeEx(self, pstCvtParam):
+ MvCamCtrldll.MV_CC_ConvertPixelTypeEx.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_ConvertPixelTypeEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_ConvertPixelTypeEx(self.handle, byref(pstCvtParam))
+
+ ##
+ # @~chinese
+ # @brief 设置插值算法类型
+ # @param handle [IN] 设备句柄
+ # @param nBayerCvtQuality [IN] Bayer的插值方法 0-快速 1-均衡(默认为均衡) 2-最优 3-最优+
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设置内部图像转换接口的Bayer插值算法类型参数,MV_CC_ConvertPixelTypeEx、MV_CC_GetImageForRGB/BGR接口内部使用的插值算法是该接口所设定的。
+
+ # @~english
+ # @brief Interpolation algorithm type setting
+ # @param handle [IN] Device handle
+ # @param nBayerCvtQuality [IN] Bayer interpolation method 0-Fast 1-Equilibrium 2-Optimal
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Set the bell interpolation quality parameters of the internal image conversion interface,
+ # and the interpolation algorithm used in the MV_CC_ConvertPixelTypeEx and MV_CC_GetImageForRGB/BGR interfaces is set by this interface.
+ def MV_CC_SetBayerCvtQuality(self, nBayerCvtQuality):
+ MvCamCtrldll.MV_CC_SetBayerCvtQuality.argtype = (c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_SetBayerCvtQuality.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerCvtQuality(self.handle, c_uint(nBayerCvtQuality))
+
+ ##
+ # @~chinese
+ # @brief 插值算法平滑使能设置
+ # @param handle [IN] 设备句柄
+ # @param bFilterEnable [IN] 平滑使能(默认关闭)
+ # @return 成功,返回#MV_OK;错误,返回错误码
+ # @remarks 设置内部图像转换接口的Bayer插值平滑使能参数,MV_CC_ConvertPixelTypeEx、MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx接口内部使用的插值算法是该接口所设定的。
+
+ # @~english
+ # @brief Filter type of the bell interpolation quality algorithm setting
+ # @param handle [IN] Device handle
+ # @param bFilterEnable [IN] Filter type enable
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Set the Bayer interpolation filter type parameters of the internal image conversion interface, and the interpolation algorithm used in the MV_CC_ConvertPixelTypeEx \ MV_CC_SaveImageEx3 \ MV_CC_SaveImageToFileEx interfaces is set by this interface.
+ def MV_CC_SetBayerFilterEnable(self, bFilterEnable):
+ MvCamCtrldll.MV_CC_SetBayerFilterEnable.argtype = (c_void_p, c_bool)
+ MvCamCtrldll.MV_CC_SetBayerFilterEnable.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerFilterEnable(self.handle, c_bool(bFilterEnable))
+
+ ##
+ # @~chinese
+ # @brief 设置Bayer格式的Gamma值
+ # @param handle [IN] 设备句柄
+ # @param fBayerGammaValue [IN] Gamma值:0.1 ~ 4.0
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设置该值后,在Bayer图像(Bayer8/10/12/16)转RGB/BGR图像(RGB24/48、RGBA32/64、BGR24/48、BGRA32/64)时起效。 相关接口: MV_CC_ConvertPixelTypeEx、 MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx。
+
+ # @~english
+ # @brief Set Gamma value
+ # @param handle [IN] Device handle
+ # @param fBayerGammaValue [IN] Gamma value[0.1,4.0]
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After setting this value, it takes effect when converting Bayer images (Bayer8/10/12/16) to RGB/BGR images (RGB24/48, RGBA32/64, BGR24/48, BGRA32/64). Related interfaces: MV_CC_ConvertPixelTypeEx, MV_CC_SaveImageEx3, MV_CC_SaveImageToFileEx.
+ def MV_CC_SetBayerGammaValue(self, fBayerGammaValue):
+ MvCamCtrldll.MV_CC_SetBayerGammaValue.argtype = (c_void_p, c_float)
+ MvCamCtrldll.MV_CC_SetBayerGammaValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerGammaValue(self.handle, c_float(fBayerGammaValue))
+
+ ##
+ # @~chinese
+ # @brief 设置Mono8/Bayer8/10/12/16格式的Gamma值
+ # @param handle [IN] 设备句柄
+ # @param MvGvspPixelType enSrcPixelType [IN] 像素格式,支持PixelType_Gvsp_Mono8,Bayer8/10/12/16
+ # @param fGammaValue [IN] Gamma值:0.1 ~ 4.0
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设置Mono8的gamma值后,在调用MV_CC_ConvertPixelTypeEx接口将Mono8转成Mono8时gamma值起效。
+ # @remarks 设置Bayer的gamma值后,在Bayer图像(Bayer8/10/12/16)转RGB/BGR图像(RGB24/48、RGBA32/64、BGR24/48、BGRA32/64)时起效。相关接口: MV_CC_ConvertPixelTypeEx、 MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx。
+ # @remarks 该接口兼容MV_CC_SetBayerGammaValue接口,新增支持Mono8像素格式
+
+ # @~english
+ # @brief Set Gamma value
+ # @param handle [IN] Device handle
+ # @param MvGvspPixelType enSrcPixelType [IN] PixelType,support PixelType_Gvsp_Mono8,Bayer8/10/12/16
+ # @param fGammaValue [IN] Gamma value:0.1~ 4.0
+ # @remarks After setting the gamma of Mono8 ,the gamma value takes effect when calling MV_CC_ConvertPixelTypeEx converts Mono8 to Mono8.
+ # @remarks After setting the gamma value for Bayer8/10/12/16, it takes effect when converting the Bayer image (Bayer8/10/12/16) to RGB/BGR images (RGB24/48, RGBA32/64, BGR24/48, BGRA32/64). Relevant interfaces: MV_CC_ConvertPixelTypeEx, MV_CC_SaveImageEx3, MV_CC_SaveImageToFileEx.
+ # @remarks This API compatible with MV_CC_SetBayerGammaValue, adds Mono8 PixelType.
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_SetGammaValue(self, enSrcPixelType, fGammaValue):
+ MvCamCtrldll.MV_CC_SetGammaValue.argtype = (c_void_p, c_int, c_float)
+ MvCamCtrldll.MV_CC_SetGammaValue.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetGammaValue(self.handle, c_int(enSrcPixelType), c_float(fGammaValue))
+
+ ##
+ # @~chinese
+ # @brief 设置Bayer格式的Gamma信息
+ # @param handle [IN] 设备句柄
+ # @param pstGammaParam [IN] Gamma信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 设置该值后,在Bayer图像(Bayer8/10/12/16)转RGB/BGR图像(RGB24/48、RGBA32/64、BGR24/48、BGRA32/64)时起效。 相关接口: MV_CC_ConvertPixelTypeEx、 MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx。
+
+ # @~english
+ # @brief Set Gamma param
+ # @param handle [IN] Device handle
+ # @param pstGammaParam [IN] Gamma param
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After setting this value, it takes effect when converting Bayer images (Bayer8/10/12/16) to RGB/BGR images (RGB24/48, RGBA32/64, BGR24/48, BGRA32/64). Related interfaces: MV_CC_ConvertPixelTypeEx, MV_CC_SaveImageEx3, MV_CC_SaveImageToFileEx.
+ def MV_CC_SetBayerGammaParam(self, stGammaParam):
+ MvCamCtrldll.MV_CC_SetBayerGammaParam.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetBayerGammaParam.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerGammaParam(self.handle, byref(stGammaParam))
+
+ ##
+ # @~chinese
+ # @brief 设置Bayer格式的CCM使能和矩阵,量化系数默认1024
+ # @param handle [IN] 设备句柄
+ # @param pstCCMParam [IN] CCM参数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 开启CCM并设置CCM矩阵后,在Bayer图像(Bayer8/10/12/16)转RGB/BGR图像(RGB24/48、RGBA32/64、BGR24/48、BGRA32/64)时起效。 相关接口: MV_CC_ConvertPixelTypeEx、 MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx。
+
+ # @~english
+ # @brief Set CCM param,Scale default 1024
+ # @param handle [IN] Device handle
+ # @param pstCCMParam [IN] CCM parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After enable the color correction and set the color correction matrix, it takes effect when converting Bayer images (Bayer8/10/12/16) to RGB/BGR images (RGB24/48, RGBA32/64, BGR24/48, BGRA32/64). Related interfaces: MV_CC_ConvertPixelTypeEx, MV_CC_SaveImageEx3, MV_CC_SaveImageToFileEx.
+ def MV_CC_SetBayerCCMParam(self, stCCMParam):
+ MvCamCtrldll.MV_CC_SetBayerCCMParam.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetBayerCCMParam.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerCCMParam(self.handle, byref(stCCMParam))
+
+ ##
+ # @~chinese
+ # @brief 设置Bayer格式的CCM使能和矩阵
+ # @param handle [IN] 设备句柄
+ # @param pstCCMParam [IN] CCM参数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 开启CCM并设置CCM矩阵后,在Bayer图像(Bayer8/10/12/16)转RGB/BGR图像(RGB24/48、RGBA32/64、BGR24/48、BGRA32/64)时起效。 相关接口: MV_CC_ConvertPixelTypeEx、 MV_CC_SaveImageEx3、MV_CC_SaveImageToFileEx。
+
+ # @~english
+ # @brief Set CCM param
+ # @param handle [IN] Device handle
+ # @param pstCCMParam [IN] CCM parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks After enable the color correction and set the color correction matrix, it takes effect when converting Bayer images (Bayer8/10/12/16) to RGB/BGR images (RGB24/48, RGBA32/64, BGR24/48, BGRA32/64). Related interfaces: MV_CC_ConvertPixelTypeEx, MV_CC_SaveImageEx3, MV_CC_SaveImageToFileEx.
+ def MV_CC_SetBayerCCMParamEx(self, stCCMParam):
+ MvCamCtrldll.MV_CC_SetBayerCCMParamEx.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetBayerCCMParamEx.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetBayerCCMParamEx(self.handle, byref(stCCMParam))
+
+ ##
+ # @~chinese
+ # @brief 图像对比度调节
+ # @param handle [IN] 设备句柄
+ # @param pstContrastParam [IN][OUT] 对比度调节参数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks
+
+ # @~english
+ # @brief Adjust image contrast
+ # @param handle [IN] Device handle
+ # @param pstContrastParam [IN][OUT] Contrast parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks
+ def MV_CC_ImageContrast(self, stConstrastParam):
+ MvCamCtrldll.MV_CC_ImageContrast.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_ImageContrast.restype = c_uint
+ return MvCamCtrldll.MV_CC_ImageContrast(self.handle, byref(stConstrastParam))
+
+ ##
+ # @~chinese
+ # @brief 图像去紫边
+ # @param handle [IN] 设备句柄
+ # @param pstPurpleFringingParam [IN][OUT] 去紫边参数
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 像素格式仅支持PixelType_Gvsp_RGB8_Packed和PixelType_Gvsp_BGR8_Packed
+
+ # @~english
+ # @brief Remove the purple edge from the image.
+ # @param handle [IN] Device handle
+ # @param pstPurpleFringingParam [IN][OUT] PurpleFringing parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Only supports PixelType_Gvsp_RGB8_Packed and PixelType_Gvsp_BGR8_Packed.
+ def MV_CC_PurpleFringing(self, pstPurpleFringingParam):
+ MvCamCtrldll.MV_CC_PurpleFringing.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_PurpleFringing.restype = c_uint
+ return MvCamCtrldll.MV_CC_PurpleFringing(self.handle, byref(pstPurpleFringingParam))
+
+ ##
+ # @~chinese
+ # @brief 设置ISP参数
+ # @param handle [IN] 设备句柄
+ # @param pstParam [IN] ISP配置参数
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Set ISP configuration.
+ # @param handle [IN] Device handle
+ # @param pstParam [IN][OUT] ISP parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_SetISPConfig(self, pstParam):
+ MvCamCtrldll.MV_CC_SetISPConfig.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SetISPConfig.restype = c_uint
+ return MvCamCtrldll.MV_CC_SetISPConfig(self.handle, byref(pstParam))
+
+ ##
+ # @~chinese
+ # @brief 对图像进行ISP算法处理
+ # @param handle [IN] 设备句柄
+ # @param pstInputImage [IN] 输入图像结构体
+ # @param pstOutputImage [IN][OUT] 输出图像结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 需要先调用MV_CC_SetISPConfig传入配置文件, 配置文件由ISP工具生成
+
+ # @~english
+ # @brief ISP process.
+ # @param handle [IN] Device handle
+ # @param pstInputImage [IN] Input image structure
+ # @param pstOutputImage [IN][OUT] Output image structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The Interface should be called after MV_CC_SetISPConfig.
+ def MV_CC_ISPProcess(self, pstInputImage, pstOutputImage):
+ MvCamCtrldll.MV_CC_ISPProcess.argtype = (c_void_p, c_void_p, pstOutputImage)
+ MvCamCtrldll.MV_CC_ISPProcess.restype = c_uint
+ return MvCamCtrldll.MV_CC_ISPProcess(self.handle, byref(pstInputImage), byref(pstOutputImage))
+
+
+ ##
+ # @~chinese
+ # @brief 无损解码
+ # @param handle [IN] 设备句柄
+ # @param pstDecodeParam [IN][OUT] 无损解码参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 将从相机中取到的无损压缩码流解码成裸数据,同时支持解析当前相机实时图像的水印信息(如果输入的无损码流不是当前相机或者不是实时取流的,则水印解析可能异常);
+ # 若解码失败,请检查以下情况:(1)需要CPU支持 SSE AVX指令集(2)若当前帧异常(丢包等),可能导致解码异常(3)相机出图异常, 即使不丢包也会异常
+
+ # @~english
+ # @brief High Bandwidth Decode
+ # @param handle [IN] Device handle
+ # @param pstDecodeParam [IN][OUT] High Bandwidth Decode parameter structure
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Decode the lossless compressed data from the camera into raw data,At the same time, it supports parsing the watermark information of the real-time image of the current camera (if the input lossless code stream is not the current camera or is not real-time streaming, the watermark parsing may be abnormal);
+ # If decoding fails, please check the following: (1) The CPU is required to support the SSE AVX instruction set. (2) If the current frame is abnormal (packet loss, etc.), it may cause decoding exceptions. (3) The camera plot is abnormal, even if there is no packet loss, it may cause exceptions
+ def MV_CC_HBDecode(self, stDecodeParam):
+ MvCamCtrldll.MV_CC_HB_Decode.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_HB_Decode.restype = c_uint
+ return MvCamCtrldll.MV_CC_HB_Decode(self.handle, byref(stDecodeParam))
+
+ ##
+ # @~chinese
+ # @brief 在图像上绘制矩形框辅助线
+ # @param handle [IN] 设备句柄
+ # @param pRectInfo [IN] 矩形辅助线的信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口仅支持windows平台
+
+ # @~english
+ # @brief Draw Rect Auxiliary Line
+ # @param handle [IN] Device handle
+ # @param pRectInfo [IN] Rect Auxiliary Line Info
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface only supports windows platform.
+ def MV_CC_DrawRect(self, stRectInfo):
+ MvCamCtrldll.MV_CC_DrawRect.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_DrawRect.restype = c_uint
+ return MvCamCtrldll.MV_CC_DrawRect(self.handle, byref(stRectInfo))
+
+
+ ##
+ # @~chinese
+ # @brief 在图像上绘制圆形辅助线
+ # @param handle [IN] 设备句柄
+ # @param pCircleInfo [IN] 圆形辅助线的信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口仅支持windows平台
+
+ # @~english
+ # @brief Draw Circle Auxiliary Line
+ # @param handle [IN] Device Handle
+ # @param pCircleInfo [IN] Circle Auxiliary Line Info
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface only supports windows platform.
+ def MV_CC_DrawCircle(self, stCircleInfo):
+ MvCamCtrldll.MV_CC_DrawCircle.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_DrawCircle.restype = c_uint
+ return MvCamCtrldll.MV_CC_DrawCircle(self.handle, byref(stCircleInfo))
+
+ ##
+ # @~chinese
+ # @brief 在图像上绘制线条
+ # @param handle [IN] 设备句柄
+ # @param pLinesInfo [IN] 线条辅助线信息
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 该接口仅支持windows平台
+
+ # @~english
+ # @brief Draw Line Auxiliary Line
+ # @param handle [IN] Device Handle
+ # @param pLinesInfo [IN] Linear Auxiliary Line Info
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface only supports windows platform.
+ def MV_CC_DrawLines(self, stLineInfo):
+ MvCamCtrldll.MV_CC_DrawLines.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_DrawLines.restype = c_uint
+ return MvCamCtrldll.MV_CC_DrawLines(self.handle, byref(stLineInfo))
+
+ ##
+ # @~chinese
+ # @brief 开始录像
+ # @param handle [IN] 设备句柄
+ # @param pstRecordParam [IN] 录像参数结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # 该接口最大支持Width#Height为8000#8000大小,否则会导致调用MV_CC_InputOneFrame接口错误。
+
+ # @~english
+ # @brief Start Record
+ # @param handle [IN] Device handle
+ # @param pstRecordParam [IN] Record param structure
+ # @return Success, return MV_OK. Failure, return error code
+ # The maximum supported width # height of this interface is 8000 # 8000, otherwise it will result in calling MV_ CC_ InputOneFrame interface error.
+ def MV_CC_StartRecord(self, stRecordParam):
+ MvCamCtrldll.MV_CC_StartRecord.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_StartRecord.restype = c_uint
+ return MvCamCtrldll.MV_CC_StartRecord(self.handle, byref(stRecordParam))
+
+ ##
+ # @~chinese
+ # @brief 输入录像数据
+ # @param handle [IN] 设备句柄
+ # @param pstInputFrameInfo [IN] 录像数据结构体
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Input RAW data to Record
+ # @param handle [IN] Device handle
+ # @param pstInputFrameInfo [IN] Record data structure
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_InputOneFrame(self, stInputFrameInfo):
+ MvCamCtrldll.MV_CC_InputOneFrame.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_InputOneFrame.restype = c_uint
+ return MvCamCtrldll.MV_CC_InputOneFrame(self.handle, byref(stInputFrameInfo))
+
+ ##
+ # @~chinese
+ # @brief 停止录像
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+
+ # @~english
+ # @brief Stop Record
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ def MV_CC_StopRecord(self):
+ MvCamCtrldll.MV_CC_StopRecord.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_StopRecord.restype = c_uint
+ return MvCamCtrldll.MV_CC_StopRecord(self.handle)
+
+
+ ##
+ # @~chinese
+ # @brief 重构图像(用于分时曝光功能)
+ # @param handle [IN] 设备句柄
+ # @param pstReconstructParam [IN][OUT] 重构图像参数
+ # @return 成功,返回MV_OK,失败,返回错误码。
+ # @remarks 图像分割支持任意像素格式,图像分割应与线阵相机的“MultiLightControl”节点搭配使用,该节点可设置多个不同的曝光值,如MultiLightControl=2,
+ # 相机会将两个不同曝光值所对应的两张图像交叠合并为一张图像(实际高度为两张图像的高度)发送给上层应用程序,
+ # 调用该接口并传入分时曝光值nExposureNum为2,可将相机发送的一张图像分割为2张图像,这两张图像分别对应一个曝光值。
+ # 若使用普通相机或未打开线阵相机的“MultiLightControl”节点,则图像分割无意义,只是将图像按行分割为2,3,4张图像,
+ # 每张图像的高度变为原图像的1/2,1/3,1/4(由nExposureNum决定)。
+
+ # @~english
+ # @brief Reconstruct Image(For time-division exposure function)
+ # @param handle [IN] Device handle
+ # @param pstReconstructParam [IN][OUT] Reconstruct image parameters
+ # @return Success, return MV_OK, Failure, return error code.
+ # @remarks Image segmentation supports any pixel format. Image segmentation should be used with the "MultiLightControl" node of the linear array camera. This node can set multiple different exposure values, such as MultiLightControl=2,
+ # The camera will overlap and merge two images corresponding to two different exposure values into one image (the actual height is the height of the two images) and send it to the upper application.
+ # Call the interface and pass in nExposureNum is two. One image sent by the camera can be divided into two images, each of which corresponds to an exposure value.
+ # If an ordinary camera is used or the "MultiLightControl" node of the linear array camera is not turned on, the image segmentation is meaningless, but the image is divided into 2, 3, and 4 images by line.
+ # The height of each image becomes 1/2, 1/3, 1/4 of the original image (determined by nExposureNum).
+ def MV_CC_ReconstructImage(self, stReconstructParam):
+ MvCamCtrldll.MV_CC_ReconstructImage.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_ReconstructImage.restype = c_uint
+ return MvCamCtrldll.MV_CC_ReconstructImage(self.handle, byref(stReconstructParam))
+ ## @}
+
+
+
+ ## @addtogroup ch: 串口通信的设备接口 | en: Interface for serial communication devices
+ ## @{
+
+
+ ##
+ # @~chinese
+ # @brief 打开串口
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 此接口适用于支持串口通信的相机
+
+ # @~english
+ # @brief Open serial port.
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is compatible with cameras supporting serial communication
+ def MV_CC_SerialPort_Open(self):
+ MvCamCtrldll.MV_CC_SerialPort_Open.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_SerialPort_Open.restype = c_uint
+ return MvCamCtrldll.MV_CC_SerialPort_Open(self.handle)
+
+
+ ##
+ # @~chinese
+ # @brief 向串口写数据,一次最大写512字节的数据
+ # @param handle [IN] 设备句柄
+ # @param pBuffer [IN] 数据
+ # @param nLength [IN] 数据长度
+ # @param pnWriteLen [OUT] 实际写成功的数据长度
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 接口为阻塞模式,数据全部发送完成或者发送失败时返回
+
+ # @~english
+ # @brief Writes data to serial port, maximum 512 bytes
+ # @param handle [IN] Device handle
+ # @param pBuffer [IN] data
+ # @param nLength [IN] data length
+ # @param pnWriteLen [OUT] written data length
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks Blocking-mode interface: returns after complete transmission or upon failure
+ def MV_CC_SerialPort_Write(self, pBuffer, nLength, pnWriteLen):
+ MvCamCtrldll.MV_CC_SerialPort_Write.argtype = (c_void_p, c_void_p, c_uint, c_void_p)
+ MvCamCtrldll.MV_CC_SerialPort_Write.restype = c_uint
+ return MvCamCtrldll.MV_CC_SerialPort_Write(self.handle, pBuffer, nLength, byref(pnWriteLen))
+
+ ##
+ # @~chinese
+ # @brief 读串口数据
+ # @param handle [IN] 设备句柄
+ # @param pBuffer [IN] 数据
+ # @param nLength [IN] 数据长度
+ # @param pnReadLen [IN] 实际读到的数据长度
+ # @param nMsec [IN] 超时时间,单位:ms
+ # @return 成功,返回MV_OK,失败,返回错误码
+ # @remarks 接口为阻塞模式,当有收到数据、到达超时时间、出现异常时,立即返回
+
+ # @~english
+ # @brief Read Memory
+ # @param handle [IN] Device Handle/Frame grabber handle
+ # @param pBuffer [IN] data
+ # @param nLength [IN] data length
+ # @param pnReadLen [IN] Length of Data Read
+ # @param nMsec [IN] timeout interval(ms)
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks The interface operates in blocking mode and immediately returns when data is received, a timeout occurs, or an exception is encountered.
+ def MV_CC_SerialPort_Read(self, pBuffer, nLength, pnReadLen, nMsec):
+ MvCamCtrldll.MV_CC_SerialPort_Read.argtype = (c_void_p, c_void_p, c_uint, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_SerialPort_Read.restype = c_uint
+ return MvCamCtrldll.MV_CC_SerialPort_Read(self.handle, pBuffer, nLength, byref(pnReadLen), nMsec)
+
+
+ ##
+ # @~chinese
+ # @brief 清空已接收的串口数据
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 此接口适用于支持串口通信的相机
+
+ # @~english
+ # @brief Clear all received serial port data.
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is compatible with cameras supporting serial communication
+ def MV_CC_SerialPort_ClearBuffer(self):
+ MvCamCtrldll.MV_CC_SerialPort_ClearBuffer.argtype = c_void_p
+ MvCamCtrldll.MV_CC_SerialPort_ClearBuffer.restype = c_uint
+ return MvCamCtrldll.MV_CC_SerialPort_ClearBuffer(self.handle)
+
+
+ ##
+ # @~chinese
+ # @brief 关闭串口
+ # @param handle [IN] 设备句柄
+ # @return 成功,返回MV_OK;错误,返回错误码
+ # @remarks 此接口适用于支持串口通信的相机
+
+ # @~english
+ # @brief Close serial port
+ # @param handle [IN] Device handle
+ # @return Success, return MV_OK. Failure, return error code
+ # @remarks This interface is compatible with cameras supporting serial communication
+ def MV_CC_SerialPort_Close(self):
+ MvCamCtrldll.MV_CC_SerialPort_Close.argtype = c_void_p
+ MvCamCtrldll.MV_CC_SerialPort_Close.restype = c_uint
+ return MvCamCtrldll.MV_CC_SerialPort_Close(self.handle)
+ ## @}
+
+
+
+ '''
+ 1. 暂不提供外部注册缓存相关API
+ 2. Part ch: 下面为不推荐使用的API | en: Below are the APIs that are not recommended for use
+ '''
+
+ # ch:获取支持的传输层 | en:Get supported Transport Layer
+ @staticmethod
+ def MV_CC_EnumerateTls():
+ MvCamCtrldll.MV_CC_EnumerateTls.restype = c_uint
+ # C原型:int __stdcall MV_CC_EnumerateTls();
+ return MvCamCtrldll.MV_CC_EnumerateTls()
+
+
+ # ch: 设置SDK日志路径 | en: Set SDK log path
+ def MV_CC_SetSDKLogPath(self, SDKLogPath):
+ MvCamCtrldll.MV_CC_SetSDKLogPath.argtype = c_void_p
+ MvCamCtrldll.MV_CC_SetSDKLogPath.restype = c_uint
+ # C原型:int MV_CC_SetSDKLogPath(IN const char * strSDKLogPath);
+ return MvCamCtrldll.MV_CC_SetSDKLogPath(SDKLogPath.encode('ascii'))
+
+
+ def MV_CC_GetIntValue(self, strKey, stIntValue):
+ MvCamCtrldll.MV_CC_GetIntValue.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_GetIntValue.restype = c_uint
+ # C原型:int MV_CC_GetIntValue(void* handle,char* strKey,MVCC_INTVALUE *pIntValue)
+ return MvCamCtrldll.MV_CC_GetIntValue(self.handle, strKey.encode('ascii'), byref(stIntValue))
+
+ # ch:设置Integer型属性值 | en:Set Integer value
+ def MV_CC_SetIntValue(self, strKey, nValue):
+ MvCamCtrldll.MV_CC_SetIntValue.argtype = (c_void_p, c_void_p, c_uint32)
+ MvCamCtrldll.MV_CC_SetIntValue.restype = c_uint
+ # C原型:int MV_CC_SetIntValue(void* handle, char* strKey, unsigned int nValue)
+ return MvCamCtrldll.MV_CC_SetIntValue(self.handle, strKey.encode('ascii'), c_uint32(nValue))
+
+
+ # ch:创建句柄(不生成日志) | en:Create Device Handle without log
+ def MV_CC_CreateHandleWithoutLog(self, stDevInfo):
+ MvCamCtrldll.MV_CC_CreateHandleWithoutLog.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_CreateHandleWithoutLog.restype = c_uint
+ # C原型:int MV_CC_CreateHandleWithoutLog(void ** handle, MV_CC_DEVICE_INFO* pstDevInfo)
+ return MvCamCtrldll.MV_CC_CreateHandleWithoutLog(byref(self.handle), byref(stDevInfo))
+
+
+ # ch:注册取流回调 | en:Register the image callback function
+ def MV_CC_RegisterImageCallBackForRGB(self, CallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterImageCallBackForRGB.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterImageCallBackForRGB.restype = c_uint
+ # C原型:int MV_CC_RegisterImageCallBackForRGB(void* handle,
+ # void(* cbOutput)(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser),
+ # void* pUser);
+ return MvCamCtrldll.MV_CC_RegisterImageCallBackForRGB(self.handle, CallBackFun, pUser)
+
+ # ch:注册取流回调 | en:Register the image callback function
+ def MV_CC_RegisterImageCallBackForBGR(self, CallBackFun, pUser):
+ MvCamCtrldll.MV_CC_RegisterImageCallBackForBGR.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_RegisterImageCallBackForBGR.restype = c_uint
+ # C原型:int MV_CC_RegisterImageCallBackForBGR(void* handle,
+ # void(* cbOutput)(unsigned char * pData,MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser),
+ # void* pUser);
+ return MvCamCtrldll.MV_CC_RegisterImageCallBackForBGR(self.handle, CallBackFun, pUser)
+
+ # ch:获取一帧RGB数据,此函数为查询式获取,每次调用查询内部缓存有无数据,有数据则获取数据,无数据返回错误码
+ # en:Get one frame of RGB data, this function is using query to get data query whether the internal cache has data,
+ # get data if there has, return error code if no data
+ def MV_CC_GetImageForRGB(self, pData, nDataSize, stFrameInfo, nMsec):
+ MvCamCtrldll.MV_CC_GetImageForRGB.argtype = (c_void_p, c_void_p, c_uint, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_GetImageForRGB.restype = c_uint
+ # C原型:int MV_CC_GetImageForRGB(IN void* handle, IN OUT unsigned char * pData , IN unsigned int nDataSize,
+ # IN OUT MV_FRAME_OUT_INFO_EX* pstFrameInfo, int nMsec);
+ return MvCamCtrldll.MV_CC_GetImageForRGB(self.handle, pData, nDataSize, byref(stFrameInfo), nMsec)
+
+ # ch:获取一帧BGR数据,此函数为查询式获取,每次调用查询内部缓存有无数据,有数据则获取数据,无数据返回错误码
+ # en:Get one frame of BGR data, this function is using query to get data query whether the internal cache has data,
+ # get data if there has, return error code if no data
+ def MV_CC_GetImageForBGR(self, pData, nDataSize, stFrameInfo, nMsec):
+ MvCamCtrldll.MV_CC_GetImageForBGR.argtype = (c_void_p, c_void_p, c_uint, c_void_p, c_uint)
+ MvCamCtrldll.MV_CC_GetImageForBGR.restype = c_uint
+ # C原型:int MV_CC_GetImageForBGR(IN void* handle, IN OUT unsigned char * pData , IN unsigned int nDataSize,
+ # IN OUT MV_FRAME_OUT_INFO_EX* pstFrameInfo, int nMsec);
+ return MvCamCtrldll.MV_CC_GetImageForBGR(self.handle, pData, nDataSize, byref(stFrameInfo), nMsec)
+
+ # ch:显示一帧图像
+ # en:Display one frame image,the maximum resolution supported is 16384 * 163840
+ def MV_CC_DisplayOneFrame(self, stDisplayInfo):
+ MvCamCtrldll.MV_CC_DisplayOneFrame.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_DisplayOneFrame.restype = c_uint
+ # C原型:int MV_CC_DisplayOneFrame(IN void* handle, IN MV_DISPLAY_FRAME_INFO* pstDisplayInfo);
+ return MvCamCtrldll.MV_CC_DisplayOneFrame(self.handle, byref(stDisplayInfo))
+
+ # ch:保存图片,支持Bmp和Jpeg | en:Save image, support Bmp and Jpeg.
+ def MV_CC_SaveImageEx2(self, stSaveParam):
+ MvCamCtrldll.MV_CC_SaveImageEx2.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SaveImageEx2.restype = c_uint
+ # C原型:int MV_CC_SaveImageEx2(void* handle, MV_SAVE_IMAGE_PARAM_EX* pSaveParam)
+ return MvCamCtrldll.MV_CC_SaveImageEx2(self.handle, byref(stSaveParam))
+
+
+ # ch:保存图像到文件 | en:Save the image file
+ def MV_CC_SaveImageToFile(self, stSaveFileParam):
+ MvCamCtrldll.MV_CC_SaveImageToFile.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SaveImageToFile.restype = c_uint
+ # C原型:int MV_CC_SaveImageToFile(IN void* handle, MV_SAVE_IMG_TO_FILE_PARAM* pstSaveFileParam);
+ return MvCamCtrldll.MV_CC_SaveImageToFile(self.handle, byref(stSaveFileParam))
+
+ # ch:保存3D点云数据,支持PLY、CSV和OBJ三种格式 | en:Save 3D point data, support PLY、CSV and OBJ
+ def MV_CC_SavePointCloudData(self, stPointDataParam):
+ MvCamCtrldll.MV_CC_SavePointCloudData.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_SavePointCloudData.restype = c_uint
+ # C原型:int MV_CC_SavePointCloudData(IN void* handle, MV_SAVE_POINT_CLOUD_PARAM* pstPointDataParam);
+ return MvCamCtrldll.MV_CC_SavePointCloudData(self.handle, byref(stPointDataParam))
+
+
+ # ch:像素格式转换 | en:Pixel format conversion
+ def MV_CC_ConvertPixelType(self, stConvertParam):
+ MvCamCtrldll.MV_CC_ConvertPixelType.argtype = (c_void_p, c_void_p)
+ MvCamCtrldll.MV_CC_ConvertPixelType.restype = c_uint
+ # C原型:int MV_CC_ConvertPixelType(void* handle, MV_CC_PIXEL_CONVERT_PARAM* pstCvtParam)
+ return MvCamCtrldll.MV_CC_ConvertPixelType(self.handle, byref(stConvertParam))
+
+ # ch:打开获取或设置相机参数的GUI界面 | en: Open the GUI interface for getting or setting camera parameters
+ def MV_CC_OpenParamsGUI(self):
+ MvCamCtrldll.MV_CC_OpenParamsGUI.argtype = (c_void_p)
+ MvCamCtrldll.MV_CC_OpenParamsGUI.restype = c_uint
+ # C原型: __stdcall MV_CC_OpenParamsGUI(IN void* handle);
+ return MvCamCtrldll.MV_CC_OpenParamsGUI(self.handle)
+
+ # ch: 注册流异常消息回调,在打开设备之后调用(只支持U3V相机,不支持GenTL设备) | en:Register exception stream callBack, call after open device (only support U3V Camera, don't support GenTL Device)
+ def MV_USB_RegisterStreamExceptionCallBack(self, CallBackFun, pUser):
+ MvCamCtrldll.MV_USB_RegisterStreamExceptionCallBack.argtype = (c_void_p, c_void_p, c_void_p)
+ MvCamCtrldll.MV_USB_RegisterStreamExceptionCallBack.restype = c_uint
+ return MvCamCtrldll.MV_USB_RegisterStreamExceptionCallBack(self.handle, CallBackFun, pUser)
+
diff --git a/wndMain/MvImport/MvErrorDefine_const.py b/wndMain/MvImport/MvErrorDefine_const.py
new file mode 100644
index 0000000..0de69be
--- /dev/null
+++ b/wndMain/MvImport/MvErrorDefine_const.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+MV_OK = 0x00000000 ## @~chinese 成功,无错误 @~english Successed, no error
+
+## @~chinese 通用错误码定义:范围0x80000000-0x800000FF
+MV_E_HANDLE = 0x80000000 ## @~chinese 错误或无效的句柄 @~english Error or invalid handle
+MV_E_SUPPORT = 0x80000001 ## @~chinese 不支持的功能 @~english Not supported function
+MV_E_BUFOVER = 0x80000002 ## @~chinese 缓存已满 @~english Buffer overflow
+MV_E_CALLORDER = 0x80000003 ## @~chinese 函数调用顺序错误 @~english Function calling order error
+MV_E_PARAMETER = 0x80000004 ## @~chinese 错误的参数 @~english Incorrect parameter
+MV_E_RESOURCE = 0x80000006 ## @~chinese 资源申请失败 @~english Applying resource failed
+MV_E_NODATA = 0x80000007 ## @~chinese 无数据 @~english No data
+MV_E_PRECONDITION = 0x80000008 ## @~chinese 前置条件有误,或运行环境已发生变化 @~english Precondition error, or running environment changed
+MV_E_VERSION = 0x80000009 ## @~chinese 版本不匹配 @~english Version mismatches
+MV_E_NOENOUGH_BUF = 0x8000000A ## @~chinese 传入的内存空间不足 @~english Insufficient memory
+MV_E_ABNORMAL_IMAGE = 0x8000000B ## @~chinese 异常图像,可能是丢包导致图像不完整 @~english Abnormal image, maybe incomplete image because of lost packet
+MV_E_LOAD_LIBRARY = 0x8000000C ## @~chinese 动态导入DLL失败 @~english Load library failed
+MV_E_NOOUTBUF = 0x8000000D ## @~chinese 没有可输出的缓存 @~english No Avaliable Buffer
+MV_E_ENCRYPT = 0x8000000E ## @~chinese 加密错误 @~english Encryption error
+MV_E_OPENFILE = 0x8000000F ## @~chinese 打开文件出现错误 @~english open file error
+MV_E_BUF_IN_USE = 0x80000010 ## @~chinese 缓存地址已使用 @~english Buffer already in use
+MV_E_BUF_INVALID = 0x80000011 ## @~chinese 无效的缓存地址 @~english Buffer address invalid
+MV_E_NOALIGN_BUF = 0x80000012 ## @~chinese 缓存对齐异常 @~english Buffer alignmenterror error
+MV_E_NOENOUGH_BUF_NUM = 0x80000013 ## @~chinese 缓存个数不足 @~english Insufficient cache count
+MV_E_PORT_IN_USE = 0x80000014 ## @~chinese 串口被占用 @~english Port is in use
+MV_E_IMAGE_DECODEC = 0x80000015 ## @~chinese 解码错误(SDK校验图像异常)@~english Decoding error (SDK verification image exception)
+MV_E_UINT32_LIMIT = 0x80000016 ## @~chinese 图像大小超过unsigned int返回,接口不支持 @~english Image size exceeds unsigned int range - interface unsupported
+MV_E_IMAGE_HEIGHT = 0x80000017 ## @~chinese 图像高度异常(残帧丢弃) @~english image height anomaly (discard incomplete images)
+MV_E_NOENOUGH_DDR = 0x80000018 ## @~chinese DDR缓存不足 @~english The DDR cache is Insufficient
+MV_E_NOENOUGH_STREAM = 0x80000019 ## @~chinese 流通道不足 @~english The stream channel is Insufficient
+MV_E_NORESPONSE = 0x8000001A ## @~chinese 设备无响应 @~english No response from device
+MV_E_UNKNOW = 0x800000FF ## @~chinese 未知的错误 @~english Unknown error
+
+## @~chinese GenICam系列错误:范围0x80000100-0x800001FF
+MV_E_GC_GENERIC = 0x80000100 ## @~chinese 通用错误 @~english General error
+MV_E_GC_ARGUMENT = 0x80000101 ## @~chinese 参数非法 @~english Illegal parameters
+MV_E_GC_RANGE = 0x80000102 ## @~chinese 值超出范围 @~english The value is out of range
+MV_E_GC_PROPERTY = 0x80000103 ## @~chinese 属性 @~english Property
+MV_E_GC_RUNTIME = 0x80000104 ## @~chinese 运行环境有问题 @~english Running environment error
+MV_E_GC_LOGICAL = 0x80000105 ## @~chinese 逻辑错误 @~english Logical error
+MV_E_GC_ACCESS = 0x80000106 ## @~chinese 节点访问条件有误 @~english Node accessing condition error
+MV_E_GC_TIMEOUT = 0x80000107 ## @~chinese 超时 @~english Timeout
+MV_E_GC_DYNAMICCAST = 0x80000108 ## @~chinese 转换异常 @~english Transformation exception
+MV_E_GC_UNKNOW = 0x800001FF ## @~chinese GenICam未知错误 @~english GenICam unknown error
+
+## @~chinese GigE_STATUS对应的错误码:范围0x80000200-0x800002FF
+MV_E_NOT_IMPLEMENTED = 0x80000200 ## @~chinese 命令不被设备支持 @~english The command is not supported by device
+MV_E_INVALID_ADDRESS = 0x80000201 ## @~chinese 访问的目标地址不存在 @~english The target address being accessed does not exist
+MV_E_WRITE_PROTECT = 0x80000202 ## @~chinese 目标地址不可写 @~english The target address is not writable
+MV_E_ACCESS_DENIED = 0x80000203 ## @~chinese 设备无访问权限 @~english No permission
+MV_E_BUSY = 0x80000204 ## @~chinese 设备忙,或网络断开 @~english Device is busy, or network disconnected
+MV_E_PACKET = 0x80000205 ## @~chinese 网络包数据错误 @~english Network data packet error
+MV_E_NETER = 0x80000206 ## @~chinese 网络相关错误 @~english Network error
+MV_E_SUPPORT_MODIFY_DEVICE_IP = 0x8000020E # < 在固定IP模式下不支持修改设备IP模式 @~english Current Mode Not Support Modify Ip
+MV_E_KEY_VERIFICATION = 0x8000020F ## @~chinese 秘钥校验错误 @~english SwitchKey error
+MV_E_IP_CONFLICT = 0x80000221 ## @~chinese 设备IP冲突 @~english Device IP conflict
+
+## @~chinese USB_STATUS对应的错误码:范围0x80000300-0x800003FF
+MV_E_USB_READ = 0x80000300 ## @~chinese 读usb出错 @~english Reading USB error
+MV_E_USB_WRITE = 0x80000301 ## @~chinese 写usb出错 @~english Writing USB error
+MV_E_USB_DEVICE = 0x80000302 ## @~chinese 设备异常 @~english Device exception
+MV_E_USB_GENICAM = 0x80000303 ## @~chinese GenICam相关错误 @~english GenICam error
+MV_E_USB_BANDWIDTH = 0x80000304 ## @~chinese 带宽不足 @~english Insufficient bandwidth
+MV_E_USB_DRIVER = 0x80000305 ## @~chinese 驱动不匹配或者未装驱动 @~english Driver mismatch or unmounted drive
+MV_E_USB_UNKNOW = 0x800003FF ## @~chinese USB未知的错误 @~english USB unknown error
+
+## @~chinese 升级时对应的错误码:范围0x80000400-0x800004FF
+MV_E_UPG_FILE_MISMATCH = 0x80000400 ## @~chinese 升级固件不匹配 @~english Firmware mismatches
+MV_E_UPG_LANGUSGE_MISMATCH = 0x80000401 ## @~chinese 升级固件语言不匹配 @~english Firmware language mismatches
+MV_E_UPG_CONFLICT = 0x80000402 ## @~chinese 升级冲突(设备已经在升级了再次请求升级即返回此错误) @~english Upgrading conflicted (repeated upgrading requests during device upgrade)
+MV_E_UPG_INNER_ERR = 0x80000403 ## @~chinese 升级时设备内部出现错误 @~english Camera internal error during upgrade
+MV_E_UPG_UNKNOW = 0x800004FF ## @~chinese 升级时未知错误 @~english Unknown error during upgrade
diff --git a/wndMain/MvImport/MvISPErrorDefine_const.py b/wndMain/MvImport/MvISPErrorDefine_const.py
new file mode 100644
index 0000000..effbf64
--- /dev/null
+++ b/wndMain/MvImport/MvISPErrorDefine_const.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+## @~chinese 通用类型
+MV_ALG_OK = 0x00000000 ## @~chinese处理正确
+MV_ALG_ERR = 0x10000000 ## @~chinese不确定类型错误
+
+## @~chinese 能力检查
+MV_ALG_E_ABILITY_ARG = 0x10000001 ## @~chinese能力集中存在无效参数
+
+## @~chinese 内存检查
+MV_ALG_E_MEM_NULL = 0x10000002 ## @~chinese内存地址为空
+MV_ALG_E_MEM_ALIGN = 0x10000003 ## @~chinese内存对齐不满足要求
+MV_ALG_E_MEM_LACK = 0x10000004 ## @~chinese内存空间大小不够
+MV_ALG_E_MEM_SIZE_ALIGN = 0x10000005 ## @~chinese内存空间大小不满足对齐要求
+MV_ALG_E_MEM_ADDR_ALIGN = 0x10000006 ## @~chinese内存地址不满足对齐要求
+
+## @~chinese 图像检查
+MV_ALG_E_IMG_FORMAT = 0x10000007 ## @~chinese图像格式不正确或者不支持
+MV_ALG_E_IMG_SIZE = 0x10000008 ## @~chinese图像宽高不正确或者超出范围
+MV_ALG_E_IMG_STEP = 0x10000009 ## @~chinese图像宽高与step参数不匹配
+MV_ALG_E_IMG_DATA_NULL = 0x1000000A ## @~chinese图像数据存储地址为空
+
+## @~chinese 输入输出参数检查
+MV_ALG_E_CFG_TYPE = 0x1000000B ## @~chinese设置或者获取参数类型不正确
+MV_ALG_E_CFG_SIZE = 0x1000000C ## @~chinese设置或者获取参数的输入、输出结构体大小不正确
+MV_ALG_E_PRC_TYPE = 0x1000000D ## @~chinese处理类型不正确
+MV_ALG_E_PRC_SIZE = 0x1000000E ## @~chinese处理时输入、输出参数大小不正确
+MV_ALG_E_FUNC_TYPE = 0x1000000F ## @~chinese子处理类型不正确
+MV_ALG_E_FUNC_SIZE = 0x10000010 ## @~chinese子处理时输入、输出参数大小不正确
+
+## @~chinese 运行参数检查
+MV_ALG_E_PARAM_INDEX = 0x10000011 ## @~chineseindex参数不正确
+MV_ALG_E_PARAM_VALUE = 0x10000012 ## @~chinesevalue参数不正确或者超出范围
+MV_ALG_E_PARAM_NUM = 0x10000013 ## @~chineseparam_num参数不正确
+
+## @~chinese 接口调用检查
+MV_ALG_E_NULL_PTR = 0x10000014 ## @~chinese函数参数指针为空
+MV_ALG_E_OVER_MAX_MEM = 0x10000015 ## @~chinese超过限定的最大内存
+MV_ALG_E_CALL_BACK = 0x10000016 ## @~chinese回调函数出错
+
+## @~chinese 算法库加密相关检查
+MV_ALG_E_ENCRYPT = 0x10000017 ## @~chinese加密错误
+MV_ALG_E_EXPIRE = 0x10000018 ## @~chinese算法库使用期限错误
+
+## @~chinese 内部模块返回的基本错误类型
+MV_ALG_E_BAD_ARG = 0x10000019 ## @~chinese参数范围不正确
+MV_ALG_E_DATA_SIZE = 0x1000001A ## @~chinese数据大小不正确
+MV_ALG_E_STEP = 0x1000001B ## @~chinese数据step不正确
+
+## @~chinese cpu指令集支持错误码
+MV_ALG_E_CPUID = 0x1000001C ## @~chinesecpu不支持优化代码中的指令集
+
+MV_ALG_WARNING = 0x1000001D ## @~chinese警告
+
+MV_ALG_E_TIME_OUT = 0x1000001E ## @~chinese算法库超时
+MV_ALG_E_LIB_VERSION = 0x1000001F ## @~chinese算法版本号出错
+MV_ALG_E_MODEL_VERSION = 0x10000020 ## @~chinese模型版本号出错
+MV_ALG_E_GPU_MEM_ALLOC = 0x10000021 ## @~chineseGPU内存分配错误
+MV_ALG_E_FILE_NON_EXIST = 0x10000022 ## @~chinese文件不存在
+MV_ALG_E_NONE_STRING = 0x10000023 ## @~chinese字符串为空
+MV_ALG_E_IMAGE_CODEC = 0x10000024 ## @~chinese图像解码器错误
+MV_ALG_E_FILE_OPEN = 0x10000025 ## @~chinese打开文件错误
+MV_ALG_E_FILE_READ = 0x10000026 ## @~chinese文件读取错误
+MV_ALG_E_FILE_WRITE = 0x10000027 ## @~chinese文件写错误
+MV_ALG_E_FILE_READ_SIZE = 0x10000028 ## @~chinese文件读取大小错误
+MV_ALG_E_FILE_TYPE = 0x10000029 ## @~chinese文件类型错误
+MV_ALG_E_MODEL_TYPE = 0x1000002A ## @~chinese模型类型错误
+MV_ALG_E_MALLOC_MEM = 0x1000002B ## @~chinese分配内存错误
+MV_ALG_E_BIND_CORE_FAILED = 0x1000002C ## @~chinese线程绑核失败
+
+## @~chinese 降噪特有错误码
+MV_ALG_E_DENOISE_NE_IMG_FORMAT = 0x10402001 ## @~chinese噪声特性图像格式错误
+MV_ALG_E_DENOISE_NE_FEATURE_TYPE = 0x10402002 ## @~chinese噪声特性类型错误
+MV_ALG_E_DENOISE_NE_PROFILE_NUM = 0x10402003 ## @~chinese噪声特性个数错误
+MV_ALG_E_DENOISE_NE_GAIN_NUM = 0x10402004 ## @~chinese噪声特性增益个数错误
+MV_ALG_E_DENOISE_NE_GAIN_VAL = 0x10402005 ## @~chinese噪声曲线增益值输入错误
+MV_ALG_E_DENOISE_NE_BIN_NUM = 0x10402006 ## @~chinese噪声曲线柱数错误
+MV_ALG_E_DENOISE_NE_INIT_GAIN = 0x10402007 ## @~chinese噪声估计初始化增益设置错误
+MV_ALG_E_DENOISE_NE_NOT_INIT = 0x10402008 ## @~chinese噪声估计未初始化
+MV_ALG_E_DENOISE_COLOR_MODE = 0x10402009 ## @~chinese颜色空间模式错误
+MV_ALG_E_DENOISE_ROI_NUM = 0x1040200a ## @~chinese图像ROI个数错误
+MV_ALG_E_DENOISE_ROI_ORI_PT = 0x1040200b ## @~chinese图像ROI原点错误
+MV_ALG_E_DENOISE_ROI_SIZE = 0x1040200c ## @~chinese图像ROI大小错误
+MV_ALG_E_DENOISE_GAIN_NOT_EXIST = 0x1040200d ## @~chinese输入的相机增益不存在(增益个数已达上限)
+MV_ALG_E_DENOISE_GAIN_BEYOND_RANGE = 0x1040200e ## @~chinese输入的相机增益不在范围内
+MV_ALG_E_DENOISE_NP_BUF_SIZE = 0x1040200f ## @~chinese输入的噪声特性内存大小错误
+
+## @~chinese 去紫边特有错误码
+MV_ALG_E_PFC_ROI_PT = 0x10405000 ## @~chinese去紫边算法ROI原点错误
+MV_ALG_E_PFC_ROI_SIZE = 0x10405001 ## @~chinese去紫边算法ROI大小错误
+MV_ALG_E_PFC_KERNEL_SIZE = 0x10405002 ## @~chinese去紫边算法滤波核尺寸错误
+
diff --git a/wndMain/MvImport/PixelType_header.py b/wndMain/MvImport/PixelType_header.py
new file mode 100644
index 0000000..ca018a6
--- /dev/null
+++ b/wndMain/MvImport/PixelType_header.py
@@ -0,0 +1,291 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from ctypes import *
+
+PixelType_Gvsp_Undefined = -1
+
+PixelType_Gvsp_Mono1p = 16842807
+PixelType_Gvsp_Mono2p = 16908344
+PixelType_Gvsp_Mono4p = 17039417
+PixelType_Gvsp_Mono8 = 17301505
+PixelType_Gvsp_Mono8_Signed = 17301506
+PixelType_Gvsp_Mono10 = 17825795
+PixelType_Gvsp_Mono10_Packed = 17563652
+PixelType_Gvsp_Mono12 = 17825797
+PixelType_Gvsp_Mono12_Packed = 17563654
+PixelType_Gvsp_Mono14 = 17825829
+PixelType_Gvsp_Mono16 = 17825799
+
+PixelType_Gvsp_BayerGR8 = 17301512
+PixelType_Gvsp_BayerRG8 = 17301513
+PixelType_Gvsp_BayerGB8 = 17301514
+PixelType_Gvsp_BayerBG8 = 17301515
+PixelType_Gvsp_BayerRBGG8 = 17301574
+
+
+PixelType_Gvsp_BayerGR10 = 17825804
+PixelType_Gvsp_BayerRG10 = 17825805
+PixelType_Gvsp_BayerGB10 = 17825806
+PixelType_Gvsp_BayerBG10 = 17825807
+
+PixelType_Gvsp_BayerGR12 = 17825808
+PixelType_Gvsp_BayerRG12 = 17825809
+PixelType_Gvsp_BayerGB12 = 17825810
+PixelType_Gvsp_BayerBG12 = 17825811
+
+PixelType_Gvsp_BayerGR10_Packed = 17563686
+PixelType_Gvsp_BayerRG10_Packed = 17563687
+PixelType_Gvsp_BayerGB10_Packed = 17563688
+PixelType_Gvsp_BayerBG10_Packed = 17563689
+
+
+PixelType_Gvsp_BayerGR12_Packed = 17563690
+PixelType_Gvsp_BayerRG12_Packed = 17563691
+PixelType_Gvsp_BayerGB12_Packed = 17563692
+PixelType_Gvsp_BayerBG12_Packed = 17563693
+
+
+PixelType_Gvsp_BayerGR16 = 17825838
+PixelType_Gvsp_BayerRG16 = 17825839
+PixelType_Gvsp_BayerGB16 = 17825840
+PixelType_Gvsp_BayerBG16 = 17825841
+
+
+PixelType_Gvsp_RGB8_Packed = 35127316
+PixelType_Gvsp_BGR8_Packed = 35127317
+PixelType_Gvsp_RGBA8_Packed = 35651606
+PixelType_Gvsp_BGRA8_Packed = 35651607
+
+PixelType_Gvsp_RGB10_Packed = 36700184
+PixelType_Gvsp_BGR10_Packed = 36700185
+PixelType_Gvsp_RGB12_Packed = 36700186
+PixelType_Gvsp_BGR12_Packed = 36700187
+PixelType_Gvsp_RGB16_Packed = 36700211
+PixelType_Gvsp_BGR16_Packed = 36700235
+PixelType_Gvsp_RGBA16_Packed = 37748836
+PixelType_Gvsp_BGRA16_Packed = 37748817
+PixelType_Gvsp_RGB10V1_Packed = 35651612
+PixelType_Gvsp_RGB10V2_Packed = 35651613
+PixelType_Gvsp_RGB12V1_Packed = 35913780
+PixelType_Gvsp_RGB565_Packed = 34603061
+PixelType_Gvsp_BGR565_Packed = 34603062
+
+
+PixelType_Gvsp_YUV411_Packed = 34340894
+PixelType_Gvsp_YUV422_Packed = 34603039
+PixelType_Gvsp_YUV422_YUYV_Packed = 34603058
+PixelType_Gvsp_YUV444_Packed = 35127328
+PixelType_Gvsp_YCBCR8_CBYCR = 35127354
+PixelType_Gvsp_YCBCR422_8 = 34603067
+PixelType_Gvsp_YCBCR422_8_CBYCRY = 34603075
+PixelType_Gvsp_YCBCR411_8_CBYYCRYY = 34340924
+PixelType_Gvsp_YCBCR601_8_CBYCR = 35127357
+PixelType_Gvsp_YCBCR601_422_8 = 34603070
+PixelType_Gvsp_YCBCR601_422_8_CBYCRY = 34603076
+PixelType_Gvsp_YCBCR601_411_8_CBYYCRYY = 34340927
+PixelType_Gvsp_YCBCR709_8_CBYCR = 35127360
+PixelType_Gvsp_YCBCR709_422_8 = 34603073
+PixelType_Gvsp_YCBCR709_422_8_CBYCRY = 34603077
+PixelType_Gvsp_YCBCR709_411_8_CBYYCRYY = 34340930
+
+PixelType_Gvsp_YUV420SP_NV12 = 34373633
+PixelType_Gvsp_YUV420SP_NV21 = 34373634
+
+PixelType_Gvsp_RGB8_Planar = 35127329
+PixelType_Gvsp_RGB10_Planar = 36700194
+PixelType_Gvsp_RGB12_Planar = 36700195
+PixelType_Gvsp_RGB16_Planar = 36700196
+
+
+PixelType_Gvsp_Jpeg = -2145910783
+
+PixelType_Gvsp_Coord3D_ABC32f = 39846080
+PixelType_Gvsp_Coord3D_ABC32f_Planar = 39846081
+
+
+PixelType_Gvsp_Coord3D_AC32f = 36176066
+PixelType_Gvsp_COORD3D_DEPTH_PLUS_MASK = -2112094207
+
+PixelType_Gvsp_Coord3D_ABC32 = -2107625471
+PixelType_Gvsp_Coord3D_AB32f = -2109722622
+PixelType_Gvsp_Coord3D_AB32 = -2109722621
+PixelType_Gvsp_Coord3D_AC32f_64 = 37748930
+PixelType_Gvsp_Coord3D_AC32f_Planar = 37748931
+PixelType_Gvsp_Coord3D_AC32 = -2109722620
+PixelType_Gvsp_Coord3D_A32f = 18874557
+PixelType_Gvsp_Coord3D_A32 = -2128596987
+PixelType_Gvsp_Coord3D_C32f = 18874559
+PixelType_Gvsp_Coord3D_C32 = -2128596986
+PixelType_Gvsp_Coord3D_ABC16 = 36700345
+PixelType_Gvsp_Coord3D_C16 = 17825976
+
+
+PixelType_Gvsp_HB_Mono8 = 0x81080001 #-2130182143
+PixelType_Gvsp_HB_Mono10 = 0x81100003 #-2129657853
+PixelType_Gvsp_HB_Mono10_Packed = 0x810C0004 #-2129919996
+PixelType_Gvsp_HB_Mono12 = 0x81100005#-2129657851
+PixelType_Gvsp_HB_Mono12_Packed = 0x810C0006 #-2129919994
+PixelType_Gvsp_HB_Mono16 = 0x81100007 #-2129657849
+PixelType_Gvsp_HB_BayerGR8 = 0x81080008#-2130182136
+PixelType_Gvsp_HB_BayerRG8 = 0x81080009 #-2130182135
+PixelType_Gvsp_HB_BayerGB8 = 0x8108000A #-2130182134
+PixelType_Gvsp_HB_BayerBG8 = 0x8108000B #-2130182133
+PixelType_Gvsp_HB_BayerRBGG8 = 0x81080046#-2130182074
+PixelType_Gvsp_HB_BayerGR10 = 0x8110000C #-2129657844
+PixelType_Gvsp_HB_BayerRG10 = 0x8110000D #-2129657843
+PixelType_Gvsp_HB_BayerGB10 = 0x8110000E#-2129657842
+PixelType_Gvsp_HB_BayerBG10 = 0x8110000F#-2129657841
+PixelType_Gvsp_HB_BayerGR12 = 0x81100010 #-2129657840
+PixelType_Gvsp_HB_BayerRG12 = 0x81100011 #-2129657839
+PixelType_Gvsp_HB_BayerGB12 = 0x81100012 #-2129657838
+PixelType_Gvsp_HB_BayerBG12 = 0x81100013 #-2129657837
+PixelType_Gvsp_HB_BayerGR10_Packed = 0x810C0026 #-2129919962
+PixelType_Gvsp_HB_BayerRG10_Packed = 0x810C0027 #-2129919961
+PixelType_Gvsp_HB_BayerGB10_Packed = 0x810C0028 #-2129919960
+PixelType_Gvsp_HB_BayerBG10_Packed = 0x810C0029 #-2129919959
+PixelType_Gvsp_HB_BayerGR12_Packed = 0x810C002A #-2129919958
+PixelType_Gvsp_HB_BayerRG12_Packed = 0x810C002B #-2129919957
+PixelType_Gvsp_HB_BayerGB12_Packed = 0x810C002C #-2129919956
+PixelType_Gvsp_HB_BayerBG12_Packed = 0x810C002D #-2129919955
+PixelType_Gvsp_HB_YUV422_Packed = 0x8210001F #-2112880609
+PixelType_Gvsp_HB_YUV422_YUYV_Packed = 0x82100032 #-2112880590
+PixelType_Gvsp_HB_RGB8_Packed = 0x82180014 #-2112356332
+PixelType_Gvsp_HB_BGR8_Packed = 0x82180015 #-2112356331
+PixelType_Gvsp_HB_RGBA8_Packed = 0x82200016 #-2111832042
+PixelType_Gvsp_HB_BGRA8_Packed = 0x82200017 #-2111832041
+PixelType_Gvsp_HB_RGB16_Packed = 0x82300033 #-2110783437
+PixelType_Gvsp_HB_BGR16_Packed = 0x8230004B #-2110783413
+PixelType_Gvsp_HB_RGBA16_Packed = 0x82400064 #-2109734812
+PixelType_Gvsp_HB_BGRA16_Packed = 0x82400051 #-2109734831
+
+__all__ = ['PixelType_Gvsp_BayerRG8',
+ 'PixelType_Gvsp_YCBCR422_8',
+ 'PixelType_Gvsp_Coord3D_ABC32',
+ 'PixelType_Gvsp_Coord3D_AB32f',
+ 'PixelType_Gvsp_COORD3D_DEPTH_PLUS_MASK',
+ 'PixelType_Gvsp_RGB10_Packed',
+ 'PixelType_Gvsp_RGB10V1_Packed',
+ 'PixelType_Gvsp_RGB8_Planar',
+ 'PixelType_Gvsp_RGBA8_Packed',
+ 'PixelType_Gvsp_RGB8_Packed',
+ 'PixelType_Gvsp_BayerBG12',
+ 'PixelType_Gvsp_Coord3D_AC32f_Planar',
+ 'PixelType_Gvsp_BayerBG10_Packed',
+ 'PixelType_Gvsp_YCBCR709_422_8_CBYCRY',
+ 'PixelType_Gvsp_Coord3D_A32f',
+ 'PixelType_Gvsp_YUV411_Packed',
+ 'PixelType_Gvsp_BayerBG12_Packed',
+ 'PixelType_Gvsp_RGB16_Packed',
+ 'PixelType_Gvsp_BGR16_Packed',
+ 'PixelType_Gvsp_RGBA16_Packed',
+ 'PixelType_Gvsp_BGRA16_Packed',
+ 'PixelType_Gvsp_BayerRG12',
+ 'PixelType_Gvsp_BayerRG10',
+ 'PixelType_Gvsp_BayerRG16',
+ 'PixelType_Gvsp_YCBCR709_411_8_CBYYCRYY',
+ 'PixelType_Gvsp_BayerGB12_Packed',
+ 'PixelType_Gvsp_Coord3D_AC32f',
+ 'PixelType_Gvsp_BayerRG12_Packed',
+ 'PixelType_Gvsp_Coord3D_AB32',
+ 'PixelType_Gvsp_BGR12_Packed',
+ 'PixelType_Gvsp_BayerGR10_Packed',
+ 'PixelType_Gvsp_Coord3D_AC32',
+ 'PixelType_Gvsp_RGB12_Planar',
+ 'PixelType_Gvsp_YCBCR709_422_8',
+ 'PixelType_Gvsp_BGR8_Packed',
+ 'PixelType_Gvsp_Jpeg',
+ 'PixelType_Gvsp_Coord3D_AC32f_64',
+ 'PixelType_Gvsp_YUV422_Packed',
+ 'PixelType_Gvsp_Mono8_Signed',
+ 'PixelType_Gvsp_BayerBG10',
+ 'PixelType_Gvsp_BayerBG16',
+ 'PixelType_Gvsp_BayerGR8',
+ 'PixelType_Gvsp_RGB16_Planar',
+ 'PixelType_Gvsp_Mono4p',
+ 'PixelType_Gvsp_BayerRG10_Packed',
+ 'PixelType_Gvsp_Mono8',
+ 'PixelType_Gvsp_BayerGR16',
+ 'PixelType_Gvsp_BayerGR10',
+ 'PixelType_Gvsp_BGRA8_Packed',
+ 'PixelType_Gvsp_BayerGR12',
+ 'PixelType_Gvsp_Mono12_Packed',
+ 'PixelType_Gvsp_YCBCR709_8_CBYCR',
+ 'PixelType_Gvsp_Coord3D_A32',
+ 'PixelType_Gvsp_YCBCR601_422_8',
+ 'PixelType_Gvsp_Coord3D_C32',
+ 'PixelType_Gvsp_YCBCR411_8_CBYYCRYY',
+ 'PixelType_Gvsp_Undefined',
+ 'PixelType_Gvsp_BayerGR12_Packed',
+ 'PixelType_Gvsp_YCBCR601_411_8_CBYYCRYY',
+ 'PixelType_Gvsp_RGB10_Planar',
+ 'PixelType_Gvsp_BayerGB16',
+ 'PixelType_Gvsp_BayerGB10',
+ 'PixelType_Gvsp_BayerGB12',
+ 'PixelType_Gvsp_BGR565_Packed',
+ 'PixelType_Gvsp_Mono1p',
+ 'PixelType_Gvsp_Coord3D_ABC16',
+ 'PixelType_Gvsp_YUV444_Packed',
+ 'PixelType_Gvsp_YUV422_YUYV_Packed',
+ 'PixelType_Gvsp_BayerBG8',
+ 'PixelType_Gvsp_Coord3D_C32f',
+ 'PixelType_Gvsp_BGR10_Packed',
+ 'PixelType_Gvsp_BayerGB10_Packed',
+ 'PixelType_Gvsp_Coord3D_ABC32f_Planar',
+ 'PixelType_Gvsp_Coord3D_ABC32f',
+ 'PixelType_Gvsp_YCBCR422_8_CBYCRY',
+ 'PixelType_Gvsp_RGB12_Packed',
+ 'PixelType_Gvsp_Mono12',
+ 'PixelType_Gvsp_Mono10',
+ 'PixelType_Gvsp_Mono16',
+ 'PixelType_Gvsp_Mono2p',
+ 'PixelType_Gvsp_Mono14',
+ 'PixelType_Gvsp_RGB10V2_Packed',
+ 'PixelType_Gvsp_RGB12V1_Packed',
+ 'PixelType_Gvsp_Mono10_Packed',
+ 'PixelType_Gvsp_YCBCR601_8_CBYCR',
+ 'PixelType_Gvsp_BayerGB8',
+ 'PixelType_Gvsp_YCBCR8_CBYCR',
+ 'PixelType_Gvsp_RGB565_Packed',
+ 'PixelType_Gvsp_YCBCR601_422_8_CBYCRY',
+ 'PixelType_Gvsp_YUV420SP_NV12',
+ 'PixelType_Gvsp_YUV420SP_NV21',
+ 'PixelType_Gvsp_Coord3D_C16',
+ 'PixelType_Gvsp_BayerRBGG8',
+ 'PixelType_Gvsp_HB_Mono8',
+ 'PixelType_Gvsp_HB_Mono10',
+ 'PixelType_Gvsp_HB_Mono10_Packed',
+ 'PixelType_Gvsp_HB_Mono12',
+ 'PixelType_Gvsp_HB_Mono12_Packed',
+ 'PixelType_Gvsp_HB_Mono16',
+ 'PixelType_Gvsp_HB_BayerGR8',
+ 'PixelType_Gvsp_HB_BayerRG8',
+ 'PixelType_Gvsp_HB_BayerGB8',
+ 'PixelType_Gvsp_HB_BayerBG8',
+ 'PixelType_Gvsp_HB_BayerRBGG8',
+ 'PixelType_Gvsp_HB_BayerGR10',
+ 'PixelType_Gvsp_HB_BayerRG10',
+ 'PixelType_Gvsp_HB_BayerGB10',
+ 'PixelType_Gvsp_HB_BayerBG10',
+ 'PixelType_Gvsp_HB_BayerGR12',
+ 'PixelType_Gvsp_HB_BayerRG12',
+ 'PixelType_Gvsp_HB_BayerGB12',
+ 'PixelType_Gvsp_HB_BayerBG12',
+ 'PixelType_Gvsp_HB_BayerGR10_Packed',
+ 'PixelType_Gvsp_HB_BayerRG10_Packed',
+ 'PixelType_Gvsp_HB_BayerGB10_Packed',
+ 'PixelType_Gvsp_HB_BayerBG10_Packed',
+ 'PixelType_Gvsp_HB_BayerGR12_Packed',
+ 'PixelType_Gvsp_HB_BayerRG12_Packed',
+ 'PixelType_Gvsp_HB_BayerGB12_Packed',
+ 'PixelType_Gvsp_HB_BayerBG12_Packed',
+ 'PixelType_Gvsp_HB_YUV422_Packed',
+ 'PixelType_Gvsp_HB_YUV422_YUYV_Packed',
+ 'PixelType_Gvsp_HB_RGB8_Packed',
+ 'PixelType_Gvsp_HB_BGR8_Packed',
+ 'PixelType_Gvsp_HB_RGBA8_Packed',
+ 'PixelType_Gvsp_HB_BGRA8_Packed',
+ 'PixelType_Gvsp_HB_RGB16_Packed',
+ 'PixelType_Gvsp_HB_BGR16_Packed',
+ 'PixelType_Gvsp_HB_RGBA16_Packed',
+ 'PixelType_Gvsp_HB_BGRA16_Packed']
diff --git a/wndMain/MvImport/__init__.py b/wndMain/MvImport/__init__.py
new file mode 100644
index 0000000..ba8cf3f
--- /dev/null
+++ b/wndMain/MvImport/__init__.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+# -*- coding:utf-8 -*-
+# -*-mode:python ; tab-width:4 -*- ex:set tabstop=4 shiftwidth=4 expandtab: -*-
+
+import sys
+import os
+current_dir = os.path.dirname(os.path.abspath(__file__))
+if current_dir not in sys.path:
+ sys.path.append(current_dir)
+
+parent_dir = os.path.dirname(current_dir)
+if parent_dir not in sys.path:
+ sys.path.append(parent_dir)
+
+from .MvErrorDefine_const import *
+from .MvISPErrorDefine_const import *
+from .PixelType_header import *
+from .CameraParams_const import *
+from .CameraParams_header import *
+from .MvCameraControl_class import *
+
+
+__all__ = ["MvErrorDefine_const", "MvISPErrorDefine_const","PixelType_header", "CameraParams_const", "CameraParams_header", "MvCameraControl_class"]
+
+__version__ = '4.6.0.1'
diff --git a/wndMain/camera_img_get.py b/wndMain/camera_img_get.py
new file mode 100644
index 0000000..1374cda
--- /dev/null
+++ b/wndMain/camera_img_get.py
@@ -0,0 +1,226 @@
+import sys
+import os
+# import cv2
+import time
+import numpy as np
+from ctypes import *
+from .MvImport.MvCameraControl_class import *
+
+
+class Camera:
+ def __init__(self):
+ """
+ 初始化相机类
+ """
+ self.cam = MvCamera()
+ self.device_list = MV_CC_DEVICE_INFO_LIST()
+ self.handle_created = False
+ self.device_opened = False
+ self.is_grabbing = False
+
+ # 统计信息
+ self.frame_count = 0
+ self.start_time = 0
+
+ # 缓冲区变量 (将在打开设备后初始化)
+ self.data_buf = None
+ self.payload_size = 0
+ self.frame_info = MV_FRAME_OUT_INFO_EX()
+
+ def _open(self):
+ """
+ 枚举并打开相机
+ :return: bool, 成功返回 True,失败返回 False
+ """
+ # 1. 枚举设备
+ ret = MvCamera.MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, self.device_list)
+ if ret != 0 or self.device_list.nDeviceNum == 0:
+ print("[Error] No device found!")
+ return False
+
+ print(f"[Info] Found {self.device_list.nDeviceNum} device(s). Using the first one.")
+
+ # 2. 选择第一个设备并创建句柄
+ st_device = cast(self.device_list.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contents
+ ret = self.cam.MV_CC_CreateHandle(st_device)
+ if ret != 0:
+ print(f"[Error] Create handle failed, ret={ret}")
+ return False
+ self.handle_created = True
+
+ # 3. 打开设备
+ ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
+ if ret != 0:
+ print(f"[Error] Open device failed, ret={ret}")
+ self._close()
+ return False
+ self.device_opened = True
+
+ # 4. 配置采集模式 (连续采集)
+ self.cam.MV_CC_SetEnumValue("AcquisitionMode", 2)
+ self.cam.MV_CC_SetEnumValue("TriggerMode", 0)
+
+ # 5. 开始取流
+ ret = self.cam.MV_CC_StartGrabbing()
+ if ret != 0:
+ print(f"[Error] Start grabbing failed, ret={ret}")
+ self._close()
+ return False
+ self.is_grabbing = True
+
+ # 6. 获取 PayloadSize 并分配缓冲区
+ st_payload = MVCC_INTVALUE_EX()
+ ret = self.cam.MV_CC_GetIntValueEx("PayloadSize", st_payload)
+ if ret == 0:
+ self.payload_size = st_payload.nCurValue
+ self.data_buf = (c_ubyte * self.payload_size)()
+ print(f"[Info] Camera opened successfully. PayloadSize: {self.payload_size}")
+ else:
+ print("[Error] Failed to get PayloadSize")
+ self._close()
+ return False
+
+ return True
+
+ def _close(self):
+ """
+ 停止采集并关闭相机资源
+ """
+ if self.is_grabbing:
+ self.cam.MV_CC_StopGrabbing()
+ self.is_grabbing = False
+
+ if self.device_opened:
+ self.cam.MV_CC_CloseDevice()
+ self.device_opened = False
+
+ if self.handle_created:
+ self.cam.MV_CC_DestroyHandle()
+ self.handle_created = False
+
+ print("[Info] Camera resources released.")
+
+ def get_img(self, timeout_ms=1000):
+ """
+ 获取一帧图像并进行像素转换
+ :param timeout_ms: 获取帧的超时时间 (毫秒)
+ :return: numpy array (BGR格式) 或 None (如果获取失败)
+ """
+ if not self.is_grabbing or self.data_buf is None:
+ return None
+
+ ret = self.cam.MV_CC_GetOneFrameTimeout(self.data_buf, self.payload_size, self.frame_info, timeout_ms)
+ if ret != 0:
+ return None
+
+ # 更新统计
+ self.frame_count += 1
+ if self.frame_count == 1:
+ self.start_time = time.time()
+
+ w, h = self.frame_info.nWidth, self.frame_info.nHeight
+
+ # 像素转换参数设置
+ convert = MV_CC_PIXEL_CONVERT_PARAM()
+ memset(byref(convert), 0, sizeof(convert))
+ convert.nWidth = w
+ convert.nHeight = h
+ convert.pSrcData = self.data_buf
+ convert.nSrcDataLen = self.frame_info.nFrameLen
+ convert.enSrcPixelType = self.frame_info.enPixelType
+ convert.enDstPixelType = PixelType_Gvsp_BGR8_Packed
+ convert.nDstBufferSize = w * h * 3
+
+ dst = (c_ubyte * convert.nDstBufferSize)()
+ convert.pDstBuffer = dst
+
+ ret_conv = self.cam.MV_CC_ConvertPixelType(convert)
+ if ret_conv != 0:
+ return None
+
+ # 转换为 numpy 数组
+ img = np.frombuffer(dst, dtype=np.uint8).reshape(h, w, 3)
+ return img
+
+ def get_fps_stats(self):
+ """获取当前的 FPS 统计信息,便于观察打印取流fps"""
+ if self.frame_count == 0 or self.start_time == 0:
+ return 0.0, 0, 0.0
+
+ total_time = time.time() - self.start_time
+ fps = self.frame_count / total_time if total_time > 0 else 0
+ return fps, self.frame_count, total_time
+
+# ---------对外接口---------
+def show_img():
+ try:
+ # 1. 实例化相机
+ cam_obj = Camera()
+
+ # 2. 非正常打开报警
+ if not cam_obj._open():
+ print("Failed to open camera. Exiting.")
+ sys.exit(1)
+
+ print("Capturing one frame...")
+
+ while(True):
+ # 3. 获取图像
+ img = cam_obj.get_img()
+ return img
+
+ except Exception as e:
+ print(f"Error: {e}")
+ finally:
+ # 4. 关闭相机
+ cam_obj._close()
+ print("Camera closed.")
+
+ # if img is not None:
+ # # 生成带时间戳的文件名,防止覆盖
+ # timestamp = time.strftime("%Y%m%d_%H%M%S")
+ # filename = f"capture_{timestamp}.jpg"
+
+ # # 保存图像
+ # # ret = cv2.imwrite(filename, img)
+ # # if ret:
+ # # print(f"Success! Image saved as: {filename}")
+ # # else:
+ # # print("Error: Failed to save image.")
+ # else:
+ # print("Error: Failed to capture any valid frame.")
+
+# =====================================================
+# 主程序示例
+# =====================================================
+if __name__ == "__main__":
+ # 1. 实例化相机
+ cam_obj = Camera()
+
+ # 2. 非正常打开报警
+ if not cam_obj._open():
+ print("Failed to open camera. Exiting.")
+ sys.exit(1)
+
+ print("Capturing one frame...")
+
+ # 3. 获取图像
+ img = cam_obj.get_img()
+
+ if img is not None:
+ # 生成带时间戳的文件名,防止覆盖
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
+ filename = f"capture_{timestamp}.jpg"
+
+ # 保存图像
+ # ret = cv2.imwrite(filename, img)
+ # if ret:
+ # print(f"Success! Image saved as: {filename}")
+ # else:
+ # print("Error: Failed to save image.")
+ else:
+ print("Error: Failed to capture any valid frame.")
+
+ # 4. 关闭相机
+ cam_obj._close()
+ print("Camera closed.")
diff --git a/wndMain/funcBarView/vwFunctionBar.py b/wndMain/funcBarView/vwFunctionBar.py
new file mode 100644
index 0000000..15d9cd1
--- /dev/null
+++ b/wndMain/funcBarView/vwFunctionBar.py
@@ -0,0 +1,33 @@
+# 该视图类用于更新主界面的状态栏
+from msg_dict import g_uiCtrlScript
+
+
+class CFunctionBarView:
+ # public:
+ def __init__(self, objList: list):
+ self._m_objArr = objList
+
+ # 根据传入参数,更新功能区的控件使能状态
+ def setCtrlsEnabled(self, whichOne: str):
+ if whichOne == g_uiCtrlScript['CTRL_USER_TYPE_TECH']:
+ # 技术员允许自动作业,设备调试,参数设置,数据查询和配方管理
+ if not self._m_objArr[0].isEnabled(): self._m_objArr[0].setEnabled(True) # 自动作业
+ if not self._m_objArr[1].isEnabled(): self._m_objArr[1].setEnabled(True) # 设备调试
+ if not self._m_objArr[2].isEnabled(): self._m_objArr[2].setEnabled(True) # 参数设置
+ if not self._m_objArr[3].isEnabled(): self._m_objArr[3].setEnabled(True) # 数据查询
+ if not self._m_objArr[4].isEnabled(): self._m_objArr[4].setEnabled(True) # 配方管理
+ if self._m_objArr[5].isEnabled(): self._m_objArr[5].setEnabled(False) # 用户管理
+ else: # 管理员或操作员
+ if self._m_objArr[1].isEnabled(): self._m_objArr[1].setEnabled(False) # 设备调试
+ if self._m_objArr[2].isEnabled(): self._m_objArr[2].setEnabled(False) # 参数设置
+ if not self._m_objArr[3].isEnabled(): self._m_objArr[3].setEnabled(True) # 数据查询
+ if self._m_objArr[4].isEnabled(): self._m_objArr[4].setEnabled(False) # 配方管理
+ if whichOne == g_uiCtrlScript['CTRL_USER_TYPE_ADMIN']:
+ # 管理员仅允许查询数据和用户管理
+ if self._m_objArr[0].isEnabled(): self._m_objArr[0].setEnabled(False) # 自动作业
+ if not self._m_objArr[5].isEnabled(): self._m_objArr[5].setEnabled(True) # 用户管理
+ else:
+ # 操作员允许自动作业,查询数据
+ if not self._m_objArr[0].isEnabled(): self._m_objArr[0].setEnabled(True) # 自动作业
+ if self._m_objArr[5].isEnabled(): self._m_objArr[5].setEnabled(False) # 用户管理
+
diff --git a/wndMain/pageAutoPage/sub_uiAutoPage.py b/wndMain/pageAutoPage/sub_uiAutoPage.py
new file mode 100644
index 0000000..081c399
--- /dev/null
+++ b/wndMain/pageAutoPage/sub_uiAutoPage.py
@@ -0,0 +1,223 @@
+# 自动作业内嵌页面子类
+from PySide6.QtCore import Slot, Qt, QTimer
+from PySide6.QtWidgets import QWidget, QMessageBox, QLabel
+from PySide6.QtGui import QImage, QPixmap
+from wndCtrl.stateCtrl.clsSysState_autoproc import CStateAutoProc
+from .uiSub_AutoPage import Ui_pageAutoProc
+from msg_dict import g_uiCtrlScript, g_uiGeometrySize, g_errMsgText
+from ..camera_img_get import Camera
+import cv2 # 确保导入OpenCV
+
+
+class CSubPageAutoProc(QWidget):
+ # public:
+ def __init__(self, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ # 挂载UI界面:将当前业务类实例传入setupUi,UI组件成为实例属性
+ self.ui = Ui_pageAutoProc()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+
+ # 摄像头相关变量
+ self.cam0 = None # 第一个摄像头
+ self.cam1 = None # 第二个摄像头
+ self.timer = None # 定时器
+ self.camera_label = None # 专门用于显示摄像头的Label,避免重复创建
+
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._editCtrlTitle()
+ self._screenAdapter() # 界面自适应
+ # 添加其他和界面或控件初始化相关的操作
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+ # ---------------------------------------------------------------
+ self._setupSignalSlotMapping()
+
+ # 添加摄像头实时图片
+ self._camera_show()
+
+ pass
+
+ # -----------------------------------------
+ # private:
+ # 初始化修改页面控件文字
+ def _editCtrlTitle(self) -> None:
+ # 修改tab页面文字
+ self.ui.tabProc.setTabText(0, g_uiCtrlScript['PAGE_AUTOPROC_TAB_0'])
+ self.ui.tabProc.setTabText(1, g_uiCtrlScript['PAGE_AUTOPROC_TAB_1'])
+
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ self.ui.tabProc.setGeometry(g_uiGeometrySize['WND_MARGIN_HORI'], g_uiGeometrySize['WND_MARGIN_VERT'],
+ self.szStack[0] - g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ self.szStack[1] - g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ self._adjustTabCtrls() # 调整tab页内控件的位置及大小
+ pass
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 调整tab页面控件
+ def _adjustTabCtrls(self):
+ rctTemp = self.ui.grpCamera0.geometry()
+ nSize = (rctTemp.width(), rctTemp.height())
+ self.ui.grpCamera0.setGeometry(g_uiGeometrySize['WND_MARGIN_HORI'], 0, nSize[0], nSize[1])
+
+ # -------------------------------------------
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self) -> None:
+ # self.ui.btnProcStart.clicked.connect(self._onBtnProcStart)
+ self.ui.btnProcStop.clicked.connect(self._onBtnProcStop)
+ self.ui.btnReset.clicked.connect(self._onBtnReset)
+ pass
+
+ # ----------槽函数----------
+ # @Slot()
+ # def _onBtnProcStart(self):
+ # # 启动自动作业
+ # if g_warnState.checkSysWarning():
+ # QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_errMsgText['ERR_SYS_WARNING'])
+ # else:
+ #
+ # tProcJob = CProcThread()
+ # CStateAutoProc.setProcState(True)
+ # tProcJob.runProc()
+ # # 更新作业按钮的使能状态
+ # self.ui.btnProcStart.setEnabled(False)
+ # self.ui.btnProcStop.setEnabled(True)
+ # pass
+
+ @Slot()
+ def _onBtnProcStop(self):
+ # 停止自动作业
+ pass
+
+ @Slot()
+ def _onBtnReset(self):
+ pass
+
+ def _camera_show(self):
+ """
+ 初始化摄像头并启动实时显示
+ """
+ try:
+ # 1. 初始化摄像头(保持打开状态)
+ self.cam0 = Camera()
+ if not self.cam0._open():
+ print("[Error] Failed to open camera")
+ QMessageBox.warning(self, "摄像头错误", "无法打开摄像头,请检查设备连接!")
+ return
+
+ # 2. 初始化显示用的Label
+ self._init_camera_label()
+
+ # 3. 创建定时器,每50毫秒更新一次图像
+ self.timer = QTimer(self)
+ self.timer.timeout.connect(self._update_camera_image)
+ self.timer.start(10) # 50ms,约20fps
+ print("[Info] Camera started successfully")
+
+ except Exception as e:
+ error_msg = f"摄像头初始化失败: {str(e)}"
+ print(f"[Error] {error_msg}")
+ QMessageBox.critical(self, "摄像头错误", error_msg)
+
+ def _init_camera_label(self):
+ """
+ 初始化摄像头显示用的Label(只创建一次)
+ """
+ # 如果Label已存在,直接返回
+ if self.camera_label is not None:
+ return
+
+ # 创建Label并设置属性
+ self.camera_label = QLabel(self.ui.fraCamera0)
+ # 设置Label充满父容器fraCamera0
+ self.camera_label.setGeometry(0, 0, self.ui.fraCamera0.width(), self.ui.fraCamera0.height())
+ # 设置图像自适应缩放
+ self.camera_label.setScaledContents(True)
+ # 设置对齐方式
+ self.camera_label.setAlignment(Qt.AlignCenter)
+ # 确保Label在最上层显示
+ self.camera_label.raise_()
+
+ def _update_camera_image(self):
+ """
+ 定时更新摄像头图像(修复版)
+ """
+ try:
+ if self.cam0 is None or self.camera_label is None:
+ return
+
+ # 1. 获取摄像头图像
+ img = self.cam0.get_img()
+ if img is None or img.size == 0:
+ print("[Warning] 获取到空图像")
+ return
+
+ # 2. OpenCV图像是BGR格式,需要转换为RGB
+ # 先检查图像通道数
+ if len(img.shape) == 3 and img.shape[2] == 3:
+ img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+ else:
+ # 灰度图像处理
+ img_rgb = img
+
+ # 3. 转换为QImage
+ h, w = img_rgb.shape[:2]
+ ch = 3 if len(img_rgb.shape) == 3 else 1
+ bytes_per_line = ch * w
+
+ if ch == 3:
+ q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format_RGB888)
+ else:
+ q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format_Grayscale8)
+
+ # 4. 转换为QPixmap并显示
+ pixmap = QPixmap.fromImage(q_img)
+ if not pixmap.isNull():
+ self.camera_label.setPixmap(pixmap)
+
+ except Exception as e:
+ print(f"[Error] 更新摄像头图像失败: {e}")
+ # 不中断程序,继续尝试
+
+ def resizeEvent(self, event):
+ """
+ 窗口大小变化时,同步调整摄像头显示Label的大小
+ """
+ super().resizeEvent(event)
+ if self.camera_label is not None and self.ui.fraCamera0 is not None:
+ self.camera_label.setGeometry(0, 0, self.ui.fraCamera0.width(), self.ui.fraCamera0.height())
+
+ def closeEvent(self, event):
+ """
+ 关闭窗口时释放摄像头资源(增强版)
+ """
+ # 停止定时器
+ if self.timer is not None and self.timer.isActive():
+ self.timer.stop()
+ self.timer.deleteLater()
+ self.timer = None
+
+ # 释放摄像头资源
+ if self.cam0 is not None:
+ self.cam0._close()
+ self.cam0 = None
+
+ if self.cam1 is not None:
+ self.cam1._close()
+ self.cam1 = None
+
+ event.accept()
\ No newline at end of file
diff --git a/wndMain/pageAutoPage/uiSub_AutoPage.py b/wndMain/pageAutoPage/uiSub_AutoPage.py
new file mode 100644
index 0000000..29c4ea2
--- /dev/null
+++ b/wndMain/pageAutoPage/uiSub_AutoPage.py
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_AutoPage.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QFrame, QGroupBox, QHBoxLayout,
+ QLabel, QProgressBar, QPushButton, QSizePolicy,
+ QTabWidget, QTextEdit, QVBoxLayout, QWidget)
+
+class Ui_pageAutoProc(object):
+ def setupUi(self, pageAutoProc):
+ if not pageAutoProc.objectName():
+ pageAutoProc.setObjectName(u"pageAutoProc")
+ pageAutoProc.resize(1696, 1262)
+ self.tabProc = QTabWidget(pageAutoProc)
+ self.tabProc.setObjectName(u"tabProc")
+ self.tabProc.setGeometry(QRect(10, 10, 1041, 691))
+ self.tab_8 = QWidget()
+ self.tab_8.setObjectName(u"tab_8")
+ self.widget = QWidget(self.tab_8)
+ self.widget.setObjectName(u"widget")
+ self.widget.setGeometry(QRect(30, 50, 951, 571))
+ self.verticalLayout = QVBoxLayout(self.widget)
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.grpCamera0 = QGroupBox(self.widget)
+ self.grpCamera0.setObjectName(u"grpCamera0")
+ self.fraCamera0 = QFrame(self.grpCamera0)
+ self.fraCamera0.setObjectName(u"fraCamera0")
+ self.fraCamera0.setGeometry(QRect(20, 40, 421, 231))
+ self.fraCamera0.setFrameShape(QFrame.Shape.StyledPanel)
+ self.fraCamera0.setFrameShadow(QFrame.Shadow.Raised)
+
+ self.horizontalLayout.addWidget(self.grpCamera0)
+
+ self.grpCamera1 = QGroupBox(self.widget)
+ self.grpCamera1.setObjectName(u"grpCamera1")
+ self.fraCamera1 = QFrame(self.grpCamera1)
+ self.fraCamera1.setObjectName(u"fraCamera1")
+ self.fraCamera1.setGeometry(QRect(20, 40, 441, 231))
+ self.fraCamera1.setFrameShape(QFrame.Shape.StyledPanel)
+ self.fraCamera1.setFrameShadow(QFrame.Shadow.Raised)
+
+ self.horizontalLayout.addWidget(self.grpCamera1)
+
+
+ self.verticalLayout.addLayout(self.horizontalLayout)
+
+ self.horizontalLayout_2 = QHBoxLayout()
+ self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+ self.grpOperate = QGroupBox(self.widget)
+ self.grpOperate.setObjectName(u"grpOperate")
+ self.btnProcStart = QPushButton(self.grpOperate)
+ self.btnProcStart.setObjectName(u"btnProcStart")
+ self.btnProcStart.setGeometry(QRect(60, 41, 110, 50))
+ self.btnProcStart.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnProcStop = QPushButton(self.grpOperate)
+ self.btnProcStop.setObjectName(u"btnProcStop")
+ self.btnProcStop.setEnabled(False)
+ self.btnProcStop.setGeometry(QRect(60, 110, 110, 50))
+ self.btnProcStop.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnReset = QPushButton(self.grpOperate)
+ self.btnReset.setObjectName(u"btnReset")
+ self.btnReset.setGeometry(QRect(60, 180, 110, 50))
+ self.btnReset.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+
+ self.horizontalLayout_2.addWidget(self.grpOperate)
+
+ self.grpWaste = QGroupBox(self.widget)
+ self.grpWaste.setObjectName(u"grpWaste")
+ self.lblWaste = QLabel(self.grpWaste)
+ self.lblWaste.setObjectName(u"lblWaste")
+ self.lblWaste.setGeometry(QRect(20, 60, 81, 16))
+ self.editWaste = QTextEdit(self.grpWaste)
+ self.editWaste.setObjectName(u"editWaste")
+ self.editWaste.setGeometry(QRect(110, 50, 81, 31))
+ self.btnWasteZero = QPushButton(self.grpWaste)
+ self.btnWasteZero.setObjectName(u"btnWasteZero")
+ self.btnWasteZero.setGeometry(QRect(20, 120, 111, 51))
+ self.pgbWaste = QProgressBar(self.grpWaste)
+ self.pgbWaste.setObjectName(u"pgbWaste")
+ self.pgbWaste.setGeometry(QRect(110, 150, 151, 91))
+ self.pgbWaste.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
+ self.pgbWaste.setValue(24)
+ self.pgbWaste.setOrientation(Qt.Orientation.Vertical)
+
+ self.horizontalLayout_2.addWidget(self.grpWaste)
+
+ self.grpInfo = QGroupBox(self.widget)
+ self.grpInfo.setObjectName(u"grpInfo")
+ self.tabInfo = QTabWidget(self.grpInfo)
+ self.tabInfo.setObjectName(u"tabInfo")
+ self.tabInfo.setGeometry(QRect(20, 30, 191, 211))
+ self.tab_9 = QWidget()
+ self.tab_9.setObjectName(u"tab_9")
+ self.tabInfo.addTab(self.tab_9, "")
+ self.tab_13 = QWidget()
+ self.tab_13.setObjectName(u"tab_13")
+ self.tabInfo.addTab(self.tab_13, "")
+
+ self.horizontalLayout_2.addWidget(self.grpInfo)
+
+ self.grpType = QGroupBox(self.widget)
+ self.grpType.setObjectName(u"grpType")
+ self.fraType = QFrame(self.grpType)
+ self.fraType.setObjectName(u"fraType")
+ self.fraType.setGeometry(QRect(20, 30, 191, 201))
+ self.fraType.setFrameShape(QFrame.Shape.StyledPanel)
+ self.fraType.setFrameShadow(QFrame.Shadow.Raised)
+
+ self.horizontalLayout_2.addWidget(self.grpType)
+
+
+ self.verticalLayout.addLayout(self.horizontalLayout_2)
+
+ self.tabProc.addTab(self.tab_8, "")
+ self.tab_14 = QWidget()
+ self.tab_14.setObjectName(u"tab_14")
+ self.tabProc.addTab(self.tab_14, "")
+
+ self.retranslateUi(pageAutoProc)
+
+ self.tabProc.setCurrentIndex(0)
+ self.tabInfo.setCurrentIndex(0)
+
+
+ QMetaObject.connectSlotsByName(pageAutoProc)
+ # setupUi
+
+ def retranslateUi(self, pageAutoProc):
+ pageAutoProc.setWindowTitle("")
+ self.grpCamera0.setTitle(QCoreApplication.translate("pageAutoProc", u"\u76f8\u673a0", None))
+ self.grpCamera1.setTitle(QCoreApplication.translate("pageAutoProc", u"\u76f8\u673a1", None))
+ self.grpOperate.setTitle(QCoreApplication.translate("pageAutoProc", u"\u64cd\u4f5c\u4f5c\u4e1a", None))
+ self.btnProcStart.setText(QCoreApplication.translate("pageAutoProc", u"\u542f\u52a8\u7801\u579b\u4f5c\u4e1a", None))
+ self.btnProcStop.setText(QCoreApplication.translate("pageAutoProc", u"\u505c\u6b62\u7801\u579b\u4f5c\u4e1a", None))
+ self.btnReset.setText(QCoreApplication.translate("pageAutoProc", u"\u8bbe\u5907\u590d\u4f4d", None))
+ self.grpWaste.setTitle(QCoreApplication.translate("pageAutoProc", u"\u5e9f\u6599\u533a\u72b6\u6001", None))
+ self.lblWaste.setText(QCoreApplication.translate("pageAutoProc", u"\u5f53\u524d\u5e9f\u6599\u4e2a\u6570\uff1a", None))
+ self.btnWasteZero.setText(QCoreApplication.translate("pageAutoProc", u"\u5e9f\u6599\u533a\u6e05\u96f6", None))
+ self.grpInfo.setTitle(QCoreApplication.translate("pageAutoProc", u"\u4f5c\u4e1a\u4fe1\u606f", None))
+ self.tabInfo.setTabText(self.tabInfo.indexOf(self.tab_9), QCoreApplication.translate("pageAutoProc", u"\u6d41\u7a0b\u4fe1\u606f", None))
+ self.tabInfo.setTabText(self.tabInfo.indexOf(self.tab_13), QCoreApplication.translate("pageAutoProc", u"\u62a5\u8b66\u4fe1\u606f", None))
+ self.grpType.setTitle(QCoreApplication.translate("pageAutoProc", u"\u7ebf\u6761\u7c7b\u578b", None))
+ self.tabProc.setTabText(self.tabProc.indexOf(self.tab_8), QCoreApplication.translate("pageAutoProc", u"\u4f5c\u4e1a\u4fe1\u606f0", None))
+ self.tabProc.setTabText(self.tabProc.indexOf(self.tab_14), QCoreApplication.translate("pageAutoProc", u"\u4f5c\u4e1a\u4fe1\u606f1", None))
+ # retranslateUi
+
diff --git a/wndMain/pageDataQuery/sub_uiQuery.py b/wndMain/pageDataQuery/sub_uiQuery.py
new file mode 100644
index 0000000..7bbf3cd
--- /dev/null
+++ b/wndMain/pageDataQuery/sub_uiQuery.py
@@ -0,0 +1,38 @@
+# 数据查询内嵌页面子类
+from PySide6.QtWidgets import QWidget
+from PySide6.QtCore import Qt
+from wndMain.pageDataQuery.uiSub_Query import Ui_pageDataQuery
+
+
+class CSubPageQuery(QWidget):
+ # public:
+ def __init__(self, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ self.ui = Ui_pageDataQuery()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._screenAdapter() # 界面自适应
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
\ No newline at end of file
diff --git a/wndMain/pageDataQuery/uiSub_Query.py b/wndMain/pageDataQuery/uiSub_Query.py
new file mode 100644
index 0000000..4f1ce7e
--- /dev/null
+++ b/wndMain/pageDataQuery/uiSub_Query.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_Query.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.3
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QSizePolicy, QWidget)
+
+class Ui_pageDataQuery(object):
+ def setupUi(self, pageDataQuery):
+ if not pageDataQuery.objectName():
+ pageDataQuery.setObjectName(u"pageDataQuery")
+ pageDataQuery.resize(758, 516)
+
+ self.retranslateUi(pageDataQuery)
+
+ QMetaObject.connectSlotsByName(pageDataQuery)
+ # setupUi
+
+ def retranslateUi(self, pageDataQuery):
+ pageDataQuery.setWindowTitle(QCoreApplication.translate("pageDataQuery", u"Form", None))
+ # retranslateUi
+
diff --git a/wndMain/pageDevDebug/sub_uiDevDebug.py b/wndMain/pageDevDebug/sub_uiDevDebug.py
new file mode 100644
index 0000000..7bb0b23
--- /dev/null
+++ b/wndMain/pageDevDebug/sub_uiDevDebug.py
@@ -0,0 +1,44 @@
+# 设备调试内嵌页面子类
+from PySide6.QtWidgets import QWidget, QMessageBox
+from PySide6.QtCore import Qt, Slot
+from wndMain.pageDevDebug.uiSub_DevDebug import Ui_pageDebug
+from msg_dict import g_uiGeometrySize
+
+class CSubPageDevDebug(QWidget):
+ # public:
+ def __init__(self, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ self.ui = Ui_pageDebug()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+
+ self._screenAdapter() # 界面自适应
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ self.ui.tabServo.setGeometry(g_uiGeometrySize['WND_MARGIN_HORI'], g_uiGeometrySize['WND_MARGIN_VERT'],
+ self.szStack[0] - g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ self.szStack[1] - g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
+
diff --git a/wndMain/pageDevDebug/uiSub_DevDebug.py b/wndMain/pageDevDebug/uiSub_DevDebug.py
new file mode 100644
index 0000000..b85faf1
--- /dev/null
+++ b/wndMain/pageDevDebug/uiSub_DevDebug.py
@@ -0,0 +1,422 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_DevDebug.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QComboBox, QLabel, QPushButton,
+ QRadioButton, QSizePolicy, QSlider, QTabWidget,
+ QTextEdit, QWidget)
+
+class Ui_pageDebug(object):
+ def setupUi(self, pageDebug):
+ if not pageDebug.objectName():
+ pageDebug.setObjectName(u"pageDebug")
+ pageDebug.resize(653, 411)
+ self.tabServo = QTabWidget(pageDebug)
+ self.tabServo.setObjectName(u"tabServo")
+ self.tabServo.setGeometry(QRect(-10, 10, 651, 421))
+ self.tab_0 = QWidget()
+ self.tab_0.setObjectName(u"tab_0")
+ self.widget = QWidget(self.tab_0)
+ self.widget.setObjectName(u"widget")
+ self.widget.setGeometry(QRect(30, 20, 411, 291))
+ self.lblConveySpeed = QLabel(self.widget)
+ self.lblConveySpeed.setObjectName(u"lblConveySpeed")
+ self.lblConveySpeed.setGeometry(QRect(50, 120, 53, 20))
+ self.rdbLeftConveyMotor = QRadioButton(self.widget)
+ self.rdbLeftConveyMotor.setObjectName(u"rdbLeftConveyMotor")
+ self.rdbLeftConveyMotor.setGeometry(QRect(50, 30, 98, 19))
+ self.rdbRightConveyMotor = QRadioButton(self.widget)
+ self.rdbRightConveyMotor.setObjectName(u"rdbRightConveyMotor")
+ self.rdbRightConveyMotor.setGeometry(QRect(270, 30, 98, 19))
+ self.sldConveySpeed = QSlider(self.widget)
+ self.sldConveySpeed.setObjectName(u"sldConveySpeed")
+ self.sldConveySpeed.setGeometry(QRect(110, 120, 160, 22))
+ self.sldConveySpeed.setMinimum(-50)
+ self.sldConveySpeed.setMaximum(50)
+ self.sldConveySpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.edtConveySpeed = QTextEdit(self.widget)
+ self.edtConveySpeed.setObjectName(u"edtConveySpeed")
+ self.edtConveySpeed.setGeometry(QRect(290, 110, 41, 31))
+ self.edtConveySpeed.setReadOnly(True)
+ self.edtConveyAcSpeed = QTextEdit(self.widget)
+ self.edtConveyAcSpeed.setObjectName(u"edtConveyAcSpeed")
+ self.edtConveyAcSpeed.setGeometry(QRect(290, 150, 41, 31))
+ self.edtConveyAcSpeed.setReadOnly(True)
+ self.sldConveyAcSpeed = QSlider(self.widget)
+ self.sldConveyAcSpeed.setObjectName(u"sldConveyAcSpeed")
+ self.sldConveyAcSpeed.setGeometry(QRect(110, 160, 160, 22))
+ self.sldConveyAcSpeed.setMinimum(0)
+ self.sldConveyAcSpeed.setMaximum(100)
+ self.sldConveyAcSpeed.setSingleStep(10)
+ self.sldConveyAcSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.lblConveyAcSpeed = QLabel(self.widget)
+ self.lblConveyAcSpeed.setObjectName(u"lblConveyAcSpeed")
+ self.lblConveyAcSpeed.setGeometry(QRect(50, 160, 53, 20))
+ self.edtConveyDeSpeed = QTextEdit(self.widget)
+ self.edtConveyDeSpeed.setObjectName(u"edtConveyDeSpeed")
+ self.edtConveyDeSpeed.setGeometry(QRect(290, 190, 41, 31))
+ self.edtConveyDeSpeed.setReadOnly(True)
+ self.sldConveyDeSpeed = QSlider(self.widget)
+ self.sldConveyDeSpeed.setObjectName(u"sldConveyDeSpeed")
+ self.sldConveyDeSpeed.setGeometry(QRect(110, 200, 160, 22))
+ self.sldConveyDeSpeed.setMinimum(0)
+ self.sldConveyDeSpeed.setMaximum(100)
+ self.sldConveyDeSpeed.setSingleStep(10)
+ self.sldConveyDeSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.lblConveyDeSpeed = QLabel(self.widget)
+ self.lblConveyDeSpeed.setObjectName(u"lblConveyDeSpeed")
+ self.lblConveyDeSpeed.setGeometry(QRect(50, 200, 53, 20))
+ self.lblConveyAddr = QLabel(self.widget)
+ self.lblConveyAddr.setObjectName(u"lblConveyAddr")
+ self.lblConveyAddr.setGeometry(QRect(50, 80, 53, 20))
+ self.sldConveyAddr = QSlider(self.widget)
+ self.sldConveyAddr.setObjectName(u"sldConveyAddr")
+ self.sldConveyAddr.setGeometry(QRect(110, 80, 160, 22))
+ self.sldConveyAddr.setMinimum(1)
+ self.sldConveyAddr.setMaximum(10)
+ self.sldConveyAddr.setOrientation(Qt.Orientation.Horizontal)
+ self.edtConveyAddr = QTextEdit(self.widget)
+ self.edtConveyAddr.setObjectName(u"edtConveyAddr")
+ self.edtConveyAddr.setGeometry(QRect(290, 70, 41, 31))
+ self.edtConveyAddr.setReadOnly(True)
+ self.btnConveyStart = QPushButton(self.widget)
+ self.btnConveyStart.setObjectName(u"btnConveyStart")
+ self.btnConveyStart.setGeometry(QRect(80, 250, 75, 23))
+ self.btnConveyStop = QPushButton(self.widget)
+ self.btnConveyStop.setObjectName(u"btnConveyStop")
+ self.btnConveyStop.setGeometry(QRect(240, 250, 75, 23))
+ self.tabServo.addTab(self.tab_0, "")
+ self.tab_1 = QWidget()
+ self.tab_1.setObjectName(u"tab_1")
+ self.widget_2 = QWidget(self.tab_1)
+ self.widget_2.setObjectName(u"widget_2")
+ self.widget_2.setGeometry(QRect(60, 30, 411, 291))
+ self.lblServoSpeed = QLabel(self.widget_2)
+ self.lblServoSpeed.setObjectName(u"lblServoSpeed")
+ self.lblServoSpeed.setGeometry(QRect(50, 40, 53, 20))
+ self.sldServoSpeed = QSlider(self.widget_2)
+ self.sldServoSpeed.setObjectName(u"sldServoSpeed")
+ self.sldServoSpeed.setGeometry(QRect(110, 40, 160, 22))
+ self.sldServoSpeed.setMinimum(-50)
+ self.sldServoSpeed.setMaximum(50)
+ self.sldServoSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.edtServoSpeed = QTextEdit(self.widget_2)
+ self.edtServoSpeed.setObjectName(u"edtServoSpeed")
+ self.edtServoSpeed.setGeometry(QRect(290, 30, 41, 31))
+ self.edtServoSpeed.setReadOnly(True)
+ self.edtServoAcSpeed = QTextEdit(self.widget_2)
+ self.edtServoAcSpeed.setObjectName(u"edtServoAcSpeed")
+ self.edtServoAcSpeed.setGeometry(QRect(290, 70, 41, 31))
+ self.edtServoAcSpeed.setReadOnly(True)
+ self.sldServoAcSpeed = QSlider(self.widget_2)
+ self.sldServoAcSpeed.setObjectName(u"sldServoAcSpeed")
+ self.sldServoAcSpeed.setGeometry(QRect(110, 80, 160, 22))
+ self.sldServoAcSpeed.setMinimum(0)
+ self.sldServoAcSpeed.setMaximum(100)
+ self.sldServoAcSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.lblServoAcSpeed = QLabel(self.widget_2)
+ self.lblServoAcSpeed.setObjectName(u"lblServoAcSpeed")
+ self.lblServoAcSpeed.setGeometry(QRect(50, 80, 53, 20))
+ self.edtServoOriP = QTextEdit(self.widget_2)
+ self.edtServoOriP.setObjectName(u"edtServoOriP")
+ self.edtServoOriP.setGeometry(QRect(290, 110, 41, 31))
+ self.edtServoOriP.setReadOnly(True)
+ self.sldServoOriP = QSlider(self.widget_2)
+ self.sldServoOriP.setObjectName(u"sldServoOriP")
+ self.sldServoOriP.setGeometry(QRect(110, 120, 160, 22))
+ self.sldServoOriP.setMinimum(0)
+ self.sldServoOriP.setMaximum(180)
+ self.sldServoOriP.setOrientation(Qt.Orientation.Horizontal)
+ self.lblServoOriP = QLabel(self.widget_2)
+ self.lblServoOriP.setObjectName(u"lblServoOriP")
+ self.lblServoOriP.setGeometry(QRect(50, 120, 53, 20))
+ self.btnStartRot = QPushButton(self.widget_2)
+ self.btnStartRot.setObjectName(u"btnStartRot")
+ self.btnStartRot.setGeometry(QRect(70, 210, 101, 23))
+ self.btnStartRoi = QPushButton(self.widget_2)
+ self.btnStartRoi.setObjectName(u"btnStartRoi")
+ self.btnStartRoi.setGeometry(QRect(230, 210, 75, 23))
+ self.lblServoRotP = QLabel(self.widget_2)
+ self.lblServoRotP.setObjectName(u"lblServoRotP")
+ self.lblServoRotP.setGeometry(QRect(50, 160, 53, 20))
+ self.edtServoRotP = QTextEdit(self.widget_2)
+ self.edtServoRotP.setObjectName(u"edtServoRotP")
+ self.edtServoRotP.setGeometry(QRect(290, 150, 41, 31))
+ self.edtServoRotP.setReadOnly(True)
+ self.sldServoRotP = QSlider(self.widget_2)
+ self.sldServoRotP.setObjectName(u"sldServoRotP")
+ self.sldServoRotP.setGeometry(QRect(110, 160, 160, 22))
+ self.sldServoRotP.setMinimum(0)
+ self.sldServoRotP.setMaximum(180)
+ self.sldServoRotP.setOrientation(Qt.Orientation.Horizontal)
+ self.tabServo.addTab(self.tab_1, "")
+ self.tab = QWidget()
+ self.tab.setObjectName(u"tab")
+ self.widget_3 = QWidget(self.tab)
+ self.widget_3.setObjectName(u"widget_3")
+ self.widget_3.setGeometry(QRect(80, 30, 411, 291))
+ self.lblDmSpeed = QLabel(self.widget_3)
+ self.lblDmSpeed.setObjectName(u"lblDmSpeed")
+ self.lblDmSpeed.setGeometry(QRect(50, 40, 53, 20))
+ self.sldDmSpeed = QSlider(self.widget_3)
+ self.sldDmSpeed.setObjectName(u"sldDmSpeed")
+ self.sldDmSpeed.setGeometry(QRect(110, 40, 160, 22))
+ self.sldDmSpeed.setMinimum(1)
+ self.sldDmSpeed.setMaximum(30)
+ self.sldDmSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.edtDmSpeed = QTextEdit(self.widget_3)
+ self.edtDmSpeed.setObjectName(u"edtDmSpeed")
+ self.edtDmSpeed.setGeometry(QRect(290, 30, 41, 31))
+ self.edtDmSpeed.setReadOnly(True)
+ self.edtDmOriP = QTextEdit(self.widget_3)
+ self.edtDmOriP.setObjectName(u"edtDmOriP")
+ self.edtDmOriP.setGeometry(QRect(290, 70, 51, 31))
+ self.edtDmOriP.setReadOnly(True)
+ self.sldDmOriP = QSlider(self.widget_3)
+ self.sldDmOriP.setObjectName(u"sldDmOriP")
+ self.sldDmOriP.setGeometry(QRect(110, 80, 160, 22))
+ self.sldDmOriP.setMinimum(0)
+ self.sldDmOriP.setMaximum(180)
+ self.sldDmOriP.setOrientation(Qt.Orientation.Horizontal)
+ self.lblDmOriP = QLabel(self.widget_3)
+ self.lblDmOriP.setObjectName(u"lblDmOriP")
+ self.lblDmOriP.setGeometry(QRect(50, 80, 53, 20))
+ self.btnStartRoiP = QPushButton(self.widget_3)
+ self.btnStartRoiP.setObjectName(u"btnStartRoiP")
+ self.btnStartRoiP.setGeometry(QRect(60, 210, 101, 23))
+ self.btnStartDropP = QPushButton(self.widget_3)
+ self.btnStartDropP.setObjectName(u"btnStartDropP")
+ self.btnStartDropP.setGeometry(QRect(210, 210, 101, 23))
+ self.lblDmDropP = QLabel(self.widget_3)
+ self.lblDmDropP.setObjectName(u"lblDmDropP")
+ self.lblDmDropP.setGeometry(QRect(50, 120, 53, 20))
+ self.edtDmDropP = QTextEdit(self.widget_3)
+ self.edtDmDropP.setObjectName(u"edtDmDropP")
+ self.edtDmDropP.setGeometry(QRect(290, 110, 41, 31))
+ self.edtDmDropP.setReadOnly(True)
+ self.sldDmDropP = QSlider(self.widget_3)
+ self.sldDmDropP.setObjectName(u"sldDmDropP")
+ self.sldDmDropP.setGeometry(QRect(110, 120, 160, 22))
+ self.sldDmDropP.setMinimum(0)
+ self.sldDmDropP.setMaximum(180)
+ self.sldDmDropP.setOrientation(Qt.Orientation.Horizontal)
+ self.btnStartZero = QPushButton(self.widget_3)
+ self.btnStartZero.setObjectName(u"btnStartZero")
+ self.btnStartZero.setGeometry(QRect(60, 170, 101, 23))
+ self.btnReset = QPushButton(self.widget_3)
+ self.btnReset.setObjectName(u"btnReset")
+ self.btnReset.setGeometry(QRect(210, 170, 101, 23))
+ self.tabServo.addTab(self.tab, "")
+ self.tab_2 = QWidget()
+ self.tab_2.setObjectName(u"tab_2")
+ self.widget_4 = QWidget(self.tab_2)
+ self.widget_4.setObjectName(u"widget_4")
+ self.widget_4.setGeometry(QRect(70, 30, 411, 291))
+ self.lblStepperSpeed = QLabel(self.widget_4)
+ self.lblStepperSpeed.setObjectName(u"lblStepperSpeed")
+ self.lblStepperSpeed.setGeometry(QRect(50, 40, 53, 20))
+ self.sldStepperSpeed = QSlider(self.widget_4)
+ self.sldStepperSpeed.setObjectName(u"sldStepperSpeed")
+ self.sldStepperSpeed.setGeometry(QRect(110, 40, 160, 22))
+ self.sldStepperSpeed.setMinimum(1)
+ self.sldStepperSpeed.setMaximum(3000)
+ self.sldStepperSpeed.setOrientation(Qt.Orientation.Horizontal)
+ self.edtStepperSpeed = QTextEdit(self.widget_4)
+ self.edtStepperSpeed.setObjectName(u"edtStepperSpeed")
+ self.edtStepperSpeed.setGeometry(QRect(290, 30, 41, 31))
+ self.edtStepperSpeed.setReadOnly(True)
+ self.edtStepperCycle = QTextEdit(self.widget_4)
+ self.edtStepperCycle.setObjectName(u"edtStepperCycle")
+ self.edtStepperCycle.setGeometry(QRect(290, 70, 41, 31))
+ self.edtStepperCycle.setReadOnly(True)
+ self.sldStepperCycle = QSlider(self.widget_4)
+ self.sldStepperCycle.setObjectName(u"sldStepperCycle")
+ self.sldStepperCycle.setGeometry(QRect(110, 80, 160, 22))
+ self.sldStepperCycle.setMinimum(0)
+ self.sldStepperCycle.setMaximum(20)
+ self.sldStepperCycle.setOrientation(Qt.Orientation.Horizontal)
+ self.lblStepperCycle = QLabel(self.widget_4)
+ self.lblStepperCycle.setObjectName(u"lblStepperCycle")
+ self.lblStepperCycle.setGeometry(QRect(50, 80, 53, 20))
+ self.lblStepperDir = QLabel(self.widget_4)
+ self.lblStepperDir.setObjectName(u"lblStepperDir")
+ self.lblStepperDir.setGeometry(QRect(50, 120, 53, 20))
+ self.btnStepperAlign = QPushButton(self.widget_4)
+ self.btnStepperAlign.setObjectName(u"btnStepperAlign")
+ self.btnStepperAlign.setGeometry(QRect(260, 170, 71, 23))
+ self.cmbStepperDir = QComboBox(self.widget_4)
+ self.cmbStepperDir.addItem("")
+ self.cmbStepperDir.addItem("")
+ self.cmbStepperDir.setObjectName(u"cmbStepperDir")
+ self.cmbStepperDir.setGeometry(QRect(110, 120, 151, 23))
+ self.btnStepperStart = QPushButton(self.widget_4)
+ self.btnStepperStart.setObjectName(u"btnStepperStart")
+ self.btnStepperStart.setGeometry(QRect(50, 170, 71, 23))
+ self.btnStepperStop = QPushButton(self.widget_4)
+ self.btnStepperStop.setObjectName(u"btnStepperStop")
+ self.btnStepperStop.setGeometry(QRect(150, 170, 71, 23))
+ self.tabServo.addTab(self.tab_2, "")
+
+ self.retranslateUi(pageDebug)
+
+ self.tabServo.setCurrentIndex(3)
+
+
+ QMetaObject.connectSlotsByName(pageDebug)
+ # setupUi
+
+ def retranslateUi(self, pageDebug):
+ pageDebug.setWindowTitle(QCoreApplication.translate("pageDebug", u"Form", None))
+ self.lblConveySpeed.setText(QCoreApplication.translate("pageDebug", u"\u901f\u5ea6", None))
+ self.rdbLeftConveyMotor.setText(QCoreApplication.translate("pageDebug", u"\u4f20\u9001\u5e26\u7535\u673a1", None))
+ self.rdbRightConveyMotor.setText(QCoreApplication.translate("pageDebug", u"\u4f20\u9001\u5e26\u7535\u673a2", None))
+ self.edtConveySpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"
\n"
+"-30
", None))
+ self.edtConveyAcSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"50
", None))
+ self.lblConveyAcSpeed.setText(QCoreApplication.translate("pageDebug", u"\u52a0\u901f\u5ea6", None))
+ self.edtConveyDeSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"50
", None))
+ self.lblConveyDeSpeed.setText(QCoreApplication.translate("pageDebug", u"\u51cf\u901f\u5ea6", None))
+ self.lblConveyAddr.setText(QCoreApplication.translate("pageDebug", u"\u4ece\u673a\u5730\u5740", None))
+ self.edtConveyAddr.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"1
", None))
+ self.btnConveyStart.setText(QCoreApplication.translate("pageDebug", u"\u540c\u6b65\u542f\u52a8", None))
+ self.btnConveyStop.setText(QCoreApplication.translate("pageDebug", u"\u540c\u6b65\u505c\u6b62", None))
+ self.tabServo.setTabText(self.tabServo.indexOf(self.tab_0), QCoreApplication.translate("pageDebug", u"\u4f20\u9001\u5e26\u8c03\u8bd5\u9875\u9762", None))
+ self.lblServoSpeed.setText(QCoreApplication.translate("pageDebug", u"\u901f\u5ea6", None))
+ self.edtServoSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"1500
", None))
+ self.edtServoAcSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"50
", None))
+ self.lblServoAcSpeed.setText(QCoreApplication.translate("pageDebug", u"\u52a0\u901f\u5ea6", None))
+ self.edtServoOriP.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"0
", None))
+ self.lblServoOriP.setText(QCoreApplication.translate("pageDebug", u"\u539f\u70b9\u4f4d\u7f6e", None))
+ self.btnStartRot.setText(QCoreApplication.translate("pageDebug", u"\u65cb\u8f6c\u5230\u7ffb\u8f6c\u4f4d\u7f6e", None))
+ self.btnStartRoi.setText(QCoreApplication.translate("pageDebug", u"\u65cb\u8f6c\u5230\u539f\u70b9", None))
+ self.lblServoRotP.setText(QCoreApplication.translate("pageDebug", u"\u65cb\u8f6c\u4f4d\u7f6e", None))
+ self.edtServoRotP.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"180
", None))
+ self.tabServo.setTabText(self.tabServo.indexOf(self.tab_1), QCoreApplication.translate("pageDebug", u"\u8235\u673a\u8c03\u8bd5\u9875\u9762", None))
+ self.lblDmSpeed.setText(QCoreApplication.translate("pageDebug", u"\u901f\u5ea6", None))
+ self.edtDmSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"30
", None))
+ self.edtDmOriP.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"-282.6
", None))
+ self.lblDmOriP.setText(QCoreApplication.translate("pageDebug", u"\u5438\u9644\u4f4d\u7f6e", None))
+ self.btnStartRoiP.setText(QCoreApplication.translate("pageDebug", u"\u8fd0\u52a8\u5230\u5438\u9644\u4f4d\u7f6e", None))
+ self.btnStartDropP.setText(QCoreApplication.translate("pageDebug", u"\u8fd0\u52a8\u5230\u653e\u7f6e\u4f4d\u7f6e", None))
+ self.lblDmDropP.setText(QCoreApplication.translate("pageDebug", u"\u653e\u7f6e\u4f4d\u7f6e", None))
+ self.edtDmDropP.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"282.6
", None))
+ self.btnStartZero.setText(QCoreApplication.translate("pageDebug", u"\u8bbe\u7f6e\u96f6\u4f4d", None))
+ self.btnReset.setText(QCoreApplication.translate("pageDebug", u"\u590d\u4f4d\u7535\u673a", None))
+ self.tabServo.setTabText(self.tabServo.indexOf(self.tab), QCoreApplication.translate("pageDebug", u"\u8fbe\u5999\u7535\u673a\u8c03\u8bd5\u9875\u9762", None))
+ self.lblStepperSpeed.setText(QCoreApplication.translate("pageDebug", u"\u901f\u5ea6", None))
+ self.edtStepperSpeed.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"2500
", None))
+ self.edtStepperCycle.setHtml(QCoreApplication.translate("pageDebug", u"\n"
+"\n"
+"10
", None))
+ self.lblStepperCycle.setText(QCoreApplication.translate("pageDebug", u"\u8fd0\u52a8\u5708\u6570", None))
+ self.lblStepperDir.setText(QCoreApplication.translate("pageDebug", u"\u8fd0\u52a8\u65b9\u5411", None))
+ self.btnStepperAlign.setText(QCoreApplication.translate("pageDebug", u"\u7ebf\u6761\u5bf9\u9f50", None))
+ self.cmbStepperDir.setItemText(0, QCoreApplication.translate("pageDebug", u"\u6b63\u5411", None))
+ self.cmbStepperDir.setItemText(1, QCoreApplication.translate("pageDebug", u"\u53cd\u5411", None))
+
+ self.btnStepperStart.setText(QCoreApplication.translate("pageDebug", u"\u5f00\u542f", None))
+ self.btnStepperStop.setText(QCoreApplication.translate("pageDebug", u"\u505c\u6b62", None))
+ self.tabServo.setTabText(self.tabServo.indexOf(self.tab_2), QCoreApplication.translate("pageDebug", u"\u6321\u677f\u7535\u673a\u8c03\u8bd5\u9875\u9762", None))
+ # retranslateUi
+
diff --git a/wndMain/pageParaSet/sub_uiParaSet.py b/wndMain/pageParaSet/sub_uiParaSet.py
new file mode 100644
index 0000000..45c851f
--- /dev/null
+++ b/wndMain/pageParaSet/sub_uiParaSet.py
@@ -0,0 +1,42 @@
+# 参数设置内嵌页面子类
+from PySide6.QtWidgets import QWidget
+from PySide6.QtCore import Slot, Qt
+from msg_dict import g_uiGeometrySize
+from wndMain.pageParaSet.uiSub_ParaSet import Ui_pageParaSet
+
+
+class CSubPageParaSetting(QWidget):
+ # public:
+ def __init__(self, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ self.ui = Ui_pageParaSet()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._screenAdapter() # 界面自适应
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ self.ui.tabParaSetting.setGeometry(g_uiGeometrySize['WND_MARGIN_HORI'], g_uiGeometrySize['WND_MARGIN_VERT'],
+ self.szStack[0] - g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ self.szStack[1] - g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
\ No newline at end of file
diff --git a/wndMain/pageParaSet/uiSub_ParaSet.py b/wndMain/pageParaSet/uiSub_ParaSet.py
new file mode 100644
index 0000000..26b2ee2
--- /dev/null
+++ b/wndMain/pageParaSet/uiSub_ParaSet.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_ParaSet.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.3
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QSizePolicy, QTabWidget, QWidget)
+
+class Ui_pageParaSet(object):
+ def setupUi(self, pageParaSet):
+ if not pageParaSet.objectName():
+ pageParaSet.setObjectName(u"pageParaSet")
+ pageParaSet.resize(655, 398)
+ self.tabParaSetting = QTabWidget(pageParaSet)
+ self.tabParaSetting.setObjectName(u"tabParaSetting")
+ self.tabParaSetting.setGeometry(QRect(10, 0, 631, 381))
+ self.tabParaSetting.setTabPosition(QTabWidget.TabPosition.North)
+ self.tab_0 = QWidget()
+ self.tab_0.setObjectName(u"tab_0")
+ self.tabParaSetting.addTab(self.tab_0, "")
+ self.tab_1 = QWidget()
+ self.tab_1.setObjectName(u"tab_1")
+ self.tabParaSetting.addTab(self.tab_1, "")
+
+ self.retranslateUi(pageParaSet)
+
+ self.tabParaSetting.setCurrentIndex(0)
+
+
+ QMetaObject.connectSlotsByName(pageParaSet)
+ # setupUi
+
+ def retranslateUi(self, pageParaSet):
+ pageParaSet.setWindowTitle(QCoreApplication.translate("pageParaSet", u"Form", None))
+ self.tabParaSetting.setTabText(self.tabParaSetting.indexOf(self.tab_0), QCoreApplication.translate("pageParaSet", u"\u53c2\u6570\u9875\u97620", None))
+ self.tabParaSetting.setTabText(self.tabParaSetting.indexOf(self.tab_1), QCoreApplication.translate("pageParaSet", u"\u53c2\u6570\u9875\u97621", None))
+ # retranslateUi
+
diff --git a/wndMain/pagePasswdChange.zip b/wndMain/pagePasswdChange.zip
new file mode 100644
index 0000000..da58e9f
Binary files /dev/null and b/wndMain/pagePasswdChange.zip differ
diff --git a/wndMain/pagePasswdChange/sub_uiPasswdChange.py b/wndMain/pagePasswdChange/sub_uiPasswdChange.py
new file mode 100644
index 0000000..d20ee43
--- /dev/null
+++ b/wndMain/pagePasswdChange/sub_uiPasswdChange.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+# @Time : 2026/3/4 11:14
+# @Author : reenrr
+# @File : sub_uiPasswdChange.py
+# @Desc : 密码修改界面的功能逻辑
+"""
+# 设备调试内嵌页面子类
+from re import T
+from PySide6.QtWidgets import QWidget, QMessageBox, QDialog
+from PySide6.QtCore import Qt, Slot
+from wndMain.pagePasswdChange.uiPasswdChange import Ui_dlgChangePasswd
+from msg_dict import g_uiGeometrySize
+from dbCtrl.clsUserTb import g_userCtrl
+
+class CPasswdChange(QDialog):
+ # public:
+ def __init__(self, userID: str, widgetSize: tuple[int, int]=(375, 293), parent=None):
+ super().__init__(parent)
+ self.ui = Ui_dlgChangePasswd()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+ self.user = userID
+
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+
+ self._screenAdapter() # 界面自适应
+ # self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+
+ self._setCurrentUser() # 设置当前用户
+ self._setupSignalSlotMapping() # 创建信号映射
+
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ # self.ui.widgetPasswdChange.setGeometry(g_uiGeometrySize['WND_MARGIN_HORI'], g_uiGeometrySize['WND_MARGIN_VERT'],
+ # self.szStack[0] - g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ # self.szStack[1] - g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
+
+ # 设置当前用户
+ def _setCurrentUser(self) -> None:
+ self.ui.edtCurrentUser_PasswdChg.setText(self.user)
+ pass
+
+ def _setNewPasswd(self) -> None:
+ # 获取输入的密码
+ origin_passwd = self.ui.edtOrigin_PasswdChg.text() # 原密码
+ new_passwd = self.ui.edtNew_PasswdChg.text() # 新密码
+ confirm_passwd = self.ui.edtConf_PasswdChg.text() # 确认密码
+
+ # 验证输入
+ if not origin_passwd or not new_passwd or not confirm_passwd:
+ QMessageBox.warning(self, "提示", "请填写完整密码信息")
+ return
+
+ # 验证原密码是否正确
+ current_user = self.user
+ stored_passwd = g_userCtrl.getPasswdByUserID(current_user)
+ if origin_passwd != stored_passwd:
+ QMessageBox.warning(self, "提示", "原密码错误")
+ return
+
+ # 验证新密码和确认密码是否一致
+ if new_passwd != confirm_passwd:
+ QMessageBox.warning(self, "提示", "新密码和确认密码不一致")
+ return
+
+ # 更新密码
+ success = g_userCtrl.changePasswd(current_user, new_passwd)
+ if success:
+ QMessageBox.information(self, "提示", "密码修改成功")
+ return True
+ else:
+ QMessageBox.warning(self, "提示", "密码修改失败")
+ return False
+
+
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self) -> None:
+ self.ui.btnDecide_PasswdChg.clicked.connect(self._confChangePasswd)
+
+ # ----------------信号槽接口----------------
+ @Slot()
+ def _confChangePasswd(self) -> None:
+ success = self._setNewPasswd()
+ # 仅在密码修改成功时关闭窗口
+ if success:
+ self.close()
+ pass
+
diff --git a/wndMain/pagePasswdChange/uiPasswdChange.py b/wndMain/pagePasswdChange/uiPasswdChange.py
new file mode 100644
index 0000000..842579c
--- /dev/null
+++ b/wndMain/pagePasswdChange/uiPasswdChange.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiPasswdChange.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QLabel, QLineEdit, QPushButton,
+ QSizePolicy, QWidget)
+
+class Ui_dlgChangePasswd(object):
+ def setupUi(self, dlgChangePasswd):
+ if not dlgChangePasswd.objectName():
+ dlgChangePasswd.setObjectName(u"dlgChangePasswd")
+ dlgChangePasswd.resize(375, 293)
+ self.btnDecide_PasswdChg = QPushButton(dlgChangePasswd)
+ self.btnDecide_PasswdChg.setObjectName(u"btnDecide_PasswdChg")
+ self.btnDecide_PasswdChg.setGeometry(QRect(170, 220, 100, 41))
+ self.btnDecide_PasswdChg.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.edtOrigin_PasswdChg = QLineEdit(dlgChangePasswd)
+ self.edtOrigin_PasswdChg.setObjectName(u"edtOrigin_PasswdChg")
+ self.edtOrigin_PasswdChg.setGeometry(QRect(131, 79, 200, 21))
+ self.edtOrigin_PasswdChg.setMaxLength(30)
+ self.edtOrigin_PasswdChg.setEchoMode(QLineEdit.EchoMode.Password)
+ self.edtConf_PasswdChg = QLineEdit(dlgChangePasswd)
+ self.edtConf_PasswdChg.setObjectName(u"edtConf_PasswdChg")
+ self.edtConf_PasswdChg.setGeometry(QRect(131, 178, 200, 21))
+ self.edtConf_PasswdChg.setMaxLength(30)
+ self.edtConf_PasswdChg.setEchoMode(QLineEdit.EchoMode.Password)
+ self.lblConf_PasswdChg = QLabel(dlgChangePasswd)
+ self.lblConf_PasswdChg.setObjectName(u"lblConf_PasswdChg")
+ self.lblConf_PasswdChg.setGeometry(QRect(50, 180, 60, 16))
+ self.lblCurrentUser_PasswdChg = QLabel(dlgChangePasswd)
+ self.lblCurrentUser_PasswdChg.setObjectName(u"lblCurrentUser_PasswdChg")
+ self.lblCurrentUser_PasswdChg.setGeometry(QRect(50, 35, 60, 16))
+ self.edtNew_PasswdChg = QLineEdit(dlgChangePasswd)
+ self.edtNew_PasswdChg.setObjectName(u"edtNew_PasswdChg")
+ self.edtNew_PasswdChg.setGeometry(QRect(131, 128, 200, 21))
+ self.edtNew_PasswdChg.setMaxLength(30)
+ self.edtNew_PasswdChg.setEchoMode(QLineEdit.EchoMode.Password)
+ self.edtCurrentUser_PasswdChg = QLineEdit(dlgChangePasswd)
+ self.edtCurrentUser_PasswdChg.setObjectName(u"edtCurrentUser_PasswdChg")
+ self.edtCurrentUser_PasswdChg.setEnabled(False)
+ self.edtCurrentUser_PasswdChg.setGeometry(QRect(131, 33, 200, 21))
+ self.edtCurrentUser_PasswdChg.setMaxLength(30)
+ self.edtCurrentUser_PasswdChg.setReadOnly(True)
+ self.lblNew_PasswdChg = QLabel(dlgChangePasswd)
+ self.lblNew_PasswdChg.setObjectName(u"lblNew_PasswdChg")
+ self.lblNew_PasswdChg.setGeometry(QRect(62, 131, 51, 16))
+ self.lblOrigin_PasswdChg = QLabel(dlgChangePasswd)
+ self.lblOrigin_PasswdChg.setObjectName(u"lblOrigin_PasswdChg")
+ self.lblOrigin_PasswdChg.setGeometry(QRect(62, 82, 51, 16))
+
+ self.retranslateUi(dlgChangePasswd)
+
+ QMetaObject.connectSlotsByName(dlgChangePasswd)
+ # setupUi
+
+ def retranslateUi(self, dlgChangePasswd):
+ dlgChangePasswd.setWindowTitle(QCoreApplication.translate("dlgChangePasswd", u"\u767b\u5f55\u5bc6\u7801\u4fee\u6539", None))
+ self.btnDecide_PasswdChg.setText(QCoreApplication.translate("dlgChangePasswd", u"\u786e \u5b9a", None))
+ self.lblConf_PasswdChg.setText(QCoreApplication.translate("dlgChangePasswd", u"\u5bc6\u7801\u786e\u8ba4\uff1a", None))
+ self.lblCurrentUser_PasswdChg.setText(QCoreApplication.translate("dlgChangePasswd", u"\u5f53\u524d\u7528\u6237\uff1a", None))
+ self.lblNew_PasswdChg.setText(QCoreApplication.translate("dlgChangePasswd", u"\u65b0\u5bc6\u7801\uff1a", None))
+ self.lblOrigin_PasswdChg.setText(QCoreApplication.translate("dlgChangePasswd", u"\u539f\u5bc6\u7801\uff1a", None))
+ # retranslateUi
+
diff --git a/wndMain/pageRecipeMgt/sub_uiRecipe.py b/wndMain/pageRecipeMgt/sub_uiRecipe.py
new file mode 100644
index 0000000..36f895f
--- /dev/null
+++ b/wndMain/pageRecipeMgt/sub_uiRecipe.py
@@ -0,0 +1,212 @@
+# 配方管理内嵌页面子类
+from PySide6.QtWidgets import QWidget, QHeaderView, QSpacerItem, QSizePolicy, QVBoxLayout, QMessageBox, QTableWidgetItem
+from PySide6.QtCore import Qt, QObject, QEvent, Slot
+from PySide6.QtGui import QKeyEvent
+from msg_dict import g_uiGeometrySize
+from wndMain.pageRecipeMgt.uiSub_Recipe import Ui_pageRecipe
+from common.generalFunc import CCommon
+from dbCtrl.clsRecipeTb import g_recipeCtrl
+from msg_dict import g_uiCtrlScript
+
+class CSubPageRecipe(QWidget):
+ # public:
+ def __init__(self, userId: str, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ self.creator = userId
+
+ self.ui = Ui_pageRecipe()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._screenAdapter() # 界面自适应
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+
+ self._changeLine_edit() # 设置用户输入限制
+ self._setupSignalSlotMapping() # 创建信号映射 先创建信号映射,再加载配方数据
+ self._loadRecipeData() # 加载配方数据
+ self._changeTableStyle() # 设置表格样式
+
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 配方操作按钮布局
+ def _adjustRecipeOpButtons(self) -> None:
+ nOriginWidth = self.ui.btnAddRecipe.width()
+ nWidthGap = (self.ui.grpRecipeOp.width() - self.ui.btnAddRecipe.width() * 3 - g_uiGeometrySize['WND_MARGIN_HORI'] * 8) / 2
+ rctTemp = [self.ui.btnAddRecipe.geometry(), self.ui.btnDelRecipe.geometry(), self.ui.btnUpdateRecipe.geometry()]
+ rctTemp[0].setLeft(g_uiGeometrySize['WND_MARGIN_HORI'] * 4)
+ rctTemp[0].setWidth(nOriginWidth)
+ self.ui.btnAddRecipe.setGeometry(rctTemp[0])
+ # ------------------------------
+ rctTemp[1].setLeft(rctTemp[0].right() + nWidthGap)
+ rctTemp[1].setWidth(nOriginWidth)
+ self.ui.btnDelRecipe.setGeometry(rctTemp[1])
+ # ------------------------------
+ rctTemp[2].setLeft(rctTemp[1].right() + nWidthGap)
+ rctTemp[2].setWidth(nOriginWidth)
+ self.ui.btnUpdateRecipe.setGeometry(rctTemp[2])
+
+ # 纵向调整子控件高度
+ def _adjustVerticalHeight(self) -> None:
+ nBottomPos = self.geometry().bottom() - g_uiGeometrySize['WND_MARGIN_VERT'] # 获取该子页面底部位置
+ rctTemp = self.ui.tableRecipe.geometry()
+ rctTemp.setBottom(nBottomPos)
+ self.ui.tableRecipe.setGeometry(rctTemp) # 调整配方信息列表的高度
+ # ----------------------------
+ rctTemp = self.ui.grpRecipeDetails.geometry()
+ rctTemp.setBottom(nBottomPos)
+ self.ui.grpRecipeDetails.setGeometry(rctTemp) # 调整配方详细组合框高度
+ # ----------------------------
+ rctOtherTemp = self.ui.lstRecipeDetail.geometry()
+ rctOtherTemp.setHeight(rctTemp.height() - rctOtherTemp.top() - g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ self.ui.lstRecipeDetail.setGeometry(rctOtherTemp)
+
+ def _adjustTableWidth(self) -> None:
+ # 获取表格水平表头
+ header = self.ui.tableRecipe.horizontalHeader()
+ # 第一、二、三列设置最小宽度
+ self.ui.tableRecipe.setColumnWidth(0, 70)
+ self.ui.tableRecipe.setColumnWidth(1, 150)
+ self.ui.tableRecipe.setColumnWidth(2, 150)
+ # 其他列自适应
+ header.setSectionResizeMode(0, QHeaderView.Interactive)
+ header.setSectionResizeMode(1, QHeaderView.Interactive)
+ header.setSectionResizeMode(2, QHeaderView.Interactive)
+ header.setSectionResizeMode(3, QHeaderView.ResizeToContents)
+
+ pass
+
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ self._adjustRecipeOpButtons()
+ self._adjustVerticalHeight()
+ self._adjustTableWidth()
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 修改表格样式
+ def _changeTableStyle(self) -> None:
+ # 禁止所有列宽拖动
+ self.ui.tableRecipe.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
+
+ # 单元格内容居中
+ for row in range(self.ui.tableRecipe.rowCount()):
+ for col in range(self.ui.tableRecipe.columnCount()):
+ item = self.ui.tableRecipe.item(row, col)
+ if item:
+ item.setTextAlignment(Qt.AlignCenter)
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
+
+ # 设置用户输入限制
+ def _changeLine_edit(self) -> None:
+ self.ui.edtRecipeName.installEventFilter(self) # 建立时间触发
+
+ # 添加配方到表格
+ def _addRecipeToTable(self, recipeID: str, createTime: str, updateTime: str, creator: str) -> None:
+ rowPosition = self.ui.tableRecipe.rowCount()
+ self.ui.tableRecipe.insertRow(rowPosition)
+ self.ui.tableRecipe.setItem(rowPosition, 0, QTableWidgetItem(recipeID))
+ self.ui.tableRecipe.setItem(rowPosition, 1, QTableWidgetItem(createTime))
+ self.ui.tableRecipe.setItem(rowPosition, 2, QTableWidgetItem(updateTime))
+ self.ui.tableRecipe.setItem(rowPosition, 3, QTableWidgetItem(creator))
+
+ # 加载配方数据到表格
+ def _loadRecipeData(self) -> None:
+ # 清空表格
+ self.ui.tableRecipe.setRowCount(0)
+ # 加载配方数据
+ recipe_list = g_recipeCtrl.readRecipeID_time_creator()
+ # 填充表格
+ for recipe_info in recipe_list:
+ self._addRecipeToTable(recipe_info[0], recipe_info[1], recipe_info[2], recipe_info[3])
+ # 重新加载表格样式
+ self._changeTableStyle()
+
+
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self) -> None:
+ self.ui.btnAddRecipe.clicked.connect(self._onAddRecipeClicked)
+ self.ui.btnDelRecipe.clicked.connect(self._onDelRecipeClicked)
+
+ pass
+
+ # ---------事件重载---------
+ def eventFilter(self, obj: QObject, event):
+ # 处理对应输入框的键盘事件
+ if obj == self.ui.edtRecipeName and QEvent.Type.KeyPress == event.type():
+ clsKeyEvent = QKeyEvent(event)
+ key = clsKeyEvent.key()
+ modifier = clsKeyEvent.modifiers()
+ key_char = clsKeyEvent.text()
+ return super().eventFilter(obj, event) if CCommon.fnCheckInputValid(key, modifier, key_char) else True
+
+ # 非输入框/非键盘按下事件,按默认逻辑处理
+ return super().eventFilter(obj, event)
+
+ # ----------------信号槽接口----------------
+ @Slot()
+ def _onAddRecipeClicked(self) -> None:
+ # 获取输入的配方名称
+ recipe_name = self.ui.edtRecipeName.text().strip()
+ if not recipe_name:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_INPUT_RECIPE'])
+ return
+
+ # 检查配方名称是否已存在
+ if recipe_name in g_recipeCtrl.readAllRecipeNames():
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_RECIPE_EXIST'])
+ return
+
+ # 添加配方
+ success = g_recipeCtrl.addNewRecipe(recipe_name, self.creator)
+ if success:
+ self._loadRecipeData()
+ # 清空输入框
+ self.ui.edtRecipeName.clear()
+ QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_RECIPE_SUCCESS'])
+ else:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_RECIPE_FAIL'])
+ pass
+ pass
+
+ @Slot()
+ def _onDelRecipeClicked(self) -> None:
+ # 获取选中的行
+ selected_items = self.ui.tableRecipe.selectedItems()
+ if not selected_items:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_SELECT'])
+ return
+
+ # 获取选中的配方名
+ selected_recipes = []
+ for i in range(0, len(selected_items), 4):
+ row = selected_items[i].row()
+ recipe_name = self.ui.tableRecipe.item(row, 0).text()
+ selected_recipes.append(recipe_name)
+
+ # 确认删除
+ reply = QMessageBox.question(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_CONFIRM'].format(len(selected_recipes)),
+ QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ if reply == QMessageBox.Yes:
+ success = g_recipeCtrl.delRecipe(selected_recipes)
+ if success:
+ self._loadRecipeData()
+ QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_SUCCESS'])
+ else:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_RECIPE_FAIL'])
+ pass
+
\ No newline at end of file
diff --git a/wndMain/pageRecipeMgt/uiSub_Recipe.py b/wndMain/pageRecipeMgt/uiSub_Recipe.py
new file mode 100644
index 0000000..79ea0a6
--- /dev/null
+++ b/wndMain/pageRecipeMgt/uiSub_Recipe.py
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_Recipe.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QAbstractItemView, QApplication, QGroupBox, QHeaderView,
+ QLabel, QLineEdit, QListView, QPushButton,
+ QSizePolicy, QTableWidget, QTableWidgetItem, QWidget)
+
+class Ui_pageRecipe(object):
+ def setupUi(self, pageRecipe):
+ if not pageRecipe.objectName():
+ pageRecipe.setObjectName(u"pageRecipe")
+ pageRecipe.resize(1024, 768)
+ self.grpRecipeOp = QGroupBox(pageRecipe)
+ self.grpRecipeOp.setObjectName(u"grpRecipeOp")
+ self.grpRecipeOp.setGeometry(QRect(10, 10, 501, 121))
+ self.lblRecipeName = QLabel(self.grpRecipeOp)
+ self.lblRecipeName.setObjectName(u"lblRecipeName")
+ self.lblRecipeName.setGeometry(QRect(20, 20, 91, 16))
+ self.edtRecipeName = QLineEdit(self.grpRecipeOp)
+ self.edtRecipeName.setObjectName(u"edtRecipeName")
+ self.edtRecipeName.setGeometry(QRect(121, 18, 361, 21))
+ self.edtRecipeName.setMaxLength(30)
+ self.btnAddRecipe = QPushButton(self.grpRecipeOp)
+ self.btnAddRecipe.setObjectName(u"btnAddRecipe")
+ self.btnAddRecipe.setGeometry(QRect(30, 60, 100, 41))
+ self.btnAddRecipe.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnDelRecipe = QPushButton(self.grpRecipeOp)
+ self.btnDelRecipe.setObjectName(u"btnDelRecipe")
+ self.btnDelRecipe.setGeometry(QRect(160, 60, 100, 41))
+ self.btnDelRecipe.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnUpdateRecipe = QPushButton(self.grpRecipeOp)
+ self.btnUpdateRecipe.setObjectName(u"btnUpdateRecipe")
+ self.btnUpdateRecipe.setGeometry(QRect(300, 60, 100, 41))
+ self.btnUpdateRecipe.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.grpRecipeDetails = QGroupBox(pageRecipe)
+ self.grpRecipeDetails.setObjectName(u"grpRecipeDetails")
+ self.grpRecipeDetails.setGeometry(QRect(520, 10, 491, 751))
+ self.lblRecipeDetails = QLabel(self.grpRecipeDetails)
+ self.lblRecipeDetails.setObjectName(u"lblRecipeDetails")
+ self.lblRecipeDetails.setGeometry(QRect(20, 20, 91, 16))
+ self.lstRecipeDetail = QListView(self.grpRecipeDetails)
+ self.lstRecipeDetail.setObjectName(u"lstRecipeDetail")
+ self.lstRecipeDetail.setGeometry(QRect(20, 50, 451, 691))
+ self.tableRecipe = QTableWidget(pageRecipe)
+ if (self.tableRecipe.columnCount() < 4):
+ self.tableRecipe.setColumnCount(4)
+ __qtablewidgetitem = QTableWidgetItem()
+ self.tableRecipe.setHorizontalHeaderItem(0, __qtablewidgetitem)
+ __qtablewidgetitem1 = QTableWidgetItem()
+ self.tableRecipe.setHorizontalHeaderItem(1, __qtablewidgetitem1)
+ __qtablewidgetitem2 = QTableWidgetItem()
+ self.tableRecipe.setHorizontalHeaderItem(2, __qtablewidgetitem2)
+ __qtablewidgetitem3 = QTableWidgetItem()
+ self.tableRecipe.setHorizontalHeaderItem(3, __qtablewidgetitem3)
+ self.tableRecipe.setObjectName(u"tableRecipe")
+ self.tableRecipe.setEnabled(True)
+ self.tableRecipe.setGeometry(QRect(10, 140, 501, 621))
+ self.tableRecipe.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
+ self.tableRecipe.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)
+ self.tableRecipe.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+ self.tableRecipe.setColumnCount(4)
+ self.tableRecipe.horizontalHeader().setMinimumSectionSize(22)
+ self.tableRecipe.horizontalHeader().setStretchLastSection(True)
+ self.tableRecipe.verticalHeader().setStretchLastSection(False)
+
+ self.retranslateUi(pageRecipe)
+
+ QMetaObject.connectSlotsByName(pageRecipe)
+ # setupUi
+
+ def retranslateUi(self, pageRecipe):
+ pageRecipe.setWindowTitle(QCoreApplication.translate("pageRecipe", u"Form", None))
+ self.grpRecipeOp.setTitle("")
+ self.lblRecipeName.setText(QCoreApplication.translate("pageRecipe", u"\u65b0\u5efa\u914d\u65b9\u540d\u79f0\uff1a", None))
+ self.edtRecipeName.setPlaceholderText(QCoreApplication.translate("pageRecipe", u"\u957f\u5ea630\uff0c\u4ec5\u9650\u82f1\u6587\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf", None))
+ self.btnAddRecipe.setText(QCoreApplication.translate("pageRecipe", u"\u65b0\u5efa\u914d\u65b9", None))
+ self.btnDelRecipe.setText(QCoreApplication.translate("pageRecipe", u"\u5220\u9664\u914d\u65b9", None))
+ self.btnUpdateRecipe.setText(QCoreApplication.translate("pageRecipe", u"\u66f4\u65b0\u914d\u65b9", None))
+ self.grpRecipeDetails.setTitle("")
+ self.lblRecipeDetails.setText(QCoreApplication.translate("pageRecipe", u"\u914d\u65b9\u8be6\u7ec6\u53c2\u6570\uff1a", None))
+ ___qtablewidgetitem = self.tableRecipe.horizontalHeaderItem(0)
+ ___qtablewidgetitem.setText(QCoreApplication.translate("pageRecipe", u"\u914d\u65b9\u540d\u79f0", None));
+ ___qtablewidgetitem1 = self.tableRecipe.horizontalHeaderItem(1)
+ ___qtablewidgetitem1.setText(QCoreApplication.translate("pageRecipe", u"\u521b\u5efa\u65f6\u95f4", None));
+ ___qtablewidgetitem2 = self.tableRecipe.horizontalHeaderItem(2)
+ ___qtablewidgetitem2.setText(QCoreApplication.translate("pageRecipe", u"\u66f4\u65b0\u65f6\u95f4", None));
+ ___qtablewidgetitem3 = self.tableRecipe.horizontalHeaderItem(3)
+ ___qtablewidgetitem3.setText(QCoreApplication.translate("pageRecipe", u"\u521b\u5efa\u8005", None));
+ # retranslateUi
+
diff --git a/wndMain/pageUserMgt/sub_uiUser.py b/wndMain/pageUserMgt/sub_uiUser.py
new file mode 100644
index 0000000..2aa70cf
--- /dev/null
+++ b/wndMain/pageUserMgt/sub_uiUser.py
@@ -0,0 +1,182 @@
+# 用户管理内嵌页面子类
+from PySide6.QtWidgets import QWidget, QTableWidgetItem, QMessageBox, QHeaderView
+from PySide6.QtCore import Qt, QObject, QEvent, Slot
+from PySide6.QtGui import QKeyEvent, QHideEvent
+from msg_dict import g_uiGeometrySize
+from wndMain.pageUserMgt.uiSub_User import Ui_pageUser
+from common.generalFunc import CCommon
+from dbCtrl.clsUserTb import g_userCtrl
+from msg_dict import g_uiCtrlScript
+
+class CSubPageUser(QWidget):
+ # public:
+ def __init__(self, widgetSize: tuple[int, int], parent=None):
+ super().__init__(parent)
+ self.ui = Ui_pageUser()
+ self.ui.setupUi(self)
+ # 按需声明对应的成员变量
+ self.szStack = widgetSize
+
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._screenAdapter() # 界面自适应
+ self._changeWndStyle() # 设置成无框架边框
+ self._centerWidget() # 居中显示
+
+ self._changeLine_edit() # 设置用户输入限制
+ self._setupSignalSlotMapping() # 创建信号映射
+ self._loadUserData() # 加载用户数据
+ self._changeTableStyle() # 设置表格样式
+
+ pass
+
+ # ----------------------------------------
+ # private:
+ # 纵向调整子控件高度
+ def _adjustVerticalHeight(self):
+ nBottomPos = self.geometry().bottom() - g_uiGeometrySize['WND_MARGIN_VERT']
+ rctTemp = self.ui.grpUserlist.geometry()
+ rctTemp.setBottom(nBottomPos)
+ self.ui.grpUserlist.setGeometry(rctTemp)
+ # --------------------------------------
+ rctOtherTemp = self.ui.tabUserInfo.geometry()
+ rctOtherTemp.setHeight(rctTemp.height() - rctOtherTemp.top() - g_uiGeometrySize['WND_MARGIN_VERT'] * 3)
+ self.ui.tabUserInfo.setGeometry(rctOtherTemp)
+
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ self.resize(self.szStack[0], self.szStack[1])
+ self._adjustVerticalHeight()
+ pass
+
+ # 修改窗体属性
+ def _changeWndStyle(self) -> None:
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
+ pass
+
+ # 修改表格样式
+ def _changeTableStyle(self) -> None:
+ # 禁止所有列宽拖动
+ self.ui.tabUserInfo.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
+
+ # 单元格内容居中
+ for row in range(self.ui.tabUserInfo.rowCount()):
+ for col in range(self.ui.tabUserInfo.columnCount()):
+ item = self.ui.tabUserInfo.item(row, col)
+ if item:
+ item.setTextAlignment(Qt.AlignCenter)
+
+ # 窗口居中显示
+ def _centerWidget(self) -> None:
+ pass
+
+ # 设置用户输入限制
+ def _changeLine_edit(self) -> None:
+ self.ui.edtUserName.installEventFilter(self) # 建立时间触发
+
+ # 添加用户到表格
+ def _addUserToTable(self, user_id: str, user_type: int, create_date: str) -> None:
+ # 插入新行
+ rowPosition = self.ui.tabUserInfo.rowCount()
+ self.ui.tabUserInfo.insertRow(rowPosition)
+ # 设置用户id
+ self.ui.tabUserInfo.setItem(rowPosition, 0, QTableWidgetItem(user_id))
+ # 设置用户类别
+ self.ui.tabUserInfo.setItem(rowPosition, 1, QTableWidgetItem(user_type))
+ # 设置创建日期
+ self.ui.tabUserInfo.setItem(rowPosition, 2, QTableWidgetItem(create_date))
+
+ pass
+
+ # 加载用户数据到表格
+ def _loadUserData(self) -> None:
+ # 清空表格
+ self.ui.tabUserInfo.setRowCount(0)
+ # 获取所有用户信息
+ user_list = g_userCtrl.readUserId_type_date()
+ # 填充表格
+ for user_info in user_list:
+ self._addUserToTable(user_info[0], user_info[1], user_info[2])
+
+ # 重新加载表格样式
+ self._changeTableStyle()
+
+ pass
+
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self) -> None:
+ self.ui.btnAdd.clicked.connect(self._onAddUserClicked)
+ self.ui.btnDel.clicked.connect(self._onDeleteUserClicked)
+
+ pass
+
+ # ---------事件重载---------
+ def eventFilter(self, obj: QObject, event):
+ # 处理对应输入框的键盘事件
+ if obj == self.ui.edtUserName and QEvent.Type.KeyPress == event.type():
+ clsKeyEvent = QKeyEvent(event)
+ key = clsKeyEvent.key()
+ modifier = clsKeyEvent.modifiers()
+ key_char = clsKeyEvent.text()
+ return super().eventFilter(obj, event) if CCommon.fnCheckInputValid(key, modifier, key_char) else True
+
+ # 非输入框/非键盘按下事件,按默认逻辑处理
+ return super().eventFilter(obj, event)
+
+ # ----------------信号槽接口----------------
+ @Slot()
+ def _onAddUserClicked(self) -> None:
+ # 获取输入的用户名
+ user_name = self.ui.edtUserName.text().strip()
+ if not user_name:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_INPUT_USER'])
+ return
+
+ # 检查用户名是否已存在
+ if user_name in g_userCtrl.readAllUserIDs():
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_USER_EXIST'])
+ return
+
+ # 获取用户类型
+ user_type = 1 if self.ui.rdoTech.isChecked() else 2
+ # 添加用户
+ success = g_userCtrl.addNewUser(user_name, user_type)
+ if success:
+ self._loadUserData()
+ # 清空输入框
+ self.ui.edtUserName.clear()
+ QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_ADD_USER_SUCCESS'])
+ else:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_FAIL'])
+
+ pass
+
+ @Slot()
+ def _onDeleteUserClicked(self) -> None:
+ # 获取选中的行
+ selected_items = self.ui.tabUserInfo.selectedItems()
+ if not selected_items:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_SELECT'])
+ return
+
+ # 获取选中的用户名
+ selected_users = []
+ for i in range(0, len(selected_items), 3):
+ row = selected_items[i].row()
+ user_name = self.ui.tabUserInfo.item(row, 0).text()
+ selected_users.append(user_name)
+
+ # 确认删除
+ reply = QMessageBox.question(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_CONFIRM'].format(len(selected_users)),
+ QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ if reply == QMessageBox.Yes:
+ success = g_userCtrl.delUser(selected_users)
+ if success:
+ self._loadUserData()
+ QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_SUCCESS'])
+ else:
+ QMessageBox.warning(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_DEL_USER_FAIL'])
+ pass
+
\ No newline at end of file
diff --git a/wndMain/pageUserMgt/uiSub_User.py b/wndMain/pageUserMgt/uiSub_User.py
new file mode 100644
index 0000000..25ea006
--- /dev/null
+++ b/wndMain/pageUserMgt/uiSub_User.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiSub_User.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QAbstractItemView, QApplication, QGroupBox, QHeaderView,
+ QLabel, QLineEdit, QPushButton, QRadioButton,
+ QSizePolicy, QTableWidget, QTableWidgetItem, QWidget)
+
+class Ui_pageUser(object):
+ def setupUi(self, pageUser):
+ if not pageUser.objectName():
+ pageUser.setObjectName(u"pageUser")
+ pageUser.setEnabled(True)
+ pageUser.resize(856, 493)
+ self.grpUserInfo = QGroupBox(pageUser)
+ self.grpUserInfo.setObjectName(u"grpUserInfo")
+ self.grpUserInfo.setGeometry(QRect(10, 10, 341, 101))
+ self.lblUserName = QLabel(self.grpUserInfo)
+ self.lblUserName.setObjectName(u"lblUserName")
+ self.lblUserName.setGeometry(QRect(20, 19, 81, 16))
+ self.edtUserName = QLineEdit(self.grpUserInfo)
+ self.edtUserName.setObjectName(u"edtUserName")
+ self.edtUserName.setGeometry(QRect(118, 16, 201, 21))
+ self.edtUserName.setMaxLength(30)
+ self.lblUserType = QLabel(self.grpUserInfo)
+ self.lblUserType.setObjectName(u"lblUserType")
+ self.lblUserType.setGeometry(QRect(20, 60, 91, 16))
+ self.rdoTech = QRadioButton(self.grpUserInfo)
+ self.rdoTech.setObjectName(u"rdoTech")
+ self.rdoTech.setGeometry(QRect(134, 59, 61, 20))
+ self.rdoTech.setChecked(True)
+ self.rdoOperator = QRadioButton(self.grpUserInfo)
+ self.rdoOperator.setObjectName(u"rdoOperator")
+ self.rdoOperator.setGeometry(QRect(214, 59, 61, 20))
+ self.grpUserOp = QGroupBox(pageUser)
+ self.grpUserOp.setObjectName(u"grpUserOp")
+ self.grpUserOp.setGeometry(QRect(10, 120, 341, 71))
+ self.btnAdd = QPushButton(self.grpUserOp)
+ self.btnAdd.setObjectName(u"btnAdd")
+ self.btnAdd.setGeometry(QRect(40, 20, 100, 41))
+ self.btnAdd.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnDel = QPushButton(self.grpUserOp)
+ self.btnDel.setObjectName(u"btnDel")
+ self.btnDel.setGeometry(QRect(190, 20, 100, 41))
+ self.btnDel.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.grpUserlist = QGroupBox(pageUser)
+ self.grpUserlist.setObjectName(u"grpUserlist")
+ self.grpUserlist.setGeometry(QRect(360, 10, 411, 461))
+ self.lblUserlist = QLabel(self.grpUserlist)
+ self.lblUserlist.setObjectName(u"lblUserlist")
+ self.lblUserlist.setGeometry(QRect(20, 20, 61, 16))
+ self.tabUserInfo = QTableWidget(self.grpUserlist)
+ if (self.tabUserInfo.columnCount() < 3):
+ self.tabUserInfo.setColumnCount(3)
+ __qtablewidgetitem = QTableWidgetItem()
+ self.tabUserInfo.setHorizontalHeaderItem(0, __qtablewidgetitem)
+ __qtablewidgetitem1 = QTableWidgetItem()
+ self.tabUserInfo.setHorizontalHeaderItem(1, __qtablewidgetitem1)
+ __qtablewidgetitem2 = QTableWidgetItem()
+ self.tabUserInfo.setHorizontalHeaderItem(2, __qtablewidgetitem2)
+ self.tabUserInfo.setObjectName(u"tabUserInfo")
+ self.tabUserInfo.setEnabled(True)
+ self.tabUserInfo.setGeometry(QRect(20, 40, 371, 411))
+ self.tabUserInfo.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
+ self.tabUserInfo.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)
+ self.tabUserInfo.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+ self.tabUserInfo.setColumnCount(3)
+ self.tabUserInfo.horizontalHeader().setVisible(True)
+ self.tabUserInfo.horizontalHeader().setProperty(u"showSortIndicator", False)
+ self.tabUserInfo.horizontalHeader().setStretchLastSection(True)
+ self.tabUserInfo.verticalHeader().setStretchLastSection(False)
+
+ self.retranslateUi(pageUser)
+
+ QMetaObject.connectSlotsByName(pageUser)
+ # setupUi
+
+ def retranslateUi(self, pageUser):
+ pageUser.setWindowTitle(QCoreApplication.translate("pageUser", u"Form", None))
+ self.grpUserInfo.setTitle("")
+ self.lblUserName.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237\u540d\uff1a", None))
+ self.edtUserName.setPlaceholderText(QCoreApplication.translate("pageUser", u"\u957f\u5ea630\uff0c\u4ec5\u9650\u82f1\u6587\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf", None))
+ self.lblUserType.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237\u7c7b\u522b\uff1a", None))
+ self.rdoTech.setText(QCoreApplication.translate("pageUser", u"\u6280\u672f\u5458", None))
+ self.rdoOperator.setText(QCoreApplication.translate("pageUser", u"\u64cd\u4f5c\u5458", None))
+ self.grpUserOp.setTitle("")
+ self.btnAdd.setText(QCoreApplication.translate("pageUser", u"\u65b0\u589e\u7528\u6237", None))
+ self.btnDel.setText(QCoreApplication.translate("pageUser", u"\u5220\u9664\u7528\u6237", None))
+ self.grpUserlist.setTitle("")
+ self.lblUserlist.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u5217\u8868\uff1a", None))
+ ___qtablewidgetitem = self.tabUserInfo.horizontalHeaderItem(0)
+ ___qtablewidgetitem.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u540d", None));
+ ___qtablewidgetitem1 = self.tabUserInfo.horizontalHeaderItem(1)
+ ___qtablewidgetitem1.setText(QCoreApplication.translate("pageUser", u"\u7528\u6237\u7c7b\u578b", None));
+ ___qtablewidgetitem2 = self.tabUserInfo.horizontalHeaderItem(2)
+ ___qtablewidgetitem2.setText(QCoreApplication.translate("pageUser", u"\u521b\u5efa\u65f6\u95f4", None));
+ # retranslateUi
+
diff --git a/wndMain/statusBarView/vwStatusBar.py b/wndMain/statusBarView/vwStatusBar.py
new file mode 100644
index 0000000..7d5f988
--- /dev/null
+++ b/wndMain/statusBarView/vwStatusBar.py
@@ -0,0 +1,20 @@
+# 该视图类用于更新主界面的状态栏
+
+class CStatusbarView:
+ # private:
+ _lblObject = None # 状态栏单元格
+ _strScript = '' # 状态栏单元格显示文本
+ # public:
+ # 更新状态栏指定单元格
+ @classmethod
+ def fnRefreshGridScript(cls, obj, txt) -> None:
+ cls._lblObject = obj
+ cls._strScript = txt
+ cls._lblObject.setText(cls._strScript)
+
+ # 获取状态栏指定单元格文本
+ @classmethod
+ def fnGetGridScript(cls, obj) -> str:
+ cls._lblObject = obj
+ cls._strScript = cls._lblObject.text()
+ return cls._strScript
\ No newline at end of file
diff --git a/wndMain/sub_uiMain.py b/wndMain/sub_uiMain.py
new file mode 100644
index 0000000..318e854
--- /dev/null
+++ b/wndMain/sub_uiMain.py
@@ -0,0 +1,363 @@
+# 主控界面子类
+import time
+
+from PySide6.QtCore import Qt, QRect, QTimer, QPoint, Slot
+from PySide6.QtGui import QCloseEvent
+from PySide6.QtWidgets import QMainWindow, QStatusBar, QLabel, QVBoxLayout, QMessageBox, QApplication, QDialog
+
+from .pageDataQuery.sub_uiQuery import CSubPageQuery
+from .pageDevDebug.sub_uiDevDebug import CSubPageDevDebug
+from .pageParaSet.sub_uiParaSet import CSubPageParaSetting
+from .pageRecipeMgt.sub_uiRecipe import CSubPageRecipe
+from .pageUserMgt.sub_uiUser import CSubPageUser
+from .uiMain import Ui_dlgMain
+from .pageAutoPage.sub_uiAutoPage import CSubPageAutoProc
+from common.generalFunc import CCommon
+from common.allTypesEnum import EOSType, ESubPageType
+from .statusBarView.vwStatusBar import CStatusbarView
+from .funcBarView.vwFunctionBar import CFunctionBarView
+from .pagePasswdChange.sub_uiPasswdChange import CPasswdChange
+from .pagePasswdChange.uiPasswdChange import Ui_dlgChangePasswd
+from wndCtrl.stateCtrl.clsSysState_autoproc import CStateAutoProc
+from msg_dict import g_uiCtrlScript, g_uiGeometrySize, g_otherScripts, g_errMsgText
+
+
+# 根据系统平台类型,调整屏幕尺寸高宽比例
+def getSizeRatio(osType: EOSType) -> list:
+ if EOSType.MACOS == osType:
+ lstRatio = [1.0, 0.88]
+ elif EOSType.LINUX == osType:
+ lstRatio = [0.9, 1.0]
+ else:
+ lstRatio = [1.0, 1.0]
+ return lstRatio
+
+class CSubUiMain(QMainWindow):
+ _m_nTimeCount = 0 #用作定时器,每秒计数
+ # public:
+ def __init__(self, userId: str, userType: str, parent=None):
+ super().__init__(parent)
+ # 挂载UI界面:将当前业务类实例传入setupUi,UI组件成为实例属性
+ self.ui = Ui_dlgMain()
+ self.ui.setupUi(self)
+ # 获取屏幕分辨率
+ self._m_arrScreen = CCommon.fnGetScreenRate()
+ # 按需声明对应的成员变量
+ self._m_status = None # 状态栏对象
+ self._m_bQuitType = True # 退出方式,True:完全退出系统 False:返回到登录窗口
+ self._m_currentUser = [userId, userType]
+ pass
+
+ # 界面初始化
+ def uiInit(self) -> None:
+ self._createStatusLabels() # 创建状态栏显示标签
+ self._initStatusBar() # 创建并初始化状态栏
+ self._screenAdapter() # 界面自适应
+ # ---------------------------
+ self._createSubPages((int(self.ui.stkMainContainer.width()), int(self.ui.stkMainContainer.height()))) # 创建功能子页面
+ self._add2StackWidget() # 添加到容器
+ self._adjustRdoButtons() # 调整功能框单选按钮布局
+ # 添加其他和界面或控件初始化相关的操作
+ self.setWindowTitle(g_uiCtrlScript['WND_TITLE_MAIN']) #设置窗口标题
+ self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True) # 设置当窗口close时,确保关闭即销毁窗口
+ self._changeWndStyle() # 修改窗体属性
+ # ----------------------------
+ self._createFuncBarView() # 初始化功能区更新视图
+ self._updateFuncBar(CStatusbarView.fnGetGridScript(self.lblMainVariableItems[2])) # 根据当前登录用户类别,刷新功能区状态
+ # ----------------------------
+ self._createTimer() # 创建定时器
+ # ---------------------------------------------------------------
+ self._setupSignalSlotMapping() # 创建信号映射
+ self.m_timer.start()
+ pass
+
+ # private:
+ #------------------------------------------------------------------------------------------------------------
+ # 界面自适应
+ def _screenAdapter(self) -> None:
+ fRatio = getSizeRatio(EOSType.MACOS) # 屏幕尺寸高宽调整比例
+ realSize = (self._m_arrScreen[0] * fRatio[0], self._m_arrScreen[1] * fRatio[1])
+ self.setFixedSize(int(realSize[0]), int(realSize[1]))
+ rctGroups = self._adjustGroupBox(realSize) # 调整主界面上面和左侧的组合框
+ self._adjustButtonAboutUser(rctGroups[2]) # 调整上面最右侧组合框中的按钮布局
+ self._adjustStackPage(rctGroups[3], rctGroups[2]) #调整右侧窗口容器空间
+ self._adjustCapacityStatisticsCtrl() # 调整产能统计相关控件的布局
+ pass
+
+ # 组合框自适应
+ def _adjustGroupBox(self, screenSize: tuple[float, float]) -> list:
+ nTopGroupBoxHeight = int(screenSize[1] / 8)
+ # 设置上面第一个组合框大小
+ rctTemp: list[QRect] = [QRect(), QRect(), QRect(), QRect()]
+ rctTemp[0].setTop(g_uiGeometrySize['WND_MARGIN_VERT'])
+ rctTemp[0].setLeft(g_uiGeometrySize['WND_MARGIN_HORI'])
+ rctTemp[0].setHeight(nTopGroupBoxHeight)
+ rctTemp[0].setWidth(int(screenSize[0] / 3))
+ self.ui.grpMainSysInfo_0.setGeometry(rctTemp[0])
+ # ---------------------------------
+ # 设置上面第二个组合框大小
+ rctTemp[1].setTop(g_uiGeometrySize['WND_MARGIN_VERT'])
+ rctTemp[1].setLeft(rctTemp[0].right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ rctTemp[1].setHeight(nTopGroupBoxHeight)
+ rctTemp[1].setWidth(int(rctTemp[0].width() * 5 / 3))
+ self.ui.grpMainSysInfo_1.setGeometry(rctTemp[1])
+ # 设置上面第三个组合框大小
+ rctTemp[2].setTop(g_uiGeometrySize['WND_MARGIN_VERT'])
+ rctTemp[2].setLeft(rctTemp[1].right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ rctTemp[2].setHeight(nTopGroupBoxHeight)
+ rctTemp[2].setWidth(screenSize[0] - rctTemp[0].width() - rctTemp[1].width() - g_uiGeometrySize['WND_MARGIN_HORI'] * 3)
+ self.ui.grpMainForUser.setGeometry(rctTemp[2])
+ # 设置功能组合框位置大小
+ rctTemp[3] = self.ui.grpMainModule.geometry()
+ rctTemp[3].setTop(rctTemp[0].bottom() + g_uiGeometrySize['WND_MARGIN_VERT'])
+ rctTemp[3].setLeft(rctTemp[0].left())
+ rctTemp[3].setHeight(screenSize[1] - g_uiGeometrySize['WND_MARGIN_VERT'] * 2 - rctTemp[0].height() - self._m_status.height())
+ self.ui.grpMainModule.setGeometry(rctTemp[3])
+ return rctTemp
+
+ # 用户切换和修改密码按钮自适应
+ def _adjustButtonAboutUser(self, rctSize: QRect) -> None:
+ nBtnHeight: int = (rctSize.height() - g_uiGeometrySize['WND_MARGIN_VERT'] * 6) / 2
+ nBtnWidth: int = rctSize.width() - g_uiGeometrySize['WND_MARGIN_HORI'] * 4
+ rctBtn = QRect()
+ rctBtn.setLeft(g_uiGeometrySize['WND_MARGIN_HORI'] * 2)
+ rctBtn.setTop(g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ rctBtn.setWidth(nBtnWidth)
+ rctBtn.setHeight(nBtnHeight)
+ self.ui.btnMainSwitchUser.setGeometry(rctBtn)
+ #---------------------------
+ nTempHeight = rctBtn.height()
+ rctBtn.setTop(g_uiGeometrySize['WND_MARGIN_VERT'] * 4 + rctBtn.height())
+ rctBtn.setHeight(nTempHeight)
+ self.ui.btnMainChangePasswd.setGeometry(rctBtn)
+ pass
+
+ # 子页面堆栈控件自适应
+ def _adjustStackPage(self, rctFuncGrp: QRect, rctUserGrp: QRect) -> None:
+ rctStack = self.ui.stkMainContainer.geometry()
+ rctStack.setLeft(rctFuncGrp.right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ rctStack.setTop(rctFuncGrp.top())
+ rctStack.setHeight(rctFuncGrp.height())
+ rctStack.setRight(rctUserGrp.right())
+ self.ui.stkMainContainer.setGeometry(rctStack)
+
+ # 功能组合框,单选按钮自适应排列
+ def _adjustRdoButtons(self) -> None:
+ layVert = QVBoxLayout()
+ layVert.addWidget(self.ui.rdbMainAutoProc, alignment=Qt.AlignmentFlag.AlignHCenter)
+ layVert.addWidget(self.ui.rdbMainDebug, alignment=Qt.AlignmentFlag.AlignHCenter)
+ layVert.addWidget(self.ui.rdbMainSetting, alignment=Qt.AlignmentFlag.AlignHCenter)
+ layVert.addWidget(self.ui.rdbMainQuery, alignment=Qt.AlignmentFlag.AlignHCenter)
+ layVert.addWidget(self.ui.rdbMainRecipe, alignment=Qt.AlignmentFlag.AlignHCenter)
+ layVert.addWidget(self.ui.rdbMainUser, alignment=Qt.AlignmentFlag.AlignHCenter)
+ # 计算组合框内radiobutton之间的垂直间距
+ grpHeight = self.ui.grpMainModule.geometry().height()
+ nHeightGap = (grpHeight - g_uiGeometrySize['WND_MARGIN_VERT'] * 4 -
+ self.ui.rdbMainDebug.height() * 6) / 5
+ layVert.setSpacing(nHeightGap)
+ layVert.setContentsMargins(g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ g_uiGeometrySize['WND_MARGIN_VERT'] * 2,
+ g_uiGeometrySize['WND_MARGIN_HORI'] * 2,
+ g_uiGeometrySize['WND_MARGIN_VERT'] * 2)
+ self.ui.grpMainModule.setLayout(layVert)
+
+ # 产能统计控件布局排列
+ def _adjustCapacityStatisticsCtrl(self) -> None:
+ nSizeArr = (self.ui.grpMainSysInfo_0.geometry().width(), self.ui.grpMainSysInfo_0.geometry().height())
+ # 计算控件之间的排列间隔宽度
+ nGapWidth = (nSizeArr[0] - g_uiGeometrySize['WND_MARGIN_VERT'] * 7 - self.ui.lblMainWoodTotal.width()
+ - self.ui.lblMainWoodNG.width() - self.ui.lblMainPassRate.width() - self.ui.edtMainWoodNG.width() * 3) / 2
+ # 根据组合框的宽高,布局内部控件
+ ptPosition = [QPoint(), QPoint(),] # 0: 给label 1:给editbox
+ ptPosition[0].setY(nSizeArr[1] / 2 - g_uiGeometrySize['WND_MARGIN_VERT']) # 设置第一个label的高度位置
+ ptPosition[0].setX(g_uiGeometrySize['WND_MARGIN_HORI'] * 2) # 设置第一个label的水平位置
+ nTempCtrlSize = [self.ui.lblMainWoodTotal.width(), self.ui.lblMainWoodTotal.height(),] # 临时存储控件的宽高
+ self.ui.lblMainWoodTotal.setGeometry(ptPosition[0].x(), ptPosition[0].y(), nTempCtrlSize[0], nTempCtrlSize[1])
+ # -----------------------------------------------------------
+ rctTemp = self.ui.lblMainWoodTotal.geometry()
+ nLabelTop = rctTemp.top()
+ ptPosition[1].setX(rctTemp.right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ ptPosition[1].setY(rctTemp.top() - g_uiGeometrySize['WND_MARGIN_VERT'] / 2)
+ nTempWidth = self.ui.edtMainWoodTotal.width()
+ nTempHeight = self.ui.edtMainWoodTotal.height()
+ self.ui.edtMainWoodTotal.setGeometry(ptPosition[1].x(), ptPosition[1].y(), nTempWidth, nTempHeight)
+ # -----------------------------------------------------------
+ rctTemp = self.ui.edtMainWoodTotal.geometry()
+ nEditTop = rctTemp.top()
+ ptPosition[0].setX(rctTemp.right() + nGapWidth)
+ ptPosition[0].setY(nLabelTop)
+ nTempCtrlSize[0] = self.ui.lblMainWoodNG.width()
+ nTempCtrlSize[1] = self.ui.lblMainWoodNG.height()
+ self.ui.lblMainWoodNG.setGeometry(ptPosition[0].x(), ptPosition[0].y(), nTempCtrlSize[0], nTempCtrlSize[1])
+ # -----------------------------------------------------------
+ rctTemp = self.ui.lblMainWoodNG.geometry()
+ ptPosition[1].setX(rctTemp.right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ ptPosition[1].setY(nEditTop)
+ self.ui.edtMainWoodNG.setGeometry(ptPosition[1].x(), ptPosition[1].y(), nTempWidth, nTempHeight)
+ # -----------------------------------------------------------
+ rctTemp = self.ui.edtMainWoodNG.geometry()
+ ptPosition[0].setX(rctTemp.right() + nGapWidth)
+ nTempCtrlSize[0] = self.ui.lblMainPassRate.width()
+ nTempCtrlSize[1] = self.ui.lblMainPassRate.height()
+ self.ui.lblMainPassRate.setGeometry(ptPosition[0].x(), ptPosition[0].y(), nTempCtrlSize[0], nTempCtrlSize[1])
+ # -----------------------------------------------------------
+ rctTemp = self.ui.lblMainPassRate.geometry()
+ ptPosition[1].setX(rctTemp.right() + g_uiGeometrySize['WND_MARGIN_HORI'])
+ self.ui.edtMainPassRate.setGeometry(ptPosition[1].x(), ptPosition[1].y(), nTempWidth, nTempHeight)
+ pass
+
+ #------------------------------------------------------------------------------------------------------------
+ # 创建子页面实体
+ def _createSubPages(self, szStack: tuple[int, int]) -> None:
+ # 在此处添加每个子页面
+ self.m_subPages = (CSubPageAutoProc(szStack, self), CSubPageDevDebug(szStack, self),
+ CSubPageParaSetting(szStack, self), CSubPageQuery(szStack, self),
+ CSubPageRecipe(self._m_currentUser[0], szStack, self), CSubPageUser(szStack, self))
+ for item in self.m_subPages:
+ item.uiInit()
+
+ # 将子页面添加到堆栈控件中
+ def _add2StackWidget(self):
+ for item in self.m_subPages:
+ self.ui.stkMainContainer.addWidget(item)
+ self.ui.stkMainContainer.setCurrentWidget(self.m_subPages[0])
+ #------------------------------------------------------------------------------------------------------------
+ # 修改窗体属性
+ def _changeWndStyle(self):
+ self.setWindowFlags(Qt.WindowType.Dialog | Qt.WindowType.CustomizeWindowHint |
+ Qt.WindowType.WindowTitleHint | Qt.WindowType.WindowCloseButtonHint |
+ Qt.WindowType.WindowMinimizeButtonHint)
+ pass
+
+ # 创建状态栏
+ def _initStatusBar(self):
+ self._m_status = QStatusBar(self)
+ self._m_status.setSizeGripEnabled(True)
+ self.setStatusBar(self._m_status)
+ # 添加标签到状态栏,用分隔符区分
+ nScan: int = 0
+ while 4 > nScan:
+ self._m_status.addWidget(self.lblMainConstStatusItems[nScan])
+ self._m_status.addWidget(self.lblMainVariableItems[nScan])
+ self._m_status.addWidget(QLabel(g_otherScripts['OTHER_SEPARATOR']))
+ nScan += 1
+ else:
+ self._m_status.addWidget(self.lblMainConstStatusItems[4])
+ self._m_status.addWidget(self.lblMainVariableItems[4])
+ # 更新状态栏中的当前登录用户和用户类别
+ CStatusbarView.fnRefreshGridScript(self.lblMainVariableItems[1], self._m_currentUser[0])
+ CStatusbarView.fnRefreshGridScript(self.lblMainVariableItems[2], self._m_currentUser[1])
+ # 更新当前作业状态
+ CStatusbarView.fnRefreshGridScript(self.lblMainVariableItems[3], g_otherScripts['OTHER_PROC_STATE_0'])
+ pass
+
+ # 创建状态显示标签
+ def _createStatusLabels(self) -> None:
+ self.lblMainConstStatusItems = (QLabel(g_uiCtrlScript['WND_STATUSBAR_0']), QLabel(g_uiCtrlScript['WND_STATUSBAR_1']), QLabel(g_uiCtrlScript['WND_STATUSBAR_2']), QLabel(g_uiCtrlScript['WND_STATUSBAR_3']), QLabel(g_uiCtrlScript['WND_STATUSBAR_4']))
+ self.lblMainVariableItems = [QLabel(''), QLabel(''), QLabel(''), QLabel(''), QLabel('')]
+ # --------------------------------------------
+ # 创建主界面功能区视图类
+ def _createFuncBarView(self) -> None:
+ lstRdoButtons: list = [self.ui.rdbMainAutoProc, self.ui.rdbMainDebug, self.ui.rdbMainSetting, self.ui.rdbMainQuery,
+ self.ui.rdbMainRecipe, self.ui.rdbMainUser]
+ self._m_vwUpdatingFuncBar = CFunctionBarView(lstRdoButtons) # 声明功能区视图
+
+ # 更新功能区控件状态
+ def _updateFuncBar(self, userType: str) -> None:
+ self._m_vwUpdatingFuncBar.setCtrlsEnabled(userType)
+ if userType == g_uiCtrlScript['CTRL_USER_TYPE_ADMIN']:
+ self.ui.rdbMainQuery.setChecked(True)
+ self._setPageVisibleProperty(ESubPageType.DATAQUERY.value[0])
+ # --------------------------------------------
+ # 创建定时器
+ def _createTimer(self) -> None:
+ self.m_timer = QTimer(self)
+ self.m_timer.setTimerType(Qt.TimerType.PreciseTimer)
+ self.m_timer.setInterval(100)
+
+ #--------------------------------------------
+ # 内嵌页面跳转处理
+ def _setPageVisibleProperty(self, pageType: int) -> None:
+ self.ui.stkMainContainer.setCurrentWidget(self.m_subPages[pageType])
+
+ # 建立信号槽连接
+ def _setupSignalSlotMapping(self) -> None:
+ self.m_timer.timeout.connect(self._onTimer) # 定时器信号
+ self.ui.rdbMainAutoProc.toggled.connect(self._onClickRdoButton)
+ self.ui.rdbMainDebug.toggled.connect(self._onClickRdoButton)
+ self.ui.rdbMainSetting.toggled.connect(self._onClickRdoButton)
+ self.ui.rdbMainQuery.toggled.connect(self._onClickRdoButton)
+ self.ui.rdbMainRecipe.toggled.connect(self._onClickRdoButton)
+ self.ui.rdbMainUser.toggled.connect(self._onClickRdoButton)
+ self.ui.btnMainSwitchUser.clicked.connect(self._onClickBtnSwitchUser)
+ self.ui.btnMainChangePasswd.clicked.connect(self._onClickBtnChangePasswd)
+ pass
+
+ # 主界面退出流程
+ def _quitMainWndProc(self, bQuitType: bool) -> None:
+ # 先获取登录窗口引用
+ dlgParent = self.parentWidget()
+ # 销毁主窗口,显示登录窗口
+ self.m_timer.stop() # 停止计时器
+ time.sleep(0.03) # 等待其他操作执行结束
+ self.close()
+ # 显示之前的登录窗口
+ if bQuitType:
+ QApplication.instance().quit()
+ else:
+ dlgParent.show()
+
+ # ----------------事件重载----------------
+ def closeEvent(self, event: QCloseEvent) -> None:
+ if CStateAutoProc.getProcState():
+ QMessageBox.information(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_errMsgText['ERR_AUTOPROC_BUSY'])
+ event.ignore()
+ else:
+ reply = QMessageBox.question(self, g_uiCtrlScript['MSG_TITLE_TIPS'], g_uiCtrlScript['MSG_SCRIPT_CONFIRM'],
+ QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No)
+ if reply == QMessageBox.StandardButton.Yes:
+ self._quitMainWndProc(self._m_bQuitType)
+ event.accept()
+ else: event.ignore()
+
+ # ----------------信号槽接口----------------
+ @Slot()
+ def _onTimer(self):
+ # 定时器响应消息
+ if 10 == CSubUiMain._m_nTimeCount:
+ self.lblMainVariableItems[0].setText(CCommon.fnGetCurrentTime())
+ CSubUiMain._m_nTimeCount = 0
+ CSubUiMain._m_nTimeCount += 1
+ # 读取io状态
+ # g_warnState.setIOReadingException(g_emv.readIO(), g_emv.getIOErrMessage()) # 将反馈结果同步到报警器
+
+ @Slot()
+ def _onClickRdoButton(self):
+ # 单选按钮关联信号接口
+ selRdo = self.sender()
+ strName: str = selRdo.objectName()
+ if 'rdbMainAutoProc' == strName and self.ui.rdbMainAutoProc.isChecked():
+ self._setPageVisibleProperty(ESubPageType.AUTOPROC.value[0])
+ elif 'rdbMainDebug' == strName and self.ui.rdbMainDebug.isChecked():
+ self._setPageVisibleProperty(ESubPageType.DEVDEBUG.value[0])
+ elif 'rdbMainSetting' == strName and self.ui.rdbMainSetting.isChecked():
+ self._setPageVisibleProperty(ESubPageType.PARASETTING.value[0])
+ elif 'rdbMainQuery' == strName and self.ui.rdbMainQuery.isChecked():
+ self._setPageVisibleProperty(ESubPageType.DATAQUERY.value[0])
+ elif 'rdbMainRecipe' == strName and self.ui.rdbMainRecipe.isChecked():
+ self._setPageVisibleProperty(ESubPageType.RECIPEMANAGE.value[0])
+ elif 'rdbMainUser' == strName and self.ui.rdbMainUser.isChecked():
+ self._setPageVisibleProperty(ESubPageType.USERMANAGE.value[0])
+
+ @Slot()
+ def _onClickBtnSwitchUser(self):
+ self._m_bQuitType = False
+ self.close()
+ pass
+
+ @Slot()
+ def _onClickBtnChangePasswd(self):
+ passwd_dlg = CPasswdChange(self._m_currentUser[0], parent=self)
+ passwd_dlg.uiInit()
+ passwd_dlg.exec()
+ pass
\ No newline at end of file
diff --git a/wndMain/uiMain.py b/wndMain/uiMain.py
new file mode 100644
index 0000000..0d985e5
--- /dev/null
+++ b/wndMain/uiMain.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'uiMain.ui'
+##
+## Created by: Qt User Interface Compiler version 6.9.3
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QGroupBox, QLabel, QLineEdit,
+ QPushButton, QRadioButton, QSizePolicy, QStackedWidget,
+ QWidget)
+
+class Ui_dlgMain(object):
+ def setupUi(self, dlgMain):
+ if not dlgMain.objectName():
+ dlgMain.setObjectName(u"dlgMain")
+ dlgMain.resize(1024, 768)
+ self.grpMainSysInfo_0 = QGroupBox(dlgMain)
+ self.grpMainSysInfo_0.setObjectName(u"grpMainSysInfo_0")
+ self.grpMainSysInfo_0.setGeometry(QRect(10, 10, 400, 140))
+ self.lblMainWoodTotal = QLabel(self.grpMainSysInfo_0)
+ self.lblMainWoodTotal.setObjectName(u"lblMainWoodTotal")
+ self.lblMainWoodTotal.setGeometry(QRect(20, 40, 31, 16))
+ self.edtMainWoodTotal = QLineEdit(self.grpMainSysInfo_0)
+ self.edtMainWoodTotal.setObjectName(u"edtMainWoodTotal")
+ self.edtMainWoodTotal.setGeometry(QRect(69, 37, 60, 21))
+ self.edtMainWoodTotal.setMaxLength(5)
+ self.edtMainWoodTotal.setEchoMode(QLineEdit.EchoMode.Normal)
+ self.edtMainWoodTotal.setAlignment(Qt.AlignmentFlag.AlignCenter)
+ self.edtMainWoodTotal.setReadOnly(True)
+ self.lblMainWoodNG = QLabel(self.grpMainSysInfo_0)
+ self.lblMainWoodNG.setObjectName(u"lblMainWoodNG")
+ self.lblMainWoodNG.setGeometry(QRect(190, 40, 41, 16))
+ self.edtMainWoodNG = QLineEdit(self.grpMainSysInfo_0)
+ self.edtMainWoodNG.setObjectName(u"edtMainWoodNG")
+ self.edtMainWoodNG.setGeometry(QRect(250, 40, 60, 21))
+ self.edtMainWoodNG.setMaxLength(3)
+ self.edtMainWoodNG.setAlignment(Qt.AlignmentFlag.AlignCenter)
+ self.edtMainWoodNG.setReadOnly(True)
+ self.lblMainPassRate = QLabel(self.grpMainSysInfo_0)
+ self.lblMainPassRate.setObjectName(u"lblMainPassRate")
+ self.lblMainPassRate.setGeometry(QRect(30, 90, 51, 16))
+ self.edtMainPassRate = QLineEdit(self.grpMainSysInfo_0)
+ self.edtMainPassRate.setObjectName(u"edtMainPassRate")
+ self.edtMainPassRate.setGeometry(QRect(100, 90, 60, 21))
+ self.edtMainPassRate.setMaxLength(5)
+ self.edtMainPassRate.setAlignment(Qt.AlignmentFlag.AlignCenter)
+ self.edtMainPassRate.setReadOnly(True)
+ self.grpMainSysInfo_1 = QGroupBox(dlgMain)
+ self.grpMainSysInfo_1.setObjectName(u"grpMainSysInfo_1")
+ self.grpMainSysInfo_1.setGeometry(QRect(419, 10, 440, 140))
+ self.grpMainForUser = QGroupBox(dlgMain)
+ self.grpMainForUser.setObjectName(u"grpMainForUser")
+ self.grpMainForUser.setGeometry(QRect(870, 10, 140, 140))
+ self.btnMainSwitchUser = QPushButton(self.grpMainForUser)
+ self.btnMainSwitchUser.setObjectName(u"btnMainSwitchUser")
+ self.btnMainSwitchUser.setGeometry(QRect(30, 20, 95, 25))
+ self.btnMainSwitchUser.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.btnMainChangePasswd = QPushButton(self.grpMainForUser)
+ self.btnMainChangePasswd.setObjectName(u"btnMainChangePasswd")
+ self.btnMainChangePasswd.setGeometry(QRect(30, 70, 95, 25))
+ self.btnMainChangePasswd.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
+ self.grpMainModule = QGroupBox(dlgMain)
+ self.grpMainModule.setObjectName(u"grpMainModule")
+ self.grpMainModule.setGeometry(QRect(10, 159, 131, 580))
+ self.rdbMainAutoProc = QRadioButton(self.grpMainModule)
+ self.rdbMainAutoProc.setObjectName(u"rdbMainAutoProc")
+ self.rdbMainAutoProc.setGeometry(QRect(20, 20, 90, 24))
+ self.rdbMainAutoProc.setChecked(True)
+ self.rdbMainDebug = QRadioButton(self.grpMainModule)
+ self.rdbMainDebug.setObjectName(u"rdbMainDebug")
+ self.rdbMainDebug.setGeometry(QRect(20, 100, 90, 24))
+ self.rdbMainSetting = QRadioButton(self.grpMainModule)
+ self.rdbMainSetting.setObjectName(u"rdbMainSetting")
+ self.rdbMainSetting.setGeometry(QRect(20, 180, 90, 24))
+ self.rdbMainQuery = QRadioButton(self.grpMainModule)
+ self.rdbMainQuery.setObjectName(u"rdbMainQuery")
+ self.rdbMainQuery.setGeometry(QRect(20, 250, 90, 24))
+ self.rdbMainRecipe = QRadioButton(self.grpMainModule)
+ self.rdbMainRecipe.setObjectName(u"rdbMainRecipe")
+ self.rdbMainRecipe.setGeometry(QRect(20, 330, 90, 24))
+ self.rdbMainUser = QRadioButton(self.grpMainModule)
+ self.rdbMainUser.setObjectName(u"rdbMainUser")
+ self.rdbMainUser.setGeometry(QRect(20, 400, 90, 24))
+ self.stkMainContainer = QStackedWidget(dlgMain)
+ self.stkMainContainer.setObjectName(u"stkMainContainer")
+ self.stkMainContainer.setGeometry(QRect(389, 339, 121, 81))
+ self.page = QWidget()
+ self.page.setObjectName(u"page")
+ self.stkMainContainer.addWidget(self.page)
+ self.page_2 = QWidget()
+ self.page_2.setObjectName(u"page_2")
+ self.stkMainContainer.addWidget(self.page_2)
+
+ self.retranslateUi(dlgMain)
+
+ self.stkMainContainer.setCurrentIndex(1)
+
+
+ QMetaObject.connectSlotsByName(dlgMain)
+ # setupUi
+
+ def retranslateUi(self, dlgMain):
+ dlgMain.setWindowTitle(QCoreApplication.translate("dlgMain", u"XXXX\u63a7\u5236\u7cfb\u7edf", None))
+ self.grpMainSysInfo_0.setTitle("")
+ self.lblMainWoodTotal.setText(QCoreApplication.translate("dlgMain", u"\u603b\u91cf\uff1a", None))
+ self.lblMainWoodNG.setText(QCoreApplication.translate("dlgMain", u"NG\u91cf\uff1a", None))
+ self.lblMainPassRate.setText(QCoreApplication.translate("dlgMain", u"\u901a\u8fc7\u7387\uff1a", None))
+ self.grpMainSysInfo_1.setTitle("")
+ self.grpMainForUser.setTitle("")
+ self.btnMainSwitchUser.setText(QCoreApplication.translate("dlgMain", u"\u5207\u6362\u7528\u6237", None))
+ self.btnMainChangePasswd.setText(QCoreApplication.translate("dlgMain", u"\u5bc6\u7801\u4fee\u6539", None))
+ self.grpMainModule.setTitle("")
+ self.rdbMainAutoProc.setText(QCoreApplication.translate("dlgMain", u"\u81ea\u52a8\u4f5c\u4e1a", None))
+ self.rdbMainDebug.setText(QCoreApplication.translate("dlgMain", u"\u8bbe\u5907\u8c03\u8bd5", None))
+ self.rdbMainSetting.setText(QCoreApplication.translate("dlgMain", u"\u53c2\u6570\u8bbe\u7f6e", None))
+ self.rdbMainQuery.setText(QCoreApplication.translate("dlgMain", u"\u6570\u636e\u67e5\u8be2", None))
+ self.rdbMainRecipe.setText(QCoreApplication.translate("dlgMain", u"\u914d\u65b9\u7ba1\u7406", None))
+ self.rdbMainUser.setText(QCoreApplication.translate("dlgMain", u"\u7528\u6237\u7ba1\u7406", None))
+ # retranslateUi
+