@ray-js/robot-map-sdk 0.0.17-beta.1 → 0.0.17-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/bin/mcp-server.js +31 -15
  2. package/dist/constant/methods.js +1 -1
  3. package/dist/index.d.ts +164 -23
  4. package/dist/index.rjs.js +1 -1
  5. package/dist-app/assets/index-BVLfQBTu.js +1 -0
  6. package/dist-app/index.html +1 -1
  7. package/dist-docs/404.html +2 -2
  8. package/dist-docs/assets/{app.tuTOhCpg.js → app.C3BeeaYd.js} +1 -1
  9. package/dist-docs/assets/chunks/@localSearchIndexroot.BMKcHG_i.js +1 -0
  10. package/dist-docs/assets/chunks/{BitmapFont.Bn4Xj5K-.js → BitmapFont.BQzmxL0v.js} +1 -1
  11. package/dist-docs/assets/chunks/{BufferResource.DTCsTJzt.js → BufferResource.CNdzQT3n.js} +1 -1
  12. package/dist-docs/assets/chunks/{CanvasRenderer.DflYBGLD.js → CanvasRenderer.BfEovjEl.js} +1 -1
  13. package/dist-docs/assets/chunks/{RenderTargetSystem.DBrMOqFS.js → RenderTargetSystem.BsnW3px2.js} +1 -1
  14. package/dist-docs/assets/chunks/{VPLocalSearchBox.D4ShZjav.js → VPLocalSearchBox.BV6OAhiI.js} +1 -1
  15. package/dist-docs/assets/chunks/{WebGLRenderer.CmlR6hDG.js → WebGLRenderer.BziWi5pK.js} +1 -1
  16. package/dist-docs/assets/chunks/{WebGPURenderer.C7Xo_Nj6.js → WebGPURenderer.bELKl5QM.js} +1 -1
  17. package/dist-docs/assets/chunks/{browserAll.CIjY9VGZ.js → browserAll.Cbwmm72I.js} +1 -1
  18. package/dist-docs/assets/chunks/index.CsLbOa5r.js +744 -0
  19. package/dist-docs/assets/chunks/theme.BItp-bTH.js +4 -0
  20. package/dist-docs/assets/chunks/{webworkerAll.rjNztTjs.js → webworkerAll.BqQ8oBVT.js} +1 -1
  21. package/dist-docs/assets/{guide_advanced-usage.md.dxD8u9v3.js → guide_advanced-usage.md.BsGRhEuG.js} +12 -9
  22. package/dist-docs/assets/{guide_advanced-usage.md.dxD8u9v3.lean.js → guide_advanced-usage.md.BsGRhEuG.lean.js} +1 -1
  23. package/dist-docs/assets/{guide_getting-started.md.DcbNPHUc.js → guide_getting-started.md.DQIIL6ql.js} +1 -1
  24. package/dist-docs/assets/guide_mcp.md.BYlNOxMG.js +1 -0
  25. package/dist-docs/assets/{guide_mcp.md.CabCiX8Z.lean.js → guide_mcp.md.BYlNOxMG.lean.js} +1 -1
  26. package/dist-docs/assets/{reference_config.md.DpjGhNQS.js → reference_config.md.BslTlkKM.js} +3 -3
  27. package/dist-docs/assets/{reference_config.md.DpjGhNQS.lean.js → reference_config.md.BslTlkKM.lean.js} +1 -1
  28. package/dist-docs/assets/{reference_data.md.DL6rfzez.js → reference_data.md.jnSR7326.js} +8 -7
  29. package/dist-docs/assets/{reference_data.md.DL6rfzez.lean.js → reference_data.md.jnSR7326.lean.js} +1 -1
  30. package/dist-docs/assets/{reference_methods.md.yWEfqPKf.js → reference_methods.md.Cv8q9vtz.js} +8 -3
  31. package/dist-docs/assets/{reference_methods.md.yWEfqPKf.lean.js → reference_methods.md.Cv8q9vtz.lean.js} +1 -1
  32. package/dist-docs/assets/{reference_runtime.md.CE2QTAiD.js → reference_runtime.md.BFQ83m1B.js} +2 -2
  33. package/dist-docs/assets/{reference_runtime.md.CE2QTAiD.lean.js → reference_runtime.md.BFQ83m1B.lean.js} +1 -1
  34. package/dist-docs/assets/{reference_types.md.ZQU03iAA.js → reference_types.md.ifmL7IbS.js} +11 -10
  35. package/dist-docs/assets/{reference_types.md.ZQU03iAA.lean.js → reference_types.md.ifmL7IbS.lean.js} +1 -1
  36. package/dist-docs/guide/advanced-usage.html +15 -12
  37. package/dist-docs/guide/concepts.html +3 -3
  38. package/dist-docs/guide/getting-started.html +5 -5
  39. package/dist-docs/guide/mcp.html +5 -5
  40. package/dist-docs/guide/spot-room-binding.html +3 -3
  41. package/dist-docs/hashmap.json +1 -1
  42. package/dist-docs/index.html +3 -3
  43. package/dist-docs/plans/2026-03-04-detected-objects-visibility-design.html +3 -3
  44. package/dist-docs/plans/2026-03-04-show-detected-objects-implementation-plan.html +3 -3
  45. package/dist-docs/plans/2026-03-10-simulator-debug-design.html +3 -3
  46. package/dist-docs/plans/2026-03-10-simulator-events-console-design.html +3 -3
  47. package/dist-docs/plans/2026-03-10-simulator-events-console-implementation-plan.html +3 -3
  48. package/dist-docs/plans/2026-03-10-simulator-runtime-controls-design.html +3 -3
  49. package/dist-docs/plans/2026-03-10-simulator-runtime-controls-implementation-plan.html +3 -3
  50. package/dist-docs/plans/2026-03-10-testing-rollout-next-steps-plan.html +3 -3
  51. package/dist-docs/plans/2026-03-11-simulator-logger-dump-implementation-plan.html +3 -3
  52. package/dist-docs/reference/callbacks.html +3 -3
  53. package/dist-docs/reference/config.html +6 -6
  54. package/dist-docs/reference/data.html +11 -10
  55. package/dist-docs/reference/methods.html +11 -6
  56. package/dist-docs/reference/runtime.html +5 -5
  57. package/dist-docs/reference/types.html +14 -13
  58. package/dist-docs/reference/utils.html +3 -3
  59. package/dist-docs/simulator/index.html +3 -3
  60. package/package.json +1 -1
  61. package/dist-app/assets/index-BhBznOX2.js +0 -1
  62. package/dist-docs/adr/0001-threshold-mirrors-virtual-wall.html +0 -25
  63. package/dist-docs/adr/0002-threshold-edit-surface-quad-family.html +0 -25
  64. package/dist-docs/agents/domain.html +0 -39
  65. package/dist-docs/agents/issue-tracker.html +0 -25
  66. package/dist-docs/agents/triage-labels.html +0 -25
  67. package/dist-docs/assets/adr_0001-threshold-mirrors-virtual-wall.md.BGtyf9GS.js +0 -1
  68. package/dist-docs/assets/adr_0001-threshold-mirrors-virtual-wall.md.BGtyf9GS.lean.js +0 -1
  69. package/dist-docs/assets/adr_0002-threshold-edit-surface-quad-family.md.BlvHYJT5.js +0 -1
  70. package/dist-docs/assets/adr_0002-threshold-edit-surface-quad-family.md.BlvHYJT5.lean.js +0 -1
  71. package/dist-docs/assets/agents_domain.md.CYB9yWEy.js +0 -15
  72. package/dist-docs/assets/agents_domain.md.CYB9yWEy.lean.js +0 -1
  73. package/dist-docs/assets/agents_issue-tracker.md.CrjzmXmc.js +0 -1
  74. package/dist-docs/assets/agents_issue-tracker.md.CrjzmXmc.lean.js +0 -1
  75. package/dist-docs/assets/agents_triage-labels.md.Cmw0b5xB.js +0 -1
  76. package/dist-docs/assets/agents_triage-labels.md.Cmw0b5xB.lean.js +0 -1
  77. package/dist-docs/assets/chunks/@localSearchIndexroot.7eWxrBA2.js +0 -1
  78. package/dist-docs/assets/chunks/index.BCZVCQiT.js +0 -744
  79. package/dist-docs/assets/chunks/theme.BwMYfKet.js +0 -4
  80. package/dist-docs/assets/guide_mcp.md.CabCiX8Z.js +0 -1
  81. /package/dist-docs/assets/{guide_getting-started.md.DcbNPHUc.lean.js → guide_getting-started.md.DQIIL6ql.lean.js} +0 -0
