@cardenelabs/cdl 0.30.2 → 0.30.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,34 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.30.3] - 2026-09-05
9
+
10
+ ### Fixed
11
+
12
+ - **線の終わりに潰れた角ができなくなった** (#663)
13
+
14
+ 同じ箱の同じ辺に入る線の終点をずらす工程が、 終点の手前に 28 の直線を作っていた。
15
+ 前後を角丸に挟まれて潰れた角に見え、 線がどこへ向かうのかが読めない。
16
+
17
+ ```text
18
+ 0.29.0 ... Q 588 1723, 602 1723 L 751 1723
19
+ 0.30.2 ... Q 588 1723, 602 1723 L 602 1695 L 751 1695
20
+ ```
21
+
22
+ この工程は最後の区間を助走ぶん戻った所に折れを 2 つ作って、 ずらした終点へ繋ぐ。
23
+ 助走が最後の区間いっぱいに達すると 1 つ目の折れが直前の折れと重なり、
24
+ 2 つ目の折れまでの区間がずらし量そのものになる。
25
+
26
+ 折れを足す代わりに、 **直前の折れごと** ずらすようにした。 ずらす向きと平行な区間まで
27
+ 手前へ辿り、 その区間の終わりだけを動かす。 平行な区間は伸び縮みするだけなので折れが増えない。
28
+
29
+ 戻す条件は 2 つ。 手前の区間が助走の下限を割る形と、 動かした先が箱に当たる形。
30
+ どちらも直す先が移るだけになるので、 従来の形に任せる。
31
+
32
+ `0.30.1` の #655 は同じ形を **起点** 側で直したもので、 終点側が残っていた。
33
+
34
+ 消費側の ER 図で 2 件あった 30 未満の直線が 0 件になった。 折れの数も交差の数も増えていない。
35
+
8
36
  ## [0.30.2] - 2026-09-05
9
37
 
10
38
  ### Fixed
@@ -1547,7 +1575,8 @@ Initial OSS release.
1547
1575
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1548
1576
  行き止まりになる。
1549
1577
 
1550
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.30.2...HEAD
1578
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.30.3...HEAD
1579
+ [0.30.3]: https://github.com/cardene777/cdl/compare/v0.30.2...v0.30.3
1551
1580
  [0.30.2]: https://github.com/cardene777/cdl/compare/v0.30.1...v0.30.2
1552
1581
  [0.30.1]: https://github.com/cardene777/cdl/compare/v0.30.0...v0.30.1
1553
1582
  [0.30.0]: https://github.com/cardene777/cdl/compare/v0.29.0...v0.30.0
package/dist/index.cjs CHANGED
@@ -20110,11 +20110,66 @@ function \u672B\u5C3E\u3092\u8FBA\u306B\u6CBF\u3063\u3066\u305A\u3089\u3059(e, \
20110
20110
  parts.push(`L ${s.x2} ${s.y2}`);
20111
20111
  }
20112
20112
  const \u6298\u308C1\u306F\u76F4\u524D\u306E\u6298\u308C = Math.abs(\u6298\u308C1.x - last.x1) <= 0.5 && Math.abs(\u6298\u308C1.y - last.y1) <= 0.5;
20113
+ if (\u6298\u308C1\u306F\u76F4\u524D\u306E\u6298\u308C) {
20114
+ const \u6298\u308A\u8FD4\u3055\u306A\u3044 = \u76F4\u524D\u306E\u6298\u308C\u3054\u3068\u305A\u3089\u3059(segs, \u6A2A, d, nodes, e);
20115
+ if (\u6298\u308A\u8FD4\u3055\u306A\u3044) return \u6298\u308A\u8FD4\u3055\u306A\u3044;
20116
+ }
20113
20117
  if (!\u6298\u308C1\u306F\u76F4\u524D\u306E\u6298\u308C) parts.push(`L ${round1(\u6298\u308C1.x)} ${round1(\u6298\u308C1.y)}`);
20114
20118
  parts.push(`L ${round1(\u6298\u308C2.x)} ${round1(\u6298\u308C2.y)}`);
20115
20119
  parts.push(`L ${round1(\u7D42\u70B9.x)} ${round1(\u7D42\u70B9.y)}`);
20116
20120
  return parts.join(" ");
20117
20121
  }
