@pisell/materials 1.8.54 → 1.8.56
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.
- package/build/lowcode/assets-daily.json +11 -11
- package/build/lowcode/assets-dev.json +2 -2
- package/build/lowcode/assets-prod.json +11 -11
- package/build/lowcode/async/view.js +1 -1
- package/build/lowcode/index.js +1 -1
- package/build/lowcode/meta.js +3 -3
- package/build/lowcode/preview.js +1 -1
- package/build/lowcode/render/default/async/view.js +1 -1
- package/build/lowcode/render/default/view.css +1 -1
- package/build/lowcode/render/default/view.js +37 -37
- package/build/lowcode/view.css +1 -1
- package/build/lowcode/view.js +37 -37
- package/es/components/buttonGroupPreview/index.js +8 -4
- package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.js +207 -49
- package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.less +33 -2
- package/es/components/pisellFloorMapLayout/appearance/floorMapAppearance.js +50 -2
- package/es/components/pisellFloorMapLayout/components/EdgeLayer.js +252 -0
- package/es/components/pisellFloorMapLayout/components/EdgeLayer.less +11 -0
- package/es/components/pisellFloorMapLayout/components/EditableItemLayer.js +179 -29
- package/es/components/pisellFloorMapLayout/components/EditableItemLayer.less +0 -28
- package/es/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.js +131 -0
- package/es/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.less +65 -0
- package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +5 -4
- package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +12 -1
- package/es/components/pisellFloorMapLayout/components/FloorMapEditQuickActions.js +8 -1
- package/es/components/pisellFloorMapLayout/components/FloorMapOverview.js +16 -8
- package/es/components/pisellFloorMapLayout/components/FloorMapOverview.less +69 -17
- package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.js +290 -147
- package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.less +210 -11
- package/es/components/pisellFloorMapLayout/components/FloorMapToolbarViewAllModal.js +81 -0
- package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.d.ts +8 -0
- package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.js +21 -0
- package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.less +74 -0
- package/es/components/pisellFloorMapLayout/components/ItemLayer.less +3 -1
- package/es/components/pisellFloorMapLayout/components/NodePortMarkers.js +70 -0
- package/es/components/pisellFloorMapLayout/components/NodePortMarkers.less +33 -0
- package/es/components/pisellFloorMapLayout/components/ViewControls.js +13 -5
- package/es/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +2 -0
- package/es/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -1
- package/es/components/pisellFloorMapLayout/floorMapLayoutConstants.js +1 -1
- package/es/components/pisellFloorMapLayout/hooks/useFloorMapEdgeEditing.js +340 -0
- package/es/components/pisellFloorMapLayout/hooks/useFloorMapEdgeViewModel.js +102 -0
- package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +244 -84
- package/es/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +54 -0
- package/es/components/pisellFloorMapLayout/hooks/useShopFloorPlanSubscription.js +7 -4
- package/es/components/pisellFloorMapLayout/index.d.ts +5 -1
- package/es/components/pisellFloorMapLayout/locales-ja.js +14 -2
- package/es/components/pisellFloorMapLayout/locales-pt.js +14 -2
- package/es/components/pisellFloorMapLayout/locales.js +161 -8
- package/es/components/pisellFloorMapLayout/types.d.ts +86 -4
- package/es/components/pisellFloorMapLayout/types.js +5 -1
- package/es/components/pisellFloorMapLayout/utils/alignSnap.js +170 -0
- package/es/components/pisellFloorMapLayout/utils/batchScenePlacementLayout.js +86 -0
- package/es/components/pisellFloorMapLayout/utils/edgeRouting.js +942 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapCanvasDisplay.d.ts +7 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapCanvasStage.js +23 -1
- package/es/components/pisellFloorMapLayout/utils/floorMapConfigMerge.js +11 -2
- package/es/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +20 -3
- package/es/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +11 -5
- package/es/components/pisellFloorMapLayout/utils/floorMapOverviewLayout.js +5 -3
- package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.d.ts +20 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.js +62 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.d.ts +83 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.js +29 -0
- package/es/components/pisellFloorMapLayout/utils/floorMapToolbarPalette.js +51 -0
- package/es/components/productCard/cartSkuCard/components/BookingItem/index.js +14 -0
- package/es/components/productCard/cartSkuCard/components/BookingItem/index.less +32 -0
- package/es/components/productCard/cartSkuCard/components/resources/index.less +4 -0
- package/es/components/productCard/cartSkuCard/components/timeRange/index.js +1 -2
- package/es/components/productCard/cartSkuCard/index.js +17 -11
- package/es/components/productCard/lineItem/BookingLineItem.js +17 -6
- package/es/components/productCard/lineItem/components/Holders/index.js +51 -0
- package/es/components/productCard/lineItem/components/Holders/index.less +39 -0
- package/es/components/productCard/lineItem/components/Resources/index.js +45 -0
- package/es/components/productCard/lineItem/components/TimeRange/index.js +64 -0
- package/es/components/productCard/lineItem/index.js +5 -2
- package/es/components/productCard/lineItem/index.less +21 -10
- package/es/components/productCard/types.d.ts +1 -0
- package/es/index.d.ts +6 -2
- package/es/index.js +6 -2
- package/es/pisell-materials.tw.css +3 -0
- package/lib/components/buttonGroupPreview/index.js +8 -4
- package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.js +206 -48
- package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.less +33 -2
- package/lib/components/pisellFloorMapLayout/appearance/floorMapAppearance.js +50 -2
- package/lib/components/pisellFloorMapLayout/components/EdgeLayer.js +255 -0
- package/lib/components/pisellFloorMapLayout/components/EdgeLayer.less +11 -0
- package/lib/components/pisellFloorMapLayout/components/EditableItemLayer.js +179 -29
- package/lib/components/pisellFloorMapLayout/components/EditableItemLayer.less +0 -28
- package/lib/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.js +134 -0
- package/lib/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.less +65 -0
- package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +4 -3
- package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +12 -1
- package/lib/components/pisellFloorMapLayout/components/FloorMapEditQuickActions.js +8 -1
- package/lib/components/pisellFloorMapLayout/components/FloorMapOverview.js +16 -8
- package/lib/components/pisellFloorMapLayout/components/FloorMapOverview.less +69 -17
- package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.js +287 -144
- package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.less +210 -11
- package/lib/components/pisellFloorMapLayout/components/FloorMapToolbarViewAllModal.js +84 -0
- package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.d.ts +8 -0
- package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.js +23 -0
- package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.less +74 -0
- package/lib/components/pisellFloorMapLayout/components/ItemLayer.less +3 -1
- package/lib/components/pisellFloorMapLayout/components/NodePortMarkers.js +73 -0
- package/lib/components/pisellFloorMapLayout/components/NodePortMarkers.less +33 -0
- package/lib/components/pisellFloorMapLayout/components/ViewControls.js +12 -4
- package/lib/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +2 -0
- package/lib/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -1
- package/lib/components/pisellFloorMapLayout/floorMapLayoutConstants.js +1 -1
- package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEdgeEditing.js +341 -0
- package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEdgeViewModel.js +103 -0
- package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +242 -82
- package/lib/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +54 -0
- package/lib/components/pisellFloorMapLayout/hooks/useShopFloorPlanSubscription.js +7 -4
- package/lib/components/pisellFloorMapLayout/index.d.ts +5 -1
- package/lib/components/pisellFloorMapLayout/locales-ja.js +14 -2
- package/lib/components/pisellFloorMapLayout/locales-pt.js +14 -2
- package/lib/components/pisellFloorMapLayout/locales.js +161 -8
- package/lib/components/pisellFloorMapLayout/types.d.ts +86 -4
- package/lib/components/pisellFloorMapLayout/types.js +5 -0
- package/lib/components/pisellFloorMapLayout/utils/alignSnap.js +170 -0
- package/lib/components/pisellFloorMapLayout/utils/batchScenePlacementLayout.js +87 -0
- package/lib/components/pisellFloorMapLayout/utils/edgeRouting.js +956 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapCanvasDisplay.d.ts +7 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapCanvasStage.js +23 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapConfigMerge.js +11 -2
- package/lib/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +21 -2
- package/lib/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +11 -5
- package/lib/components/pisellFloorMapLayout/utils/floorMapOverviewLayout.js +5 -3
- package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.d.ts +20 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.js +64 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.d.ts +83 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.js +29 -0
- package/lib/components/pisellFloorMapLayout/utils/floorMapToolbarPalette.js +54 -0
- package/lib/components/productCard/cartSkuCard/components/BookingItem/index.js +17 -0
- package/lib/components/productCard/cartSkuCard/components/BookingItem/index.less +32 -0
- package/lib/components/productCard/cartSkuCard/components/resources/index.less +4 -0
- package/lib/components/productCard/cartSkuCard/components/timeRange/index.js +1 -2
- package/lib/components/productCard/cartSkuCard/index.js +17 -11
- package/lib/components/productCard/lineItem/BookingLineItem.js +17 -6
- package/lib/components/productCard/lineItem/components/Holders/index.js +53 -0
- package/lib/components/productCard/lineItem/components/Holders/index.less +39 -0
- package/lib/components/productCard/lineItem/components/Resources/index.js +47 -0
- package/lib/components/productCard/lineItem/components/TimeRange/index.js +67 -0
- package/lib/components/productCard/lineItem/index.js +5 -2
- package/lib/components/productCard/lineItem/index.less +21 -10
- package/lib/components/productCard/types.d.ts +1 -0
- package/lib/index.d.ts +6 -2
- package/lib/index.js +11 -0
- package/lib/pisell-materials.tw.css +3 -0
- package/package.json +6 -3
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const require_objectSpread2 = require("../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js");
|
|
2
|
+
//#region src/components/pisellFloorMapLayout/utils/alignSnap.ts
|
|
3
|
+
function getSelfEdgesX(rect) {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
edge: "left",
|
|
7
|
+
value: rect.left
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
edge: "centerX",
|
|
11
|
+
value: rect.left + rect.width / 2
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
edge: "right",
|
|
15
|
+
value: rect.left + rect.width
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function getSelfEdgesY(rect) {
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
edge: "top",
|
|
23
|
+
value: rect.top
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
edge: "centerY",
|
|
27
|
+
value: rect.top + rect.height / 2
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
edge: "bottom",
|
|
31
|
+
value: rect.top + rect.height
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
function getOtherEdgesX(rect) {
|
|
36
|
+
return getSelfEdgesX(rect);
|
|
37
|
+
}
|
|
38
|
+
function getOtherEdgesY(rect) {
|
|
39
|
+
return getSelfEdgesY(rect);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 对一个 rect 做边对齐吸附。返回 snap 后的 rect + 实际命中的辅助线(0~2 条)。
|
|
43
|
+
*
|
|
44
|
+
* 算法:对 x、y 轴独立处理;每轴在所有「自身 3 边 × 所有 other 3 边」组合
|
|
45
|
+
* 中选距离最小且 < threshold 的一对,把自身整体平移让它们贴齐;同时记录
|
|
46
|
+
* 所有「平移后仍精确贴齐」的参考线(可能不止 1 条,例如 left 和 centerX
|
|
47
|
+
* 同时与他人对齐时只有 1 条平移量但 2 条 guide)。
|
|
48
|
+
*/
|
|
49
|
+
function snapRectToOthers(rect, others, options) {
|
|
50
|
+
var _dx$delta, _dy$delta;
|
|
51
|
+
const threshold = Math.max(0, options.threshold);
|
|
52
|
+
if (threshold <= 0 || others.length === 0) return {
|
|
53
|
+
rect: stripId(rect),
|
|
54
|
+
guides: []
|
|
55
|
+
};
|
|
56
|
+
/** 1) 找最优偏移 dx / dy */
|
|
57
|
+
const dx = findBestDelta(getSelfEdgesX(rect), others.flatMap((o) => getOtherEdgesX(o).map((e) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, e), {}, { ownerId: o.id }))), threshold, options.mode === "resize" ? options.movableEdgesX : void 0);
|
|
58
|
+
const dy = findBestDelta(getSelfEdgesY(rect), others.flatMap((o) => getOtherEdgesY(o).map((e) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, e), {}, { ownerId: o.id }))), threshold, options.mode === "resize" ? options.movableEdgesY : void 0);
|
|
59
|
+
/** 2) 根据 mode 把 dx/dy 应用到 rect(drag: 平移;resize: 只动可动边)*/
|
|
60
|
+
const snapped = applyDelta(rect, (_dx$delta = dx === null || dx === void 0 ? void 0 : dx.delta) !== null && _dx$delta !== void 0 ? _dx$delta : 0, (_dy$delta = dy === null || dy === void 0 ? void 0 : dy.delta) !== null && _dy$delta !== void 0 ? _dy$delta : 0, options);
|
|
61
|
+
/** 3) 重新计算所有边坐标,列出与 other 边精确相等的 guide(不限 1 条) */
|
|
62
|
+
const guides = [];
|
|
63
|
+
if (dx) {
|
|
64
|
+
for (const self of getSelfEdgesX(snapped)) for (const o of others) for (const oe of getOtherEdgesX(o)) if (self.value === oe.value) {
|
|
65
|
+
const top = Math.min(snapped.top, o.top);
|
|
66
|
+
const bottom = Math.max(snapped.top + snapped.height, o.top + o.height);
|
|
67
|
+
guides.push({
|
|
68
|
+
orientation: "v",
|
|
69
|
+
position: self.value,
|
|
70
|
+
start: top,
|
|
71
|
+
end: bottom,
|
|
72
|
+
selfEdge: self.edge,
|
|
73
|
+
otherEdge: oe.edge,
|
|
74
|
+
otherId: o.id
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (dy) {
|
|
79
|
+
for (const self of getSelfEdgesY(snapped)) for (const o of others) for (const oe of getOtherEdgesY(o)) if (self.value === oe.value) {
|
|
80
|
+
const left = Math.min(snapped.left, o.left);
|
|
81
|
+
const right = Math.max(snapped.left + snapped.width, o.left + o.width);
|
|
82
|
+
guides.push({
|
|
83
|
+
orientation: "h",
|
|
84
|
+
position: self.value,
|
|
85
|
+
start: left,
|
|
86
|
+
end: right,
|
|
87
|
+
selfEdge: self.edge,
|
|
88
|
+
otherEdge: oe.edge,
|
|
89
|
+
otherId: o.id
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
rect: snapped,
|
|
95
|
+
guides
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** 在所有 self×other 组合中选距离最小且 < threshold 的一组 */
|
|
99
|
+
function findBestDelta(selfEdges, otherEdges, threshold, movableFilter) {
|
|
100
|
+
let best = null;
|
|
101
|
+
for (const self of selfEdges) {
|
|
102
|
+
/** resize 模式下:「centerX/centerY 不可动;left/right/top/bottom 必须在 movable 列表里」 */
|
|
103
|
+
if (movableFilter) {
|
|
104
|
+
if (self.edge === "centerX" || self.edge === "centerY") continue;
|
|
105
|
+
if (!movableFilter.includes(self.edge)) continue;
|
|
106
|
+
}
|
|
107
|
+
for (const o of otherEdges) {
|
|
108
|
+
const dist = o.value - self.value;
|
|
109
|
+
const ad = Math.abs(dist);
|
|
110
|
+
if (ad > threshold) continue;
|
|
111
|
+
if (!best || ad < best.absDist) best = {
|
|
112
|
+
delta: dist,
|
|
113
|
+
absDist: ad
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return best ? { delta: best.delta } : null;
|
|
118
|
+
}
|
|
119
|
+
function applyDelta(rect, dx, dy, options) {
|
|
120
|
+
var _options$movableEdges, _options$movableEdges2;
|
|
121
|
+
if (options.mode === "drag") return {
|
|
122
|
+
left: rect.left + dx,
|
|
123
|
+
top: rect.top + dy,
|
|
124
|
+
width: rect.width,
|
|
125
|
+
height: rect.height
|
|
126
|
+
};
|
|
127
|
+
/** resize:根据可动边把 dx/dy 应用到该边 */
|
|
128
|
+
let { left, top, width, height } = rect;
|
|
129
|
+
const right = left + width;
|
|
130
|
+
const bottom = top + height;
|
|
131
|
+
const mx = (_options$movableEdges = options.movableEdgesX) !== null && _options$movableEdges !== void 0 ? _options$movableEdges : [];
|
|
132
|
+
const my = (_options$movableEdges2 = options.movableEdgesY) !== null && _options$movableEdges2 !== void 0 ? _options$movableEdges2 : [];
|
|
133
|
+
let newLeft = left;
|
|
134
|
+
let newRight = right;
|
|
135
|
+
let newTop = top;
|
|
136
|
+
let newBottom = bottom;
|
|
137
|
+
if (dx !== 0) {
|
|
138
|
+
if (mx.includes("left")) newLeft = left + dx;
|
|
139
|
+
else if (mx.includes("right")) newRight = right + dx;
|
|
140
|
+
}
|
|
141
|
+
if (dy !== 0) {
|
|
142
|
+
if (my.includes("top")) newTop = top + dy;
|
|
143
|
+
else if (my.includes("bottom")) newBottom = bottom + dy;
|
|
144
|
+
}
|
|
145
|
+
/** 保证 width/height >= 1,否则忽略该轴 snap */
|
|
146
|
+
if (newRight - newLeft < 1) {
|
|
147
|
+
newLeft = left;
|
|
148
|
+
newRight = right;
|
|
149
|
+
}
|
|
150
|
+
if (newBottom - newTop < 1) {
|
|
151
|
+
newTop = top;
|
|
152
|
+
newBottom = bottom;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
left: newLeft,
|
|
156
|
+
top: newTop,
|
|
157
|
+
width: newRight - newLeft,
|
|
158
|
+
height: newBottom - newTop
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function stripId(rect) {
|
|
162
|
+
return {
|
|
163
|
+
left: rect.left,
|
|
164
|
+
top: rect.top,
|
|
165
|
+
width: rect.width,
|
|
166
|
+
height: rect.height
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
exports.snapRectToOthers = snapRectToOthers;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const require_floorMapCanvasStage = require("./floorMapCanvasStage.js");
|
|
2
|
+
/**
|
|
3
|
+
* 行列数尽量接近正方形(复用全览网格算法)。
|
|
4
|
+
*/
|
|
5
|
+
function getSquareishGridDims(count) {
|
|
6
|
+
return require_floorMapCanvasStage.getOverviewGridDims(count);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 计算批量落点左上角坐标列表(行优先:先填满第一行再换行)。
|
|
10
|
+
*/
|
|
11
|
+
function computeBatchScenePlacementPositions(sizes, ctx) {
|
|
12
|
+
var _ctx$boundingPadding;
|
|
13
|
+
const count = sizes.length;
|
|
14
|
+
if (count === 0) return [];
|
|
15
|
+
const gap = 16;
|
|
16
|
+
const pad = Math.max(0, (_ctx$boundingPadding = ctx.boundingPadding) !== null && _ctx$boundingPadding !== void 0 ? _ctx$boundingPadding : 24);
|
|
17
|
+
const { cols, rows } = getSquareishGridDims(count);
|
|
18
|
+
const colWidths = Array.from({ length: cols }, () => 0);
|
|
19
|
+
const rowHeights = Array.from({ length: rows }, () => 0);
|
|
20
|
+
for (let i = 0; i < count; i += 1) {
|
|
21
|
+
const col = i % cols;
|
|
22
|
+
const row = Math.floor(i / cols);
|
|
23
|
+
colWidths[col] = Math.max(colWidths[col], sizes[i].width);
|
|
24
|
+
rowHeights[row] = Math.max(rowHeights[row], sizes[i].height);
|
|
25
|
+
}
|
|
26
|
+
let anchorX = pad;
|
|
27
|
+
let anchorY = pad;
|
|
28
|
+
if (ctx.existingElements.length > 0) {
|
|
29
|
+
const maxRight = Math.max(...ctx.existingElements.map((e) => e.x + e.width));
|
|
30
|
+
const minTop = Math.min(...ctx.existingElements.map((e) => e.y));
|
|
31
|
+
anchorX = maxRight + gap;
|
|
32
|
+
anchorY = Math.max(pad, minTop);
|
|
33
|
+
}
|
|
34
|
+
const colOffsets = [];
|
|
35
|
+
let xCursor = 0;
|
|
36
|
+
for (let c = 0; c < cols; c += 1) {
|
|
37
|
+
colOffsets[c] = xCursor;
|
|
38
|
+
xCursor += colWidths[c] + (c < cols - 1 ? gap : 0);
|
|
39
|
+
}
|
|
40
|
+
const rowOffsets = [];
|
|
41
|
+
let yCursor = 0;
|
|
42
|
+
for (let r = 0; r < rows; r += 1) {
|
|
43
|
+
rowOffsets[r] = yCursor;
|
|
44
|
+
yCursor += rowHeights[r] + (r < rows - 1 ? gap : 0);
|
|
45
|
+
}
|
|
46
|
+
const positions = [];
|
|
47
|
+
for (let i = 0; i < count; i += 1) {
|
|
48
|
+
const col = i % cols;
|
|
49
|
+
const row = Math.floor(i / cols);
|
|
50
|
+
const cellW = colWidths[col];
|
|
51
|
+
const cellH = rowHeights[row];
|
|
52
|
+
const x = anchorX + colOffsets[col] + Math.round((cellW - sizes[i].width) / 2);
|
|
53
|
+
const y = anchorY + rowOffsets[row] + Math.round((cellH - sizes[i].height) / 2);
|
|
54
|
+
positions.push({
|
|
55
|
+
x: Math.round(x),
|
|
56
|
+
y: Math.round(y)
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return positions;
|
|
60
|
+
}
|
|
61
|
+
/** 由批量落点坐标与尺寸计算轴对齐包围盒(可加 margin 便于视口聚焦留边) */
|
|
62
|
+
function getPlacementBoundingBox(positions, sizes, margin = 16) {
|
|
63
|
+
if (!positions.length || positions.length !== sizes.length) return null;
|
|
64
|
+
let minLeft = Infinity;
|
|
65
|
+
let minTop = Infinity;
|
|
66
|
+
let maxRight = -Infinity;
|
|
67
|
+
let maxBottom = -Infinity;
|
|
68
|
+
for (let i = 0; i < positions.length; i += 1) {
|
|
69
|
+
const { x, y } = positions[i];
|
|
70
|
+
const w = sizes[i].width;
|
|
71
|
+
const h = sizes[i].height;
|
|
72
|
+
minLeft = Math.min(minLeft, x);
|
|
73
|
+
minTop = Math.min(minTop, y);
|
|
74
|
+
maxRight = Math.max(maxRight, x + w);
|
|
75
|
+
maxBottom = Math.max(maxBottom, y + h);
|
|
76
|
+
}
|
|
77
|
+
const m = Math.max(0, margin);
|
|
78
|
+
return {
|
|
79
|
+
minLeft: minLeft - m,
|
|
80
|
+
minTop: minTop - m,
|
|
81
|
+
maxRight: maxRight + m,
|
|
82
|
+
maxBottom: maxBottom + m
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
exports.computeBatchScenePlacementPositions = computeBatchScenePlacementPositions;
|
|
87
|
+
exports.getPlacementBoundingBox = getPlacementBoundingBox;
|