Initial commit

This commit is contained in:
libertyspy
2026-02-08 22:09:28 +08:00
parent a5a3c93135
commit 5ffdb5e508
3 changed files with 59 additions and 4 deletions

View File

@@ -986,6 +986,7 @@
width: 300px; width: 300px;
float: left; float: left;
margin-left: -1px; margin-left: -1px;
background: #041b36db;
.observation-items{ .observation-items{
//height: 160px; //height: 160px;

View File

@@ -47,6 +47,8 @@
<Properties <Properties
v-if="graph" v-if="graph"
@update-element="handleUpdateElement" @update-element="handleUpdateElement"
:tree="currentBehaviorTree"
:tree-editing="currentTreeEditing"
:element="selectedNodeTaskElement" :element="selectedNodeTaskElement"
:graph="graph as any" :graph="graph as any"
:node="selectedModelNode as any" /> :node="selectedModelNode as any" />
@@ -100,6 +102,7 @@ export default defineComponent({
const currentZoom = ref<number>(1); const currentZoom = ref<number>(1);
const draggedNodeData = ref<NodeTemplate | null>(null); const draggedNodeData = ref<NodeTemplate | null>(null);
const isDraggingOver = ref(false); const isDraggingOver = ref(false);
const currentTreeEditing = ref<boolean>(false);
const currentBehaviorTree = ref<BehaviorTree | null>(null); const currentBehaviorTree = ref<BehaviorTree | null>(null);
const currentNodeGraph = ref<NodeGraph | null>(null); const currentNodeGraph = ref<NodeGraph | null>(null);
const selectedModelNode = ref<Node<NodeProperties> | null>(null); const selectedModelNode = ref<Node<NodeProperties> | null>(null);
@@ -154,6 +157,7 @@ export default defineComponent({
safePreventDefault(e); safePreventDefault(e);
safeStopPropagation(e); safeStopPropagation(e);
isDraggingOver.value = false; isDraggingOver.value = false;
currentTreeEditing.value = false;
if (!currentBehaviorTree.value) { if (!currentBehaviorTree.value) {
message.error('请先选择或者创建行为树.'); message.error('请先选择或者创建行为树.');
@@ -224,6 +228,7 @@ export default defineComponent({
...r.data, ...r.data,
graph: nodeGraph, graph: nodeGraph,
}; };
currentTreeEditing.value = true;
createElements(); createElements();
} else { } else {
message.error(r.msg ?? '行为树不存在.'); message.error(r.msg ?? '行为树不存在.');
@@ -275,6 +280,12 @@ export default defineComponent({
currentZoom.value = sx; currentZoom.value = sx;
}); });
handleGraphEvent('blank:click', () => {
selectedModelNode.value = null;
selectedNodeTaskElement.value = null;
currentTreeEditing.value = null !== currentBehaviorTree.value;
});
handleGraphEvent('node:click', (args: any) => { handleGraphEvent('node:click', (args: any) => {
const node = args.node as Node<NodeProperties>; const node = args.node as Node<NodeProperties>;
const newElement = node.getData() as GraphTaskElement; const newElement = node.getData() as GraphTaskElement;
@@ -368,6 +379,7 @@ export default defineComponent({
}); });
return { return {
currentTreeEditing,
currentBehaviorTree, currentBehaviorTree,
currentNodeGraph, currentNodeGraph,
selectedNodeTaskElement, selectedNodeTaskElement,

View File

@@ -1,12 +1,31 @@
<template> <template>
<div class="ks-model-builder-right"> <div class="ks-model-builder-right">
<template v-if="currentElement"> <template v-if="currentElement || tree">
<a-tabs v-model:activeKey="activeTopTabsKey" class="ks-model-builder-tabs settings-tab"> <a-tabs v-model:activeKey="activeTopTabsKey" class="ks-model-builder-tabs settings-tab">
<template #leftExtra> <template #leftExtra>
<span class="ks-model-builder-title-icon icon-input"></span> <span class="ks-model-builder-title-icon icon-input"></span>
</template> </template>
<a-tab-pane key="1" tab="节点属性">
<a-tab-pane key="1" tab="行为树属性" v-if="tree">
<a-form
autocomplete="off"
layout="vertical"
name="basic"
style="padding-bottom:15px;"
>
<a-form-item label="行为树名称">
<a-input size="small" v-model:value="tree.name" placeholder="行为树名称" />
</a-form-item>
<a-form-item label="行为树说明">
<a-textarea size="small" v-model:value="tree.description" placeholder="行为树说明" />
</a-form-item>
</a-form>
</a-tab-pane>
<a-tab-pane key="2" tab="节点属性" v-if="currentElement">
<a-form <a-form
autocomplete="off" autocomplete="off"
layout="vertical" layout="vertical"
@@ -42,7 +61,7 @@
</a-tabs> </a-tabs>
<a-tabs v-model:activeKey="activeBottomTabsKey" class="ks-model-builder-tabs parameters-tabs"> <a-tabs v-if="currentElement" v-model:activeKey="activeBottomTabsKey" class="ks-model-builder-tabs parameters-tabs">
<template #leftExtra> <template #leftExtra>
<span class="ks-model-builder-title-icon icon-input"></span> <span class="ks-model-builder-title-icon icon-input"></span>
</template> </template>
@@ -106,6 +125,7 @@
import { defineComponent, onMounted, type PropType, ref, watch } from 'vue'; import { defineComponent, onMounted, type PropType, ref, watch } from 'vue';
import { CheckOutlined } from '@ant-design/icons-vue'; import { CheckOutlined } from '@ant-design/icons-vue';
import type { ElementVariable, GraphTaskElement } from './builder/element'; import type { ElementVariable, GraphTaskElement } from './builder/element';
import type {BehaviorTree} from './types'
import type { Graph, Node, NodeProperties } from '@antv/x6'; import type { Graph, Node, NodeProperties } from '@antv/x6';
import { generateKey } from '@/utils/strings'; import { generateKey } from '@/utils/strings';
@@ -120,15 +140,19 @@ const actionSpaceColumns = [
export default defineComponent({ export default defineComponent({
components: { CheckOutlined }, components: { CheckOutlined },
props: { props: {
tree: { type: [Object, null] as PropType<BehaviorTree | null | undefined>, required: false },
treeEditing: { type: Boolean as PropType<boolean>, required: true, default: false, },
node: { type: [Object, null] as PropType<Node<NodeProperties> | null | undefined>, required: false }, node: { type: [Object, null] as PropType<Node<NodeProperties> | null | undefined>, required: false },
graph: { type: [Object, null] as PropType<Graph | null | undefined>, required: true } graph: { type: [Object, null] as PropType<Graph | null | undefined>, required: true }
}, },
emits: ['update-element'], emits: ['update-element', 'update-tree'],
setup(props, { emit }) { setup(props, { emit }) {
const activeTopTabsKey = ref<string>('1'); const activeTopTabsKey = ref<string>('1');
const activeBottomTabsKey = ref<string>('1'); const activeBottomTabsKey = ref<string>('1');
const activeBottomTabs2Key = ref<string>('1'); const activeBottomTabs2Key = ref<string>('1');
const currentTree = ref<BehaviorTree| null>(props.tree ?? null);
const treeEditing = ref<boolean>(props.treeEditing);
const currentNode = ref<Node | null>(props.node ?? null); const currentNode = ref<Node | null>(props.node ?? null);
const currentElement = ref<GraphTaskElement | null>(null); const currentElement = ref<GraphTaskElement | null>(null);
@@ -186,6 +210,22 @@ export default defineComponent({
{ deep: true, immediate: true }, { deep: true, immediate: true },
); );
watch(
() => props.tree,
(n?: BehaviorTree | null | undefined) => {
currentTree.value = n ?? null;
},
{ deep: true, immediate: true },
);
watch(
() => props.treeEditing,
(n?: boolean | null | undefined) => {
treeEditing.value = n === true;
},
{ deep: true, immediate: true },
);
watch(() => currentElement.value, () => updateNode(), { deep: true }); watch(() => currentElement.value, () => updateNode(), { deep: true });
onMounted(() => load()); onMounted(() => load());
@@ -198,6 +238,8 @@ export default defineComponent({
currentElement, currentElement,
addVariable, addVariable,
removeVariable, removeVariable,
currentTree,
treeEditing,
// currentElementParameters, // currentElementParameters,
}; };
}, },