|
|
|
@ -16,21 +16,21 @@ export default class EntityManager { |
|
|
|
viewport: Viewport |
|
|
|
|
|
|
|
// 所有数据点的实体
|
|
|
|
readonly entities = new Map<string, ItemJson>() |
|
|
|
private readonly entities = new Map<string, ItemJson>() |
|
|
|
|
|
|
|
// 关系索引
|
|
|
|
readonly relationIndex = new Map<string, Relation>() |
|
|
|
private readonly relationIndex = new Map<string, Relation>() |
|
|
|
|
|
|
|
// 所有 THREEJS "点"对象, 检索值是"点实体"的 id, 值是 THREE.Object3D 数组
|
|
|
|
readonly objects = new Map<string, THREE.Object3D[]>() |
|
|
|
private readonly objects = new Map<string, THREE.Object3D[]>() |
|
|
|
|
|
|
|
// 所有 THREEJS "线"对象, 检索值是"线实体"的 id, 取值方式是 {type}${startId}${endId}, 值是 THREE.Object3D 数组
|
|
|
|
readonly lines = new Map<string, THREE.Object3D[]>() |
|
|
|
private readonly lines = new Map<string, THREE.Object3D[]>() |
|
|
|
|
|
|
|
// 差量渲染器
|
|
|
|
readonly diffRenderer = new Map<string, BaseRenderer>() |
|
|
|
private readonly diffRenderer = new Map<string, BaseRenderer>() |
|
|
|
// 线差量记录
|
|
|
|
readonly lineDiffs = { |
|
|
|
private readonly lineDiffs = { |
|
|
|
create: new Map<string, LineDiffItem>(), |
|
|
|
update: new Map<string, LineDiffItem>(), |
|
|
|
delete: new Map<string, LineDiffItem>() |
|
|
|
@ -44,9 +44,9 @@ export default class EntityManager { |
|
|
|
/** |
|
|
|
* 批量更新开始 |
|
|
|
*/ |
|
|
|
beginUpdate(): void { |
|
|
|
beginEntityUpdate(): void { |
|
|
|
this.isUpdating = true |
|
|
|
this.viewport.beginUpdate() |
|
|
|
this.viewport.beginViewUpdate() |
|
|
|
this.diffRenderer.clear() |
|
|
|
this.lineDiffs.create.clear() |
|
|
|
this.lineDiffs.update.clear() |
|
|
|
@ -56,10 +56,11 @@ export default class EntityManager { |
|
|
|
/** |
|
|
|
* 创建或更新一个实体, 这个点的 center[] / in[] / out[] 关联的点, 可能都要对应进行关联 |
|
|
|
*/ |
|
|
|
createOrUpdateEntity(entity: ItemJson, option: EntityCudOption = {}): void { |
|
|
|
if (!entity?.id) { |
|
|
|
createOrUpdateEntity(entityRaw: ItemJson, option: EntityCudOption = {}): void { |
|
|
|
if (!entityRaw?.id) { |
|
|
|
throw new Error('Entity must have an id') |
|
|
|
} |
|
|
|
const entity = _.cloneDeep(entityRaw) as ItemJson |
|
|
|
|
|
|
|
// 找到这个数据的渲染器
|
|
|
|
const renderer = this.getDiffRenderer(entity.t) |
|
|
|
@ -70,6 +71,29 @@ export default class EntityManager { |
|
|
|
// 更新关系网
|
|
|
|
this.updateRelations(entity, originEntity) |
|
|
|
|
|
|
|
// 判断坐标是否变化
|
|
|
|
|
|
|
|
if (originEntity?.tf && entity?.tf && !_.isEqual(originEntity.tf[0], entity.tf[0])) { |
|
|
|
// 点的坐标发生变化, 要通知所有关联线更新
|
|
|
|
const relations = this.relationIndex.get(entity.id) |
|
|
|
if (!relations) return |
|
|
|
|
|
|
|
for (const type of (['center', 'in', 'out'] as LinkType[])) { |
|
|
|
const relatedIds = relations[type] |
|
|
|
if (!relatedIds) continue |
|
|
|
|
|
|
|
for (const relatedId of relatedIds) { |
|
|
|
const lineId = getLineId(entity.id, relatedId, type) |
|
|
|
this.lineDiffs.update.set(lineId, { startId: entity.id, endId: relatedId, type }) |
|
|
|
|
|
|
|
// 如果是双向线(比如 center),也要反向加一次
|
|
|
|
if (type === 'center') { |
|
|
|
this.lineDiffs.update.set(lineId, { startId: relatedId, endId: entity.id, type }) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (typeof originEntity === 'undefined') { |
|
|
|
renderer.createPoint(entity, option) |
|
|
|
|
|
|
|
@ -101,7 +125,7 @@ export default class EntityManager { |
|
|
|
* - 如果进行了更新, 如果改了颜色/位置, 则需要在UI上进行对应修改,如果改了关系,需要与关联的节点批量调整 |
|
|
|
* 将影响到的所有数据, 都变成一个修改集合, 统一调用对应单元类型渲染器(BaseRenderer)的 createPoint / deletePoint / updatePoint / createLine / updateLine / deleteLine 方法 |
|
|
|
*/ |
|
|
|
commitUpdate(): void { |
|
|
|
endEntityUpdate(): void { |
|
|
|
for (const [itemTypeName, renderer] of this.diffRenderer.entries()) { |
|
|
|
for (const [lineId, lineDiffItem] of this.lineDiffs.create.entries()) { |
|
|
|
const start = this.entities.get(lineDiffItem.startId) |
|
|
|
@ -133,9 +157,9 @@ export default class EntityManager { |
|
|
|
renderer.deleteLine(start, end, lineDiffItem.type) |
|
|
|
} |
|
|
|
|
|
|
|
renderer.endUpdate() |
|
|
|
renderer.endRendererUpdate() |
|
|
|
} |
|
|
|
this.viewport.endUpdate() |
|
|
|
this.viewport.endViewUpdate() |
|
|
|
this.isUpdating = false |
|
|
|
} |
|
|
|
|
|
|
|
@ -311,7 +335,7 @@ export default class EntityManager { |
|
|
|
let renderer = this.diffRenderer.get(type) |
|
|
|
if (typeof renderer === 'undefined') { |
|
|
|
renderer = getRenderer(type) |
|
|
|
renderer.beginUpdate(this.viewport) |
|
|
|
renderer.beginRendererUpdate(this.viewport) |
|
|
|
this.diffRenderer.set(type, renderer) |
|
|
|
} |
|
|
|
return renderer |
|
|
|
|