@@ -1 +1 @@
1
- const e=["areRoomsAdjacent","getForbiddenSweepZones","getForbiddenMopZones","getCleanZones","getVirtualWalls","getThresholds","getSpots","getRoomAnchors","getWayPoints","getViewportCenterPoint","getMapCenterPoint","getWallPointsByViewportCenter","getForbiddenSweepZonePointsByViewportCenter","getForbiddenMopZonePointsByViewportCenter","getCleanZonePointsByViewportCenter","getSpotPointByViewportCenter","getEffectiveDividerPoints","getDividerEndPoints","isNearChargerOrRobot","isPointInAnyRoom","isWallIntersectsAnyRoom","isZoneIntersectsAnyRoom","resetPanZoom","snapshot","snapshotByData","getCustomCarpets","forceEndGesture","getFurniturePointsByViewportCenter","getCustomCarpetPointsByViewportCenter","getRectPointsByCenter","getFurnitures","drawCustomZones","getCustomZones","clearCustomZones","setEditingCustomZones"],o=["onMapFirstDrawed","onMapDrawed","onPathDrawed","onRoomPropertiesDrawed","onRoomsDrawed","onClickRoom","onClickRoomProperties","onRemoveForbiddenSweepZone","onRemoveForbiddenMopZone","onRemoveCleanZone","onRemoveVirtualWall","onRemoveThreshold","onUpdateForbiddenSweepZone","onUpdateForbiddenMopZone","onUpdateCleanZone","onUpdateVirtualWall","onUpdateThreshold","onUpdateSpot","onUpdateRoomAnchor","onUpdateWayPoint","onUpdateDivider","onClickForbiddenSweepZone","onClickForbiddenMopZone","onClickCleanZone","onClickVirtualWall","onClickThreshold","onClickSpot","onClickRoomAnchor","onClickWayPoint","onClickDetectedObject","onClickCustomElement","onClickMap","onClickCarpet","onDeleteCarpet","onUpdateCustomCarpet","onDeleteCustomCarpet","onGestureStart","onGestureEnd","onClickRobot","onClickChargingStation","onRemoveFurniture","onUpdateFurniture","onClickFurniture","onRemoveCustomZone","onUpdateCustomZone","onClickCustomZone"];export{e as MAP_API_METHODS,o as MAP_CALLBACK_METHODS};
1
+ const e=["areRoomsAdjacent","getForbiddenSweepZones","getForbiddenMopZones","getCleanZones","getVirtualWalls","getThresholds","getSpots","getRoomAnchors","getWayPoints","getViewportCenterPoint","getMapCenterPoint","getWallPointsByViewportCenter","getForbiddenSweepZonePointsByViewportCenter","getForbiddenMopZonePointsByViewportCenter","getCleanZonePointsByViewportCenter","getThresholdPointsByViewportCenter","getSpotPointByViewportCenter","getEffectiveDividerPoints","getDividerEndPoints","isNearChargerOrRobot","isPointInAnyRoom","isWallIntersectsAnyRoom","isZoneIntersectsAnyRoom","resetPanZoom","snapshot","snapshotByData","getCustomCarpets","forceEndGesture","getFurniturePointsByViewportCenter","getCustomCarpetPointsByViewportCenter","getRectPointsByCenter","getFurnitures","drawCustomZones","getCustomZones","clearCustomZones","setEditingCustomZones"],o=["onMapFirstDrawed","onMapDrawed","onPathDrawed","onRoomPropertiesDrawed","onRoomsDrawed","onClickRoom","onClickRoomProperties","onRemoveForbiddenSweepZone","onRemoveForbiddenMopZone","onRemoveCleanZone","onRemoveVirtualWall","onRemoveThreshold","onUpdateForbiddenSweepZone","onUpdateForbiddenMopZone","onUpdateCleanZone","onUpdateVirtualWall","onUpdateThreshold","onUpdateSpot","onUpdateRoomAnchor","onUpdateWayPoint","onUpdateDivider","onClickForbiddenSweepZone","onClickForbiddenMopZone","onClickCleanZone","onClickVirtualWall","onClickThreshold","onClickSpot","onClickRoomAnchor","onClickWayPoint","onClickDetectedObject","onClickCustomElement","onClickMap","onClickCarpet","onDeleteCarpet","onUpdateCustomCarpet","onDeleteCustomCarpet","onGestureStart","onGestureEnd","onClickRobot","onClickChargingStation","onRemoveFurniture","onUpdateFurniture","onClickFurniture","onRemoveCustomZone","onUpdateCustomZone","onClickCustomZone"];export{e as MAP_API_METHODS,o as MAP_CALLBACK_METHODS};
package/dist/index.d.ts CHANGED
@@ -61,6 +61,35 @@ export declare type AppConfig = {
61
61
  freeColor: ColorSource
62
62
  /** 地图自适应时的偏移量(像素) */
63
63
  autoFitOffset?: { x: number; y: number }
64
+ /**
65
+ * 地图美化(Beautify)参数,配合 `runtime.enableBeautify` 使用。
66
+ *
67
+ * 只暴露开发者能凭直觉调整的旋钮:外壳描边样式(`borderWidth` /
68
+ * `shellLightenRatio`)与墙线吸附强度(`wallSnapTolerance`)。RDP 简化容差、
69
+ * 凹凸抹平尺寸、回退膨胀阈值属于算法内部标定参数,已下沉为内部常量、不再
70
+ * 暴露为配置(2026-07-23 收窄)。门口推断(Doorway inference)同理——随美化
71
+ * 自动运行,参数为内部常量(原 `doorway` 子开关已于 2026-07-22 移除)。
72
+ */
73
+ beautify: {
74
+ /**
75
+ * 外壳规整档:`'faithful'`(缺省)外壳紧贴原始轮廓,未测绘到的空洞原样
76
+ * 保留;`'boxy'` 花掉一份面积预算换更少的边,房间趋向规整的矩形 / L 形
77
+ * (空洞被浅色外壳盖住)。两档都只加不减,绝不削掉设备测绘到的区域;
78
+ * 别的房间已测绘的区域也不会被外壳盖住(渲染分层保证,几何上贴身档的
79
+ * 外壳仍可能与邻居交叠)。档位映射到的化简预算是内部标定常量。
80
+ */
81
+ level: 'faithful' | 'boxy'
82
+ /** 外壳边框宽度(像素),边框颜色复用 `map.obstacleColor` */
83
+ borderWidth: number
84
+ /** 外壳浅色调的提亮比例(0 为房间原色,1 为纯白) */
85
+ shellLightenRatio: number
86
+ /**
87
+ * 墙线吸附(wall-snap)容差(地图像素):在原始数据里相邻的房间对,其近平行
88
+ * 外壳边垂直间距不超过此值时吸附到同一条墙线,使相邻外壳零缝隙贴合。
89
+ * 缺省 7;`0` 关闭 wall-snap。相邻性判定复用 `map.adjacencyThreshold`。
90
+ */
91
+ wallSnapTolerance: number
92
+ }
64
93
  }
65
94
 
66
95
  /** 热力图配置 */
@@ -102,6 +131,14 @@ export declare type AppConfig = {
102
131
  inactive: string[]
103
132
  /** 普通状态颜色(非选择模式下使用) */
104
133
  normal?: string[]
134
+ /**
135
+ * 美化外壳(Shell)填充色的显式覆盖调色板,按四色索引取用(可选)。
136
+ * 未配置时外壳色由房间基础色向白色按 `map.beautify.shellLightenRatio`
137
+ * 推导(随选择状态变化);配置后外壳直接使用该调色板对应索引的颜色,
138
+ * 覆盖自动推导。仅在 `runtime.enableBeautify` 开启时生效,足迹层始终用
139
+ * 房间基础色,选择态反馈不受影响。修改此项会实时重新着色两层。
140
+ */
141
+ shell?: string[]
105
142
  /** 房间名称颜色 */
106
143
  name: string[]
107
144
  /** 房间名称非激活状态颜色 */
@@ -1093,7 +1130,7 @@ export declare type LoggerPayload = {
1093
1130
  ts: number
1094
1131
  }
1095
1132
 
1096
- export declare const MAP_API_METHODS: readonly ["areRoomsAdjacent", "getForbiddenSweepZones", "getForbiddenMopZones", "getCleanZones", "getVirtualWalls", "getThresholds", "getSpots", "getRoomAnchors", "getWayPoints", "getViewportCenterPoint", "getMapCenterPoint", "getWallPointsByViewportCenter", "getForbiddenSweepZonePointsByViewportCenter", "getForbiddenMopZonePointsByViewportCenter", "getCleanZonePointsByViewportCenter", "getSpotPointByViewportCenter", "getEffectiveDividerPoints", "getDividerEndPoints", "isNearChargerOrRobot", "isPointInAnyRoom", "isWallIntersectsAnyRoom", "isZoneIntersectsAnyRoom", "resetPanZoom", "snapshot", "snapshotByData", "getCustomCarpets", "forceEndGesture", "getFurniturePointsByViewportCenter", "getCustomCarpetPointsByViewportCenter", "getRectPointsByCenter", "getFurnitures", "drawCustomZones", "getCustomZones", "clearCustomZones", "setEditingCustomZones"];
1133
+ export declare const MAP_API_METHODS: readonly ["areRoomsAdjacent", "getForbiddenSweepZones", "getForbiddenMopZones", "getCleanZones", "getVirtualWalls", "getThresholds", "getSpots", "getRoomAnchors", "getWayPoints", "getViewportCenterPoint", "getMapCenterPoint", "getWallPointsByViewportCenter", "getForbiddenSweepZonePointsByViewportCenter", "getForbiddenMopZonePointsByViewportCenter", "getCleanZonePointsByViewportCenter", "getThresholdPointsByViewportCenter", "getSpotPointByViewportCenter", "getEffectiveDividerPoints", "getDividerEndPoints", "isNearChargerOrRobot", "isPointInAnyRoom", "isWallIntersectsAnyRoom", "isZoneIntersectsAnyRoom", "resetPanZoom", "snapshot", "snapshotByData", "getCustomCarpets", "forceEndGesture", "getFurniturePointsByViewportCenter", "getCustomCarpetPointsByViewportCenter", "getRectPointsByCenter", "getFurnitures", "drawCustomZones", "getCustomZones", "clearCustomZones", "setEditingCustomZones"];
1097
1134
 
1098
1135
  export declare const MAP_CALLBACK_METHODS: readonly ["onMapFirstDrawed", "onMapDrawed", "onPathDrawed", "onRoomPropertiesDrawed", "onRoomsDrawed", "onClickRoom", "onClickRoomProperties", "onRemoveForbiddenSweepZone", "onRemoveForbiddenMopZone", "onRemoveCleanZone", "onRemoveVirtualWall", "onRemoveThreshold", "onUpdateForbiddenSweepZone", "onUpdateForbiddenMopZone", "onUpdateCleanZone", "onUpdateVirtualWall", "onUpdateThreshold", "onUpdateSpot", "onUpdateRoomAnchor", "onUpdateWayPoint", "onUpdateDivider", "onClickForbiddenSweepZone", "onClickForbiddenMopZone", "onClickCleanZone", "onClickVirtualWall", "onClickThreshold", "onClickSpot", "onClickRoomAnchor", "onClickWayPoint", "onClickDetectedObject", "onClickCustomElement", "onClickMap", "onClickCarpet", "onDeleteCarpet", "onUpdateCustomCarpet", "onDeleteCustomCarpet", "onGestureStart", "onGestureEnd", "onClickRobot", "onClickChargingStation", "onRemoveFurniture", "onUpdateFurniture", "onClickFurniture", "onRemoveCustomZone", "onUpdateCustomZone", "onClickCustomZone"];
1099
1136
 
@@ -1404,6 +1441,28 @@ export declare interface MapApi {
1404
1441
  offsetX?: number;
1405
1442
  offsetY?: number;
1406
1443
  }): Point[];
