feat: 在场景编辑器中新增机器人数据合并功能,优化场景加载逻辑,支持合并多楼层机器人组和标签,提升数据处理能力

This commit is contained in:
xudan 2025-10-15 10:25:47 +08:00
parent f41e6cf1d3
commit b4311eeeb5
3 changed files with 65 additions and 5 deletions

View File

@ -277,7 +277,7 @@ const importScene = async () => {
currentFloorIndex.value = 0;
previousFloorIndex.value = 0;
//
await editor.value?.load(floorScenes.value[0], editable.value, undefined, requireImportTransform.value);
await editor.value?.load(floorScenes.value[0], editable.value, undefined, requireImportTransform.value, true);
message.success(`成功导入 ${sceneData.length} 个楼层,当前显示第一层。`);
} else {
message.warn('导入的场景文件是一个空数组,已加载空场景。');
@ -293,7 +293,7 @@ const importScene = async () => {
currentFloorIndex.value = 0;
previousFloorIndex.value = 0;
// editor.load
await editor.value?.load(sceneData, editable.value, undefined, requireImportTransform.value);
await editor.value?.load(sceneData, editable.value, undefined, requireImportTransform.value, true);
message.success('成功导入单楼层场景。');
} else {
message.error('导入失败,场景文件为空或格式不正确。');
@ -332,7 +332,7 @@ const handleImportSmapConfirm = async ({ smapFile, keepProperties }: { smapFile:
if (sceneJson) {
requireImportTransform.value = true;
editor.value?.load(sceneJson, editable.value, undefined, requireImportTransform.value);
editor.value?.load(sceneJson, editable.value, undefined, requireImportTransform.value, true);
}
};
@ -450,7 +450,13 @@ const handleFloorChange = async (value: any) => {
//
currentFloorIndex.value = newFloorIndex;
previousFloorIndex.value = newFloorIndex;
await editor.value.load(floorScenes.value[newFloorIndex], editable.value, undefined, requireImportTransform.value);
await editor.value.load(
floorScenes.value[newFloorIndex],
editable.value,
undefined,
requireImportTransform.value,
true, // Merge robot data
);
} else {
currentFloorIndex.value = newFloorIndex;
previousFloorIndex.value = newFloorIndex;

View File

@ -55,6 +55,55 @@ export class EditorRobotService {
this.syncRobotLabels();
}
public mergeRobotsData(groups?: RobotGroup[], robots?: RobotInfo[], labels?: RobotLabel[]): void {
const existingGroups = clone(this.robotGroups$$.value);
const existingLabels = clone(this.robotLabels$$.value);
// Merge robot groups
groups?.forEach(newGroup => {
const existingGroup = existingGroups.find(g => g.id === newGroup.id || g.label === newGroup.label);
if (existingGroup) {
// Merge robots within the group
newGroup.robots?.forEach(robotId => {
if (!existingGroup.robots?.includes(robotId)) {
existingGroup.robots?.push(robotId);
}
});
} else {
existingGroups.push(newGroup);
}
});
// Merge robot labels
labels?.forEach(newLabel => {
const existingLabel = existingLabels.find(l => l.id === newLabel.id || l.label === newLabel.label);
if (existingLabel) {
// Merge robots within the label
newLabel.robots?.forEach(robotId => {
if (!existingLabel.robots?.includes(robotId)) {
existingLabel.robots?.push(robotId);
}
});
} else {
existingLabels.push(newLabel);
}
});
// Merge robots
robots?.forEach(robot => {
if (!this.robotMap.has(robot.id)) {
this.robotMap.set(robot.id, robot);
}
});
this.robotGroups$$.next(existingGroups);
this.robotLabels$$.next(existingLabels);
this.syncRobots();
this.syncRobotGroups();
this.syncRobotLabels();
}
public get robots(): RobotInfo[] {
return Array.from(this.robotMap.values());
}

View File

@ -78,6 +78,7 @@ export class EditorService extends Meta2d {
editable = false,
detail?: Partial<GroupSceneDetail>,
isImport = false,
isMerge = false,
): Promise<void> {
const sceneData = (isString(map) ? (map ? JSON.parse(map) : {}) : map);
const scene: StandardScene = sceneData || {};
@ -93,7 +94,11 @@ export class EditorService extends Meta2d {
this.open();
this.setState(editable);
this.robotService.loadInitialData(robotGroups, robots, robotLabels);
if (isMerge) {
this.robotService.mergeRobotsData(robotGroups, robots, robotLabels);
} else {
this.robotService.loadInitialData(robotGroups, robots, robotLabels);
}
await this.#loadScenePoints(points, isImport);
this.#loadSceneRoutes(routes, isImport);
await this.#loadSceneAreas(areas, isImport);