Skip to content
oxomkbkPublic

About

Web装修设计工具,集 2D 平面布置与 three.js 3D 漫游于一体,内置 12 套户型、多方案管理与自定义家具库,支持多选编辑、对齐吸附、碰撞检查及三语暗色模式。

Topics

Resources

Stars

70 stars

Watchers

1 watching

Forks

Repository files navigation

户型装修设计工具

在浏览器里打开 index.html 就能用的户型装修设计工具:左边拖家具、中间改平面、右边看预算,一键切 3D 看效果。单文件、零依赖、离线可用——双击即开,不用装环境、不用联网、不用登录,所有数据只存在你自己的浏览器里。

2D 平面布置与预算面板

友情链接

  • 🏠 Ai 资源网 —— 免费 AI 工具与资源导航站,本项目页脚同样挂着这枚友链,欢迎互相串门。

想交换友链?改这一节提 PR 即可。


目录


30 秒上手

  1. 打开:双击 index.html(或丢进任意静态服务器)。
  2. 选户型:顶栏「户型库」有 12 套户型,挑一套点进去,自带一套摆好的默认布置。
  3. 改布置:左侧家具库点一下添加、拖到平面图上摆放;拖动家具移动,拖上方圆点旋转,拖右下方块改尺寸。
  4. 看效果:顶栏切到「3D 场景」,T 键来回切;3D 里可切「鸟瞰 / 漫游」,拖动鼠标左键旋转、滚轮缩放。
  5. 算钱:右侧「报价」页给出家具家电 + 地面 + 墙面乳胶漆的参考价,可导出 CSV。
  6. 存下来:改动自动保存在浏览器里;「文件 ▾ → 另存为方案」可为一个户型存多套布置,「文件 ▾ → 复制分享链接」把整套布置压进一条 URL 发给客户。

想装成桌面 App:用 Chrome / Edge 打开后选择「安装应用」,会读取 manifest.webmanifest,以独立窗口运行(PWA,图标见 icon-192.png / icon-512.png)。

界面速览

三维场景 户型库
3D 场景 户型库
报价明细 家具属性编辑
报价明细 家具属性
亮色主题 命令面板
亮色主题 命令面板

手机 / 平板(触屏适配,浮动工具条 + 底部操作栏):

手机端布局


功能详解

户型库与方案管理

内置 12 套户型(均为套内面积,单位 mm),顶栏「户型库」打开卡片画廊,可按居室(开间 / 两居 / 三居 / 四居及以上)筛选;卡片上标着每套的面积、居室数、卫数与布置状态(「默认布置」或「已布置 N 件 · 自动保存」),当前户型带「当前」角标。

户型 套内 户型 套内
小开间 · 35㎡ 34.6 m² 三室一厅一卫 · 80㎡ 80.3 m²
开间一居 · 42㎡ 42.3 m² 三室两厅两卫(默认) 87.2 m²
一室一厅 · 54㎡ 53.6 m² 两室两厅两卫 · 91㎡ 91.4 m²
两室一厅 · 59㎡ 59.0 m² 三室两厅一卫 · 95㎡ 95.0 m²
两室两厅一卫 · 96㎡ 96.9 m² 横厅三居两卫 · 128㎡ 127.4 m²
四室两厅两卫 · 129㎡ 128.0 m² 四室两厅三卫 · 141㎡ 140.5 m²

套内面积按计入面积统计(飘窗等不计入,打印清单里带 * 标出)。

  • 每个户型独立保存:切换户型不会丢改动,回来还是原样。
  • 多方案:「文件 ▾ → 另存为方案」把当前布置存成命名方案,同一户型可存任意多套,随时载入 / 删除。
  • 历史快照:「文件 ▾」里的历史列表可回滚到之前的自动存档点。
  • 一键恢复:户型没布置时画布中央会提示,可一键套用该户型的推荐布置。