1444
+ /**
1445
+ * 基于视口中心生成门槛的四个角点坐标
1446
+ *
1447
+ * 缺省尺寸 1m × 0.15m(长 × 厚)—— 「新建门槛」的初始尺寸,不是配置项;
1448
+ * 需要别的初始尺寸就传 `width` / `height`。传入值会被钳制到
1449
+ * `controls.threshold` 的 `minLength`/`maxLength` 与 `minHeight`/`maxHeight`
1450
+ * (米)区间内。
1451
+ *
1452
+ * @param options - 配置选项
1453
+ * @param options.width - 门槛长度,单位米,默认 1
1454
+ * @param options.height - 门槛厚度,单位米,默认 0.15
1455
+ * @param options.offsetX - X方向像素偏移,支持负数,默认为 0
1456
+ * @param options.offsetY - Y方向像素偏移,支持负数,默认为 0
1457
+ * @returns 四个角点坐标,顺时针顺序:[左上, 右上, 右下, 左下](0→1 为长度
1458
+ * 方向,0→3 为厚度方向),可直接作为 `ThresholdParam.points`
1459
+ */
1460
+ getThresholdPointsByViewportCenter(options?: {
1461
+ width?: number;
1462
+ height?: number;
1463
+ offsetX?: number;
1464
+ offsetY?: number;
1465
+ }): Point[];
1407
1466
  /**
1408
1467
  * 基于任意中心点生成矩形的四个顶点坐标
1409
1468
  *
@@ -2166,6 +2225,24 @@ export declare type ProcessedRasterData = {
2166
2225
  totalPixels: number
2167
2226
  }
2168
2227
 
2228
+ /**
2229
+ * 栅格房间的美化几何(仅 `runtime.enableBeautify` 开启时由 MapManager 计算,
2230
+ * 随 `ProcessedRasterData` 一并交给渲染层)。
2231
+ *
2232
+ * 由像素掩膜描环(`traceRoomRing`)后经既有美化管线得到,坐标在像素**角点格**
2233
+ * 坐标系(像素 `(x, y)` 占据 `[x, x+1] × [y, y+1]`),渲染时不做 +0.5 居中偏移
2234
+ * ——描环多边形本就与逐像素矩形逐字节对齐。只有拿到可渲染外壳的房间才有此
2235
+ * 记录;描环失败 / 管线回退的房间与特殊房间保持逐像素原样渲染(ADR 0003/0004)。
2236
+ */
2237
+ export declare type RasterBeautifiedRoom = {
2238
+ /** 美化外壳(Shell)顶点(闭合环,不重复首点),严格包含描环足迹 */
2239
+ shell: Point[]
2240
+ /** 美化足迹(Footprint)顶点:无损阶梯描环本身(逐像素原样,不简化) */
2241
+ footprint: Point[]
2242
+ /** 推断出的门口开口段,落在该房间外壳边上(可选,见 Room.doorways) */
2243
+ doorways?: { start: Point; end: Point }[]
2244
+ }
2245
+
2169
2246
  /**
2170
2247
  * 点阵房间数据
2171
2248
  */
