feat: 相机管理模块

master
JINGYJ 2 days ago
parent 77d5e04569
commit badb802edc

@ -0,0 +1,76 @@
<template>
<!-- 相机管理弹框 -->
<el-dialog
title="创建相机"
v-model="show"
width="520"
class="cameraManagement-dialog ds-dialog"
style="margin-top: 244px"
>
<div class="cameraManagement-container">
<div>选择添加相机的类型</div>
<el-radio-group v-model="cameraType" class="camera-radio-group">
<el-radio value="1" size="large">全局相机</el-radio>
<el-radio value="2" size="large">Dalsa图像采集</el-radio>
<el-radio value="3" size="large">迈创采集</el-radio>
</el-radio-group>
</div>
<template #footer>
<div class="dialog-footer mr-[24px] pb-[24px] pt-[16px] flex justify-end">
<DSButton type="primary" class="">创建</DSButton>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { computed } from 'vue'
import { DSButton } from '@/components/Button'
import { InfoFilled } from '@element-plus/icons-vue'
// v-model:value props.value
interface Props {
value: boolean
}
interface Emits {
(e: 'update:value', val: boolean): void
}
const props = withDefaults(defineProps<Props>(), {
value: false
})
const emit = defineEmits<Emits>()
const cameraType = ref(' ')
watch(
() => props.value,
(newVal, oldVal) => {
console.log('props.value 变化:', '旧值:', oldVal, '新值:', newVal)
}
)
//
const show = computed({
get() {
return props.value // isDeviceDialog
},
set(val) {
emit('update:value', val) //
}
})
</script>
<style scoped lang="scss">
.cameraManagement-container {
box-sizing: border-box;
width: 100%;
height: 274px;
padding: 16px 24px;
.camera-radio-group {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
:deep(.el-radio__label) {
color: #fff;
}
}
}
</style>

