@cardenelabs/cdl 0.65.0 → 0.66.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 CHANGED
@@ -5,6 +5,49 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.66.0] - 2026-09-15
9
+
10
+ ### Fixed
11
+
12
+ - **段の違う箱を繋ぐ矢印が、間の箱を貫くのを直した** (#867)
13
+
14
+ 段の違う箱を横に繋ぐ経路は「横に走る → 縦に折れる → 横に走る」 の L 字を描く。 折れる位置は箱を避けて左右に
15
+ 退くが、**退いた後に横の走りが箱を横切るかを一度も見ていなかった**。 退けた分だけ横の走りが伸びるため、
16
+ 避けたはずの同じ箱を横切る。
17
+
18
+ 段 0 に 検査 (x 40-360) と 記録 (x 1864-2184)、段 1 に背の高い 成形機 (x 648-968) と 塗装機 (x 1256-1576) を
19
+ 並べ、成形機から記録へ引いた形。
20
+
21
+ ```
22
+ 変更前 ... M 968 486 L 1630 486 Q 1644 486, 1644 472 L 1644 150 Q 1644 136, 1658 136 L 1864 136
23
+ 変更後 ... M 968 486 L 1174 486 Q 1188 486, 1188 472 L 1188 150 Q 1188 136, 1202 136 L 1864 136
24
+ ```
25
+
26
+ 変更前は `y = 486` の横の走りが `x = 968` から `1644` まで伸び、その間の 塗装機 (x 1256-1576、y 296-676) を
27
+ 横切っていた。 絵の検査の `edge-node-cross` が 1 件出る形。
28
+
29
+ 退く向きは「折れる位置を動かす量が少ない側」 だけで決めていた。 この形は右へ 228 と左へ 228 で並び、
30
+ 同点を右に倒す規則が塞がる側を選んでいた。
31
+
32
+ 直した点は 2 つ。
33
+
34
+ | 直した点 | 変更前 | 変更後 |
35
+ |---|---|---|
36
+ | 退く向き | 動かす量が少ない側 | 横の走りが横切らない側を先に見る。 左右で同じ時だけ動かす量が少ない側 |
37
+ | 退く判定の起点 | 縦の走りと説明文の帯だけ | 横の走りが箱を通る形も数える |
38
+
39
+ 起点を広げないと、最初の折れる位置で既に横の走りが箱を横切っている形は 1 度も退かない。 繋ぎ元と同じ段に
40
+ 箱を置き、折れる位置より手前に来るように並べると出る (実測 = 受付 → 出荷 の矢印が、間の 控え を横切る)。
41
+
42
+ 横切るかの判定は箱の矩形そのもので行い、余白を足さない。 絵の検査が箱の矩形で貫通を数えるため、余白を足すと
43
+ 「検査は通るのに経路だけ動く」 図が出る。 端がちょうど箱の縁に載る形も通さない = 箱の縁から出る線は必ず縁に
44
+ 載るので、閉じた側にすると自分の出入口を障害物と読む。
45
+
46
+ dragon の見本帳 505 枚の辺 472 本を並べ直して突き合わせた結果、**変わった道筋は 0 本**。 横切る箱が無い
47
+ 図では折れる位置が 2 つの箱のちょうど中間に残る。
48
+
49
+ dragon の見本帳で合流する矢印が間の部品を貫いた原因 (dragon#2011)。
50
+
8
51
  ## [0.65.0] - 2026-09-15
9
52
 
10
53
  ### Fixed
@@ -2770,7 +2813,8 @@ Initial OSS release.
2770
2813
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
2771
2814
  行き止まりになる。
2772
2815
 
2773
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.65.0...HEAD
2816
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.66.0...HEAD
2817
+ [0.66.0]: https://github.com/cardene777/cdl/compare/v0.65.0...v0.66.0
2774
2818
  [0.65.0]: https://github.com/cardene777/cdl/compare/v0.64.1...v0.65.0
2775
2819
  [0.64.1]: https://github.com/cardene777/cdl/compare/v0.64.0...v0.64.1
2776
2820
  [0.64.0]: https://github.com/cardene777/cdl/compare/v0.63.0...v0.64.0
package/dist/index.cjs CHANGED
@@ -18760,6 +18760,10 @@ function verticalCornerDir(from, to) {
18760
18760
  function cornerRadiusFor(\u534A\u5F84, ...\u8D70\u308A) {
18761
18761
  return Math.min(\u534A\u5F84, ...\u8D70\u308A.map((v) => Math.abs(v)));
18762
18762
  }
18763
+ function runCrossesBox(\u8D70\u308A, \u7BB1) {
18764
+ if (\u8D70\u308A.y <= \u7BB1.cy - \u7BB1.h / 2 || \u8D70\u308A.y >= \u7BB1.cy + \u7BB1.h / 2) return false;
18765
+ return \u7BB1.cx + \u7BB1.w / 2 > Math.min(\u8D70\u308A.x1, \u8D70\u308A.x2) && \u7BB1.cx - \u7BB1.w / 2 < Math.max(\u8D70\u308A.x1, \u8D70\u308A.x2);
18766
+ }
18763
18767
  var VERTICAL_DETOUR_EXIT = 45;
18764
18768
  function nearestBoxDistance(anchorX, dir, verticalTop, verticalBottom, boxes) {
18765
18769
  let nearest = Infinity;
@@ -19752,18 +19756,28 @@ function routePath(from, to, fromSide, toSide, obstacles = [], detourSide, _from
19752
19756
  const labelIntersect = oTop < labelBottom && oBottom > labelTop;
19753
19757
  return segIntersect || labelIntersect;
19754
19758
  };
19759
+ const \u6A2A\u306E\u8D70\u308A\u304C\u585E\u304C\u308B = (mx) => labelObstacles.some((o) => {
19760
+ if (o.id === from.id || o.id === to.id) return false;
19761
+ return runCrossesBox({ y: A.y, x1: A.x, x2: mx }, o) || runCrossesBox({ y: B.y, x1: mx, x2: B.x }, o);
19762
+ });
19755
19763
  let iter = 0;
19756
19764
  while (iter < 12) {
19757
19765
  const band = labelBand(midX2);
19758
- const hit = labelObstacles.find((o) => intersects(o, band));
19766
+ const hit = labelObstacles.find((o) => intersects(o, band)) ?? labelObstacles.find(
19767
+ (o) => o.id !== from.id && o.id !== to.id && (runCrossesBox({ y: A.y, x1: A.x, x2: midX2 }, o) || runCrossesBox({ y: B.y, x1: midX2, x2: B.x }, o))
19768
+ );
19759
19769
  if (!hit) break;
19760
19770
  const hitLeft = hit.cx - hit.w / 2;
19761
19771
  const hitRight = hit.cx + hit.w / 2;
19762
19772
  const retreatRight = hitRight + labelHalfW + CLEARANCE_NODE_LABEL + 4;
19763
19773
  const retreatLeft = hitLeft - labelHalfW - CLEARANCE_NODE_LABEL - 4;
19774
+ const \u53F3\u304C\u585E\u304C\u308B = \u6A2A\u306E\u8D70\u308A\u304C\u585E\u304C\u308B(retreatRight);
19775
+ const \u5DE6\u304C\u585E\u304C\u308B = \u6A2A\u306E\u8D70\u308A\u304C\u585E\u304C\u308B(retreatLeft);
19764
19776
  const dRight = Math.abs(retreatRight - midX2);
19765
19777
  const dLeft = Math.abs(retreatLeft - midX2);
19766
- midX2 = dRight <= dLeft ? retreatRight : retreatLeft;
19778
+ const \u6B21 = \u53F3\u304C\u585E\u304C\u308B === \u5DE6\u304C\u585E\u304C\u308B ? dRight <= dLeft ? retreatRight : retreatLeft : \u53F3\u304C\u585E\u304C\u308B ? retreatLeft : retreatRight;
19779
+ if (\u6B21 === midX2) break;
19780
+ midX2 = \u6B21;
19767
19781
  iter++;
19768
19782
  }
19769
19783
  }