家具库

  • 74 件内置家具,分 7 类:卧室 15 · 客厅 16 · 餐厨 12 · 卫浴 8 · 家电 9 · 书房 · 休闲 6 · 灯饰 · 布艺 8。
  • 搜索 + 分类筛选 + 最近使用,每件家具标出宽×深与参考单价。
  • 点按添加(加到房间中心或视图中央)或拖拽摆放(落到指针位置),拖动时贴墙吸附,松手自动避让墙体——只会在原房间内推移,不会被推到墙外。
  • 自定义家具:「+ 自定义」可建任意名称 / 尺寸 / 高度 / 形状(矩形、圆形)/ 颜色 / 单价的家具,保存在「我的家具」分类里反复使用;3D 中按实际尺寸渲染。

编辑与选中

  • 选择:点选;Shift+点击 加选 / 减选;Shift+拖动 或在「框选」工具下拖矩形框选;Ctrl/⌘+A 全选。
  • 变换:拖动移动、拖上方圆点旋转(Shift 任意角度)、双击家具转 90°、拖右下方块改宽深;整组选中后可一起移动 / 旋转。
  • 复制粘贴:Ctrl/⌘+C / X / V 复制 / 剪切 / 粘贴到指针处,Ctrl/⌘+D 原地创建副本。
  • 多选排版:左中右 / 上中下对齐、等距分布、统一尺寸,一键成组排整齐。
  • 其它:镜像(H)、锁定(L)、置顶 / 置底、恢复默认尺寸颜色、删除(Delete);方向键微调 10 mm(Shift 100 mm)。
  • 右键 / 触屏长按弹出操作菜单;选中后底部还会浮出一条常用操作栏(复制 / 旋转 / 镜像 / 锁定 / 置顶 / 删除)。

编辑辅助

「显示 ▾ → 编辑辅助」里逐项开关,设置会被记住:

  • 贴墙吸附:拖动家具时自动吸附到墙面。
  • 对齐参考线:与附近家具的边缘 / 中线对齐时显示参考线。
  • 净距标注:选中家具时标出到四周墙面的净距(如「800 / 1070」)。
  • 碰撞检查:互相重叠的家具用红色斜线标出(地毯、壁挂、台面设备、绿植等不参与;椅子推进桌下不算重叠)。
  • 移动步长:1 / 10 / 50 / 100 mm。
  • 「显示 ▾」同时还有平面图层开关(尺寸、房间、家具、网格、承重墙、标注)、1:60 / 1:100 快捷比例,以及 3D 场景开关(全高墙 / 剖切墙 / 家具 / 房间名 / 夜景 / 日照时间)。

预算与报价

右侧面板分「概览 / 清单 / 报价」三页,未选中任何东西时显示:

  • 概览:全屋预算粗估(地面材料、墙面乳胶漆、家具家电,含损耗)、占比条、六种风格一键套用、房间面积表(点击查看 / 更换地面)、地面材料估算、方案统计与常用操作提示。
  • 清单:按房间分组的家具清单,可定位(飞到该家具)、锁定,并标出「跑到户型外」或「互相重叠」的家具,支持一键移回 / 选中。数量角标会实时提示问题件数。
  • 报价:同名同价合并的报价明细(件数 × 单价 = 小计),家具家电 + 地面 + 墙面乳胶漆合计,可导出 CSV(Excel 直接打开)。

预算里的每一项都能改:单价可在家具属性面板里手填,地面材料可从 8 种里换(橡木 / 胡桃木地板、800 / 600 地砖、大理石、300 防滑砖、水磨石、满铺地毯,各带参考单价与损耗率)。

风格方案

「概览」页提供 原木 / 奶油 / 北欧 / 工业 / 新中式 / 莫兰迪 六种风格,一键统一所有家具配色与客厅、卧室地面,可撤销。

