feat: 输出图像弹框初始化完成

master
donghao 1 month ago
parent a3607d18ec
commit 3c184796b0

@ -1,6 +1,8 @@
// Button/index.tsx // Button/index.tsx
import { defineComponent, computed, CSSProperties } from 'vue' import { defineComponent, computed, CSSProperties } from 'vue'
import './button.scss' // 导入样式文件 import './button.scss' // 导入样式文件
import { config } from '@/config'
import { TButton } from '@wocwin/t-ui-plus'
//定义按钮类型 //定义按钮类型
type ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text' type ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text'
@ -41,6 +43,8 @@ export default defineComponent({
type: String as () => ButtonNativeType, type: String as () => ButtonNativeType,
default: 'button' default: 'button'
}, },
time: Number, // 按钮点击后禁用时间
label: String,
disabled: Boolean, disabled: Boolean,
loading: Boolean, loading: Boolean,
plain: Boolean, plain: Boolean,
@ -93,21 +97,23 @@ export default defineComponent({
return ( return (
<span class="ds-button__content"> <span class="ds-button__content">
{renderIcon()} {renderIcon()}
{props?.label}
{slots.default?.()} {slots.default?.()}
</span> </span>
) )
} }
return () => ( return () => (
<button <t-button
class={buttonClasses.value} class={buttonClasses.value}
style={props.style} style={props.style}
disabled={props.disabled || props.loading} disabled={props.disabled || props.loading}
type={props.type} type={props.type}
time={props.time || config.buttonTimeOut}
onClick={handleClick} onClick={handleClick}
> >
{renderContent()} {renderContent()}
</button> </t-button>
) )
} }
}) })

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd * @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-31 10:03:44 * @Date: 2025-07-31 10:03:44
* @LastEditors: donghao donghao@supervision.ltd * @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-08-01 17:04:27 * @LastEditTime: 2025-08-07 17:38:15
* @FilePath: \Robot-Al-Platform-Web\src\renderer\src\components\Form\formList.tsx * @FilePath: \Robot-Al-Platform-Web\src\renderer\src\components\Form\formList.tsx
* @Description: formList * @Description: formList
*/ */
@ -18,6 +18,9 @@ import { Delete } from '@element-plus/icons-vue'
// 定义组件属性类型(保留所有 ElInputNumber 属性) // 定义组件属性类型(保留所有 ElInputNumber 属性)
type DSFormListProps = { type DSFormListProps = {
formConfig: FormTypes formConfig: FormTypes
isHasPrefix?: boolean
isHasSuffix?: boolean
prefixRender?: (...ags: any[]) => any // 前置内容 render渲染 prefixRender?: (...ags: any[]) => any // 前置内容 render渲染
suffixRender?: (...ags: any[]) => any // 后置内容 render渲染 suffixRender?: (...ags: any[]) => any // 后置内容 render渲染
min?: number min?: number
@ -31,6 +34,16 @@ export default defineComponent({
type: Object as FormTypes, type: Object as FormTypes,
default: {} default: {}
}, },
isHasPrefix: {
type: Boolean,
default: true
},
isHasSuffix: {
type: Boolean,
default: false
},
prefixRender: Function as DSFormListProps['prefixRender'],
suffixRender: Function as DSFormListProps['suffixRender'],
modelValue: { modelValue: {
type: Array, type: Array,
default: () => [] default: () => []
@ -100,7 +113,9 @@ export default defineComponent({
// const canRemove = list.length > props.min // const canRemove = list.length > props.min
// 渲染自定义前缀内容 // 渲染自定义前缀内容
const renderPrefix = (formItem, index) => { const renderPrefix = (formItem, index) => {
// props?.suffixRender && if (!props.isHasPrefix) {
return null
}
if (props.prefixRender) { if (props.prefixRender) {
return props?.prefixRender?.() return props?.prefixRender?.()
} }
@ -112,7 +127,26 @@ export default defineComponent({
</span> </span>
<div <div
onClick={() => removeItem(formItem, index)} onClick={() => removeItem(formItem, index)}
class="flex items-center justify-center ds-dialog-formList-delete" className="flex items-center justify-center ds-dialog-formList-delete"
>
<Delete />
</div>
</div>
)
}
// 渲染自定义后缀内容
const renderSuffix = (formItem, index) => {
if (!props.isHasSuffix) {
return null
}
if (props.suffixRender) {
return props?.suffixRender?.()
}
return (
<div className="flex items-center mb-[16px]">
<div
onClick={() => removeItem(formItem, index)}
className="flex items-center justify-center ds-dialog-formList-delete"
> >
<Delete /> <Delete />
</div> </div>
@ -120,17 +154,20 @@ export default defineComponent({
) )
} }
return () => ( return () => (
<div class="ds-form-list-comp"> <div className="ds-form-list-comp">
<ul class="form-list"> <ul className="form-list">
{props.modelValue {props.modelValue
.map((item) => ({ .map((item) => ({
...item, ...item,
formItemsUuid: item?.id || generateId() formItemsUuid: item?.id || generateId()
})) }))
.map((formItem, index) => ( .map((formItem, index) => (
<li class="form-item-card" key={formItem.formItemsUuid}> <li className="form-item-card" key={formItem.formItemsUuid}>
{renderPrefix(formItem, index)} {renderPrefix(formItem, index)}
<div className="flex items-center">
<TForm className="ds-form-list-comp-form" {...tFormAttrs(index)}></TForm> <TForm className="ds-form-list-comp-form" {...tFormAttrs(index)}></TForm>
{renderSuffix(formItem, index)}
</div>
</li> </li>
))} ))}
</ul> </ul>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd * @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-14 13:45:30 * @Date: 2025-07-14 13:45:30
* @LastEditors: donghao donghao@supervision.ltd * @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-07-23 14:31:26 * @LastEditTime: 2025-08-07 17:49:18
* @FilePath: \Robot-Al-Platform-Web\src\renderer\src\config\designControl.ts * @FilePath: \Robot-Al-Platform-Web\src\renderer\src\config\designControl.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -34,11 +34,11 @@ import LogicalToolsIcon from '@/assets/images/panelBar/logical_tools.png' // 逻
import CommunicationIcon from '@/assets/images/panelBar/communication.png' // 通讯 import CommunicationIcon from '@/assets/images/panelBar/communication.png' // 通讯
import DeepLearningIcon from '@/assets/images/panelBar/deep_learning.png' // 深度学习 import DeepLearningIcon from '@/assets/images/panelBar/deep_learning.png' // 深度学习
// 节点图标 // 节点图标
import imageNodeIcon from '@/assets/images/ImagesCapture/image-node.png' // 图像源 import ImageNodeIcon from '@/assets/images/ImagesCapture/image-node.png' // 图像源
import multiImageNodeIcon from '@/assets/images/ImagesCapture/multi-image-node.png' // 多图采集 import MultiImageNodeIcon from '@/assets/images/ImagesCapture/multi-image-node.png' // 多图采集
import outputImageNodeIcon from '@/assets/images/ImagesCapture/output-image-node.png' // 输出图像 import OutputImageNodeIcon from '@/assets/images/ImagesCapture/output-image-node.png' // 输出图像
import CashImageNodeIcon from '@/assets/images/ImagesCapture/cash-image-node.png' // 缓存图像 import CashImageNodeIcon from '@/assets/images/ImagesCapture/cash-image-node.png' // 缓存图像
import lightImageNodeIcon from '@/assets/images/ImagesCapture/light-image-node.png' // 缓存图像 import LightImageNodeIcon from '@/assets/images/ImagesCapture/light-image-node.png' // 光源
export interface designLFNodeType { export interface designLFNodeType {
type: string type: string
icon: string icon: string
@ -135,17 +135,17 @@ export const panelControlsConf: ControlsItemType[] = [
{ {
type: 'image-node', type: 'image-node',
label: '图像源', label: '图像源',
icon: imageNodeIcon icon: ImageNodeIcon
}, },
{ {
type: 'multi-image-node', type: 'multi-image-node',
label: '多图采集', label: '多图采集',
icon: multiImageNodeIcon icon: MultiImageNodeIcon
}, },
{ {
type: 'output-image-node', type: 'output-image-node',
label: '输出图像', label: '输出图像',
icon: outputImageNodeIcon icon: OutputImageNodeIcon
}, },
{ {
type: 'cash-image-node', type: 'cash-image-node',
@ -155,7 +155,7 @@ export const panelControlsConf: ControlsItemType[] = [
{ {
type: 'light-image-node', type: 'light-image-node',
label: '光源', label: '光源',
icon: lightImageNodeIcon icon: LightImageNodeIcon
} }
] ]
}, },

@ -69,6 +69,13 @@
color: var(--ds-des-text-1); color: var(--ds-des-text-1);
} }
//
.ds-form-items-title {
font-weight: bold;
font-size: 14px;
margin-bottom: calc(-8px - 4px);
}
// //
.ds-dialog-icon-box { .ds-dialog-icon-box {
width: 48px; width: 48px;

@ -58,8 +58,19 @@
.el-switch { .el-switch {
height: 20px; height: 20px;
} }
.el-radio {
/* tabs */ // --el-radio-font-size: var(--el-font-size-base);
--el-radio-text-color: var(--ds-color-info);
&.is-checked{
color: var(--ds-color-info);
}
}
.el-radio__input.is-checked+.el-radio__label {
color: var(--ds-color-info);
}
.el-radio.el-radio--large {
height: var(--ds-form-item-height);
}/* tabs */
.ds-tabs { .ds-tabs {
background-color: transparent; background-color: transparent;
&.el-tabs { &.el-tabs {

@ -407,7 +407,7 @@
font-size: 14px; font-size: 14px;
justify-content: space-between; justify-content: space-between;
padding-left: 0px; padding-left: 0px;
padding-bottom: 14px; padding-bottom: 12px;
} }
.t_module_form .t_module_form
.scroll_wrap .scroll_wrap

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd * @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-03 11:12:04 * @Date: 2025-07-03 11:12:04
* @LastEditors: donghao donghao@supervision.ltd * @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-08-01 09:19:24 * @LastEditTime: 2025-08-07 17:01:33
* @FilePath: \electron-project\Robot-Al\Robot-Al-Platform-Web\src\renderer\src\views\Design\FlowImagesCapture\imageNodeModel.vue * @FilePath: \electron-project\Robot-Al\Robot-Al-Platform-Web\src\renderer\src\views\Design\FlowImagesCapture\imageNodeModel.vue
* @Description: 图像源节点 * @Description: 图像源节点
--> -->

@ -2,16 +2,17 @@
* @Author: donghao donghao@supervision.ltd * @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-23 16:19:16 * @Date: 2025-07-23 16:19:16
* @LastEditors: donghao donghao@supervision.ltd * @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-07-23 16:37:17 * @LastEditTime: 2025-08-07 17:51:38
* @FilePath: \Robot-Al-Platform-Web\src\renderer\src\views\Design\FlowImagesCapture\index.ts * @FilePath: \Robot-Al-Platform-Web\src\renderer\src\views\Design\FlowImagesCapture\index.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description:
*/ */
import imageNodeModel from './imageNodeModel.vue' import imageNodeModel from './imageNodeModel.vue'
import multiImageNodeModel from './multiImageNodeModel.vue' import multiImageNodeModel from './multiImageNodeModel.vue'
import outputImageNode from './outputImageNode.vue'
import lightImageNodeModel from './lightNodeModel.vue' import lightImageNodeModel from './lightNodeModel.vue'
export const FlowImageNodeModel = imageNodeModel export const FlowImageNodeModel = imageNodeModel
export const FlowMultiImageNodeModel = multiImageNodeModel export const FlowMultiImageNodeModel = multiImageNodeModel
export const FlowOutputImageNodeModel = outputImageNode
export const FlowLightImageNodeModel = lightImageNodeModel export const FlowLightImageNodeModel = lightImageNodeModel

@ -0,0 +1,930 @@
<!--
* @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-03 11:12:04
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-08-07 17:43:32
* @FilePath: \electron-project\Robot-Al\Robot-Al-Platform-Web\src\renderer\src\views\Design\FlowImagesCapture\outputImageNode.vue
* @Description: 输出图像节点
-->
<script setup lang="tsx">
import { DSDialog } from '@/components/Dialog'
import { DSButton } from '@/components/Button'
defineOptions({
name: 'FlowImageNodeModel'
})
interface Props {
/** 弹窗显隐 */
value: boolean
// info?: Record<string, any>
}
interface Emits {
(e: 'update:value', val: boolean): void
}
interface FormTabItem {
ref: string
title: string
}
const props = withDefaults(defineProps<Props>(), {
value: false
})
const emit = defineEmits<Emits>()
//
const handleClose = () => {
// emits('close');
}
const show = computed({
get() {
return props.value
},
set(val: boolean) {
emit('update:value', val)
}
})
// ref
const sourceForm: any = ref<HTMLElement | null>(null)
// form
const submit = (form) => {
console.log('最终提交数据', form)
}
const save = () => {
sourceForm.value.saveHandle()
}
const testList = [
{
value: 'GPIO',
label: 'GPIO'
},
{
value: 'VB2230',
label: 'VB2230'
},
{
value: 'VC2000/2100',
label: 'VC2000/2100'
},
{
value: 'VC3000H/X',
label: 'VC3000H/X'
},
{
value: 'MV-LEVD-200',
label: 'MV-LEVD-200'
},
{
value: 'LE200',
label: 'LE200'
},
{
value: 'VC5000',
label: 'VC5000'
}
]
//
const baseFormOpts: any = reactive({
baseConfig: {
title: '图像输入',
name: 'baseConfig',
disabled: true, //
ref: 'baseFormRef',
widthSize: 2, // 3
opts: {
labelPosition: 'top', //
formData: {
imageSource: '请选择', // *--
saveImageEnable: false, // *使--
generateDirectory: false, // *--使
debugSave: false, // *--使
debugInfo: '', // *--
asyncStorageWay: 0, // *&
asynchronousStorageInterval: null, // *
triggerSaveEnable: false, // *
triggerVariable: '', // *
saveCondition: '全部保存', // *
saveRenderedImageEnable: false, // *
renderedImagePath: 'C:\\Users\\siroi\\Picture', // *C:\Users\siroi\Picture
renderedImageName: '', // *
renderedImageCache: null, // *
saveOriginalImageEnable: false, // *
originalImagePath: 'C:\\Users\\siroi\\Picture', // *C:\Users\siroi\Picture
originalImageName: '', // *
originalImageCache: null, // *
storageMethod: 0, // *
diskFreeSpace: null, // *36
storageUnit: 'MB', // *MB
maxStorageDays: 30, // *30
imageFormat: 'BMP', // *BMP
ftpEnable: false, // *FTP
ftpConnectedEnable: false, // *--FTP
localIP: '', // *IP--IP
serverPort: '', // *
username: '', // *
password: '', // *
encodingFormat: '', // *
ftpPath: '/image', // *FTP/image
outputEnable: false, // *使
pixelFormat: 'Mono8' // *Mono8
// renderedNGPath: 'C:\\Users\\siroi\\Picture', // NGC:\Users\siroi\Picture
// originalNGPath: 'C:\\Users\\siroi\\Picture' // NGC:\Users\siroi\Picture
},
fieldList: [
/**基础参数-表单项**/
//
{
label: '输入源',
value: 'imageSource',
type: 'select-arr',
comp: 'el-select',
list: 'imageSourceList',
arrLabel: 'key',
arrKey: 'value',
placeholder: '请选择输入源',
eventHandle: {
change: (val: any) => {
console.log(val, 'selectChange_imageSource')
}
},
bind: { clearable: false }
},
// 使
{
labelRender: () => {
return <div className="ds-form-items-title">存图设置</div>
},
// value: 'form_title',
isSelfCom: true,
widthSize: 1
},
// 使
{
value: 'saveImageEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '存图使能'
}
},
//
{
value: 'generateDirectory',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '生成目录'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
value: 'debugSave',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '调试保存'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
label: '调试信息',
value: 'debugInfo',
type: 'input',
widthSize: 1,
width: 'calc(50% - 6px)',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.debugSave
}
},
// &
{
label: '',
value: 'asyncStorageWay',
type: 'radio',
comp: 'el-radio-group',
widthSize: 4,
list: 'asyncStorageWayList',
arrLabel: 'name',
arrKey: 'id',
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
label: '',
value: 'captureInterval',
placeholder: '请输入存图间隔',
comp: 'DSInputNumber',
isSelfCom: true,
widthSize: 4,
bind: {
min: 1,
max: 10000,
prefixRender: () => {
// TODO
return <div className="w-[200px] flex pr-[8px]">存图间隔</div>
},
isHasSuffix: false
},
eventHandle: {
change: (val: any) => {}
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
value: 'triggerSaveEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '触发保存'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
label: '触发变量',
value: 'triggerVariable',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.triggerSaveEnable
}
},
//
{
label: '保存条件',
value: 'saveCondition',
type: 'select-arr',
comp: 'el-select',
list: 'saveConditiontList',
arrLabel: 'name',
arrKey: 'id',
placeholder: '请选择保存条件',
isHideItem: (data) => {
return data.saveImageEnable && data.triggerSaveEnable
}
},
//
{
value: 'saveRenderedImageEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '保存渲染图'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
// TODO 使inputPath
{
label: '渲染图路径',
value: 'renderedImagePath',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.saveRenderedImageEnable
}
},
// TODO 使inputSelect
{
label: '渲染图命名',
value: 'renderedImageName',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.saveRenderedImageEnable
}
},
//
{
label: '渲染图缓存',
value: 'renderedImageCache',
placeholder: '请输入渲染图缓存',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 1,
max: 10000,
isHasSuffix: false
},
eventHandle: {
change: (val: any) => {}
},
isHideItem: (data) => {
return data.saveImageEnable && data.saveRenderedImageEnable
}
},
//
{
value: 'saveOriginalImageEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '保存原图'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
// TODO 使inputPath
{
label: '原图路径',
value: 'originalImagePath',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
// TODO 使inputSelect
{
label: '渲染图命名',
value: 'originalImageName',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
label: '原图缓存',
value: 'originalImageCache',
placeholder: '请输入原图缓存',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 1,
max: 10000,
isHasSuffix: false
},
eventHandle: {
change: (val: any) => {}
},
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
label: '存储方式',
value: 'storageMethod',
type: 'select-arr',
comp: 'el-select',
list: 'storageMethodList',
arrLabel: 'name',
arrKey: 'id',
placeholder: '请选择存储方式',
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
placeholder: '请输入磁盘剩余空间',
label: '磁盘剩余空间',
value: 'diskFreeSpace',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 0,
max: 99999999
},
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
label: '存储单位',
value: 'storageUnit',
type: 'select-arr',
comp: 'el-select',
list: 'storageUnitList',
arrLabel: 'name',
arrKey: 'id',
placeholder: '请选择存储单位',
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
placeholder: '请输入最大保存天数',
label: '最大保存天数',
value: 'maxStorageDays',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 0,
max: 99999999
},
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
//
{
label: '保存格式',
value: 'imageFormat',
type: 'select-arr',
comp: 'el-select',
list: 'imageFormatList',
arrLabel: 'name',
arrKey: 'id',
placeholder: '请选择保存格式',
isHideItem: (data) => {
return data.saveImageEnable && data.saveOriginalImageEnable
}
},
// FTP
{
value: 'ftpEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '启用FTP'
},
isHideItem: (data) => {
return data.saveImageEnable
}
},
//
{
value: 'ftpConnectedEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '连接'
},
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable
}
},
// TODO IP 使t
{
label: 'IP',
value: 'localIP',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable && data.ftpConnectedEnable
}
},
//
{
label: '服务器端口',
value: 'serverPort',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable && data.ftpConnectedEnable
}
},
//
{
label: '用户名',
value: 'username',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable && data.ftpConnectedEnable
}
},
//
{
label: '密码',
value: 'password',
type: 'password',
comp: 'el-input',
bind: { 'show-password': true }
},
//
{
label: '编码格式',
value: 'encodingFormat',
type: 'select-arr',
comp: 'el-select',
list: 'testList',
arrLabel: 'label',
arrKey: 'value',
placeholder: '请选择像素格式',
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable && data.ftpConnectedEnable
}
},
// TODO FTP 使
{
label: 'FTP路径',
value: 'ftpPath',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 },
isHideItem: (data) => {
return data.saveImageEnable && data.ftpEnable && data.ftpConnectedEnable
}
},
// 使
{
value: 'outputEnable',
comp: 'DSSwitch',
isSelfCom: true,
widthSize: 1,
bind: {
label: '输出使能'
}
},
//
{
label: '像素格式',
value: 'pixelFormat',
type: 'select-arr',
comp: 'el-select',
list: 'testList',
arrLabel: 'label',
arrKey: 'value',
placeholder: '请选择像素格式'
}
],
//
listTypeInfo: {
testList,
imageSourceList: [
{ key: '本地图像', value: '本地图像' },
{ key: '相机', value: '相机' },
{ key: 'SDK', value: 'SDK' }
],
asyncStorageWayList: [
{
id: 0,
name: '同步存储'
},
{
id: 1,
name: '异步存储'
}
],
saveConditiontList: [
{
id: '全部保存',
name: '全部保存'
},
{
id: 'OK时保存',
name: 'OK时保存'
},
{
id: 'NG时保存',
name: 'NG时保存'
},
{
id: '不保存',
name: '不保存'
}
],
storageMethodList: [
{
id: 0,
name: '覆盖存储'
},
{
id: 1,
name: '停止存储'
}
],
storageUnitList: [
{
id: 'MB',
name: 'MB'
},
{
id: 'GB',
name: 'GB'
}
],
imageFormatList: [
{
id: 'jpg',
name: 'jpg'
},
{
id: 'png',
name: 'png'
},
{
id: 'bmp',
name: 'bmp'
},
{
id: 'tiff',
name: 'tiff'
}
]
}
}
}
})
//
const renderParamsFormOpts = reactive({
renderParamsConfig: {
title: '',
name: 'renderParamsConfig',
disabled: true, //
ref: 'renderParamsFormRef',
widthSize: 2, // 3
opts: {
//
labelPosition: 'top', //
formData: {
circle_multiplier_type: '界面尺寸', // *
line_width_multiplier: null, // *线16
char_width_multiplier: null, // *16
line_connectivity: null // *线4线
},
fieldList: [
//
{
label: '圆形倍率类型',
value: 'circle_multiplier_type',
type: 'select-arr',
comp: 'el-select',
list: 'typeList',
arrLabel: 'key',
arrKey: 'value',
placeholder: '请选择圆形倍率类型',
eventHandle: {
change: (val: any) => {
console.log(val, 'circle_multiplier_type_change')
}
},
bind: { clearable: false }
},
// 线
{
placeholder: '请输入线宽倍率',
labelRender: () => {
return (
<div>
<span>线宽倍率</span>
<span className="ds-form-des-text">最大不超过16</span>
</div>
)
},
value: 'line_width_multiplier',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 0,
max: 16
},
isHideItem: (data) => {
return data.circle_multiplier_type === '自定义尺寸'
}
},
//
{
placeholder: '请输入字宽倍率',
labelRender: () => {
return (
<div>
<span>字宽倍率</span>
<span className="ds-form-des-text">最大不超过16</span>
</div>
)
},
value: 'char_width_multiplier',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 0,
max: 16
},
isHideItem: (data) => {
return data.circle_multiplier_type === '自定义尺寸'
}
},
// 线
{
label: '线型',
value: 'line_connectivity',
type: 'select-arr',
comp: 'el-select',
list: 'lineList',
arrLabel: 'name',
arrKey: 'id'
}
],
listTypeInfo: {
testList,
typeList: [
{ key: '界面尺寸', value: '界面尺寸' },
{ key: '自定义尺寸', value: '自定义尺寸' }
],
lineList: [
{
id: 0,
name: '4连通线'
},
{
id: 1,
name: '8连通线'
},
{
id: 2,
name: '抗锯齿线'
}
]
}
}
}
})
// *
const activePriorStorageConfig = reactive({
widthSize: 1, // 3
title: '前项存储设置',
labelPosition: 'top', //
ref: 'activeImageRef',
formData: {
prior_storage: null // *
},
fieldList: [
{
placeholder: '请输入',
label: '',
value: 'prior_storage',
comp: 'DSInputNumber',
// width: 'calc(50% - 6px)',
isSelfCom: true,
bind: {
min: 0,
max: 10000
}
}
]
})
//
const renderSettingFormOpts = reactive({
renderSettingConfig: {
title: '',
name: 'renderSettingConfig',
disabled: true, //
ref: 'renderSettingFormRef',
widthSize: 2, // 3
opts: {
labelPosition: 'top', //
formData: {
content: '', // *
font_size: 36, // *
color: null, // *
position_x: '', // *X (Please Enter)
position_y: '', // *Y (Please Enter)
prior_storage_settings: [] // *
},
fieldList: [
//
{
label: '内容',
value: 'content',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 }
},
//
{
placeholder: '请输入字号',
label: '字号',
value: 'font_size',
comp: 'DSInputNumber',
isSelfCom: true,
bind: {
min: 0,
max: 100
}
},
//TODO colorPicker
{
label: '颜色',
value: 'color',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 }
},
// X
{
label: '位置X',
value: 'position_x',
type: 'input',
comp: 'el-input',
bind: { maxlength: 100 }
},
// Y
{
label: '位置Y',
value: 'position_y',
type: 'input',
comp: 'el-input',
widthSize: 1,
width: 'calc(50% - 6px)',
bind: { maxlength: 100 }
},
{
label: '前项存储设置',
widthSize: 2, // 3
value: 'prior_storage_settings',
comp: 'DSFormList',
isSelfCom: true,
bind: {
formConfig: activePriorStorageConfig,
isHasPrefix: false,
isHasSuffix: true
}
}
]
}
}
})
const tabs = ref([
{
ref: 'baseFormRef',
name: '基本参数',
formOpts: baseFormOpts
},
{
ref: 'renderParamsFormRef',
name: '渲染参数',
formOpts: renderParamsFormOpts
},
{
ref: 'renderSettingFormRef',
name: '渲染设置',
formOpts: renderSettingFormOpts
}
])
const activeTabName = ref('基本参数')
</script>
<template>
<DSDialog
v-model="show"
width="1200"
@close="handleClose"
class="settings-dialog ds-dialog"
title="输出图像"
>
<template #default>
<div class="imageNodeModel-form-container ds-dialog-form-container">
<el-tabs v-model="activeTabName">
<el-tab-pane v-for="item in tabs" :key="item.name" :label="item.name" :name="item.name">
<t-module-form :ref="item.ref" titleBold :formOpts="item.formOpts" :submit="submit">
<template #footer>
<div class="ds-dialog-form-footer">
<DSButton label="连续执行" @click="save" type="info" class="mr-[8px]" />
<DSButton label="执行" @click="save" type="primary" />
<!-- <t-button type="primary" size="default">
<span class="px-[8px]" @click="save"> </span>
</t-button> -->
</div>
</template>
</t-module-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
</DSDialog>
</template>