@ -0,0 +1,667 @@
<template>
<!-- 控制器管理弹框 -->
<DSDialog
title="相机管理"
v-model="show"
width="1200"
class="cameraManagement-dialog ds-dialog"
@close="handleClose"
>
<div class="cameraManagement-container">
<div class="cameraManagement-infoList">
<div class="cameraManagement-infoList-title">
<span>设备列表</span>
<div class="infoList-title-btn" @click="addDevice">+</div>
</div>
<div class="cameraManagement-infoList-content">
<div
class="cameraManagement-infoList-item"
:class="{ active: deviceTab === item.name }"
v-for="(item, index) in deviceBars"
:key="index"
@click="selectDevice(item)"
>
<span>{{ item.name }}</span>
<el-switch v-model="item.enabled" size="small" />
</div>
<el-empty
:image-size="54"
:image="NoDataIcon"
style="margin-top: 130px"
v-if="deviceBars.length === 0"
/>
</div>
</div>
<div class="cameraManagement-line-first" />
<div class="cameraManagement-content">
<el-form label-width="auto" size="default" :model="formCameraInfo" style="max-width: 100%">
<el-tabs v-model="dataTab" class="data-tabs" @tab-click="handleClick">
<el-tab-pane label="常用参数" name="commParam"> </el-tab-pane>
<el-tab-pane label="设备控制" name="deviceControl"> </el-tab-pane>
</el-tabs>
<template v-if="dataTab === 'commParam'">
<el-form-item
label="GenTL相机"
label-position="left"
v-if="formCameraInfo.typeSelection === '1'"
>
<el-switch v-model="formCameraInfo.GenTL" />
</el-form-item>
<el-row :gutter="24" v-if="formCameraInfo.GenTL">
<el-col :span="10">
<el-form-item label="选择Cti文件" label-position="top">
<el-select
v-model="formCameraInfo.ctiFile"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="类型选择:" label-position="left" v-if="!formCameraInfo.GenTL">
<el-radio-group v-model="formCameraInfo.typeSelection" class="camera-radio-group">
<el-radio value="1" size="large">枚举</el-radio>
<el-radio value="2" size="large">跨网段IP</el-radio>
</el-radio-group>
</el-form-item>
<el-row :gutter="24" v-if="formCameraInfo.typeSelection === '1'">
<el-col :span="12">
<el-form-item label="选择相机" label-position="top">
<el-select
v-model="formCameraInfo.cameras"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-button type="primary" :icon="RefreshRight" circle class="mt-7" />
</el-col>
</el-row>
<el-row :gutter="24" v-if="formCameraInfo.typeSelection === '2'">
<el-col :span="12">
<el-form-item label="本机IP" label-position="top">
<el-select
v-model="formCameraInfo.localIP"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="相机IP" label-position="top">
<el-select
v-model="formCameraInfo.cameraIP"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="5" v-if="formCameraInfo.typeSelection === '2'">
<el-form-item label="连接相机" label-position="left">
<el-switch v-model="formCameraInfo.connectCamera" />
</el-form-item>
</el-col>
<el-col :span="5" v-if="formCameraInfo.typeSelection === '2'">
<el-form-item label="自动重连" label-position="left">
<el-switch v-model="formCameraInfo.autoReconnect" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="加载用户集" label-position="left">
<el-switch v-model="formCameraInfo.loadUser" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="调试存图" label-position="left">
<el-switch v-model="formCameraInfo.saveImage" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="图像缓存数" label-position="top">
<el-input-number
v-model="formCameraInfo.imageCaches"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实时取流" label-position="top">
<el-button type="primary">查看画面</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="断线重连时间" label-position="top">
<el-input-number
v-model="formCameraInfo.reconnectedTime"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="软触发超时" label-position="top">
<el-input-number
v-model="formCameraInfo.triggerTimeout"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<div>触发设置</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="触发源" label-position="top">
<el-select
v-model="formCameraInfo.triggerSource"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="触发模式" label-position="top">
<el-select
v-model="formCameraInfo.triggerMode"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="触发延迟" label-position="top">
<el-input-number
v-model="formCameraInfo.triggerDelay"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<div>图像参数</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="图像宽度" label-position="top">
<el-input-number
v-model="formCameraInfo.imageWidth"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="图像高度" label-position="top">
<el-input-number
v-model="formCameraInfo.imageHight"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="像素格式" label-position="top">
<el-select
v-model="formCameraInfo.pixelFormat"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="帧率" label-position="top">
<el-input-number
v-model="formCameraInfo.FPS"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="实际帧率" label-position="top">
<el-input-number
v-model="formCameraInfo.actualFPS"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="曝光模式" label-position="top">
<el-select
v-model="formCameraInfo.exposureMode"
placeholder="请选择"
class="device-select"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="曝光时间" label-position="top">
<el-input-number
v-model="formCameraInfo.exposureTime"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<div>增益</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="增益模式" label-position="top">
<el-select
v-model="formCameraInfo.gainMode"
placeholder="请选择"
class="device-select"
>
<el-option v-for="item in options" :key="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="增益" label-position="top">
<el-input-number
v-model="formCameraInfo.gain"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最小增益" label-position="top">
<el-input-number
v-model="formCameraInfo.gainMin"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最大增益" label-position="top">
<el-input-number
v-model="formCameraInfo.gainMax"
:min="1"
:max="10"
controls-position="right"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<div>图像参数</div>
<el-form-item label="Gamma使能" label-position="left">
<el-switch v-model="formCameraInfo.gamma" />
</el-form-item>
<el-row :gutter="24" v-if="formCameraInfo.gamma">
<el-col :span="6">
<el-form-item label="选择器" label-position="top">
<el-select
v-model="formCameraInfo.selector"
placeholder="请选择"
class="device-select"
>
<el-option v-for="item in options" :key="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div>线阵相机</div>
<div class="text-[#C9CDD4]">暂未检测到相关数据</div>
<div>运行参数</div>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="相机类型" label-position="top">
<el-select
v-model="formCameraInfo.cameraType"
placeholder="请选择"
class="device-select"
>
<el-option v-for="item in options" :key="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效电平" label-position="top">
<el-select
v-model="formCameraInfo.activeLevel"
placeholder="请选择"
class="device-select"
>
<el-option v-for="item in options" :key="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="text-right">
<el-button color="#F53F3E">删除设备</el-button>
</div>
</template>
<template v-else>
<div>运行参数</div>
<div class="text-[#C9CDD4]">暂未检测到相关数据</div>
<div>运行参数</div>
<div class="text-[#C9CDD4]">暂未检测到相关数据</div>
</template>
</el-form>
</div>
</div>
</DSDialog>
<CameraDialog v-model:value="isCameraDialog" />
</template>
<script setup lang="ts">
defineOptions({
name: 'cameraManagement'
})
import { DSButton } from '@/components/Button'
import { DSDialog } from '@/components/Dialog'
import { RefreshRight } from '@element-plus/icons-vue'
import CameraDialog from './cameraDialog.vue'
interface Props {
/** import DeviceDialog from './deviceDialog.vue';
弹窗显隐 */
value: boolean
}
interface Emits {
(e: 'update:value', val: boolean): void
}
const props = withDefaults(defineProps<Props>(), {
value: false
})
const emit = defineEmits<Emits>()
console.log(props.value)
const show = computed({
get() {
Object.assign(deviceBars, deviceList)
return props.value
},
set(val: boolean) {
emit('update:value', val)
}
})
const isCameraDialog = ref(false)
const dataTab = ref('commParam')
const handleClick = (tab: any) => {
dataTab.value = tab.props.name
}
// tab
const deviceTab = ref('') // device/receive/send/heartbeat/response
const deviceBars = ref([])
const options = [
{
value: 'DPS2',
label: 'DPS2'
},
{
value: 'MV-AP1024-2T',
label: 'MV-AP1024-2T'
}
]
//
const deviceList = ref([
{
name: '1 Light-1',
enabled: false,
info: {}
},
{ name: '2 Light-2', enabled: false }
])
//
const formCameraInfo = reactive({
GenTL: false,
typeSelection: '1',
cameras: '',
ctiFile: '',
localIP: '',
cameraIP: '',
connectCamera: false,
autoReconnect: false,
loadUser: false,
saveImage: false,
imageCaches: 1,
reconnectedTime: 1,
triggerTimeout: 1,
triggerSource: '',
triggerMode: '',
triggerDelay: 1,
imageWidth: 1,
imageHight: 1,
pixelFormat: '',
FPS: 1,
actualFPS: 1,
exposureMode: '',
exposureTime: 1,
gainMode: '',
gain: 1,
gainMin: 1,
gainMax: 1,
gamma: false,
selector: '',
cameraType: '',
activeLevel: ''
})
const selectDevice = (device: Device) => {
deviceTab.value = device.name
Object.assign(formCameraInfo, device.info)
console.log(deviceTab.value)
}
//
const addDevice = () => {
isCameraDialog.value = true
// deviceList.value.push({
// name: `${deviceList.value.length + 1} Light-${deviceList.value.length + 1}`,
// enabled: false,
// info: {}
// })
}
const handleTableAdd = () => {
formCameraInfo.tableData.push({
num: formCameraInfo.tableData.length + 1,
inputIO: '1',
triggeringSignal: '上升沿',
process: '流程1'
})
}
const handleChange = () => {}
//
const handleClose = () => {}
</script>
<style scoped lang="scss">
/* 弹框整体样式 */
.cameraManagement-container {
position: relative;
width: 100%;
height: 766px;
box-sizing: border-box;
display: flex;
.cameraManagement-infoList {
box-sizing: border-box;
width: 250px;
.cameraManagement-infoList-title {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 50px;
padding: 0 16px;
font-size: 14px;
font-weight: bold;
.infoList-title-btn {
width: 24px;
height: 24px;
background: #154ddd;
border: none;
color: #fff;
font-size: 24px;
text-align: center;
line-height: 20px;
border-radius: 50%;
cursor: pointer;
}
}
.cameraManagement-infoList-content {
.cameraManagement-infoList-item {
box-sizing: border-box;
width: 100%;
height: 32px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
}
.cameraManagement-infoList-item.active {
background: #f2f2f7;
span {
color: #154ddd;
}
}
}
}
.cameraManagement-content {
flex: 1;
height: 100%;
overflow: auto;
box-sizing: border-box;
padding: 16px 24px 24px;
.device-select {
color: #fff;
:deep(.el-select__wrapper) {
background: #303136;
.el-select__selected-item {
color: #fff;
}
}
}
:deep(.el-input-number) {
width: 100%;
.el-input-number__increase,
.el-input-number__decrease {
background: transparent;
color: #fff;
border: none;
}
}
.form-device-btn {
width: 80px;
padding: 0 12px;
}
.camera-radio-group {
height: 32px;
:deep(.el-radio.el-radio--large) {
height: 32px;
}
:deep(.el-radio__label) {
color: #fff;
}
}
}
.cameraManagement-line-first {
position: absolute;
left: 250px;
width: 1px;
height: 100vh;
background-color: #fff;
opacity: 0.3;
}
.data-tabs {
width: 100%;
:deep(.el-tabs__item) {
color: #fff;
}
}
}
</style>

@ -48,6 +48,7 @@
<LogList v-model:value="isOpenLog" />
<CommManagement v-model:value="isOpenCommManagement" />
<ControllerManagement v-model:value="isOpenControllerManagement" />
<CameraManagement v-model:value="isOpenCameraManagement" />
</template>
<script setup lang="ts">
@ -61,10 +62,12 @@ import SettingList from './Settings/settingList.vue'
import LogList from './LogManagement/logList.vue'
import CommManagement from './CommManagement/commManagement.vue'
import ControllerManagement from './ControllerManagement/controllerManagement.vue'
import CameraManagement from './CameraManagement/cameraManagement.vue'
const isOpenSetting = ref<boolean>(false) //
const isOpenLog = ref<boolean>(false) //
const isOpenCommManagement = ref<boolean>(false) //
const isOpenControllerManagement = ref<boolean>(false) //
const isOpenCameraManagement = ref<boolean>(false) //
// TitleBar
const handleSystemClick = (command: string) => {
@ -93,6 +96,8 @@ const handleNavClick = (command: any) => {
} else if (command.type === 'control') {
console.log('111')
isOpenControllerManagement.value = true
} else if (command.type === 'camera') {
isOpenCameraManagement.value = true
}
}

Loading…
Cancel
Save