2D 工具

  • 测量(M):两点测距,Shift 锁定水平 / 垂直。
  • 拆改墙体(X):拆除可拆的非承重墙,承重墙受保护;「显示 ▾ → 承重墙」可高亮承重墙。
  • 文字标注(N):在平面图任意位置加说明文字,4 种颜色 / 3 种字号,可拖动、双击编辑,随方案保存、导出与打印。
  • 门窗:点选门 / 窗可改开启方向、推拉门方向与窗台高度。
  • 房间:点选房间可改名、换地面材料。
  • 画布:右下角缩放胶囊(点比例在 1:50 / 1:60 / 1:100 / 1:200 间切换)、适应窗口;底部状态栏实时显示鼠标坐标、当前比例、悬停与选中信息。

3D 场景

  • 鸟瞰 / 漫游两种模式:鸟瞰(左键旋转、右键平移、滚轮缩放,还有「斜视 / 俯视」预设);漫游为第一人称,WASD 行走、Shift 快走、E 开关正前方的门,触屏用摇杆,从入户门进入。
  • 光照:「日照」滑杆(7:00–18:00)与夜景模式。
  • 剖切墙:切到 1.2 m 高看内部布局,或全高墙看完整空间。
  • 房间名标签与「房间」列表:点房间名飞到该房间。
  • 实时同步:3D 与 2D 平面共用同一份数据,右侧面板改动立即生效。

导出、打印与分享