@ -2,7 +2,7 @@
* @Author: donghao donghao@supervision.ltd * @Author: donghao donghao@supervision.ltd
* @Date: 2025-07-03 10:27:47 * @Date: 2025-07-03 10:27:47
* @LastEditors: donghao donghao@supervision.ltd * @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2025-07-23 16:40:56 * @LastEditTime: 2025-08-07 17:52:52
* @FilePath: \electron-project\Robot-Al\Robot-Al-Platform-Web\src\renderer\src\views\Design\Workflow\logicFlowView.vue * @FilePath: \electron-project\Robot-Al\Robot-Al-Platform-Web\src\renderer\src\views\Design\Workflow\logicFlowView.vue
* @Description: 流程设计器面板 * @Description: 流程设计器面板
--> -->
@ -34,6 +34,7 @@
<div class="attr-model-box" v-if="showAttribute"> <div class="attr-model-box" v-if="showAttribute">
<FlowImageNodeModel v-model:value="isOpenFlowImage" /> <FlowImageNodeModel v-model:value="isOpenFlowImage" />
<FlowMultiImageNodeModel v-model:value="isOpenFlowMultiImage" /> <FlowMultiImageNodeModel v-model:value="isOpenFlowMultiImage" />
<FlowOutputImageNodeModel v-model:value="isOpenFlowOutputImage" />
<FlowLightImageNodeModel v-model:value="isOpenFlowLightImage" /> <FlowLightImageNodeModel v-model:value="isOpenFlowLightImage" />
</div> </div>
</div> </div>
@ -53,6 +54,7 @@ import { getNodeOutputCount, getNodeInputCount } from '@/utils/forData/arr'
import { import {
FlowImageNodeModel, FlowImageNodeModel,
FlowMultiImageNodeModel, FlowMultiImageNodeModel,
FlowOutputImageNodeModel,
FlowLightImageNodeModel FlowLightImageNodeModel
} from '../FlowImagesCapture' } from '../FlowImagesCapture'
@ -68,6 +70,7 @@ const flowDetail = reactive({})
const isOpenFlowImage = ref<boolean>(false) // const isOpenFlowImage = ref<boolean>(false) //
const isOpenFlowMultiImage = ref<boolean>(false) // const isOpenFlowMultiImage = ref<boolean>(false) //
const isOpenFlowOutputImage = ref<boolean>(false) //
const isOpenFlowLightImage = ref<boolean>(false) // const isOpenFlowLightImage = ref<boolean>(false) //
// //
const changeAttrPanelStatus = (isOpen) => { const changeAttrPanelStatus = (isOpen) => {
@ -78,6 +81,9 @@ const changeAttrPanelStatus = (isOpen) => {
case 'multi-image-node': case 'multi-image-node':
isOpenFlowMultiImage.value = true isOpenFlowMultiImage.value = true
break break
case 'output-image-node':
isOpenFlowOutputImage.value = true
break
case 'light-image-node': case 'light-image-node':
isOpenFlowLightImage.value = true isOpenFlowLightImage.value = true
break break

Loading…
Cancel
Save