@@ -2225,6 +2302,27 @@ export declare type Room = {
2225
2302
  centerPoint: Point
2226
2303
  /** 颜色索引(用于四色算法) */
2227
2304
  colorIndex?: number
2305
+ /**
2306
+ * 美化外壳(Shell)顶点,仅在 `runtime.enableBeautify` 开启时由
2307
+ * MapManager 写入绘制数据;`roomGeometryMap` 中的原始几何不携带该字段
2308
+ * (原始数据保持数据层权威,见 ADR 0003)
2309
+ */
2310
+ shell?: Point[]
2311
+ /**
2312
+ * 美化足迹(Footprint)顶点:房间原始轮廓的轻度简化环,仅在美化开启且该
2313
+ * 房间携带 `shell` 时由 MapManager 一并写入。渲染层用房间基础色把它填入
2314
+ * 外壳内部并裁剪到外壳,呈现设备实际测绘区域(见 ADR 0003)。与 `shell`
2315
+ * 同样不写回 `roomGeometryMap`。
2316
+ */
2317
+ footprint?: Point[]
2318
+ /**
2319
+ * 推断出的门口开口段(Doorway),落在该房间自身外壳边上。门口推断是美化管线的
2320
+ * 内建默认步骤:仅在 `runtime.enableBeautify` 开启、且该房间共享墙上推断出开口时
2321
+ * 由 MapManager 写入(随美化自动运行,不再需要配置或 runtime 子开关)。渲染层据此
2322
+ * 在这些位置打断外壳边框。门口是派生视觉开口,不是门槛(Threshold),绝不影响门槛
2323
+ * 渲染 / 编辑(见 CONTEXT.md §Beautification、ADR 0003)。
2324
+ */
2325
+ doorways?: { start: Point; end: Point }[]
2228
2326
  }