「文件 ▾」菜单:

  • 🔗 复制分享链接——把整套布置压缩进 URL(#p=户型&v=数据),发给客户打开即可还原,无需服务器。
  • 导出图片(PNG)、导出报价清单 CSV、打印(专排打印样式:白底,只输出平面图与页眉信息表,隐藏全部界面元素)。
  • 导出方案 JSON / 导入方案——备份与迁移,导入时自动修复坐标异常的家具。
  • 另存为方案 / 历史快照 / 重置… / 清空布置。

外观与语言

  • 亮色 / 暗色主题(首次按系统偏好),全界面与 3D 场景联动,顶栏一键切换。
  • 简体中文 / 繁體中文 / English 三语,界面文案、家具名、房间名、材料名、户型名全部跟着切。
  • 全屏(Shift+F)、左右面板可收起([ / ])腾出画布。

数据与防丢失

  • 改动自动保存,状态显示在页脚;存储空间不足会明确提示。
  • 载入 / 导入时自动修复坐标异常的家具;删除、清空等操作后的提示条自带「撤销」。
  • 家具图层被隐藏时画布顶部有提示,点击即可恢复显示。
  • 完整的撤销 / 重做栈(Ctrl/⌘+Z / Ctrl/⌘+Shift+Z)。

键盘快捷键

页脚「快捷键」按钮(或按 ?)随时查看完整列表。

工具与视图 编辑
V 选择 / 移动 Ctrl/⌘+Z 撤销
B 框选 Ctrl/⌘+Shift+Z 重做
M 测量(Shift 水平 / 垂直) Ctrl/⌘+C / X / V 复制 / 剪切 / 粘贴到指针处
X 拆改非承重墙 Ctrl/⌘+D 创建副本
N 文字标注 Ctrl/⌘+A 全选家具
Ctrl/⌘+K 命令面板(搜索一切) Delete 删除
T 切换 2D / 3D R / Shift+R 旋转 90°
F 适应窗口 H 左右镜像
Z 缩放到所选 L 锁定 / 解锁
+ / − 放大 / 缩小 方向键 微调 10 mm(Shift 100 mm)
空格+拖动 / 中键 平移画面
[ / ] 收起 / 展开左右面板
Shift+F 全屏
Esc 取消选择 / 退出工具

鼠标 / 触屏:Shift+点击 加选、空白处 Shift+拖动 框选、右键或长按弹菜单、双击家具旋转、拖顶部圆点旋转(Shift 任意角度)、拖右下方块改尺寸、双指缩放平移。

3D 漫游:W A S D 移动、Shift 快走、E 开关正前方的门、Esc 暂停。

命令面板(Ctrl/⌘+K 或页脚「命令」)支持中英文混合搜索全部操作、风格、户型、房间、可添加的家具和已摆放的家具,回车执行——记不住快捷键时用它最快。


数据存放

纯前端,没有任何后端请求,数据都在 localStorage:

键 内容
huxing-design-v2 全部户型的布置、房间命名与地面、墙体拆改、门窗调整、测量线、文字标注、风格、自定义家具(自动兼容迁移 v1)
huxing-history 历史快照
huxing-ui 图层开关 / 编辑辅助 / 移动步长 / 面板分页
huxing-theme · huxing-lang 主题、语言
huxing-recent · huxing-panes 最近使用的家具、左右面板开合状态

「重置 → 清除本机全部数据」会清空以上所有键(建议先导出方案 JSON 备份)。

项目结构

装修/
├── index.html              # 全部内容:样式 + 户型数据 + 2D 引擎 + 3D 场景(~1.3 MB)
├── validate-plans.mjs      # 户型数据自检脚本(node validate-plans.mjs)
├── manifest.webmanifest    # PWA 清单(可安装到桌面 / 主屏)
├── icon-192.png / icon-512.png
├── screenshot/             # README 用的界面截图
└── README.md

index.html 内部大致分四段:样式(CSS 变量分「表面」与「外壳」两层)、户型数据与家具库、2D 平面引擎(原生 SVG + 指针事件)、3D 场景(three.js,写在 create3D() 工厂里)。

如何新增一套户型

打开 index.html,在最后一个户型对象(当前为 const P12 = {...})之后照格式增加一个对象并加入 const PLANS = [...],再在 NAMES_EN 中补上英文名。改完运行 node validate-plans.mjs 自检;户型库按名称中的「X室 / X卫 / 开间」自动识别居室数:

const P13 = {
  id: 'p13',                      // 唯一 id
  name: '四室两厅两卫 · 140㎡',    // 显示名(英文界面查 NAMES_EN 表)
  en: '4BR · 2LR · 2BA · 140m²',  // 英文名
  note: '', noteEn: '',           // 副标题备注(可空)
  walls: [ [x0,y0,x1,y1,'类型'], ... ],  // b=承重 e=外墙 n=非承重 low=矮墙;外墙在门窗洞口处断开
  wins:  [ {rect:[x0,y0,x1,y1], sill:0.9}, ... ],     // 窗:sill=窗台高 m(head 默认 2.4)
  doors: [ {name, rect, h:[铰点], c:[关闭方向], o:[开门方向], len}, ... ],  // 入户门加 entry:true,o 指向室内
  slides:[ {rect, v:true} ],      // 推拉门,v = 竖向墙
  rooms: [ {id, name, poly:[[x,y]...], mat, at:[标签x,y], counted:false?}, ... ],  // poly 用墙内皮坐标
  dims:  [ {h:1, at:-750, start:0, segs:[...]}, ... ],  // 尺寸标注链,h=1 水平;at 为标注线位置
  bounds:{x, y, w, h},            // 画布初始范围(含标注留白)
  defaults:[ {t:'bed', n:'双人床', x, y, w, d, r, c?}, ... ],  // 默认家具布置
};

坐标约定:mm,原点 = 左侧外墙内皮与顶部外墙内皮。入户箭头、3D 漫游出生点、窗台高、3D 场景中心全部自动推导,无需另行配置。

validate-plans.mjs 会检查:字段合法性与坐标递增、门窗洞口不与墙段实体重叠、尺寸标注链每段为正且总长与墙长一致、房间多边形面积为正且在画布内、默认家具都在室内、门的方向向量 / 铰点 / 入户门唯一性。退出码 0 表示全部通过。由于校验脚本是从 HTML 里提取数据段执行的,户型数据结构改动时只需同步它开头那两个定位字符串。

实现与维护说明

离线与依赖

  • three.js r160 已以 base64 data-URL 形式内联进 importmap(无 CDN 依赖),因此断网、file:// 打开都能用。
  • 升级 three.js:下载新版 build/three.module.min.js 与 examples/jsm/{controls/OrbitControls,controls/PointerLockControls,geometries/RoundedBoxGeometry,environments/RoomEnvironment,renderers/CSS2DRenderer}.js,逐个 base64 后替换 importmap 中对应 data:text/javascript;base64,... 的值(注意 importmap 内必须是纯 JSON,不能加注释)。

加载与渲染

  • importmap 位于 </body> 前(而非 <head>),让 2D 界面先完成解析与首屏绘制。3D 模块写在 create3D(...) 工厂函数里,首次进入 3D(或鼠标移到「2D / 3D」切换按钮上预加载)时才 import() three.js 并创建场景;新增 three 插件时需同时加到 load() 的 import 列表与 create3D 参数。
  • 3D 采用按需渲染:画面静止时不渲染。直接修改场景(增删物体、改材质 / 可见性 / 相机)后需调用 invalidate(),否则要等下一次交互才刷新;家具与平面实时同步走增量重建(签名对比,只有变化的图层重画)。
  • 2D 用原生 SVG 绘制,家具 / 墙体 / 门窗 / 标注分图层(#gFurn、#gWalls …),选中态与手柄单独一层;大量元素下靠签名(sigArch / sigFurn / sigLabels)避免整树重建。

样式

  • 视觉方向「制图工作室」:深墨色背板 + 纸面工作岛 + 朱红信号色 #ef5a24。
  • 令牌分两层——--s-* 为卡片表面、--shell-* 为深色外壳(顶栏 / 页脚 / 浮动工具条 / 提示等,亮暗主题下都是深色)。组件只使用 --ink / --card / --line 等语义变量;外壳区域(header, footer, .hero, #fab … 选择器组)把语义变量重新指向外壳值,弹出菜单 / 对话框再指回表面值。暗色在 :root[data-theme="dark"] 覆盖两层取值。新增样式请复用语义变量而非写死颜色;平面 SVG 与 3D 中的选中色写在 JS 常量 ACC 等处。
  • 画布点阵:main 的背景点阵由 applyView() 写入 --gs / --gx / --gy,与平面坐标对齐(1 m 一点,按缩放 2 倍调整);开启「网格」图层时自动隐藏。

数据模型

  • 方案数据另有 notes(文字标注 {id,x,y,text,color,size})与 style(最近套用的风格 id)。
  • 家具数据字段:{id,type,name,cx,cy,w,d,rot,color},可选 flip(镜像)、locked(锁定)、price(手填单价,优先于家具库参考价)、h(自定义家具高度 mm)。家具库条目为 [类型, 名称, 宽, 深, 颜色, 参考单价]。
  • 碰撞检查规则见 NOCOLLIDE(地毯、壁挂、台面设备、绿植不参与)与 SEATS / TABLES(椅子推进桌下不算重叠);内置 12 套户型的默认布置均无重叠(由 validate-plans.mjs 与运行时检查双重保证)。

多语言

  • 静态文案写在元素上(data-en / data-en-title / data-en-placeholder),首次切换语言时把中文原文存进 dataset 作为简中回退;动态文案用 tr(zh, en),专有名词(家具名、房间名、材料名、户型名)查 NAMES_EN 表。
  • 新增界面文案若含简体专用字,需在 S2T 字表中补上对应繁体字,否则繁体界面会保留简体字。

已知边界

  • 拆改墙体后不合并房间面积(面积表仍按原房间统计)。
  • 家具之间只做碰撞「检查」(标红提示),不会自动推开;自动避让只在拖动落点做一次(避让墙体,保持在原房间内)。
  • 报价为参考价(材料单价 × 面积含损耗 + 家具库参考价),不是真实预算。
  • 数据存在浏览器本地:换浏览器 / 设备 / 清理站点数据会丢,重要方案请「导出方案 JSON」备份或发分享链接。

许可

本项目以 MIT 许可证 发布。第三方组件:three.js r160(MIT,已内联)。

About

Web装修设计工具,集 2D 平面布置与 three.js 3D 漫游于一体,内置 12 套户型、多方案管理与自定义家具库,支持多选编辑、对齐吸附、碰撞检查及三语暗色模式。

Topics

Resources

Stars

70 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages