テーブル編集とグリッド操作
下ドックの各テーブル(節点・部材・荷重など)は、セル単位の入力に加えて、スプレッドシートに 近い操作で編集できます。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 の背景クリックでは幾何選択を解除します。 断面・材料・荷重ケースなど各機能で開いている対象は、幾何選択とは独立して保持します。 材料・断面の一覧で開いている対象は、それより前の行を削除して ID が変わっても同じ実体のままです。 開いている対象自身を削除した場合は解除します。後の行を削除した場合や、参照中などの理由で削除できなかった場合は変わりません。 同じ操作で複数行を削除する場合も、残った同じ実体を開き続けます。 Undo/Redo でも残存する表示対象を維持し、削除後に別の実体を開いた場合はその実体を維持します。 削除によって解除された対象は、Undo で復元しても自動では開きません。材料の操作で断面の表示対象は変わらず、その逆も同じです。 部材断面の複製や階への複製で追加した断面を Undo で取り除く場合も、取り除かれた表示対象を解除します。 設計結果行の断面をクリックして断面一覧へ移動するときは、その行の部材を単一選択して個別表示し、開く断面もその行の断面に切り替えます。 生成壁を選択した場合もインスペクタに部材・断面を表示し、断面の使用部材数と「使用部材を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/app/actions/view.rs と crates/sepika-app/src/tables/materials.rs・crates/sepika-app/src/tables/sections.rs が編集による ID の変化に追従させます。
二次部材編集後の生成壁の選択解除は、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 を貼り付けます。**空セルは「変更なし」**として既存値を維持します。
- 座標には有限の数値だけを受け付けます。符号・指数表記は使用できますが、
NaN、Infinity、1e309、単位付き文字列や数式などは拒否します。 - 空セルや短い行の不足セルを含む矩形全体で、列範囲・編集可否・行追加条件を確認します。 1 セルでも不正、または編集後の形状が既存の荷重や版割当の条件を満たさない場合は、 貼り付け全体を適用しません。入力・Undo/Redo・計算結果の有効性は変わらず、理由をイベントログに示します。
- 通常の末尾改行(CRLFを含む)と末尾の完全な空行は除去します。途中の空行、および タブやスペースを含む意図した空白行は貼り付け矩形に残します。空白セル自体は値を変更しません。
- 選択範囲がコピー元ブロックの整数倍のときは、ブロックを繰り返して選択範囲へ広げます (タイル展開。フィルハンドルは未対応です)。
- 貼り付けが表の末尾行を超える場合、確認なしで行を自動追加します。追加は貼り付けと あわせて 1 つの複合コマンドになるため、Undo 1 回で行追加ごと戻ります。
- 一度に貼り付けられるのは、空セルを含む行数×最大列数で 100,000 セルまでです。 タイル展開前と展開後の両方で上限を確認し、超える場合は展開・適用せず全体を拒否します。
- 行追加非対応の表では、空セルだけのはみ出しも全体拒否し、一部の切り捨ては行いません。
実装参照:TSV 変換は sepika_app::grid::{rect_to_tsv, parse_tsv, checked_tile_block}、貼り付け検証は sepika_app::grid::{plan_paste, validate_paste_rect}(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 入力は未対応です。現状の適用先は数値列のため実害はありません。
節点追加・材料の直接数値入力
節点追加のX・Y・Z [mm] は、前後の空白を除いた空欄を0として扱います。材料の直接追加では E [N/mm²]・ν [-]・ρ [t/mm³] が必須です。Fc・Fy [N/mm²] と強度割増 [-] は空欄にできます。 材料一覧の単一セル編集では、必須欄を空欄にしても旧値を保持し、任意欄の明示空欄は指定をクリアします。 標準普通コンクリートのEは編集できません。直接入力コンクリートのEは編集できます。
これらの欄では指数表記を含む有限の数値を受け付け、NaN・正負の無限大・桁あふれや 数値以外の文字を拒否します。不正入力を0や未指定へ置き換えることはありません。 入力が不正な間は追加できず、材料の単一編集では対象と理由を表示して入力を保持します。 材料追加は全欄が有効な場合だけ一括で行われます。節点の重複確認では、追加の確定時にも 座標の有限性を確認します。
拒否ではモデル・Undo/Redo・未保存状態・計算結果の有効性は変わりません。有効な追加や値・元指定の 変更は1回のUndoで戻せ、計算結果は要再計算になります。数値の表記だけを変え、強度の元指定を含む 意味がすべて同じなら履歴を増やしません。Fcを明示空欄にすると元の強度指定にもクリアを反映し、 Undoでは省略を含む元指定も復元します。+0と-0の変更は符号を保持する実変更として扱います。
編集中に材料が削除されてIDが変わった場合は、旧入力を別材料へ適用せず、参照不明と保留入力を表示します。 変更後の材料を確認し、対象セルを選び直して入力してください。 別のモデルを読み込む場合や新規作成する場合、材料表の入力途中・拒否された入力は破棄されます。 数値を変更せずセルを離れた場合は現モデルの値を表示し、Undo/Redoや他の編集による変更も反映します。 既存モデルの非有限値を正常値へ修正した場合も、Undoでは強度元指定を含む元の値をそのまま復元します。
有限性の判定は材料の規準適合性や物理的な入力範囲を保証するものではありません。 有限の負値・正負0・極小値もこの入口では数値として受け付けます。SRC材料の診断や解析前の 計算可否診断はそれぞれの責務として行われます。節点一覧グリッド・TSVの空欄操作は上記の 節点追加フォームとは別です。
実装参照:sepika_app::tables::nodes::nodes_table(crates/sepika-app/src/tables/nodes.rs)、
sepika_app::tables::materials::materials_table(crates/sepika-app/src/tables/materials.rs)が直接入力を扱います。