three.cad/src/react/depTree.mjs

131 lines
2.5 KiB
JavaScript
Raw Normal View History

2021-04-06 12:52:19 +08:00
export class DepTree {
constructor(obj) {
if (obj) {
this.order = { ...obj.order }
this.byId = { ...obj.byId }
this.allIds = [...obj.allIds]
this.tree = {}
for (let k in obj.tree) {
this.tree[k] = { ...obj.tree[k] }
}
} else {
this.tree = {}
this.order = {}
this.allIds = []
}
}
addParent(id) {
if (this.tree[id]) return
this.tree[id] = {}
this.order[id] = this.allIds.length
this.allIds.push(id)
}
addChild(childId, ...parentIds) {
for (let parentId of parentIds) {
this.tree[parentId][childId] = true;
}
this.addParent(childId)
}
2021-04-10 18:53:44 +08:00
getDescendents(id) {
2021-04-06 12:52:19 +08:00
const dfs = (id) => {
visited.add(id)
2021-04-10 18:53:44 +08:00
desc.push(id)
2021-04-06 12:52:19 +08:00
for (let k in this.tree[id]) {
if (!visited.has(k)) {
dfs(k)
}
}
}
const visited = new Set()
2021-04-10 18:53:44 +08:00
const desc = []
2021-04-06 12:52:19 +08:00
dfs(id)
2021-04-10 18:53:44 +08:00
return desc
}
deleteNode(id) {
const nodesToDel = this.getDescendents(id)
2021-04-06 12:52:19 +08:00
nodesToDel.sort((a, b) => this.order[b] - this.order[a])
let spliceIdx;
for (let id of nodesToDel) {
spliceIdx = this.order[id]
this.allIds.splice(spliceIdx, 1)
2021-04-10 16:45:15 +08:00
const deletedObj = sc.obj3d.children.splice(spliceIdx + 4, 1)[0] // first 4 elements are non geom
2021-04-06 12:52:19 +08:00
deletedObj.traverse((obj)=>{
if (obj.geometry) obj.geometry.dispose()
if (obj.material) obj.material.dispose()
})
delete this.tree[id]
delete this.byId[id]
delete this.order[id]
}
for (let i = spliceIdx; i < this.allIds.length; i++) {
this.order[this.allIds[i]] = i
}
const nodeToDelSet = new Set(nodesToDel)
for (let k in this.tree) {
for (let m in this.tree[k]) {
if (nodeToDelSet.has(m)) {
delete this.tree[k][m]
}
}
}
return this
}
}
// const dt = new DepTree()
// dt.addParent('r1')
// dt.addParent('r2')
// dt.addChild('r3', 'r1', 'r2')
// dt.addParent('r4')
// dt.addChild('r5', 'r4', 'r3')
// dt.addChild('r6', 'r1', 'r5')
// dt.addChild('r7', 'r3', 'r5')
// dt.addParent('r8')
// // console.log(dt)
// // const x = dt.deleteNode('r3')
// // console.log(x)
// // console.log(dt.allIds, dt.order)
// // [ 6, 5, 4, 2 ]
// // [ 'r1', 'r2', 'r4' ] { r1: 0, r2: 1, r4: 2 }
// const x = dt.deleteNode('r5')
// console.log(dt)
// DepTree {
// tree: { r1: { r3: true }, r2: { r3: true }, r3: {}, r4: {}, r8: {} },
// order: { r1: 0, r2: 1, r3: 2, r4: 3, r8: 4 },
// allIds: [ 'r1', 'r2', 'r3', 'r4', 'r8' ]
// }