Squid-n プロジェクト形式(.scz)
Squid-n ネイティブの保存形式です。内部モデルをそのまま格納するため、保存・読込でモデルが完全一致します(ST-Bridge のようなサブセット制約はありません)。
GUI からの操作
ファイルメニューに以下の項目があります。
| メニュー | 動作 |
|---|---|
| 📄 新規 | 空モデルを開く |
| 🏠 サンプル(門型ラーメン) | 内蔵のサンプルモデルを開く |
| 📂 開く… | .scz プロジェクトを読み込みます。読込後、モデルは検証(validate)を通ってから差し替わります |
| 💾 保存 | 現在のプロジェクトを上書き保存する(保存先が未設定なら保存先を尋ねる) |
| 💾 名前を付けて保存… | 保存先を指定して .scz として保存する |
読み込むとそのファイルが現在のプロジェクトの保存先になり、以降の「保存」は同じファイルへ上書きします。
ファイル構造
.scz は 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読込波)そのものは .scz に含まれません。波形ライブラリ
(波形ライブラリ)から選んで実行した場合は、analysis_settings.msgpack
にライブラリ内のファイル名と実行時点の内容の SHA-256 を記録し、開き直したときにライブラリから
自動で同じ波形を参照します。立体時刻歴と質点系は別々の選択を持ちます。ファイル選択ダイアログ
(「📂 波形CSVを開いて実行…」)から一回限りで実行した場合は、波形は保存されず再現できません。
整合性・安全性
- ハッシュ検証: 読込時に各エントリの SHA-256 を
manifest.jsonの記載と照合し、不一致ならエラーにします。必須エントリ(model.msgpack/settings.json)が manifest に列挙されていない場合も拒否します(未検証のまま読み込ませないためです)。 - スキーマ版チェック: 本ソフトはリリース前で後方互換を持たないため、現行スキーマ版(
1)以外は拒否します。 - 原子的な保存: 一時ファイルへ書き出して
fsyncした後にrenameすることで、電源断でファイルが破損しないようにしています。 - ZIP 爆弾対策: 1 エントリあたりの展開サイズ上限(4 GiB)を超える書庫は拒否します。.scz は単層 zip(deflate)で展開率は理論上約 1032 倍が上限のため、絶対サイズ上限がメモリ保護として機能します。ヘッダの申告サイズは信用せず、実際の展開バイト数でも検査します。
- 保存サイズの確認: 解析結果(時刻歴の詳細記録を含む)の直列化サイズが 512 MB を超える場合、保存時に「時刻歴の詳細記録を保存に含めますか?」の確認を表示します。除外して保存しても、層応答・ピーク値等の集計結果は保存され、詳細記録は再解析で復元できます。
ライブラリからの利用
#![allow(unused)] fn main() { use squid_n_io::scz::{save_scz, load_scz, SczExtras}; use std::path::Path; // 保存: 内部モデル+任意エントリ(各バイト列は呼び出し側が事前に // MessagePack へ直列化したもの。io 層は中身を解釈しない)→ .scz save_scz(Path::new("model.scz"), &model, SczExtras { preparation: Some(&preparation_bytes), results: Some(&results_bytes), analysis_settings: Some(&analysis_settings_bytes), })?; // 読込: .scz → 内部モデル+同梱されていれば各任意エントリ let contents = load_scz(Path::new("model.scz"))?; let model = contents.model; }