@cardenelabs/cdl 0.30.0 → 0.30.2
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/CHANGELOG.md +58 -1
- package/dist/index.cjs +242 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -1
- package/dist/index.d.ts +38 -1
- package/dist/index.js +242 -3
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +241 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +241 -2
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/layout/collisions.ts +345 -0
- package/src/layout/edges.ts +7 -2
- package/src/layout.ts +14 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,61 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.30.2] - 2026-09-05
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **関係の説明が箱や線に重ならなくなった** (#659)
|
|
13
|
+
|
|
14
|
+
経路を動かす工程の後に、 説明 (札) を箱 ・ 説明どうし ・ 別の線から離す工程を足した。
|
|
15
|
+
|
|
16
|
+
説明を箱から離す工程は、 経路を動かす 4 つの工程より **前** に走っていた。
|
|
17
|
+
説明の初めの位置は経路から決まるため、 後の工程が経路を動かすと説明も一緒に動く。
|
|
18
|
+
動いた後を見る者が居なかった。
|
|
19
|
+
|
|
20
|
+
`0.30.0` で経路を大きく動かす 2 件 (#649 / #651) が入り、 消費側の見本帳で説明が 11 件動いた
|
|
21
|
+
(最大 217)。 動いた先が箱の近くだと、 要求 (箱と説明で 32) を割ったまま残る。
|
|
22
|
+
実測 = `0.29.0` で 0 件だった違反が `0.30.1` で 6 図 9 件。
|
|
23
|
+
|
|
24
|
+
直した後は消費側の見本帳 12 群 431 図で 0 件になった。 既存の絵は 1 つも動いていない
|
|
25
|
+
(要求を満たしていない説明だけを動かすため)。
|
|
26
|
+
|
|
27
|
+
**動かすのは説明だけ**。 箱と経路は動かさない = 動かすと直前の工程が確定させた形
|
|
28
|
+
(根元の重なり分け / 起点の直進) を崩す。
|
|
29
|
+
|
|
30
|
+
判定は視覚検査と同じ関数を引く。 別の式で近似すると、 検査は落ちるのに押し出しは動かない
|
|
31
|
+
状態に戻る。 曲線は開いた形で測る = 弦のままだと膨らんだ弧が説明を貫いても見えない。
|
|
32
|
+
|
|
33
|
+
行き先を確かめてから動かす。 一番安く済む向きへ出すだけだと、 上下の箱に挟まれた説明が
|
|
34
|
+
往復して収まらない。
|
|
35
|
+
|
|
36
|
+
## [0.30.1] - 2026-09-05
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- **折れを持たない線が起点で折れなくなった** (#655)
|
|
41
|
+
|
|
42
|
+
`0.30.0` で入れた助走の伸ばし方が、区間を 1 つしか持たない線では起点まで届いていた。
|
|
43
|
+
その線では最後の区間が最初の区間でもあるため、いっぱいまで伸ばすと折れが起点に生まれる。
|
|
44
|
+
|
|
45
|
+
起点から `EDGE_STUB_OUT` (40) の直進が要るところ 28 しか残らず、線がどちらへ向かうのかを
|
|
46
|
+
出だしで読めない形になっていた。
|
|
47
|
+
消費側の `dragon` の図で `edge-stubout-min` が 6 件落ちている。
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
0.29.0 M 961 181 L 1257 181
|
|
51
|
+
0.30.0 M 961 181 L 961 153 L 1257 153
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
末尾を辺に沿ってずらす助走に、**起点を含む区間だけ** へ掛かる上限を足した。
|
|
55
|
+
上限を掛けた後の助走が `ENDPOINT_FAN_RUNUP` (40) を割る線は、ずらさず元のままにする。
|
|
56
|
+
短い助走で無理にずらすと折れが密になるため。
|
|
57
|
+
|
|
58
|
+
**折れを持つ線の助走は変えない**。 最後の区間いっぱいまで伸ばす #649 の直しはそのまま残る。
|
|
59
|
+
折れの有無で検査の契約を分け、起点の直進と根元の重なりを両立させた。
|
|
60
|
+
|
|
61
|
+
`cdl` 自身の 255 file / 6108 件では出ず、消費側の図で初めて出た。
|
|
62
|
+
|
|
8
63
|
## [0.30.0] - 2026-09-05
|
|
9
64
|
|
|
10
65
|
### Fixed
|
|
@@ -1492,7 +1547,9 @@ Initial OSS release.
|
|
|
1492
1547
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
1493
1548
|
行き止まりになる。
|
|
1494
1549
|
|
|
1495
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.30.
|
|
1550
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.30.2...HEAD
|
|
1551
|
+
[0.30.2]: https://github.com/cardene777/cdl/compare/v0.30.1...v0.30.2
|
|
1552
|
+
[0.30.1]: https://github.com/cardene777/cdl/compare/v0.30.0...v0.30.1
|
|
1496
1553
|
[0.30.0]: https://github.com/cardene777/cdl/compare/v0.29.0...v0.30.0
|
|
1497
1554
|
[0.29.0]: https://github.com/cardene777/cdl/compare/v0.28.0...v0.29.0
|
|
1498
1555
|
[0.28.0]: https://github.com/cardene777/cdl/compare/v0.27.0...v0.28.0
|
package/dist/index.cjs
CHANGED
|
@@ -13357,6 +13357,234 @@ function resolveEdgeLabelOverlapsWithChainAndPropagate(edges, obstacles, minClea
|
|
|
13357
13357
|
edgePathShifts: edgePathShiftMap
|
|
13358
13358
|
};
|
|
13359
13359
|
}
|
|
13360
|
+
function resolveLabelClearanceAfterPathPasses(edges, obstacles, maxIter = 8) {
|
|
13361
|
+
if (edges.length === 0) return edges;
|
|
13362
|
+
const labeledIds = new Set(
|
|
13363
|
+
edges.filter((e) => e.label?.trim() || e.sub?.trim()).map((e) => e.id)
|
|
13364
|
+
);
|
|
13365
|
+
if (labeledIds.size === 0) return edges;
|
|
13366
|
+
const \u7BB1\u305F\u3061 = obstacles.filter((o) => o.kind === "node" || o.kind === "lane-label");
|
|
13367
|
+
const edgeById = /* @__PURE__ */ new Map();
|
|
13368
|
+
for (const e of edges) edgeById.set(e.id, e);
|
|
13369
|
+
const \u533A\u9593cache = /* @__PURE__ */ new Map();
|
|
13370
|
+
const \u533A\u9593 = (id, d) => {
|
|
13371
|
+
const hit = \u533A\u9593cache.get(id);
|
|
13372
|
+
if (hit) return hit;
|
|
13373
|
+
const segs = flattenPathSegments(extractPathSegments(d));
|
|
13374
|
+
\u533A\u9593cache.set(id, segs);
|
|
13375
|
+
return segs;
|
|
13376
|
+
};
|
|
13377
|
+
const \u5916\u63A5cache = /* @__PURE__ */ new Map();
|
|
13378
|
+
const \u5916\u63A5 = (id, d) => {
|
|
13379
|
+
const hit = \u5916\u63A5cache.get(id);
|
|
13380
|
+
if (hit !== void 0) return hit;
|
|
13381
|
+
const segs = \u533A\u9593(id, d);
|
|
13382
|
+
if (segs.length === 0) {
|
|
13383
|
+
\u5916\u63A5cache.set(id, null);
|
|
13384
|
+
return null;
|
|
13385
|
+
}
|
|
13386
|
+
let x1 = Infinity, y1 = Infinity, x2 = -Infinity, y2 = -Infinity;
|
|
13387
|
+
for (const g of segs) {
|
|
13388
|
+
x1 = Math.min(x1, g.x1, g.x2);
|
|
13389
|
+
y1 = Math.min(y1, g.y1, g.y2);
|
|
13390
|
+
x2 = Math.max(x2, g.x1, g.x2);
|
|
13391
|
+
y2 = Math.max(y2, g.y1, g.y2);
|
|
13392
|
+
}
|
|
13393
|
+
const box = { x: x1, y: y1, w: x2 - x1, h: y2 - y1 };
|
|
13394
|
+
\u5916\u63A5cache.set(id, box);
|
|
13395
|
+
return box;
|
|
13396
|
+
};
|
|
13397
|
+
const \u9060\u3044 = (box, edgeId, d, \u4F59\u88D5) => {
|
|
13398
|
+
const b = \u5916\u63A5(edgeId, d);
|
|
13399
|
+
if (!b) return true;
|
|
13400
|
+
const dx = Math.max(0, Math.max(box.x - (b.x + b.w), b.x - (box.x + box.w)));
|
|
13401
|
+
const dy = Math.max(0, Math.max(box.y - (b.y + b.h), b.y - (box.y + box.h)));
|
|
13402
|
+
return Math.hypot(dx, dy) >= \u4F59\u88D5;
|
|
13403
|
+
};
|
|
13404
|
+
const \u6700\u5927\u79FB\u52D5 = CHAIN_SHIFT_MAX_ACCUMULATED * 2;
|
|
13405
|
+
const shiftMap = /* @__PURE__ */ new Map();
|
|
13406
|
+
const getShift = (id) => shiftMap.get(id) ?? { dx: 0, dy: 0 };
|
|
13407
|
+
const labelBBoxes = () => {
|
|
13408
|
+
const out = [];
|
|
13409
|
+
for (const e of edges) {
|
|
13410
|
+
if (!labeledIds.has(e.id)) continue;
|
|
13411
|
+
const base = computeLabelBBoxWorld(e);
|
|
13412
|
+
const s = getShift(e.id);
|
|
13413
|
+
out.push({ kind: "edge-label", id: e.id, x: base.x + s.dx, y: base.y + s.dy, w: base.w, h: base.h });
|
|
13414
|
+
}
|
|
13415
|
+
return out;
|
|
13416
|
+
};
|
|
13417
|
+
const \u96E2\u308C\u91CF = (a, b) => ({
|
|
13418
|
+
x: Math.max(a.x - (b.x + b.w), b.x - (a.x + a.w)),
|
|
13419
|
+
y: Math.max(a.y - (b.y + b.h), b.y - (a.y + a.h))
|
|
13420
|
+
});
|
|
13421
|
+
const \u52D5\u304B\u3057\u305F\u7BB1 = (box, axis, sign, amount) => ({
|
|
13422
|
+
...box,
|
|
13423
|
+
x: box.x + (axis === "x" ? sign * amount : 0),
|
|
13424
|
+
y: box.y + (axis === "y" ? sign * amount : 0)
|
|
13425
|
+
});
|
|
13426
|
+
for (let iter = 0; iter < maxIter; iter += 1) {
|
|
13427
|
+
const labels = labelBBoxes();
|
|
13428
|
+
const \u672D\u306E\u8981\u6C42 = requiredNearClearance("edge-label", "edge-label");
|
|
13429
|
+
let \u52D5\u3044\u305F = false;
|
|
13430
|
+
const \u4ECA\u56DE\u52D5\u304B\u3057\u305F = /* @__PURE__ */ new Set();
|
|
13431
|
+
const \u5B89\u5168\u304B = (label, \u884C\u304D\u5148) => {
|
|
13432
|
+
for (const obs of \u7BB1\u305F\u3061) {
|
|
13433
|
+
const \u524D = computeGap(label, obs);
|
|
13434
|
+
const \u5F8C = computeGap(\u884C\u304D\u5148, obs);
|
|
13435
|
+
if (\u5F8C < Math.min(\u524D, requiredNearClearance("edge-label", obs.kind))) return false;
|
|
13436
|
+
}
|
|
13437
|
+
for (const \u4ED6 of labels) {
|
|
13438
|
+
if (\u4ED6.id === label.id) continue;
|
|
13439
|
+
const \u524D = computeGap(label, \u4ED6);
|
|
13440
|
+
const \u5F8C = computeGap(\u884C\u304D\u5148, \u4ED6);
|
|
13441
|
+
if (\u5F8C < Math.min(\u524D, \u672D\u306E\u8981\u6C42)) return false;
|
|
13442
|
+
}
|
|
13443
|
+
const \u81EA\u5206 = edgeById.get(label.id);
|
|
13444
|
+
const \u81EA\u5206\u306E\u533A\u9593 = \u81EA\u5206 ? \u533A\u9593(\u81EA\u5206.id, \u81EA\u5206.d) : [];
|
|
13445
|
+
if (\u81EA\u5206\u306E\u533A\u9593.length > 0) {
|
|
13446
|
+
const \u524D = measurePathLabelGapSegs(\u81EA\u5206\u306E\u533A\u9593, label);
|
|
13447
|
+
const \u5F8C = measurePathLabelGapSegs(\u81EA\u5206\u306E\u533A\u9593, \u884C\u304D\u5148);
|
|
13448
|
+
if (\u5F8C > Math.max(\u524D, DIST_LABEL_PATH_MAX)) return false;
|
|
13449
|
+
}
|
|
13450
|
+
for (const \u76F8\u624B of edges) {
|
|
13451
|
+
if (\u76F8\u624B.id === label.id) continue;
|
|
13452
|
+
if (\u9060\u3044(label, \u76F8\u624B.id, \u76F8\u624B.d, LABEL_TO_PATH_CLEARANCE) && \u9060\u3044(\u884C\u304D\u5148, \u76F8\u624B.id, \u76F8\u624B.d, LABEL_TO_PATH_CLEARANCE)) continue;
|
|
13453
|
+
const segs = segmentsExcludingOwnPath(\u533A\u9593(\u76F8\u624B.id, \u76F8\u624B.d), \u81EA\u5206\u306E\u533A\u9593);
|
|
13454
|
+
if (segs.length === 0) continue;
|
|
13455
|
+
const \u524D = measurePathLabelGapSegs(segs, label);
|
|
13456
|
+
const \u5F8C = measurePathLabelGapSegs(segs, \u884C\u304D\u5148);
|
|
13457
|
+
if (\u5F8C < Math.min(\u524D, LABEL_TO_PATH_CLEARANCE)) return false;
|
|
13458
|
+
}
|
|
13459
|
+
return true;
|
|
13460
|
+
};
|
|
13461
|
+
const \u9003\u304C\u3059 = (label, \u5019\u88DC) => {
|
|
13462
|
+
for (const c of \u5019\u88DC.slice().sort((a, b) => a.amount - b.amount)) {
|
|
13463
|
+
if (c.amount <= 0) continue;
|
|
13464
|
+
const \u884C\u304D\u5148 = \u52D5\u304B\u3057\u305F\u7BB1(label, c.axis, c.sign, c.amount);
|
|
13465
|
+
if (!\u5B89\u5168\u304B(label, \u884C\u304D\u5148)) continue;
|
|
13466
|
+
const cur = getShift(label.id);
|
|
13467
|
+
const dx = c.axis === "x" ? cur.dx + c.sign * c.amount : cur.dx;
|
|
13468
|
+
const dy = c.axis === "y" ? cur.dy + c.sign * c.amount : cur.dy;
|
|
13469
|
+
if (Math.hypot(dx, dy) > \u6700\u5927\u79FB\u52D5) continue;
|
|
13470
|
+
shiftMap.set(label.id, { dx, dy });
|
|
13471
|
+
\u4ECA\u56DE\u52D5\u304B\u3057\u305F.add(label.id);
|
|
13472
|
+
return true;
|
|
13473
|
+
}
|
|
13474
|
+
return false;
|
|
13475
|
+
};
|
|
13476
|
+
const \u77E9\u5F62\u306E\u5019\u88DC = (label, static\u7BB1, required) => {
|
|
13477
|
+
const sep = \u96E2\u308C\u91CF(label, static\u7BB1);
|
|
13478
|
+
const \u5411\u304D = (axis) => {
|
|
13479
|
+
const a = axis === "x" ? label.x + label.w / 2 : label.y + label.h / 2;
|
|
13480
|
+
const b = axis === "x" ? static\u7BB1.x + static\u7BB1.w / 2 : static\u7BB1.y + static\u7BB1.h / 2;
|
|
13481
|
+
return a >= b ? 1 : -1;
|
|
13482
|
+
};
|
|
13483
|
+
return [
|
|
13484
|
+
{ axis: "x", sign: \u5411\u304D("x"), amount: required - sep.x + NEAR_MISS_MARGIN },
|
|
13485
|
+
{ axis: "y", sign: \u5411\u304D("y"), amount: required - sep.y + NEAR_MISS_MARGIN }
|
|
13486
|
+
];
|
|
13487
|
+
};
|
|
13488
|
+
for (const label of labels) {
|
|
13489
|
+
if (\u4ECA\u56DE\u52D5\u304B\u3057\u305F.has(label.id)) continue;
|
|
13490
|
+
for (const obs of \u7BB1\u305F\u3061) {
|
|
13491
|
+
const required = requiredNearClearance(label.kind, obs.kind);
|
|
13492
|
+
if (required <= 0) continue;
|
|
13493
|
+
if (computeGap(label, obs) >= required) continue;
|
|
13494
|
+
if (\u9003\u304C\u3059(label, \u77E9\u5F62\u306E\u5019\u88DC(label, obs, required))) {
|
|
13495
|
+
\u52D5\u3044\u305F = true;
|
|
13496
|
+
break;
|
|
13497
|
+
}
|
|
13498
|
+
}
|
|
13499
|
+
}
|
|
13500
|
+
const \u672D\u9806 = /* @__PURE__ */ new Map();
|
|
13501
|
+
edges.forEach((e, i) => \u672D\u9806.set(e.id, i));
|
|
13502
|
+
for (let i = 0; i < labels.length; i += 1) {
|
|
13503
|
+
for (let j = i + 1; j < labels.length; j += 1) {
|
|
13504
|
+
const a = labels[i];
|
|
13505
|
+
const b = labels[j];
|
|
13506
|
+
if (computeGap(a, b) >= \u672D\u306E\u8981\u6C42) continue;
|
|
13507
|
+
const aIsLater = \u672D\u9806.get(a.id) > \u672D\u9806.get(b.id);
|
|
13508
|
+
const moveBox = aIsLater ? a : b;
|
|
13509
|
+
const staticBox = aIsLater ? b : a;
|
|
13510
|
+
if (\u4ECA\u56DE\u52D5\u304B\u3057\u305F.has(moveBox.id)) continue;
|
|
13511
|
+
if (\u9003\u304C\u3059(moveBox, \u77E9\u5F62\u306E\u5019\u88DC(moveBox, staticBox, \u672D\u306E\u8981\u6C42))) \u52D5\u3044\u305F = true;
|
|
13512
|
+
}
|
|
13513
|
+
}
|
|
13514
|
+
for (const label of labels) {
|
|
13515
|
+
if (\u4ECA\u56DE\u52D5\u304B\u3057\u305F.has(label.id)) continue;
|
|
13516
|
+
const \u81EA\u5206 = edgeById.get(label.id);
|
|
13517
|
+
if (!\u81EA\u5206) continue;
|
|
13518
|
+
const \u81EA\u5206\u306E\u533A\u9593 = \u533A\u9593(\u81EA\u5206.id, \u81EA\u5206.d);
|
|
13519
|
+
for (const \u4ED6 of edges) {
|
|
13520
|
+
if (\u4ED6.id === label.id) continue;
|
|
13521
|
+
if (\u81EA\u5206.from === \u4ED6.from && \u81EA\u5206.to === \u4ED6.to) continue;
|
|
13522
|
+
if (\u9060\u3044(label, \u4ED6.id, \u4ED6.d, LABEL_TO_PATH_CLEARANCE)) continue;
|
|
13523
|
+
const segs = segmentsExcludingOwnPath(\u533A\u9593(\u4ED6.id, \u4ED6.d), \u81EA\u5206\u306E\u533A\u9593);
|
|
13524
|
+
if (segs.length === 0) continue;
|
|
13525
|
+
const gap = measurePathLabelGapSegs(segs, label);
|
|
13526
|
+
if (gap >= LABEL_TO_PATH_CLEARANCE) continue;
|
|
13527
|
+
const \u82AF = { x: label.x + label.w / 2, y: label.y + label.h / 2 };
|
|
13528
|
+
let \u8FD1\u3044\u70B9 = null;
|
|
13529
|
+
let \u6700\u77ED = Infinity;
|
|
13530
|
+
for (const seg of segs) {
|
|
13531
|
+
for (const \u70B9 of [
|
|
13532
|
+
{ x: seg.x1, y: seg.y1 },
|
|
13533
|
+
{ x: seg.x2, y: seg.y2 },
|
|
13534
|
+
{ x: (seg.x1 + seg.x2) / 2, y: (seg.y1 + seg.y2) / 2 }
|
|
13535
|
+
]) {
|
|
13536
|
+
const d = Math.hypot(\u70B9.x - \u82AF.x, \u70B9.y - \u82AF.y);
|
|
13537
|
+
if (d < \u6700\u77ED) {
|
|
13538
|
+
\u6700\u77ED = d;
|
|
13539
|
+
\u8FD1\u3044\u70B9 = \u70B9;
|
|
13540
|
+
}
|
|
13541
|
+
}
|
|
13542
|
+
}
|
|
13543
|
+
if (!\u8FD1\u3044\u70B9) continue;
|
|
13544
|
+
const \u5FC5\u8981\u91CF = (axis, sign) => {
|
|
13545
|
+
const \u6E80\u305F\u3059 = (\u91CF) => measurePathLabelGapSegs(segs, \u52D5\u304B\u3057\u305F\u7BB1(label, axis, sign, \u91CF)) >= LABEL_TO_PATH_CLEARANCE;
|
|
13546
|
+
let lo = 0;
|
|
13547
|
+
let hi = Math.max(4, LABEL_TO_PATH_CLEARANCE - gap);
|
|
13548
|
+
while (!\u6E80\u305F\u3059(hi)) {
|
|
13549
|
+
if (hi >= \u6700\u5927\u79FB\u52D5) return null;
|
|
13550
|
+
lo = hi;
|
|
13551
|
+
hi = Math.min(hi * 2, \u6700\u5927\u79FB\u52D5);
|
|
13552
|
+
}
|
|
13553
|
+
for (let k = 0; k < 12; k += 1) {
|
|
13554
|
+
const mid = (lo + hi) / 2;
|
|
13555
|
+
if (\u6E80\u305F\u3059(mid)) hi = mid;
|
|
13556
|
+
else lo = mid;
|
|
13557
|
+
}
|
|
13558
|
+
return hi + NEAR_MISS_MARGIN;
|
|
13559
|
+
};
|
|
13560
|
+
const dx = \u82AF.x - \u8FD1\u3044\u70B9.x;
|
|
13561
|
+
const dy = \u82AF.y - \u8FD1\u3044\u70B9.y;
|
|
13562
|
+
const \u5019\u88DC = [];
|
|
13563
|
+
for (const c of [
|
|
13564
|
+
{ axis: "x", sign: dx >= 0 ? 1 : -1 },
|
|
13565
|
+
{ axis: "y", sign: dy >= 0 ? 1 : -1 },
|
|
13566
|
+
// 近い点から離れる向きが塞がれていることがある。 反対向きも候補に入れる。
|
|
13567
|
+
{ axis: "x", sign: dx >= 0 ? -1 : 1 },
|
|
13568
|
+
{ axis: "y", sign: dy >= 0 ? -1 : 1 }
|
|
13569
|
+
]) {
|
|
13570
|
+
const \u91CF = \u5FC5\u8981\u91CF(c.axis, c.sign);
|
|
13571
|
+
if (\u91CF !== null) \u5019\u88DC.push({ ...c, amount: \u91CF });
|
|
13572
|
+
}
|
|
13573
|
+
if (\u9003\u304C\u3059(label, \u5019\u88DC)) {
|
|
13574
|
+
\u52D5\u3044\u305F = true;
|
|
13575
|
+
break;
|
|
13576
|
+
}
|
|
13577
|
+
}
|
|
13578
|
+
}
|
|
13579
|
+
if (!\u52D5\u3044\u305F) break;
|
|
13580
|
+
}
|
|
13581
|
+
if (shiftMap.size === 0) return edges;
|
|
13582
|
+
return edges.map((e) => {
|
|
13583
|
+
const s = shiftMap.get(e.id);
|
|
13584
|
+
if (!s || s.dx === 0 && s.dy === 0) return e;
|
|
13585
|
+
return { ...e, labelX: e.labelX + s.dx, labelY: e.labelY + s.dy };
|
|
13586
|
+
});
|
|
13587
|
+
}
|
|
13360
13588
|
function applyEdgeLabelAndPathShifts(edges, labelShiftMap, edgePathShiftMap) {
|
|
13361
13589
|
if (labelShiftMap.size === 0 && edgePathShiftMap.size === 0) return edges;
|
|
13362
13590
|
return edges.map((e) => {
|
|
@@ -19855,7 +20083,11 @@ function \u672B\u5C3E\u3092\u8FBA\u306B\u6CBF\u3063\u3066\u305A\u3089\u3059(e, \
|
|
|
19855
20083
|
if (\u9577\u3055 < ENDPOINT_FAN_RUNUP + 1) return null;
|
|
19856
20084
|
const ux = (last.x1 - last.x2) / \u9577\u3055;
|
|
19857
20085
|
const uy = (last.y1 - last.y2) / \u9577\u3055;
|
|
19858
|
-
const
|
|
20086
|
+
const head = segs[0];
|
|
20087
|
+
const \u6700\u5F8C\u306E\u533A\u9593\u304C\u8D77\u70B9\u3092\u542B\u3080 = Math.abs(last.x1 - head.x1) <= 0.5 && Math.abs(last.y1 - head.y1) <= 0.5;
|
|
20088
|
+
const \u52A9\u8D70\u4E0A\u9650 = \u6700\u5F8C\u306E\u533A\u9593\u304C\u8D77\u70B9\u3092\u542B\u3080 ? \u9577\u3055 - EDGE_STUB_OUT : \u9577\u3055;
|
|
20089
|
+
const \u4E38\u3081\u305F\u52A9\u8D70 = Math.min(\u52A9\u8D70, \u52A9\u8D70\u4E0A\u9650);
|
|
20090
|
+
if (\u4E38\u3081\u305F\u52A9\u8D70 < ENDPOINT_FAN_RUNUP) return null;
|
|
19859
20091
|
const \u6298\u308C1 = { x: last.x2 + ux * \u4E38\u3081\u305F\u52A9\u8D70, y: last.y2 + uy * \u4E38\u3081\u305F\u52A9\u8D70 };
|
|
19860
20092
|
const \u6298\u308C2 = \u6A2A ? { x: \u6298\u308C1.x, y: \u6298\u308C1.y + d } : { x: \u6298\u308C1.x + d, y: \u6298\u308C1.y };
|
|
19861
20093
|
const \u7D42\u70B9 = \u6A2A ? { x: last.x2, y: last.y2 + d } : { x: last.x2 + d, y: last.y2 };
|
|
@@ -19867,7 +20099,6 @@ function \u672B\u5C3E\u3092\u8FBA\u306B\u6CBF\u3063\u3066\u305A\u3089\u3059(e, \
|
|
|
19867
20099
|
if (nodes.some((n) => n.id !== e.from && n.id !== e.to && segmentsCrossRect(\u65B0\u533A\u9593, nodeRect(n)))) {
|
|
19868
20100
|
return null;
|
|
19869
20101
|
}
|
|
19870
|
-
const head = segs[0];
|
|
19871
20102
|
const parts = [`M ${head.x1} ${head.y1}`];
|
|
19872
20103
|
for (let i = 0; i < segs.length - 1; i++) {
|
|
19873
20104
|
const s = segs[i];
|
|
@@ -20368,6 +20599,14 @@ function layout(diag) {
|
|
|
20368
20599
|
hopEdgeCrossings(edges);
|
|
20369
20600
|
repositionParallelLabels(edges, nodesFinal);
|
|
20370
20601
|
slideLabelsAlongOwnPath(edges, nodesFinal);
|
|
20602
|
+
if (!isChainEdgeLabelDisabled()) {
|
|
20603
|
+
edges = resolveLabelClearanceAfterPathPasses(
|
|
20604
|
+
edges,
|
|
20605
|
+
collectBBoxes(containedLanesFinal, nodesFinal, []).filter(
|
|
20606
|
+
(b) => b.kind === "node" || b.kind === "lane-label"
|
|
20607
|
+
)
|
|
20608
|
+
);
|
|
20609
|
+
}
|
|
20371
20610
|
const bboxes = collectBBoxes(containedLanesFinal, nodesFinal, edges);
|
|
20372
20611
|
const collisions = detectCollisions(bboxes, edges);
|
|
20373
20612
|
const nearCollisions = detectNearCollisions(bboxes, edges);
|
|
@@ -31677,6 +31916,7 @@ exports.requiredRowsWidth = requiredRowsWidth;
|
|
|
31677
31916
|
exports.requiredSpecClearance = requiredSpecClearance;
|
|
31678
31917
|
exports.resolveEdgeLabelOverlapsWithChain = resolveEdgeLabelOverlapsWithChain;
|
|
31679
31918
|
exports.resolveEdgeLabelOverlapsWithChainAndPropagate = resolveEdgeLabelOverlapsWithChainAndPropagate;
|
|
31919
|
+
exports.resolveLabelClearanceAfterPathPasses = resolveLabelClearanceAfterPathPasses;
|
|
31680
31920
|
exports.resolveOverlapsWithChain = resolveOverlapsWithChain;
|
|
31681
31921
|
exports.resolveTarget = resolveTarget;
|
|
31682
31922
|
exports.resolveTargetAll = resolveTargetAll;
|