テーブル編集とグリッド操作
下ドックの各テーブル(節点・部材・荷重など)は、セル単位の入力に加えて、スプレッドシートに 近い操作で編集できます。Excel で座標表や荷重表を組み立ててからまとめて貼り付ける流れを 想定したもので、矩形選択・コピー&ペースト(Excel と相互に TSV)・キーボード移動・ Undo/Redo を備えます。
現状この操作を適用しているのは節点テーブル(座標 3 列)です。 テーブルごとの違いは アダプタに隔離してあるため、他のテーブルへ順次展開する設計です。
実装参照:操作レイヤは sepika_app::grid(crates/sepika-app/src/grid/)に置き、節点テーブルへの適用は sepika_app::app::NodeGridAdapter(crates/sepika-app/src/app/node_grid.rs)が担います。描画は sepika_app::grid::GridWidget(crates/sepika-app/src/grid/widget.rs)です。
選択
- セルをクリックすると単一選択、ドラッグすると矩形選択になります。
- Shift+クリック・Shift+矢印では、選択の起点(アクティブセル)を動かさずに選択端だけを 広げます。
- 行ヘッダで行全体、列ヘッダで列全体、左上コーナーまたは Ctrl+A で全選択します。
- 表の外をクリックするか Esc を押すと選択を解除します。
アクティブセルは選択の起点に留まります。移動の基準にもなります。
グリッドのセル・列・矩形選択と、3D に表示する節点・部材の幾何選択は独立しています。 座標セルの選択・編集・コピー・貼り付け、Ctrl+A、Esc や表外クリックによるグリッド選択解除では 幾何選択は変わりません。ただし、座標編集による生成壁の ID 付け替わりへの対処は下記のとおりです。 節点表の行ヘッダをクリック、Shift+クリック、ドラッグしたときだけ、 実在する行の節点が幾何選択にも反映されます。複数行の場合は行選択の起点が個別表示の対象です。 末尾の「+」まで Shift+クリックやドラッグで広げた場合も、「+」は節点ではないため実在する行だけを幾何選択します。 「+」を起点に実在行へ広げた場合は、節点を幾何選択しますが個別表示の対象は指定しません。 「+」だけの選択や空の節点表での行ヘッダ操作では、幾何選択を変えません。 節点行を削除した場合や Undo/Redo では、ID の付け替わりによる誤選択を避けるため幾何選択と境界条件の編集対象を解除します。 準備計算の壁領域再構築で節点が削除された場合も、後続節点の ID が詰められるため同様に解除します。 部材表から支点の免震支承材を撤去した場合も、生成された地盤節点の削除で後続節点の ID が詰められるため、幾何選択と境界条件の編集対象を解除します。 境界条件フォームは、別の節点を幾何選択した場合はその節点を編集対象にします。幾何選択がないときの先頭節点表示はフォーム内だけの既定値で、フォームで明示的に節点を選んだときだけ幾何選択へ反映されます。セル操作では幾何選択を変えません。 壁版の断面変更で解析用の壁要素が増減する場合も、生成壁の選択は解除します。後続の壁要素の ID が付け替わるためです。 生成の可否が変わらない断面の差し替えでは、同じ壁・他の壁のどちらを選択していても幾何選択と個別表示の対象を保持します。 存在しない断面など、適用されなかった断面指定でも選択は解除しません。 壁版割当領域への割当・版なし・未設定への変更時は幾何選択を解除します。壁要素の生成・削除で ID が付け替わる場合があるためです。 3D・テーブルで二次部材を配置した場合と、テーブルで支持端を変更・二次部材を削除した場合は、操作が成功したときだけ生成壁を含む部材選択を解除します。 割当領域の再構築で壁版が取り除かれると、別の壁が以前の生成 ID を再利用する場合があるためです。 通常の主架構部材だけの選択と節点の選択は保持します。 節点表の座標編集・貼り付け・クリアでも、割当領域の再構築で生成壁の ID が付け替わる場合があるため、生成壁を含む部材選択は解除します。 この場合も、通常の主架構部材だけの選択と節点の選択は保持します。
幾何選択は節点と部材を同時には保持しません。3D や部材表などで個別の部材を選ぶと、 それまでの節点選択と個別表示は消えます。部材グループや断面の「使用部材を3Dハイライト」は 対象の部材全体を選びますが、個別表示の対象は指定しません。インスペクタは選択件数を表示し、 個別の対象がない複数選択では以前の詳細を表示しません。3D の背景クリックでは幾何選択を解除します。 断面・材料・荷重ケースなど各機能で開いている対象は、幾何選択とは独立して保持します。 設計結果行の断面をクリックして断面一覧へ移動するときは、その行の部材を単一選択して個別表示し、開く断面もその行の断面に切り替えます。 生成壁を選択した場合もインスペクタに部材・断面を表示し、断面の使用部材数と「使用部材を3Dハイライト」には表示中の生成壁を含めます。
実装参照:選択の状態機械は sepika_app::grid::GridState(crates/sepika-app/src/grid/core.rs)が表します。
幾何選択は sepika_app::app::GeometrySelection(crates/sepika-app/src/app/mod.rs)と
sepika_app::app::App の選択操作(crates/sepika-app/src/app/actions/view.rs)が管理します。
二次部材編集後の生成壁の選択解除は、crates/sepika-app/src/viewer/input.rs と crates/sepika-app/src/tables/secondary.rs が行います。
節点表の座標編集後の生成壁の選択解除は、crates/sepika-app/src/tables/nodes.rs が行います。
キーボード
| キー | 選択モード | 編集モード |
|---|---|---|
| 矢印 | セル移動(Shift で選択拡張) | カーソル移動 |
| Tab / Shift+Tab | 右 / 左へ移動 | 確定して右へ |
| Enter / Shift+Enter | 下 / 上へ移動 | 確定して下へ |
| F2 | アクティブセルを編集 | — |
| 文字キー | その文字を初期値に編集開始 | 文字入力 |
| Esc | 選択解除 | 編集キャンセル |
| Delete | 選択範囲をクリア | 文字削除 |
| Backspace | アクティブセルを空にして編集開始 | 文字削除 |
| Ctrl+C | 選択範囲を TSV コピー | 文字列コピー |
| Ctrl+V | TSV ペースト | 文字列貼り付け |
| Ctrl+A | 全選択 | 文字列全選択 |
| Ctrl+Delete | 行削除 | — |
Delete はセル値のクリアで、行そのものは消えません。行削除は右クリックメニューまたは Ctrl+Delete です。Backspace は範囲クリアではなく、アクティブセルを空にして編集を始めます。
2 モード式の編集
セルには選択モードと編集モードがあります。ダブルクリック・F2・文字キー・Backspace の いずれかで編集モードに入り、そのセルの現在値を初期値として入力します。Enter や Tab で確定して 次のセルへ移り、Esc で編集を取り消します。
確定した値が不正(数値列に数値でない入力など)のときは変更せず、理由をイベントログに出し、 対象セルを赤くフラッシュします。空文字のまま確定した場合は「変更なし」として扱います。
実装参照:セル確定は sepika_app::grid::commit_cell_text(crates/sepika-app/src/grid/core.rs)が検証し、失敗のフラッシュとログは GridWidget(crates/sepika-app/src/grid/widget.rs)が扱います。
コピー・貼り付け(Excel 相互 TSV)
- Ctrl+C は選択範囲をタブ区切り(TSV)でクリップボードへコピーします。セルの文字列は 内部値の正準文字列を使い、表示用に丸めた値は使いません。
- Ctrl+V は TSV を貼り付けます。**空セルは「変更なし」**として既存値を維持します。
- 1 セルでも不正(数値として解釈できない値、貼り付け先が列をはみ出す)があれば 貼り付け全体を適用しません。理由をイベントログに列挙します。
- 選択範囲がコピー元ブロックの整数倍のときは、ブロックを繰り返して選択範囲へ広げます (タイル展開。フィルハンドルは未対応です)。
- 貼り付けが表の末尾行を超える場合、確認なしで行を自動追加します。追加は貼り付けと あわせて 1 つの複合コマンドになるため、Undo 1 回で行追加ごと戻ります。
- 一度に貼り付けられるのは 100,000 セルまでです。超える場合は全体を拒否します。
実装参照:TSV 変換は sepika_app::grid::{rect_to_tsv, parse_tsv, tile_block}、貼り付け検証は sepika_app::grid::plan_paste(crates/sepika-app/src/grid/core.rs)が担います。
新規行と行削除
- 新規行プレースホルダ:行追加に対応するテーブルの最下部に、常設の空行を 1 行表示します (行ヘッダは「+」)。まだデータではない行で、選択・貼り付けの起点・直接入力の受け口に なります。ここで入力すると 1 行追加され、空のテーブルへも貼り付けで一括投入できます。
- 行削除:右クリックメニューまたは Ctrl+Delete で、選択が跨ぐ実データ行を削除します。 参照されている節点を含む場合は、1 行でも削除できないときは何も消さず、理由を イベントログに列挙します。削除も Undo 1 回で元の位置へ戻ります。
実装参照:行追加・削除の可否と適用は sepika_app::grid::GridAdapter(crates/sepika-app/src/grid/core.rs)の実装である sepika_app::app::NodeGridAdapter(crates/sepika-app/src/app/node_grid.rs)が担い、節点の参照中判定は sepika_core::model::Model::node_in_use によります。
Undo/Redo
セルの変更はすべて編集トランザクション(sepika_edit の編集コマンド)として適用します。
複数セルの貼り付け・範囲クリア・行追加・行削除は 1 つの複合コマンドにまとめるため、
Undo 1 回で操作のまとまりごと戻ります。上部ツールバーの Undo/Redo と共通です。
見た目
テーブルは Excel に近いスプレッドシート様式で、白地に共有罫線(隣接セルと 1 本の線を共有)を引きます。選択範囲は外周を青の太枠で囲い、内側を青の半透明で塗り、 アクティブセルだけは白抜きにして入力先を示します。選択に含まれる行・列のヘッダは薄い青で ハイライトします。新規行プレースホルダのセルは淡いグレー地です。
不正・注意のフィードバックは、イベントログだけでなく対象の範囲を約 1 秒フラッシュして 示します。赤は「何も適用されていない」(貼り付けの全体拒否、編集の失敗、行削除の 全体拒否など)、黄は「適用されたが確認が必要」(コピー元と選択範囲のサイズが一致しない 貼り付けなど)です。
現状の制約
- フィルハンドル(ドラッグでの連続値埋め)・切り取り(Ctrl+X)・行挿入ペーストは未対応です。
- 列のソート・行の並び替えは未対応です。
- 選択ドラッグの表外への自動スクロールは未対応です。
- 文字列列の IME 入力は未対応です。現状の適用先は数値列のため実害はありません。