Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

OVIKA — SEPIKA Project File

OVI(卵)とIKAを組み合わせた名前です。

SEPIKAの構造モデル、解析条件、解析結果などを、一つの卵のようにまとめて保存します。

OVIKA(.ovika)は SEPIKA ネイティブの保存形式です。内部モデルをそのまま格納するため、保存・読込でモデルが完全一致します(ST-Bridge のようなサブセット制約はありません)。名称は ZIP という実装技術に依存しません。

実装参照:sepika_io::ovika::{save_ovika, load_ovika}(crates/sepika-io/src/ovika.rs)が保存・読込します。

GUI からの操作

ファイルメニューに以下の項目があります。

メニュー動作
📄 新規空モデルを開く
🏠 サンプル(門型ラーメン)内蔵のサンプルモデルを開く
📂 開く….ovika プロジェクトを読み込みます。読込後、モデルは検証(validate)を通ってから差し替わります
💾 保存現在のプロジェクトを上書き保存する(保存先が未設定なら保存先を尋ねる)
💾 名前を付けて保存…保存先を指定して .ovika として保存する

読み込むとそのファイルが現在のプロジェクトの保存先になり、以降の「保存」は同じファイルへ上書きします。

実装参照:ファイルメニューは sepika_app(crates/sepika-app/src/app/mod.rs)が表示し、モデルの差し替えは sepika_app::app::App::load_model、開く・保存は App::{open_project_from, save_project_to_opts}(crates/sepika-app/src/app/actions/io.rs)が担います。

ファイル構造

.ovika の内部は現在 ZIP コンテナです。manifest.json・model.msgpack・settings.json は必須エントリ、 残りは任意エントリ(同梱がなければ読込側の該当項目が None になる)です。

エントリ必須内容
manifest.json○スキーマ版、単位系、各エントリの SHA-256 ハッシュ
model.msgpack○内部モデル本体(MessagePack でシリアライズ)
settings.json○設計コード等の設定
preparation.msgpack-準備計算の結果(モデルに対して最新の場合のみ同梱)
results.msgpack-解析結果(静的・組合せ・固有値・増分・時刻歴・質点系など。モデルに対して最新の場合のみ同梱)
analysis_settings.msgpack-解析タブの設定値(立体時刻歴と質点系それぞれの波形パラメータ・減衰、固有値/質点系のモード数など)

内部モデルには節点・部材・断面・材料・荷重・層に加え、断面形状(SectionShape)や部材付帯情報(ハンチ・継手位置)まで含まれ、これらは保存・読込で保持されます。 時刻歴を実行すると振動荷重ケースもモデルへ入りますが、解析結果が最新でない保存では書き出しません。 開き直したときに、結果のない空ケースが残らないようにするためです。

preparation.msgpack・results.msgpack はモデルから再計算できる派生データですが、再計算が 高価なため保存して復元します。モデル編集後に再実行していない(=最新でない)場合は保存されず、 再読込後は未実行として扱われます。

analysis_settings.msgpack はモデルから導出できない独立した設定値(時刻歴の波形パラメータ・ 減衰モデル、固有値解析のモード数など)で、解析結果を生成した条件そのものです。モデルの新陳とは 無関係に、保存のたびに現在の設定値を常に同梱します。このエントリを持たないファイルを読み込んだ 場合、解析タブの設定値は変更しません(既定値のまま、または直前の値を保持します)。

質量モデルの方式(mass_method)は例外で、モデル本体(model.msgpack)が持つ値を単一情報源 とします。analysis_settings.msgpack にも同じ項目がありますが、読込後は常にモデル側の値で 上書きします。

なお、時刻歴応答解析の入力波形(CSV読込波)そのものは .ovika に含まれません。波形ライブラリ (波形ライブラリ)から選んで実行した場合は、analysis_settings.msgpack にライブラリ内のファイル名と実行時点の内容の SHA-256 を記録し、開き直したときにライブラリから 自動で同じ波形を参照します。立体時刻歴と質点系は別々の選択を持ちます。ファイル選択ダイアログ (「📂 波形CSVを開いて実行…」)から一回限りで実行した場合は、波形は保存されず再現できません。

実装参照:各エントリの中身の直列化・復元は sepika_app::app::App::{save_project_to_opts, open_project_from}(crates/sepika-app/src/app/actions/io.rs)が担います。

整合性・安全性

  • ハッシュ検証: 読込時に各エントリの SHA-256 を manifest.json の記載と照合し、不一致ならエラーにします。必須エントリ(model.msgpack / settings.json)が manifest に列挙されていない場合も拒否します(未検証のまま読み込ませないためです)。
  • スキーマ版チェック: 本ソフトはリリース前で後方互換を持たないため、現行スキーマ版(1)以外は拒否します。
  • 原子的な保存: 一時ファイルへ書き出して fsync した後に rename することで、電源断でファイルが破損しないようにしています。
  • ZIP 爆弾対策: 1 エントリあたりの展開サイズ上限(4 GiB)を超える書庫は拒否します。現在の .ovika は単層 zip(deflate)で展開率は理論上約 1032 倍が上限のため、絶対サイズ上限がメモリ保護として機能します。ヘッダの申告サイズは信用せず、実際の展開バイト数でも検査します。
  • 保存サイズの確認: 解析結果(時刻歴の詳細記録を含む)の直列化サイズが 512 MB を超える場合、保存時に「時刻歴の詳細記録を保存に含めますか?」の確認を表示します。除外して保存しても、層応答・ピーク値等の集計結果は保存され、詳細記録は再解析で復元できます。

実装参照:ハッシュ検証・スキーマ版チェック・原子的保存・ZIP 爆弾対策は sepika_io::ovika::{load_ovika, save_ovika}(crates/sepika-io/src/ovika.rs)が、保存サイズの確認は sepika_app::app::App::save_project_to_opts(crates/sepika-app/src/app/actions/io.rs)が担います。

壁版の自重支持辺の負担率と間柱の端部負担率は .ovika に保存します。未指定は支持先なしとして扱い、対象壁版の解析前チェックでエラーになります。

増分解析の部材応答には、壁の正負耐力の選択に用いる符号付き面内せん断力 wall_shear_signed [N]を保持します。壁以外はnullです。壁下辺a→bの向きを正とします。スキーマ番号は1です。

開発者向け: ライブラリ API(Rust)

Rust コード例(開発者向け)
#![allow(unused)]
fn main() {
use sepika_io::ovika::{save_ovika, load_ovika, OvikaExtras};
use std::path::Path;

// 保存: 内部モデル+任意エントリ(各バイト列は呼び出し側が事前に
// MessagePack へ直列化したもの。io 層は中身を解釈しない)→ .ovika
save_ovika(Path::new("model.ovika"), &model, OvikaExtras {
    preparation: Some(&preparation_bytes),
    results: Some(&results_bytes),
    analysis_settings: Some(&analysis_settings_bytes),
})?;

// 読込: .ovika → 内部モデル+同梱されていれば各任意エントリ
let contents = load_ovika(Path::new("model.ovika"))?;
let model = contents.model;
}