|
|
@ -76,10 +76,7 @@ const CameraView = ({ |
|
|
|
canvas.style.width = rect.width + "px"; |
|
|
|
canvas.style.height = rect.height + "px"; |
|
|
|
|
|
|
|
console.log("resizeCanvas: 画布大小已调整", { |
|
|
|
width: rect.width, |
|
|
|
height: rect.height, |
|
|
|
}); |
|
|
|
// console.log("resizeCanvas: 画布大小已调整", { width: rect.width, height: rect.height }); |
|
|
|
|
|
|
|
// 延迟调用applyTransform,确保画布已经完全设置好 |
|
|
|
setTimeout(() => { |
|
|
@ -95,14 +92,12 @@ const CameraView = ({ |
|
|
|
if (img.naturalWidth && img.naturalHeight) { |
|
|
|
setVideoNaturalWidth(img.naturalWidth); |
|
|
|
setVideoNaturalHeight(img.naturalHeight); |
|
|
|
console.log( |
|
|
|
`handleImageLoad: 视频原始分辨率: ${img.naturalWidth}x${img.naturalHeight}` |
|
|
|
); |
|
|
|
// console.log(`handleImageLoad: 视频原始分辨率: ${img.naturalWidth}x${img.naturalHeight}`); |
|
|
|
} |
|
|
|
resizeCanvas(); |
|
|
|
// 视频加载完成后,确保重新绘制矩形框 |
|
|
|
setTimeout(() => { |
|
|
|
console.log("handleImageLoad: 延迟重绘矩形框"); |
|
|
|
// console.log("handleImageLoad: 延迟重绘矩形框"); |
|
|
|
redrawAllRectangles(); |
|
|
|
}, 200); |
|
|
|
} |
|
|
@ -229,7 +224,7 @@ const CameraView = ({ |
|
|
|
(target) => target.id === clickedRectangle.id |
|
|
|
); |
|
|
|
if (targetData) { |
|
|
|
console.log("点击矩形框,弹出标靶详情:", targetData); |
|
|
|
// console.log("点击矩形框,弹出标靶详情:", targetData); |
|
|
|
onRectangleClick(targetData); |
|
|
|
} |
|
|
|
} |
|
|
@ -317,13 +312,13 @@ const CameraView = ({ |
|
|
|
|
|
|
|
setRectangles((prev) => [...prev, newRect]); |
|
|
|
|
|
|
|
console.log("新建矩形:", newRect); |
|
|
|
// console.log("新建矩形:", newRect); |
|
|
|
if (selectedTemplate) { |
|
|
|
console.log("使用模板参数:", selectedTemplate); |
|
|
|
// console.log("使用模板参数:", selectedTemplate); |
|
|
|
} else { |
|
|
|
console.log("使用默认参数"); |
|
|
|
// console.log("使用默认参数"); |
|
|
|
} |
|
|
|
logRectangleData(); |
|
|
|
// logRectangleData(); |
|
|
|
} |
|
|
|
}; // 拖拽已存在的矩形 |
|
|
|
const dragExistingRectangle = (mouseX, mouseY) => { |
|
|
@ -703,15 +698,15 @@ const CameraView = ({ |
|
|
|
const handleSave = useCallback(async () => { |
|
|
|
// 防止重复保存 |
|
|
|
if (isSaving) { |
|
|
|
console.log("正在保存中,忽略重复请求"); |
|
|
|
// console.log("正在保存中,忽略重复请求"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
console.log("=== 保存矩形信息 ==="); |
|
|
|
console.log("矩形总数:", rectangles.length); |
|
|
|
// console.log("=== 保存矩形信息 ==="); |
|
|
|
// console.log("矩形总数:", rectangles.length); |
|
|
|
|
|
|
|
if (rectangles.length === 0) { |
|
|
|
console.log("没有创建任何矩形"); |
|
|
|
// console.log("没有创建任何矩形"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
@ -720,7 +715,7 @@ const CameraView = ({ |
|
|
|
try { |
|
|
|
// 组装指定格式的数据 |
|
|
|
const targets = {}; |
|
|
|
console.log(rectangles, "当前矩形数据"); |
|
|
|
// console.log(rectangles, "当前矩形数据"); |
|
|
|
|
|
|
|
rectangles.forEach((rect, index) => { |
|
|
|
targets[index.toString()] = { |
|
|
@ -758,7 +753,7 @@ const CameraView = ({ |
|
|
|
}, |
|
|
|
}; |
|
|
|
|
|
|
|
console.log("格式化数据:"); |
|
|
|
// console.log("格式化数据:"); |
|
|
|
|
|
|
|
// 手动序列化以保持浮点数格式 |
|
|
|
const jsonString = JSON.stringify(outputData, null, 2).replace( |
|
|
@ -770,7 +765,7 @@ const CameraView = ({ |
|
|
|
const success = sendMessage(jsonString); |
|
|
|
|
|
|
|
if (success) { |
|
|
|
console.log("数据已发送到服务器"); |
|
|
|
// console.log("数据已发送到服务器"); |
|
|
|
|
|
|
|
// 保存成功后刷新标靶列表数据 |
|
|
|
setTimeout(() => { |
|
|
@ -832,14 +827,14 @@ const CameraView = ({ |
|
|
|
// 监听视频尺寸变化,确保重新绘制 |
|
|
|
useEffect(() => { |
|
|
|
if (videoNaturalWidth && videoNaturalHeight) { |
|
|
|
console.log("视频尺寸已更新,重新绘制矩形框"); |
|
|
|
// console.log("视频尺寸已更新,重新绘制矩形框"); |
|
|
|
redrawAllRectangles(); |
|
|
|
} |
|
|
|
}, [videoNaturalWidth, videoNaturalHeight]); |
|
|
|
|
|
|
|
// 监听矩形列表变化,自动重绘 |
|
|
|
useEffect(() => { |
|
|
|
console.log("矩形列表发生变化,重新绘制:", rectangles); |
|
|
|
// console.log("矩形列表发生变化,重新绘制:", rectangles); |
|
|
|
// 使用requestAnimationFrame来优化重绘性能 |
|
|
|
const rafId = requestAnimationFrame(() => { |
|
|
|
redrawAllRectangles(); |
|
|
@ -848,27 +843,22 @@ const CameraView = ({ |
|
|
|
return () => cancelAnimationFrame(rafId); |
|
|
|
}, [rectangles]); |
|
|
|
|
|
|
|
// 强制刷新矩形框的函数 |
|
|
|
const forceRefreshRectangles = useCallback(() => { |
|
|
|
console.log("强制刷新矩形框"); |
|
|
|
redrawAllRectangles(); |
|
|
|
}, []); |
|
|
|
|
|
|
|
// 从标靶数据初始化矩形框 |
|
|
|
useEffect(() => { |
|
|
|
console.log("targets 或 loading 状态变化:", { |
|
|
|
targets, |
|
|
|
loading, |
|
|
|
targetsLength: targets?.length, |
|
|
|
}); |
|
|
|
// console.log("targets 或 loading 状态变化:", { |
|
|
|
// targets, |
|
|
|
// loading, |
|
|
|
// targetsLength: targets?.length, |
|
|
|
// }); |
|
|
|
|
|
|
|
if (!loading && targets && targets.length > 0) { |
|
|
|
console.log("从标靶数据初始化矩形框:", targets); |
|
|
|
// console.log("从标靶数据初始化矩形框:", targets); |
|
|
|
|
|
|
|
const initialRectangles = targets |
|
|
|
.map((target) => { |
|
|
|
const rectangleArea = target.rectangleArea; |
|
|
|
console.log("处理标靶:", target.id, "矩形区域:", rectangleArea); |
|
|
|
// console.log("处理标靶:", target.id, "矩形区域:", rectangleArea); |
|
|
|
if ( |
|
|
|
rectangleArea && |
|
|
|
rectangleArea.x !== undefined && |
|
|
@ -896,17 +886,17 @@ const CameraView = ({ |
|
|
|
}) |
|
|
|
.filter((rect) => rect !== null); // 过滤掉空值 |
|
|
|
|
|
|
|
console.log("生成的矩形框数据:", initialRectangles); |
|
|
|
console.log("当前矩形框数据:", rectangles); |
|
|
|
console.log( |
|
|
|
"标靶数据详情:", |
|
|
|
targets.map((t) => ({ id: t.id, rectangleArea: t.rectangleArea })) |
|
|
|
); |
|
|
|
// console.log("生成的矩形框数据:", initialRectangles); |
|
|
|
// console.log("当前矩形框数据:", rectangles); |
|
|
|
// console.log( |
|
|
|
// "标靶数据详情:", |
|
|
|
// targets.map((t) => ({ id: t.id, rectangleArea: t.rectangleArea })) |
|
|
|
// ); |
|
|
|
|
|
|
|
// 总是根据targets数据更新rectangles,确保数据同步 |
|
|
|
console.log("强制更新矩形框数据以确保与targets同步"); |
|
|
|
// console.log("强制更新矩形框数据以确保与targets同步"); |
|
|
|
setRectangles(initialRectangles); |
|
|
|
console.log("已从标靶数据强制更新矩形框:", initialRectangles); |
|
|
|
// console.log("已从标靶数据强制更新矩形框:", initialRectangles); |
|
|
|
|
|
|
|
// 矩形框更新后,延迟一下确保重绘 |
|
|
|
const timeoutId = setTimeout(() => { |
|
|
@ -915,18 +905,18 @@ const CameraView = ({ |
|
|
|
return () => clearTimeout(timeoutId); |
|
|
|
} else if (!loading && (!targets || targets.length === 0)) { |
|
|
|
// 如果没有标靶数据,清空矩形框 |
|
|
|
console.log( |
|
|
|
"标靶数据为空,准备清空矩形框,当前矩形框数量:", |
|
|
|
rectangles.length |
|
|
|
); |
|
|
|
// console.log( |
|
|
|
// "标靶数据为空,准备清空矩形框,当前矩形框数量:", |
|
|
|
// rectangles.length |
|
|
|
// ); |
|
|
|
setRectangles([]); |
|
|
|
console.log("标靶数据为空,已清空矩形框"); |
|
|
|
// console.log("标靶数据为空,已清空矩形框"); |
|
|
|
} |
|
|
|
}, [targets, loading]); // 只依赖targets和loading状态 |
|
|
|
|
|
|
|
// 专门监听rectangles变化并重绘 |
|
|
|
useEffect(() => { |
|
|
|
console.log("rectangles状态变化:", rectangles); |
|
|
|
// console.log("rectangles状态变化:", rectangles); |
|
|
|
// 矩形状态改变时立即重绘 |
|
|
|
if (videoNaturalWidth && videoNaturalHeight) { |
|
|
|
// 如果矩形数组为空,强制清除画布 |
|
|
@ -935,7 +925,7 @@ const CameraView = ({ |
|
|
|
if (canvas) { |
|
|
|
const ctx = canvas.getContext("2d"); |
|
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height); |
|
|
|
console.log("强制清除画布,因为矩形数组为空"); |
|
|
|
// console.log("强制清除画布,因为矩形数组为空"); |
|
|
|
} |
|
|
|
} else { |
|
|
|
redrawAllRectangles(); |
|
|
@ -958,7 +948,7 @@ const CameraView = ({ |
|
|
|
|
|
|
|
// 监听选中标靶变化,重新绘制高亮效果 |
|
|
|
useEffect(() => { |
|
|
|
console.log("选中标靶ID变化:", selectedTargetId); |
|
|
|
// console.log("选中标靶ID变化:", selectedTargetId); |
|
|
|
// 只有在有矩形框的时候才重绘,使用requestAnimationFrame优化性能 |
|
|
|
if (rectangles.length > 0) { |
|
|
|
const rafId = requestAnimationFrame(() => { |
|
|
|