Files
HHY fbef67e450 fix: v2.10 3D 室外场景窗户陷入墙体+平开扇出框双重修复
- 墙体与窗体 z 轴关系: 墙厚 3→2.4×型深, 外墙面退至窗框外表面之后(窗框外露 30% 型深), 消除整窗埋入墙厚
- 窗洞净空自适应外框面宽(fwMax+0.015), 替代固定 0.05
- 平开扇铰链偏移符号修复(+(cxr-hingeX)), 消除关闭态扇出框/开启态扇悬空
- 草地垫对齐新墙面, 网格降至墙脚
- 新增 verify-wall.mjs 真实浏览器三态截图验证
2026-09-23 03:27:14 -07:00

53 lines
2.6 KiB
JavaScript

// 室外场景墙体/窗体位置修复验证截图: node verify-wall.mjs <token>
// ① 默认(室外+45°+全关) ② 正面视角全关(检查扇矩形是否出框) ③ 46% 开合(按压-移动-释放驱动 el-slider)
import puppeteer from 'puppeteer-core'
const browser = await puppeteer.launch({
executablePath: 'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',
headless: 'new',
args: ['--window-size=1440,900', '--enable-unsafe-swiftshader', '--use-gl=angle', '--use-angle=swiftshader'],
defaultViewport: { width: 1440, height: 900 },
})
const page = await browser.newPage()
page.on('pageerror', e => console.log(`[JS异常] ${String(e).slice(0, 200)}`))
const token = process.argv[2]
const sleep = ms => new Promise(r => setTimeout(r, ms))
await page.goto(`http://localhost:8000/threed?token=${encodeURIComponent(token)}`, { waitUntil: 'networkidle2' })
await sleep(2600)
const cv = await (await page.$('.threed-wrap canvas')).boundingBox()
await page.screenshot({ path: 'D:/Code/huamenchuang/shots/verify-wall-closed.png', clip: cv })
console.log('✓ 默认(室外+45°+全关)截图完成')
// 切正面视角(真实鼠标点击 radio)
const frontBtn = await page.evaluateHandle(() => {
const spans = [...document.querySelectorAll('.el-radio-button__inner')]
return spans.find(s => s.textContent.trim() === '正面')
})
const fb = await frontBtn.asElement().boundingBox()
await page.mouse.click(fb.x + fb.width / 2, fb.y + fb.height / 2)
await sleep(800)
await page.screenshot({ path: 'D:/Code/huamenchuang/shots/verify-wall-front.png', clip: cv })
console.log('✓ 正面视角截图完成')
// 切回 45°
const degBtn = await page.evaluateHandle(() => {
const spans = [...document.querySelectorAll('.el-radio-button__inner')]
return spans.find(s => s.textContent.trim() === '45°')
})
const db = await degBtn.asElement().boundingBox()
await page.mouse.click(db.x + db.width / 2, db.y + db.height / 2)
await sleep(600)
// 46% 开合: 真实按压-移动-释放驱动 el-slider
const handle = await page.$('.ctrl .el-slider__button')
const hr = await handle.boundingBox()
await page.mouse.move(hr.x + hr.width / 2, hr.y + hr.height / 2)
await page.mouse.down()
const runway = await page.$('.ctrl .el-slider__runway')
const rr = await runway.boundingBox()
for (let i = 1; i <= 12; i++) {
await page.mouse.move(rr.x + rr.width * 0.46, hr.y + hr.height / 2, { steps: 1 })
await sleep(40)
}
await page.mouse.up()
await sleep(1400)
await page.screenshot({ path: 'D:/Code/huamenchuang/shots/verify-wall-open46.png', clip: cv })
console.log('✓ 46% 开合截图完成')
await browser.close()