feat: v2.9 拖拽移动模式(右键菜单入口)
- 菜单新增'拖拽移动此单元': 进入后鼠标移动即拖动单元(增量平移) - 点击画布落下并 emit change, 菜单动作与拖拽移动并列 - 配套验证脚本 verify-move.mjs(真实鼠标序列端到端)
This commit is contained in:
@@ -202,16 +202,29 @@ function build(drawing: DrawingData) {
|
||||
scene.add(dirLight)
|
||||
|
||||
const pts: Pt[] = []
|
||||
const shapeBBs: BBox[] = []
|
||||
for (const s of drawing.sm) {
|
||||
const sp: Pt[] = []
|
||||
for (const r of replayShape(s).regions) {
|
||||
for (const seg of r) {
|
||||
if (Number.isFinite(seg.ps?.x) && Number.isFinite(seg.ps?.y)) pts.push(seg.ps)
|
||||
if (Number.isFinite(seg.pe?.x) && Number.isFinite(seg.pe?.y)) pts.push(seg.pe)
|
||||
if (Number.isFinite(seg.ps?.x) && Number.isFinite(seg.ps?.y)) { pts.push(seg.ps); sp.push(seg.ps) }
|
||||
if (Number.isFinite(seg.pe?.x) && Number.isFinite(seg.pe?.y)) { pts.push(seg.pe); sp.push(seg.pe) }
|
||||
}
|
||||
}
|
||||
if (sp.length) shapeBBs.push(bboxOf(sp))
|
||||
}
|
||||
if (!pts.length) { info.value = '无几何数据'; hasOpenable.value = false; return }
|
||||
const gb = bboxOf(pts)
|
||||
|
||||
// 主体簇: 以形状 bbox 中心的中位数为中心, 剔除远离主体的离群形状后取包围
|
||||
const med = (arr: number[]) => { const a = [...arr].sort((x, y) => x - y); return a[Math.floor(a.length / 2)] ?? 0 }
|
||||
const mcx = med(shapeBBs.map(b => (b.x0 + b.x1) / 2))
|
||||
const mcy = med(shapeBBs.map(b => (b.y0 + b.y1) / 2))
|
||||
const msize = med(shapeBBs.map(b => Math.max(b.x1 - b.x0, b.y1 - b.y0)))
|
||||
const mainBBs = shapeBBs.filter(b =>
|
||||
Math.abs((b.x0 + b.x1) / 2 - mcx) < msize * 1.5 && Math.abs((b.y0 + b.y1) / 2 - mcy) < msize * 1.5)
|
||||
const gb = bboxOf(mainBBs.length ? mainBBs.flatMap(b => [
|
||||
{ x: b.x0, y: b.y0 }, { x: b.x1, y: b.y1 },
|
||||
]) : pts)
|
||||
const gw = gb.x1 - gb.x0, gh = gb.y1 - gb.y0
|
||||
const maxDim = Math.max(gw, gh)
|
||||
if (!Number.isFinite(maxDim) || maxDim <= 0) { info.value = '无有效几何'; hasOpenable.value = false; return }
|
||||
|
||||
Reference in New Issue
Block a user