@cardenelabs/cdl 0.47.0 → 0.48.0
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 +32 -1
- package/dist/index.cjs +59 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +59 -19
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +59 -19
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +59 -19
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/layout/edges.ts +95 -23
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,36 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.48.0] - 2026-09-11
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **札の列を線が横切る時に隙間が足りないまま残るのを直した** (#805)
|
|
13
|
+
|
|
14
|
+
同じ 2 つの箱を結ぶ弧が 4 本あると、札は 4 枚の列になる。 列をどこで上下に分けるかは
|
|
15
|
+
`placeAvoidingSiblingPaths` が決めるが、塊を動かす先を **兄弟の弧が通る帯** だけで決めており、
|
|
16
|
+
帯の外を通る別の線については置いた後に「貫いているか」 しか見ていなかった。
|
|
17
|
+
|
|
18
|
+
貫き (隙間 0) だけを見ると、線が札の縁をかすめる置き方が「貫いていない」 として通る。
|
|
19
|
+
門 (`clearance` 軸) は 14 を要求するため、門だけが落ちる。
|
|
20
|
+
実測 = 下を回る線が札の上端 10 の所を通り、要求に 4 足りなかった。
|
|
21
|
+
|
|
22
|
+
後段の逃がし pass では直せない。 列は上下とも隣の札で埋まっており、どちらへ動かしても
|
|
23
|
+
隣との要求 (36) を割る。 列ごとずらす案も測ったが、巻き込んだ札が自分の弧から 162 離れ、
|
|
24
|
+
`edge-label-proximity` の error 閾値 (160) を越えた。
|
|
25
|
+
|
|
26
|
+
塊を「近すぎる線を越える所」 まで押し出した置き方を候補に足した。 押す量は探さずに測る =
|
|
27
|
+
邪魔をしている線を札の横幅で切った Y 範囲の縁から、要求ぶん離れる位置までの差を取る。
|
|
28
|
+
|
|
29
|
+
| | 直す前 | 直した後 |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| 札と横切る線の隙間 | 10 (要求 14) | 14 |
|
|
32
|
+
| 札と自分の弧の距離 (最遠) | 158 | 130 |
|
|
33
|
+
| 4 枚の分かれ方 | 上 1 枚 / 下 3 枚 | 上 2 枚 / 下 2 枚 |
|
|
34
|
+
|
|
35
|
+
押す前の候補も残すので、押しても越えられない図 (線が札の上下を挟む形) では従来の置き方が
|
|
36
|
+
選ばれる。 越えられなかった置き方は候補にしない = 隙間が足りないまま位置だけが動くのを防ぐ。
|
|
37
|
+
|
|
8
38
|
## [0.47.0] - 2026-09-11
|
|
9
39
|
|
|
10
40
|
### Added
|
|
@@ -2351,7 +2381,8 @@ Initial OSS release.
|
|
|
2351
2381
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
2352
2382
|
行き止まりになる。
|
|
2353
2383
|
|
|
2354
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
2384
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.48.0...HEAD
|
|
2385
|
+
[0.48.0]: https://github.com/cardene777/cdl/compare/v0.47.0...v0.48.0
|
|
2355
2386
|
[0.47.0]: https://github.com/cardene777/cdl/compare/v0.46.0...v0.47.0
|
|
2356
2387
|
[0.46.0]: https://github.com/cardene777/cdl/compare/v0.45.0...v0.46.0
|
|
2357
2388
|
[0.45.0]: https://github.com/cardene777/cdl/compare/v0.44.0...v0.45.0
|
package/dist/index.cjs
CHANGED
|
@@ -19578,33 +19578,73 @@ function placeAvoidingSiblingPaths(args) {
|
|
|
19578
19578
|
}
|
|
19579
19579
|
};
|
|
19580
19580
|
consider([...wants]);
|
|
19581
|
+
const \u62BC\u3059\u91CF = (idx, side, pos) => {
|
|
19582
|
+
let \u8981\u308B = 0;
|
|
19583
|
+
for (const i of idx) {
|
|
19584
|
+
const box = boxes[i];
|
|
19585
|
+
const rect = { x: box.x, y: pos[i] - box.h / 2, w: box.w, h: box.h };
|
|
19586
|
+
for (const probe of probeSegs[i]) {
|
|
19587
|
+
if (measurePathLabelGapSegs(probe.segs, rect) >= CLEARANCE_PATH_LABEL) continue;
|
|
19588
|
+
let lo = Infinity;
|
|
19589
|
+
let hi = -Infinity;
|
|
19590
|
+
for (const seg of probe.segs) {
|
|
19591
|
+
const c = clipY(seg, box.x, box.x + box.w);
|
|
19592
|
+
if (!c) continue;
|
|
19593
|
+
lo = Math.min(lo, c.lo);
|
|
19594
|
+
hi = Math.max(hi, c.hi);
|
|
19595
|
+
}
|
|
19596
|
+
if (lo > hi) continue;
|
|
19597
|
+
const \u884C\u304D\u5148 = side === "above" ? lo - box.h / 2 - CLEARANCE_PATH_LABEL : hi + box.h / 2 + CLEARANCE_PATH_LABEL;
|
|
19598
|
+
\u8981\u308B = Math.max(\u8981\u308B, side === "above" ? pos[i] - \u884C\u304D\u5148 : \u884C\u304D\u5148 - pos[i]);
|
|
19599
|
+
}
|
|
19600
|
+
}
|
|
19601
|
+
return Math.max(0, \u8981\u308B);
|
|
19602
|
+
};
|
|
19581
19603
|
if (bands.some((b) => b !== null)) {
|
|
19582
19604
|
for (let split = 0; split <= order.length; split++) {
|
|
19583
19605
|
const above = order.slice(0, split);
|
|
19584
19606
|
const below = order.slice(split);
|
|
19585
|
-
const
|
|
19586
|
-
|
|
19587
|
-
[above, "above"],
|
|
19588
|
-
[below, "below"]
|
|
19589
|
-
]) {
|
|
19590
|
-
if (idx.length === 0) continue;
|
|
19591
|
-
const ys = spread(idx);
|
|
19592
|
-
let shift = 0;
|
|
19593
|
-
for (let k = 0; k < idx.length; k++) {
|
|
19594
|
-
const band = bands[idx[k]];
|
|
19595
|
-
if (!band) continue;
|
|
19596
|
-
shift = side === "above" ? Math.min(shift, band.lo - ys[k]) : Math.max(shift, band.hi - ys[k]);
|
|
19597
|
-
}
|
|
19598
|
-
for (let k = 0; k < idx.length; k++) out[idx[k]] = ys[k] + shift;
|
|
19599
|
-
}
|
|
19600
|
-
if (above.length > 0 && below.length > 0) {
|
|
19607
|
+
const \u9593\u3092\u7A7A\u3051\u308B = (out) => {
|
|
19608
|
+
if (above.length === 0 || below.length === 0) return;
|
|
19601
19609
|
const lastIdx = above[above.length - 1];
|
|
19602
19610
|
const firstIdx = below[0];
|
|
19603
19611
|
const need = (sizes[lastIdx] + sizes[firstIdx]) / 2 + CLEARANCE_LABEL_LABEL;
|
|
19604
19612
|
const deficit = need - (out[firstIdx] - out[lastIdx]);
|
|
19605
|
-
if (deficit > 0) for (const i of below) out[i]
|
|
19606
|
-
}
|
|
19607
|
-
|
|
19613
|
+
if (deficit > 0) for (const i of below) out[i] = out[i] + deficit;
|
|
19614
|
+
};
|
|
19615
|
+
const \u5E2F\u3092\u8D8A\u3048\u308B = () => {
|
|
19616
|
+
const out = new Array(members.length);
|
|
19617
|
+
for (const [idx, side] of [
|
|
19618
|
+
[above, "above"],
|
|
19619
|
+
[below, "below"]
|
|
19620
|
+
]) {
|
|
19621
|
+
if (idx.length === 0) continue;
|
|
19622
|
+
const ys = spread(idx);
|
|
19623
|
+
let shift = 0;
|
|
19624
|
+
for (let k = 0; k < idx.length; k++) {
|
|
19625
|
+
const band = bands[idx[k]];
|
|
19626
|
+
if (!band) continue;
|
|
19627
|
+
shift = side === "above" ? Math.min(shift, band.lo - ys[k]) : Math.max(shift, band.hi - ys[k]);
|
|
19628
|
+
}
|
|
19629
|
+
for (let k = 0; k < idx.length; k++) out[idx[k]] = ys[k] + shift;
|
|
19630
|
+
}
|
|
19631
|
+
\u9593\u3092\u7A7A\u3051\u308B(out);
|
|
19632
|
+
return out;
|
|
19633
|
+
};
|
|
19634
|
+
const \u62BC\u3057\u3066\u8D8A\u3048\u308B = () => {
|
|
19635
|
+
const out = \u5E2F\u3092\u8D8A\u3048\u308B();
|
|
19636
|
+
for (let round = 0; round < 4; round += 1) {
|
|
19637
|
+
const a = \u62BC\u3059\u91CF(above, "above", out);
|
|
19638
|
+
const b = \u62BC\u3059\u91CF(below, "below", out);
|
|
19639
|
+
if (a === 0 && b === 0) return out;
|
|
19640
|
+
for (const i of above) out[i] = out[i] - a;
|
|
19641
|
+
for (const i of below) out[i] = out[i] + b;
|
|
19642
|
+
}
|
|
19643
|
+
return \u62BC\u3059\u91CF(above, "above", out) === 0 && \u62BC\u3059\u91CF(below, "below", out) === 0 ? out : null;
|
|
19644
|
+
};
|
|
19645
|
+
consider(\u5E2F\u3092\u8D8A\u3048\u308B());
|
|
19646
|
+
const \u62BC\u3057\u305F = \u62BC\u3057\u3066\u8D8A\u3048\u308B();
|
|
19647
|
+
if (\u62BC\u3057\u305F) consider(\u62BC\u3057\u305F);
|
|
19608
19648
|
}
|
|
19609
19649
|
}
|
|
19610
19650
|
const plain = spread(all);
|