20122
+ function \u76F4\u524D\u306E\u6298\u308C\u3054\u3068\u305A\u3089\u3059(segs, \u6A2A, d, nodes, e) {
20123
+ const \u5E73\u884C\u304B = (s) => \u6A2A ? Math.abs(s.x2 - s.x1) < 0.5 && Math.abs(s.y2 - s.y1) > 0.5 : Math.abs(s.y2 - s.y1) < 0.5 && Math.abs(s.x2 - s.x1) > 0.5;
20124
+ let \u5438\u53CE = -1;
20125
+ for (let i = segs.length - 2; i >= 0; i -= 1) {
20126
+ if (\u5E73\u884C\u304B(segs[i])) {
20127
+ \u5438\u53CE = i;
20128
+ break;
20129
+ }
20130
+ }
20131
+ if (\u5438\u53CE < 0) return null;
20132
+ const \u5143\u306E\u9577\u3055 = \u6A2A ? Math.abs(segs[\u5438\u53CE].y2 - segs[\u5438\u53CE].y1) : Math.abs(segs[\u5438\u53CE].x2 - segs[\u5438\u53CE].x1);
20133
+ const \u5411\u304D = \u6A2A ? Math.sign(segs[\u5438\u53CE].y2 - segs[\u5438\u53CE].y1) : Math.sign(segs[\u5438\u53CE].x2 - segs[\u5438\u53CE].x1);
20134
+ const \u5F8C\u306E\u9577\u3055 = \u5143\u306E\u9577\u3055 + \u5411\u304D * d;
20135
+ if (\u5F8C\u306E\u9577\u3055 < ENDPOINT_FAN_RUNUP) return null;
20136
+ const \u305A\u3089\u3059 = (p) => \u6A2A ? { ...p, y: p.y + d } : { ...p, x: p.x + d };
20137
+ const \u65B0segs = segs.map((s, i) => {
20138
+ if (i <= \u5438\u53CE) return s;
20139
+ return {
20140
+ ...s,
20141
+ x1: \u305A\u3089\u3059({ x: s.x1, y: s.y1 }).x,
20142
+ y1: \u305A\u3089\u3059({ x: s.x1, y: s.y1 }).y,
20143
+ x2: \u305A\u3089\u3059({ x: s.x2, y: s.y2 }).x,
20144
+ y2: \u305A\u3089\u3059({ x: s.x2, y: s.y2 }).y,
20145
+ ...s.ctrl ? { ctrl: s.ctrl.map((c) => \u305A\u3089\u3059(c)) } : {}
20146
+ };
20147
+ });
20148
+ \u65B0segs[\u5438\u53CE] = {
20149
+ ...segs[\u5438\u53CE],
20150
+ x2: \u6A2A ? segs[\u5438\u53CE].x2 : segs[\u5438\u53CE].x2 + d,
20151
+ y2: \u6A2A ? segs[\u5438\u53CE].y2 + d : segs[\u5438\u53CE].y2
20152
+ };
20153
+ if (nodes.some(
20154
+ (n) => n.id !== e.from && n.id !== e.to && segmentsCrossRect(
20155
+ \u65B0segs.slice(\u5438\u53CE).map((s) => ({ x1: s.x1, y1: s.y1, x2: s.x2, y2: s.y2 })),
20156
+ nodeRect(n)
20157
+ )
20158
+ )) {
20159
+ return null;
20160
+ }
20161
+ const head = \u65B0segs[0];
20162
+ const parts = [`M ${round1(head.x1)} ${round1(head.y1)}`];
20163
+ for (const s of \u65B0segs) {
20164
+ if (s.cmd === "Q") {
20165
+ const c = s.ctrl?.[0];
20166
+ parts.push(c ? `Q ${round1(c.x)} ${round1(c.y)}, ${round1(s.x2)} ${round1(s.y2)}` : `L ${round1(s.x2)} ${round1(s.y2)}`);
20167
+ continue;
20168
+ }
20169
+ parts.push(`L ${round1(s.x2)} ${round1(s.y2)}`);
20170
+ }
20171
+ return parts.join(" ");
20172
+ }
20118
20173
 
20119
20174
  // src/layout/lanes.ts
20120
20175
  var LANE_POSITION_EPSILON = 1e-9;