t51-neighborhood.mjs 3.8 KB

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