| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import assert from 'node:assert/strict'
- import { planPipeEnhancement } from '../../../src/modules/cockpit/domain/pipeEnhancement.js'
- import { mountPipeEnhancement } from '../../../src/modules/cockpit/services/threePipeEnhancement.js'
- import { createPinia, setActivePinia } from 'pinia'
- import { usePipeEnhancementStore } from '../../../src/modules/cockpit/stores/pipeEnhancementStore.js'
- const ll = (x, y) => [110 + x / (111320 * Math.cos(28 * Math.PI / 180)), 28 + y / 111320]
- const main = { code: 'main', industry: 'WATER_SUPPLY', networkId: 'true-id', sourceId: 'source-id', positions: [ll(-100, 0), ll(100, 0)] }
- const cross = { code: 'cross', industry: 'DRAINAGE', networkLevel: 1, positions: [ll(0, -200), ll(0, 200)] }
- const nearEnd = { code: 'end', industry: 'GAS', positions: [ll(120, -10), ll(120, 10)] }
- const far = { code: 'far', industry: 'GAS', positions: [ll(-100, 130), ll(100, 130)] }
- const frozen = JSON.stringify([main, cross, nearEnd, far])
- const input = { selected: { kind: 'pipe', code: 'main' }, visiblePipes: [main, cross, nearEnd, far] }
- const plan = planPipeEnhancement(input)
- assert.equal(plan.radiusM, 50)
- assert.equal(plan.objects.length, 3)
- assert.equal(plan.objects[0].code, 'main')
- assert.equal(plan.objects[0].path.length, 2)
- assert.equal(plan.objects[0].networkId, 'true-id')
- assert.equal(plan.objects[0].sourceId, 'source-id')
- const clipped = plan.objects.find((p) => p.code === 'cross')
- assert.ok(clipped.clipped)
- assert.ok(Math.abs((clipped.path[0][1] - 28) * 111320 + 50) < 0.01)
- assert.ok(Math.abs((clipped.path.at(-1)[1] - 28) * 111320 - 50) < 0.01)
- assert.ok(plan.objects.some((p) => p.code === 'end'), '沿整条管段取邻域,而不是中点圆')
- assert.equal(JSON.stringify([main, cross, nearEnd, far]), frozen)
- console.log('PASS 默认50米整条路径邻域、穿越裁切、真实ID与源不变')
- const small = planPipeEnhancement({ ...input, radiusM: 25 })
- assert.equal(small.radiusM, 25)
- assert.ok(Math.abs((small.objects.find((p) => p.code === 'cross').path[0][1] - 28) * 111320 + 25) < 0.01)
- assert.equal(planPipeEnhancement({ ...input, radiusM: -1 }).radiusM, 50)
- const filtered = planPipeEnhancement({ ...input, visiblePipes: [main] })
- assert.equal(filtered.objects.length, 1)
- assert.equal(planPipeEnhancement({ ...input, visiblePipes: [] }).visible, false)
- console.log('PASS 范围切换、非法范围回默认与筛选移除')
- const reenter = { code: 'reenter', industry: 'GAS', positions: [ll(-60, 0), ll(-60, 100), ll(60, 100), ll(60, 0)] }
- const many = planPipeEnhancement({ ...input, visiblePipes: [main, reenter] })
- assert.equal(many.objects.filter((p) => p.code === 'reenter').length, 2, '离开再进入必须拆两条,不跨空白连接')
- console.log('PASS 多段裁切不跨越邻域外空白')
- const canvas = new EventTarget()
- const host = { clientWidth: 900, clientHeight: 500, appendChild(node) { node.parentNode = this }, removeChild(node) { node.parentNode = null } }
- let scene
- const viewer = mountPipeEnhancement(host, plan, { rendererFactory: () => ({ domElement: canvas, setSize() {}, render(s) { scene = s }, dispose() {} }) })
- const root = scene.children.find((n) => n.name === 'pipe-enhancement:main')
- assert.equal(root.children.length, 3)
- assert.ok(root.children.find((n) => n.userData.code === 'cross').position.y < 0, '雨水虚拟层位于供水以下')
- assert.ok(root.children.find((n) => n.userData.code === 'end').position.y > 0, '燃气虚拟层位于供水以上')
- viewer.destroy()
- setActivePinia(createPinia())
- const store = usePipeEnhancementStore()
- store.select('pipe', 'main')
- store.setRadius(100)
- assert.equal(store.radiusM, 100)
- store.setRadius('25')
- assert.equal(store.radiusM, 25)
- store.clear()
- assert.equal(store.radiusM, 50)
- assert.equal(store.selected, null)
- console.log('PASS 邻域真实渲染对象、虚拟深度层次及Pinia范围切换/清理')
|