@mx-sose-front/mx-sose-graph 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/index.d.ts +178 -10
  2. package/dist/index.esm.js +4944 -63227
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.umd.js +1 -38
  5. package/dist/index.umd.js.map +1 -1
  6. package/dist/style.css +1 -1
  7. package/package.json +10 -1
  8. package/src/components/ContextMenu/ContextMenu.vue +27 -13
  9. package/src/components/DiagramListTooltip/DiagramListTooltip.vue +7 -12
  10. package/src/components/InteractionLayer.vue +656 -496
  11. package/src/components/LineStyle/LineStyleMarker.vue +1 -1
  12. package/src/components/NameEditor/NameEditor.vue +212 -0
  13. package/src/components/SelectionBox/SelectionBox.vue +189 -0
  14. package/src/components/Shape/Block.vue +1 -1
  15. package/src/constants/edgeShapeKeys.ts +43 -3
  16. package/src/constants/index.ts +21 -4
  17. package/src/hooks/index.ts +3 -0
  18. package/src/hooks/useHighlight.ts +223 -0
  19. package/src/hooks/useNameEdit.ts +234 -0
  20. package/src/{utils/resizeUtils.ts → hooks/useResize.ts} +55 -155
  21. package/src/index.ts +4 -1
  22. package/src/render/shape-renderer.ts +59 -46
  23. package/src/statics/icons/createMenu/show.png +0 -0
  24. package/src/statics/icons/createMenu/tree.png +0 -0
  25. package/src/statics/icons/createMenu//345/261/225/347/244/272/347/253/257/345/217/243/345/261/236/346/200/247@3x.png +0 -0
  26. package/src/statics/icons/createMenu//345/261/225/347/244/272/350/277/236/347/272/277@3x.png +0 -0
  27. package/src/statics/icons/createMenu//346/211/200/345/234/250/345/233/276/350/241/250@3x.png +0 -0
  28. package/src/store/graphStore.ts +185 -65
  29. package/src/types/index.ts +4 -2
  30. package/src/types/interactionLayer.ts +1 -0
  31. package/src/utils/batchAutoExpand.ts +65 -0
  32. package/src/utils/compartment.ts +78 -4
  33. package/src/utils/containers.ts +24 -10
  34. package/src/utils/contextMenuUtils.ts +126 -110
  35. package/src/utils/diagram.ts +19 -15
  36. package/src/utils/drag.ts +10 -5
  37. package/src/utils/edgeUtils.ts +3 -4
  38. package/src/utils/graphDragService.ts +27 -23
  39. package/src/utils/iconLoader.ts +7 -7
  40. package/src/utils/keyboardUtils.ts +221 -30
  41. package/src/utils/pinUtils.ts +1 -2
  42. package/src/utils/shapeOps/shapeOps.ts +168 -0
  43. package/src/utils/viewportCulling.ts +193 -0
  44. package/src/view/graph.vue +115 -60
  45. package/src/utils/highlightUtils.ts +0 -162
  46. package/src/utils/nameEditUtils.ts +0 -132
  47. package/src/utils/packgeMap.ts +0 -1
  48. /package/src/statics/icons/createMenu/{scissors.png → cut.png} +0 -0
@@ -25,7 +25,7 @@
25
25
 
26
26
  <!-- 泛化 - 空心三角形箭头 -->
27
27
  <template v-else-if="shapeKey === EDGE_TYPE.GENERALIZATION">
28
- <marker :id="`diamond-${shapeKey}`" markerWidth="10" markerHeight="7" refX="" refY="3.5" orient="auto">
28
+ <marker :id="`diamond-${shapeKey}`" markerWidth="10" markerHeight="7" refX="0" refY="3.5" orient="auto">
29
29
  <path d="M0 0 L10 3.5 L0 7 Z" fill="none" stroke="#5E5E5E" stroke-width="1" />
30
30
  </marker>
31
31
  </template>
