无源标靶上位机
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

250 lines
7.3 KiB

import { useState, useEffect } from 'react';
// localStorage 存储键名
const TEMPLATE_STORAGE_KEY = 'wuyuanbiaoba_templates';
// 将图片转换为base64的工具函数
const convertImageToBase64 = (imagePath) => {
return new Promise((resolve, reject) => {
const img = new Image();
img.crossOrigin = 'anonymous'; // 处理跨域问题
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
try {
const base64 = canvas.toDataURL('image/jpeg', 0.8);
resolve(base64);
} catch (error) {
reject(error);
}
};
img.onerror = () => {
reject(new Error(`Failed to load image: ${imagePath}`));
};
img.src = imagePath;
});
};
// 创建内置模板的函数
const createBuiltinTemplate = async () => {
try {
// 标靶图片路径
const imagePath = '/client/assets/img/wuyuanbiaoba_template_images/temp_target1.jpg';
const imageBase64 = await convertImageToBase64(imagePath);
return {
key: 'builtin_1',
name: 'template1',
isBaseline: false,
isPerspectiveCorrection: false,
binaryThreshold: 100,
gaussianBlur: 1,
physicalRadius: 40.0,
gradientThresholdValue: 100,
anchorThresholdValue: 80,
imageUrl: imageBase64,
id: 'builtin_1',
};
} catch (error) {
console.error('创建内置模板失败:', error);
// 如果图片加载失败,返回不带图片的内置模板
return {
key: 'builtin_1',
name: '模板1',
isBaseline: false,
isPerspectiveCorrection: false,
binaryThreshold: 100,
gaussianBlur: 1,
physicalRadius: 40.0,
gradientThresholdValue: 100,
anchorThresholdValue: 80,
imageUrl: "",
id: 'builtin_1',
};
}
};
// localStorage 工具函数
const saveTemplatesToStorage = (templates) => {
try {
localStorage.setItem(TEMPLATE_STORAGE_KEY, JSON.stringify(templates));
return true;
} catch (error) {
console.error('保存模板数据到localStorage失败:', error);
return false;
}
};
const getTemplatesFromStorage = () => {
try {
const stored = localStorage.getItem(TEMPLATE_STORAGE_KEY);
return stored ? JSON.parse(stored) : null;
} catch (error) {
console.error('从localStorage读取模板数据失败:', error);
return null;
}
};
// 模板存储管理 Hook
export const useTemplateStorage = () => {
const [templates, setTemplates] = useState([]);
const [loading, setLoading] = useState(true);
// 初始化加载模板数据
useEffect(() => {
const loadTemplates = async () => {
const storedTemplates = getTemplatesFromStorage();
if (storedTemplates && storedTemplates.length > 0) {
// 如果localStorage中有数据,检查是否已有内置模板
const hasBuiltinTemplate = storedTemplates.some(template => template.key === 'builtin_1');
if (!hasBuiltinTemplate) {
// 如果没有内置模板,添加内置模板
try {
const builtinTemplate = await createBuiltinTemplate();
const updatedTemplates = [builtinTemplate, ...storedTemplates];
setTemplates(updatedTemplates);
saveTemplatesToStorage(updatedTemplates);
console.log('内置模板已添加到现有模板列表');
} catch (error) {
console.error('添加内置模板失败:', error);
setTemplates(storedTemplates);
}
} else {
// 已有内置模板,直接使用现有数据
setTemplates(storedTemplates);
}
} else {
// 如果localStorage中没有数据,只创建内置模板
try {
const builtinTemplate = await createBuiltinTemplate();
const allTemplates = [builtinTemplate];
setTemplates(allTemplates);
saveTemplatesToStorage(allTemplates);
console.log('已创建内置模板');
} catch (error) {
console.error('创建内置模板失败:', error);
// 如果创建失败,创建空模板列表
setTemplates([]);
saveTemplatesToStorage([]);
}
}
setLoading(false);
};
loadTemplates();
}, []);
// 添加模板
const addTemplate = (templateInfo) => {
const newTemplates = [...templates, templateInfo];
setTemplates(newTemplates);
const saved = saveTemplatesToStorage(newTemplates);
if (!saved) {
// 如果保存失败,回滚状态
console.error('添加模板失败:无法保存到localStorage');
return false;
}
return true;
};
// 更新模板
const updateTemplate = (templateInfo) => {
const updatedTemplates = templates.map((item) =>
item.key === templateInfo.key ? templateInfo : item
);
setTemplates(updatedTemplates);
const saved = saveTemplatesToStorage(updatedTemplates);
if (!saved) {
// 如果保存失败,回滚状态
console.error('更新模板失败:无法保存到localStorage');
setTemplates(templates); // 回滚到原状态
return false;
}
return true;
};
// 删除模板
const deleteTemplate = (templateKey) => {
const filteredTemplates = templates.filter((item) => item.key !== templateKey);
setTemplates(filteredTemplates);
const saved = saveTemplatesToStorage(filteredTemplates);
if (!saved) {
// 如果保存失败,回滚状态
console.error('删除模板失败:无法保存到localStorage');
setTemplates(templates); // 回滚到原状态
return false;
}
return true;
};
// 根据key查找模板
const getTemplateByKey = (key) => {
return templates.find(template => template.key === key);
};
// 清空所有模板
const clearAllTemplates = () => {
setTemplates([]);
const saved = saveTemplatesToStorage([]);
if (!saved) {
console.error('清空模板失败:无法保存到localStorage');
return false;
}
return true;
};
// 重置为默认模板
const resetToDefaultTemplates = async () => {
try {
const builtinTemplate = await createBuiltinTemplate();
const allTemplates = [builtinTemplate];
setTemplates(allTemplates);
const saved = saveTemplatesToStorage(allTemplates);
if (!saved) {
console.error('重置模板失败:无法保存到localStorage');
return false;
}
return true;
} catch (error) {
console.error('重置模板失败:', error);
return false;
}
};
return {
templates,
loading,
addTemplate,
updateTemplate,
deleteTemplate,
getTemplateByKey,
clearAllTemplates,
resetToDefaultTemplates,
};
};
export default useTemplateStorage;