feat: frontend add boundary scan

This commit is contained in:
2025-05-19 13:30:06 +08:00
parent 2a3ef1ea7d
commit 5042bf8ce5
12 changed files with 611 additions and 538 deletions

View File

@@ -1,81 +1,103 @@
import { ref, reactive } from 'vue';
import { ref, computed, reactive } from 'vue'
import { defineStore } from 'pinia'
import { isBoolean } from 'lodash';
// 约束电平状态类型
export type ConstraintLevel = 'high' | 'low' | 'undefined';
// 约束状态存储
const constraintStates = reactive<Record<string, ConstraintLevel>>({});
export const useConstraintsStore = defineStore('constraints', () => {
// 约束颜色映射
export const constraintColors = {
high: '#ff3333', // 高电平为红色
low: '#3333ff', // 低电平为蓝色
undefined: '#999999' // 未定义为灰色
};
// 约束状态存储
const constraintStates = reactive<Record<string, ConstraintLevel>>({});
// 获取约束状态
export function getConstraintState(constraint: string): ConstraintLevel {
if (!constraint) return 'undefined';
return constraintStates[constraint] || 'undefined';
}
// 设置约束状态
export function setConstraintState(constraint: string, level: ConstraintLevel) {
if (!constraint) return;
constraintStates[constraint] = level;
}
// 批量设置约束状态
export function batchSetConstraintStates(states: Record<string, ConstraintLevel>) {
// 收集发生变化的约束
const changedConstraints: [string, ConstraintLevel][] = [];
// 更新状态并收集变化
Object.entries(states).forEach(([constraint, level]) => {
if (constraintStates[constraint] !== level) {
constraintStates[constraint] = level;
changedConstraints.push([constraint, level]);
}
});
// 通知所有变化
changedConstraints.forEach(([constraint, level]) => {
stateChangeCallbacks.forEach(callback => callback(constraint, level));
});
}
// 获取约束对应的颜色
export function getConstraintColor(constraint: string): string {
const state = getConstraintState(constraint);
return constraintColors[state];
}
// 清除所有约束状态
export function clearAllConstraintStates() {
Object.keys(constraintStates).forEach(key => {
delete constraintStates[key];
});
}
// 获取所有约束状态
export function getAllConstraintStates(): Record<string, ConstraintLevel> {
return { ...constraintStates };
}
// 注册约束状态变化回调
const stateChangeCallbacks: ((constraint: string, level: ConstraintLevel) => void)[] = [];
export function onConstraintStateChange(callback: (constraint: string, level: ConstraintLevel) => void) {
stateChangeCallbacks.push(callback);
return () => {
const index = stateChangeCallbacks.indexOf(callback);
if (index > -1) {
stateChangeCallbacks.splice(index, 1);
}
// 约束颜色映射
const constraintColors = {
high: '#ff3333', // 高电平为红色
low: '#3333ff', // 低电平为蓝色
undefined: '#999999' // 未定义为灰色
};
}
// 触发约束变化
export function notifyConstraintChange(constraint: string, level: ConstraintLevel) {
setConstraintState(constraint, level);
stateChangeCallbacks.forEach(callback => callback(constraint, level));
}
// 获取约束状态
function getConstraintState(constraint: string): ConstraintLevel {
if (!constraint) return 'undefined';
return constraintStates[constraint] || 'undefined';
}
// 设置约束状态
function setConstraintState(constraint: string, level: ConstraintLevel) {
if (!constraint) return;
constraintStates[constraint] = level;
}
// 批量设置约束状态
function batchSetConstraintStates(states: Record<string, ConstraintLevel> | Record<string, boolean>) {
// 收集发生变化的约束
const changedConstraints: [string, ConstraintLevel][] = [];
// 更新状态并收集变化
Object.entries(states).forEach(([constraint, level]) => {
if (isBoolean(level)) {
level = level ? "high" : "low";
}
if (constraintStates[constraint] !== level) {
constraintStates[constraint] = level;
changedConstraints.push([constraint, level]);
}
});
// 通知所有变化
changedConstraints.forEach(([constraint, level]) => {
stateChangeCallbacks.forEach(callback => callback(constraint, level));
});
}
// 获取约束对应的颜色
function getConstraintColor(constraint: string): string {
const state = getConstraintState(constraint);
return constraintColors[state];
}
// 清除所有约束状态
function clearAllConstraintStates() {
Object.keys(constraintStates).forEach(key => {
delete constraintStates[key];
});
}
// 获取所有约束状态
function getAllConstraintStates(): Record<string, ConstraintLevel> {
return { ...constraintStates };
}
// 注册约束状态变化回调
const stateChangeCallbacks: ((constraint: string, level: ConstraintLevel) => void)[] = [];
function onConstraintStateChange(callback: (constraint: string, level: ConstraintLevel) => void) {
stateChangeCallbacks.push(callback);
return () => {
const index = stateChangeCallbacks.indexOf(callback);
if (index > -1) {
stateChangeCallbacks.splice(index, 1);
}
};
}
// 触发约束变化
function notifyConstraintChange(constraint: string, level: ConstraintLevel) {
setConstraintState(constraint, level);
stateChangeCallbacks.forEach(callback => callback(constraint, level));
}
return {
getConstraintState,
setConstraintState,
batchSetConstraintStates,
getConstraintColor,
clearAllConstraintStates,
getAllConstraintStates,
onConstraintStateChange,
notifyConstraintChange,
}
})