机房设计中的排布规则自动化:通道 POD、编号递增、互斥推挤与通道宽联动
摘要:机房平面布置里大量工作不是「设计」而是「规则计算」------冷热通道朝向、排间距、编号连续性、设备不重叠、通道宽变化后的整排位移。把这些规则交给软件执行,人只负责判断,是 DCDesigner 在机房设计中最重要的效率来源。本文拆解四组规则自动化的机制、边界与工程价值。
一、把「靠人记的约定」变成「软件执行的不变量」
机房布置有几条业内人尽皆知的约定,同时也是最容易被记错的地方:
- 冷通道是两排机柜正面相对 ,热通道是背面相对;
- 相邻排中心距 = 柜深 + 通道宽;
- 同一排机柜编号连续,排与排之间编号递增;
- 机柜、空调、UPS 等实体设备不能互相压占;
- 通道加宽后,两侧机柜要跟着动,而不是只改标注。
这些约定有一个共同特点:它们可以被形式化。能被形式化的东西,就应该由软件执行,而不是依赖现场记忆与事后检查。DCDesigner 围绕这一点做了四组机制。
二、第一组:通道 POD 生成------把冷热关系交给软件
2.1 生成规则
在向导第 2 步填写机柜排数 ≥2 时,按通道 POD 成组生成:
- 冷通道 = 两排正面相对(面对面);
- 热通道 = 两排背面相对(背对背);
- 首个通道类型由使用者选择,所选类型即封闭类型(选冷 → 仅冷通道封闭;选热 → 仅热通道封闭);
- 此后冷、热通道自动交替,宽度分别取「冷通道宽度」与「热通道宽度」两个独立输入;
- 相邻排中心距 = 柜深 + 对应通道宽(几何由参数唯一决定,不需要手工排位)。
2.2 封闭通道的表达不止「有没有封顶」
通道带是一个结构化对象,属性包括:名称、冷/热(kind)、宽/长/高 、是否封闭(enclosed),以及封闭时的端门配置:
| 端门属性 | 取值 | 含义 |
|---|---|---|
endDoors |
两端 / 仅一端 / 无(封板) | 仅一端时旋转 180° 可换端 |
doorType |
推拉 / 双开 / 单开 | 2D 分别绘制两片错位实线 / 门扇 90° 外开+开启弧 / 单扇;3D 分别为两片错位玻璃 / 两扇对开 / 单扇 |
doorW |
门洞净宽(0 = 与通道同宽) | 小于通道宽时门洞居中、两侧固定封窗 |
2D 推拉/平开符号可以核对端部回转空间;3D 中端门门扇高与机柜齐平,通道高超过机柜时门上为固定封窗,并带铝型材结构框架(角柱/顶梁/门楣/中梃/地轨/拉手)。
这组属性的意义在于:封闭通道不是「画一个框」,而是可核对的可建造对象------端门是推拉还是平开、门洞多宽、开向哪边,都能在图纸阶段确定,避免交付后因为端部回转空间不足返工。
三、第二组:编号体系------自动递增、可重排、可补插
3.1 模板自动递增
编号模板语法把「固定文本」与「可变数字段」分开:
A##→ A01、A02...(#个数=序号最小位数,超出自动扩位)A###→ A001...101-A##→ 101-A01...1F-A##-主→ 前后缀与楼层、机房号一并保留- 多排生成时,模板中的排号字母自动递增(A→Z→AA→AB...)
放置后自动切换为下一排号,编号连续性的记账工作从人转移到软件。
3.2 原位替换与重排
现场情况往往与标准布局有出入,DCDesigner 提供了一组「按现场实况改局部」的操作:
- 右键机柜 → 替换为 ▸ 柱子 / 列间空调 / 列头柜:原位同槽转换,继承坐标与朝向,整批一步撤销;
- 替换后画布顶部弹出非模态提示条询问「是否重排本排序号」,画布原位以灰色虚线框 + 灰字预览新编号,点「重排」即按排内位置连续重编;
- 提示条内置编号模板输入框 ,可改排号与编号方式(
A##→C##、101-A##、A##-主等);多排模板为全部重置------输入首排排号,各排按几何顺序(先 X 向排南→北、再 Y 向排西→东)逐排递增; - 重排保留排编号前缀/后缀与排号,同排混入其他格式编号或自定义名时默认跳过并提示,可选择「整排按位置重排」一并统一;
- 反向替换:选中列间空调 / 列头柜可替换回机柜(继承坐标、朝向、宽深),同样触发重排提示;
- 检测空位补插:旧图缺槽位时按剩余机柜最窄间距外推缺失槽位,虚线预览后一键补插柱子/列间空调(每段连续空位只插 1 个对象并居中)。
替换与重排是两步独立撤销------改错了可以只回退其中一步。
四、第三组:互斥推挤------设备不重叠,但不是「乱推」
实体对象(机柜、柱子、空调、UPS、蓄电池、灭火器、风口、列头柜)之间不允许重叠。在已有对象上放置新对象,或拖动对象压到邻居时,工具会执行推挤求解。它的关键设计不在「会推开」,而在推开的时机与可逆性:
| 机制 | 设计 | 解决的问题 |
|---|---|---|
| 停留判定 | 拖动物与对象持续重叠 ≥150ms 才推挤(DWELL_MS = 150) |
拖动路径上「快速掠过」的对象不误推,避免一路扫乱 |
| 回弹 | 拖动物离开后,被推对象自动回弹到原位 | 拖过去看一眼不会永久改变布局 |
| 插入语义 | 松手时仍被压住的保持推开 | 「在中间插入一台设备」符合直觉 |
| 级联 | 沿重叠方向找最近空闲机位,级联推开后续对象 | 整排被带动时不会互相压住 |
| 网格化 | 位移取整到 100mm 网格 | 推完的布局仍是整数值,便于复核 |
| 原子撤销 | 放置 + 推挤为同一撤销单元 | 一次 Ctrl+Z 回到操作前 |
| 空间不足 | 密集区域无处可推时提示「空间不足」 | 明确失败,而不是静默重叠 |
旋转后同样会推开被压到的邻居;状态栏提示「推开 N 个对象」(N 为最终仍被推开的对象数)。墙、桥架、门窗、通道带不参与推挤------它们是结构或标注,不参与机位竞争。
五、第四组:通道宽联动------改一个数字,整排跟着走
通道宽是机房设计中改动最频繁的参数之一。若「改通道宽」只改一条色带,两侧机柜留在原位,就会出现图纸与意图不符。DCDesigner 的做法是把通道宽变成带动排位的参数:
- 修改通道带「通道宽」(属性面板直接改、格式刷批量刷,或单选后拖拽两侧长边手柄 )时:
- 西/南侧那一排锚定不动,远侧整排平移对应增量;
- 拖拽近侧边时镜像为近侧排平移------拖哪侧哪侧排跟随;
- 通道带自身近侧边同步锚定,中心自动平移 Δ/2,仅向远侧伸缩,调整后仍对齐两排实际间距;
- 多排 POD 级联:中间通道带与后续排一并平移,其余通道宽度不变;
- 同一物理通道上的并列通道带自动同步调宽移心(格式刷逐条刷不重复联动);
- 排内列间空调随行;移动后仍按互斥规则推开沿途对象(柱子/相邻 POD/风口等),通道内风口不随排平移;
- 全部变动与通道宽修改为同一步撤销;
- 识别是纯几何的(朝向 + 边缘贴合),不依赖生成历史,因此旧项目零迁移;
- 通道带属性面板提供「联动机柜」全局开关,关闭后通道仅作标注;非常规角度的通道带不联动。
这条机制把「修改的设计意图」和「修改的实际结果」绑定在一起,是设计迭代效率的关键来源。
六、配套:格式刷、对齐与多选批量
规则自动化之外,还有一组降低重复劳动的操作:
- 格式刷(M) :拾取一个对象为源,单击或框选其他同类型对象批量应用属性。名称/编号、位置坐标、旋转朝向不复制(保持唯一、不错位);机柜等实体对象尺寸变大压到邻居时自动推挤让位;门窗/格栅宽度变化后自动重新约束在所属墙范围内。每次应用为一步撤销,Esc 退出。
- 多选对齐 :框选/点选 ≥2 个对象后,右键菜单「对齐」或属性面板按钮组,一键左对齐/水平居中/右对齐/底对齐/垂直居中/顶对齐;以选区联合包围盒 为基准;墙/桥架两端点整体平移(其上门窗随墙跟随),挂墙门窗/格栅不参与对齐;整批一步撤销,对齐组作为互斥锚点推开未选中的重叠邻居。
- 多选批量操作:整体拖动移动、Ctrl+拖动复制(副本自动编号)、R 批量旋转、Del 批量删除;多选面板显示组合统计与批量操作入口。
- 默认值跟随:属性面板中修改的任何字段自动成为下一次创建同类对象的默认值(字段级跟随,localStorage 持久化,不参与撤销)。
七、价值与边界
7.1 价值
- 防错:冷热通道关系、封闭类型、编号连续性由软件执行,结构性消除经典错误;
- 省时:POD 批量生成 + 编号自动递增 + 通道宽联动,把「逐台操作」变成「参数操作」;
- 可逆:推挤有停留判定与回弹、替换与重排分两步撤销、通道调整与机柜位移同一步撤销------激进操作的风险被撤销机制兜住;
- 可维护:实体的推挤边界、通道的联动开关、对齐的排除清单都是显式规则,团队可以按项目习惯调整(例如关闭通道联动只作标注)。
7.2 边界
- 互斥推挤解决「不重叠」,不解决「最优布置」;排布是否合理仍依赖设计与自检规则;
- 通道宽联动识别基于朝向与边缘贴合,非常规角度的通道带不联动;
- 编号重排依赖可识别的编号格式(模板/前缀后缀),自定义名称默认跳过并提示;
- 列间空调与精密空调以
kind=row标记区分,替换操作不会作用于精密空调。
附:事实来源与核验方式
- POD 生成与正面朝向约定:
public/js/tools.js(podGeometry);说明见README.md「工勘思维设计」 - 编号解析/模板/重排:
public/js/naming.js、public/js/rowops.js;单测node tests/numbering.test.mjs - 互斥推挤:
public/js/collision.js(DWELL_MS、springBack、100mm 网格);回归node tests/layout.test.mjs - 通道宽联动:
public/js/aislelink.js;回归node tests/aisle-resize.cdp.mjs - 对齐与格式刷:
public/js/align.js、public/js/tools.js;单测node tests/align.test.mjs - 右键菜单与重排提示条:
public/js/ctxmenu.js - 封闭通道端门:
README.md「建模对象·通道」;回归node tests/aisle-doors.cdp.mjs - 可复现核验:
bash
node tests/numbering.test.mjs
node tests/layout.test.mjs
node tests/align.test.mjs
node tests/aisle-resize.cdp.mjs
node tests/aisle-doors.cdp.mjs