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

Squid-n プロジェクト形式(.scz)

Squid-n ネイティブの保存形式です。内部モデルをそのまま格納するため、保存・読込でモデルが完全一致します(ST-Bridge のようなサブセット制約はありません)。

GUI からの操作

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

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

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

ファイル構造

.scz は ZIP 書庫です。manifest.jsonmodel.msgpacksettings.json は必須エントリ、 残りは任意エントリ(同梱がなければ読込側の該当項目が None になる)です。

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

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

preparation.msgpackresults.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;
}