@@ -0,0 +1,212 @@
1
+ <template>
2
+ <!-- 名称虚线框(选中时显示) -->
3
+ <div
4
+ v-if="
5
+ selectedShape &&
6
+ selectedShape.nameBounds &&
7
+ !isEditingName &&
8
+ selectedShape.shapeKey !== 'ConceptRole'
9
+ "
10
+ class="name-text-box-container"
11
+ :style="computedNameTextBoxContainerStyle"
12
+ >
13
+ <div
14
+ class="name-text-box"
15
+ :style="computedNameTextBoxStyle"
16
+ title="点击编辑名称"
17
+ @click="handleNameTextBoxClick"
18
+ ></div>
19
+ </div>
20
+
21
+ <!-- 名称编辑输入框 -->
22
+ <div
23
+ v-if="
24
+ isEditingName &&
25
+ selectedShape &&
26
+ selectedShape.shapeKey !== 'ConceptRole'
27
+ "
28
+ class="name-editor-container"
29
+ :style="computedNameEditorContainerStyle"
30
+ >
31
+ <input
32
+ ref="nameInput"
33
+ v-model="localEditingName"
34
+ class="name-input"
35
+ :style="computedNameInputStyle"
36
+ @blur="handleBlur"
37
+ @keyup.enter="handleKeyUp($event)"
38
+ @keyup.escape="handleKeyUp($event)"
39
+ />
40
+ </div>
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { ref, watch, computed, nextTick, type CSSProperties } from 'vue';
45
+ import type { Shape } from '../../types';
46
+ import { nameTextBoxContainerStyle, nameTextBoxStyle, nameEditorContainerStyle, nameInputStyle } from '../../utils/diagram';
47
+ import type { INameEditManager } from '../../hooks/useNameEdit';
48
+
49
+ // 定义组件的props
50
+ interface NameEditorProps {
51
+ selectedShape: Shape | null;
52
+ canEdit: boolean;
53
+ isEditingName: boolean;
54
+ editingName: string;
55
+ nameEditManager: INameEditManager;
56
+ }
57
+
58
+ // 定义组件的事件
59
+ const emit = defineEmits<{
60
+ (e: 'editName', shape: Shape, newName: string, oldName: string): void;
61
+ }>();
62
+
63
+ // 获取props
64
+ const props = defineProps<NameEditorProps>();
65
+
66
+ // 名称输入框引用
67
+ const nameInput = ref<HTMLInputElement | null>(null);
68
+
69
+ // 创建本地ref存储输入值
70
+ const localEditingName = ref(props.editingName);
71
+
72
+ // 监听props.editingName的变化,同步到本地ref
73
+ watch(() => props.editingName, (newValue) => {
74
+ localEditingName.value = newValue;
75
+ });
76
+
77
+ // 监听nameInput ref变化,将其传递给NameEditManager
78
+ watch(() => nameInput.value, (newValue) => {
79
+ if (newValue) {
80
+ props.nameEditManager.setNameInput(newValue);
81
+ }
82
+ });
83
+
84
+ // 监听本地输入值的变化,同步到nameEditManager
85
+ watch(() => localEditingName.value, (newValue) => {
86
+ // 更新NameEditManager中的editingName状态
87
+ (props.nameEditManager as any).editingName.value = newValue;
88
+ });
89
+
90
+ // 监听selectedShape变化,如果编辑中的形状不是当前选中的形状,取消编辑
91
+ watch(() => props.selectedShape, (newShape) => {
92
+ if (props.isEditingName && (!newShape || newShape.id !== props.selectedShape?.id)) {
93
+ props.nameEditManager.cancelEdit();
94
+ }
95
+ });
96
+
97
+ // 计算名称虚线框容器样式
98
+ const computedNameTextBoxContainerStyle = computed<CSSProperties>(() => {
99
+ if (!props.selectedShape) return {};
100
+ return nameTextBoxContainerStyle(props.selectedShape.id);
101
+ });
102
+
103
+ // 计算名称虚线框样式
104
+ const computedNameTextBoxStyle = computed<CSSProperties>(() => {
105
+ if (!props.selectedShape) return {};
106
+ return nameTextBoxStyle(props.selectedShape);
107
+ });
108
+
109
+ // 计算名称编辑器容器样式
110
+ const computedNameEditorContainerStyle = computed<CSSProperties>(() => {
111
+ if (!props.selectedShape) return {};
112
+ return nameEditorContainerStyle(props.selectedShape);
113
+ });
114
+
115
+ // 计算名称输入框样式
116
+ const computedNameInputStyle = computed<CSSProperties>(() => {
117
+ if (!props.selectedShape) return {};
118
+ return nameInputStyle(props.selectedShape);
119
+ });
120
+
121
+ // 处理名称虚线框点击事件
122
+ const handleNameTextBoxClick = () => {
123
+ if (props.canEdit && props.nameEditManager.canEdit(props.selectedShape)) {
124
+ startEditName();
125
+ }
126
+ };
127
+
128
+ // 开始编辑名称
129
+ const startEditName = async () => {
130
+ await props.nameEditManager.startEdit(props.selectedShape);
131
+ };
132
+
133
+ // 处理失焦事件
134
+ const handleBlur = () => {
135
+ props.nameEditManager.handleBlur(props.selectedShape);
136
+ };
137
+
138
+ // 处理键盘事件
139
+ const handleKeyUp = (event: KeyboardEvent) => {
140
+ props.nameEditManager.handleKeyUp(event, props.selectedShape);
141
+ };
142
+
143
+ // 暴露方法给父组件
144
+ defineExpose({
145
+ startEditName,
146
+ canEdit: (shape: Shape | null) => props.nameEditManager.canEdit(shape),
147
+ cancelEdit: () => props.nameEditManager.cancelEdit(),
148
+ });
149
+ </script>
150
+
151
+ <style scoped>
152
+ /* 名称虚线框容器 */
153
+ .name-text-box-container {
154
+ position: absolute;
155
+ z-index: 1001;
156
+ pointer-events: all;
157
+ }
158
+
159
+ /* 名称虚线框 */
160
+ .name-text-box {
161
+ border: 1px dashed #007bff;
162
+ background: rgba(255, 255, 255, 0.2);
163
+ cursor: pointer;
164
+ pointer-events: all;
165
+ transition: all 0.2s ease;
166
+ border-radius: 4px;
167
+ box-shadow: 0 0 0 1px rgba(0, 123, 255, 0.1);
168
+ height: 100%;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ }
173
+
174
+ .name-text-box:hover {
175
+ border-color: #0056b3;
176
+ background: rgba(0, 123, 255, 0.05);
177
+ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);
178
+ transform: scale(1.02);
179
+ }
180
+
181
+ /* 名称编辑器容器 */
182
+ .name-editor-container {
183
+ position: absolute;
184
+ z-index: 1002;
185
+ display: flex;
186
+ justify-content: center;
187
+ align-items: center;
188
+ pointer-events: all;
189
+ }
190
+
191
+ /* 名称输入框 */
192
+ .name-input {
193
+ width: calc(100% - 20px);
194
+ padding: 2px 4px;
195
+ border: 2px solid #007bff;
196
+ border-radius: 6px;
197
+ font-size: 12px;
198
+ font-weight: 600;
199
+ background: #fff;
200
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
201
+ outline: none;
202
+ text-align: center;
203
+ font-family: inherit;
204
+ resize: none;
205
+ overflow: hidden;
206
+ }
207
+
208
+ .name-input:focus {
209
+ border-color: #0056b3;
210
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
211
+ }
212
+ </style>
@@ -0,0 +1,189 @@
1
+ <template>
2
+ <div class="selection-box" :style="getSelectionBoxStyle(shape)">
3
+ <!-- 只有当shapeType不是edge且不是conceptualRole时才渲染四个角手柄 -->
4
+ <div class="resize-handles" v-show="!isBusy && shape.shapeType !== 'edge'">
5
+ <div
6
+ v-for="h in resizeHandles"
7
+ :key="h.position"
8
+ class="resize-handle"
9
+ :class="[`resize-${h.position}`, { 'is-disabled': isMultiSelected }]"
10
+ :style="getHandleStyle(h, shape)"
11
+ @mousedown.stop.prevent="onHandleMouseDown($event, h.position)"
12
+ />
13
+ </div>
14
+ <div
15
+ class="action-buttons"
16
+ v-show="shouldShowActionButtons"
17
+ :style="actionButtonsStyle(shape)"
18
+ >
19
+ <div v-show="shape.modelTypePropertyId" class="border-btn">
20
+ <button
21
+ class="action-btn edit-btn"
22
+ @mousedown.stop.prevent="onModelTypePropertyIdClick"
23
+ title="设置类型"
24
+ >
25
+ <img src="../../statics/icons/childIcons/设置类型.png" alt="设置类型" />
26
+ </button>
27
+ </div>
28
+ <button
29
+ v-for="value in shape.scenarioMenus"
30
+ :key="value.code"
31
+ class="action-btn edit-btn"
32
+ @mousedown.stop.prevent="onActionButtonClick(value.code)"
33
+ @click.stop.prevent
34
+ :title="value.name"
35
+ >
36
+ <img :src="getIcon('childIcons', value.icon || '')" />
37
+ </button>
38
+ </div>
39
+ </div>
40
+ </template>
41
+
42
+ <script setup lang="ts">
43
+ import { computed } from "vue";
44
+ import type { Shape } from "../../types";
45
+ import { resizeHandles } from "../../constants/index";
46
+ import {
47
+ selectionBoxStyle,
48
+ handleStyle,
49
+ actionButtonsStyle,
50
+ ShapeConfig,
51
+ } from "../../utils/diagram";
52
+ import { getIcon } from "../../utils/iconLoader";
53
+
54
+ // Props
55
+ const props = defineProps<{
56
+ shape: Shape;
57
+ isBusy: boolean;
58
+ isMultiSelected: boolean;
59
+ }>();
60
+
61
+ // 计算属性:是否显示操作按钮
62
+ const shouldShowActionButtons = computed(() => {
63
+ return !props.isMultiSelected &&
64
+ props.shape.scenarioMenus &&
65
+ props.shape.scenarioMenus.length > 0 &&
66
+ props.shape.shapeType != ShapeConfig.SHAPE_TYPE;
67
+ });
68
+
69
+ // Emits
70
+ const emit = defineEmits<{
71
+ (
72
+ e: "resize-start",
73
+ event: MouseEvent,
74
+ position: "nw" | "ne" | "sw" | "se",
75
+ shape: Shape
76
+ ): void;
77
+ (e: "action-button-click", code: string, shape: Shape): void;
78
+ (e: "model-type-property-id-click", value: string, shape: Shape): void;
79
+ }>();
80
+
81
+ // Methods
82
+ const getSelectionBoxStyle = (shape: Shape) => selectionBoxStyle(shape);
83
+ const getHandleStyle = (h: any, shape: Shape) => handleStyle(h.position, shape);
84
+
85
+ // Event handlers
86
+ const onHandleMouseDown = (
87
+ event: MouseEvent,
88
+ position: "nw" | "ne" | "sw" | "se"
89
+ ) => {
90
+ emit("resize-start", event, position, props.shape);
91
+ };
92
+
93
+ const onActionButtonClick = (code: string) => {
94
+ emit("action-button-click", code, props.shape);
95
+ };
96
+
97
+ const onModelTypePropertyIdClick = () => {
98
+ if (props.shape.modelTypePropertyId) {
99
+ emit(
100
+ "model-type-property-id-click",
101
+ props.shape.modelTypePropertyId,
102
+ props.shape
103
+ );
104
+ }
105
+ };
106
+ </script>
107
+
108
+ <style scoped>
109
+ .selection-box {
110
+ pointer-events: none;
111
+ background: transparent;
112
+ }
113
+
114
+ .resize-handles {
115
+ position: relative;
116
+ width: 100%;
117
+ height: 100%;
118
+ }
119
+
120
+ .resize-handle {
121
+ position: absolute;
122
+ width: 10px;
123
+ height: 10px;
124
+ background-color: #007bff;
125
+ border: 2px solid #fff;
126
+ border-radius: 50%;
127
+ pointer-events: all;
128
+ transition: all 0.2s ease;
129
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
130
+ z-index: 999;
131
+ }
132
+
133
+ .resize-handle.is-disabled {
134
+ cursor: default !important;
135
+ }
136
+
137
+ .resize-handle:hover {
138
+ background-color: #0056b3;
139
+ transform: scale(1.2);
140
+ }
141
+
142
+ .action-buttons {
143
+ display: flex;
144
+ flex-direction: column;
145
+ gap: 4px;
146
+ pointer-events: all;
147
+ background: rgba(255, 255, 255, 0.95);
148
+ padding: 6px;
149
+ border-radius: 4px;
150
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
151
+ border: 1px solid #e0e0e0;
152
+ backdrop-filter: blur(2px);
153
+ }
154
+
155
+ .action-btn {
156
+ width: 28px;
157
+ height: 28px;
158
+ border: 1px solid #d0d0d0;
159
+ border-radius: 3px;
160
+ background: linear-gradient(to bottom, #f8f9fa, #e9ecef);
161
+ cursor: pointer;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ font-size: 12px;
166
+ font-weight: bold;
167
+ font-family: "Arial", sans-serif;
168
+ color: #495057;
169
+ transition: all 0.2s ease;
170
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
171
+ }
172
+
173
+ .action-btn:hover {
174
+ background: linear-gradient(to bottom, #e3f2fd, #bbdefb);
175
+ border-color: #90caf9;
176
+ transform: translateY(-1px);
177
+ box-shadow: 0 2px 4px rgba(33, 150, 243, 0.3);
178
+ color: #1976d2;
179
+ }
180
+
181
+ .edit-btn:hover {
182
+ background: #e3f2fd;
183
+ }
184
+
185
+ .border-btn {
186
+ padding-bottom: 4px;
187
+ border-bottom: 1px solid #e0e0e0;
188
+ }
189
+ </style>
@@ -29,7 +29,7 @@
29
29
  :font-weight="nameStyle.fontWeight || 'bold'" :fill="nameStyle.color || '#000000'" style="cursor: pointer;">
30
30
  {{ shape.name }}
31
31
  </text>
32
- <line v-if="shape.comparents?.length && shape.comparents[0]?.comparentShapes?.length" :x1="strokeWidth"
32
+ <line v-if="shape.showComparents" :x1="strokeWidth"
33
33
  :x2="vbW - strokeWidth" :y1="(nameBounds.y || 45) + 20" :y2="(nameBounds.y || 45) + 20" stroke="#767a7d"
34
34
  stroke-width="1" />
35
35
  <!-- 图标图片 -->
@@ -35,20 +35,60 @@ export const DASHED_EDGE_SHAPES = [
35
35
  'Desires',
36
36
  'Achieves',
37
37
  'Implements',
38
- 'IsCapableToperform',
39
38
  'ArbitraryConnector',
40
39
  'OperationalControlFlow',
41
40
  'FunctionControlFlow',
42
41
  'ServiceControlFlow',
43
42
  'IsCapableToPerform',
44
- 'Exhibits'
43
+ 'ProvidesCompetence',
44
+ 'OwnsProcesses',
45
+ 'FillsPost',
46
+ 'Exhibits',
47
+ 'CompetenceToConduct',
48
+ 'control',
49
+ 'command',
50
+ 'RequiresCompetence',
51
+ 'OwnsRisk',
52
+ 'Affects',
53
+ 'Mitigates',
54
+ 'Protects',
55
+ 'MapsToCapability',
56
+ 'ActualResourceRelationship'
45
57
  ];
46
58
 
47
59
  /**
48
60
  * 需要显示keywords和lineName的边类型集合
49
61
  * 与DASHED_EDGE_SHAPES保持一致,便于统一管理
50
62
  */
51
- export const EDGES_WITH_KEYWORDS = DASHED_EDGE_SHAPES;
63
+ export const EDGES_WITH_KEYWORDS = [
64
+ 'Phases',
65
+ 'Sequence',
66
+ 'Dependency',
67
+ 'Creates',
68
+ 'ComparesTo',
69
+ 'ImpactedBy',
70
+ 'Desires',
71
+ 'Achieves',
72
+ 'Implements',
73
+ 'ArbitraryConnector',
74
+ 'OperationalControlFlow',
75
+ 'FunctionControlFlow',
76
+ 'ServiceControlFlow',
77
+ 'IsCapableToPerform',
78
+ 'ProvidesCompetence',
79
+ 'OwnsProcesses',
80
+ 'FillsPost',
81
+ 'CompetenceToConduct',
82
+ 'control',
83
+ 'command',
84
+ 'RequiresCompetence',
85
+ 'OwnsRisk',
86
+ 'Affects',
87
+ 'Mitigates',
88
+ 'Protects',
89
+ 'MapsToCapability',
90
+ 'Exhibits'
91
+ ];
52
92
 
53
93
  /**
54
94
  * 带箭头的边类型集合
@@ -6,6 +6,7 @@ export const ShapeType = {
6
6
  Label: 'Label', // 标签
7
7
  Shape: 'Shape', // 图元
8
8
  ConceptualRole: 'ConceptualRole', //概念角色
9
+ Gantt: 'Gantt', //甘特图
9
10
  } as const
10
11
 
11
12
  // 导出类型
@@ -121,7 +122,7 @@ export const BlockKeyMap = {
121
122
  'SecurityConnectivityDiagram': "Diagram", //安全连通图
122
123
  'SecurityConnectivityTable': "Diagram", //安全连通表
123
124
  'SecurityProcessesDiagram': "Diagram", //安全流程图
124
- 'SecurityProcessesFlowDiagram': "Diagram", //安全内部流程图
125
+ 'SecurityProcessFlowDiagram': "Diagram", //安全内部流程图
125
126
  'SecurityConstraintsDiagram': "Diagram", //安全约束图
126
127
  'SecurityConstraintsDefinitionDiagram': "Diagram", //安全约束定义图
127
128
  'RisksToAssetsMappingMatrix': "Diagram", //资产风险映射矩阵
@@ -204,6 +205,7 @@ export const BlockKeyMap = {
204
205
  'Person': 'Block',//人员
205
206
  'SecurityProcess': 'Block',//安全流程
206
207
  'ResourceMitigation': 'Block', // 资源缓解措施
208
+ 'OperationalMitigation': 'Block', // 业务缓解措施
207
209
 
208
210
  // 线
209
211
  'Association': 'Edge', //双向关联
@@ -223,18 +225,31 @@ export const BlockKeyMap = {
223
225
  'ImpactedBy':'Edge',//受到影响
224
226
  'Desires':'Edge',//要求
225
227
  'Achieves':'Edge',//达到
226
- 'IsCapableToperform':'Edge',//能够胜任
227
228
  'ArbitraryConnector':'Edge',//任意连接器
228
229
  'ArbitraryRelationship':'Edge',//任意关系
229
230
  'DirectedRelationship':'Edge',//定向关系
230
231
  'OperationalControlFlow':'Edge',//业务控制流
232
+ 'OperationalObjectFlow':'Edge',//业务对象流
231
233
  'FunctionControlFlow':'Edge',//功能控制流
234
+ 'FunctionObjectFlow': 'Edge', // 功能对象流
232
235
  'ServiceConnector':'Edge',//服务连接器
233
236
  'ServiceControlFlow':'Edge',//服务控制流
234
237
  "ServiceObjectFlow": 'Edge', // 服务对象流
235
238
  'Connector':'Edge',//连接器
236
239
  'OperationalConnector':'Edge',//业务连接器
237
240
  'IsCapableToPerform':'Edge',//能够胜任
241
+ 'OwnsProcesses':'Edge',//拥有流程
242
+ 'ActualResourceRelationship':'Edge',//实际资源关系
243
+ 'FillsPost':'Edge',//填写职位申请
244
+ 'control':'Edge',//控制
245
+ 'command':'Edge',//命令
246
+ 'RequiresCompetence':'Edge',//需求权限
247
+ 'ProvidesCompetence':'Edge',//提供权限
248
+ 'OwnsRisk':'Edge',//承担风险
249
+ 'Affects':'Edge',//影响
250
+ 'Mitigates':'Edge',//缓解
251
+ 'Protects':'Edge',//保护
252
+ 'MapsToCapability':'Edge',//适用能力
238
253
  'ProjectSequence':'Edge',//项目顺序
239
254
  'MilestoneDependency':'Edge',//里程碑依赖
240
255
  'DirectedAssociation':'Edge',//定向关联
@@ -415,7 +430,7 @@ export const DiagramKeyMap = {
415
430
  'SecurityConnectivityDiagram': 'StrategicTaxonomyDiagram', //安全连通图
416
431
  'SecurityConnectivityTable': 'StrategicTaxonomyDiagram', //安全连通表
417
432
  'SecurityProcessesDiagram': 'StrategicTaxonomyDiagram', //安全流程图
418
- 'SecurityProcessesFlowDiagram': 'StrategicTaxonomyDiagram', //安全内部流程图
433
+ 'SecurityProcessFlowDiagram': 'StrategicTaxonomyDiagram', //安全内部流程图
419
434
  'SecurityConstraintsDiagram': 'StrategicTaxonomyDiagram', //安全约束图
420
435
  'SecurityConstraintsDefinitionDiagram': 'StrategicTaxonomyDiagram', //安全约束定义图
421
436
  'RisksToAssetsMappingMatrix': 'StrategicTaxonomyDiagram', //风险与资产映射矩阵
@@ -444,7 +459,9 @@ export const DiagramKeyMap = {
444
459
  export const PinKeyMap = {
445
460
  'OutputPin': 'Pin', //输出引脚
446
461
  'InputPin': 'Pin', //输入引脚
447
- "OperationalPort": "Port"
462
+ "OperationalPort": "Port", //业务端口
463
+ "ServicePort": "Port", //服务端口
464
+ "ResourcePort": "Port", //资源端口
448
465
  } as const
449
466
 
450
467
  // 导出DiagramKeyMap类型
@@ -0,0 +1,3 @@
1
+ export * from './useHighlight';
2
+ export * from './useNameEdit';
3
+ export * from './useResize';