2229
2327
 
2230
2328
  /**
@@ -2436,6 +2534,17 @@ export declare type RuntimeConfig = {
2436
2534
  showRobotPulseCircle: boolean
2437
2535
  /** 选中的地毯ID列表 */
2438
2536
  selectedCarpetIds: string[]
2537
+ /**
2538
+ * 是否启用地图美化(Beautify)
2539
+ *
2540
+ * 开启后地图以规整外壳(Shell)展示房间:外壳填充为房间色的浅色调,
2541
+ * 边框使用 `config.map.obstacleColor`。结构化地图上障碍点与自由区域点云
2542
+ * 隐藏,未知房间(id >= 255)不参与美化、按原样渲染;栅格地图上房间
2543
+ * 像素掩膜先描成轮廓再走同一条美化管线(2026-07-28),特殊房间与描环 /
2544
+ * 直角化失败的房间保持逐像素原样渲染。切换开关会从缓存的地图数据重新
2545
+ * 处理并立即重绘。样式与算法参数见 `config.map.beautify`。
2546
+ */
2547
+ enableBeautify: boolean
2439
2548
  }
2440
2549
 
2441
2550
  /** 定点清扫配置 */
@@ -2544,28 +2653,57 @@ export declare type SpotParam = {
2544
2653
 
2545
2654
  /** 门槛配置 */
2546
2655
  export declare type ThresholdConfig = {
2547
- /** 条纹线宽(屏幕像素,不随地图缩放变化) */
2656
+ /**
2657
+ * 条纹线宽,垂直于斜纹方向度量(斜纹角度见 {@link ThresholdConfig.stripeAngle})。
2658
+ *
2659
+ * **单位是条带厚度的比例,不是像素**(0.3 表示线宽为条带厚度的 30%)。
2660
+ * 于是整套纹路跟着条带一起缩放:跨条带的条纹根数、疏密、着色比例在任何
2661
+ * 地图缩放下都不变,薄门槛与厚门槛看起来也是同一张贴纸。
2662
+ */
2548
2663
  stripeWidth: number
2549
- /** 相邻条纹间距(屏幕像素) */
2664
+ /**
2665
+ * 相邻条纹间距,沿条带长度方向度量。**单位同样是条带厚度的比例。**
2666
+ *
2667
+ * 步距 `stripeWidth + stripeGap` 决定疏密:取 0.7 时,一根斜纹横穿条带的
2668
+ * 水平距离约为步距的 `1 / (0.7 × tan(stripeAngle))` 倍。
2669
+ *
2670
+ * 两者不同轴:`stripeWidth` 是垂直于斜纹的线宽,同一根斜纹沿长度方向占
2671
+ * `stripeWidth / sin(stripeAngle)`(45° 时为 `× √2`),所以着色比例约为
2672
+ * `stripeWidth / sin(stripeAngle) / (stripeWidth + stripeGap)`——默认值下
2673
+ * 约 55%。调陡 `stripeAngle` 会让条带变淡,需同步放大 `stripeWidth`。
2674
+ */
2550
2675
  stripeGap: number
2676
+ /**
2677
+ * 斜纹倾斜方向:`'forward'` 为 `/`(沿长度方向向右上),`'backward'` 为
2678
+ * `\`(向右下)。缺省 `'forward'`。厂商之间惯例不一,两种都保留。
2679
+ */
2680
+ stripeDirection: 'forward' | 'backward'
2681
+ /**
2682
+ * 斜纹与条带长度方向的夹角(度)。`45` 是常见的危险胶带角度,`90` 为垂直
2683
+ * 于条带的竖条纹;取值钳制在 `[10, 90]`。
2684
+ *
2685
+ * 注意角度会连带改变疏密与着色:斜纹越陡,横穿条带需要的水平距离越短
2686
+ * (`厚度 / tan(角度)`),同样的步距下穿过条带的条纹越少;同时一根斜纹沿
2687
+ * 长度方向只占 `stripeWidth / sin(角度)`,所以着色比例也会下降。改陡以后
2688
+ * 想维持观感,需要同步调小 `stripeGap`。
2689
+ */
2690
+ stripeAngle: number
2551
2691
  /** 条带边框线宽(屏幕像素) */
2552
2692
  borderWidth: number
2553
2693
  /** 条带圆角半径(屏幕像素,自动不超过条带半厚 / 半长) */
2554
2694
  cornerRadius: number
2555
- /** 可通行门槛样式(默认绿色斜纹) */
2695
+ /** 可通行门槛样式(默认蓝白斜纹) */
2556
2696
  passable: ThresholdStyle
2557
- /** 不可通行门槛样式(默认红色斜纹) */
2697
+ /** 不可通行门槛样式(默认红白斜纹) */
2558
2698
  impassable: ThresholdStyle
2559
- /** 最小长度 (米),绘制与缩放时长度被钳制到不小于该值 */
2699
+ /** 最小长度 (米),绘制与缩放时长边(顶点 0→1)被钳制到不小于该值 */
2560
2700
  minLength: number
2561
2701
  /** 最大长度 (米),可选。缺省或 ≤ minLength 时不限制。 */
2562
2702
  maxLength?: number
2563
- /** 最小高度 (米),绘制与缩放时条带高度被钳制到不小于该值 */
2703
+ /** 最小厚度 (米),绘制与缩放时厚度边(顶点 0→3)被钳制到不小于该值 */
2564
2704
  minHeight: number
2565
- /** 最大高度 (米),可选。缺省或 ≤ minHeight 时不限制。 */
2705
+ /** 最大厚度 (米),可选。缺省或 ≤ minHeight 时不限制。 */
2566
2706
  maxHeight?: number
2567
- /** 数据未携带 height 时的默认条带高度 (米) */
2568
- defaultHeight: number
2569
2707
  /** 四角控制按钮图标容器填充颜色(编辑态显示) */
2570
2708
  iconWrapperFillColor: ColorSource
2571
2709
  /**
@@ -2586,7 +2724,7 @@ export declare type ThresholdConfig = {
2586
2724
  outlineDashArray: [number, number]
2587
2725
  /** 编辑态轮廓填充颜色 */
2588
2726
  outlineFillColor: ColorSource
2589
- /** 尺寸标签(长×高)文本颜色(编辑态显示) */
2727
+ /** 尺寸标签(长×厚)文本颜色(编辑态显示) */
2590
2728
  textColor: ColorSource
2591
2729
  /** 尺寸标签相对轮廓边缘向外的偏移(屏幕像素) */
2592
2730
  textOffset: number
@@ -2595,27 +2733,30 @@ export declare type ThresholdConfig = {
2595
2733
  /**
2596
2734
  * 门槛参数。
2597
2735
  *
2598
- * 门槛是「中心线 + 高度」的矩形条带元素,用可通行 / 不可通行两种类型标记
2599
- * 机器人能否跨越的通道,渲染为斜纹条带(可通行绿色 / 不可通行红色)。条带
2600
- * 为真实世界尺寸:长度由两端点决定,厚度由 `height` 决定,随地图缩放。
2736
+ * 门槛是四角坐标描述的矩形条带元素,用可通行 / 不可通行两种类型标记机器人
2737
+ * 能否跨越的通道,渲染为白底斜纹条带(可通行蓝白 / 不可通行红白)。条带为真实
2738
+ * 世界尺寸(长度与厚度都由四角坐标决定,随地图缩放)。数据形态与禁区 /
2739
+ * 家具等四边形元素一致 —— 与主流厂商的门槛协议对齐(见 ADR 0005)。
2601
2740
  *
2602
2741
  * 交互由运行时 `editingThresholdIds` 门控:列入的门槛显示编辑控件(虚线
2603
2742
  * 轮廓、尺寸标签与删除 / 旋转 / 缩放 / 移动按钮,与禁区等四边形元素同一套
2604
- * 编辑面),长与高在缩放时各自钳制到 `minLength`/`maxLength` 与
2743
+ * 编辑面),长与厚在缩放时各自钳制到 `minLength`/`maxLength` 与
2605
2744
  * `minHeight`/`maxHeight`(米)区间。编辑结束触发 `onUpdateThreshold`,
2606
2745
  * 点击触发 `onClickThreshold`,删除按钮触发 `onRemoveThreshold`。
2607
2746
  */
2608
2747
  export declare type ThresholdParam = {
2609
2748
  /** 门槛ID */
2610
2749
  id: string
2611
- /** 中心线两端点坐标(起点、终点),与其他元素同为地图像素坐标系 */
2612
- points: [Point, Point]
2613
2750
  /**
2614
- * 条带高度(厚度),单位与 points 相同(地图像素)。缺省时取
2615
- * `controls.threshold.defaultHeight`(米)换算;绘制与缩放时被钳制在
2616
- * `minHeight` / `maxHeight`(米)区间内。
2751
+ * 四角坐标(地图像素坐标系),顺时针 左上→右上→右下→左下,与家具 /
2752
+ * 禁区等四边形元素同序:顶点 0→1 为长度方向,0→3 为厚度方向。
2753
+ *
2754
+ * 入口处会归一化:绕向纠正为顺时针、较长的一条边规范到 0→1、长与厚
2755
+ * 分别钳制到 `minLength`/`maxLength` 与 `minHeight`/`maxHeight`(米)区间,
2756
+ * 再拉直成标准矩形(保留旋转角与中心)。因此 `getThresholds()` 回吐的
2757
+ * 点集是归一化后的结果,不一定与传入的原始点逐字相同。
2617
2758
  */
2618
- height?: number
2759
+ points: Point[]
2619
2760
  /** 门槛类型(可通行 / 不可通行)。缺省为 `passable`(可通行)。 */
2620
2761
  type?: ThresholdType
2621
2762
  }
@@ -2631,8 +2772,8 @@ export declare type ThresholdStyle = {
2631
2772
  /**
2632
2773
  * 门槛类型。
2633
2774
  *
2634
- * - `'passable'`:可通行门槛,机器人可尝试跨越,默认渲染为绿色斜纹条带
2635
- * - `'impassable'`:不可通行门槛,机器人不得跨越,默认渲染为红色斜纹条带
2775
+ * - `'passable'`:可通行门槛,机器人可尝试跨越,默认渲染为蓝白斜纹条带
2776
+ * - `'impassable'`:不可通行门槛,机器人不得跨越,默认渲染为红白斜纹条带
2636
2777
  */
2637
2778
  export declare type ThresholdType = 'passable' | 'impassable'
2638
2779